( lockKey: string, value: string, expirySeconds: number )
| 226 | * deployments without Redis, the idempotency layer prevents duplicate processing. |
| 227 | */ |
| 228 | export async function acquireLock( |
| 229 | lockKey: string, |
| 230 | value: string, |
| 231 | expirySeconds: number |
| 232 | ): Promise<boolean> { |
| 233 | const redis = getRedisClient() |
| 234 | if (!redis) { |
| 235 | return true // No-op when Redis unavailable; idempotency layer handles duplicates |
| 236 | } |
| 237 | |
| 238 | const result = await redis.set(lockKey, value, 'EX', expirySeconds, 'NX') |
| 239 | return result === 'OK' |
| 240 | } |
| 241 | |
| 242 | /** |
| 243 | * Release a distributed lock safely. |
no test coverage detected