UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 7.38 kB
import{assertNotNullOrUndefined}from"../platform/platform.js";import{SDKModel}from"./SDKModel.js";import{Capability}from"./Target.js";import{TargetManager}from"./TargetManager.js";import{Events as ResourceTreeModelEvents,ResourceTreeModel}from"./ResourceTreeModel.js";export class PreloadingModel extends SDKModel{agent;loaderIds=[];targetJustAttached=!0;lastPrimaryPageModel=null;documents=new Map;constructor(e){super(e),e.registerPreloadDispatcher(new PreloadDispatcher(this)),this.agent=e.preloadAgent(),this.agent.invoke_enable();const t=e.targetInfo();void 0!==t&&"prerender"===t.subtype&&(this.lastPrimaryPageModel=TargetManager.instance().primaryPageTarget()?.model(PreloadingModel)||null),TargetManager.instance().addModelListener(ResourceTreeModel,ResourceTreeModelEvents.PrimaryPageChanged,this.onPrimaryPageChanged,this)}dispose(){super.dispose(),TargetManager.instance().removeModelListener(ResourceTreeModel,ResourceTreeModelEvents.PrimaryPageChanged,this.onPrimaryPageChanged,this),this.agent.invoke_disable()}ensureDocumentPreloadingData(e){void 0===this.documents.get(e)&&this.documents.set(e,new DocumentPreloadingData)}currentLoaderId(){if(this.targetJustAttached)return null;if(0===this.loaderIds.length)throw new Error("unreachable");return this.loaderIds[this.loaderIds.length-1]}currentDocument(){const e=this.currentLoaderId();return null===e?null:this.documents.get(e)||null}getRuleSetById(e){return this.currentDocument()?.ruleSets.getById(e)||null}getAllRuleSets(){return this.currentDocument()?.ruleSets.getAll()||[]}getPreloadCountsByRuleSetId(){const e=new Map;for(const{value:t}of this.getPreloadingAttempts(null))for(const r of[null,...t.ruleSetIds]){void 0===e.get(r)&&e.set(r,new Map);const s=e.get(r);assertNotNullOrUndefined(s);const a=s.get(t.status)||0;s.set(t.status,a+1)}return e}getPreloadingAttemptById(e){const t=this.currentDocument();return null===t?null:t.preloadingAttempts.getById(e,t.sources)||null}getPreloadingAttempts(e){const t=this.currentDocument();return null===t?[]:t.preloadingAttempts.getAll(e,t.sources)}getPreloadingAttemptsOfPreviousPage(){if(this.loaderIds.length<=1)return[];const e=this.documents.get(this.loaderIds[this.loaderIds.length-2]);return void 0===e?[]:e.preloadingAttempts.getAll(null,e.sources)}onPrimaryPageChanged(e){const{frame:t,type:r}=e.data;if(null===this.lastPrimaryPageModel&&"Activation"===r)return;if(null!==this.lastPrimaryPageModel&&"Activation"!==r)return;if(null!==this.lastPrimaryPageModel&&"Activation"===r){this.loaderIds=this.lastPrimaryPageModel.loaderIds;for(const[e,t]of this.lastPrimaryPageModel.documents.entries())this.ensureDocumentPreloadingData(e),this.documents.get(e)?.mergePrevious(t)}this.lastPrimaryPageModel=null;const s=t.loaderId;this.loaderIds.push(s),this.loaderIds=this.loaderIds.slice(-2),this.ensureDocumentPreloadingData(s);for(const e of this.documents.keys())this.loaderIds.includes(e)||this.documents.delete(e);this.dispatchEventToListeners(Events.ModelUpdated)}onRuleSetUpdated(e){const t=e.ruleSet,r=t.loaderId;null===this.currentLoaderId()&&(this.loaderIds=[r],this.targetJustAttached=!1),this.ensureDocumentPreloadingData(r),this.documents.get(r)?.ruleSets.upsert(t),this.dispatchEventToListeners(Events.ModelUpdated)}onRuleSetRemoved(e){const t=e.id;for(const e of this.documents.values())e.ruleSets.delete(t);this.dispatchEventToListeners(Events.ModelUpdated)}onPreloadingAttemptSourcesUpdated(e){const t=e.loaderId;this.ensureDocumentPreloadingData(t);const r=this.documents.get(t);void 0!==r&&(r.sources.update(e.preloadingAttemptSources),r.preloadingAttempts.maybeRegisterNotTriggered(r.sources),this.dispatchEventToListeners(Events.ModelUpdated))}onPrefetchStatusUpdated(e){const t=e.key.loaderId;this.ensureDocumentPreloadingData(t);const r={action:"Prefetch",key:e.key,status:convertPreloadingStatus(e.status),prefetchStatus:e.prefetchStatus||null,requestId:e.requestId};this.documents.get(t)?.preloadingAttempts.upsert(r),this.dispatchEventToListeners(Events.ModelUpdated)}onPrerenderStatusUpdated(e){const t=e.key.loaderId;this.ensureDocumentPreloadingData(t);const r={action:"Prerender",key:e.key,status:convertPreloadingStatus(e.status),prerenderStatus:e.prerenderStatus||null,disallowedMojoInterface:e.disallowedMojoInterface||null};this.documents.get(t)?.preloadingAttempts.upsert(r),this.dispatchEventToListeners(Events.ModelUpdated)}onPreloadEnabledStateUpdated(e){this.dispatchEventToListeners(Events.WarningsUpdated,e)}}SDKModel.register(PreloadingModel,{capabilities:Capability.DOM,autostart:!1});export var Events;!function(e){e.ModelUpdated="ModelUpdated",e.WarningsUpdated="WarningsUpdated"}(Events||(Events={}));class PreloadDispatcher{model;constructor(e){this.model=e}ruleSetUpdated(e){this.model.onRuleSetUpdated(e)}ruleSetRemoved(e){this.model.onRuleSetRemoved(e)}preloadingAttemptSourcesUpdated(e){this.model.onPreloadingAttemptSourcesUpdated(e)}prefetchStatusUpdated(e){this.model.onPrefetchStatusUpdated(e)}prerenderAttemptCompleted(e){}prerenderStatusUpdated(e){this.model.onPrerenderStatusUpdated(e)}preloadEnabledStateUpdated(e){this.model.onPreloadEnabledStateUpdated(e)}}class DocumentPreloadingData{ruleSets=new RuleSetRegistry;preloadingAttempts=new PreloadingAttemptRegistry;sources=new SourceRegistry;mergePrevious(e){if(!this.ruleSets.isEmpty()||!this.sources.isEmpty())throw new Error("unreachable");this.ruleSets=e.ruleSets,this.preloadingAttempts.mergePrevious(e.preloadingAttempts),this.sources=e.sources}}class RuleSetRegistry{map=new Map;isEmpty(){return 0===this.map.size}getById(e){return this.map.get(e)||null}getAll(){return Array.from(this.map.entries()).map((([e,t])=>({id:e,value:t})))}upsert(e){this.map.set(e.id,e)}delete(e){this.map.delete(e)}}function convertPreloadingStatus(e){switch(e){case"Pending":return"Pending";case"Running":return"Running";case"Ready":return"Ready";case"Success":return"Success";case"Failure":return"Failure";case"NotSupported":return"NotSupported"}throw new Error("unreachable")}function makePreloadingAttemptId(e){let t,r;switch(e.action){case"Prefetch":t="Prefetch";break;case"Prerender":t="Prerender"}switch(e.targetHint){case void 0:r="undefined";break;case"Blank":r="Blank";break;case"Self":r="Self"}return`${e.loaderId}:${t}:${e.url}:${r}`}class PreloadingAttemptRegistry{map=new Map;enrich(e,t){let r=[],s=[];return null!==t&&(r=t.ruleSetIds,s=t.nodeIds),{...e,ruleSetIds:r,nodeIds:s}}getById(e,t){const r=this.map.get(e)||null;return null===r?null:this.enrich(r,t.getById(e))}getAll(e,t){return[...this.map.entries()].map((([e,r])=>({id:e,value:this.enrich(r,t.getById(e))}))).filter((({value:t})=>!e||t.ruleSetIds.includes(e)))}upsert(e){const t=makePreloadingAttemptId(e.key);this.map.set(t,e)}maybeRegisterNotTriggered(e){for(const[t,{key:r}]of e.entries()){if(void 0!==this.map.get(t))continue;let e;switch(r.action){case"Prefetch":e={action:"Prefetch",key:r,status:"NotTriggered",prefetchStatus:null,requestId:""};break;case"Prerender":e={action:"Prerender",key:r,status:"NotTriggered",prerenderStatus:null,disallowedMojoInterface:null}}this.map.set(t,e)}}mergePrevious(e){for(const[t,r]of this.map.entries())e.map.set(t,r);this.map=e.map}}class SourceRegistry{map=new Map;entries(){return this.map.entries()}isEmpty(){return 0===this.map.size}getById(e){return this.map.get(e)||null}update(e){this.map=new Map(e.map((e=>[makePreloadingAttemptId(e.key),e])))}}