summaryrefslogtreecommitdiff
path: root/op_crates/web/02_abort_signal.js
diff options
context:
space:
mode:
authorLuca Casonato <lucacasonato@yahoo.com>2020-08-19 14:43:20 +0200
committerGitHub <noreply@github.com>2020-08-19 14:43:20 +0200
commit1507a8cf2d8bce8c3596583b995fea4914a99203 (patch)
tree3e9280b01dab60dcea368894a153a9237884d676 /op_crates/web/02_abort_signal.js
parent27f4aeb92469660fdd78a89a7b2902c08a23ca4a (diff)
refactor(op_crates/web): move abort signal (#7117)
Diffstat (limited to 'op_crates/web/02_abort_signal.js')
-rw-r--r--op_crates/web/02_abort_signal.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/op_crates/web/02_abort_signal.js b/op_crates/web/02_abort_signal.js
new file mode 100644
index 000000000..908e85ac9
--- /dev/null
+++ b/op_crates/web/02_abort_signal.js
@@ -0,0 +1,76 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+((window) => {
+ const add = Symbol("add");
+ const signalAbort = Symbol("signalAbort");
+ const remove = Symbol("remove");
+
+ class AbortSignal extends EventTarget {
+ #aborted = false;
+ #abortAlgorithms = new Set();
+
+ [add](algorithm) {
+ this.#abortAlgorithms.add(algorithm);
+ }
+
+ [signalAbort]() {
+ if (this.#aborted) {
+ return;
+ }
+ this.#aborted = true;
+ for (const algorithm of this.#abortAlgorithms) {
+ algorithm();
+ }
+ this.#abortAlgorithms.clear();
+ this.dispatchEvent(new Event("abort"));
+ }
+
+ [remove](algorithm) {
+ this.#abortAlgorithms.delete(algorithm);
+ }
+
+ constructor() {
+ super();
+ this.onabort = null;
+ this.addEventListener("abort", (evt) => {
+ const { onabort } = this;
+ if (typeof onabort === "function") {
+ onabort.call(this, evt);
+ }
+ });
+ }
+
+ get aborted() {
+ return Boolean(this.#aborted);
+ }
+
+ get [Symbol.toStringTag]() {
+ return "AbortSignal";
+ }
+ }
+
+ class AbortController {
+ #signal = new AbortSignal();
+
+ get signal() {
+ return this.#signal;
+ }
+
+ abort() {
+ this.#signal[signalAbort]();
+ }
+
+ get [Symbol.toStringTag]() {
+ return "AbortController";
+ }
+ }
+
+ window.AbortSignal = AbortSignal;
+ window.AbortController = AbortController;
+ window.__bootstrap = window.__bootstrap || {};
+ window.__bootstrap.abortSignal = {
+ add,
+ signalAbort,
+ remove,
+ };
+})(this);