[d24f17c] | 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 };
|
---|