(id: string, fn: () => Promise<T>)
| 120 | } |
| 121 | |
| 122 | async function withBoardMutex<T>(id: string, fn: () => Promise<T>): Promise<T> { |
| 123 | const prev = boardMutex.get(id) || Promise.resolve(); |
| 124 | let release!: () => void; |
| 125 | const next = new Promise<void>((r) => { |
| 126 | release = r; |
| 127 | }); |
| 128 | boardMutex.set(id, prev.then(() => next)); |
| 129 | await prev; |
| 130 | try { |
| 131 | return await fn(); |
| 132 | } finally { |
| 133 | release(); |
| 134 | if (boardMutex.get(id) === next) boardMutex.delete(id); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | function markMeaningfulActivity(): void { |
| 139 | lastMeaningfulActivity = Date.now(); |
no test coverage detected