UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 5.51 kB
import{_ as e}from"../../../chunks/tslib.es6.js";import t from"../../../request.js";import s from"../../../core/Accessor.js";import{removeUnordered as r}from"../../../core/arrayUtils.js";import o from"../../../core/Error.js";import{clone as a}from"../../../core/lang.js";import{removeMaybe as n,abortMaybe as i,destroyMaybe as u,isSome as l}from"../../../core/maybe.js";import{createResolver as h,onAbort as c,createAbortError as d,throwIfAborted as p,isAbortError as m}from"../../../core/promiseUtils.js";import{property as _}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/accessorSupport/ensureType.js";import{subclass as g}from"../../../core/accessorSupport/decorators/subclass.js";import{AsyncWorkerQueue as f,BaseTask as k}from"./AsyncWorkerQueue.js";import{assert as L}from"../webgl-engine/lib/Util.js";import{TaskPriority as D}from"../../support/Scheduler.js";let y=class extends s{constructor(){super(...arguments),this._tasks=new Map,this._onLoadQueue=new Array,this._doneQueue=new Array,this.updating=!1}setup(e,t,s){this._loadQueue=new f(((e,t)=>this._startLoading(e,t)),((e,t)=>this._doneLoadingCB(e,t)),e,t),s&&(this._frameTask=s.registerTask(D.STREAM_DATA_LOADER,this))}destroy(){this._frameTask=n(this._frameTask),this._tasks.forEach((e=>i(e.abortController))),this._loadQueue=u(this._loadQueue),this._onLoadQueue=null,this._doneQueue=null,this._tasks=null}hasDownloadSlots(e){return this._loadQueue.hasQuota(e)}request(e,t,s,r={}){const o=h();o.__signal=l(r)?r.signal:null;const a=this._createOrUpdateTask(e,t,s,r,o);return c(r,(()=>this._cancelRequest(a,o))),o.promise}_createTask(e,t,s,r,o,a){const n=new Q(e,t,s,r,o);return this._updateTask(n,a),this._tasks.set(o,n),1===this._tasks.size&&this._set("updating",!0),this._loadQueue.push(n),n}_cancelRequest(e,t){r(e.resolvers,t),t.reject(d()),0===e.resolvers.length&&(e.status===E.DOWNLOADING&&(e.status=E.CANCELLED,this._loadQueue.cancel(e),e.abortController?.abort(),e.request=null,e.abortController=null),e.status=E.CANCELLED,this._tasks.delete(e.key),0===this._tasks.size&&this._set("updating",!1))}_updateTask(e,t){e.resolvers.push(t)}_createOrUpdateTask(e,t,s,r,o){const a=T(l(r)&&r.uid||e,t,s),n=this._tasks.get(a);return n?(this._updateTask(n,o),n):this._createTask(e,r,t,s,a,o)}_doneLoadingCB(e,t){this._loadQueue&&(L(e.status===E.DOWNLOADING),e.status=E.DOWNLOADED,this._frameTask?this._doneQueue.push({task:e,err:t}):this._doneLoading(e,t))}get running(){return this._doneQueue.length>0||this._onLoadQueue.length>0}runTask(e){for(;!e.done&&this._onLoadQueue.length>0;){const t=this._onLoadQueue.shift();p(t.task.abortController),t.task.abortController=null,t.callback(t.task),e.madeProgress()}for(;!e.done&&this._doneQueue.length>0;){const t=this._doneQueue.shift();t.task.status!==E.DOWNLOADED&&(t.err=t.err||d()),this._doneLoading(t.task,t.err),e.madeProgress()}}_doneLoading(e,t){if(t&&!m(t)&&e.numRetries>0)return--e.numRetries,void this._loadQueue.push(e);let s=e.result instanceof HTMLImageElement?0:e.resolvers.length;for(const r of e.resolvers)if(t)m(t)?r.reject(t):r.reject(new o("stream-data-loader:request-error",`Failed to request resource at '${e.url}'. ${t}`,{url:e.url,error:t}));else{--s;const t=s<=0?e.result:a(e.result);r.resolve(t)}this._tasks.delete(e.key),0===this._tasks.size&&this._set("updating",!1)}_startLoading(e,s){if(e.status===E.CANCELLED)return!1;let r,o;switch(e.startTime=performance.now(),e.status=E.DOWNLOADING,e.docType){case"binary":o="array-buffer",r=0;break;case"image":o="image";break;case"image+type":o="array-buffer";break;default:o="json"}e.abortController=new AbortController;const a=e.abortController.signal;e.request=t(e.url,{...e.options,responseType:o,timeout:r,signal:a});let n=()=>{};const i=t=>{e.duration=performance.now()-e.startTime,e.size=t instanceof ArrayBuffer?t.byteLength:e.size||0,e.result=t,this._frameTask?this._onLoadQueue.push({callback:s,task:e}):(e.abortController=null,s(e))},u=t=>{e.status===E.DOWNLOADING&&s(e,t),n()};return"image+type"!==e.docType?(e.request.then((e=>i(e.data)),u),!0):(e.request.then((s=>{const l=s.data,h=A(l);if(o="image",e.size=l.byteLength,"unknown"===h)return e.request=t(e.url,{responseType:o,timeout:r,signal:a}),void e.request.then((e=>i(e.data)),u);const c=new Blob([l],{type:h}),d=window.URL.createObjectURL(c);n=()=>window.URL.revokeObjectURL(d),e.request=t(d,{responseType:o,timeout:r,signal:a}),e.request.then((e=>i(new O(e.data,h,n))),u)}),u),!0)}get test(){return{loadQueue:this._loadQueue}}};e([_({readOnly:!0})],y.prototype,"updating",void 0),y=e([g("esri.views.3d.support.StreamDataLoader")],y);const b={numRetries:0};function A(e){if(e.byteLength<2)return"unknown";const t=new Uint8Array(e,0,e.byteLength);return 137===t[0]&&80===t[1]?"image/png":71===t[0]&&73===t[1]?"image/gif":66===t[0]&&77===t[1]?"image/bmp":255===t[0]&&216===t[1]?"image/jpeg":"unknown"}class O{constructor(e,t,s){this.image=e,this.type=t,this.release=s}get isOpaque(){return"image/jpeg"===this.type}}class Q extends k{constructor(e,t,s,r,o){super(r),this.url=e,this.options=t,this.docType=s,this.key=o,this.result=null,this.status=E.QUEUED,this.request=null,this.abortController=null,this.resolvers=new Array,this.startTime=0,this.numRetries=b.numRetries}}function T(e,t,s){return`${e}:${t}:${s}`}var E;!function(e){e[e.QUEUED=1]="QUEUED",e[e.DOWNLOADING=2]="DOWNLOADING",e[e.DOWNLOADED=3]="DOWNLOADED",e[e.CANCELLED=4]="CANCELLED"}(E||(E={}));export{O as ImageWithType,y as StreamDataLoader,E as TaskStatus,b as test};