@netless/window-manager 0.4.30 → 0.4.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/typings.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type Emittery from "emittery";
2
- import type { AnimationMode, Displayer, DisplayerState, Player, Room, SceneDefinition, SceneState, View } from "white-web-sdk";
2
+ import type { AnimationMode, ApplianceNames, Displayer, DisplayerState, Player, Room, SceneDefinition, SceneState, View } from "white-web-sdk";
3
3
  import type { AppContext } from "./App";
4
4
  import type { ReadonlyTeleBox, TeleBoxRect } from "@netless/telebox-insider";
5
5
  import type { PageState } from "./Page";
@@ -69,6 +69,7 @@ export declare type RegisterParams<AppOptions = any, SetupResult = any, Attribut
69
69
  name?: string;
70
70
  };
71
71
  export declare type AppListenerKeys = keyof AppEmitterEvent;
72
+ export declare type ApplianceIcons = Partial<Record<ApplianceNames, string>>;
72
73
  export type { AppContext } from "./App/AppContext";
73
74
  export type { ReadonlyTeleBox, TeleBoxRect };
74
75
  export type { SceneState, SceneDefinition, View, AnimationMode, Displayer, Room, Player };
package/docs/api.md CHANGED
@@ -64,7 +64,7 @@ const manager = await WindowManager.mount(
64
64
  | disableCameraTransform | [optional] boolean | | 禁用主白板的相机移动 |
65
65
  | prefersColorScheme | [optional] string | light | auto, light, dark |
66
66
  | debug | [optional] boolean | false | 打印日志信息
67
-
67
+ | applianceIcons | [optional] {ApplianceNames, string} | | 配置光标使用的教具图片 |
68
68
 
69
69
  <h3 id="register">WindowManager.register</h3>
70
70
 
@@ -1,10 +1,11 @@
1
1
  ## AppContext
2
2
 
3
- - [api](#api)
3
+ - [api](#api)
4
4
  - [view](#view)
5
5
  - [page](#page)
6
6
  - [storage](#storage)
7
- - [events](#events)
7
+ - [events](#events)
8
+ - [Advanced](#Advanced)
8
9
 
9
10
  <h2 id="api">API</h2>
10
11
 
@@ -16,6 +17,12 @@
16
17
  const appId = context.appId;
17
18
  ```
18
19
 
20
+ - **context.isReplay**
21
+
22
+ 类型: `boolean`
23
+
24
+ 当前是否回放模式
25
+
19
26
  - **context.getDisplayer()**
20
27
 
21
28
  在默认情况下 `Displayer` 为白板的 `room` 实例
@@ -32,10 +39,10 @@
32
39
 
33
40
  - **context.getIsWritable()**
34
41
 
35
- 获取当前状态是否可写
42
+ 获取当前状态是否可写\
43
+ 可以通过监听 `writableChange` 事件获取可写状态的改变
36
44
 
37
45
  ```ts
38
- // isWritable === (room.isWritable && box.readonly)
39
46
  const isWritable = context.getIsWritable();
40
47
  ```
41
48
 
@@ -50,46 +57,31 @@
50
57
  box.$footer;
51
58
  ```
52
59
 
53
- <h3 id="view">View</h3>
54
-
55
- `view` 可以理解为一块白板,可以从 `context` 中拿到这个实例并挂载到 `Dom` 中
56
-
57
- - **context.getView()**
60
+ <h3 id="view">挂载白板</h3>
58
61
 
59
- 获取 `view` 实例
60
-
61
- ```ts
62
- const view = context.getView();
63
- ```
62
+ 当应用想要一个可以涂画的白板,可以使用以下接口
64
63
 
65
64
  - **context.mountView()**
66
65
 
67
- 挂载 view 到指定 dom
66
+ 挂载白板到指定 dom
68
67
 
69
68
  ```ts
70
69
  context.mountView(element);
71
70
  ```
72
71
 
73
- - **context.getScenes()**
74
-
75
- `scenes` 在 `addApp` 时传入 `scenePath` 会由 `WindowManager` 创建
76
-
77
- ```ts
78
- const scenes = context.getScenes();
79
- ```
80
-
81
- - **context.setScenePath()**
82
-
83
- 切换当前 `view` 到指定的 `scenePath`
84
-
85
- ```ts
86
- context.setScenePath("/page/2");
87
- ```
88
-
72
+ **注意** 在调用 `manager` 的 `addApp` 时必须填写 `scenePath` 才可以使用 `view`
73
+ ```ts
74
+ manager.addApp({
75
+ kind: "xxx",
76
+ options: { // 可选配置
77
+ scenePath: "/example-path"
78
+ }
79
+ })
80
+ ```
89
81
 
90
82
  <h3 id="page">Page</h3>
91
83
 
92
- `Page` 是封装后 `scenes` 的一些概念
84
+ 白板有多页的概念, 可以通过以下接口添加,切换,以及删除
93
85
 
94
86
  - **context.addPage()**
95
87
 
@@ -116,10 +108,19 @@
116
108
  ```ts
117
109
  context.prevPage();
118
110
  ```
111
+ - **context.removePage()**
112
+
113
+ 删除一页
114
+
115
+ ```ts
116
+ context.removePage() // 默认删除当前页
117
+ context.removePage(1) // 也可以指定 index 删除
118
+ ```
119
119
 
120
120
  - **context.pageState**
121
121
 
122
- 获取当前所在的 `index` 和一共有多少页
122
+ 获取当前所在的 `index` 和一共有多少页\
123
+ 当想要监听 `pageState` 的变化时, 可以监听 `pageStateChange` 事件获取最新的 `pageState`
123
124
 
124
125
  ```ts
125
126
  context.pageState;
@@ -141,17 +142,97 @@
141
142
  context.storage
142
143
  ```
143
144
 
144
- - **createStorage()**
145
+ - **context.createStorage(namespace)**
145
146
 
146
147
  同时你也可以创建多个 `storage` 实例
148
+
149
+ 返回: `Storage<State>`
147
150
 
148
151
  ```ts
149
- const defaultState = { count: 0 } // 可选
150
- const storage = context.createStorage("store1", defaultState);
152
+ type State = { count: number };
153
+ const defaultState = { count: 0 };
154
+ const storage = context.createStorage<State>("store1", defaultState);
151
155
  ```
152
156
 
157
+ - **storage.state**
158
+
159
+ 类型: `State`\
160
+ 默认值: `defaultState`
161
+
162
+ 在所有客户端之间同步的状态,调用 `storage.setState()` 来改变它。
163
+
164
+ - **storage.ensureState(partialState)**
165
+
166
+ 确保 `storage.state` 包含某些初始值,类似于执行了:
167
+
168
+ ```js
169
+ // 这段代码不能直接运行,因为 app.state 是只读的
170
+ storage.state = { ...partialState, ...storage.state };
171
+ ```
153
172
 
173
+ **partialState**
154
174
 
175
+ 类型: `Partial<State>`
176
+
177
+ ```js
178
+ storage.state; // { a: 1 }
179
+ storage.ensureState({ a: 0, b: 0 });
180
+ storage.state; // { a: 1, b: 0 }
181
+ ```
182
+
183
+ - **storage.setState(partialState)**
184
+
185
+ 和 React 的 `setState` 类似,更新 `storage.state` 并同步到所有客户端。
186
+
187
+ 当设置某个字段为 `undefined` 时,它会被从 `storage.state` 里删除。
188
+
189
+ > - 状态同步所需的时间和网络状态与数据大小有关,建议只在 state 里存储必须的数据。
190
+
191
+ **partialState**
192
+
193
+ 类型: `Partial<State>`
194
+
195
+ ```js
196
+ storage.state; //=> { count: 0, a: 1 }
197
+ storage.setState({ count: storage.state.count + 1, b: 2 });
198
+ storage.state; //=> { count: 1, a: 1, b: 2 }
199
+ ```
200
+
201
+ - **storage.addStateChangedListener(listener)**
202
+
203
+ 它在有人调用 `storage.setState()` 后触发 (包含当前 `storage`)
204
+
205
+ 返回: `() => void`
206
+
207
+ ```js
208
+ const disposer = storage.addStateChangedListener(diff => {
209
+ console.log("state changed", diff.oldValue, diff.newValue);
210
+ disposer(); // remove listener by calling disposer
211
+ });
212
+ ```
213
+
214
+ - **context.dispatchMagixEvent(event, payload)**
215
+
216
+ 向其他客户端广播事件消息
217
+
218
+ ```js
219
+ context.dispatchMagixEvent("click", { data: "data" });
220
+ ```
221
+
222
+ - **context.addMagixEventListener(event, listener)**
223
+
224
+ 当接收来自其他客户端的消息时(当其他客户端调用'context.dispatchMagixEvent()`时), 它会被触发
225
+
226
+ 返回: `() => void` a disposer function.
227
+
228
+ ```js
229
+ const disposer = context.addMagixEventListener("click", ({ payload }) => {
230
+ console.log(payload.data);
231
+ disposer();
232
+ });
233
+
234
+ context.dispatchMagixEvent("click", { data: "data" });
235
+ ```
155
236
 
156
237
  <h2 id="events">events</h2>
157
238
 
@@ -203,3 +284,13 @@
203
284
  // { index: 0, length: 1 }
204
285
  });
205
286
  ```
287
+
288
+ <h2 id="Advanced">Advanced</h2>
289
+
290
+ - **context.getView()**
291
+
292
+ 获取 `view` 实例
293
+
294
+ ```ts
295
+ const view = context.getView();
296
+ ```
@@ -49,7 +49,7 @@ const Counter: NetlessApp<{ count: number }> = {
49
49
  countDom.innerText = storage.state.count.toString();
50
50
  $content.appendChild(countDom);
51
51
 
52
- // state 变化回调
52
+ // 监听 state 变化回调
53
53
  storage.addStateChangedListener(diff => {
54
54
  if (diff.count) {
55
55
  // diff 会给出 newValue 和 oldValue
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netless/window-manager",
3
- "version": "0.4.30",
3
+ "version": "0.4.33",
4
4
  "description": "",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.es.js",
@@ -45,6 +45,7 @@
45
45
  "@types/uuid": "^8.3.1",
46
46
  "@typescript-eslint/eslint-plugin": "^4.30.0",
47
47
  "@typescript-eslint/parser": "^4.30.0",
48
+ "@vitest/ui": "^0.14.1",
48
49
  "cypress": "^8.7.0",
49
50
  "dotenv": "^10.0.0",
50
51
  "eslint": "^7.32.0",
@@ -59,7 +60,7 @@
59
60
  "svelte": "^3.42.4",
60
61
  "typescript": "^4.5.5",
61
62
  "vite": "^2.5.3",
62
- "vitest": "^0.12.4",
63
+ "vitest": "^0.14.1",
63
64
  "white-web-sdk": "2.16.10"
64
65
  }
65
66
  }
package/pnpm-lock.yaml CHANGED
@@ -16,6 +16,7 @@ specifiers:
16
16
  '@types/uuid': ^8.3.1
17
17
  '@typescript-eslint/eslint-plugin': ^4.30.0
18
18
  '@typescript-eslint/parser': ^4.30.0
19
+ '@vitest/ui': ^0.14.1
19
20
  cypress: ^8.7.0
20
21
  dotenv: ^10.0.0
21
22
  emittery: ^0.9.2
@@ -36,7 +37,7 @@ specifiers:
36
37
  uuid: ^7.0.3
37
38
  video.js: '>=7'
38
39
  vite: ^2.5.3
39
- vitest: ^0.12.4
40
+ vitest: ^0.14.1
40
41
  white-web-sdk: 2.16.10
41
42
 
42
43
  dependencies:
@@ -63,6 +64,7 @@ devDependencies:
63
64
  '@types/uuid': registry.npmmirror.com/@types/uuid/8.3.4
64
65
  '@typescript-eslint/eslint-plugin': registry.npmmirror.com/@typescript-eslint/eslint-plugin/4.33.0_bre6cjtjfaculj7kh43nxjxlbi
65
66
  '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser/4.33.0_hrkuebk64jiu2ut2d2sm4oylnu
67
+ '@vitest/ui': 0.14.1
66
68
  cypress: registry.npmmirror.com/cypress/8.7.0
67
69
  dotenv: registry.npmmirror.com/dotenv/10.0.0
68
70
  eslint: registry.npmmirror.com/eslint/7.32.0
@@ -77,7 +79,7 @@ devDependencies:
77
79
  svelte: registry.npmmirror.com/svelte/3.46.4
78
80
  typescript: registry.npmmirror.com/typescript/4.6.3
79
81
  vite: registry.npmmirror.com/vite/2.8.6_less@4.1.2
80
- vitest: 0.12.4_jsdom@19.0.0+less@4.1.2
82
+ vitest: 0.14.1_nmqrau6oupbkt73pq2ukep6chi
81
83
  white-web-sdk: registry.npmmirror.com/white-web-sdk/2.16.10
82
84
 
83
85
  packages:
@@ -94,6 +96,10 @@ packages:
94
96
  vanilla-lazyload: 17.6.1
95
97
  dev: true
96
98
 
99
+ /@polka/url/1.0.0-next.21:
100
+ resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
101
+ dev: true
102
+
97
103
  /@tootallnate/once/2.0.0:
98
104
  resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
99
105
  engines: {node: '>= 10'}
@@ -113,14 +119,20 @@ packages:
113
119
  resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==}
114
120
  dev: true
115
121
 
116
- /@types/yauzl/2.9.2:
117
- resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==}
122
+ /@types/yauzl/2.10.0:
123
+ resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
118
124
  requiresBuild: true
119
125
  dependencies:
120
126
  '@types/node': registry.npmmirror.com/@types/node/17.0.23
121
127
  dev: true
122
128
  optional: true
123
129
 
130
+ /@vitest/ui/0.14.1:
131
+ resolution: {integrity: sha512-rWhltzClVxTT9ktnS9DBQUe3RdRweP+XF1LspK5i3e+P66gn3rc2LChol3EYPYHJghL2Xsm91lvQO1pgE4vgHA==}
132
+ dependencies:
133
+ sirv: 2.0.2
134
+ dev: true
135
+
124
136
  /abab/2.0.5:
125
137
  resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==}
126
138
  dev: true
@@ -188,7 +200,7 @@ packages:
188
200
  dev: true
189
201
 
190
202
  /check-error/1.0.2:
191
- resolution: {integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=}
203
+ resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
192
204
  dev: true
193
205
 
194
206
  /colors/1.4.0:
@@ -236,6 +248,18 @@ packages:
236
248
  mimic-fn: 4.0.0
237
249
  dev: true
238
250
 
251
+ /debug/3.2.7:
252
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
253
+ peerDependencies:
254
+ supports-color: '*'
255
+ peerDependenciesMeta:
256
+ supports-color:
257
+ optional: true
258
+ dependencies:
259
+ ms: 2.1.3
260
+ dev: true
261
+ optional: true
262
+
239
263
  /debug/4.3.4:
240
264
  resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
241
265
  engines: {node: '>=6.0'}
@@ -547,11 +571,11 @@ packages:
547
571
  dev: true
548
572
 
549
573
  /get-func-name/2.0.0:
550
- resolution: {integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=}
574
+ resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==}
551
575
  dev: true
552
576
 
553
- /graceful-fs/4.2.9:
554
- resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==}
577
+ /graceful-fs/4.2.10:
578
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
555
579
  dev: true
556
580
  optional: true
557
581
 
@@ -598,7 +622,7 @@ packages:
598
622
  dev: true
599
623
 
600
624
  /image-size/0.5.5:
601
- resolution: {integrity: sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=}
625
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
602
626
  engines: {node: '>=0.10.0'}
603
627
  hasBin: true
604
628
  requiresBuild: true
@@ -711,10 +735,19 @@ packages:
711
735
  engines: {node: '>=12'}
712
736
  dev: true
713
737
 
738
+ /mrmime/1.0.1:
739
+ resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
740
+ engines: {node: '>=10'}
741
+ dev: true
742
+
714
743
  /ms/2.1.2:
715
744
  resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
716
745
  dev: true
717
746
 
747
+ /ms/2.1.3:
748
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
749
+ dev: true
750
+
718
751
  /nanoid/3.3.4:
719
752
  resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
720
753
  engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -727,7 +760,7 @@ packages:
727
760
  hasBin: true
728
761
  requiresBuild: true
729
762
  dependencies:
730
- debug: registry.npmmirror.com/debug/3.2.7
763
+ debug: 3.2.7
731
764
  iconv-lite: registry.npmmirror.com/iconv-lite/0.4.24
732
765
  sax: registry.npmmirror.com/sax/1.2.4
733
766
  transitivePeerDependencies:
@@ -818,6 +851,15 @@ packages:
818
851
  xmlchars: 2.2.0
819
852
  dev: true
820
853
 
854
+ /sirv/2.0.2:
855
+ resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==}
856
+ engines: {node: '>= 10'}
857
+ dependencies:
858
+ '@polka/url': 1.0.0-next.21
859
+ mrmime: 1.0.1
860
+ totalist: 3.0.0
861
+ dev: true
862
+
821
863
  /source-map-js/1.0.2:
822
864
  resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
823
865
  engines: {node: '>=0.10.0'}
@@ -847,6 +889,11 @@ packages:
847
889
  engines: {node: '>=14.0.0'}
848
890
  dev: true
849
891
 
892
+ /totalist/3.0.0:
893
+ resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==}
894
+ engines: {node: '>=6'}
895
+ dev: true
896
+
850
897
  /tough-cookie/4.0.0:
851
898
  resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==}
852
899
  engines: {node: '>=6'}
@@ -909,8 +956,8 @@ packages:
909
956
  fsevents: 2.3.2
910
957
  dev: true
911
958
 
912
- /vitest/0.12.4_jsdom@19.0.0+less@4.1.2:
913
- resolution: {integrity: sha512-EDxdhlAt6vcu6y4VouAI60z78iCAVFnfBL4VlSQVQnGmOk5altOtIKvp3xfZ+cfo4iVHgqq1QNyf5qOFiL4leg==}
959
+ /vitest/0.14.1_nmqrau6oupbkt73pq2ukep6chi:
960
+ resolution: {integrity: sha512-2UUm6jYgkwh7Y3VKSRR8OuaNCm+iA5LPDnal7jyITN39maZK9L+JVxqjtQ39PSFo5Fl3/BgaJvER6GGHX9JLxg==}
914
961
  engines: {node: '>=v14.16.0'}
915
962
  hasBin: true
916
963
  peerDependencies:
@@ -930,7 +977,9 @@ packages:
930
977
  dependencies:
931
978
  '@types/chai': 4.3.1
932
979
  '@types/chai-subset': 1.3.3
980
+ '@vitest/ui': 0.14.1
933
981
  chai: 4.3.6
982
+ debug: 4.3.4
934
983
  jsdom: 19.0.0
935
984
  local-pkg: 0.4.1
936
985
  tinypool: 0.1.3
@@ -940,6 +989,7 @@ packages:
940
989
  - less
941
990
  - sass
942
991
  - stylus
992
+ - supports-color
943
993
  dev: true
944
994
 
945
995
  /w3c-hr-time/1.0.2:
@@ -2477,20 +2527,6 @@ packages:
2477
2527
  version: 1.11.0
2478
2528
  dev: true
2479
2529
 
2480
- registry.npmmirror.com/debug/3.2.7:
2481
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz}
2482
- name: debug
2483
- version: 3.2.7
2484
- peerDependencies:
2485
- supports-color: '*'
2486
- peerDependenciesMeta:
2487
- supports-color:
2488
- optional: true
2489
- dependencies:
2490
- ms: registry.npmmirror.com/ms/2.1.3
2491
- dev: true
2492
- optional: true
2493
-
2494
2530
  registry.npmmirror.com/debug/3.2.7_supports-color@8.1.1:
2495
2531
  resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz}
2496
2532
  id: registry.npmmirror.com/debug/3.2.7
@@ -2502,7 +2538,7 @@ packages:
2502
2538
  supports-color:
2503
2539
  optional: true
2504
2540
  dependencies:
2505
- ms: registry.npmmirror.com/ms/2.1.3
2541
+ ms: 2.1.3
2506
2542
  supports-color: registry.npmmirror.com/supports-color/8.1.1
2507
2543
  dev: true
2508
2544
 
@@ -3086,7 +3122,7 @@ packages:
3086
3122
  get-stream: registry.npmmirror.com/get-stream/5.2.0
3087
3123
  yauzl: registry.npmmirror.com/yauzl/2.10.0
3088
3124
  optionalDependencies:
3089
- '@types/yauzl': 2.9.2
3125
+ '@types/yauzl': 2.10.0
3090
3126
  transitivePeerDependencies:
3091
3127
  - supports-color
3092
3128
  dev: true
@@ -3915,7 +3951,7 @@ packages:
3915
3951
  dependencies:
3916
3952
  universalify: registry.npmmirror.com/universalify/2.0.0
3917
3953
  optionalDependencies:
3918
- graceful-fs: 4.2.9
3954
+ graceful-fs: 4.2.10
3919
3955
  dev: true
3920
3956
 
3921
3957
  registry.npmmirror.com/jsprim/2.0.2:
@@ -3962,7 +3998,7 @@ packages:
3962
3998
  tslib: registry.npmmirror.com/tslib/2.3.1
3963
3999
  optionalDependencies:
3964
4000
  errno: 0.1.8
3965
- graceful-fs: 4.2.9
4001
+ graceful-fs: 4.2.10
3966
4002
  image-size: 0.5.5
3967
4003
  make-dir: 2.1.0
3968
4004
  mime: 1.6.0
@@ -4309,12 +4345,6 @@ packages:
4309
4345
  version: 2.1.2
4310
4346
  dev: true
4311
4347
 
4312
- registry.npmmirror.com/ms/2.1.3:
4313
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz}
4314
- name: ms
4315
- version: 2.1.3
4316
- dev: true
4317
-
4318
4348
  registry.npmmirror.com/mux.js/6.0.1:
4319
4349
  resolution: {integrity: sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mux.js/-/mux.js-6.0.1.tgz}
4320
4350
  name: mux.js
@@ -29,6 +29,7 @@ import type { NetlessApp } from "../typings";
29
29
  import type { ReadonlyTeleBox } from "@netless/telebox-insider";
30
30
  import type { PageRemoveService, PageState } from "../Page";
31
31
  import { calculateNextIndex } from "../Page";
32
+ import { boxEmitter } from "../BoxEmitter";
32
33
 
33
34
  export type AppEmitter = Emittery<AppEmitterEvent>;
34
35
 
@@ -342,7 +343,7 @@ export class AppProxy implements PageRemoveService {
342
343
  }
343
344
  case "focus": {
344
345
  this.boxManager?.focusBox({ appId: this.id });
345
- emitter.emit("focus", { appId: this.id });
346
+ boxEmitter.emit("focus", { appId: this.id });
346
347
  break;
347
348
  }
348
349
  default: {