mirror of
https://github.com/denoland/deno.git
synced 2024-12-27 01:29:14 -05:00
59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
|
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
||
|
import { EventImpl } from "./event.ts";
|
||
|
import { EventTargetImpl } from "./event_target.ts";
|
||
|
|
||
|
export const add = Symbol("add");
|
||
|
export const signalAbort = Symbol("signalAbort");
|
||
|
export const remove = Symbol("remove");
|
||
|
|
||
|
export class AbortSignalImpl extends EventTargetImpl implements AbortSignal {
|
||
|
#aborted?: boolean;
|
||
|
#abortAlgorithms = new Set<() => void>();
|
||
|
|
||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||
|
onabort: ((this: AbortSignal, ev: Event) => any) | null = null;
|
||
|
|
||
|
[add](algorithm: () => void): void {
|
||
|
this.#abortAlgorithms.add(algorithm);
|
||
|
}
|
||
|
|
||
|
[signalAbort](): void {
|
||
|
if (this.#aborted) {
|
||
|
return;
|
||
|
}
|
||
|
this.#aborted = true;
|
||
|
for (const algorithm of this.#abortAlgorithms) {
|
||
|
algorithm();
|
||
|
}
|
||
|
this.#abortAlgorithms.clear();
|
||
|
this.dispatchEvent(new EventImpl("abort"));
|
||
|
}
|
||
|
|
||
|
[remove](algorithm: () => void): void {
|
||
|
this.#abortAlgorithms.delete(algorithm);
|
||
|
}
|
||
|
|
||
|
constructor() {
|
||
|
super();
|
||
|
this.addEventListener("abort", (evt: Event) => {
|
||
|
const { onabort } = this;
|
||
|
if (typeof onabort === "function") {
|
||
|
onabort.call(this, evt);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
get aborted(): boolean {
|
||
|
return Boolean(this.#aborted);
|
||
|
}
|
||
|
|
||
|
get [Symbol.toStringTag](): string {
|
||
|
return "AbortSignal";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Object.defineProperty(AbortSignalImpl, "name", {
|
||
|
value: "AbortSignal",
|
||
|
configurable: true,
|
||
|
});
|