import type { RelativePath } from "../persistence/database"; const locked = new Set(); const waiters = new Map void)[]>(); export function tryLockDocument(relativePath: RelativePath): boolean { if (locked.has(relativePath)) { return false; } locked.add(relativePath); return true; } export async function waitForDocumentLock( relativePath: RelativePath ): Promise { if (tryLockDocument(relativePath)) { return Promise.resolve(); } return new Promise((resolve) => { let waiting = waiters.get(relativePath); if (!waiting) { waiting = []; waiters.set(relativePath, waiting); } waiting.push(resolve); }); } export function unlockDocument(relativePath: RelativePath): void { if (!locked.has(relativePath)) { throw new Error( `Document ${relativePath} is not locked, cannot unlock` ); } // Remove the first element to ensure FIFO unblocking order const nextWaiting = waiters.get(relativePath)?.shift(); if (nextWaiting) { nextWaiting(); } else { locked.delete(relativePath); } }