You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					119 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					119 lines
				
				3.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @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
							 |