fcr-ui-scene 3.7.7 → 3.7.8
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/installer/icons/icon.png +0 -0
- package/installer/mac/entitlements.mac.plist +5 -1
- package/lib/creator/provider-initializer.browser.js +2 -2
- package/lib/creator/provider-initializer.electron.js +2 -2
- package/lib/electron/bootstrap-sdk.js +70 -33
- package/lib/electron/hang-detection/index.d.ts +3 -0
- package/lib/electron/hang-detection/index.js +15 -0
- package/lib/electron/hang-detection/manager.d.ts +28 -0
- package/lib/electron/hang-detection/manager.js +231 -0
- package/lib/electron/hang-detection/types.d.ts +14 -0
- package/lib/electron/hang-detection/types.js +6 -0
- package/lib/electron/until.d.ts +1 -4
- package/lib/electron/until.js +9 -4
- package/lib/modules/action-bar/components/screen-share/index.electron.js +1 -1
- package/lib/modules/action-bar/index.d.ts +0 -2
- package/lib/modules/action-bar/index.js +1 -2
- package/lib/modules/action-bar/store.d.ts +3 -6
- package/lib/modules/action-bar/store.js +96 -53
- package/lib/modules/annotation/store.js +10 -9
- package/lib/modules/components/control-bar/components/switch-theme/index.js +4 -2
- package/lib/modules/components/control-bar/index.js +1 -3
- package/lib/modules/event-confirm/components/window/index.d.ts +2 -5
- package/lib/modules/event-confirm/components/window/index.js +14 -38
- package/lib/modules/event-confirm/store.d.ts +5 -10
- package/lib/modules/event-confirm/store.js +13 -62
- package/lib/modules/event-confirm/view.js +7 -9
- package/lib/modules/layout/store.js +22 -8
- package/lib/modules/participant/store.base.js +0 -1
- package/lib/modules/participant/store.js +12 -14
- package/lib/modules/share-screen/store.d.ts +1 -1
- package/lib/modules/share-screen/store.electron.js +9 -0
- package/lib/modules/share-screen/store.js +4 -14
- package/lib/modules/state-bar/store.base.electron.js +6 -2
- package/lib/providers/board-share/bar-control/base.d.ts +2 -0
- package/lib/providers/board-share/bar-control/base.js +13 -3
- package/lib/providers/board-share/bar-control/electron.d.ts +1 -0
- package/lib/providers/board-share/bar-control/electron.js +15 -4
- package/lib/providers/board-share/provider.base.d.ts +1 -0
- package/lib/providers/board-share/provider.base.js +3 -1
- package/lib/providers/board-share/provider.electron.d.ts +1 -0
- package/lib/providers/board-share/provider.electron.js +8 -2
- package/lib/providers/board-share/type.d.ts +2 -0
- package/lib/providers/dialog/provider.electron.js +10 -2
- package/lib/providers/screen-share/strategy/browser.js +50 -3
- package/lib/providers/screen-share/strategy/electron.js +77 -8
- package/lib/providers/screen-share/stream-state-sync.d.ts +3 -1
- package/lib/providers/screen-share/stream-state-sync.js +133 -40
- package/lib/providers/screen-share-provider.d.ts +7 -8
- package/lib/providers/screen-share-provider.js +70 -85
- package/lib/providers/sharing-provider.js +0 -7
- package/lib/providers/whiteboard-provider.js +0 -1
- package/lib/shared-data-source/confirm-data.d.ts +0 -19
- package/lib/shared-data-source/confirm-data.js +15 -119
- package/lib/shared-data-source/screen-share-data.d.ts +17 -10
- package/lib/shared-data-source/screen-share-data.js +16 -9
- package/lib/shared-data-source/whiteboard-data.d.ts +5 -7
- package/lib/shared-data-source/whiteboard-data.js +8 -9
- package/package.json +5 -5
package/installer/icons/icon.png
CHANGED
|
Binary file
|
|
@@ -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.
|
|
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
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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,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
|
+
}
|
package/lib/electron/until.d.ts
CHANGED
|
@@ -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 {};
|
package/lib/electron/until.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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)(
|
|
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];
|
|
@@ -21,7 +21,6 @@ import { FcrUISecuritySharedDataSource } from '../../shared-data-source/security
|
|
|
21
21
|
import { FcrUIScreenShareSharedDataSource } from '../../shared-data-source/screen-share-data';
|
|
22
22
|
import { FcrUIApplistProvider } from '../../providers/app-list-provider';
|
|
23
23
|
import { FcrUISharedApplistSource } from '../../shared-data-source/app-list-data';
|
|
24
|
-
import { FcrUISharedWhiteboardDataSource } from '../../shared-data-source/whiteboard-data';
|
|
25
24
|
export declare class FcrActionBarUIModule extends UIModule {
|
|
26
25
|
private _store?;
|
|
27
26
|
private _deviceControlStore?;
|
|
@@ -50,7 +49,6 @@ export declare class FcrActionBarUIModule extends UIModule {
|
|
|
50
49
|
sharedScreenShareSharedDataSource?: FcrUIScreenShareSharedDataSource;
|
|
51
50
|
applistProvider?: FcrUIApplistProvider;
|
|
52
51
|
sharedApplistDataSource?: FcrUISharedApplistSource;
|
|
53
|
-
sharedWhiteboardDataSource?: FcrUISharedWhiteboardDataSource;
|
|
54
52
|
onNodeWillActive(): void;
|
|
55
53
|
onNodeWillInactive(): void;
|
|
56
54
|
getComponent(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -70,8 +70,7 @@ var FcrActionBarUIModule = exports.FcrActionBarUIModule = /*#__PURE__*/function
|
|
|
70
70
|
sharedScreenShareSharedDataSource: this.sharedScreenShareSharedDataSource,
|
|
71
71
|
abilityProvider: this.abilityProvider,
|
|
72
72
|
applistProvider: this.applistProvider,
|
|
73
|
-
sharedApplistDataSource: this.sharedApplistDataSource
|
|
74
|
-
sharedWhiteboardDataSource: this.sharedWhiteboardDataSource
|
|
73
|
+
sharedApplistDataSource: this.sharedApplistDataSource
|
|
75
74
|
});
|
|
76
75
|
this._deviceControlStore = new _store2.DeviceControlStore((_this$currentRoomCont3 = this.currentRoomControlProvider) === null || _this$currentRoomCont3 === void 0 ? void 0 : _this$currentRoomCont3.currentRoomControl, this.deviceProvider, this.dialogProvider, this.deviceStreamProvider, this.sharedDevicePrivilegeDataSource);
|
|
77
76
|
this._leaveMeetingStore = new _store3.LeaveMeetingStore(privilegeProvider, this.roomProvider, (_this$currentRoomCont4 = this.currentRoomControlProvider) === null || _this$currentRoomCont4 === void 0 ? void 0 : _this$currentRoomCont4.currentRoomControl, this.sharedMemberDataSource, this.abilityProvider, this.dialogProvider);
|