a tool for shared writing and social publishing
1// Taken from https://github.com/rocicorp/lock/blob/main/src/lock.ts 2export class Lock { 3 private _lockP: Promise<void> | null = null; 4 5 async lock(): Promise<() => void> { 6 const previous = this._lockP; 7 const { promise, resolve } = resolver(); 8 this._lockP = promise; 9 await previous; 10 return resolve; 11 } 12 async withLock<R>(f: () => Promise<R>) { 13 let release = await this.lock(); 14 try { 15 return await f(); 16 } finally { 17 release(); 18 } 19 } 20} 21 22export function resolver() { 23 let resolve!: (v: void) => void; 24 let reject!: () => void; 25 const promise = new Promise<void>((res, rej) => { 26 resolve = res; 27 reject = rej; 28 }); 29 return { promise, resolve, reject }; 30}