UNPKG

3.81 kBJavaScriptView Raw
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'use strict';
7
8Object.defineProperty(exports, '__esModule', { value: true });
9
10var eventTargetShim = require('event-target-shim');
11
12/**
13 * Aborted flag for each instances.
14 * @type {WeakMap<AbortSignal, boolean>}
15 */
16const abortedFlags = new WeakMap();
17
18/**
19 * The signal class.
20 * @constructor
21 * @see https://dom.spec.whatwg.org/#abortsignal
22 */
23function AbortSignal() {
24 eventTargetShim.EventTarget.call(this);
25 abortedFlags.set(this, false);
26}
27
28// Properties should be enumerable.
29AbortSignal.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
62eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort");
63
64/**
65 * Abort a given signal.
66 * @param {AbortSignal} signal The signal to abort.
67 * @returns {void}
68 */
69function 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 */
82const 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 */
89function 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 */
100function AbortController() {
101 signals.set(this, new AbortSignal());
102}
103
104// Properties should be enumerable.
105Object.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
136exports['default'] = AbortController;
137exports.AbortController = AbortController;
138exports.AbortSignal = AbortSignal;
139
140module.exports = AbortController
141module.exports.AbortController = module.exports["default"] = AbortController
142module.exports.AbortSignal = AbortSignal
143//# sourceMappingURL=abort-controller.js.map