Skip to content

Commit 33801eb

Browse files
refactor: move abort signal handling
Refs: metarhia#25
1 parent 9ce140d commit 33801eb

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

web-locks.js

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class Lock {
2222
if (!buffer) Atomics.store(this.flag, 0, UNLOCKED);
2323
}
2424

25-
enter(handler) {
26-
return new Promise(resolve => {
27-
this.queue.push({ handler, resolve });
25+
enter(handler, signal) {
26+
return new Promise((resolve, reject) => {
27+
this.queue.push({ handler, resolve, reject, signal });
2828
this.trying = true;
2929
setTimeout(() => {
3030
this.tryEnter();
@@ -38,11 +38,18 @@ class Lock {
3838
if (prev === LOCKED) return;
3939
this.owner = true;
4040
this.trying = false;
41-
const { handler, resolve } = this.queue.shift();
42-
handler(this).finally(() => {
41+
42+
const { handler, resolve, reject, signal } = this.queue.shift();
43+
44+
const finalize = error => {
4345
this.leave();
44-
resolve();
45-
});
46+
if (error) reject(error);
47+
else resolve();
48+
};
49+
50+
if (signal) signal.on('abort', finalize);
51+
52+
handler(this).finally(finalize);
4653
}
4754

4855
leave() {
@@ -100,16 +107,7 @@ class LockManager {
100107
locks.send(message);
101108
}
102109

103-
const finished = lock.enter(handler);
104-
let aborted = null;
105-
if (signal) {
106-
aborted = new Promise((resolve, reject) => {
107-
signal.on('abort', reject);
108-
});
109-
await Promise.race([finished, aborted]);
110-
} else {
111-
await finished;
112-
}
110+
await lock.enter(handler, signal);
113111

114112
setTimeout(() => {
115113
lock.tryEnter();

0 commit comments

Comments
 (0)