1 | const { EventEmitter } = require("events");
|
---|
2 |
|
---|
3 | class AbortSignal {
|
---|
4 | constructor() {
|
---|
5 | this.eventEmitter = new EventEmitter();
|
---|
6 | this.onabort = null;
|
---|
7 | this.aborted = false;
|
---|
8 | this.reason = undefined;
|
---|
9 | }
|
---|
10 | toString() {
|
---|
11 | return "[object AbortSignal]";
|
---|
12 | }
|
---|
13 | get [Symbol.toStringTag]() {
|
---|
14 | return "AbortSignal";
|
---|
15 | }
|
---|
16 | removeEventListener(name, handler) {
|
---|
17 | this.eventEmitter.removeListener(name, handler);
|
---|
18 | }
|
---|
19 | addEventListener(name, handler) {
|
---|
20 | this.eventEmitter.on(name, handler);
|
---|
21 | }
|
---|
22 | dispatchEvent(type) {
|
---|
23 | const event = { type, target: this };
|
---|
24 | const handlerName = `on${type}`;
|
---|
25 |
|
---|
26 | if (typeof this[handlerName] === "function") this[handlerName](event);
|
---|
27 |
|
---|
28 | this.eventEmitter.emit(type, event);
|
---|
29 | }
|
---|
30 | throwIfAborted() {
|
---|
31 | if (this.aborted) {
|
---|
32 | throw this.reason;
|
---|
33 | }
|
---|
34 | }
|
---|
35 | static abort(reason) {
|
---|
36 | const controller = new AbortController();
|
---|
37 | controller.abort();
|
---|
38 | return controller.signal;
|
---|
39 | }
|
---|
40 | static timeout(time) {
|
---|
41 | const controller = new AbortController();
|
---|
42 | setTimeout(() => controller.abort(new Error("TimeoutError")), time);
|
---|
43 | return controller.signal;
|
---|
44 | }
|
---|
45 | }
|
---|
46 | class AbortController {
|
---|
47 | constructor() {
|
---|
48 | this.signal = new AbortSignal();
|
---|
49 | }
|
---|
50 | abort(reason) {
|
---|
51 | if (this.signal.aborted) return;
|
---|
52 |
|
---|
53 | this.signal.aborted = true;
|
---|
54 |
|
---|
55 | if (reason) this.signal.reason = reason;
|
---|
56 | else this.signal.reason = new Error("AbortError");
|
---|
57 |
|
---|
58 | this.signal.dispatchEvent("abort");
|
---|
59 | }
|
---|
60 | toString() {
|
---|
61 | return "[object AbortController]";
|
---|
62 | }
|
---|
63 | get [Symbol.toStringTag]() {
|
---|
64 | return "AbortController";
|
---|
65 | }
|
---|
66 | }
|
---|
67 |
|
---|
68 | module.exports = { AbortController, AbortSignal };
|
---|