caf
Version:
Cancelable Async Flows: a wrapper to treat generators as cancelable async functions
5 lines • 3.23 kB
JavaScript
/*! CAF: caf.js
v15.0.1 (c) 2022 Kyle Simpson
MIT License: http://getify.mit-license.org
*/
!function UMD(e,n,l,r){"function"==typeof define&&define.amd?(l=Object.values(l),define(e,l,r)):"undefined"!=typeof module&&module.exports?(l=Object.keys(l).map((e=>require(e))),module.exports=r(...l)):(l=Object.values(l).map((e=>n[e])),n[e]=r(...l))}("CAF","undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:new Function("return this")(),{"./shared.js":"CAFShared"},(function DEF(e){"use strict";var{CLEANUP_FN:n,TIMEOUT_TOKEN:l,UNSET:r,getSignalReason:i,cancelToken:u,signalPromise:a,processTokenOrSignal:o,isFunction:s,invokeAbort:f}=e;let d={};function delay(e,n){var l,u;return"number"==typeof e&&"number"!=typeof n&&([n,e]=[e,n]),e&&({tokenOrSignal:e,signal:l,signalPr:u}=o(e)),l&&l.aborted?u:new Promise((function c(e,a){l&&(u.catch((function onAbort(){if(a&&l&&o){let u=i(l);clearTimeout(o),a(u!==r?u:`delay (${n}) interrupted`),e=a=o=l=null}})),u=null);var o=setTimeout((function onTimeout(){e(`delayed: ${n}`),e=a=o=l=null}),n)}))}function timeout(e,n="Timeout"){e=Number(e)||0;var i=new u;return delay(i.signal,e).then((()=>cleanup(n)),cleanup),Object.defineProperty(i,l,{value:!0,writable:!1,enumerable:!1,configurable:!1}),i;function cleanup(...e){f(i,e.length>0?e[0]:r),i.discard(),i=null}}function splitSignalPRs(e){return e.reduce((function split(e,n){var l=a(n);return e[0].push(l),n.pr||e[1].push(l),e}),[[],[]])}function triggerAndCleanup(e,l,r){e.then((function t(e){f(l,e),l.discard(),l=null})).then((function t(){for(let e of r)e[n]&&e[n]();r=null}))}function prCatch(e){return e.catch((e=>e))}function signalRace(e){var n=new u,[l,r]=splitSignalPRs(e);return triggerAndCleanup(prCatch(Promise.race(l)),n,r),n.signal}function signalAll(e){var n=new u,[l,r]=splitSignalPRs(e);return triggerAndCleanup(Promise.all(l.map(prCatch)),n,r),n.signal}function tokenCycle(){var e;return function getNextToken(...n){return e&&(f(e,n.length>0?n[0]:r),e.discard()),e=new u}}function runner(e,...n){var l=e.apply(this,n);return e=n=null,{it:l,result:function getNextResult(e){try{var n=l.next(e);e=null}catch(e){return Promise.reject(e)}return function processResult(e){var n=Promise.resolve(e.value);return e.done?l=null:(n=n.then(getNextResult,(function onRejection(e){return Promise.resolve(l.throw(e)).then(processResult)}))).catch((function cleanup(){l=null})),e=null,n}(n)}()}}return d=Object.assign((function CAF(e){return function instance(n,...u){var a,d;if(({tokenOrSignal:n,signal:a,signalPr:d}=o(n)),a.aborted)return d;var g=d.catch((function onCancellation(e){var n=i(a);n=n!==r?n:e;try{var l=p.return();throw void 0!==l.value?l.value:n!==r?n:void 0}finally{p=m=g=h=null}})),{it:p,result:m}=runner.call(this,e,a,...u),h=Promise.race([m,g]);if(n!==a&&n[l]){let e=function cancelTimer(l){f(n,l),s(n.discard)&&n.discard(),n=e=null};h.then(e,e)}else h.catch((()=>{})),n=null;return u=null,h}}),{cancelToken:u,delay:delay,timeout:timeout,signalRace:signalRace,signalAll:signalAll,tokenCycle:tokenCycle}),d.cancelToken=u,d.delay=delay,d.timeout=timeout,d.signalRace=signalRace,d.signalAll=signalAll,d.tokenCycle=tokenCycle,d}));