fcr-ui-scene 3.7.7-rc.1 → 3.7.8-rc.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 (32) hide show
  1. package/lib/creator/provider-initializer.browser.js +2 -2
  2. package/lib/creator/provider-initializer.electron.js +2 -2
  3. package/lib/electron/bootstrap-sdk.js +70 -33
  4. package/lib/electron/hang-detection/index.d.ts +3 -0
  5. package/lib/electron/hang-detection/index.js +15 -0
  6. package/lib/electron/hang-detection/manager.d.ts +28 -0
  7. package/lib/electron/hang-detection/manager.js +231 -0
  8. package/lib/electron/hang-detection/types.d.ts +14 -0
  9. package/lib/electron/hang-detection/types.js +6 -0
  10. package/lib/electron/until.d.ts +1 -4
  11. package/lib/electron/until.js +9 -4
  12. package/lib/modules/action-bar/components/screen-share/index.electron.js +1 -1
  13. package/lib/modules/components/control-bar/components/switch-theme/index.js +4 -2
  14. package/lib/modules/components/control-bar/index.js +1 -3
  15. package/lib/modules/participant/store.base.js +0 -1
  16. package/lib/modules/share-screen/store.electron.js +9 -0
  17. package/lib/modules/state-bar/store.base.electron.js +6 -2
  18. package/lib/providers/board-share/bar-control/base.d.ts +2 -0
  19. package/lib/providers/board-share/bar-control/base.js +13 -3
  20. package/lib/providers/board-share/bar-control/electron.d.ts +1 -0
  21. package/lib/providers/board-share/bar-control/electron.js +15 -4
  22. package/lib/providers/board-share/provider.base.d.ts +1 -0
  23. package/lib/providers/board-share/provider.base.js +3 -1
  24. package/lib/providers/board-share/provider.electron.d.ts +1 -0
  25. package/lib/providers/board-share/provider.electron.js +8 -2
  26. package/lib/providers/board-share/type.d.ts +2 -0
  27. package/lib/providers/dialog/provider.electron.js +10 -2
  28. package/lib/providers/screen-share/strategy/browser.js +50 -3
  29. package/lib/providers/screen-share/strategy/electron.js +77 -8
  30. package/lib/providers/screen-share/stream-state-sync.d.ts +3 -1
  31. package/lib/providers/screen-share/stream-state-sync.js +133 -40
  32. package/package.json +5 -5
@@ -210,14 +210,14 @@ var FcrUIBrowserProviderInitializer = exports.FcrUIBrowserProviderInitializer =
210
210
  objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_APPLIST_DATA_SOURCE, sharedApplistDataSource);
211
211
  var applistProvider = new _appListProvider.FcrUIApplistProviderImpl(dialogProvider, eventProvider, widgetProvider, sharedApplistDataSource);
212
212
  objectManager.setObject(_objectManager.FcrUIObjectKeys.P_APPLIST_PROVIDER, applistProvider);
213
+ var videoWindowDataSource = new _videoWindow.FcrUIVideoWindowDataSourceImpl(sharedSettingDataSource);
214
+ objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_VIDEO_WINDOW_DATA_SOURCE, videoWindowDataSource);
213
215
  var screenShareProvider = new _provider5.FcrUIScreenShareProviderImpl(objectManager);
214
216
  objectManager.setObject(_objectManager.FcrUIObjectKeys.P_SCREEN_SHARE_PROVIDER, screenShareProvider);
215
217
  var sharedSpeakerSoptlightDataSource = new _speakerSpotlight.FcrUISharedSpeakerSpotlightDataSourceImpl();
216
218
  objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_SPEAKER_SPOTLIGHT_DATA_SOURCE, sharedSpeakerSoptlightDataSource);
217
219
  var localVideoRenderProvider = new _rendererProvider.FcrUIMainLocalVideoRenderProviderImpl(deviceProvider, screenShareProvider);
218
220
  objectManager.setObject(_objectManager.FcrUIObjectKeys.P_LOCAL_VIDEO_RENDER_PROVIDER, localVideoRenderProvider);
219
- var videoWindowDataSource = new _videoWindow.FcrUIVideoWindowDataSourceImpl(sharedSettingDataSource);
220
- objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_VIDEO_WINDOW_DATA_SOURCE, videoWindowDataSource);
221
221
  var pinDataSource = new _pinData.FcrUISharedPinDataSourceImpl(messageProvider, videoWindowDataSource);
222
222
  objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_PIN_DATA_SOURCE, pinDataSource);
223
223
  }
@@ -240,10 +240,10 @@ var FcrUIElectronProviderInitializer = exports.FcrUIElectronProviderInitializer
240
240
  objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_APPLIST_DATA_SOURCE, sharedApplistDataSource);
241
241
  var applistProvider = new _appListProvider.FcrUIApplistProviderImpl(dialogProvider, eventProvider, widgetProvider, sharedApplistDataSource);
242
242
  objectManager.setObject(_objectManager.FcrUIObjectKeys.P_APPLIST_PROVIDER, applistProvider);
243
- var screenShareProvider = new _provider6.FcrUIScreenShareProviderImpl(objectManager);
244
- objectManager.setObject(_objectManager.FcrUIObjectKeys.P_SCREEN_SHARE_PROVIDER, screenShareProvider);
245
243
  var sharedVideoWindowDataSource = new _videoWindow.FcrUIVideoWindowDataSourceImpl(sharedSettingDataSource);
246
244
  objectManager.setObject(_objectManager.FcrUIObjectKeys.S_SHARED_VIDEO_WINDOW_DATA_SOURCE, sharedVideoWindowDataSource);
245
+ var screenShareProvider = new _provider6.FcrUIScreenShareProviderImpl(objectManager);
246
+ objectManager.setObject(_objectManager.FcrUIObjectKeys.P_SCREEN_SHARE_PROVIDER, screenShareProvider);
247
247
  var localVideoRenderProvider = new _rendererProvider.FcrUIMainLocalVideoRenderProviderImpl(deviceProvider, screenShareProvider);
248
248
  objectManager.setObject(_objectManager.FcrUIObjectKeys.P_LOCAL_VIDEO_RENDER_PROVIDER, localVideoRenderProvider);
249
249
  var multiDisplayProvider = new _multiDisplayProvider.FcrUIMultiDisplayProviderImpl({
@@ -13,6 +13,7 @@ require("core-js/modules/es.array.concat.js");
13
13
  require("core-js/modules/es.array.find.js");
14
14
  require("core-js/modules/es.array.for-each.js");
15
15
  require("core-js/modules/es.array.join.js");
16
+ require("core-js/modules/es.array.map.js");
16
17
  require("core-js/modules/es.date.to-json.js");
17
18
  require("core-js/modules/es.json.stringify.js");
18
19
  require("core-js/modules/es.object.keys.js");
@@ -22,6 +23,7 @@ require("core-js/modules/es.string.starts-with.js");
22
23
  require("core-js/modules/esnext.iterator.constructor.js");
23
24
  require("core-js/modules/esnext.iterator.find.js");
24
25
  require("core-js/modules/esnext.iterator.for-each.js");
26
+ require("core-js/modules/esnext.iterator.map.js");
25
27
  require("core-js/modules/esnext.json.parse.js");
26
28
  require("core-js/modules/web.dom-collections.for-each.js");
27
29
  require("core-js/modules/web.timers.js");
@@ -42,6 +44,7 @@ var _exitCodes = require("./exit-codes");
42
44
  var _struct = require("./struct");
43
45
  var _eventManager = require("./event-manager");
44
46
  var _until = require("./until");
47
+ var _hangDetection = require("./hang-detection");
45
48
  var _process$argv$find; // TODO 需要将其改造成 processManager --- stateManager 和 eventManager 的逻辑,保持兼容
46
49
  // processManager --- stateManager 和 eventManager
47
50
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -289,6 +292,9 @@ _electron.app.addListener('ready', function () {
289
292
  });
290
293
  mainWindow.addListener('hide', function () {
291
294
  (0, _logger.getLogger)().info("windows_release main window hidden, current launch state: ".concat(_struct.FcrUISceneLaunchState[_eventManager.eventManager.launchState]));
295
+ (0, _logger.getLogger)().info("windows_release the main window is hide, all window State: ".concat(_electron.BrowserWindow.getAllWindows().map(function (windowItem) {
296
+ return "the window id ".concat(windowItem.id, " ").concat(windowItem.getTitle(), " ").concat(windowItem.isVisible());
297
+ })));
292
298
  mainWindowDisplayState = _struct.DisplayState.HIDE;
293
299
  if (userMinimize) {
294
300
  (0, _logger.getLogger)().info('windows_release main window hidden, but user minimize, ignore this event');
@@ -330,6 +336,8 @@ _electron.app.addListener('ready', function () {
330
336
  });
331
337
  mainWindow.addListener('closed', function () {
332
338
  (0, _logger.getLogger)().info('windows_release main window closed');
339
+ // 清理主窗口的hang detection状态
340
+ hangDetectionManager.handleWindowClosed(mainWindow.id);
333
341
  _electron.app.exit(_exitCodes.AppExitCode.NORMAL_EXIT);
334
342
  });
335
343
  mainWindow.addListener('close', function (e) {
@@ -355,18 +363,12 @@ _electron.app.addListener('ready', function () {
355
363
  });
356
364
  (0, _logger.getLogger)().info('main window close event prevented');
357
365
  setTimeout(function () {
358
- mainWindow.hide();
366
+ if (mainWindow && !mainWindow.isDestroyed()) {
367
+ mainWindow.hide();
368
+ }
359
369
  }, 300);
360
370
  }
361
371
  });
362
- mainWindow.addListener('unresponsive', function () {
363
- (0, _logger.getLogger)().warn("main window unresponsive in bootstrap-sdk");
364
- handleUnresponsive();
365
- });
366
- mainWindow.addListener('responsive', function () {
367
- (0, _logger.getLogger)().warn("main window responsive in bootstrap-sdk");
368
- handleResponsive();
369
- });
370
372
  if (_env.isDev) {
371
373
  mainWindow.webContents.openDevTools({
372
374
  mode: 'detach'
@@ -379,6 +381,22 @@ _electron.app.addListener('ready', function () {
379
381
  return mainWindow;
380
382
  });
381
383
  _electron.app.addListener('browser-window-created', function (_, window) {
384
+ var windowId = window.id;
385
+ (0, _logger.getLogger)().warn("window created: ".concat(windowId, " ,window title: ").concat(window.getTitle()));
386
+ window.webContents.addListener('unresponsive', function () {
387
+ (0, _logger.getLogger)().warn("browser window ".concat(windowId, " unresponsive in bootstrap-sdk"));
388
+ handleUnresponsive(windowId);
389
+ });
390
+ window.webContents.addListener('responsive', function () {
391
+ (0, _logger.getLogger)().warn("browser window ".concat(windowId, " responsive in bootstrap-sdk"));
392
+ handleResponsive(windowId);
393
+ });
394
+
395
+ // 监听窗口关闭事件,清理hang detection状态
396
+ window.addListener('closed', function () {
397
+ (0, _logger.getLogger)().info("browser window ".concat(windowId, " closed, cleaning hang detection state"));
398
+ hangDetectionManager.handleWindowClosed(windowId);
399
+ });
382
400
  (0, _main.enable)(window.webContents);
383
401
  });
384
402
 
@@ -393,31 +411,50 @@ _electron.app.addListener('quit', function (event, exitCode) {
393
411
  (0, _logger.getLogger)().info("app quit event triggered with exit code: ".concat(exitCode));
394
412
  // 清理 EventManager 资源
395
413
  _eventManager.eventManager.dispose();
414
+
415
+ // 清理所有hang detection计时器
416
+ hangDetectionManager.dispose();
396
417
  });
397
- var HANG_DETECTION_TIMEOUT = 60 * 1000; // 1分钟(毫s秒)
398
- var hangDetectionTimer = null;
399
- function handleUnresponsive() {
400
- (0, _logger.getLogger)().warn('Window became unresponsive, starting hang detection timer');
401
- clearHangDetectionTimer();
402
- hangDetectionTimer = setTimeout(function () {
403
- (0, _logger.getLogger)().error('Window has been unresponsive for 1 minute, forcing application exit');
404
- _eventManager.eventManager.onExitedMeeting(_eventManager.eventManager.roomId, _struct.FcrUISceneLaunchEndReason.HANG_DETECTION);
405
- ipcClient.sendMessage({
406
- cmd: _type.IPCMessageCMD.ExitedMeeting,
407
- data: {
408
- roomId: _eventManager.eventManager.roomId,
409
- reason: _until.hangDetectionErrorCode
410
- }
411
- });
412
- }, HANG_DETECTION_TIMEOUT);
413
- }
414
- function handleResponsive() {
415
- (0, _logger.getLogger)().info('Window became responsive again, clearing hang detection timer');
416
- clearHangDetectionTimer();
418
+ var onHangTimeout = function onHangTimeout(windowId) {
419
+ (0, _logger.getLogger)().error("Window ".concat(windowId, " hang timeout, triggering application exit"));
420
+ _eventManager.eventManager.onExitedMeeting(_eventManager.eventManager.roomId, _struct.FcrUISceneLaunchEndReason.HANG_DETECTION);
421
+ ipcClient.sendMessage({
422
+ cmd: _type.IPCMessageCMD.ExitedMeeting,
423
+ data: {
424
+ roomId: _eventManager.eventManager.roomId,
425
+ reason: _until.hangDetectionErrorCode
426
+ }
427
+ });
428
+ };
429
+ var onStateChange = function onStateChange(windowId, isUnresponsive, duration) {
430
+ if (isUnresponsive) {
431
+ (0, _logger.getLogger)().warn("Window ".concat(windowId, " became unresponsive"));
432
+ } else {
433
+ (0, _logger.getLogger)().info("Window ".concat(windowId, " became responsive").concat(duration ? " after ".concat(duration, "ms") : ''));
434
+ }
435
+ };
436
+ var hangDetectionManager = new _hangDetection.MultiWindowHangDetectionManager({
437
+ onHangTimeout: onHangTimeout,
438
+ onStateChange: onStateChange
439
+ }, {
440
+ timeout: _hangDetection.DEFAULT_HANG_DETECTION_TIMEOUT,
441
+ enableVerboseLogging: true
442
+ });
443
+ function handleUnresponsive(windowId) {
444
+ var _mainWindow;
445
+ var targetWindowId = windowId || ((_mainWindow = mainWindow) === null || _mainWindow === void 0 ? void 0 : _mainWindow.id);
446
+ if (!targetWindowId) {
447
+ (0, _logger.getLogger)().warn('Cannot handle unresponsive: no window ID available');
448
+ return;
449
+ }
450
+ hangDetectionManager.handleWindowUnresponsive(targetWindowId);
417
451
  }
418
- function clearHangDetectionTimer() {
419
- if (hangDetectionTimer) {
420
- clearTimeout(hangDetectionTimer);
421
- hangDetectionTimer = null;
452
+ function handleResponsive(windowId) {
453
+ var _mainWindow2;
454
+ var targetWindowId = windowId || ((_mainWindow2 = mainWindow) === null || _mainWindow2 === void 0 ? void 0 : _mainWindow2.id);
455
+ if (!targetWindowId) {
456
+ (0, _logger.getLogger)().warn('Cannot handle responsive: no window ID available');
457
+ return;
422
458
  }
459
+ hangDetectionManager.handleWindowResponsive(targetWindowId);
423
460
  }
@@ -0,0 +1,3 @@
1
+ export { MultiWindowHangDetectionManager } from './manager';
2
+ export type { WindowHangState, HangDetectionConfig, HangDetectionCallbacks } from './types';
3
+ export declare const DEFAULT_HANG_DETECTION_TIMEOUT: number;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.define-property.js");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.DEFAULT_HANG_DETECTION_TIMEOUT = void 0;
8
+ Object.defineProperty(exports, "MultiWindowHangDetectionManager", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _manager.MultiWindowHangDetectionManager;
12
+ }
13
+ });
14
+ var _manager = require("./manager");
15
+ var DEFAULT_HANG_DETECTION_TIMEOUT = exports.DEFAULT_HANG_DETECTION_TIMEOUT = 15 * 1000; // 15秒
@@ -0,0 +1,28 @@
1
+ import { WindowHangState, HangDetectionConfig, HangDetectionCallbacks } from './types';
2
+ /**
3
+ * 多窗口 Hang Detection 管理器
4
+ */
5
+ export declare class MultiWindowHangDetectionManager {
6
+ private windowStates;
7
+ private logger;
8
+ private config;
9
+ private callbacks;
10
+ constructor(callbacks: HangDetectionCallbacks, config?: HangDetectionConfig);
11
+ handleWindowUnresponsive(windowId: number): void;
12
+ /**
13
+ * 处理窗口变为responsive
14
+ */
15
+ handleWindowResponsive(windowId: number): void;
16
+ private clearWindowTimer;
17
+ clearAllTimers(): void;
18
+ getUnresponsiveWindowCount(): number;
19
+ getUnresponsiveWindowIds(): number[];
20
+ getWindowHangState(windowId: number): WindowHangState | undefined;
21
+ isWindowUnresponsive(windowId: number): boolean;
22
+ getWindowUnresponsiveDuration(windowId: number): number | null;
23
+ private logCurrentState;
24
+ handleWindowClosed(windowId: number): void;
25
+ updateConfig(config: Partial<HangDetectionConfig>): void;
26
+ getConfig(): Required<HangDetectionConfig>;
27
+ dispose(): void;
28
+ }
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.js");
4
+ require("core-js/modules/es.symbol.description.js");
5
+ require("core-js/modules/es.symbol.iterator.js");
6
+ require("core-js/modules/es.error.cause.js");
7
+ require("core-js/modules/es.error.to-string.js");
8
+ require("core-js/modules/es.array.filter.js");
9
+ require("core-js/modules/es.array.for-each.js");
10
+ require("core-js/modules/es.array.is-array.js");
11
+ require("core-js/modules/es.array.push.js");
12
+ require("core-js/modules/es.array.slice.js");
13
+ require("core-js/modules/es.date.to-string.js");
14
+ require("core-js/modules/es.function.name.js");
15
+ require("core-js/modules/es.object.define-properties.js");
16
+ require("core-js/modules/es.object.define-property.js");
17
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
18
+ require("core-js/modules/es.object.get-own-property-descriptors.js");
19
+ require("core-js/modules/es.object.keys.js");
20
+ require("core-js/modules/es.regexp.exec.js");
21
+ require("core-js/modules/es.regexp.test.js");
22
+ require("core-js/modules/es.regexp.to-string.js");
23
+ require("core-js/modules/esnext.iterator.constructor.js");
24
+ require("core-js/modules/esnext.iterator.filter.js");
25
+ require("core-js/modules/esnext.iterator.for-each.js");
26
+ require("core-js/modules/web.dom-collections.for-each.js");
27
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
28
+ Object.defineProperty(exports, "__esModule", {
29
+ value: true
30
+ });
31
+ exports.MultiWindowHangDetectionManager = void 0;
32
+ require("core-js/modules/es.array.concat.js");
33
+ require("core-js/modules/es.array.from.js");
34
+ require("core-js/modules/es.array.iterator.js");
35
+ require("core-js/modules/es.array.join.js");
36
+ require("core-js/modules/es.date.now.js");
37
+ require("core-js/modules/es.date.to-json.js");
38
+ require("core-js/modules/es.json.stringify.js");
39
+ require("core-js/modules/es.map.js");
40
+ require("core-js/modules/es.object.to-string.js");
41
+ require("core-js/modules/es.string.iterator.js");
42
+ require("core-js/modules/esnext.map.delete-all.js");
43
+ require("core-js/modules/esnext.map.emplace.js");
44
+ require("core-js/modules/esnext.map.every.js");
45
+ require("core-js/modules/esnext.map.filter.js");
46
+ require("core-js/modules/esnext.map.find.js");
47
+ require("core-js/modules/esnext.map.find-key.js");
48
+ require("core-js/modules/esnext.map.includes.js");
49
+ require("core-js/modules/esnext.map.key-of.js");
50
+ require("core-js/modules/esnext.map.map-keys.js");
51
+ require("core-js/modules/esnext.map.map-values.js");
52
+ require("core-js/modules/esnext.map.merge.js");
53
+ require("core-js/modules/esnext.map.reduce.js");
54
+ require("core-js/modules/esnext.map.some.js");
55
+ require("core-js/modules/esnext.map.update.js");
56
+ require("core-js/modules/web.dom-collections.iterator.js");
57
+ require("core-js/modules/web.timers.js");
58
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
59
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
60
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
61
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
62
+ var _2 = require(".");
63
+ var _logger = require("../logger");
64
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
65
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
66
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
67
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
68
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
69
+ /**
70
+ * 多窗口 Hang Detection 管理器
71
+ */
72
+ var MultiWindowHangDetectionManager = exports.MultiWindowHangDetectionManager = /*#__PURE__*/function () {
73
+ function MultiWindowHangDetectionManager(callbacks, config) {
74
+ var _config$timeout, _config$enableVerbose;
75
+ (0, _classCallCheck2["default"])(this, MultiWindowHangDetectionManager);
76
+ (0, _defineProperty2["default"])(this, "windowStates", new Map());
77
+ (0, _defineProperty2["default"])(this, "logger", (0, _logger.getLogger)());
78
+ this.callbacks = callbacks;
79
+ this.config = {
80
+ timeout: (_config$timeout = config === null || config === void 0 ? void 0 : config.timeout) !== null && _config$timeout !== void 0 ? _config$timeout : _2.DEFAULT_HANG_DETECTION_TIMEOUT,
81
+ enableVerboseLogging: (_config$enableVerbose = config === null || config === void 0 ? void 0 : config.enableVerboseLogging) !== null && _config$enableVerbose !== void 0 ? _config$enableVerbose : true
82
+ };
83
+ }
84
+ return (0, _createClass2["default"])(MultiWindowHangDetectionManager, [{
85
+ key: "handleWindowUnresponsive",
86
+ value: function handleWindowUnresponsive(windowId) {
87
+ var _this = this;
88
+ this.logger.warn("Window ".concat(windowId, " became unresponsive, starting hang detection timer"));
89
+ this.clearWindowTimer(windowId);
90
+ var timer = setTimeout(function () {
91
+ _this.logger.error("Window ".concat(windowId, " has been unresponsive for ").concat(_this.config.timeout, "ms, triggering timeout callback"));
92
+ _this.callbacks.onHangTimeout(windowId);
93
+ }, this.config.timeout);
94
+ this.windowStates.set(windowId, {
95
+ windowId: windowId,
96
+ timer: timer,
97
+ isUnresponsive: true,
98
+ startTime: Date.now()
99
+ });
100
+ if (this.callbacks.onStateChange) {
101
+ this.callbacks.onStateChange(windowId, true);
102
+ }
103
+ if (this.config.enableVerboseLogging) {
104
+ this.logCurrentState();
105
+ }
106
+ }
107
+
108
+ /**
109
+ * 处理窗口变为responsive
110
+ */
111
+ }, {
112
+ key: "handleWindowResponsive",
113
+ value: function handleWindowResponsive(windowId) {
114
+ this.logger.info("Window ".concat(windowId, " became responsive again"));
115
+ var windowState = this.windowStates.get(windowId);
116
+ if (windowState) {
117
+ var duration = Date.now() - windowState.startTime;
118
+ this.logger.info("Window ".concat(windowId, " was unresponsive for ").concat(duration, "ms"));
119
+ this.clearWindowTimer(windowId);
120
+ if (this.callbacks.onStateChange) {
121
+ this.callbacks.onStateChange(windowId, false, duration);
122
+ }
123
+ this.windowStates["delete"](windowId);
124
+ }
125
+ if (this.config.enableVerboseLogging) {
126
+ this.logCurrentState();
127
+ }
128
+ }
129
+ }, {
130
+ key: "clearWindowTimer",
131
+ value: function clearWindowTimer(windowId) {
132
+ var windowState = this.windowStates.get(windowId);
133
+ if (windowState && windowState.timer) {
134
+ clearTimeout(windowState.timer);
135
+ windowState.timer = null;
136
+ }
137
+ }
138
+ }, {
139
+ key: "clearAllTimers",
140
+ value: function clearAllTimers() {
141
+ this.logger.info('Clearing all hang detection timers');
142
+ var _iterator = _createForOfIteratorHelper(this.windowStates),
143
+ _step;
144
+ try {
145
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
146
+ var _step$value = (0, _slicedToArray2["default"])(_step.value, 2),
147
+ _ = _step$value[0],
148
+ windowState = _step$value[1];
149
+ if (windowState.timer) {
150
+ clearTimeout(windowState.timer);
151
+ }
152
+ }
153
+ } catch (err) {
154
+ _iterator.e(err);
155
+ } finally {
156
+ _iterator.f();
157
+ }
158
+ this.windowStates.clear();
159
+ }
160
+ }, {
161
+ key: "getUnresponsiveWindowCount",
162
+ value: function getUnresponsiveWindowCount() {
163
+ return this.windowStates.size;
164
+ }
165
+ }, {
166
+ key: "getUnresponsiveWindowIds",
167
+ value: function getUnresponsiveWindowIds() {
168
+ return Array.from(this.windowStates.keys());
169
+ }
170
+ }, {
171
+ key: "getWindowHangState",
172
+ value: function getWindowHangState(windowId) {
173
+ return this.windowStates.get(windowId);
174
+ }
175
+ }, {
176
+ key: "isWindowUnresponsive",
177
+ value: function isWindowUnresponsive(windowId) {
178
+ return this.windowStates.has(windowId);
179
+ }
180
+ }, {
181
+ key: "getWindowUnresponsiveDuration",
182
+ value: function getWindowUnresponsiveDuration(windowId) {
183
+ var windowState = this.windowStates.get(windowId);
184
+ if (!windowState) {
185
+ return null;
186
+ }
187
+ return Date.now() - windowState.startTime;
188
+ }
189
+ }, {
190
+ key: "logCurrentState",
191
+ value: function logCurrentState() {
192
+ var unresponsiveCount = this.windowStates.size;
193
+ var windowIds = Array.from(this.windowStates.keys());
194
+ this.logger.info("Hang Detection State: ".concat(unresponsiveCount, " unresponsive windows [").concat(windowIds.join(', '), "]"));
195
+ }
196
+ }, {
197
+ key: "handleWindowClosed",
198
+ value: function handleWindowClosed(windowId) {
199
+ this.logger.info("Window ".concat(windowId, " closed, cleaning up hang detection state"));
200
+ var windowState = this.windowStates.get(windowId);
201
+ if (windowState) {
202
+ if (this.callbacks.onStateChange) {
203
+ var duration = Date.now() - windowState.startTime;
204
+ this.callbacks.onStateChange(windowId, false, duration);
205
+ }
206
+ }
207
+ this.clearWindowTimer(windowId);
208
+ this.windowStates["delete"](windowId);
209
+ if (this.config.enableVerboseLogging) {
210
+ this.logCurrentState();
211
+ }
212
+ }
213
+ }, {
214
+ key: "updateConfig",
215
+ value: function updateConfig(config) {
216
+ this.config = _objectSpread(_objectSpread({}, this.config), config);
217
+ this.logger.info("Hang detection config updated: ".concat(JSON.stringify(this.config)));
218
+ }
219
+ }, {
220
+ key: "getConfig",
221
+ value: function getConfig() {
222
+ return _objectSpread({}, this.config);
223
+ }
224
+ }, {
225
+ key: "dispose",
226
+ value: function dispose() {
227
+ this.logger.info('Disposing MultiWindowHangDetectionManager');
228
+ this.clearAllTimers();
229
+ }
230
+ }]);
231
+ }();
@@ -0,0 +1,14 @@
1
+ export interface WindowHangState {
2
+ windowId: number;
3
+ timer: NodeJS.Timeout | null;
4
+ isUnresponsive: boolean;
5
+ startTime: number;
6
+ }
7
+ export interface HangDetectionConfig {
8
+ timeout?: number;
9
+ enableVerboseLogging?: boolean;
10
+ }
11
+ export interface HangDetectionCallbacks {
12
+ onHangTimeout: (windowId: number) => void;
13
+ onStateChange?: (windowId: number, isUnresponsive: boolean, duration?: number) => void;
14
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.define-property.js");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
@@ -2,8 +2,7 @@ declare enum ServiceErrorCode {
2
2
  FcrUIScene = 800
3
3
  }
4
4
  declare enum UISceneErrorCode {
5
- Creator = 10,
6
- ProcessManager = 11
5
+ Creator = 10
7
6
  }
8
7
  declare enum DetailErrorCode {
9
8
  unknown = 1,
@@ -20,7 +19,6 @@ declare enum DetailErrorCode {
20
19
  mainWindowHidden = 82,
21
20
  closeWindowBeforeLaunchSuccess = 83,
22
21
  meetingLaunchProcessing = 84,
23
- mainWindowHiddenAfterLaunchSuccess = 85,
24
22
  crashed = 86,
25
23
  hangDetection = 87
26
24
  }
@@ -28,7 +26,6 @@ export declare const generaErrorCode: (serviceCode: ServiceErrorCode, uiSceneCod
28
26
  export declare const windowHideErrorCode: number;
29
27
  export declare const closeWindowBeforeLaunchSuccessErrorCode: number;
30
28
  export declare const meetingLaunchProcessingErrorCode: number;
31
- export declare const mainWindowHiddenOnLaunchSuccessErrorCode: number;
32
29
  export declare const crashedErrorCode: number;
33
30
  export declare const hangDetectionErrorCode: number;
34
31
  export {};
@@ -4,7 +4,7 @@ require("core-js/modules/es.object.define-property.js");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.windowHideErrorCode = exports.meetingLaunchProcessingErrorCode = exports.mainWindowHiddenOnLaunchSuccessErrorCode = exports.hangDetectionErrorCode = exports.generaErrorCode = exports.crashedErrorCode = exports.closeWindowBeforeLaunchSuccessErrorCode = void 0;
7
+ exports.windowHideErrorCode = exports.meetingLaunchProcessingErrorCode = exports.hangDetectionErrorCode = exports.generaErrorCode = exports.crashedErrorCode = exports.closeWindowBeforeLaunchSuccessErrorCode = void 0;
8
8
  // 错误代码枚举定义
9
9
  var ServiceErrorCode = /*#__PURE__*/function (ServiceErrorCode) {
10
10
  ServiceErrorCode[ServiceErrorCode["FcrUIScene"] = 800] = "FcrUIScene";
@@ -12,7 +12,6 @@ var ServiceErrorCode = /*#__PURE__*/function (ServiceErrorCode) {
12
12
  }(ServiceErrorCode || {});
13
13
  var UISceneErrorCode = /*#__PURE__*/function (UISceneErrorCode) {
14
14
  UISceneErrorCode[UISceneErrorCode["Creator"] = 10] = "Creator";
15
- UISceneErrorCode[UISceneErrorCode["ProcessManager"] = 11] = "ProcessManager";
16
15
  return UISceneErrorCode;
17
16
  }(UISceneErrorCode || {});
18
17
  var DetailErrorCode = /*#__PURE__*/function (DetailErrorCode) {
@@ -45,7 +44,7 @@ var DetailErrorCode = /*#__PURE__*/function (DetailErrorCode) {
45
44
  // 会议启动中
46
45
  DetailErrorCode[DetailErrorCode["meetingLaunchProcessing"] = 84] = "meetingLaunchProcessing";
47
46
  // 窗口在会议启动后隐藏
48
- DetailErrorCode[DetailErrorCode["mainWindowHiddenAfterLaunchSuccess"] = 85] = "mainWindowHiddenAfterLaunchSuccess";
47
+ // mainWindowHiddenAfterLaunchSuccess = 85,
49
48
  // 窗口崩溃
50
49
  DetailErrorCode[DetailErrorCode["crashed"] = 86] = "crashed";
51
50
  // 窗口无响应
@@ -58,6 +57,12 @@ var generaErrorCode = exports.generaErrorCode = function generaErrorCode(service
58
57
  var windowHideErrorCode = exports.windowHideErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.mainWindowHidden);
59
58
  var closeWindowBeforeLaunchSuccessErrorCode = exports.closeWindowBeforeLaunchSuccessErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.closeWindowBeforeLaunchSuccess);
60
59
  var meetingLaunchProcessingErrorCode = exports.meetingLaunchProcessingErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.meetingLaunchProcessing);
61
- var mainWindowHiddenOnLaunchSuccessErrorCode = exports.mainWindowHiddenOnLaunchSuccessErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.mainWindowHiddenAfterLaunchSuccess);
60
+
61
+ // export const mainWindowHiddenOnLaunchSuccessErrorCode = generaErrorCode(
62
+ // ServiceErrorCode.FcrUIScene,
63
+ // UISceneErrorCode.Creator,
64
+ // DetailErrorCode.mainWindowHiddenAfterLaunchSuccess,
65
+ // );
66
+
62
67
  var crashedErrorCode = exports.crashedErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.crashed);
63
68
  var hangDetectionErrorCode = exports.hangDetectionErrorCode = generaErrorCode(ServiceErrorCode.FcrUIScene, UISceneErrorCode.Creator, DetailErrorCode.hangDetection);
@@ -24,7 +24,7 @@ var ScreenShare = exports.ScreenShare = (0, _mobxReact.observer)(function (_ref)
24
24
  startScreenShare = _useContext.startScreenShare,
25
25
  localUserRole = _useContext.localUserRole,
26
26
  hasStartScreenSharePermission = _useContext.hasStartScreenSharePermission;
27
- var _useState = (0, _react.useState)(true),
27
+ var _useState = (0, _react.useState)(false),
28
28
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
29
29
  visibleMenu = _useState2[0],
30
30
  setMenuVisible = _useState2[1];
@@ -39,7 +39,9 @@ var WhiteboardSwitchTheme = function WhiteboardSwitchTheme(props) {
39
39
  },
40
40
  overlayOffset: 4,
41
41
  showArrow: false,
42
- getTooltipContainer: function getTooltipContainer() {
42
+ getTooltipContainer: function getTooltipContainer(_target) {
43
+ // window.document 是主窗口内的, 为了在子窗口中获取主窗口的 DOM 节点, 所以使用 _target.ownerDocument
44
+ var document = _target.ownerDocument || window.document;
43
45
  var target = document.getElementById('fcr-whiteboard-controlbar');
44
46
  return target;
45
47
  },
@@ -57,7 +59,7 @@ var WhiteboardSwitchTheme = function WhiteboardSwitchTheme(props) {
57
59
  return item.theme === theme.theme;
58
60
  });
59
61
  setTheme(result);
60
- setWhiteboardVisible(false);
62
+ setWhiteboardVisible(!whiteboardVisible);
61
63
  }
62
64
  }, theme.theme);
63
65
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -291,9 +291,7 @@ var WhiteboardControlbar = exports.WhiteboardControlbar = function WhiteboardCon
291
291
  className: "fcr-whiteboard-controlbar-item",
292
292
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_switchTheme["default"], {
293
293
  whiteboardVisible: showSwitchTheme,
294
- setWhiteboardVisible: function setWhiteboardVisible() {
295
- return setShowSwitchTheme(!showSwitchTheme);
296
- },
294
+ setWhiteboardVisible: setShowSwitchTheme,
297
295
  currentThemeType: currentTheme,
298
296
  setTheme: setTheme
299
297
  })
@@ -682,7 +682,6 @@ var ParticipantStoreBase = exports.ParticipantStoreBase = /*#__PURE__*/function
682
682
  }, {
683
683
  key: "setChatActiveTab",
684
684
  value: function setChatActiveTab(activeTab) {
685
- console.log('cjtest setChatActiveTab', activeTab);
686
685
  this._sharedChatDataSource.activeTab = activeTab;
687
686
  }
688
687
  }, {
@@ -43,6 +43,8 @@ Object.defineProperty(exports, "__esModule", {
43
43
  });
44
44
  exports["default"] = void 0;
45
45
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
46
+ require("core-js/modules/es.date.to-json.js");
47
+ require("core-js/modules/es.json.stringify.js");
46
48
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
47
49
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
48
50
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
@@ -193,6 +195,13 @@ var ElectronShareScreenStore = exports["default"] = /*#__PURE__*/function (_Shar
193
195
  this._isSharing = true;
194
196
  this._dialogProvider.closeDialog(_constant.FcrUIDialogKey.SHARE_SCREEN_SELECTION);
195
197
  var videoWindow = this._windowProvider.getWindowById(_constant.FcrUIDialogKey.VIDEO_WINDOW);
198
+ try {
199
+ if (!videoWindow.isVisible()) {
200
+ videoWindow.show();
201
+ }
202
+ } catch (e) {
203
+ this.logger.warn('share_screen _showControlBar error', JSON.stringify(e));
204
+ }
196
205
  videoWindow.setAlwaysOnTop(true, 'screen-saver', _levelConfig.WindowRelativeLevel.VIDEO_WINDOW_LEVEL);
197
206
  var isMultiDisplayActive = this._multiDisplayProvider.isActive;
198
207
  this._ensureWindowsAreOpenAndPositioned(true, isMultiDisplayActive);