UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.89 kB
import{throwIfNotAbortError as e,isAbortError as t,eachAlways as s}from"../../../../core/promiseUtils.js";import{addQueryParameters as r}from"../../../../core/urlUtils.js";import{open as i}from"../../../../core/workers/workers.js";import o from"./GlyphMosaic.js";import a from"./GlyphSource.js";import l from"./SpriteMosaic.js";import c from"../../tiling/TileKey.js";class n{constructor(e,t,s){this._layer=e,this._styleRepository=t,this.devicePixelRatio=s,this._spriteMosaic=null,this._glyphMosaic=null,this._connection=null}destroy(){this._connection?.close(),this._connection=null,this._styleRepository=null,this._layer=null,this._spriteMosaic=null,this._glyphMosaic=null}get spriteMosaic(){return this._spriteSourcePromise.then((()=>this._spriteMosaic))}get glyphMosaic(){return this._glyphMosaic}async start(t){this._spriteSourcePromise=this._layer.loadSpriteSource(this.devicePixelRatio,t),this._spriteSourcePromise.then((e=>{this._spriteMosaic=new l(1024,1024,250),this._spriteMosaic.setSpriteSource(e)}));const s=this._layer.currentStyleInfo.glyphsUrl,c=new a(s?r(s,{...this._layer.customParameters,token:this._layer.apiKey}):null);this._glyphMosaic=new o(1024,1024,c),this._broadcastPromise=i("WorkerTileHandler",{client:this,schedule:t.schedule,signal:t.signal}).then((s=>{if(this._connection=s,this._layer&&!this._connection.closed){const r=s.broadcast("setStyle",this._layer.currentStyleInfo.style,t);Promise.all(r).catch((t=>e(t)))}}))}async updateStyle(e){return await this._broadcastPromise,this._broadcastPromise=Promise.all(this._connection.broadcast("updateStyle",e)),this._broadcastPromise}setSpriteSource(e){const t=new l(1024,1024,250);return t.setSpriteSource(e),this._spriteMosaic=t,this._spriteSourcePromise=Promise.resolve(e),t}async setStyle(e,t){await this._broadcastPromise,this._styleRepository=e,this._spriteSourcePromise=this._layer.loadSpriteSource(this.devicePixelRatio,null),this._spriteSourcePromise.then((e=>{this._spriteMosaic=new l(1024,1024,250),this._spriteMosaic.setSpriteSource(e)}));const s=new a(this._layer.currentStyleInfo.glyphsUrl?r(this._layer.currentStyleInfo.glyphsUrl,{...this._layer.customParameters,token:this._layer.apiKey}):null);return this._glyphMosaic=new o(1024,1024,s),this._broadcastPromise=Promise.all(this._connection.broadcast("setStyle",t)),this._broadcastPromise}fetchTileData(e,t){return this._getRefKeys(e,t).then((e=>{const s=this._layer.sourceNameToSource,r=[];for(const t in s)r.push(t);return this._getSourcesData(r,e,t)}))}parseTileData(e,t){const s=e&&e.data;if(!s)return Promise.resolve(null);const{sourceName2DataAndRefKey:r,transferList:i}=s;return 0===Object.keys(r).length?Promise.resolve(null):this._broadcastPromise.then((()=>this._connection.invoke("createTileAndParse",{key:e.key.id,sourceName2DataAndRefKey:r,styleLayerUIDs:e.styleLayerUIDs},{...t,transferList:i})))}async getSprites(e){return await this._spriteSourcePromise,this._spriteMosaic.getSpriteItems(e)}getGlyphs(e){return this._glyphMosaic.getGlyphItems(e.font,e.codePoints)}async _getTilePayload(e,s,r){const i=c.pool.acquire(e.id),o=this._layer.sourceNameToSource[s],{level:a,row:l,col:n}=i;c.pool.release(i);try{return{protobuff:await o.requestTile(a,l,n,r),sourceName:s}}catch(h){if(t(h))throw h;return{protobuff:null,sourceName:s}}}_getRefKeys(e,t){const r=this._layer.sourceNameToSource,i=new Array;for(const s in r){const o=r[s].getRefKey(e,t);i.push(o)}return s(i)}_getSourcesData(e,t,r){const i=[];for(let s=0;s<t.length;s++)if(null==t[s].value||null==e[s])i.push(null);else{const o=this._getTilePayload(t[s].value,e[s],r);i.push(o)}return s(i).then((e=>{const s={},r=[];for(let i=0;i<e.length;i++){const o=e[i].value;if(o&&(o.protobuff&&o.protobuff.byteLength>0)){const e=t[i].value.id;s[o.sourceName]={refKey:e,protobuff:o.protobuff},r.push(o.protobuff)}}return{sourceName2DataAndRefKey:s,transferList:r}}))}}export{n as TileHandler};