@velor/remote-mouse 6.4.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/.artifacts/screenshots/remote-mobile-config.png +0 -0
- package/.artifacts/screenshots/remote-mobile-home.png +0 -0
- package/.artifacts/screenshots/remote-mobile-preferences.png +0 -0
- package/.artifacts/screenshots/remote-mobile-server-info.png +0 -0
- package/.artifacts/screenshots/remote-mobile-vlc.png +0 -0
- package/.env.example +93 -0
- package/README.md +370 -0
- package/bin/remote-mouse.js +19 -0
- package/client/core/dom.js +148 -0
- package/client/core/init-socket-io.js +117 -0
- package/client/core/socket-emit.js +6 -0
- package/client/core/window-events.js +23 -0
- package/client/i18n/apply-page-translations.js +18 -0
- package/client/i18n/constants.js +3 -0
- package/client/i18n/core.js +40 -0
- package/client/i18n/locale-registry.js +77 -0
- package/client/i18n/locales/de.js +227 -0
- package/client/i18n/locales/en.js +389 -0
- package/client/i18n/locales/es.js +228 -0
- package/client/i18n/locales/fr.js +389 -0
- package/client/i18n/locales/it.js +227 -0
- package/client/i18n/locales/ja.js +227 -0
- package/client/i18n/locales/pt.js +227 -0
- package/client/i18n/locales/ru.js +240 -0
- package/client/i18n/locales/zh.js +227 -0
- package/client/preferences/constants.js +15 -0
- package/client/preferences/effects.js +24 -0
- package/client/preferences/load.js +19 -0
- package/client/preferences/render.js +26 -0
- package/client/preferences/rows.js +78 -0
- package/client/preferences/state.js +29 -0
- package/client/preview/create-preview-frame-receiver.js +13 -0
- package/client/preview/draw.js +77 -0
- package/client/preview/parse-preview-frame.js +39 -0
- package/client/preview/preview-stream.js +152 -0
- package/client/services/app-state/appStateKeys.js +30 -0
- package/client/services/app-state/createAppStateService.js +216 -0
- package/client/services/app-state/createPersistStoreService.js +122 -0
- package/client/services/app-state/createStateStoreService.js +64 -0
- package/client/services/app-state/localStorageBinding.js +26 -0
- package/client/services/app-state/normalizers.js +74 -0
- package/client/services/app-state/resolveEffectiveStateValue.js +58 -0
- package/client/services/app-state/stateDefinitions.js +107 -0
- package/client/services/backend/createBackendService.js +55 -0
- package/client/services/config/ConfigView.js +45 -0
- package/client/services/config/createClientConfigService.js +122 -0
- package/client/services/config/defaultClientConfig.js +22 -0
- package/client/services/createServicesContainer.js +48 -0
- package/client/services/createServicesRegistry.js +26 -0
- package/client/services/i18n/createI18nService.js +86 -0
- package/client/services/notifications/createNotificationService.js +56 -0
- package/client/services/pubsub/createPubSubService.js +20 -0
- package/client/services/remotes/createRemotesService.js +20 -0
- package/client/services/transport/createSocketIoTransportService.js +50 -0
- package/client/touch/bindTouchPassthrough.js +94 -0
- package/client/touch/createTouchList.js +18 -0
- package/client/touch/dispatchSyntheticTouch.js +20 -0
- package/client/touch/gesture-zone.js +28 -0
- package/client/touch/throttle.js +46 -0
- package/client/touch/touch-handlers.js +193 -0
- package/client/touch/touchpad.js +231 -0
- package/client/ui/config/page.js +840 -0
- package/client/ui/main/applyRemoteVisibilityState.js +60 -0
- package/client/ui/main/bind-client-notifications.js +3 -0
- package/client/ui/main/bindings/bindAccordion.js +121 -0
- package/client/ui/main/bindings/bindActionButtons.js +13 -0
- package/client/ui/main/bindings/bindAdminDrawer.js +137 -0
- package/client/ui/main/bindings/bindAdminRemoteButtons.js +77 -0
- package/client/ui/main/bindings/bindAdminVersion.js +27 -0
- package/client/ui/main/bindings/bindBrowserRemoteButtons.js +119 -0
- package/client/ui/main/bindings/bindRemoteAccordion.js +23 -0
- package/client/ui/main/bindings/bindSamsungRemoteButtons.js +320 -0
- package/client/ui/main/bindings/bindSystemRemoteButtons.js +41 -0
- package/client/ui/main/bindings/bindVlcRemoteButtons.js +64 -0
- package/client/ui/main/canvas-ui.js +33 -0
- package/client/ui/main/connection-overlay.js +57 -0
- package/client/ui/main/init-ui.js +54 -0
- package/client/ui/main/keyboard-panel.js +271 -0
- package/client/ui/main/mouse-buttons.js +94 -0
- package/client/ui/main/page.js +21 -0
- package/client/ui/notifications/show-toast.js +48 -0
- package/client/ui/preferences/bindPreferenceSwitchers.js +49 -0
- package/client/ui/preferences/page.js +61 -0
- package/client/ui/preferences/switchers.js +200 -0
- package/index.js +9 -0
- package/package.json +41 -0
- package/public/admin-config.css +447 -0
- package/public/admin-config.html +63 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/brave-icon.svg +13 -0
- package/public/favicon.svg +30 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/index.html +246 -0
- package/public/manifest.webmanifest +45 -0
- package/public/preferences.html +55 -0
- package/public/server-info.html +574 -0
- package/public/styles.css +1042 -0
- package/public/sw.js +103 -0
- package/scripts/codex-commit.sh +112 -0
- package/scripts/generate-mobile-screenshots.mjs +244 -0
- package/scripts/install-linux.sh +633 -0
- package/scripts/install-windows.ps1 +369 -0
- package/server/application/createApplicationLifecycle.js +15 -0
- package/server/application/logger.js +216 -0
- package/server/application/shutdown.js +81 -0
- package/server/application/start.js +95 -0
- package/server/application/state.js +19 -0
- package/server/connection/api/admin-actions.router.js +65 -0
- package/server/connection/api/admin-configs.router.js +165 -0
- package/server/connection/api/admin-remotes.router.js +61 -0
- package/server/connection/api/admin-subs.router.js +49 -0
- package/server/connection/api/client.router.js +15 -0
- package/server/connection/api/configs.js +96 -0
- package/server/connection/api/qr-page.handler.js +17 -0
- package/server/connection/api/remotes.router.js +30 -0
- package/server/connection/api/server-info.router.js +149 -0
- package/server/connection/api/session.middleware.js +93 -0
- package/server/connection/api/unauthorized-response.js +73 -0
- package/server/connection/socket/createConnectionRegistrar.js +23 -0
- package/server/connection/socket/createSocketSessionAuthMiddleware.js +49 -0
- package/server/connection/socket/socket-action-responder.js +12 -0
- package/server/connection/socket/socket.timestamp-middleware.js +51 -0
- package/server/index.js +12 -0
- package/server/init/bootstrapApi.js +87 -0
- package/server/init/bootstrapSocket.js +79 -0
- package/server/init/createAdminApiRouter.js +22 -0
- package/server/init/createAdminUiRouter.js +21 -0
- package/server/init/createSocketActionRegistrars.js +52 -0
- package/server/init/observers/startConfigObserver.js +51 -0
- package/server/init/observers/startDisplaySizeObserver.js +55 -0
- package/server/init/observers/startNotificationObserver.js +49 -0
- package/server/init/observers/startQrOverlayHoverObserver.js +89 -0
- package/server/init/observers/startQrOverlayRefreshObserver.js +53 -0
- package/server/os/darwin/app.js +45 -0
- package/server/os/darwin/applescript.js +51 -0
- package/server/os/darwin/cliSocket.js +53 -0
- package/server/os/darwin/url.js +9 -0
- package/server/os/darwin/window.js +10 -0
- package/server/os/linux/app.js +120 -0
- package/server/os/linux/cliSocket.js +53 -0
- package/server/os/linux/process.js +69 -0
- package/server/os/linux/screen.js +58 -0
- package/server/os/linux/systemd.js +139 -0
- package/server/os/linux/url.js +17 -0
- package/server/os/linux/windows.js +144 -0
- package/server/os/win32/app.js +66 -0
- package/server/os/win32/cliSocket.js +15 -0
- package/server/os/win32/powershell.js +70 -0
- package/server/os/win32/process.js +20 -0
- package/server/os/win32/service.js +95 -0
- package/server/os/win32/url.js +9 -0
- package/server/os/win32/window.js +10 -0
- package/server/remotes/admin/createAdminEventGuardMiddleware.js +29 -0
- package/server/remotes/admin/createForceUpdateCheckAction.js +39 -0
- package/server/remotes/admin/createInstallUpdateAction.js +64 -0
- package/server/remotes/admin/createOpenQrBrowserAction.js +63 -0
- package/server/remotes/admin/createOpenServerInfoBrowserAction.js +58 -0
- package/server/remotes/admin/createRestartServiceAction.js +20 -0
- package/server/remotes/admin/createRotateEntryTokenAction.js +43 -0
- package/server/remotes/admin/createToggleQrOverlayAction.js +38 -0
- package/server/remotes/admin/index.js +32 -0
- package/server/remotes/admin/notifyIfRestarted.js +102 -0
- package/server/remotes/admin/registrar.js +94 -0
- package/server/remotes/browser/actions/createFocusOrLaunchBrowserAction.js +22 -0
- package/server/remotes/browser/actions/openUrlOnHost.js +3 -0
- package/server/remotes/browser/browserCatalog.js +70 -0
- package/server/remotes/browser/index.js +15 -0
- package/server/remotes/browser/listBrowsersOnHost.js +23 -0
- package/server/remotes/browser/registrar.js +29 -0
- package/server/remotes/browser/spec.js +18 -0
- package/server/remotes/browser/state.js +5 -0
- package/server/remotes/input/registrar.js +39 -0
- package/server/remotes/preview/bgraToRgbaBuffer.js +20 -0
- package/server/remotes/preview/captureAroundCursor.js +19 -0
- package/server/remotes/preview/createPreviewStreamer.js +85 -0
- package/server/remotes/preview/registrar.js +34 -0
- package/server/remotes/samsung/createSamsungCommandService.js +203 -0
- package/server/remotes/samsung/createSamsungRemote.js +26 -0
- package/server/remotes/samsung/createSamsungRemoteGetter.js +46 -0
- package/server/remotes/samsung/createSamsungTvGetter.js +102 -0
- package/server/remotes/samsung/device-config.js +122 -0
- package/server/remotes/samsung/registrar.js +59 -0
- package/server/remotes/samsung/utils.js +56 -0
- package/server/remotes/vlc/index.js +39 -0
- package/server/remotes/vlc/registrar.js +94 -0
- package/server/remotes/vlc/spec.js +15 -0
- package/server/remotes/vlc/state.js +5 -0
- package/server/remotes/window/index.js +6 -0
- package/server/remotes/window/registrar.js +28 -0
- package/server/services/application/createApplicationDaemonService.js +144 -0
- package/server/services/application/getDaemonServiceAdapter.js +56 -0
- package/server/services/application/utils.js +29 -0
- package/server/services/config/bootstrapConfig.js +38 -0
- package/server/services/config/configPaths.js +42 -0
- package/server/services/config/configSchema.js +297 -0
- package/server/services/config/configService.js +89 -0
- package/server/services/config/defaultConfig.js +137 -0
- package/server/services/config/envConfig.js +49 -0
- package/server/services/config/index.js +9 -0
- package/server/services/config/logConfig.js +54 -0
- package/server/services/config/system-config.js +44 -0
- package/server/services/createServicesContainer.js +94 -0
- package/server/services/createServicesRegistry.js +48 -0
- package/server/services/input/createInputController.js +17 -0
- package/server/services/input/createKeyboardController.js +146 -0
- package/server/services/input/createMouseController.js +182 -0
- package/server/services/notifier/createClientNotifier.js +23 -0
- package/server/services/notifier/createHostNotifier.js +41 -0
- package/server/services/notifier/createNotifier.js +13 -0
- package/server/services/notifier/createNotifierComposite.js +122 -0
- package/server/services/notifier/handleOpenQrBrowserEvent.js +40 -0
- package/server/services/notifier/handleOpenServerInfoBrowserEvent.js +40 -0
- package/server/services/notifier/handleRestartServiceEvent.js +37 -0
- package/server/services/notifier/handleRotateEntryTokenEvent.js +42 -0
- package/server/services/notifier/handleSessionEvent.js +24 -0
- package/server/services/notifier/handleToggleQrOverlayEvent.js +21 -0
- package/server/services/notifier/host-notifier/createLinuxHostNotifier.js +23 -0
- package/server/services/notifier/host-notifier/createNodeNotifierHostNotifier.js +24 -0
- package/server/services/notifier/host-notifier/index.js +11 -0
- package/server/services/notifier/mapper/handleForceUpdateCheckEvent.js +24 -0
- package/server/services/notifier/mapper/handleInstallUpdateEvent.js +53 -0
- package/server/services/notifier/mapper/handleSocketEvent.js +40 -0
- package/server/services/notifier/mapper/handleUpdateManagerEvent.js +24 -0
- package/server/services/notifier/mapper/notify.js +7 -0
- package/server/services/os/index.js +23 -0
- package/server/services/os/platforms/createFallbackAdapter.js +31 -0
- package/server/services/os/platforms/darwin/app.js +6 -0
- package/server/services/os/platforms/darwin/index.js +21 -0
- package/server/services/os/platforms/darwin/scripts.js +4 -0
- package/server/services/os/platforms/darwin/url.js +1 -0
- package/server/services/os/platforms/darwin/window.js +4 -0
- package/server/services/os/platforms/linux/app.js +6 -0
- package/server/services/os/platforms/linux/index.js +33 -0
- package/server/services/os/platforms/linux/url.js +1 -0
- package/server/services/os/platforms/linux/windows.js +11 -0
- package/server/services/os/platforms/win32/app.js +6 -0
- package/server/services/os/platforms/win32/index.js +21 -0
- package/server/services/os/platforms/win32/overlay.js +6 -0
- package/server/services/os/platforms/win32/powershell.js +4 -0
- package/server/services/os/platforms/win32/url.js +1 -0
- package/server/services/os/platforms/win32/window.js +4 -0
- package/server/services/os/shared.js +2 -0
- package/server/services/overlay/createNoopOverlay.js +13 -0
- package/server/services/overlay/createQrOverlay.js +27 -0
- package/server/services/overlay/createQrOverlayWin32.js +158 -0
- package/server/services/overlay/createQrOverlayYad.js +178 -0
- package/server/services/overlay/renderQrPage.js +82 -0
- package/server/services/persistence/createConfigDao.js +106 -0
- package/server/services/persistence/createDatabaseProvider.js +23 -0
- package/server/services/persistence/createEntryTokenDao.js +140 -0
- package/server/services/persistence/createRestartLogDao.js +210 -0
- package/server/services/persistence/index.js +19 -0
- package/server/services/pubsub/createEventStore.js +54 -0
- package/server/services/pubsub/createPubSub.js +89 -0
- package/server/services/pubsub/createServiceEvents.js +29 -0
- package/server/services/pubsub/serviceEventConstants.js +39 -0
- package/server/services/remotes/createRemotes.js +25 -0
- package/server/services/server/createHttpsServer.js +12 -0
- package/server/services/server/createServer.js +66 -0
- package/server/services/sse/createSseService.js +96 -0
- package/server/services/sse/utils.js +7 -0
- package/server/services/system/createSystemService.js +170 -0
- package/server/services/system/getNetworkInfo.js +18 -0
- package/server/services/system/getScreenInfo.js +32 -0
- package/server/services/system/listNetworkInterfaces.js +27 -0
- package/server/services/task-manager/createTaskManager.js +68 -0
- package/server/services/task-runner/createTaskRunner.js +114 -0
- package/server/services/token-manager/createTokenManager.js +244 -0
- package/server/services/token-manager/token-format.js +7 -0
- package/server/services/token-manager/token-store-utils.js +8 -0
- package/server/services/update-manager/CommandUpdateSource.js +70 -0
- package/server/services/update-manager/NpmUpdateSource.js +34 -0
- package/server/services/update-manager/buildNpmGlobalUpdateCommand.js +15 -0
- package/server/services/update-manager/chooseUpdateCheckSource.js +20 -0
- package/server/services/update-manager/chooseUpdateInstallSource.js +5 -0
- package/server/services/update-manager/createUpdateManager.js +109 -0
- package/server/services/update-manager/resolveInstallUpdateCommand.js +42 -0
- package/server/term/cli/executeLocalServiceCommand.js +42 -0
- package/server/term/cli/getCliSocketPath.js +5 -0
- package/server/term/cli/parseCliArgs.js +110 -0
- package/server/term/cli/printCliResult.js +18 -0
- package/server/term/cli/runCliCmd.js +50 -0
- package/server/term/cli/sendCliCommand.js +76 -0
- package/server/term/cliSocket.js +29 -0
- package/server/term/srv/commands/configCommand.js +84 -0
- package/server/term/srv/commands/helpCommand.js +6 -0
- package/server/term/srv/commands/infoCommand.js +7 -0
- package/server/term/srv/commands/openQrCommand.js +7 -0
- package/server/term/srv/commands/samsungDetectCommand.js +52 -0
- package/server/term/srv/commands/serviceCommand.js +25 -0
- package/server/term/srv/commands/systemConfigCommand.js +7 -0
- package/server/term/srv/commands/tasksCommand.js +24 -0
- package/server/term/srv/commands/tokensCommand.js +15 -0
- package/server/term/srv/executeCliCommand.js +44 -0
- package/server/term/srv/executeCliRequest.js +38 -0
- package/server/term/srv/startCliServer.js +140 -0
- package/server/utils/createRandomToken.js +11 -0
- package/server/utils/env.js +155 -0
- package/server/utils/git.js +13 -0
- package/server/utils/http.js +7 -0
- package/server/utils/network.js +45 -0
- package/server/utils/paths.js +10 -0
- package/server/utils/process.js +57 -0
- package/server/utils/robot.js +11 -0
- package/server/utils/semver.js +33 -0
- package/server/utils/truncateText.js +7 -0
- package/utils/createLazy.js +13 -0
- package/utils/functional.js +48 -0
- package/utils/math.js +26 -0
- package/utils/notificationSettings.js +61 -0
- package/utils/object.utils.js +79 -0
- package/utils/predicates.js +17 -0
- package/utils/remoteCommands.js +40 -0
- package/utils/sync.js +3 -0
- package/velor-remote-mouse-6.4.8.tgz +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {createLazy} from "../../utils/createLazy.js";
|
|
2
|
+
import {createLogger} from '../application/logger.js';
|
|
3
|
+
|
|
4
|
+
const log = createLogger('services:container');
|
|
5
|
+
|
|
6
|
+
function urlFactory(services) {
|
|
7
|
+
const {
|
|
8
|
+
getSystemConfig,
|
|
9
|
+
getServer,
|
|
10
|
+
getTokenManager
|
|
11
|
+
} = services;
|
|
12
|
+
|
|
13
|
+
const systemConfig = getSystemConfig();
|
|
14
|
+
const protocol = String(systemConfig?.protocol || 'http');
|
|
15
|
+
const port = Number(systemConfig?.port || 0);
|
|
16
|
+
const publicBaseUrl = getServer().basePublicUrl;
|
|
17
|
+
const localBaseUrl = `${protocol}://127.0.0.1:${port}`;
|
|
18
|
+
const tokenManager = getTokenManager();
|
|
19
|
+
const token = tokenManager.getToken() || tokenManager.createToken();
|
|
20
|
+
const entryPath = `/api/sessions/${token}`;
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
publicBaseUrl,
|
|
24
|
+
localBaseUrl,
|
|
25
|
+
entryUrl: `${publicBaseUrl}${entryPath}`,
|
|
26
|
+
qrUrl: `${publicBaseUrl}/qr`,
|
|
27
|
+
adminConfigUrl: `${publicBaseUrl}/ui/admin/config`,
|
|
28
|
+
serverInfoUrl: `${publicBaseUrl}/ui/admin/server-info`,
|
|
29
|
+
healthUrl: `${publicBaseUrl}/health`,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function createServicesContainer({
|
|
34
|
+
createSystemConfig,
|
|
35
|
+
createPersistence,
|
|
36
|
+
createOsService,
|
|
37
|
+
createSystemService,
|
|
38
|
+
createConfigService,
|
|
39
|
+
createSseService,
|
|
40
|
+
createEventStore,
|
|
41
|
+
createServiceEvents,
|
|
42
|
+
createTokenManager,
|
|
43
|
+
createRobot,
|
|
44
|
+
createNotifier,
|
|
45
|
+
createPubSub,
|
|
46
|
+
createTaskRunner,
|
|
47
|
+
createTaskManager,
|
|
48
|
+
createQrOverlay,
|
|
49
|
+
createUpdateManager,
|
|
50
|
+
createApplicationDaemonService,
|
|
51
|
+
createServer,
|
|
52
|
+
createInputController,
|
|
53
|
+
createRemotes
|
|
54
|
+
}) {
|
|
55
|
+
let robotInstance;
|
|
56
|
+
let qrOverlayInstance;
|
|
57
|
+
|
|
58
|
+
let container = {
|
|
59
|
+
// Lazy providers
|
|
60
|
+
getSystemConfig: createLazy(() => createSystemConfig(container)),
|
|
61
|
+
getPersistence: createLazy(() => createPersistence(container)),
|
|
62
|
+
getOs: createLazy(() => createOsService(container)),
|
|
63
|
+
getSystem: createLazy(() => createSystemService(container)),
|
|
64
|
+
getConfigService: createLazy(() => createConfigService(container)),
|
|
65
|
+
getConfig: () => container.getConfigService().getConfigs(),
|
|
66
|
+
getSseService: createLazy(() => createSseService(container)),
|
|
67
|
+
getEventStore: createLazy(() => createEventStore(container)),
|
|
68
|
+
getEvents: createLazy(() => createServiceEvents(container)),
|
|
69
|
+
getTokenManager: createLazy(() => createTokenManager(container)),
|
|
70
|
+
getNotifier: createLazy(() => createNotifier(container)),
|
|
71
|
+
getPubSub: createLazy(() => createPubSub(container)),
|
|
72
|
+
getTaskRunner: createLazy(() => createTaskRunner(container)),
|
|
73
|
+
getTaskManager: createLazy(() => createTaskManager(container)),
|
|
74
|
+
getServer: createLazy(() => createServer(container)),
|
|
75
|
+
getQrOverlay: () => qrOverlayInstance,
|
|
76
|
+
getUpdateManager: createLazy(() => createUpdateManager(container)),
|
|
77
|
+
getApplicationDaemonService: createLazy(() => createApplicationDaemonService(container)),
|
|
78
|
+
getUrls: () => urlFactory(container),
|
|
79
|
+
getInputController: createLazy(() => createInputController(container)),
|
|
80
|
+
getRemotes: createLazy(() => createRemotes(container)),
|
|
81
|
+
getRobot: () => robotInstance,
|
|
82
|
+
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
log.debug('Initialisation service robot');
|
|
86
|
+
robotInstance = await createRobot(container);
|
|
87
|
+
log.debug('Service robot initialise');
|
|
88
|
+
|
|
89
|
+
log.debug('Initialisation service QR overlay');
|
|
90
|
+
qrOverlayInstance = await createQrOverlay(container);
|
|
91
|
+
log.debug('Service QR overlay initialise');
|
|
92
|
+
|
|
93
|
+
return container;
|
|
94
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {createPersistence} from './persistence/index.js';
|
|
2
|
+
import {createServicesContainer,} from './createServicesContainer.js';
|
|
3
|
+
import {loadRobot} from '../utils/robot.js';
|
|
4
|
+
import {createServer} from "./server/createServer.js";
|
|
5
|
+
import {createInputController} from "./input/createInputController.js";
|
|
6
|
+
import {getSystemConfig} from "./config/index.js";
|
|
7
|
+
import {createConfigService} from "./config/configService.js";
|
|
8
|
+
import {createTokenManager} from "./token-manager/createTokenManager.js";
|
|
9
|
+
import {createNotifier} from "./notifier/createNotifier.js";
|
|
10
|
+
import {createTaskRunner} from './task-runner/createTaskRunner.js';
|
|
11
|
+
import {createTaskManager} from './task-manager/createTaskManager.js';
|
|
12
|
+
import {createUpdateManager} from "./update-manager/createUpdateManager.js";
|
|
13
|
+
import {createQrOverlay} from "./overlay/createQrOverlay.js";
|
|
14
|
+
import {createRemotes} from "./remotes/createRemotes.js";
|
|
15
|
+
import {createPubSub} from './pubsub/createPubSub.js';
|
|
16
|
+
import {createEventStore} from './pubsub/createEventStore.js';
|
|
17
|
+
import {createServiceEvents} from './pubsub/createServiceEvents.js';
|
|
18
|
+
import {createSseService} from './sse/createSseService.js';
|
|
19
|
+
import {createApplicationDaemonService} from './application/createApplicationDaemonService.js';
|
|
20
|
+
import {createOsService} from './os/index.js';
|
|
21
|
+
import {createSystemService} from './system/createSystemService.js';
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
export function createServicesRegistry() {
|
|
25
|
+
|
|
26
|
+
return createServicesContainer({
|
|
27
|
+
createSystemConfig: getSystemConfig,
|
|
28
|
+
createPersistence,
|
|
29
|
+
createOsService,
|
|
30
|
+
createSystemService,
|
|
31
|
+
createConfigService,
|
|
32
|
+
createSseService,
|
|
33
|
+
createEventStore,
|
|
34
|
+
createServiceEvents,
|
|
35
|
+
createTokenManager,
|
|
36
|
+
createRobot: loadRobot,
|
|
37
|
+
createNotifier,
|
|
38
|
+
createPubSub,
|
|
39
|
+
createTaskRunner,
|
|
40
|
+
createTaskManager,
|
|
41
|
+
createQrOverlay,
|
|
42
|
+
createUpdateManager,
|
|
43
|
+
createApplicationDaemonService,
|
|
44
|
+
createServer,
|
|
45
|
+
createInputController,
|
|
46
|
+
createRemotes
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {createKeyboardController} from './createKeyboardController.js';
|
|
2
|
+
import {createMouseController} from './createMouseController.js';
|
|
3
|
+
|
|
4
|
+
export function createInputController(services) {
|
|
5
|
+
|
|
6
|
+
const mouse = createMouseController(services);
|
|
7
|
+
const keyboard = createKeyboardController(services);
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
mouse,
|
|
11
|
+
keyboard,
|
|
12
|
+
updateConfig() {
|
|
13
|
+
mouse.updateConfig();
|
|
14
|
+
keyboard.updateConfig();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const ALLOWED_KEYS = new Set([
|
|
2
|
+
'enter',
|
|
3
|
+
'backspace',
|
|
4
|
+
'tab',
|
|
5
|
+
'space',
|
|
6
|
+
'escape',
|
|
7
|
+
'up',
|
|
8
|
+
'down',
|
|
9
|
+
'left',
|
|
10
|
+
'right',
|
|
11
|
+
'a',
|
|
12
|
+
'd',
|
|
13
|
+
'f',
|
|
14
|
+
'i',
|
|
15
|
+
'm',
|
|
16
|
+
'n',
|
|
17
|
+
'p',
|
|
18
|
+
's',
|
|
19
|
+
't',
|
|
20
|
+
'w',
|
|
21
|
+
'l',
|
|
22
|
+
'f5',
|
|
23
|
+
'f11',
|
|
24
|
+
'command',
|
|
25
|
+
]);
|
|
26
|
+
const ALLOWED_MODIFIERS = new Set(['control', 'shift', 'alt', 'command']);
|
|
27
|
+
const DEFAULT_KEYBOARD_DELAY_MS = 20;
|
|
28
|
+
|
|
29
|
+
function isDirectTypeSafe(character) {
|
|
30
|
+
return /^[a-zA-Z0-9 ]$/.test(character);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function typeUnicodeCharacter(robot, character) {
|
|
34
|
+
const codePoint = character.codePointAt(0);
|
|
35
|
+
if (!codePoint) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (process.platform !== 'linux') {
|
|
40
|
+
robot.typeString(character);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
robot.keyTap('u', ['control', 'shift']);
|
|
45
|
+
robot.typeString(codePoint.toString(16));
|
|
46
|
+
robot.keyTap('enter');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function createKeyboardController(servicesOrRobot) {
|
|
50
|
+
const getRobot = servicesOrRobot?.getRobot
|
|
51
|
+
? () => servicesOrRobot.getRobot()
|
|
52
|
+
: () => servicesOrRobot;
|
|
53
|
+
let keyboardConfigured = false;
|
|
54
|
+
|
|
55
|
+
function configureKeyboard(robot) {
|
|
56
|
+
if (keyboardConfigured) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (typeof robot?.setKeyboardDelay === 'function') {
|
|
61
|
+
robot.setKeyboardDelay(DEFAULT_KEYBOARD_DELAY_MS);
|
|
62
|
+
}
|
|
63
|
+
keyboardConfigured = true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function enqueue(task) {
|
|
67
|
+
const robot = getRobot();
|
|
68
|
+
configureKeyboard(robot);
|
|
69
|
+
return task(robot);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function typeText(text) {
|
|
73
|
+
if (!text || typeof text !== 'string') {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return enqueue((robot) => {
|
|
78
|
+
let directBuffer = '';
|
|
79
|
+
for (const character of Array.from(text)) {
|
|
80
|
+
if (character === '\n') {
|
|
81
|
+
if (directBuffer) {
|
|
82
|
+
robot.typeString(directBuffer);
|
|
83
|
+
directBuffer = '';
|
|
84
|
+
}
|
|
85
|
+
robot.keyTap('enter');
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (character === '\t') {
|
|
90
|
+
if (directBuffer) {
|
|
91
|
+
robot.typeString(directBuffer);
|
|
92
|
+
directBuffer = '';
|
|
93
|
+
}
|
|
94
|
+
robot.keyTap('tab');
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (isDirectTypeSafe(character)) {
|
|
99
|
+
directBuffer += character;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (directBuffer) {
|
|
104
|
+
robot.typeString(directBuffer);
|
|
105
|
+
directBuffer = '';
|
|
106
|
+
}
|
|
107
|
+
typeUnicodeCharacter(robot, character);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (directBuffer) {
|
|
111
|
+
robot.typeString(directBuffer);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function pressSpecialKey(key, modifiers = []) {
|
|
117
|
+
if (!ALLOWED_KEYS.has(key)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return enqueue((robot) => {
|
|
122
|
+
if (!Array.isArray(modifiers) || modifiers.length === 0) {
|
|
123
|
+
robot.keyTap(key);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const sanitizedModifiers = modifiers
|
|
128
|
+
.filter((value) => typeof value === 'string')
|
|
129
|
+
.filter((value) => ALLOWED_MODIFIERS.has(value));
|
|
130
|
+
|
|
131
|
+
if (sanitizedModifiers.length > 0) {
|
|
132
|
+
robot.keyTap(key, sanitizedModifiers);
|
|
133
|
+
} else {
|
|
134
|
+
robot.keyTap(key);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
typeText,
|
|
141
|
+
pressSpecialKey,
|
|
142
|
+
updateConfig() {
|
|
143
|
+
// noOp
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {clamp} from '../../../utils/math.js';
|
|
2
|
+
import {DEFAULT_PERSISTED_CONFIG} from '../config/defaultConfig.js';
|
|
3
|
+
|
|
4
|
+
export function createMouseController(services) {
|
|
5
|
+
const {
|
|
6
|
+
getConfig
|
|
7
|
+
} = services;
|
|
8
|
+
|
|
9
|
+
let scrollRemainder = 0;
|
|
10
|
+
let pressedButton = '';
|
|
11
|
+
let lastScreenSize = null;
|
|
12
|
+
let screenSizeOverride = null;
|
|
13
|
+
|
|
14
|
+
function getInputConfig() {
|
|
15
|
+
return getConfig().input || DEFAULT_PERSISTED_CONFIG.input;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getScreenSize(screen) {
|
|
19
|
+
const width = Number(screen?.width);
|
|
20
|
+
const height = Number(screen?.height);
|
|
21
|
+
const normalizedWidth = Number.isFinite(width) && width > 0 ? Math.round(width) : 1;
|
|
22
|
+
const normalizedHeight = Number.isFinite(height) && height > 0 ? Math.round(height) : 1;
|
|
23
|
+
return {
|
|
24
|
+
width: normalizedWidth,
|
|
25
|
+
height: normalizedHeight,
|
|
26
|
+
maxX: getMaxCoordinate(normalizedWidth),
|
|
27
|
+
maxY: getMaxCoordinate(normalizedHeight),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getMaxCoordinate(size) {
|
|
32
|
+
const value = Number(size);
|
|
33
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
return Math.max(0, Math.round(value) - 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getCoordinate(value) {
|
|
40
|
+
const coordinate = Number(value);
|
|
41
|
+
return Number.isFinite(coordinate) ? coordinate : 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function hasScreenSizeChanged(a, b) {
|
|
45
|
+
return Boolean(a && b && (a.width !== b.width || a.height !== b.height));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function scaleCoordinate(coordinate, previousMax, nextMax) {
|
|
49
|
+
if (previousMax <= 0) {
|
|
50
|
+
return clamp(Math.round(coordinate), 0, nextMax);
|
|
51
|
+
}
|
|
52
|
+
return clamp(Math.round((coordinate / previousMax) * nextMax), 0, nextMax);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getCurrentPosition(current, screenSize) {
|
|
56
|
+
if (hasScreenSizeChanged(lastScreenSize, screenSize)) {
|
|
57
|
+
return {
|
|
58
|
+
x: scaleCoordinate(
|
|
59
|
+
clamp(Math.round(getCoordinate(current.x)), 0, lastScreenSize.maxX),
|
|
60
|
+
lastScreenSize.maxX,
|
|
61
|
+
screenSize.maxX,
|
|
62
|
+
),
|
|
63
|
+
y: scaleCoordinate(
|
|
64
|
+
clamp(Math.round(getCoordinate(current.y)), 0, lastScreenSize.maxY),
|
|
65
|
+
lastScreenSize.maxY,
|
|
66
|
+
screenSize.maxY,
|
|
67
|
+
),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
x: clamp(Math.round(getCoordinate(current.x)), 0, screenSize.maxX),
|
|
73
|
+
y: clamp(Math.round(getCoordinate(current.y)), 0, screenSize.maxY),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function rememberScreenSize(screenSize) {
|
|
78
|
+
lastScreenSize = {
|
|
79
|
+
width: screenSize.width,
|
|
80
|
+
height: screenSize.height,
|
|
81
|
+
maxX: screenSize.maxX,
|
|
82
|
+
maxY: screenSize.maxY,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function getActiveScreenSize() {
|
|
87
|
+
if (screenSizeOverride || lastScreenSize) {
|
|
88
|
+
return getScreenSize(screenSizeOverride || lastScreenSize);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return getScreenSize(await services.getSystem().getScreenInfo());
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function setScreenSizeOverride(screen) {
|
|
95
|
+
screenSizeOverride = getScreenSize(screen);
|
|
96
|
+
rememberScreenSize(screenSizeOverride);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function move(dx, dy) {
|
|
100
|
+
const robot = services.getRobot();
|
|
101
|
+
const inputConfig = getInputConfig();
|
|
102
|
+
const mouseSpeed = Number(inputConfig.mouseSpeed) || DEFAULT_PERSISTED_CONFIG.input.mouseSpeed;
|
|
103
|
+
const screenSize = await getActiveScreenSize();
|
|
104
|
+
const current = robot.getMousePos();
|
|
105
|
+
const position = getCurrentPosition(current, screenSize);
|
|
106
|
+
rememberScreenSize(screenSize);
|
|
107
|
+
const nextX = clamp(Math.round(position.x + dx * mouseSpeed), 0, screenSize.maxX);
|
|
108
|
+
const nextY = clamp(Math.round(position.y + dy * mouseSpeed), 0, screenSize.maxY);
|
|
109
|
+
if (pressedButton === 'left' && typeof robot.dragMouse === 'function') {
|
|
110
|
+
robot.dragMouse(nextX, nextY);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
robot.moveMouse(nextX, nextY);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function remapToScreenSize(previousScreen, nextScreen) {
|
|
117
|
+
const robot = services.getRobot();
|
|
118
|
+
const previousScreenSize = getScreenSize(previousScreen);
|
|
119
|
+
const nextScreenSize = getScreenSize(nextScreen);
|
|
120
|
+
const current = robot.getMousePos();
|
|
121
|
+
const nextX = scaleCoordinate(
|
|
122
|
+
clamp(Math.round(getCoordinate(current.x)), 0, previousScreenSize.maxX),
|
|
123
|
+
previousScreenSize.maxX,
|
|
124
|
+
nextScreenSize.maxX,
|
|
125
|
+
);
|
|
126
|
+
const nextY = scaleCoordinate(
|
|
127
|
+
clamp(Math.round(getCoordinate(current.y)), 0, previousScreenSize.maxY),
|
|
128
|
+
previousScreenSize.maxY,
|
|
129
|
+
nextScreenSize.maxY,
|
|
130
|
+
);
|
|
131
|
+
screenSizeOverride = nextScreenSize;
|
|
132
|
+
rememberScreenSize(nextScreenSize);
|
|
133
|
+
robot.moveMouse(nextX, nextY);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function scroll(deltaY) {
|
|
137
|
+
const robot = services.getRobot();
|
|
138
|
+
const inputConfig = getInputConfig();
|
|
139
|
+
const scrollSpeed = Number(inputConfig.scrollSpeed) || DEFAULT_PERSISTED_CONFIG.input.scrollSpeed;
|
|
140
|
+
const total = -deltaY * scrollSpeed + scrollRemainder;
|
|
141
|
+
const amount = total > 0 ? Math.floor(total) : Math.ceil(total);
|
|
142
|
+
scrollRemainder = total - amount;
|
|
143
|
+
if (amount !== 0) {
|
|
144
|
+
robot.scrollMouse(0, amount);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function click(button) {
|
|
149
|
+
const robot = services.getRobot();
|
|
150
|
+
const mouseButton = button === 'right' ? 'right' : 'left';
|
|
151
|
+
robot.mouseClick(mouseButton);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function setButtonState(button, state) {
|
|
155
|
+
const robot = services.getRobot();
|
|
156
|
+
const mouseButton = button === 'right' ? 'right' : 'left';
|
|
157
|
+
const nextState = state === 'down' ? 'down' : 'up';
|
|
158
|
+
if (typeof robot.mouseToggle === 'function') {
|
|
159
|
+
robot.mouseToggle(nextState, mouseButton);
|
|
160
|
+
} else if (nextState === 'up') {
|
|
161
|
+
robot.mouseClick(mouseButton);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (nextState === 'down') {
|
|
165
|
+
pressedButton = mouseButton;
|
|
166
|
+
} else if (pressedButton === mouseButton) {
|
|
167
|
+
pressedButton = '';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
move,
|
|
173
|
+
scroll,
|
|
174
|
+
click,
|
|
175
|
+
setButtonState,
|
|
176
|
+
remapToScreenSize,
|
|
177
|
+
setScreenSizeOverride,
|
|
178
|
+
updateConfig() {
|
|
179
|
+
return getInputConfig();
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {NOTIFIER_TARGET_ALL_CLIENTS, NOTIFIER_TARGET_CLIENT} from './createNotifierComposite.js';
|
|
2
|
+
import {createLogger} from '../../application/logger.js';
|
|
3
|
+
|
|
4
|
+
export function createClientNotifier(services) {
|
|
5
|
+
const log = createLogger('notifier:client');
|
|
6
|
+
return {
|
|
7
|
+
notify(payload, options = {}) {
|
|
8
|
+
const scope = String(options.scope || NOTIFIER_TARGET_ALL_CLIENTS);
|
|
9
|
+
const clientId = String(options.clientId || '').trim();
|
|
10
|
+
|
|
11
|
+
if (scope === NOTIFIER_TARGET_CLIENT) {
|
|
12
|
+
if (!clientId) {
|
|
13
|
+
log.warn('Notification ciblée client ignorée: clientId manquant');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
services.getServer().io.to(clientId).emit('notification', payload);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
services.getServer().io.emit('notification', payload);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {createHostNotifierByPlatform} from './host-notifier/index.js';
|
|
2
|
+
import {en} from '../../../client/i18n/locales/en.js';
|
|
3
|
+
import {fr} from '../../../client/i18n/locales/fr.js';
|
|
4
|
+
|
|
5
|
+
function interpolate(template, params = {}) {
|
|
6
|
+
return String(template || '').replace(/\{(\w+)\}/g, (_match, key) => String(params[key] ?? ''));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getHostNotificationDictionary() {
|
|
10
|
+
return String(process.env.LANG || '').toLowerCase().startsWith('fr') ? fr : en;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function translateNotificationPayload(payload = {}) {
|
|
14
|
+
const dictionary = getHostNotificationDictionary();
|
|
15
|
+
const params = payload.params && typeof payload.params === 'object' ? payload.params : {};
|
|
16
|
+
const titleTemplate = payload.titleKey ? dictionary[payload.titleKey] : '';
|
|
17
|
+
const messageTemplate = payload.messageKey ? dictionary[payload.messageKey] : '';
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
...payload,
|
|
21
|
+
title: titleTemplate ? interpolate(titleTemplate, params) : payload.title,
|
|
22
|
+
message: messageTemplate ? interpolate(messageTemplate, params) : payload.message,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function createHostNotifier(services) {
|
|
27
|
+
let platformNotifier = null;
|
|
28
|
+
|
|
29
|
+
function getPlatformNotifier() {
|
|
30
|
+
if (!platformNotifier) {
|
|
31
|
+
platformNotifier = createHostNotifierByPlatform();
|
|
32
|
+
}
|
|
33
|
+
return platformNotifier;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
notify(payload) {
|
|
38
|
+
getPlatformNotifier().notify(translateNotificationPayload(payload));
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createClientNotifier } from './createClientNotifier.js';
|
|
2
|
+
import { createHostNotifier } from './createHostNotifier.js';
|
|
3
|
+
import { createNotifierComposite } from './createNotifierComposite.js';
|
|
4
|
+
|
|
5
|
+
export function createNotifier(services) {
|
|
6
|
+
const clientNotifier = createClientNotifier(services);
|
|
7
|
+
const serverNotifier = createHostNotifier(services);
|
|
8
|
+
return createNotifierComposite({
|
|
9
|
+
clientNotifier,
|
|
10
|
+
serverNotifier,
|
|
11
|
+
getNotificationsConfig: () => services.getConfig().notifications,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {DEFAULT_PERSISTED_CONFIG} from '../config/defaultConfig.js';
|
|
2
|
+
import {createLogger} from '../../application/logger.js';
|
|
3
|
+
import {
|
|
4
|
+
isNotificationTargetEnabled,
|
|
5
|
+
NOTIFICATION_TARGET_CLIENT as CONFIG_NOTIFICATION_TARGET_CLIENT,
|
|
6
|
+
NOTIFICATION_TARGET_HOST as CONFIG_NOTIFICATION_TARGET_HOST,
|
|
7
|
+
} from '../../../utils/notificationSettings.js';
|
|
8
|
+
|
|
9
|
+
let log;
|
|
10
|
+
function getModuleLog() {
|
|
11
|
+
log ??= createLogger('notifier:composite');
|
|
12
|
+
return log;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const NOTIFIER_TARGET_ALL = 'all';
|
|
16
|
+
export const NOTIFIER_TARGET_ALL_CLIENTS = 'all-clients';
|
|
17
|
+
export const NOTIFIER_TARGET_CLIENT = 'client';
|
|
18
|
+
export const NOTIFIER_TARGET_SERVER = 'server';
|
|
19
|
+
export const NOTIFIER_TARGET_NONE = 'none';
|
|
20
|
+
export const NOTIFIER_TARGETS = [
|
|
21
|
+
NOTIFIER_TARGET_ALL,
|
|
22
|
+
NOTIFIER_TARGET_ALL_CLIENTS,
|
|
23
|
+
NOTIFIER_TARGET_CLIENT,
|
|
24
|
+
NOTIFIER_TARGET_SERVER,
|
|
25
|
+
NOTIFIER_TARGET_NONE,
|
|
26
|
+
];
|
|
27
|
+
export const NOTIFIER_LEVEL_INFO = 'info';
|
|
28
|
+
export const NOTIFIER_LEVEL_WARNING = 'warning';
|
|
29
|
+
export const NOTIFIER_LEVEL_ERROR = 'error';
|
|
30
|
+
export const NOTIFIER_LEVELS = [
|
|
31
|
+
NOTIFIER_LEVEL_INFO,
|
|
32
|
+
NOTIFIER_LEVEL_WARNING,
|
|
33
|
+
NOTIFIER_LEVEL_ERROR,
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
export function createNotifierComposite({clientNotifier, serverNotifier, getNotificationsConfig}) {
|
|
37
|
+
const log = getModuleLog();
|
|
38
|
+
function getDefaultTtlMs() {
|
|
39
|
+
return getNotificationsConfig?.()?.ttlMs
|
|
40
|
+
?? DEFAULT_PERSISTED_CONFIG.notifications.ttlMs;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function shouldNotifyTarget(notificationsConfig, notificationId, target) {
|
|
44
|
+
if (!notificationId) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return isNotificationTargetEnabled(notificationsConfig, notificationId, target);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function createTargetNotifier(selectedTarget) {
|
|
51
|
+
return {
|
|
52
|
+
notify({
|
|
53
|
+
title = 'Remote Mouse',
|
|
54
|
+
notificationId,
|
|
55
|
+
titleKey,
|
|
56
|
+
message,
|
|
57
|
+
messageKey,
|
|
58
|
+
params,
|
|
59
|
+
level = NOTIFIER_LEVEL_INFO,
|
|
60
|
+
ttlMs = getDefaultTtlMs(),
|
|
61
|
+
} = {}, options = {}) {
|
|
62
|
+
if (!message && !messageKey) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const safeTtlMs = Math.max(500, Math.round(ttlMs));
|
|
67
|
+
const payload = {
|
|
68
|
+
title,
|
|
69
|
+
titleKey,
|
|
70
|
+
message,
|
|
71
|
+
messageKey,
|
|
72
|
+
params,
|
|
73
|
+
level,
|
|
74
|
+
ttlMs: safeTtlMs,
|
|
75
|
+
createdAt: Date.now(),
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const resolvedTarget = String(selectedTarget ?? NOTIFIER_TARGET_ALL).toLowerCase();
|
|
79
|
+
const clientId = options.clientId;
|
|
80
|
+
const notificationsConfig = getNotificationsConfig?.() || DEFAULT_PERSISTED_CONFIG.notifications;
|
|
81
|
+
const shouldNotifyClient = shouldNotifyTarget(
|
|
82
|
+
notificationsConfig,
|
|
83
|
+
notificationId,
|
|
84
|
+
CONFIG_NOTIFICATION_TARGET_CLIENT,
|
|
85
|
+
);
|
|
86
|
+
const shouldNotifyHost = shouldNotifyTarget(
|
|
87
|
+
notificationsConfig,
|
|
88
|
+
notificationId,
|
|
89
|
+
CONFIG_NOTIFICATION_TARGET_HOST,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
if ((resolvedTarget === NOTIFIER_TARGET_ALL ||
|
|
93
|
+
resolvedTarget === NOTIFIER_TARGET_ALL_CLIENTS ||
|
|
94
|
+
resolvedTarget === NOTIFIER_TARGET_CLIENT) && clientNotifier && shouldNotifyClient) {
|
|
95
|
+
clientNotifier.notify(payload, {
|
|
96
|
+
scope: resolvedTarget === NOTIFIER_TARGET_CLIENT ?
|
|
97
|
+
NOTIFIER_TARGET_CLIENT : NOTIFIER_TARGET_ALL_CLIENTS,
|
|
98
|
+
clientId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if ((resolvedTarget === NOTIFIER_TARGET_ALL ||
|
|
103
|
+
resolvedTarget === NOTIFIER_TARGET_SERVER) && serverNotifier && shouldNotifyHost) {
|
|
104
|
+
serverNotifier.notify(payload);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!NOTIFIER_TARGETS.includes(resolvedTarget)) {
|
|
108
|
+
log.warn({target: resolvedTarget}, 'Target de notification inconnu');
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
target(target = NOTIFIER_TARGET_ALL) {
|
|
116
|
+
return createTargetNotifier(target);
|
|
117
|
+
},
|
|
118
|
+
notify(args) {
|
|
119
|
+
return this.target(args.target).notify(args);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|