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}