@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 4.63 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import t from"../../request.js";import i from"../../core/Accessor.js";import r from"../../core/Error.js";import{makeHandle as s}from"../../core/handleUtils.js";import"../../core/has.js";import{LRUCache as l}from"../../core/LRUCache.js";import o from"../../core/PooledArray.js";import{isAbortError as a,isAborted as n,onAbort as c,createAbortError as h}from"../../core/promiseUtils.js";import{watch as p,initial as f}from"../../core/reactiveUtils.js";import{waitTicks as m}from"../../core/scheduling.js";import{objectToQuery as u}from"../../core/urlUtils.js";import{property as v,subclass as y}from"../../core/accessorSupport/decorators.js";import{TileKey as d}from"./TileKey.js";import{Tilemap as _,tilemapDefinitionId as b}from"./Tilemap.js";var g;function w(e,t,i){return new r("tile-map:tile-unavailable","Tile is not available",{level:e,row:t,col:i})}let T=class extends i{static{g=this}constructor(e){super(e),this._pendingTilemapRequests={},this.request=t,this.size=32,this._prefetchingEnabled=!0}initialize(){this._tilemapCache=new l(2097152),this.addHandles(p(()=>{const{layer:e}=this;return[e?.parsedUrl,e?.tileServers,e?.apiKey,e?.customParameters]},()=>this._initializeTilemapDefinition(),f))}get effectiveMinLOD(){return this.minLOD??this.layer.tileInfo.lods[0].level}get effectiveMaxLOD(){return this.maxLOD??this.layer.tileInfo.lods[this.layer.tileInfo.lods.length-1].level}getAvailability(e,t,i){if(!this.layer.tileInfo.lodAt(e)||e<this.effectiveMinLOD||e>this.effectiveMaxLOD)return"unavailable";const r=this._tilemapFromCache(e,t,i,this._tmpTilemapDefinition);return r?r.getAvailability(t,i):"unknown"}fetchAvailability(e,t,i,r){return!this.layer.tileInfo.lodAt(e)||e<this.effectiveMinLOD||e>this.effectiveMaxLOD?Promise.reject(w(e,t,i)):this._fetchTilemap(e,t,i,r).catch(e=>e).then(r=>{if(r instanceof _){const s=r.getAvailability(t,i);if("unavailable"===s)throw w(e,t,i);return s}if(a(r))throw r;return"unknown"})}fetchAvailabilityUpsample(e,t,i,r,s){r.level=e,r.row=t,r.col=i;const l=this.layer.tileInfo;l.updateTileInfo(r);const o=this.fetchAvailability(e,t,i,s).catch(e=>{if(a(e))throw e;if(l.upsampleTile(r))return this.fetchAvailabilityUpsample(r.level,r.row,r.col,r,s);throw e});return this._fetchAvailabilityUpsamplePrefetch(e,t,i,s,o),o}async _fetchAvailabilityUpsamplePrefetch(e,t,i,r,l){if(!this._prefetchingEnabled)return;const o=`prefetch-${e}-${t}-${i}`;if(this.hasHandles(o))return;const a=new AbortController;l.then(()=>a.abort(),()=>a.abort());let c=!1;const h=s(()=>{c||(c=!0,a.abort())});if(this.addHandles(h,o),await m(10,a.signal).catch(()=>{}),c||(c=!0,this.removeHandles(o)),n(a))return;const p=new d(e,t,i),f={...r,signal:a.signal},u=this.layer.tileInfo;for(let s=0;g._prefetches.length<g._maxPrefetch&&u.upsampleTile(p);++s){const e=this.fetchAvailability(p.level,p.row,p.col,f);g._prefetches.push(e);const t=()=>{g._prefetches.removeUnordered(e)};e.then(t,t)}}static{this._maxPrefetch=4}static{this._prefetches=new o({initialSize:g._maxPrefetch})}static cleanupTilemapCache(){this._prefetches.prune()}_fetchTilemap(e,t,i,s){if(!this.layer.tileInfo.lodAt(e)||e<this.effectiveMinLOD||e>this.effectiveMaxLOD)return Promise.reject(new r("tilemap-cache:level-unavailable",`Level ${e} is unavailable in the service`));const l=this._tmpTilemapDefinition,o=this._tilemapFromCache(e,t,i,l);if(o)return Promise.resolve(o);const a=s?.signal;return s={...s,signal:null},new Promise((e,t)=>{c(a,()=>t(h()));const i=b(l);let r=this._pendingTilemapRequests[i];if(!r){r=_.fromDefinition(l,s).then(e=>(this._tilemapCache.put(i,e,e.byteSize),e));const e=()=>{delete this._pendingTilemapRequests[i]};this._pendingTilemapRequests[i]=r,r.then(e,e)}r.then(e,t)})}_initializeTilemapDefinition(){if(!this.layer.parsedUrl)return;const{parsedUrl:e,apiKey:t,customParameters:i}=this.layer;this._tilemapCache.clear(),this._tmpTilemapDefinition={service:{url:e.path,query:u({...e.query,...i,token:t??e.query?.token}),tileServers:this.layer.tileServers,request:this.request},width:this.size,height:this.size,level:0,row:0,col:0}}_tilemapFromCache(e,t,i,r){r.level=e,r.row=t-t%this.size,r.col=i-i%this.size;const s=b(r);return this._tilemapCache.get(s)}get test(){}};e([v({constructOnly:!0})],T.prototype,"layer",void 0),e([v({constructOnly:!0})],T.prototype,"minLOD",void 0),e([v({constructOnly:!0})],T.prototype,"maxLOD",void 0),e([v({constructOnly:!0})],T.prototype,"request",void 0),e([v({constructOnly:!0})],T.prototype,"size",void 0),T=g=e([y("esri.layers.support.TilemapCache")],T);export{T as TilemapCache};