@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 6.11 kB
JavaScript
import*as Common from"../common/common.js";import*as Platform from"../platform/platform.js";import{Type as TargetType,Target}from"./Target.js";import{SDKModel}from"./SDKModel.js";import*as Root from"../root/root.js";import*as Host from"../host/host.js";import{assertNotNullOrUndefined}from"../platform/platform.js";let targetManagerInstance;export class TargetManager extends Common.ObjectWrapper.ObjectWrapper{#e;#t;#s;#r;#o;#n;#a;#i;#d;#l;constructor(){super(),this.#e=new Set,this.#t=new Set,this.#s=new Platform.MapUtilities.Multimap,this.#r=new Platform.MapUtilities.Multimap,this.#n=!1,this.#a=null,this.#i=null,this.#o=new WeakSet,this.#d=!1,this.#l=new Set}static instance({forceNew:e}={forceNew:!1}){return targetManagerInstance&&!e||(targetManagerInstance=new TargetManager),targetManagerInstance}static removeInstance(){targetManagerInstance=void 0}onInspectedURLChange(e){e===this.#i&&(Host.InspectorFrontendHost.InspectorFrontendHostInstance.inspectedURLChanged(e.inspectedURL()||Platform.DevToolsPath.EmptyUrlString),this.dispatchEventToListeners(Events.InspectedURLChanged,e))}onNameChange(e){this.dispatchEventToListeners(Events.NameChanged,e)}async suspendAllTargets(e){if(this.#n)return;this.#n=!0,this.dispatchEventToListeners(Events.SuspendStateChanged);const t=Array.from(this.#e.values(),(t=>t.suspend(e)));await Promise.all(t)}async resumeAllTargets(){if(!this.#n)return;this.#n=!1,this.dispatchEventToListeners(Events.SuspendStateChanged);const e=Array.from(this.#e.values(),(e=>e.resume()));await Promise.all(e)}allTargetsSuspended(){return this.#n}models(e,t){const s=[];for(const r of this.#e){if(t?.scoped&&!this.isInScope(r))continue;const o=r.model(e);o&&s.push(o)}return s}inspectedURL(){const e=this.primaryPageTarget();return e?e.inspectedURL():""}observeModels(e,t,s){const r=this.models(e,s);this.#r.set(e,t),s?.scoped&&this.#o.add(t);for(const e of r)t.modelAdded(e)}unobserveModels(e,t){this.#r.delete(e,t),this.#o.delete(t)}modelAdded(e,t,s,r){for(const e of this.#r.get(t).values())this.#o.has(e)&&!r||e.modelAdded(s)}modelRemoved(e,t,s,r){for(const e of this.#r.get(t).values())this.#o.has(e)&&!r||e.modelRemoved(s)}addModelListener(e,t,s,r,o){const n=e=>{o?.scoped&&!this.isInScope(e)||s.call(r,e)};for(const s of this.models(e))s.addEventListener(t,n);this.#s.set(t,{modelClass:e,thisObject:r,listener:s,wrappedListener:n})}removeModelListener(e,t,s,r){if(!this.#s.has(t))return;let o=null;for(const n of this.#s.get(t))n.modelClass===e&&n.listener===s&&n.thisObject===r&&(o=n.wrappedListener,this.#s.delete(t,n));if(o)for(const s of this.models(e))s.removeEventListener(t,o)}observeTargets(e,t){if(this.#t.has(e))throw new Error("Observer can only be registered once");t?.scoped&&this.#o.add(e);for(const s of this.#e)t?.scoped&&!this.isInScope(s)||e.targetAdded(s);this.#t.add(e)}unobserveTargets(e){this.#t.delete(e),this.#o.delete(e)}createTarget(e,t,s,r,o,n,a,i){const d=new Target(this,e,t,s,r,o||"",this.#n,a||null,i);n&&d.pageAgent().invoke_waitForDebugger(),d.createModels(new Set(this.#r.keysArray())),this.#e.add(d);const l=this.isInScope(d);for(const e of[...this.#t])this.#o.has(e)&&!l||e.targetAdded(d);for(const[e,t]of d.models().entries())this.modelAdded(d,e,t,l);for(const e of this.#s.keysArray())for(const t of this.#s.get(e)){const s=d.model(t.modelClass);s&&s.addEventListener(e,t.wrappedListener)}return d!==d.outermostTarget()||d.type()===TargetType.Frame&&d!==this.primaryPageTarget()||this.#d||this.setScopeTarget(d),d}removeTarget(e){if(!this.#e.has(e))return;const t=this.isInScope(e);this.#e.delete(e);for(const s of e.models().keys()){const r=e.models().get(s);assertNotNullOrUndefined(r),this.modelRemoved(e,s,r,t)}for(const s of[...this.#t])this.#o.has(s)&&!t||s.targetRemoved(e);for(const t of this.#s.keysArray())for(const s of this.#s.get(t)){const r=e.model(s.modelClass);r&&r.removeEventListener(t,s.wrappedListener)}}targets(){return[...this.#e]}targetById(e){return this.targets().find((t=>t.id()===e))||null}rootTarget(){return this.#e.size?this.#e.values().next().value:null}primaryPageTarget(){let e=this.rootTarget();return e?.type()===TargetType.Tab&&(e=this.targets().find((t=>t.parentTarget()===e&&t.type()===TargetType.Frame&&!t.targetInfo()?.subtype?.length))||null),e}browserTarget(){return this.#a}async maybeAttachInitialTarget(){if(!Boolean(Root.Runtime.Runtime.queryParam("browserConnection")))return!1;this.#a||(this.#a=new Target(this,"main","browser",TargetType.Browser,null,"",!1,null,void 0),this.#a.createModels(new Set(this.#r.keysArray())));const e=await Host.InspectorFrontendHost.InspectorFrontendHostInstance.initialTargetId();return this.#a.targetAgent().invoke_autoAttachRelated({targetId:e,waitForDebuggerOnStart:!0}),!0}clearAllTargetsForTest(){this.#e.clear()}isInScope(e){if(!e)return!1;for(isSDKModelEvent(e)&&(e=e.source),e instanceof SDKModel&&(e=e.target());e&&e!==this.#i;)e=e.parentTarget();return Boolean(e)&&e===this.#i}setScopeTarget(e){if(e!==this.#i){for(const e of this.targets())if(this.isInScope(e)){for(const t of this.#r.keysArray()){const s=e.models().get(t);if(s)for(const e of[...this.#r.get(t)].filter((e=>this.#o.has(e))))e.modelRemoved(s)}for(const t of[...this.#t].filter((e=>this.#o.has(e))))t.targetRemoved(e)}this.#i=e;for(const e of this.targets())if(this.isInScope(e)){for(const t of[...this.#t].filter((e=>this.#o.has(e))))t.targetAdded(e);for(const[t,s]of e.models().entries())for(const e of[...this.#r.get(t)].filter((e=>this.#o.has(e))))e.modelAdded(s)}for(const e of this.#l)e();e&&e.inspectedURL()&&this.onInspectedURLChange(e)}}addScopeChangeListener(e){this.#l.add(e)}removeScopeChangeListener(e){this.#l.delete(e)}scopeTarget(){return this.#i}}export var Events;!function(e){e.AvailableTargetsChanged="AvailableTargetsChanged",e.InspectedURLChanged="InspectedURLChanged",e.NameChanged="NameChanged",e.SuspendStateChanged="SuspendStateChanged"}(Events||(Events={}));export class Observer{targetAdded(e){}targetRemoved(e){}}export class SDKModelObserver{modelAdded(e){}modelRemoved(e){}}function isSDKModelEvent(e){return"source"in e&&e.source instanceof SDKModel}