Spaces:
Sleeping
Sleeping
/** | |
* @author Toru Nagashima <https://github.com/mysticatea> | |
* See LICENSE file in root directory for full license. | |
*/ | |
import { EventTarget, defineEventAttribute } from 'event-target-shim'; | |
/** | |
* The signal class. | |
* @see https://dom.spec.whatwg.org/#abortsignal | |
*/ | |
class AbortSignal extends EventTarget { | |
/** | |
* AbortSignal cannot be constructed directly. | |
*/ | |
constructor() { | |
super(); | |
throw new TypeError("AbortSignal cannot be constructed directly"); | |
} | |
/** | |
* Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. | |
*/ | |
get aborted() { | |
const aborted = abortedFlags.get(this); | |
if (typeof aborted !== "boolean") { | |
throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); | |
} | |
return aborted; | |
} | |
} | |
defineEventAttribute(AbortSignal.prototype, "abort"); | |
/** | |
* Create an AbortSignal object. | |
*/ | |
function createAbortSignal() { | |
const signal = Object.create(AbortSignal.prototype); | |
EventTarget.call(signal); | |
abortedFlags.set(signal, false); | |
return signal; | |
} | |
/** | |
* Abort a given signal. | |
*/ | |
function abortSignal(signal) { | |
if (abortedFlags.get(signal) !== false) { | |
return; | |
} | |
abortedFlags.set(signal, true); | |
signal.dispatchEvent({ type: "abort" }); | |
} | |
/** | |
* Aborted flag for each instances. | |
*/ | |
const abortedFlags = new WeakMap(); | |
// Properties should be enumerable. | |
Object.defineProperties(AbortSignal.prototype, { | |
aborted: { enumerable: true }, | |
}); | |
// `toString()` should return `"[object AbortSignal]"` | |
if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { | |
Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { | |
configurable: true, | |
value: "AbortSignal", | |
}); | |
} | |
/** | |
* The AbortController. | |
* @see https://dom.spec.whatwg.org/#abortcontroller | |
*/ | |
class AbortController { | |
/** | |
* Initialize this controller. | |
*/ | |
constructor() { | |
signals.set(this, createAbortSignal()); | |
} | |
/** | |
* Returns the `AbortSignal` object associated with this object. | |
*/ | |
get signal() { | |
return getSignal(this); | |
} | |
/** | |
* Abort and signal to any observers that the associated activity is to be aborted. | |
*/ | |
abort() { | |
abortSignal(getSignal(this)); | |
} | |
} | |
/** | |
* Associated signals. | |
*/ | |
const signals = new WeakMap(); | |
/** | |
* Get the associated signal of a given controller. | |
*/ | |
function getSignal(controller) { | |
const signal = signals.get(controller); | |
if (signal == null) { | |
throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); | |
} | |
return signal; | |
} | |
// Properties should be enumerable. | |
Object.defineProperties(AbortController.prototype, { | |
signal: { enumerable: true }, | |
abort: { enumerable: true }, | |
}); | |
if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { | |
Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { | |
configurable: true, | |
value: "AbortController", | |
}); | |
} | |
export default AbortController; | |
export { AbortController, AbortSignal }; | |
//# sourceMappingURL=abort-controller.mjs.map | |