Skip to content

Commit b995b96

Browse files
committed
fix(promisify): listeners not always removed
Event listeners in `hasFired` are registered with the `once` flag. This only ensures that either the success OR the error listener is removed though.
1 parent 173a73f commit b995b96

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

src/misc/camera.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default async function(constraints, videoEl) {
2323
}
2424

2525
const stream = await navigator.mediaDevices.getUserMedia(constraints);
26-
const streamLoaded = hasFired(videoEl, "loadeddata", "error");
26+
const streamLoaded = hasFired(videoEl, "loadeddata");
2727

2828
if (videoEl.srcObject !== undefined) {
2929
videoEl.srcObject = stream;

src/misc/promisify.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1-
export function hasFired(element, successEvent, errorEvent) {
2-
return new Promise((resolve, reject) => {
3-
element.addEventListener(successEvent, resolve, { once: true });
1+
export function hasFired(eventTarget, successEvent, errorEvent = "error") {
2+
let $resolve, $reject;
43

5-
if (errorEvent !== undefined) {
6-
element.addEventListener(errorEvent, reject, { once: true });
7-
}
4+
const promise = new Promise((resolve, reject) => {
5+
$resolve = resolve;
6+
$reject = reject;
87
});
8+
9+
eventTarget.addEventListener(successEvent, $resolve);
10+
eventTarget.addEventListener(errorEvent, $reject);
11+
12+
promise.finally(() => {
13+
eventTarget.removeEventListener(successEvent, $resolve);
14+
eventTarget.removeEventListener(errorEvent, $reject);
15+
});
16+
17+
return promise;
918
}

src/misc/scanner.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
import "webrtc-adapter";
2+
import { hasFired } from "./promisify.js";
23
import Worker from "./worker.js";
34

4-
export function scan(imageData) {
5+
export async function scan(imageData) {
56
const worker = new Worker();
67

7-
return new Promise(resolve => {
8-
worker.onmessage = event => {
9-
resolve(event.data);
8+
worker.postMessage(imageData, [imageData.data.buffer]);
109

11-
worker.terminate();
12-
};
10+
const event = await hasFired(worker, "message");
11+
12+
worker.terminate();
1313

14-
worker.postMessage(imageData, [imageData.data.buffer]);
15-
});
14+
return event.data;
1615
}
1716

1817
/**

0 commit comments

Comments
 (0)