fcr-ui-scene 3.8.1-alpha → 3.8.1

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.
Files changed (226) hide show
  1. package/lib/base.js +2 -2
  2. package/lib/creator/provider-initializer.browser.js +8 -7
  3. package/lib/creator/provider-initializer.electron.js +8 -8
  4. package/lib/electron/asar-validation.d.ts +12 -0
  5. package/lib/electron/asar-validation.js +115 -0
  6. package/lib/electron/bootstrap-sdk.js +20 -12
  7. package/lib/electron/default-options.js +2 -1
  8. package/lib/electron/env.d.ts +1 -0
  9. package/lib/electron/env.js +6 -4
  10. package/lib/electron/exit-codes.js +11 -11
  11. package/lib/electron/hang-detection/manager.js +4 -4
  12. package/lib/electron/ipc-protocol.js +12 -12
  13. package/lib/electron/process-manager/event-manager.js +30 -30
  14. package/lib/electron/process-manager/index.js +88 -88
  15. package/lib/electron/process-manager/state-manager.js +57 -57
  16. package/lib/electron/process-manager/types.js +16 -16
  17. package/lib/electron/sdk-helper.js +3 -3
  18. package/lib/electron/window-proxy/browser-window-proxy.js +13 -13
  19. package/lib/electron/window-proxy/main-process-handler.js +14 -14
  20. package/lib/fragments/annotation/style.css +9 -9
  21. package/lib/fragments/annotation/toolbar/components/item/style.css +45 -45
  22. package/lib/fragments/annotation/toolbar/components/panel/style.css +24 -24
  23. package/lib/fragments/annotation/toolbar/components/tips/style.css +19 -19
  24. package/lib/fragments/annotation/toolbar/style.css +55 -55
  25. package/lib/fragments/whiteboard/cursor.css +77 -77
  26. package/lib/fragments/whiteboard/style.css +4 -4
  27. package/lib/global.css +62 -62
  28. package/lib/global.d.ts +27 -27
  29. package/lib/index.js +9 -1
  30. package/lib/modules/action-bar/components/chat/index.css +88 -88
  31. package/lib/modules/action-bar/components/more/index.css +114 -114
  32. package/lib/modules/action-bar/components/notification-bar/components/interpreter/index.css +58 -58
  33. package/lib/modules/action-bar/components/notification-bar/components/virtual-image/index.css +56 -56
  34. package/lib/modules/action-bar/components/notification-bar/index.css +74 -74
  35. package/lib/modules/action-bar/components/participants/index.css +21 -21
  36. package/lib/modules/action-bar/components/record/index.css +39 -39
  37. package/lib/modules/action-bar/components/trigger-output-language/index.css +86 -86
  38. package/lib/modules/action-bar/components/trigger-subscribe-language/guide-tooltip/index.css +22 -22
  39. package/lib/modules/action-bar/index.css +358 -358
  40. package/lib/modules/action-bar/main-scene/store.base.d.ts +3 -2
  41. package/lib/modules/action-bar/main-scene/store.base.js +29 -57
  42. package/lib/modules/action-bar/main-scene/view.js +3 -3
  43. package/lib/modules/audio-stream/index.js +3 -3
  44. package/lib/modules/caption/draggable-container/index.css +10 -10
  45. package/lib/modules/caption/view.css +158 -158
  46. package/lib/modules/chat/components/chat-bar/index.css +89 -89
  47. package/lib/modules/chat/components/chat-select/index.css +185 -185
  48. package/lib/modules/chat/index.css +124 -124
  49. package/lib/modules/components/apps/app-item/index.css +49 -49
  50. package/lib/modules/components/apps/index.css +9 -9
  51. package/lib/modules/components/caption-menu/index.css +58 -58
  52. package/lib/modules/components/caption-menu/steps/index.css +73 -73
  53. package/lib/modules/components/control-bar/components/loading/index.css +76 -76
  54. package/lib/modules/components/control-bar/components/progress/style.css +51 -51
  55. package/lib/modules/components/control-bar/components/switch-theme/index.css +101 -101
  56. package/lib/modules/components/control-bar/index.css +99 -99
  57. package/lib/modules/components/device-control/index.css +177 -177
  58. package/lib/modules/components/leave-meeting/components/index.css +151 -151
  59. package/lib/modules/components/leave-meeting/style.css +9 -9
  60. package/lib/modules/components/member-window/components/member-actions/store.js +22 -22
  61. package/lib/modules/components/member-window/index.css +502 -502
  62. package/lib/modules/components/security-menu/index.css +42 -42
  63. package/lib/modules/components/tab-frame/index.css +40 -40
  64. package/lib/modules/components/toolbar/components/item/style.css +94 -94
  65. package/lib/modules/components/toolbar/components/panel/style.css +86 -86
  66. package/lib/modules/components/toolbar/style.css +85 -85
  67. package/lib/modules/connection-gateway/components/computer/index.css +12 -12
  68. package/lib/modules/connection-gateway/components/phone/components/callinfo/index.css +36 -36
  69. package/lib/modules/connection-gateway/components/phone/components/calling/index.css +72 -72
  70. package/lib/modules/connection-gateway/components/phone/components/remeber/index.css +10 -10
  71. package/lib/modules/connection-gateway/components/phone/components/useing/index.css +46 -46
  72. package/lib/modules/connection-gateway/components/phone/index.css +49 -49
  73. package/lib/modules/connection-gateway/index.css +6 -6
  74. package/lib/modules/control-bar/components/meeting-details/index.css +133 -133
  75. package/lib/modules/control-bar/components/more-actions/index.css +103 -103
  76. package/lib/modules/control-bar/components/share-audio/index.css +90 -90
  77. package/lib/modules/control-bar/components/share-state-nav/index.css +79 -79
  78. package/lib/modules/control-bar/index.css +340 -340
  79. package/lib/modules/control-bar/index.js +4 -4
  80. package/lib/modules/device-pretest/index.css +123 -123
  81. package/lib/modules/dialog/components/confirm/index.css +24 -24
  82. package/lib/modules/dialog/components/dialog-container/index.css +112 -112
  83. package/lib/modules/dialog/dialogs/confirm/index.css +24 -24
  84. package/lib/modules/dialog/dialogs/connection-gateway/tabs.d.ts +1 -0
  85. package/lib/modules/dialog/dialogs/connection-gateway/tabs.js +27 -14
  86. package/lib/modules/dialog/dialogs/device-setting/index.css +26 -26
  87. package/lib/modules/dialog/dialogs/interpreter/index.css +30 -30
  88. package/lib/modules/dialog/dialogs/mute-all/index.css +20 -20
  89. package/lib/modules/dialog/dialogs/system-preference/index.css +52 -52
  90. package/lib/modules/dialog/dialogs/widget/index.js +4 -4
  91. package/lib/modules/dialog/index.css +56 -56
  92. package/lib/modules/event-toast/index.css +25 -25
  93. package/lib/modules/interpreter/action/add-btn/index.css +4 -4
  94. package/lib/modules/interpreter/action/delete-btn/index.css +14 -14
  95. package/lib/modules/interpreter/action/switch-btn/index.css +3 -3
  96. package/lib/modules/interpreter/dialog-content/index.css +33 -33
  97. package/lib/modules/interpreter/footer/index.css +11 -11
  98. package/lib/modules/interpreter/index.css +4 -4
  99. package/lib/modules/interpreter/interpreter-list/index.css +8 -8
  100. package/lib/modules/interpreter/interpreter-list/interpreter-item/components/pick-language/index.css +46 -46
  101. package/lib/modules/interpreter/interpreter-list/interpreter-item/components/pick-user/index.css +46 -46
  102. package/lib/modules/interpreter/interpreter-list/interpreter-item/index.css +32 -32
  103. package/lib/modules/interpreter/loading-wrapper/index.css +53 -53
  104. package/lib/modules/invite/components/pstn-invite.js +1 -1
  105. package/lib/modules/invite/components/voip-invite.css +26 -26
  106. package/lib/modules/invite/index.css +331 -331
  107. package/lib/modules/layout/components/CommonVideoRenderer.js +4 -4
  108. package/lib/modules/layout/components/index.css +653 -653
  109. package/lib/modules/layout/index.css +59 -59
  110. package/lib/modules/layout/store.base.js +5 -5
  111. package/lib/modules/layout/type.js +5 -5
  112. package/lib/modules/notification/index.css +77 -77
  113. package/lib/modules/notification/interpreter-status/index.css +76 -76
  114. package/lib/modules/participant/components/confirm-input/index.css +4 -4
  115. package/lib/modules/participant/components/participants/components/footer/components/drop-menu/index.css +83 -83
  116. package/lib/modules/participant/components/participants/components/render-user/components/attendee/index.css +87 -87
  117. package/lib/modules/participant/index.css +102 -102
  118. package/lib/modules/participant/store.base.js +175 -175
  119. package/lib/modules/pc-audio-connect/index.css +12 -12
  120. package/lib/modules/pc-audio-connect/main-scene/index.d.ts +2 -1
  121. package/lib/modules/pc-audio-connect/main-scene/index.js +5 -4
  122. package/lib/modules/pc-audio-connect/main-scene/store.d.ts +3 -0
  123. package/lib/modules/pc-audio-connect/main-scene/store.js +44 -7
  124. package/lib/modules/phone-audio-connect/components/callinfo/index.css +36 -36
  125. package/lib/modules/phone-audio-connect/components/calling/index.css +72 -72
  126. package/lib/modules/phone-audio-connect/components/remeber/index.css +10 -10
  127. package/lib/modules/phone-audio-connect/components/useing/index.css +46 -46
  128. package/lib/modules/phone-audio-connect/index.css +56 -56
  129. package/lib/modules/secondary-window/store.js +7 -7
  130. package/lib/modules/setting/audio-settings/index.css +195 -195
  131. package/lib/modules/setting/audio-whiteList/audio-device-adaptation.js +14 -14
  132. package/lib/modules/setting/audio-whiteList/audio-whiteList-manager.js +6 -6
  133. package/lib/modules/setting/caption_and_transcribing/index.css +88 -88
  134. package/lib/modules/setting/general-settings/index.css +41 -41
  135. package/lib/modules/setting/index.css +112 -112
  136. package/lib/modules/setting/minutes-settings/index.css +65 -65
  137. package/lib/modules/setting/state/index.css +207 -207
  138. package/lib/modules/setting/storage-settings/index.css +91 -91
  139. package/lib/modules/setting/translate-settings/index.css +47 -47
  140. package/lib/modules/setting/video-settings/index.css +357 -357
  141. package/lib/modules/share-screen/components/control-bar/index.css +75 -75
  142. package/lib/modules/share-screen/components/selection/index.css +73 -73
  143. package/lib/modules/share-screen/components/share-state-bar/index.css +76 -76
  144. package/lib/modules/share-screen/index.js +10 -10
  145. package/lib/modules/share-screen/store.base.js +2 -2
  146. package/lib/modules/state-bar/assets/fcr_grid_big.svg +3 -3
  147. package/lib/modules/state-bar/assets/fcr_listontop_big.svg +3 -3
  148. package/lib/modules/state-bar/index.css +706 -706
  149. package/lib/modules/state-bar/main-scene/store.base.js +2 -2
  150. package/lib/modules/state-bar/meeting-detail.css +137 -137
  151. package/lib/modules/state-bar/meeting-network-state.css +150 -150
  152. package/lib/modules/state-bar/waiting-scene/store.base.js +2 -2
  153. package/lib/modules/subtitles-history/components/settings/index.css +5 -5
  154. package/lib/modules/subtitles-history/index.css +129 -129
  155. package/lib/modules/video-window/components/members/index.css +51 -51
  156. package/lib/modules/video-window/components/speaking/index.css +86 -86
  157. package/lib/modules/video-window/components/topControl/index.css +35 -35
  158. package/lib/modules/video-window/index.css +21 -21
  159. package/lib/modules/video-window/popover-watcher.js +3 -3
  160. package/lib/modules/video-window/store.js +10 -10
  161. package/lib/modules/waiting-room-layout/index.css +96 -96
  162. package/lib/modules/whiteboard/components/control-bar/index.css +52 -52
  163. package/lib/modules/whiteboard/components/loading/index.css +76 -76
  164. package/lib/modules/whiteboard/components/multi-window/index.css +63 -63
  165. package/lib/modules/whiteboard/components/pagination/index.css +228 -228
  166. package/lib/modules/whiteboard/components/progress/style.css +51 -51
  167. package/lib/modules/whiteboard/components/switch-theme/index.css +99 -99
  168. package/lib/modules/whiteboard/components/toolbar/style.css +591 -591
  169. package/lib/modules/whiteboard/style.css +140 -140
  170. package/lib/modules/widget/index.css +9 -9
  171. package/lib/modules/widget/index.d.ts +1 -0
  172. package/lib/modules/widget/index.js +16 -1
  173. package/lib/modules/widget/store.base.d.ts +1 -0
  174. package/lib/modules/widget/store.base.js +12 -0
  175. package/lib/modules/widget/store.electron.js +5 -0
  176. package/lib/modules/widget/web-widget.d.ts +6 -1
  177. package/lib/modules/widget/web-widget.js +66 -22
  178. package/lib/object-manager.js +8 -8
  179. package/lib/plugins/module-dev-plugin.js +11 -11
  180. package/lib/providers/ability-provider.js +17 -17
  181. package/lib/providers/app-list-provider.d.ts +1 -1
  182. package/lib/providers/app-list-provider.js +9 -7
  183. package/lib/providers/board-share/bar-control/base.d.ts +1 -1
  184. package/lib/providers/board-share/bar-control/browser.d.ts +1 -1
  185. package/lib/providers/board-share/bar-control/electron.d.ts +1 -1
  186. package/lib/providers/board-share/struct.js +6 -6
  187. package/lib/providers/device-stream-provider.d.ts +1 -1
  188. package/lib/providers/dialog/provider.base.js +2 -2
  189. package/lib/providers/dialog/type.js +3 -3
  190. package/lib/providers/multi-display-provider.js +4 -4
  191. package/lib/providers/privilege-provider.js +7 -7
  192. package/lib/providers/screen-share/provider.base.js +23 -23
  193. package/lib/providers/screen-share/stream-state-sync.js +18 -18
  194. package/lib/providers/screen-share/struct.js +24 -24
  195. package/lib/providers/widget-provider.d.ts +13 -2
  196. package/lib/providers/widget-provider.js +60 -9
  197. package/lib/providers/window/main-window.js +2 -2
  198. package/lib/providers/window/provider.js +5 -5
  199. package/lib/providers/window/renderer-window.js +2 -2
  200. package/lib/scenes/main-scene.js +1 -0
  201. package/lib/schema.js +26 -26
  202. package/lib/shared-data/app-list-data.d.ts +0 -3
  203. package/lib/shared-data/app-list-data.js +3 -30
  204. package/lib/shared-data/meeting-time.js +8 -8
  205. package/lib/shared-data/setting.js +3 -3
  206. package/lib/shared-data/video-window.d.ts +1 -1
  207. package/lib/shared-data/video-window.js +1 -1
  208. package/lib/shared-data/widget-data.d.ts +0 -1
  209. package/lib/type.d.ts +1 -0
  210. package/lib/type.js +23 -21
  211. package/lib/ui-scene-switch.js +2 -2
  212. package/lib/utilities/constant.js +6 -6
  213. package/lib/utilities/renderer.js +8 -8
  214. package/lib/utilities/shared-storage.js +2 -2
  215. package/lib/utilities/tools.js +14 -14
  216. package/package.json +82 -77
  217. package/public/assets/fcr_chat_reddot.svg +5 -5
  218. package/public/assets/fcr_grid_big.svg +3 -3
  219. package/public/assets/fcr_leave2.svg +58 -58
  220. package/public/assets/fcr_listontop_big.svg +3 -3
  221. package/public/assets/step-gradient.svg +10 -10
  222. package/public/fragment.html +10 -10
  223. package/public/index.html +107 -183
  224. package/public/index.vite.html +109 -0
  225. package/public/js/init.js +75 -0
  226. package/public/{meeting-manager.js → js/meeting-manager.js} +405 -405
@@ -1,405 +1,405 @@
1
- /**
2
- * 会议管理器 - 负责处理会议的生命周期管理
3
- * 包括创建者初始化、会议启动、错误处理等功能
4
- */
5
- class MeetingManager {
6
- constructor() {
7
- this.creator = null;
8
- this.uiScene = null;
9
-
10
- this.sendExitedEventFlag = true;
11
- this.lastInitParams = '';
12
-
13
- this.bindGlobalMethods();
14
- }
15
-
16
- /**
17
- * 重新加载创建者
18
- * @param {string} stringInitParams - 初始化参数字符串
19
- */
20
- reloadCreator(stringInitParams) {
21
- try {
22
- const config = JSON.parse(stringInitParams);
23
- this.creator = new FcrUIScene.FcrUISceneCreator(config);
24
- this.logInfo('Creator reloaded successfully');
25
- } catch (error) {
26
- this.logError('Failed to parse init options:', error);
27
- }
28
- }
29
-
30
-
31
- releaseCreator() {
32
- if (this.creator) {
33
- this.logInfo('Creator exists, releasing previous creator');
34
- this.releasePreviousScene();
35
- this.creator.release();
36
- this.creator = undefined;
37
- }
38
- }
39
-
40
- /**
41
- * 创建或初始化创建者
42
- * @param {Object} config - 配置对象
43
- */
44
- createOrInitCreator(config) {
45
- try {
46
- // 如果存在旧的创建者,先释放
47
- this.releaseCreator();
48
- } catch (error) {
49
- this.logError('Failed to release creator:', error);
50
- }
51
-
52
- // 创建新的创建者
53
- this.lastInitParams = JSON.stringify(config);
54
- this.logInfo(`Creating new creator with config: ${this.lastInitParams}`);
55
- this.creator = new FcrUIScene.FcrUISceneCreator(config);
56
- }
57
-
58
- /**
59
- * 释放之前的场景
60
- */
61
- releasePreviousScene() {
62
- if (this.uiScene) {
63
- this.sendExitedEventFlag = false;
64
- this.uiScene.exit();
65
- this.uiScene = null;
66
- this.logInfo('Previous UI scene released');
67
- }
68
- }
69
-
70
- /**
71
- * 启动会议
72
- * @param {Object} launchOptions - 启动选项
73
- */
74
- launchMeeting(launchOptions) {
75
- const { data, lastInitParams: initParamsFromMainProcess } = launchOptions;
76
-
77
- this.logInfo(`Launching meeting with params: ${initParamsFromMainProcess}`);
78
-
79
- // 检查是否需要重新加载创建者
80
- if (initParamsFromMainProcess !== this.lastInitParams) {
81
- this.logInfo('Init params changed, reloading creator');
82
- this.lastInitParams = initParamsFromMainProcess;
83
- this.releaseCreator();
84
- this.reloadCreator(initParamsFromMainProcess);
85
- }
86
-
87
- // 清理之前的场景
88
- this.cleanupPreviousScene();
89
-
90
- // 设置UI状态
91
- this.setFullScreenFailureComp(false);
92
- this.setLoading(true);
93
-
94
- // 绑定错误处理事件
95
- this.bindErrorHandlers();
96
-
97
- // 注册小部件
98
- this.registerWidgets(data);
99
-
100
- // 启动场景
101
- this.startUIScene(data);
102
-
103
- // 添加观察者
104
- this.addSceneObservers();
105
- }
106
-
107
- /**
108
- * 清理之前的场景
109
- */
110
- cleanupPreviousScene() {
111
- try {
112
- if (this.uiScene) {
113
- this.logInfo('Cleaning up previous UI scene');
114
- this.sendExitedEventFlag = false;
115
- this.uiScene.exit();
116
- }
117
- } catch (error) {
118
- this.logError('Error during scene cleanup:', error);
119
- }
120
- }
121
-
122
- /**
123
- * 绑定错误处理事件
124
- */
125
- bindErrorHandlers() {
126
- const confirmBtn = document.querySelector('#fcr-launch-failure-confirm-btn');
127
- if (confirmBtn) {
128
- confirmBtn.removeEventListener('click', this.handleConfirmClick);
129
- confirmBtn.addEventListener('click', this.handleConfirmClick.bind(this));
130
- }
131
- }
132
-
133
- /**
134
- * 注册小部件
135
- * @param {Object} data - 数据对象
136
- */
137
- registerWidgets(data) {
138
- const { widgets, ...others } = data;
139
- if (widgets && Array.isArray(widgets)) {
140
- widgets.forEach(widget => {
141
- this.creator.registerWidget(widget);
142
- });
143
- }
144
- }
145
-
146
- /**
147
- * 启动UI场景
148
- * @param {Object} data - 数据对象
149
- */
150
- startUIScene(data) {
151
- const { widgets, ...others } = data;
152
-
153
- this.uiScene = this.creator.launch(
154
- others,
155
- async () => {
156
- this.logInfo('UI scene closed callback');
157
- const currentBrowserWindow = window.runtime.getCurrentBrowserWindow();
158
- if(currentBrowserWindow.isFullScreen()) {
159
- currentBrowserWindow.setFullScreen(false);
160
- await new Promise(resolve => setTimeout(resolve, 500));
161
- }
162
-
163
- if (currentBrowserWindow) {
164
- currentBrowserWindow.hide();
165
- }
166
- },
167
- () => { }, // 空回调
168
- () => { }, // 空回调
169
- document.getElementById('root')
170
- );
171
- }
172
-
173
- /**
174
- * 添加场景观察者
175
- */
176
- addSceneObservers() {
177
- this.uiScene.addObserver({
178
- onLaunchSuccess: () => this.handleLaunchSuccess(),
179
- onLaunchFailure: (roomId, error) => this.handleLaunchFailure(roomId, error),
180
- onExited: (roomId, reason) => this.handleSceneExited(roomId, reason),
181
- onWidgetClicked: (widgetId) => this.handleWidgetClicked(widgetId),
182
- onUserTokenWillExpire: () => this.handleUserTokenWillExpire()
183
- });
184
- }
185
-
186
- /**
187
- * 处理启动成功
188
- */
189
- handleLaunchSuccess() {
190
- this.setLoading(false);
191
- this.sendExitedEventFlag = true;
192
-
193
- try {
194
- const roomProvider = this.uiScene._objectManager.getObject('roomProvider');
195
- if (!roomProvider) {
196
- throw new Error('roomProvider not found in uiScene');
197
- }
198
-
199
- const currentRoomControl = roomProvider.currentRoomControl;
200
- if (!currentRoomControl) {
201
- throw new Error('currentRoomControl not found in uiScene');
202
- }
203
-
204
- const roomInfo = currentRoomControl.getRoomInfo();
205
- if (!roomInfo) {
206
- throw new Error('roomInfo not found in uiScene');
207
- }
208
-
209
- const { roomName, roomId } = roomInfo;
210
- document.querySelector('title').innerText = roomName;
211
- window.cppSdkHelper.launchSuccess(roomId);
212
- } catch (error) {
213
- this.logError('Error in launch success handler:', error);
214
- }
215
- }
216
-
217
- /**
218
- * 处理启动失败
219
- * @param {string} roomId - 房间ID
220
- * @param {Object} error - 错误对象
221
- */
222
- handleLaunchFailure(roomId, error) {
223
- const errorCode = Number(error.code);
224
- let errorMessage = this.getErrorMessage(errorCode, error.message);
225
-
226
- this.setFullScreenFailureComp(true, errorMessage);
227
- window.cppSdkHelper.launchFailure(roomId, errorCode);
228
- }
229
-
230
- /**
231
- * 获取错误消息
232
- * @param {number} errorCode - 错误代码
233
- * @param {string} defaultMessage - 默认错误消息
234
- * @returns {string} 错误消息
235
- */
236
- getErrorMessage(errorCode, defaultMessage) {
237
- const errorCodeMap = {
238
- 732403100: 'fmt_lock_error',
239
- 631735290: 'fmt_lock_error',
240
- 732403101: 'fmt_pc_room_not_exist_error',
241
- 732403103: 'fmt_host_leave_error',
242
- 720410100: 'fmt_end_error'
243
- };
244
-
245
- const errorKey = errorCodeMap[errorCode];
246
- if (errorKey) {
247
- return window._transI18n(errorKey);
248
- }
249
-
250
- return `Error: code=${errorCode}, message=${defaultMessage}`;
251
- }
252
-
253
- /**
254
- * 处理场景退出
255
- * @param {string} roomId - 房间ID
256
- * @param {string} reason - 退出原因
257
- */
258
- handleSceneExited(roomId, reason) {
259
- if (!this.sendExitedEventFlag) {
260
- return;
261
- }
262
-
263
- this.logInfo('UI scene exited');
264
- window.cppSdkHelper.exitedMeeting(roomId, reason);
265
- this.uiScene = null;
266
-
267
- setTimeout(() => {
268
- this.logInfo('UI scene exited callback');
269
- window.runtime.getCurrentBrowserWindow().hide();
270
- });
271
- }
272
-
273
- /**
274
- * 处理小部件点击
275
- * @param {string} widgetId - 小部件ID
276
- */
277
- handleWidgetClicked(widgetId) {
278
- window.cppSdkHelper.onWidgetClicked(widgetId);
279
- }
280
-
281
- /**
282
- * 处理用户令牌即将过期
283
- */
284
- handleUserTokenWillExpire() {
285
- window.cppSdkHelper.onUserTokenWillExpire();
286
- }
287
-
288
- /**
289
- * 退出UI场景
290
- */
291
- exitUiScene() {
292
- try {
293
- if (!this.uiScene) {
294
- return;
295
- }
296
- this.uiScene.exit();
297
- this.lastInitParams = '';
298
- } catch (error) {
299
- window.cppSdkHelper.exitedMeeting(roomId, FcrUIExitReason.USER_QUIT);
300
- }
301
- }
302
-
303
- /**
304
- * 处理确认按钮点击
305
- */
306
- handleConfirmClick() {
307
- this.setFullScreenFailureComp(false);
308
- this.logInfo('Error confirmation button clicked');
309
- window.runtime.getCurrentBrowserWindow().hide();
310
- }
311
-
312
- /**
313
- * 绑定全局方法
314
- */
315
- bindGlobalMethods() {
316
- window.cppSdkHelper.onCreatorInit = (config) => {
317
- window.__AgoraMutex.dispatch(() => {
318
- this.createOrInitCreator(config);
319
- });
320
- };
321
-
322
- window.cppSdkHelper.onSettingOpen = () => {
323
- this.creator.openSetting();
324
- };
325
-
326
- window.cppSdkHelper.onSettingClose = () => {
327
- this.creator.closeSetting();
328
- };
329
-
330
- window.cppSdkHelper.onSetParameters = (parameters) => {
331
- this.creator.setParameters(parameters);
332
- };
333
-
334
- window.cppSdkHelper.onRenewUserToken = (token) => {
335
- this.creator.renewUserToken(token);
336
- };
337
-
338
- window.cppSdkHelper.exitUiScene = () => {
339
- window.__AgoraMutex.dispatch(() => {
340
- this.exitUiScene();
341
- });
342
- };
343
-
344
- window.cppSdkHelper.onLaunchMeeting = (launchOptions) => {
345
- window.__AgoraMutex.dispatch(() => {
346
- this.launchMeeting(launchOptions);
347
- })
348
- };
349
- }
350
-
351
- /**
352
- * 设置加载状态
353
- * @param {boolean} visible - 是否显示加载状态
354
- */
355
- setLoading(visible) {
356
- const dom = document.querySelector('#launch-loading');
357
- if (dom) {
358
- dom.style.display = visible ? 'flex' : 'none';
359
- }
360
- }
361
-
362
- /**
363
- * 设置全屏失败组件
364
- * @param {boolean} visible - 是否显示
365
- * @param {string} errorMsg - 错误消息
366
- */
367
- setFullScreenFailureComp(visible, errorMsg) {
368
- this.setLoading(false);
369
- const dom = document.querySelector('#fcr-launch-failure-comp');
370
- const btnTextDom = document.querySelector('#fcr-launch-failure-btn-text');
371
-
372
- if (dom) {
373
- if (visible) {
374
- dom.style.display = 'flex';
375
- btnTextDom.innerText = window.$$agora_language === 'zh' ? '我已知悉' : 'I know';
376
- if (errorMsg) {
377
- const msgDom = document.querySelector('#fcr-launch-failure-error-info');
378
- msgDom.innerText = errorMsg;
379
- }
380
- } else {
381
- dom.style.display = 'none';
382
- }
383
- }
384
- }
385
-
386
- /**
387
- * 记录信息日志
388
- * @param {string} message - 日志消息
389
- */
390
- logInfo(message) {
391
- window.__AgoraLogger.info(`MEETING MANAGER: ${message}`);
392
- }
393
-
394
- /**
395
- * 记录错误日志
396
- * @param {string} message - 错误消息
397
- * @param {Error} error - 错误对象
398
- */
399
- logError(message, error) {
400
- window.__AgoraLogger.error(`MEETING MANAGER: ${message}`, error);
401
- }
402
- }
403
-
404
- // 初始化会议管理器
405
- const meetingManager = new MeetingManager();
1
+ /**
2
+ * 会议管理器 - 负责处理会议的生命周期管理
3
+ * 包括创建者初始化、会议启动、错误处理等功能
4
+ */
5
+ class MeetingManager {
6
+ constructor() {
7
+ this.creator = null;
8
+ this.uiScene = null;
9
+
10
+ this.sendExitedEventFlag = true;
11
+ this.lastInitParams = '';
12
+
13
+ this.bindGlobalMethods();
14
+ }
15
+
16
+ /**
17
+ * 重新加载创建者
18
+ * @param {string} stringInitParams - 初始化参数字符串
19
+ */
20
+ reloadCreator(stringInitParams) {
21
+ try {
22
+ const config = JSON.parse(stringInitParams);
23
+ this.creator = new FcrUIScene.FcrUISceneCreator(config);
24
+ this.logInfo('Creator reloaded successfully');
25
+ } catch (error) {
26
+ this.logError('Failed to parse init options:', error);
27
+ }
28
+ }
29
+
30
+
31
+ releaseCreator() {
32
+ if (this.creator) {
33
+ this.logInfo('Creator exists, releasing previous creator');
34
+ this.releasePreviousScene();
35
+ this.creator.release();
36
+ this.creator = undefined;
37
+ }
38
+ }
39
+
40
+ /**
41
+ * 创建或初始化创建者
42
+ * @param {Object} config - 配置对象
43
+ */
44
+ createOrInitCreator(config) {
45
+ try {
46
+ // 如果存在旧的创建者,先释放
47
+ this.releaseCreator();
48
+ } catch (error) {
49
+ this.logError('Failed to release creator:', error);
50
+ }
51
+
52
+ // 创建新的创建者
53
+ this.lastInitParams = JSON.stringify(config);
54
+ this.logInfo(`Creating new creator with config: ${this.lastInitParams}`);
55
+ this.creator = new FcrUIScene.FcrUISceneCreator(config);
56
+ }
57
+
58
+ /**
59
+ * 释放之前的场景
60
+ */
61
+ releasePreviousScene() {
62
+ if (this.uiScene) {
63
+ this.sendExitedEventFlag = false;
64
+ this.uiScene.exit();
65
+ this.uiScene = null;
66
+ this.logInfo('Previous UI scene released');
67
+ }
68
+ }
69
+
70
+ /**
71
+ * 启动会议
72
+ * @param {Object} launchOptions - 启动选项
73
+ */
74
+ launchMeeting(launchOptions) {
75
+ const { data, lastInitParams: initParamsFromMainProcess } = launchOptions;
76
+
77
+ this.logInfo(`Launching meeting with params: ${initParamsFromMainProcess}`);
78
+
79
+ // 检查是否需要重新加载创建者
80
+ if (initParamsFromMainProcess !== this.lastInitParams) {
81
+ this.logInfo('Init params changed, reloading creator');
82
+ this.lastInitParams = initParamsFromMainProcess;
83
+ this.releaseCreator();
84
+ this.reloadCreator(initParamsFromMainProcess);
85
+ }
86
+
87
+ // 清理之前的场景
88
+ this.cleanupPreviousScene();
89
+
90
+ // 设置UI状态
91
+ this.setFullScreenFailureComp(false);
92
+ this.setLoading(true);
93
+
94
+ // 绑定错误处理事件
95
+ this.bindErrorHandlers();
96
+
97
+ // 注册小部件
98
+ this.registerWidgets(data);
99
+
100
+ // 启动场景
101
+ this.startUIScene(data);
102
+
103
+ // 添加观察者
104
+ this.addSceneObservers();
105
+ }
106
+
107
+ /**
108
+ * 清理之前的场景
109
+ */
110
+ cleanupPreviousScene() {
111
+ try {
112
+ if (this.uiScene) {
113
+ this.logInfo('Cleaning up previous UI scene');
114
+ this.sendExitedEventFlag = false;
115
+ this.uiScene.exit();
116
+ }
117
+ } catch (error) {
118
+ this.logError('Error during scene cleanup:', error);
119
+ }
120
+ }
121
+
122
+ /**
123
+ * 绑定错误处理事件
124
+ */
125
+ bindErrorHandlers() {
126
+ const confirmBtn = document.querySelector('#fcr-launch-failure-confirm-btn');
127
+ if (confirmBtn) {
128
+ confirmBtn.removeEventListener('click', this.handleConfirmClick);
129
+ confirmBtn.addEventListener('click', this.handleConfirmClick.bind(this));
130
+ }
131
+ }
132
+
133
+ /**
134
+ * 注册小部件
135
+ * @param {Object} data - 数据对象
136
+ */
137
+ registerWidgets(data) {
138
+ const { widgets, ...others } = data;
139
+ if (widgets && Array.isArray(widgets)) {
140
+ widgets.forEach(widget => {
141
+ this.creator.registerWidget(widget);
142
+ });
143
+ }
144
+ }
145
+
146
+ /**
147
+ * 启动UI场景
148
+ * @param {Object} data - 数据对象
149
+ */
150
+ startUIScene(data) {
151
+ const { widgets, ...others } = data;
152
+
153
+ this.uiScene = this.creator.launch(
154
+ others,
155
+ async () => {
156
+ this.logInfo('UI scene closed callback');
157
+ const currentBrowserWindow = window.runtime.getCurrentBrowserWindow();
158
+ if(currentBrowserWindow.isFullScreen()) {
159
+ currentBrowserWindow.setFullScreen(false);
160
+ await new Promise(resolve => setTimeout(resolve, 500));
161
+ }
162
+
163
+ if (currentBrowserWindow) {
164
+ currentBrowserWindow.hide();
165
+ }
166
+ },
167
+ () => { }, // 空回调
168
+ () => { }, // 空回调
169
+ document.getElementById('root')
170
+ );
171
+ }
172
+
173
+ /**
174
+ * 添加场景观察者
175
+ */
176
+ addSceneObservers() {
177
+ this.uiScene.addObserver({
178
+ onLaunchSuccess: () => this.handleLaunchSuccess(),
179
+ onLaunchFailure: (roomId, error) => this.handleLaunchFailure(roomId, error),
180
+ onExited: (roomId, reason) => this.handleSceneExited(roomId, reason),
181
+ onWidgetClicked: (widgetId) => this.handleWidgetClicked(widgetId),
182
+ onUserTokenWillExpire: () => this.handleUserTokenWillExpire()
183
+ });
184
+ }
185
+
186
+ /**
187
+ * 处理启动成功
188
+ */
189
+ handleLaunchSuccess() {
190
+ this.setLoading(false);
191
+ this.sendExitedEventFlag = true;
192
+
193
+ try {
194
+ const roomProvider = this.uiScene._objectManager.getObject('roomProvider');
195
+ if (!roomProvider) {
196
+ throw new Error('roomProvider not found in uiScene');
197
+ }
198
+
199
+ const currentRoomControl = roomProvider.currentRoomControl;
200
+ if (!currentRoomControl) {
201
+ throw new Error('currentRoomControl not found in uiScene');
202
+ }
203
+
204
+ const roomInfo = currentRoomControl.getRoomInfo();
205
+ if (!roomInfo) {
206
+ throw new Error('roomInfo not found in uiScene');
207
+ }
208
+
209
+ const { roomName, roomId } = roomInfo;
210
+ document.querySelector('title').innerText = roomName;
211
+ window.cppSdkHelper.launchSuccess(roomId);
212
+ } catch (error) {
213
+ this.logError('Error in launch success handler:', error);
214
+ }
215
+ }
216
+
217
+ /**
218
+ * 处理启动失败
219
+ * @param {string} roomId - 房间ID
220
+ * @param {Object} error - 错误对象
221
+ */
222
+ handleLaunchFailure(roomId, error) {
223
+ const errorCode = Number(error.code);
224
+ let errorMessage = this.getErrorMessage(errorCode, error.message);
225
+
226
+ this.setFullScreenFailureComp(true, errorMessage);
227
+ window.cppSdkHelper.launchFailure(roomId, errorCode);
228
+ }
229
+
230
+ /**
231
+ * 获取错误消息
232
+ * @param {number} errorCode - 错误代码
233
+ * @param {string} defaultMessage - 默认错误消息
234
+ * @returns {string} 错误消息
235
+ */
236
+ getErrorMessage(errorCode, defaultMessage) {
237
+ const errorCodeMap = {
238
+ 732403100: 'fmt_lock_error',
239
+ 631735290: 'fmt_lock_error',
240
+ 732403101: 'fmt_pc_room_not_exist_error',
241
+ 732403103: 'fmt_host_leave_error',
242
+ 720410100: 'fmt_end_error'
243
+ };
244
+
245
+ const errorKey = errorCodeMap[errorCode];
246
+ if (errorKey) {
247
+ return window._transI18n(errorKey);
248
+ }
249
+
250
+ return `Error: code=${errorCode}, message=${defaultMessage}`;
251
+ }
252
+
253
+ /**
254
+ * 处理场景退出
255
+ * @param {string} roomId - 房间ID
256
+ * @param {string} reason - 退出原因
257
+ */
258
+ handleSceneExited(roomId, reason) {
259
+ if (!this.sendExitedEventFlag) {
260
+ return;
261
+ }
262
+
263
+ this.logInfo('UI scene exited');
264
+ window.cppSdkHelper.exitedMeeting(roomId, reason);
265
+ this.uiScene = null;
266
+
267
+ setTimeout(() => {
268
+ this.logInfo('UI scene exited callback');
269
+ window.runtime.getCurrentBrowserWindow().hide();
270
+ });
271
+ }
272
+
273
+ /**
274
+ * 处理小部件点击
275
+ * @param {string} widgetId - 小部件ID
276
+ */
277
+ handleWidgetClicked(widgetId) {
278
+ window.cppSdkHelper.onWidgetClicked(widgetId);
279
+ }
280
+
281
+ /**
282
+ * 处理用户令牌即将过期
283
+ */
284
+ handleUserTokenWillExpire() {
285
+ window.cppSdkHelper.onUserTokenWillExpire();
286
+ }
287
+
288
+ /**
289
+ * 退出UI场景
290
+ */
291
+ exitUiScene() {
292
+ try {
293
+ if (!this.uiScene) {
294
+ return;
295
+ }
296
+ this.uiScene.exit();
297
+ this.lastInitParams = '';
298
+ } catch (error) {
299
+ window.cppSdkHelper.exitedMeeting(roomId, FcrUIExitReason.USER_QUIT);
300
+ }
301
+ }
302
+
303
+ /**
304
+ * 处理确认按钮点击
305
+ */
306
+ handleConfirmClick() {
307
+ this.setFullScreenFailureComp(false);
308
+ this.logInfo('Error confirmation button clicked');
309
+ window.runtime.getCurrentBrowserWindow().hide();
310
+ }
311
+
312
+ /**
313
+ * 绑定全局方法
314
+ */
315
+ bindGlobalMethods() {
316
+ window.cppSdkHelper.onCreatorInit = (config) => {
317
+ window.__AgoraMutex.dispatch(() => {
318
+ this.createOrInitCreator(config);
319
+ });
320
+ };
321
+
322
+ window.cppSdkHelper.onSettingOpen = () => {
323
+ this.creator.openSetting();
324
+ };
325
+
326
+ window.cppSdkHelper.onSettingClose = () => {
327
+ this.creator.closeSetting();
328
+ };
329
+
330
+ window.cppSdkHelper.onSetParameters = (parameters) => {
331
+ this.creator.setParameters(parameters);
332
+ };
333
+
334
+ window.cppSdkHelper.onRenewUserToken = (token) => {
335
+ this.creator.renewUserToken(token);
336
+ };
337
+
338
+ window.cppSdkHelper.exitUiScene = () => {
339
+ window.__AgoraMutex.dispatch(() => {
340
+ this.exitUiScene();
341
+ });
342
+ };
343
+
344
+ window.cppSdkHelper.onLaunchMeeting = (launchOptions) => {
345
+ window.__AgoraMutex.dispatch(() => {
346
+ this.launchMeeting(launchOptions);
347
+ })
348
+ };
349
+ }
350
+
351
+ /**
352
+ * 设置加载状态
353
+ * @param {boolean} visible - 是否显示加载状态
354
+ */
355
+ setLoading(visible) {
356
+ const dom = document.querySelector('#launch-loading');
357
+ if (dom) {
358
+ dom.style.display = visible ? 'flex' : 'none';
359
+ }
360
+ }
361
+
362
+ /**
363
+ * 设置全屏失败组件
364
+ * @param {boolean} visible - 是否显示
365
+ * @param {string} errorMsg - 错误消息
366
+ */
367
+ setFullScreenFailureComp(visible, errorMsg) {
368
+ this.setLoading(false);
369
+ const dom = document.querySelector('#fcr-launch-failure-comp');
370
+ const btnTextDom = document.querySelector('#fcr-launch-failure-btn-text');
371
+
372
+ if (dom) {
373
+ if (visible) {
374
+ dom.style.display = 'flex';
375
+ btnTextDom.innerText = window.$$agora_language === 'zh' ? '我已知悉' : 'I know';
376
+ if (errorMsg) {
377
+ const msgDom = document.querySelector('#fcr-launch-failure-error-info');
378
+ msgDom.innerText = errorMsg;
379
+ }
380
+ } else {
381
+ dom.style.display = 'none';
382
+ }
383
+ }
384
+ }
385
+
386
+ /**
387
+ * 记录信息日志
388
+ * @param {string} message - 日志消息
389
+ */
390
+ logInfo(message) {
391
+ window.__AgoraLogger.info(`MEETING MANAGER: ${message}`);
392
+ }
393
+
394
+ /**
395
+ * 记录错误日志
396
+ * @param {string} message - 错误消息
397
+ * @param {Error} error - 错误对象
398
+ */
399
+ logError(message, error) {
400
+ window.__AgoraLogger.error(`MEETING MANAGER: ${message}`, error);
401
+ }
402
+ }
403
+
404
+ // 初始化会议管理器
405
+ const meetingManager = new MeetingManager();