import type { CollectionAdvisoryLockService } from "./CollectionAdvisoryLockService.types"; export class SqliteCollectionAdvisoryLockService implements CollectionAdvisoryLockService { private readonly locks = new Map>(); async withLock(key: string, fn: () => Promise): Promise { const prior = this.locks.get(key) ?? Promise.resolve(); let releaseLock!: () => void; const next = new Promise((resolve) => { releaseLock = resolve; }); this.locks.set( key, prior.then(() => next), ); await prior; try { return await fn(); } finally { releaseLock(); if (this.locks.get(key) === next) { this.locks.delete(key); } } } }