@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.57 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{abortMaybe as t}from"../../../../core/maybe.js";import{throwIfNotAbortError as e,throwIfAbortError as s,isAbortError as r,eachAlways as i}from"../../../../core/promiseUtils.js";import{addQueryParameters as o}from"../../../../core/urlUtils.js";import{open as n}from"../../../../core/workers/workers.js";import{StyleUpdateType as a}from"./enums.js";import l from"./GlyphMosaic.js";import c from"./GlyphSource.js";import u from"./SpriteMosaic.js";import h from"../../tiling/TileKey.js";class p{constructor(t,e,s,r){this._layer=t,this._styleRepository=e,this.devicePixelRatio=s,this._sourceDataMaxLOD=r,this._spriteMosaic=null,this._glyphMosaic=null,this._connection=null,this._spriteSourceAbortController=null,this._startOptionsInputSignal=null,this._inputSignalEventListener=null}destroy(){this._connection?.close(),this._connection=null,this._styleRepository=null,this._layer=null,this._spriteMosaic?.destroy(),this._spriteMosaic=null,this._glyphMosaic=null,this._spriteSourceAbortController=t(this._spriteSourceAbortController),this._spriteSourcePromise=null,this._inputSignalEventListener&&this._startOptionsInputSignal?.removeEventListener("abort",this._inputSignalEventListener),this._startOptionsInputSignal=null,this._inputSignalEventListener=null}get spriteMosaic(){return this._spriteSourcePromise.then((()=>this._spriteMosaic))}get glyphMosaic(){return this._glyphMosaic}async start(t){this._requestSprite(t);const s=this._layer.currentStyleInfo.glyphsUrl,r=new c(s?o(s,{...this._layer.customParameters,token:this._layer.apiKey}):null);this._glyphMosaic=new l(1024,1024,r),this._broadcastPromise=n("WorkerTileHandler",{client:this,schedule:t.schedule,signal:t.signal}).then((s=>{if(this._layer&&(this._connection?.close(),this._connection=s,this._layer&&!this._connection.closed)){const r=s.broadcast("setStyle",{style:this._layer.currentStyleInfo.style,sourceDataMaxLOD:this._sourceDataMaxLOD},t);Promise.all(r).catch((t=>e(t)))}}))}_requestSprite(t){this._spriteSourceAbortController?.abort();const e=new AbortController;this._spriteSourceAbortController=e;const r=t?.signal;this._inputSignalEventListener&&this._startOptionsInputSignal?.removeEventListener("abort",this._inputSignalEventListener),this._startOptionsInputSignal=null,r&&(this._inputSignalEventListener=_(e),r.addEventListener("abort",this._inputSignalEventListener,{once:!0}));const{signal:i}=e,o={...t,signal:i};this._spriteSourcePromise=this._layer.loadSpriteSource(this.devicePixelRatio,o),this._spriteSourcePromise.then((t=>{s(i),this._spriteMosaic=new u(1024,1024,250),this._spriteMosaic.setSpriteSource(t)}))}async updateStyle(t){const e=[];for(const s of t)s.type===a.SPRITES_CHANGED?e.push({type:a.SPRITES_CHANGED,data:{spriteSource:null}}):e.push(s);return await this._broadcastPromise,this._broadcastPromise=Promise.all(this._connection.broadcast("updateStyle",e)),this._broadcastPromise}setSpriteSource(t){const e=new u(1024,1024,250);return e.setSpriteSource(t),this._spriteMosaic=e,this._spriteSourcePromise=Promise.resolve(t),this._spriteSourceAbortController=null,e}async setStyle(t,e,s){await this._broadcastPromise,this._styleRepository=t,this._sourceDataMaxLOD=s,this._requestSprite();const r=new c(this._layer.currentStyleInfo.glyphsUrl?o(this._layer.currentStyleInfo.glyphsUrl,{...this._layer.customParameters,token:this._layer.apiKey}):null);return this._glyphMosaic=new l(1024,1024,r),this._broadcastPromise=Promise.all(this._connection.broadcast("setStyle",{style:e,sourceDataMaxLOD:this._sourceDataMaxLOD})),this._broadcastPromise}async fetchTileData(t,e){const s=await this._getRefKeys(t,e);return this._getSourcesData(Object.keys(this._layer.sourceNameToSource),s,e)}async fetchTilePBFs(t){const e=Object.keys(this._layer.sourceNameToSource),s={},r=await this._getRefKeys(t,s),i=[],o=[];for(let n=0;n<r.length;n++)if(null==r[n].value||null==e[n])o.push(null);else{const t=r[n].value,a=this._getTilePayload(t,e[n],s);a.then((e=>{i.push({...e,key:t})})),o.push(a)}return Promise.all(o).then((()=>i))}async parseTileData(t,e){const s=t&&t.data;if(!s)return null;const{sourceName2DataAndRefKey:r,transferList:i}=s;return 0===Object.keys(r).length?null:this._broadcastPromise.then((()=>this._connection.invoke("createTileAndParse",{key:t.key.id,sourceName2DataAndRefKey:r,styleLayerUIDs:t.styleLayerUIDs},{...e,transferList:i})))}async getSprites(t){return await this._spriteSourcePromise,this._spriteMosaic.getSpriteItems(t)}getGlyphs(t){return this._glyphMosaic.getGlyphItems(t.font,t.codePoints)}async _getTilePayload(t,e,s){const i=h.pool.acquire(t.id),o=this._layer.sourceNameToSource[e],{level:n,row:a,col:l}=i;h.pool.release(i);try{return{protobuff:await o.requestTile(n,a,l,s),sourceName:e}}catch(c){if(r(c))throw c;return{protobuff:null,sourceName:e}}}async _getRefKeys(t,e){const s=this._layer.sourceNameToSource,r=new Array;for(const i in s){const o=s[i].getRefKey(t,e);r.push(o)}return i(r)}_getSourcesData(t,e,s){const r=[];for(let i=0;i<e.length;i++)if(null==e[i].value||null==t[i])r.push(null);else{const o=e[i].value,n=this._getTilePayload(o,t[i],s);r.push(n)}return i(r).then((t=>{const s={},r=[];for(let i=0;i<t.length;i++){const o=t[i].value;if(o&&(o.protobuff&&o.protobuff.byteLength>0)){const t=e[i].value.id;s[o.sourceName]={refKey:t,protobuff:o.protobuff},r.push(o.protobuff)}}return{sourceName2DataAndRefKey:s,transferList:r}}))}}function _(t){return()=>t.abort()}export{p as TileHandler};