(key: string, input: Options = {})
| 308 | } |
| 309 | |
| 310 | export async function acquire(key: string, input: Options = {}): Promise<Lease> { |
| 311 | input.signal?.throwIfAborted() |
| 312 | const cfg: Opts = { |
| 313 | staleMs: input.staleMs ?? defaultOpts.staleMs, |
| 314 | timeoutMs: input.timeoutMs ?? defaultOpts.timeoutMs, |
| 315 | baseDelayMs: input.baseDelayMs ?? defaultOpts.baseDelayMs, |
| 316 | maxDelayMs: input.maxDelayMs ?? defaultOpts.maxDelayMs, |
| 317 | } |
| 318 | const dir = input.dir ?? root() |
| 319 | |
| 320 | await mkdir(dir, { recursive: true }) |
| 321 | const lockfile = path.join(dir, Hash.fast(key) + ".lock") |
| 322 | const lock = await acquireLockDir( |
| 323 | lockfile, |
| 324 | { |
| 325 | key, |
| 326 | onWait: input.onWait, |
| 327 | signal: input.signal, |
| 328 | }, |
| 329 | cfg, |
| 330 | ) |
| 331 | lock.startHeartbeat() |
| 332 | |
| 333 | const release = () => lock.release() |
| 334 | return { |
| 335 | release, |
| 336 | [Symbol.asyncDispose]() { |
| 337 | return release() |
| 338 | }, |
| 339 | } |
| 340 | } |
| 341 | |
| 342 | export async function withLock<T>(key: string, fn: () => Promise<T>, input: Options = {}) { |
| 343 | await using _ = await acquire(key, input) |
no test coverage detected