1 | /**
|
2 | * @author Toru Nagashima <https://github.com/mysticatea>
|
3 | * @copyright 2017 Toru Nagashima. All rights reserved.
|
4 | * See LICENSE file in root directory for full license.
|
5 | */
|
6 | ;
|
7 |
|
8 | Object.defineProperty(exports, '__esModule', { value: true });
|
9 |
|
10 | var eventTargetShim = require('event-target-shim');
|
11 |
|
12 | /**
|
13 | * Aborted flag for each instances.
|
14 | * @type {WeakMap<AbortSignal, boolean>}
|
15 | */
|
16 | const abortedFlags = new WeakMap();
|
17 |
|
18 | /**
|
19 | * The signal class.
|
20 | * @constructor
|
21 | * @see https://dom.spec.whatwg.org/#abortsignal
|
22 | */
|
23 | function AbortSignal() {
|
24 | eventTargetShim.EventTarget.call(this);
|
25 | abortedFlags.set(this, false);
|
26 | }
|
27 |
|
28 | // Properties should be enumerable.
|
29 | AbortSignal.prototype = Object.create(eventTargetShim.EventTarget.prototype, {
|
30 | constructor: {
|
31 | value: AbortSignal,
|
32 | configurable: true,
|
33 | writable: true,
|
34 | },
|
35 |
|
36 | /**
|
37 | * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise.
|
38 | * @property
|
39 | * @memberof AbortSignal
|
40 | * @name aborted
|
41 | * @type {boolean}
|
42 | */
|
43 | aborted: {
|
44 | get: function get_aborted() { //eslint-disable-line camelcase
|
45 | const aborted = abortedFlags.get(this);
|
46 | console.assert(typeof aborted === "boolean", "Expected 'this' to be an 'AbortSignal' object, but got", this);
|
47 | return Boolean(aborted)
|
48 | },
|
49 | configurable: true,
|
50 | enumerable: true,
|
51 | },
|
52 |
|
53 | /**
|
54 | * The event attribute for `abort` event.
|
55 | * @property
|
56 | * @memberof AbortSignal
|
57 | * @name onabort
|
58 | * @type {Function}
|
59 | */
|
60 | });
|
61 |
|
62 | eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort");
|
63 |
|
64 | /**
|
65 | * Abort a given signal.
|
66 | * @param {AbortSignal} signal The signal to abort.
|
67 | * @returns {void}
|
68 | */
|
69 | function abortSignal(signal) {
|
70 | if (abortedFlags.get(signal) !== false) {
|
71 | return
|
72 | }
|
73 |
|
74 | abortedFlags.set(signal, true);
|
75 | signal.dispatchEvent({ type: "abort" });
|
76 | }
|
77 |
|
78 | /**
|
79 | * Associated signals.
|
80 | * @type {WeakMap<AbortController, AbortSignal>}
|
81 | */
|
82 | const signals = new WeakMap();
|
83 |
|
84 | /**
|
85 | * Get the associated signal of a given controller.
|
86 | * @param {AbortController} controller The controller to get its associated signal.
|
87 | * @returns {AbortSignal} The associated signal.
|
88 | */
|
89 | function getSignal(controller) {
|
90 | const signal = signals.get(controller);
|
91 | console.assert(signal != null, "Expected 'this' to be an 'AbortController' object, but got", controller);
|
92 | return signal
|
93 | }
|
94 |
|
95 | /**
|
96 | * The AbortController.
|
97 | * @constructor
|
98 | * @see https://dom.spec.whatwg.org/#abortcontroller
|
99 | */
|
100 | function AbortController() {
|
101 | signals.set(this, new AbortSignal());
|
102 | }
|
103 |
|
104 | // Properties should be enumerable.
|
105 | Object.defineProperties(AbortController.prototype, {
|
106 | /**
|
107 | * Returns the `AbortSignal` object associated with this object.
|
108 | * @type {AbortSignal}
|
109 | */
|
110 | signal: {
|
111 | get: function get_signal() { //eslint-disable-line camelcase
|
112 | return getSignal(this)
|
113 | },
|
114 | configurable: true,
|
115 | enumerable: true,
|
116 | },
|
117 |
|
118 | /**
|
119 | * Abort and signal to any observers that the associated activity is to be aborted.
|
120 | * @returns {void}
|
121 | */
|
122 | abort: {
|
123 | value: function abort() {
|
124 | // Not depend on this.signal which is overridable.
|
125 | const signal = getSignal(this);
|
126 | if (signal != null) {
|
127 | abortSignal(signal);
|
128 | }
|
129 | },
|
130 | configurable: true,
|
131 | enumerable: true,
|
132 | writable: true,
|
133 | },
|
134 | });
|
135 |
|
136 | exports['default'] = AbortController;
|
137 | exports.AbortController = AbortController;
|
138 | exports.AbortSignal = AbortSignal;
|
139 |
|
140 | module.exports = AbortController
|
141 | module.exports.AbortController = module.exports["default"] = AbortController
|
142 | module.exports.AbortSignal = AbortSignal
|
143 | //# sourceMappingURL=abort-controller.js.map
|