|
@@ -0,0 +1,34 @@
|
|
|
+class SynchronizedLock {
|
|
|
+ constructor() {
|
|
|
+ this.lock = false;
|
|
|
+ this.queue = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ async getLock(timeout = 10000) {
|
|
|
+ while (this.lock) {
|
|
|
+ await new Promise((resolve) => {
|
|
|
+ this.queue.push(resolve);
|
|
|
+ setTimeout(() => {
|
|
|
+ const index = this.queue.indexOf(resolve);
|
|
|
+ if (index !== -1) {
|
|
|
+ this.queue.splice(index, 1);
|
|
|
+ console.warn('SynchronizedLock timeout');
|
|
|
+ resolve();
|
|
|
+ }
|
|
|
+ }, timeout);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ this.lock = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ releaseLock() {
|
|
|
+ this.lock = false;
|
|
|
+ const resolve = this.queue.shift();
|
|
|
+ if (resolve) resolve();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const synchronizedLock = new SynchronizedLock();
|
|
|
+
|
|
|
+export default synchronizedLock;
|