@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 4.74 kB
JavaScript
import*as Common from"../common/common.js";import*as Host from"../host/host.js";import*as i18n from"../i18n/i18n.js";import{FrameManager}from"./FrameManager.js";import{IOModel}from"./IOModel.js";import{MultitargetNetworkManager,NetworkManager}from"./NetworkManager.js";import{Events as ResourceTreeModelEvents,ResourceTreeModel}from"./ResourceTreeModel.js";import{TargetManager}from"./TargetManager.js";const UIStrings={loadCanceledDueToReloadOf:"Load canceled due to reload of inspected page"},str_=i18n.i18n.registerUIStrings("core/sdk/PageResourceLoader.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);let pageResourceLoader=null;export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper{#e;#r;#s;#t;#o;constructor(e,r){super(),this.#e=0,this.#r=r,this.#s=new Map,this.#t=[],TargetManager.instance().addModelListener(ResourceTreeModel,ResourceTreeModelEvents.PrimaryPageChanged,this.onPrimaryPageChanged,this),this.#o=e}static instance({forceNew:e,loadOverride:r,maxConcurrentLoads:s}={forceNew:!1,loadOverride:null,maxConcurrentLoads:500}){return pageResourceLoader&&!e||(pageResourceLoader=new PageResourceLoader(r,s)),pageResourceLoader}static removeInstance(){pageResourceLoader=null}onPrimaryPageChanged(e){if(e.data.frame.isOutermostFrame()){for(const{reject:e}of this.#t)e(new Error(i18nString(UIStrings.loadCanceledDueToReloadOf)));this.#t=[],this.#s.clear(),this.dispatchEventToListeners(Events.Update)}}getResourcesLoaded(){return this.#s}getNumberOfResources(){return{loading:this.#e,queued:this.#t.length,resources:this.#s.size}}async acquireLoadSlot(){if(this.#e++,this.#e>this.#r){const e={resolve:()=>{},reject:()=>{}},r=new Promise(((r,s)=>{e.resolve=r,e.reject=s}));this.#t.push(e),await r}}releaseLoadSlot(){this.#e--;const e=this.#t.shift();e&&e.resolve()}static makeKey(e,r){if(r.frameId)return`${e}-${r.frameId}`;if(r.target)return`${e}-${r.target.id()}`;throw new Error("Invalid initiator")}async loadResource(e,r){const s=PageResourceLoader.makeKey(e,r),t={success:null,size:null,errorMessage:void 0,url:e,initiator:r};this.#s.set(s,t),this.dispatchEventToListeners(Events.Update);try{await this.acquireLoadSlot();const s=this.dispatchLoad(e,r),o=await s;if(t.errorMessage=o.errorDescription.message,t.success=o.success,o.success)return t.size=o.content.length,{content:o.content};throw new Error(o.errorDescription.message)}catch(e){throw void 0===t.errorMessage&&(t.errorMessage=e.message),null===t.success&&(t.success=!1),e}finally{this.releaseLoadSlot(),this.dispatchEventToListeners(Events.Update)}}async dispatchLoad(e,r){if(this.#o)return this.#o(e);const s=new Common.ParsedURL.ParsedURL(e),t=getLoadThroughTargetSetting().get()&&s&&"file"!==s.scheme&&"data"!==s.scheme&&"devtools"!==s.scheme;Host.userMetrics.developerResourceScheme(this.getDeveloperResourceScheme(s));const o=getLoadThroughTargetSetting().get()?Host.UserMetrics.DeveloperResourceLoaded.FallbackPerProtocol:Host.UserMetrics.DeveloperResourceLoaded.FallbackPerOverride;Host.userMetrics.developerResourceLoaded(o);const a=await MultitargetNetworkManager.instance().loadResource(e);return t&&!a.success&&Host.userMetrics.developerResourceLoaded(Host.UserMetrics.DeveloperResourceLoaded.FallbackFailure),a}getDeveloperResourceScheme(e){if(!e||""===e.scheme)return Host.UserMetrics.DeveloperResourceScheme.SchemeUnknown;const r="localhost"===e.host||e.host.endsWith(".localhost");switch(e.scheme){case"file":return Host.UserMetrics.DeveloperResourceScheme.SchemeFile;case"data":return Host.UserMetrics.DeveloperResourceScheme.SchemeData;case"blob":return Host.UserMetrics.DeveloperResourceScheme.SchemeBlob;case"http":return r?Host.UserMetrics.DeveloperResourceScheme.SchemeHttpLocalhost:Host.UserMetrics.DeveloperResourceScheme.SchemeHttp;case"https":return r?Host.UserMetrics.DeveloperResourceScheme.SchemeHttpsLocalhost:Host.UserMetrics.DeveloperResourceScheme.SchemeHttps}return Host.UserMetrics.DeveloperResourceScheme.SchemeOther}async loadFromTarget(e,r,s){const t=e.model(NetworkManager),o=e.model(IOModel),a=Common.Settings.Settings.instance().moduleSetting("cacheDisabled").get(),c=await t.loadNetworkResource(r,s,{disableCache:a,includeCredentials:!0});try{const e=c.stream?await o.readToString(c.stream):"";return{success:c.success,content:e,errorDescription:{statusCode:c.httpStatusCode||0,netError:c.netError,netErrorName:c.netErrorName,message:Host.ResourceLoader.netErrorToMessage(c.netError,c.httpStatusCode,c.netErrorName)||"",urlValid:void 0}}}finally{c.stream&&o.close(c.stream)}}}export function getLoadThroughTargetSetting(){return Common.Settings.Settings.instance().createSetting("loadThroughTarget",!0)}export var Events;!function(e){e.Update="Update"}(Events||(Events={}));