UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 3.67 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{removeMaybe as e}from"./maybe.js";import{onAbort as s,onAbortOrThrow as t,createResolver as r,createAbortError as i,isPromiseLike as h}from"./promiseUtils.js";import o from"./Queue.js";import n from"./ReactiveMap.js";import{schedule as c}from"./scheduling.js";import{signal as l}from"./signal.js";class u{constructor(e,s){this.item=e,this.controller=s,this.promise=null}}class _{constructor(e){this._schedule=null,this._deferreds=new n,this._controllers=new n,this._processingItems=new n,this._pausedSignal=l(!1),this.concurrency=1,e.concurrency&&(this.concurrency=e.concurrency),this._queue=new o(e.peeker),this.process=e.process}destroy(){this.clear(),this._schedule=e(this._schedule)}get updating(){return this.running}get length(){return this._processingItems.size+this._queue.length}get running(){return!this._pausedSignal.value&&this._queue.length>0&&this._processingItems.size<this.concurrency}abort(e){const s=this._controllers.get(e);s&&s.abort()}clear(){this._queue.clear();const e=[];this._controllers.forEach((s=>e.push(s))),this._controllers.clear(),e.forEach((e=>e.abort())),this._processingItems.clear(),this._cancelNext()}forEach(e){this._deferreds.forEach(((s,t)=>e(t)))}get(e){const s=this._deferreds.get(e);return s?s.promise:void 0}isOngoing(e){return this._processingItems.has(e)}has(e){return this._deferreds.has(e)}pause(){this._pausedSignal.value||(this._pausedSignal.value=!0,this._cancelNext())}push(e,h){const o=this.get(e);if(o)return o;const n=new AbortController;let c=null;h&&(c=s(h,(()=>n.abort())));const l=()=>{const s=this._processingItems.get(e);s&&s.controller.abort(),u(),a.reject(i())},u=()=>{_.remove(),null!=c&&c.remove(),this._removeItem(e),this._queue.remove(e),this._scheduleNext()},_=t(n.signal,l),a=r();return this._deferreds.set(e,a),this._controllers.set(e,n),a.promise.then(u,u),this._queue.push(e),this._scheduleNext(),a.promise}last(){return this._queue.last()}lastPromise(){const e=this.last();return e?this.get(e):null}peek(){return this._queue.peek()}popLast(){const e=this._queue.popLast();return e&&(this._deferreds.get(e)?.reject(i()),this._removeItem(e)),e}reset(){const e=Array.from(this._processingItems.values());this._processingItems.clear();for(const s of e)this._queue.push(s.item),s.controller.abort();this._scheduleNext()}resume(){this._pausedSignal.value&&(this._pausedSignal.value=!1,this._scheduleNext())}takeAll(){const e=[];for(;this._queue.length;)e.push(this._queue.pop());return this.clear(),e}_removeItem(e){this._deferreds.delete(e),this._controllers.delete(e),this._processingItems.delete(e)}_scheduleNext(){this._pausedSignal.value||this._schedule||(this._schedule=c((()=>{this._schedule=null,this._next()})))}_next(){for(;this._queue.length>0&&this._processingItems.size<this.concurrency;)this._process(this._queue.pop())}_cancelNext(){this._schedule&&(this._schedule.remove(),this._schedule=null)}_processResult(e,s){this._canProcessFulfillment(e)&&(this._scheduleNext(),this._deferreds.get(e.item).resolve(s))}_processError(e,s){this._canProcessFulfillment(e)&&(this._scheduleNext(),this._deferreds.get(e.item).reject(s))}_canProcessFulfillment(e){return!!this._deferreds.get(e.item)&&this._processingItems.get(e.item)===e}_process(e){if(null==e)return;let s;const t=new AbortController,r=new u(e,t);this._processingItems.set(e,r);try{s=this.process(e,t.signal)}catch(i){this._processError(r,i)}h(s)?(r.promise=s,s.then((e=>this._processResult(r,e)),(e=>this._processError(r,e)))):this._processResult(r,s)}}export{_ as QueueProcessor};