UNPKG

2.46 kBJavaScriptView Raw
1class Emitter {
2 constructor() {
3 this.listeners = {};
4 }
5 addEventListener(type, callback) {
6 if (!(type in this.listeners)) {
7 this.listeners[type] = [];
8 }
9 this.listeners[type].push(callback);
10 }
11 removeEventListener(type, callback) {
12 if (!(type in this.listeners)) {
13 return;
14 }
15 const stack = this.listeners[type];
16 for (let i = 0, l = stack.length; i < l; i++) {
17 if (stack[i] === callback) {
18 stack.splice(i, 1);
19 return;
20 }
21 }
22 }
23 dispatchEvent(event) {
24 if (!(event.type in this.listeners)) {
25 return;
26 }
27 const debounce = callback => {
28 setTimeout(() => callback.call(this, event));
29 };
30 const stack = this.listeners[event.type];
31 for (let i = 0, l = stack.length; i < l; i++) {
32 debounce(stack[i]);
33 }
34 return !event.defaultPrevented;
35 }
36}
37
38export class AbortSignal extends Emitter {
39 constructor() {
40 super();
41
42 this.aborted = false;
43 this.onabort = null;
44 }
45 toString() {
46 return '[object AbortSignal]';
47 }
48 dispatchEvent(event) {
49 if (event.type === 'abort') {
50 this.aborted = true;
51 if (typeof this.onabort === 'function') {
52 this.onabort.call(this, event);
53 }
54 }
55
56 super.dispatchEvent(event);
57 }
58}
59
60export class AbortController {
61 constructor() {
62 this.signal = new AbortSignal();
63 }
64 abort() {
65 let event;
66 try {
67 event = new Event('abort');
68 } catch (e) {
69 if (typeof document !== 'undefined') {
70 if (!document.createEvent) {
71 // For Internet Explorer 8:
72 event = document.createEventObject();
73 event.type = 'abort';
74 } else {
75 // For Internet Explorer 11:
76 event = document.createEvent('Event');
77 event.initEvent('abort', false, false);
78 }
79 } else {
80 // Fallback where document isn't available:
81 event = {
82 type: 'abort',
83 bubbles: false,
84 cancelable: false
85 };
86 }
87 }
88 this.signal.dispatchEvent(event);
89 }
90 toString() {
91 return '[object AbortController]';
92 }
93}
94
95export default AbortController;
96
97if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
98 // These are necessary to make sure that we get correct output for:
99 // Object.prototype.toString.call(new AbortController())
100 AbortController.prototype[Symbol.toStringTag] = 'AbortController';
101 AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
102}