caf
Version:
Cancelable Async Flows: a wrapper to treat generators as cancelable async functions
5 lines • 3.36 kB
JavaScript
/*! CAF: shared.js
v15.0.1 (c) 2022 Kyle Simpson
MIT License: http://getify.mit-license.org
*/
!function UMD(n,e,i,t){"function"==typeof define&&define.amd?(i=Object.values(i),define(n,i,t)):"undefined"!=typeof module&&module.exports?(i=Object.keys(i).map((n=>require(n))),module.exports=t(...i)):(i=Object.values(i).map((n=>e[n])),e[n]=t(...i))}("CAFShared","undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:new Function("return this")(),{},(function DEF(){"use strict";const n=Symbol("Cleanup Function"),e=Symbol("Timeout Token"),i=Symbol("Signal Reason"),t=Symbol("Unset"),[o,r]=function featureDetect(){var n=new AbortController,e=!!Object.getOwnPropertyDescriptor(Object.getPrototypeOf(n.signal),"reason");try{n.abort()}catch(n){}return[e,isNativeAbortException(n.signal.reason)]}();class s{constructor(e=new AbortController){var o;this.controller=e,this.signal=e.signal,this.signal[i]=t;var initPromise=(e,i)=>{var doRej=()=>{if(i&&this.signal){let n=getSignalReason(this.signal);this._trackSignalReason(n),i(n!==t?n:void 0)}i=null};this.signal.addEventListener("abort",doRej,!1),o=()=>{this.signal&&(this.signal.removeEventListener("abort",doRej,!1),this.signal.pr&&(this.signal.pr[n]=null)),doRej=null}};this.signal.pr=new Promise(initPromise),this.signal.pr[n]=o,this.signal.pr.catch(o),initPromise=o=null}abort(...n){var e=n.length>0?n[0]:t;this._trackSignalReason(e),this.controller&&(o&&e!==t?this.controller.abort(e):this.controller.abort())}discard(){this.signal&&(this.signal.pr&&(this.signal.pr[n]&&this.signal.pr[n](),this.signal.pr=null),delete this.signal[i],o||(this.signal.reason=null),this.signal=null),this.controller=null}_trackSignalReason(n){this.signal&&n!==t&&(o||"reason"in this.signal||(this.signal.reason=n),this.signal[i]===t&&(this.signal[i]=n))}}let a={};function getSignalReason(n){return n&&n.aborted?o&&r?isNativeAbortException(n.reason)?t:n.reason:i in n?n[i]:t:t}function signalPromise(e){if(e.pr)return e.pr;var i,o=new Promise((function c(n,o){i=()=>{if(o&&e){let n=getSignalReason(e);o(n!==t?n:void 0)}o=null},e.addEventListener("abort",i,!1)}));return o[n]=function cleanup(){e&&(e.removeEventListener("abort",i,!1),e=null),o&&(o=o[n]=i=null)},o.catch(o[n]),o}function processTokenOrSignal(n){n instanceof AbortController&&(n=new s(n));var e=n&&n instanceof s?n.signal:n;return{tokenOrSignal:n,signal:e,signalPr:signalPromise(e)}}function deferred(){var n;return{pr:new Promise((e=>n=e)),resolve:n}}function isFunction(n){return"function"==typeof n}function isPromise(n){return n&&"object"==typeof n&&"function"==typeof n.then}function isNativeAbortException(n){return"object"==typeof n&&n instanceof Error&&"AbortError"==n.name}function invokeAbort(n,e){isNativeAbortException(e)||e===t?n.abort():n.abort(e)}return a={CLEANUP_FN:n,TIMEOUT_TOKEN:e,UNSET:t,getSignalReason:getSignalReason,cancelToken:s,signalPromise:signalPromise,processTokenOrSignal:processTokenOrSignal,deferred:deferred,isFunction:isFunction,isPromise:isPromise,invokeAbort:invokeAbort},a.CLEANUP_FN=n,a.TIMEOUT_TOKEN=e,a.UNSET=t,a.getSignalReason=getSignalReason,a.cancelToken=s,a.signalPromise=signalPromise,a.processTokenOrSignal=processTokenOrSignal,a.deferred=deferred,a.isFunction=isFunction,a.isPromise=isPromise,a.invokeAbort=invokeAbort,a}));