UNPKG

2.02 kBPlain TextView Raw
1import { makeErrorWithCode } from '@neo-one/utils';
2import { EventEmitter } from 'events';
3
4export const AbortError = makeErrorWithCode('ABORT', () => 'Operation Aborted.');
5
6export class AbortSignal extends EventEmitter {
7 protected mutableAborted: boolean;
8
9 public constructor() {
10 super();
11 this.mutableAborted = false;
12 }
13
14 public get aborted(): boolean {
15 return this.mutableAborted;
16 }
17
18 public set aborted(value: boolean) {
19 this.mutableAborted = value;
20 }
21
22 public check(): void {
23 if (this.aborted) {
24 throw new AbortError();
25 }
26 }
27
28 public toString() {
29 return '[object AbortSignal]';
30 }
31
32 public get [Symbol.toStringTag]() {
33 return 'AbortSignal';
34 }
35}
36
37export class CombinedAbortSignal extends AbortSignal {
38 public readonly signals: ReadonlyArray<AbortSignal>;
39
40 public constructor(signals: ReadonlyArray<AbortSignal>) {
41 super();
42 this.signals = signals;
43 }
44
45 public get aborted(): boolean {
46 return this.mutableAborted || this.signals.some((signal) => signal.aborted);
47 }
48
49 public set aborted(value: boolean) {
50 this.mutableAborted = value;
51 this.signals.forEach((signal) => {
52 // tslint:disable-next-line no-object-mutation
53 signal.aborted = value;
54 });
55 }
56
57 public toString() {
58 return '[object CombinedAbortSignal]';
59 }
60
61 public get [Symbol.toStringTag]() {
62 return 'CombinedAbortSignal';
63 }
64}
65
66export class AbortController {
67 // tslint:disable-next-line readonly-array
68 public static combineSignals(signal: AbortSignal, ...signals: AbortSignal[]): AbortSignal {
69 return new CombinedAbortSignal([signal].concat(signals));
70 }
71
72 public readonly signal: AbortSignal;
73
74 public constructor() {
75 this.signal = new AbortSignal();
76 }
77
78 public abort() {
79 // tslint:disable-next-line no-object-mutation
80 this.signal.aborted = true;
81 this.signal.emit('abort');
82 }
83
84 public toString() {
85 return '[object AbortController]';
86 }
87
88 public get [Symbol.toStringTag]() {
89 return 'AbortController';
90 }
91}