vue-concurrency
Version:
A library for encapsulating asynchronous operations and managing concurrency for Vue + Composition API
2 lines (1 loc) • 7.39 kB
JavaScript
(function(a,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("caf"),require("vue")):typeof define=="function"&&define.amd?define(["exports","caf","vue"],l):(a=typeof globalThis<"u"?globalThis:a||self,l(a.VueConcurrency={},a.CAF,a.Vue))})(this,function(a,l,c){"use strict";function q(n){return new Promise(r=>{const t=c.watch(n,s=>{s!=null&&(r(s),t&&t())},{immediate:!0})})}const b=n=>n._runningInstances.length>=n._maxConcurrency,w=n=>{const r=n._activeInstances[0];r&&r.cancel()},O=n=>{n._enqueuedInstances.forEach(r=>{r.isEnqueued=!1,r.isDropped=!0})};function d(n,r){return r?F(()=>n()._instances,r):c.computed(()=>[])}function F(n,r,t){return c.computed(()=>n().filter(e=>{const u=e[r];return t?u===t:u}))}function R(n){return c.computed(()=>n().length)}function m(n){return c.computed(()=>{const r=n();return r[r.length-1]})}function S(n){return c.computed(()=>n()[0])}const h=n=>n;function g(n){return c.reactive(n)}function D(){const n={},r=new Promise((t,s)=>{n.resolve=t,n.reject=s});return n.promise=r,n}function j(n){let r="General";n._isDropping&&(r="Drop"),n._isEnqueuing&&(r="Enqueue"),n._isRestartable&&(r="Restartable"),n._isKeepingLatest&&(r="KeepLatest");let t=`${r} Task`;r!=="General"&&(t=`${t} with maxConcurrency ${n._maxConcurrency}`);const s=n._instances.map(e=>{let u;e.isSuccessful?u="🍏":e.isRunning||e.isEnqueued?u="🍊":(e.isError||e.isCanceled||e.isDropped)&&(u="🔴");const{status:i,value:o,error:f}=e;return{status:`${u} ${i}`,value:o,error:f}});console.log(`🚦 ${t}`),console.table(s)}function P(n){return process.env.NODE_ENV==="test"?Promise.resolve():new Promise(r=>setTimeout(r,n))}function v(n,r){return new n.CancelToken(t=>{r.pr.catch(s=>{s==="cancel"&&t()})})}function A(n){return p(function*(r,...t){return n(r,...t)})}function L(n,r,t){const s=h({id:t.id,isDropped:!1,isEnqueued:!1,hasStarted:!1,isRunning:!1,isFinished:!1,isCanceling:!1,isCanceled:c.computed(()=>e.isCanceling&&e.isFinished),isActive:c.computed(()=>e.isRunning&&!e.isCanceling),isSuccessful:!1,isNotDropped:c.computed(()=>!e.isDropped),isError:c.computed(()=>!!e.error),status:c.computed(()=>{const i=e,o=[[i.isRunning,"running"],[i.isEnqueued,"enqueued"],[i.isCanceled,"canceled"],[i.isCanceling,"canceling"],[i.isDropped,"dropped"],[i.isError,"error"],[i.isSuccessful,"success"]].find(([f])=>f);return o&&o[1]}),error:null,value:null,cancel({force:i}={force:!1}){if(i||(e.isCanceling=!0,e.isEnqueued&&(e.isFinished=!0),e.isEnqueued=!1),e.token&&e._canAbort){e.token.abort("cancel");try{e.token.discard()}catch{}e.token=void 0,e._canAbort=!1}},canceledOn(i){return i.pr.catch(()=>{e.cancel()}),e},_run(){k(e,n,r,t)},_handled:!0,_deferredObject:D(),_shouldThrow:!1,_canAbort:!0,then(i,o){return e._shouldThrow=!0,e._deferredObject.promise.then(i,o)},catch(i,o=!0){return e._shouldThrow=o,e._deferredObject.promise.catch(i)},finally(i){return e._shouldThrow=!0,e._deferredObject.promise.finally(i)}}),e=g(s),{modifiers:u}=t;return u.drop?e.isDropped=!0:u.enqueue?e.isEnqueued=!0:e._run(),e}function k(n,r,t,s){const e=new l.CAF.cancelToken,u=l.CAF(r,e);n.token=e,n.hasStarted=!0,n.isRunning=!0,n.isEnqueued=!1;function i(){n.isRunning=!1,n.isFinished=!0}u.call(n,e,...t).then(o=>{n.value=o,n.isSuccessful=!0,i(),n._deferredObject.resolve(o),n._canAbort=!1,s.onFinish(n)}).catch(o=>{o!=="cancel"&&(n.error=o),i(),n._shouldThrow&&n._deferredObject.reject(o),s.onFinish(n)})}function p(n,r={cancelOnUnmount:!0}){const t=c.effectScope(),s=h({_isRestartable:!1,_isDropping:!1,_isEnqueuing:!1,_isKeepingLatest:!1,_maxConcurrency:1,_hasConcurrency:c.computed(()=>e._isRestartable||e._isDropping||e._isEnqueuing||e._isKeepingLatest),isIdle:c.computed(()=>!e.isRunning),isRunning:c.computed(()=>!!e._instances.find(u=>u.isRunning)),isError:c.computed(()=>!!(e.last&&e.last.isError)),_instances:[],_successfulInstances:d(()=>e,"isSuccessful"),_runningInstances:d(()=>e,"isRunning"),_enqueuedInstances:d(()=>e,"isEnqueued"),_notDroppedInstances:d(()=>e,"isNotDropped"),_activeInstances:d(()=>e,"isActive"),performCount:R(()=>e._instances),last:m(()=>e._notDroppedInstances),lastSuccessful:m(()=>e._successfulInstances),firstEnqueued:S(()=>e._enqueuedInstances),cancelAll({force:u}={force:!1}){e._instances.forEach(i=>{try{(u||!i.isDropped&&!i.isFinished)&&i.cancel({force:u})}catch(o){if(o!=="cancel")throw o}})},perform(...u){const i={enqueue:!1,drop:!1};e._hasConcurrency&&b(e)&&(e._isDropping&&(i.drop=!0),e._isRestartable&&w(e),e._isKeepingLatest&&O(e),(e._isEnqueuing||e._isKeepingLatest)&&(i.enqueue=!0));const o=()=>K(e),f=()=>L(n,u,{modifiers:i,onFinish:o,scope:t,id:e._instances.length+1}),y=t.active?t.run(f):f();return e._instances=[...e._instances,y],y},clear(){this.cancelAll({force:!0}),this._instances=[]},destroy(){t.stop(),this.clear()},restartable(){return e._resetModifierFlags(),e._isRestartable=!0,e},drop(){return e._resetModifierFlags(),e._isDropping=!0,e},enqueue(){return e._resetModifierFlags(),e._isEnqueuing=!0,e},keepLatest(){return e._resetModifierFlags(),e._isKeepingLatest=!0,e},_resetModifierFlags(){e._isKeepingLatest=!1,e._isRestartable=!1,e._isEnqueuing=!1,e._isDropping=!1},maxConcurrency(u){return e._maxConcurrency=u,e}}),e=g(s);return r.cancelOnUnmount&&c.getCurrentInstance()&&c.onBeforeUnmount(()=>{e._instances&&e.destroy()}),e}function K(n){if(n._isEnqueuing||n._isKeepingLatest){const{firstEnqueued:r}=n;r&&r._run()}}function x(n,...r){return p(function*(t,...s){let e=yield n.perform(...s).canceledOn(t);for(let u of r)e=yield u.perform(e).canceledOn(t);return e})}function I(...n){return p(function*(r,...t){const s=n.map(u=>u.perform(...t).canceledOn(r));return yield Promise.all(s)})}function N(...n){return p(function*(r,...t){const s=[];for(let e of n)s.push(yield e.perform(...t).canceledOn(r));return s})}const T=()=>typeof window>"u";function $(n){n.isError?n._deferredObject.promise=Promise.reject(n.error):n._deferredObject.promise=Promise.resolve(n.value),n.cancel=()=>{},n.canceledOn=()=>n,n._run=()=>{},n.then=(...r)=>n._deferredObject.promise.then(...r),n.catch=(...r)=>n._deferredObject.promise.catch(...r),n.finally=(...r)=>n._deferredObject.promise.finally(...r)}function G(n,r){if(T()){const s=r.perform();return c.onServerPrefetch(async()=>{try{await s,C(n,r)}catch{}}),s}const[t]=E(n,r).reverse();return t||r.perform()}function C(n,r){const{$root:t}=c.getCurrentInstance(),s=t&&t.context&&t.context.nuxtState;if(!s)throw new Error("Could not access $root.context.nuxtState");s.vueConcurrency||(s.vueConcurrency={}),s.vueConcurrency[n]=c.computed(()=>({instances:r._instances}))}function E(n,r){const t=M(n);return t&&(r._instances=t.instances||[],r._instances.forEach($),U(n)),r._instances}function _(){return window.__NUXT__}function M(n){if(!_())throw Error("Could not access window.__NUXT__");return _().vueConcurrency[n].value}function U(n){const r=_();delete r.vueConcurrency[n]}function V(n,r){if(T()){C(n,r);return}E(n,r)}function B(n){const r=Object.values(n),t=c.computed(()=>!!r.find(e=>e.isRunning));return c.reactive({isRunning:t,isIdle:c.computed(()=>!t.value),isError:c.computed(()=>!!r.find(e=>e.isError)),...n})}a.getCancelToken=v,a.printTask=j,a.timeout=P,a.useAsyncTask=A,a.useParallelTask=I,a.usePipeTask=x,a.useSSRPersistance=V,a.useSequentialTask=N,a.useTask=p,a.useTaskGroup=B,a.useTaskPrefetch=G,a.waitForValue=q,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});