UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 3.6 kB
import*as Common from"../common/common.js";import{Events as ResourceTreeModelEvents,ResourceTreeModel}from"./ResourceTreeModel.js";import{TargetManager}from"./TargetManager.js";let frameManagerInstance=null;export class FrameManager extends Common.ObjectWrapper.ObjectWrapper{#e=new WeakMap;#t=new Map;#r=new Map;#a=null;#s=new Map;#o=new Map;constructor(){super(),TargetManager.instance().observeModels(ResourceTreeModel,this)}static instance({forceNew:e}={forceNew:!1}){return frameManagerInstance&&!e||(frameManagerInstance=new FrameManager),frameManagerInstance}modelAdded(e){const t=e.addEventListener(ResourceTreeModelEvents.FrameAdded,this.frameAdded,this),r=e.addEventListener(ResourceTreeModelEvents.FrameDetached,this.frameDetached,this),a=e.addEventListener(ResourceTreeModelEvents.FrameNavigated,this.frameNavigated,this),s=e.addEventListener(ResourceTreeModelEvents.ResourceAdded,this.resourceAdded,this);this.#e.set(e,[t,r,a,s]),this.#r.set(e.target().id(),new Set)}modelRemoved(e){const t=this.#e.get(e);t&&Common.EventTarget.removeEventListeners(t);const r=this.#r.get(e.target().id());if(r)for(const e of r)this.decreaseOrRemoveFrame(e);this.#r.delete(e.target().id())}frameAdded(e){const t=e.data,r=this.#t.get(t.id);if(r)t.setCreationStackTrace(r.frame.getCreationStackTraceData()),this.#t.set(t.id,{frame:t,count:r.count+1});else{const e=this.#s.get(t.id);e?.creationStackTrace&&e?.creationStackTraceTarget&&t.setCreationStackTrace({creationStackTrace:e.creationStackTrace,creationStackTraceTarget:e.creationStackTraceTarget}),this.#t.set(t.id,{frame:t,count:1}),this.#s.delete(t.id)}this.resetOutermostFrame();const a=this.#r.get(t.resourceTreeModel().target().id());a&&a.add(t.id),this.dispatchEventToListeners(Events.FrameAddedToTarget,{frame:t}),this.resolveAwaitedFrame(t)}frameDetached(e){const{frame:t,isSwap:r}=e.data;if(this.decreaseOrRemoveFrame(t.id),r&&!this.#t.get(t.id)){const e=t.getCreationStackTraceData(),r={...e.creationStackTrace&&{creationStackTrace:e.creationStackTrace},...e.creationStackTrace&&{creationStackTraceTarget:e.creationStackTraceTarget}};this.#s.set(t.id,r)}const a=this.#r.get(t.resourceTreeModel().target().id());a&&a.delete(t.id)}frameNavigated(e){const t=e.data;this.dispatchEventToListeners(Events.FrameNavigated,{frame:t}),t.isOutermostFrame()&&this.dispatchEventToListeners(Events.OutermostFrameNavigated,{frame:t})}resourceAdded(e){this.dispatchEventToListeners(Events.ResourceAdded,{resource:e.data})}decreaseOrRemoveFrame(e){const t=this.#t.get(e);t&&(1===t.count?(this.#t.delete(e),this.resetOutermostFrame(),this.dispatchEventToListeners(Events.FrameRemoved,{frameId:e})):t.count--)}resetOutermostFrame(){const e=this.getAllFrames().filter((e=>e.isOutermostFrame()));this.#a=e.length>0?e[0]:null}getFrame(e){const t=this.#t.get(e);return t?t.frame:null}getAllFrames(){return Array.from(this.#t.values(),(e=>e.frame))}getOutermostFrame(){return this.#a}async getOrWaitForFrame(e,t){const r=this.getFrame(e);return!r||t&&t===r.resourceTreeModel().target()?new Promise((r=>{const a=this.#o.get(e);a?a.push({notInTarget:t,resolve:r}):this.#o.set(e,[{notInTarget:t,resolve:r}])})):r}resolveAwaitedFrame(e){const t=this.#o.get(e.id);if(!t)return;const r=t.filter((({notInTarget:t,resolve:r})=>!(!t||t!==e.resourceTreeModel().target())||(r(e),!1)));r.length>0?this.#o.set(e.id,r):this.#o.delete(e.id)}}export var Events;!function(e){e.FrameAddedToTarget="FrameAddedToTarget",e.FrameNavigated="FrameNavigated",e.FrameRemoved="FrameRemoved",e.ResourceAdded="ResourceAdded",e.OutermostFrameNavigated="OutermostFrameNavigated"}(Events||(Events={}));