@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.
Files changed (316) hide show
  1. package/.artifacts/screenshots/remote-mobile-config.png +0 -0
  2. package/.artifacts/screenshots/remote-mobile-home.png +0 -0
  3. package/.artifacts/screenshots/remote-mobile-preferences.png +0 -0
  4. package/.artifacts/screenshots/remote-mobile-server-info.png +0 -0
  5. package/.artifacts/screenshots/remote-mobile-vlc.png +0 -0
  6. package/.env.example +93 -0
  7. package/README.md +370 -0
  8. package/bin/remote-mouse.js +19 -0
  9. package/client/core/dom.js +148 -0
  10. package/client/core/init-socket-io.js +117 -0
  11. package/client/core/socket-emit.js +6 -0
  12. package/client/core/window-events.js +23 -0
  13. package/client/i18n/apply-page-translations.js +18 -0
  14. package/client/i18n/constants.js +3 -0
  15. package/client/i18n/core.js +40 -0
  16. package/client/i18n/locale-registry.js +77 -0
  17. package/client/i18n/locales/de.js +227 -0
  18. package/client/i18n/locales/en.js +389 -0
  19. package/client/i18n/locales/es.js +228 -0
  20. package/client/i18n/locales/fr.js +389 -0
  21. package/client/i18n/locales/it.js +227 -0
  22. package/client/i18n/locales/ja.js +227 -0
  23. package/client/i18n/locales/pt.js +227 -0
  24. package/client/i18n/locales/ru.js +240 -0
  25. package/client/i18n/locales/zh.js +227 -0
  26. package/client/preferences/constants.js +15 -0
  27. package/client/preferences/effects.js +24 -0
  28. package/client/preferences/load.js +19 -0
  29. package/client/preferences/render.js +26 -0
  30. package/client/preferences/rows.js +78 -0
  31. package/client/preferences/state.js +29 -0
  32. package/client/preview/create-preview-frame-receiver.js +13 -0
  33. package/client/preview/draw.js +77 -0
  34. package/client/preview/parse-preview-frame.js +39 -0
  35. package/client/preview/preview-stream.js +152 -0
  36. package/client/services/app-state/appStateKeys.js +30 -0
  37. package/client/services/app-state/createAppStateService.js +216 -0
  38. package/client/services/app-state/createPersistStoreService.js +122 -0
  39. package/client/services/app-state/createStateStoreService.js +64 -0
  40. package/client/services/app-state/localStorageBinding.js +26 -0
  41. package/client/services/app-state/normalizers.js +74 -0
  42. package/client/services/app-state/resolveEffectiveStateValue.js +58 -0
  43. package/client/services/app-state/stateDefinitions.js +107 -0
  44. package/client/services/backend/createBackendService.js +55 -0
  45. package/client/services/config/ConfigView.js +45 -0
  46. package/client/services/config/createClientConfigService.js +122 -0
  47. package/client/services/config/defaultClientConfig.js +22 -0
  48. package/client/services/createServicesContainer.js +48 -0
  49. package/client/services/createServicesRegistry.js +26 -0
  50. package/client/services/i18n/createI18nService.js +86 -0
  51. package/client/services/notifications/createNotificationService.js +56 -0
  52. package/client/services/pubsub/createPubSubService.js +20 -0
  53. package/client/services/remotes/createRemotesService.js +20 -0
  54. package/client/services/transport/createSocketIoTransportService.js +50 -0
  55. package/client/touch/bindTouchPassthrough.js +94 -0
  56. package/client/touch/createTouchList.js +18 -0
  57. package/client/touch/dispatchSyntheticTouch.js +20 -0
  58. package/client/touch/gesture-zone.js +28 -0
  59. package/client/touch/throttle.js +46 -0
  60. package/client/touch/touch-handlers.js +193 -0
  61. package/client/touch/touchpad.js +231 -0
  62. package/client/ui/config/page.js +840 -0
  63. package/client/ui/main/applyRemoteVisibilityState.js +60 -0
  64. package/client/ui/main/bind-client-notifications.js +3 -0
  65. package/client/ui/main/bindings/bindAccordion.js +121 -0
  66. package/client/ui/main/bindings/bindActionButtons.js +13 -0
  67. package/client/ui/main/bindings/bindAdminDrawer.js +137 -0
  68. package/client/ui/main/bindings/bindAdminRemoteButtons.js +77 -0
  69. package/client/ui/main/bindings/bindAdminVersion.js +27 -0
  70. package/client/ui/main/bindings/bindBrowserRemoteButtons.js +119 -0
  71. package/client/ui/main/bindings/bindRemoteAccordion.js +23 -0
  72. package/client/ui/main/bindings/bindSamsungRemoteButtons.js +320 -0
  73. package/client/ui/main/bindings/bindSystemRemoteButtons.js +41 -0
  74. package/client/ui/main/bindings/bindVlcRemoteButtons.js +64 -0
  75. package/client/ui/main/canvas-ui.js +33 -0
  76. package/client/ui/main/connection-overlay.js +57 -0
  77. package/client/ui/main/init-ui.js +54 -0
  78. package/client/ui/main/keyboard-panel.js +271 -0
  79. package/client/ui/main/mouse-buttons.js +94 -0
  80. package/client/ui/main/page.js +21 -0
  81. package/client/ui/notifications/show-toast.js +48 -0
  82. package/client/ui/preferences/bindPreferenceSwitchers.js +49 -0
  83. package/client/ui/preferences/page.js +61 -0
  84. package/client/ui/preferences/switchers.js +200 -0
  85. package/index.js +9 -0
  86. package/package.json +41 -0
  87. package/public/admin-config.css +447 -0
  88. package/public/admin-config.html +63 -0
  89. package/public/apple-touch-icon.png +0 -0
  90. package/public/brave-icon.svg +13 -0
  91. package/public/favicon.svg +30 -0
  92. package/public/icon-192.png +0 -0
  93. package/public/icon-512.png +0 -0
  94. package/public/index.html +246 -0
  95. package/public/manifest.webmanifest +45 -0
  96. package/public/preferences.html +55 -0
  97. package/public/server-info.html +574 -0
  98. package/public/styles.css +1042 -0
  99. package/public/sw.js +103 -0
  100. package/scripts/codex-commit.sh +112 -0
  101. package/scripts/generate-mobile-screenshots.mjs +244 -0
  102. package/scripts/install-linux.sh +633 -0
  103. package/scripts/install-windows.ps1 +369 -0
  104. package/server/application/createApplicationLifecycle.js +15 -0
  105. package/server/application/logger.js +216 -0
  106. package/server/application/shutdown.js +81 -0
  107. package/server/application/start.js +95 -0
  108. package/server/application/state.js +19 -0
  109. package/server/connection/api/admin-actions.router.js +65 -0
  110. package/server/connection/api/admin-configs.router.js +165 -0
  111. package/server/connection/api/admin-remotes.router.js +61 -0
  112. package/server/connection/api/admin-subs.router.js +49 -0
  113. package/server/connection/api/client.router.js +15 -0
  114. package/server/connection/api/configs.js +96 -0
  115. package/server/connection/api/qr-page.handler.js +17 -0
  116. package/server/connection/api/remotes.router.js +30 -0
  117. package/server/connection/api/server-info.router.js +149 -0
  118. package/server/connection/api/session.middleware.js +93 -0
  119. package/server/connection/api/unauthorized-response.js +73 -0
  120. package/server/connection/socket/createConnectionRegistrar.js +23 -0
  121. package/server/connection/socket/createSocketSessionAuthMiddleware.js +49 -0
  122. package/server/connection/socket/socket-action-responder.js +12 -0
  123. package/server/connection/socket/socket.timestamp-middleware.js +51 -0
  124. package/server/index.js +12 -0
  125. package/server/init/bootstrapApi.js +87 -0
  126. package/server/init/bootstrapSocket.js +79 -0
  127. package/server/init/createAdminApiRouter.js +22 -0
  128. package/server/init/createAdminUiRouter.js +21 -0
  129. package/server/init/createSocketActionRegistrars.js +52 -0
  130. package/server/init/observers/startConfigObserver.js +51 -0
  131. package/server/init/observers/startDisplaySizeObserver.js +55 -0
  132. package/server/init/observers/startNotificationObserver.js +49 -0
  133. package/server/init/observers/startQrOverlayHoverObserver.js +89 -0
  134. package/server/init/observers/startQrOverlayRefreshObserver.js +53 -0
  135. package/server/os/darwin/app.js +45 -0
  136. package/server/os/darwin/applescript.js +51 -0
  137. package/server/os/darwin/cliSocket.js +53 -0
  138. package/server/os/darwin/url.js +9 -0
  139. package/server/os/darwin/window.js +10 -0
  140. package/server/os/linux/app.js +120 -0
  141. package/server/os/linux/cliSocket.js +53 -0
  142. package/server/os/linux/process.js +69 -0
  143. package/server/os/linux/screen.js +58 -0
  144. package/server/os/linux/systemd.js +139 -0
  145. package/server/os/linux/url.js +17 -0
  146. package/server/os/linux/windows.js +144 -0
  147. package/server/os/win32/app.js +66 -0
  148. package/server/os/win32/cliSocket.js +15 -0
  149. package/server/os/win32/powershell.js +70 -0
  150. package/server/os/win32/process.js +20 -0
  151. package/server/os/win32/service.js +95 -0
  152. package/server/os/win32/url.js +9 -0
  153. package/server/os/win32/window.js +10 -0
  154. package/server/remotes/admin/createAdminEventGuardMiddleware.js +29 -0
  155. package/server/remotes/admin/createForceUpdateCheckAction.js +39 -0
  156. package/server/remotes/admin/createInstallUpdateAction.js +64 -0
  157. package/server/remotes/admin/createOpenQrBrowserAction.js +63 -0
  158. package/server/remotes/admin/createOpenServerInfoBrowserAction.js +58 -0
  159. package/server/remotes/admin/createRestartServiceAction.js +20 -0
  160. package/server/remotes/admin/createRotateEntryTokenAction.js +43 -0
  161. package/server/remotes/admin/createToggleQrOverlayAction.js +38 -0
  162. package/server/remotes/admin/index.js +32 -0
  163. package/server/remotes/admin/notifyIfRestarted.js +102 -0
  164. package/server/remotes/admin/registrar.js +94 -0
  165. package/server/remotes/browser/actions/createFocusOrLaunchBrowserAction.js +22 -0
  166. package/server/remotes/browser/actions/openUrlOnHost.js +3 -0
  167. package/server/remotes/browser/browserCatalog.js +70 -0
  168. package/server/remotes/browser/index.js +15 -0
  169. package/server/remotes/browser/listBrowsersOnHost.js +23 -0
  170. package/server/remotes/browser/registrar.js +29 -0
  171. package/server/remotes/browser/spec.js +18 -0
  172. package/server/remotes/browser/state.js +5 -0
  173. package/server/remotes/input/registrar.js +39 -0
  174. package/server/remotes/preview/bgraToRgbaBuffer.js +20 -0
  175. package/server/remotes/preview/captureAroundCursor.js +19 -0
  176. package/server/remotes/preview/createPreviewStreamer.js +85 -0
  177. package/server/remotes/preview/registrar.js +34 -0
  178. package/server/remotes/samsung/createSamsungCommandService.js +203 -0
  179. package/server/remotes/samsung/createSamsungRemote.js +26 -0
  180. package/server/remotes/samsung/createSamsungRemoteGetter.js +46 -0
  181. package/server/remotes/samsung/createSamsungTvGetter.js +102 -0
  182. package/server/remotes/samsung/device-config.js +122 -0
  183. package/server/remotes/samsung/registrar.js +59 -0
  184. package/server/remotes/samsung/utils.js +56 -0
  185. package/server/remotes/vlc/index.js +39 -0
  186. package/server/remotes/vlc/registrar.js +94 -0
  187. package/server/remotes/vlc/spec.js +15 -0
  188. package/server/remotes/vlc/state.js +5 -0
  189. package/server/remotes/window/index.js +6 -0
  190. package/server/remotes/window/registrar.js +28 -0
  191. package/server/services/application/createApplicationDaemonService.js +144 -0
  192. package/server/services/application/getDaemonServiceAdapter.js +56 -0
  193. package/server/services/application/utils.js +29 -0
  194. package/server/services/config/bootstrapConfig.js +38 -0
  195. package/server/services/config/configPaths.js +42 -0
  196. package/server/services/config/configSchema.js +297 -0
  197. package/server/services/config/configService.js +89 -0
  198. package/server/services/config/defaultConfig.js +137 -0
  199. package/server/services/config/envConfig.js +49 -0
  200. package/server/services/config/index.js +9 -0
  201. package/server/services/config/logConfig.js +54 -0
  202. package/server/services/config/system-config.js +44 -0
  203. package/server/services/createServicesContainer.js +94 -0
  204. package/server/services/createServicesRegistry.js +48 -0
  205. package/server/services/input/createInputController.js +17 -0
  206. package/server/services/input/createKeyboardController.js +146 -0
  207. package/server/services/input/createMouseController.js +182 -0
  208. package/server/services/notifier/createClientNotifier.js +23 -0
  209. package/server/services/notifier/createHostNotifier.js +41 -0
  210. package/server/services/notifier/createNotifier.js +13 -0
  211. package/server/services/notifier/createNotifierComposite.js +122 -0
  212. package/server/services/notifier/handleOpenQrBrowserEvent.js +40 -0
  213. package/server/services/notifier/handleOpenServerInfoBrowserEvent.js +40 -0
  214. package/server/services/notifier/handleRestartServiceEvent.js +37 -0
  215. package/server/services/notifier/handleRotateEntryTokenEvent.js +42 -0
  216. package/server/services/notifier/handleSessionEvent.js +24 -0
  217. package/server/services/notifier/handleToggleQrOverlayEvent.js +21 -0
  218. package/server/services/notifier/host-notifier/createLinuxHostNotifier.js +23 -0
  219. package/server/services/notifier/host-notifier/createNodeNotifierHostNotifier.js +24 -0
  220. package/server/services/notifier/host-notifier/index.js +11 -0
  221. package/server/services/notifier/mapper/handleForceUpdateCheckEvent.js +24 -0
  222. package/server/services/notifier/mapper/handleInstallUpdateEvent.js +53 -0
  223. package/server/services/notifier/mapper/handleSocketEvent.js +40 -0
  224. package/server/services/notifier/mapper/handleUpdateManagerEvent.js +24 -0
  225. package/server/services/notifier/mapper/notify.js +7 -0
  226. package/server/services/os/index.js +23 -0
  227. package/server/services/os/platforms/createFallbackAdapter.js +31 -0
  228. package/server/services/os/platforms/darwin/app.js +6 -0
  229. package/server/services/os/platforms/darwin/index.js +21 -0
  230. package/server/services/os/platforms/darwin/scripts.js +4 -0
  231. package/server/services/os/platforms/darwin/url.js +1 -0
  232. package/server/services/os/platforms/darwin/window.js +4 -0
  233. package/server/services/os/platforms/linux/app.js +6 -0
  234. package/server/services/os/platforms/linux/index.js +33 -0
  235. package/server/services/os/platforms/linux/url.js +1 -0
  236. package/server/services/os/platforms/linux/windows.js +11 -0
  237. package/server/services/os/platforms/win32/app.js +6 -0
  238. package/server/services/os/platforms/win32/index.js +21 -0
  239. package/server/services/os/platforms/win32/overlay.js +6 -0
  240. package/server/services/os/platforms/win32/powershell.js +4 -0
  241. package/server/services/os/platforms/win32/url.js +1 -0
  242. package/server/services/os/platforms/win32/window.js +4 -0
  243. package/server/services/os/shared.js +2 -0
  244. package/server/services/overlay/createNoopOverlay.js +13 -0
  245. package/server/services/overlay/createQrOverlay.js +27 -0
  246. package/server/services/overlay/createQrOverlayWin32.js +158 -0
  247. package/server/services/overlay/createQrOverlayYad.js +178 -0
  248. package/server/services/overlay/renderQrPage.js +82 -0
  249. package/server/services/persistence/createConfigDao.js +106 -0
  250. package/server/services/persistence/createDatabaseProvider.js +23 -0
  251. package/server/services/persistence/createEntryTokenDao.js +140 -0
  252. package/server/services/persistence/createRestartLogDao.js +210 -0
  253. package/server/services/persistence/index.js +19 -0
  254. package/server/services/pubsub/createEventStore.js +54 -0
  255. package/server/services/pubsub/createPubSub.js +89 -0
  256. package/server/services/pubsub/createServiceEvents.js +29 -0
  257. package/server/services/pubsub/serviceEventConstants.js +39 -0
  258. package/server/services/remotes/createRemotes.js +25 -0
  259. package/server/services/server/createHttpsServer.js +12 -0
  260. package/server/services/server/createServer.js +66 -0
  261. package/server/services/sse/createSseService.js +96 -0
  262. package/server/services/sse/utils.js +7 -0
  263. package/server/services/system/createSystemService.js +170 -0
  264. package/server/services/system/getNetworkInfo.js +18 -0
  265. package/server/services/system/getScreenInfo.js +32 -0
  266. package/server/services/system/listNetworkInterfaces.js +27 -0
  267. package/server/services/task-manager/createTaskManager.js +68 -0
  268. package/server/services/task-runner/createTaskRunner.js +114 -0
  269. package/server/services/token-manager/createTokenManager.js +244 -0
  270. package/server/services/token-manager/token-format.js +7 -0
  271. package/server/services/token-manager/token-store-utils.js +8 -0
  272. package/server/services/update-manager/CommandUpdateSource.js +70 -0
  273. package/server/services/update-manager/NpmUpdateSource.js +34 -0
  274. package/server/services/update-manager/buildNpmGlobalUpdateCommand.js +15 -0
  275. package/server/services/update-manager/chooseUpdateCheckSource.js +20 -0
  276. package/server/services/update-manager/chooseUpdateInstallSource.js +5 -0
  277. package/server/services/update-manager/createUpdateManager.js +109 -0
  278. package/server/services/update-manager/resolveInstallUpdateCommand.js +42 -0
  279. package/server/term/cli/executeLocalServiceCommand.js +42 -0
  280. package/server/term/cli/getCliSocketPath.js +5 -0
  281. package/server/term/cli/parseCliArgs.js +110 -0
  282. package/server/term/cli/printCliResult.js +18 -0
  283. package/server/term/cli/runCliCmd.js +50 -0
  284. package/server/term/cli/sendCliCommand.js +76 -0
  285. package/server/term/cliSocket.js +29 -0
  286. package/server/term/srv/commands/configCommand.js +84 -0
  287. package/server/term/srv/commands/helpCommand.js +6 -0
  288. package/server/term/srv/commands/infoCommand.js +7 -0
  289. package/server/term/srv/commands/openQrCommand.js +7 -0
  290. package/server/term/srv/commands/samsungDetectCommand.js +52 -0
  291. package/server/term/srv/commands/serviceCommand.js +25 -0
  292. package/server/term/srv/commands/systemConfigCommand.js +7 -0
  293. package/server/term/srv/commands/tasksCommand.js +24 -0
  294. package/server/term/srv/commands/tokensCommand.js +15 -0
  295. package/server/term/srv/executeCliCommand.js +44 -0
  296. package/server/term/srv/executeCliRequest.js +38 -0
  297. package/server/term/srv/startCliServer.js +140 -0
  298. package/server/utils/createRandomToken.js +11 -0
  299. package/server/utils/env.js +155 -0
  300. package/server/utils/git.js +13 -0
  301. package/server/utils/http.js +7 -0
  302. package/server/utils/network.js +45 -0
  303. package/server/utils/paths.js +10 -0
  304. package/server/utils/process.js +57 -0
  305. package/server/utils/robot.js +11 -0
  306. package/server/utils/semver.js +33 -0
  307. package/server/utils/truncateText.js +7 -0
  308. package/utils/createLazy.js +13 -0
  309. package/utils/functional.js +48 -0
  310. package/utils/math.js +26 -0
  311. package/utils/notificationSettings.js +61 -0
  312. package/utils/object.utils.js +79 -0
  313. package/utils/predicates.js +17 -0
  314. package/utils/remoteCommands.js +40 -0
  315. package/utils/sync.js +3 -0
  316. 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
+ }