@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.61 kB
JavaScript
class e{constructor(e){this._handlers={},this._requests={},this._cache={},this._app=e}addHandler(e,s){this._handlers[e]=s,s._loader=this}removeHandler(e){delete this._handlers[e]}getHandler(e){return this._handlers[e]}static makeKey(e,s){return`${e}-${s}`}load(s,t,l,r,n){const i=this._handlers[t];if(!i){return void l(`No resource handler for asset type: '${t}' when loading [${s}]`)}if(!s)return void this._loadNull(i,l,r);const a=e.makeKey(s,t);if(void 0!==this._cache[a])l(null,this._cache[a]);else if(this._requests[a])this._requests[a].push(l);else{this._requests[a]=[l];const e=this,t=function(s,t){if(s)e._onFailure(a,s);else{if(t.load instanceof DataView){if(i.openBinary){if(!e._requests[a])return;try{const s=i.openBinary(t.load);e._onSuccess(a,s)}catch(s){e._onFailure(a,s)}return}t.load=URL.createObjectURL(new Blob([t.load])),r&&(r.urlObject&&URL.revokeObjectURL(r.urlObject),r.urlObject=t.load)}i.load(t,((s,l,n)=>{if(e._requests[a])if(s)e._onFailure(a,s);else try{e._onSuccess(a,i.open(t.original,l,r),n)}catch(s){e._onFailure(a,s)}}),r)}},h=s.split("?")[0];if(!this._app.enableBundles||!this._app.bundles.hasUrl(h)||n&&n.bundlesIgnore)t(null,{load:s,original:r&&r.file.filename||s});else{if(!this._app.bundles.urlIsLoadedOrLoading(h)){var o;const e=this._app.bundles.listBundlesForAsset(r);let s;n&&n.bundlesFilter&&(s=n.bundlesFilter(e)),s||(null==e||e.sort(((e,s)=>e.file.size-s.file.size)),s=null==e?void 0:e[0]),s&&(null==(o=this._app.assets)||o.load(s))}this._app.bundles.loadUrl(h,((e,s)=>{t(e,{load:s,original:h})}))}}}_loadNull(e,s,t){e.load(null,(function(l,r,n){if(l)s(l);else try{s(null,e.open(null,r,t),n)}catch(e){s(e)}}),t)}_onSuccess(e,s,t){null!==s?this._cache[e]=s:delete this._cache[e];for(let l=0;l<this._requests[e].length;l++)this._requests[e][l](null,s,t);delete this._requests[e]}_onFailure(e,s){if(console.error(s),this._requests[e]){for(let t=0;t<this._requests[e].length;t++)this._requests[e][t](s);delete this._requests[e]}}open(e,s){const t=this._handlers[e];return t?t.open(null,s):(console.warn(`No resource handler found for: ${e}`),s)}patch(e,s){const t=this._handlers[e.type];t?t.patch&&t.patch(e,s):console.warn(`No resource handler found for: ${e.type}`)}clearCache(s,t){const l=e.makeKey(s,t);delete this._cache[l]}getFromCache(s,t){const l=e.makeKey(s,t);if(this._cache[l])return this._cache[l]}enableRetry(e=5){e=Math.max(0,e)||0;for(const s in this._handlers)this._handlers[s].maxRetries=e}disableRetry(){for(const e in this._handlers)this._handlers[e].maxRetries=0}destroy(){this._handlers={},this._requests={},this._cache={}}}export{e as ResourceLoader};