summaryrefslogtreecommitdiff
path: root/ext/web/06_streams.js
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2021-11-08 12:54:24 +0100
committerGitHub <noreply@github.com>2021-11-08 12:54:24 +0100
commitc91da1222b1a57a38aad4bca7af7fe88d8ef2476 (patch)
tree9c6e145b99e18101f86b2c57788e1d7c2d7f510c /ext/web/06_streams.js
parent8e010b6844b339ab138b4d9e40148c60d44d197a (diff)
feat(ext/web): WritableStreamDefaultController.signal (#12654)
Diffstat (limited to 'ext/web/06_streams.js')
-rw-r--r--ext/web/06_streams.js22
1 files changed, 17 insertions, 5 deletions
diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js
index d3e8e97d4..15f51ca7a 100644
--- a/ext/web/06_streams.js
+++ b/ext/web/06_streams.js
@@ -9,7 +9,8 @@
((window) => {
const webidl = window.__bootstrap.webidl;
- // TODO(lucacasonato): get AbortSignal from __bootstrap.
+ const { add, remove, signalAbort, newSignal } =
+ window.__bootstrap.abortSignal;
const {
ArrayBuffer,
ArrayBufferIsView,
@@ -286,6 +287,7 @@
const _readRequests = Symbol("[[readRequests]]");
const _readIntoRequests = Symbol("[[readIntoRequests]]");
const _readyPromise = Symbol("[[readyPromise]]");
+ const _signal = Symbol("[[signal]]");
const _started = Symbol("[[started]]");
const _state = Symbol("[[state]]");
const _storedError = Symbol("[[storedError]]");
@@ -1902,8 +1904,7 @@
abortAlgorithm();
return promise.promise;
}
- // TODO(lucacasonato): use the internal API to listen for abort.
- signal.addEventListener("abort", abortAlgorithm);
+ signal[add](abortAlgorithm);
}
function pipeLoop() {
@@ -2107,8 +2108,7 @@
readableStreamReaderGenericRelease(reader);
if (signal !== undefined) {
- // TODO(lucacasonato): use the internal API to remove the listener.
- signal.removeEventListener("abort", abortAlgorithm);
+ signal[remove](abortAlgorithm);
}
if (isError) {
promise.reject(error);
@@ -2985,6 +2985,7 @@
controller[_stream] = stream;
stream[_controller] = controller;
resetQueue(controller);
+ controller[_signal] = newSignal();
controller[_started] = false;
controller[_strategySizeAlgorithm] = sizeAlgorithm;
controller[_strategyHWM] = highWaterMark;
@@ -3342,6 +3343,10 @@
if (state === "closed" || state === "errored") {
return resolvePromiseWith(undefined);
}
+ stream[_controller][_signal][signalAbort]();
+ if (state === "closed" || state === "errored") {
+ return resolvePromiseWith(undefined);
+ }
if (stream[_pendingAbortRequest] !== undefined) {
return stream[_pendingAbortRequest].deferred.promise;
}
@@ -5421,6 +5426,13 @@
[_stream];
/** @type {(chunk: W, controller: this) => Promise<void>} */
[_writeAlgorithm];
+ /** @type {AbortSignal} */
+ [_signal];
+
+ get signal() {
+ webidl.assertBranded(this, WritableStreamDefaultController);
+ return this[_signal];
+ }
constructor() {
webidl.illegalConstructor();