UNPKG

caf

Version:

Cancelable Async Flows: a wrapper to treat generators as cancelable async functions

5 lines 8.36 kB
/*! CAF: bundle.js v15.0.1 (c) 2022 Kyle Simpson MIT License: http://getify.mit-license.org */ !function UMDBundle(e,n){for(let[r,i,o]of n)"function"==typeof define&&define.amd?(i=Object.values(i),define(r,i,o)):"undefined"!=typeof module&&module.exports?(i=Object.entries(i).map((([e,n])=>module.exports[n]||require(e))),module.exports[r]=o(...i)):(i=Object.values(i).map((n=>e[n])),e[r]=o(...i))}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:new Function("return this")(),[["CAFShared",{},function DEF(){"use strict";const e=Symbol("Cleanup Function"),n=Symbol("Timeout Token"),r=Symbol("Signal Reason"),i=Symbol("Unset"),[o,l]=function featureDetect(){var e=new AbortController,n=!!Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e.signal),"reason");try{e.abort()}catch(e){}return[n,isNativeAbortException(e.signal.reason)]}();class a{constructor(n=new AbortController){var o;this.controller=n,this.signal=n.signal,this.signal[r]=i;var initPromise=(n,r)=>{var doRej=()=>{if(r&&this.signal){let e=getSignalReason(this.signal);this._trackSignalReason(e),r(e!==i?e:void 0)}r=null};this.signal.addEventListener("abort",doRej,!1),o=()=>{this.signal&&(this.signal.removeEventListener("abort",doRej,!1),this.signal.pr&&(this.signal.pr[e]=null)),doRej=null}};this.signal.pr=new Promise(initPromise),this.signal.pr[e]=o,this.signal.pr.catch(o),initPromise=o=null}abort(...e){var n=e.length>0?e[0]:i;this._trackSignalReason(n),this.controller&&(o&&n!==i?this.controller.abort(n):this.controller.abort())}discard(){this.signal&&(this.signal.pr&&(this.signal.pr[e]&&this.signal.pr[e](),this.signal.pr=null),delete this.signal[r],o||(this.signal.reason=null),this.signal=null),this.controller=null}_trackSignalReason(e){this.signal&&e!==i&&(o||"reason"in this.signal||(this.signal.reason=e),this.signal[r]===i&&(this.signal[r]=e))}}let s={};function getSignalReason(e){return e&&e.aborted?o&&l?isNativeAbortException(e.reason)?i:e.reason:r in e?e[r]:i:i}function signalPromise(n){if(n.pr)return n.pr;var r,o=new Promise((function c(e,o){r=()=>{if(o&&n){let e=getSignalReason(n);o(e!==i?e:void 0)}o=null},n.addEventListener("abort",r,!1)}));return o[e]=function cleanup(){n&&(n.removeEventListener("abort",r,!1),n=null),o&&(o=o[e]=r=null)},o.catch(o[e]),o}function processTokenOrSignal(e){e instanceof AbortController&&(e=new a(e));var n=e&&e instanceof a?e.signal:e;return{tokenOrSignal:e,signal:n,signalPr:signalPromise(n)}}function deferred(){var e;return{pr:new Promise((n=>e=n)),resolve:e}}function isFunction(e){return"function"==typeof e}function isPromise(e){return e&&"object"==typeof e&&"function"==typeof e.then}function isNativeAbortException(e){return"object"==typeof e&&e instanceof Error&&"AbortError"==e.name}function invokeAbort(e,n){isNativeAbortException(n)||n===i?e.abort():e.abort(n)}return s={CLEANUP_FN:e,TIMEOUT_TOKEN:n,UNSET:i,getSignalReason:getSignalReason,cancelToken:a,signalPromise:signalPromise,processTokenOrSignal:processTokenOrSignal,deferred:deferred,isFunction:isFunction,isPromise:isPromise,invokeAbort:invokeAbort},s.CLEANUP_FN=e,s.TIMEOUT_TOKEN=n,s.UNSET=i,s.getSignalReason=getSignalReason,s.cancelToken=a,s.signalPromise=signalPromise,s.processTokenOrSignal=processTokenOrSignal,s.deferred=deferred,s.isFunction=isFunction,s.isPromise=isPromise,s.invokeAbort=invokeAbort,s}],["CAF",{"./shared.js":"CAFShared"},function DEF(e){"use strict";var{CLEANUP_FN:n,TIMEOUT_TOKEN:r,UNSET:i,getSignalReason:o,cancelToken:l,signalPromise:a,processTokenOrSignal:s,isFunction:u,invokeAbort:f}=e;let g={};function delay(e,n){var r,l;return"number"==typeof e&&"number"!=typeof n&&([n,e]=[e,n]),e&&({tokenOrSignal:e,signal:r,signalPr:l}=s(e)),r&&r.aborted?l:new Promise((function c(e,a){r&&(l.catch((function onAbort(){if(a&&r&&s){let l=o(r);clearTimeout(s),a(l!==i?l:`delay (${n}) interrupted`),e=a=s=r=null}})),l=null);var s=setTimeout((function onTimeout(){e(`delayed: ${n}`),e=a=s=r=null}),n)}))}function timeout(e,n="Timeout"){e=Number(e)||0;var o=new l;return delay(o.signal,e).then((()=>cleanup(n)),cleanup),Object.defineProperty(o,r,{value:!0,writable:!1,enumerable:!1,configurable:!1}),o;function cleanup(...e){f(o,e.length>0?e[0]:i),o.discard(),o=null}}function splitSignalPRs(e){return e.reduce((function split(e,n){var r=a(n);return e[0].push(r),n.pr||e[1].push(r),e}),[[],[]])}function triggerAndCleanup(e,r,i){e.then((function t(e){f(r,e),r.discard(),r=null})).then((function t(){for(let e of i)e[n]&&e[n]();i=null}))}function prCatch(e){return e.catch((e=>e))}function signalRace(e){var n=new l,[r,i]=splitSignalPRs(e);return triggerAndCleanup(prCatch(Promise.race(r)),n,i),n.signal}function signalAll(e){var n=new l,[r,i]=splitSignalPRs(e);return triggerAndCleanup(Promise.all(r.map(prCatch)),n,i),n.signal}function tokenCycle(){var e;return function getNextToken(...n){return e&&(f(e,n.length>0?n[0]:i),e.discard()),e=new l}}function runner(e,...n){var r=e.apply(this,n);return e=n=null,{it:r,result:function getNextResult(e){try{var n=r.next(e);e=null}catch(e){return Promise.reject(e)}return function processResult(e){var n=Promise.resolve(e.value);return e.done?r=null:(n=n.then(getNextResult,(function onRejection(e){return Promise.resolve(r.throw(e)).then(processResult)}))).catch((function cleanup(){r=null})),e=null,n}(n)}()}}return g=Object.assign((function CAF(e){return function instance(n,...l){var a,g;if(({tokenOrSignal:n,signal:a,signalPr:g}=s(n)),a.aborted)return g;var d=g.catch((function onCancellation(e){var n=o(a);n=n!==i?n:e;try{var r=v.return();throw void 0!==r.value?r.value:n!==i?n:void 0}finally{v=h=d=p=null}})),{it:v,result:h}=runner.call(this,e,a,...l),p=Promise.race([h,d]);if(n!==a&&n[r]){let e=function cancelTimer(r){f(n,r),u(n.discard)&&n.discard(),n=e=null};p.then(e,e)}else p.catch((()=>{})),n=null;return l=null,p}}),{cancelToken:l,delay:delay,timeout:timeout,signalRace:signalRace,signalAll:signalAll,tokenCycle:tokenCycle}),g.cancelToken=l,g.delay=delay,g.timeout=timeout,g.signalRace=signalRace,g.signalAll=signalAll,g.tokenCycle=tokenCycle,g}],["CAG",{"./caf.js":"CAF","./shared.js":"CAFShared"},function DEF(e,n){"use strict";var{TIMEOUT_TOKEN:r,UNSET:i,getSignalReason:o,cancelToken:l,signalPromise:a,processTokenOrSignal:s,deferred:u,isFunction:f,isPromise:g}=n;onceEvent=e(onceEvent);let d={};d=Object.assign(CAG,{onEvent:onEvent,onceEvent:onceEvent}),d.onEvent=onEvent,d.onceEvent=onceEvent;var v=new WeakSet;const h=Symbol("unset"),p=Symbol("returned"),m=Symbol("canceled");function CAG(e){return function instance(n,...l){var a,f;if(({tokenOrSignal:n,signal:a,signalPr:f}=s(n)),a.aborted){let e=o(a);throw e=e!==i?e:"Aborted",e}var d=u(),{it:b,ait:y}=function runner(e,n,r,i,...o){var l=e.call(this,{signal:i,pwait:pwait},...o);e=o=null;var a=i.pr.catch((e=>{throw{[m]:!0,reason:e}}));return a.catch((()=>{})),{it:l,ait:async function*runner(){var e,i=h;try{for(;!n.resolved;)if(i!==h?(e=i,i=h,e=l.throw(e)):e=l.next(e),g(e.value))if(v.has(e.value)){v.delete(e.value);try{if((e=await Promise.race([n,a,e.value]))===p)return}catch(e){if(e[m]){let n=l.return();throw void 0!==n.value?n.value:e.reason}i=e}}else e=yield e.value;else{if(e.done)return e.value;e=yield e.value}}finally{l=n=null,r()}}()}}(e,d.pr,onComplete,a,...l),E=y.return;return y.return=function doReturn(e){try{return d.pr.resolved=!0,d.resolve(p),Promise.resolve(b.return(e))}finally{E.call(y),onComplete()}},y;function onComplete(){n&&n!==a&&n[r]&&n.abort(),y&&(y.return=E,n=d=b=y=E=null)}}}function onEvent(e,n,r,i=!1){var o,l,a=!1,s=CAG((function*eventStream({pwait:e}){a||start();try{for(;;){if(0==o.length){let{pr:e,resolve:n}=u();o.push(e),l.push(n)}yield yield e(o.shift())}}finally{f(n.removeEventListener)?n.removeEventListener(r,handler,i):f(n.removeListener)?n.removeListener(r,handler):f(n.off)&&n.off(r,handler),o.length=l.length=0}}))(e,n,r,i);return s.start=start,s;function start(){a||(a=!0,o=[],l=[],f(n.addEventListener)?n.addEventListener(r,handler,i):f(n.addListener)?n.addListener(r,handler):f(n.on)&&n.on(r,handler))}function handler(e){if(l.length>0){l.shift()(e)}else{let{pr:n,resolve:r}=u();o.push(n),r(e)}}}function*onceEvent(e,n,r,i=!1){try{var o=onEvent(e,n,r,i);return(yield o.next()).value}finally{o.return()}}function pwait(e){var n=Promise.resolve(e);return v.add(n),n}return d}]]);