@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,297 @@
1
+ import { getNotificationPaths } from '../../../utils/notificationSettings.js';
2
+ import { BROWSER_CATALOG } from '../../remotes/browser/browserCatalog.js';
3
+
4
+ const BROWSER_CONFIG_FIELDS = Object.fromEntries(
5
+ BROWSER_CATALOG.map((browser) => [browser.id, {
6
+ label: browser.name,
7
+ type: 'boolean',
8
+ }]),
9
+ );
10
+
11
+ export const CONFIG_SCHEMA = {
12
+ input: {
13
+ title: 'Souris et entree',
14
+ description: 'Parametres de sensibilite pour le pointeur et le scroll.',
15
+ fields: {
16
+ mouseSpeed: {
17
+ label: 'Vitesse souris',
18
+ type: 'number',
19
+ min: 0.1,
20
+ max: 10,
21
+ step: 0.1,
22
+ },
23
+ scrollSpeed: {
24
+ label: 'Vitesse scroll',
25
+ type: 'number',
26
+ min: 0.05,
27
+ max: 5,
28
+ step: 0.05,
29
+ },
30
+ touchDragHoldMs: {
31
+ label: 'Delai drag tactile (ms)',
32
+ type: 'integer',
33
+ min: 100,
34
+ max: 1500,
35
+ step: 10,
36
+ },
37
+ touchDragStillDistancePx: {
38
+ label: 'Tolerance immobile drag tactile (px)',
39
+ type: 'integer',
40
+ min: 1,
41
+ max: 40,
42
+ step: 1,
43
+ },
44
+ },
45
+ },
46
+ browser: {
47
+ title: 'Navigateur',
48
+ description: 'Active ou masque la remote navigateur pour tous les clients.',
49
+ fields: {
50
+ enabled: {
51
+ label: 'Activer la remote navigateur',
52
+ type: 'boolean',
53
+ },
54
+ ...BROWSER_CONFIG_FIELDS,
55
+ },
56
+ },
57
+ keyboard: {
58
+ title: 'Clavier',
59
+ description: 'Active ou masque la remote clavier pour tous les clients.',
60
+ fields: {
61
+ enabled: {
62
+ label: 'Activer la remote clavier',
63
+ type: 'boolean',
64
+ },
65
+ },
66
+ },
67
+ vlc: {
68
+ title: 'VLC',
69
+ description: 'Active ou masque la remote VLC pour tous les clients.',
70
+ fields: {
71
+ enabled: {
72
+ label: 'Activer la remote VLC',
73
+ type: 'boolean',
74
+ },
75
+ },
76
+ },
77
+ preview: {
78
+ title: 'Apercu curseur',
79
+ description: "Qualite et cadence de l'apercu diffuse au client.",
80
+ fields: {
81
+ enabled: {
82
+ label: 'Activer le preview curseur',
83
+ type: 'boolean',
84
+ },
85
+ width: {
86
+ label: 'Largeur',
87
+ type: 'integer',
88
+ min: 32,
89
+ max: 512,
90
+ step: 1,
91
+ },
92
+ height: {
93
+ label: 'Hauteur',
94
+ type: 'integer',
95
+ min: 24,
96
+ max: 512,
97
+ step: 1,
98
+ },
99
+ fps: {
100
+ label: 'FPS',
101
+ type: 'integer',
102
+ min: 1,
103
+ max: 30,
104
+ step: 1,
105
+ },
106
+ hideDelayMs: {
107
+ label: 'Delai de masque (ms)',
108
+ type: 'integer',
109
+ min: 200,
110
+ max: 60000,
111
+ step: 100,
112
+ },
113
+ },
114
+ },
115
+ notifications: {
116
+ title: 'Notifications',
117
+ description: 'Reglage des notifications par evenement pour le host et le client.',
118
+ fields: {
119
+ ttlMs: {
120
+ label: 'Duree affichage (ms)',
121
+ type: 'integer',
122
+ min: 500,
123
+ max: 10000,
124
+ step: 100,
125
+ },
126
+ },
127
+ },
128
+ samsungTv: {
129
+ title: 'Samsung TV',
130
+ description: 'Connexion, delais et raccourcis pour la TV Samsung.',
131
+ fields: {
132
+ enabled: {
133
+ label: 'Activer Samsung TV',
134
+ type: 'boolean',
135
+ },
136
+ alwaysAutoResolve: {
137
+ label: 'Toujours auto-resoudre',
138
+ type: 'boolean',
139
+ },
140
+ host: {
141
+ label: 'Adresse IP',
142
+ type: 'string',
143
+ placeholder: '192.168.1.50',
144
+ },
145
+ mac: {
146
+ label: 'Adresse MAC',
147
+ type: 'string',
148
+ placeholder: 'AA:BB:CC:DD:EE:FF',
149
+ },
150
+ port: {
151
+ label: 'Port',
152
+ type: 'integer',
153
+ min: 1,
154
+ max: 65535,
155
+ step: 1,
156
+ },
157
+ appName: {
158
+ label: 'Nom application',
159
+ type: 'string',
160
+ placeholder: 'Remote Mouse',
161
+ },
162
+ discoveryTimeoutMs: {
163
+ label: 'Timeout decouverte (ms)',
164
+ type: 'integer',
165
+ min: 100,
166
+ max: 20000,
167
+ step: 100,
168
+ },
169
+ timeoutMs: {
170
+ label: 'Timeout commande (ms)',
171
+ type: 'integer',
172
+ min: 500,
173
+ max: 60000,
174
+ step: 100,
175
+ },
176
+ pcInputKey: {
177
+ label: 'Touche entree PC',
178
+ type: 'string',
179
+ placeholder: 'KEY_HDMI1',
180
+ },
181
+ pcInputSequence: {
182
+ label: 'Sequence entree PC',
183
+ type: 'string',
184
+ placeholder: 'KEY_SOURCE,KEY_DOWN,KEY_ENTER',
185
+ },
186
+ powerOffKey: {
187
+ label: 'Touche extinction',
188
+ type: 'string',
189
+ placeholder: 'KEY_POWER',
190
+ },
191
+ },
192
+ },
193
+ updateCheck: {
194
+ title: 'Mises a jour',
195
+ description: 'Activation de la verification automatique des mises a jour.',
196
+ fields: {
197
+ enabled: {
198
+ label: 'Activer la verification',
199
+ type: 'boolean',
200
+ },
201
+ },
202
+ },
203
+ qrOverlay: {
204
+ title: 'QR Overlay',
205
+ description: "Reglage de taille et de position de l'overlay QR.",
206
+ fields: {
207
+ enabled: {
208
+ label: "Afficher l'overlay",
209
+ type: 'boolean',
210
+ },
211
+ size: {
212
+ label: 'Taille',
213
+ type: 'integer',
214
+ min: 24,
215
+ max: 400,
216
+ step: 1,
217
+ },
218
+ margin: {
219
+ label: 'Marge',
220
+ type: 'integer',
221
+ min: 0,
222
+ max: 200,
223
+ step: 1,
224
+ },
225
+ topOffsetPx: {
226
+ label: 'Offset haut (px)',
227
+ type: 'integer',
228
+ min: 0,
229
+ max: 500,
230
+ step: 1,
231
+ },
232
+ autoHideOnHover: {
233
+ label: 'Masquage auto au survol',
234
+ type: 'boolean',
235
+ },
236
+ hoverEntryMarginPx: {
237
+ label: "Marge d'entree hover (px)",
238
+ type: 'integer',
239
+ min: 0,
240
+ max: 100,
241
+ step: 1,
242
+ },
243
+ hoverExitMarginPx: {
244
+ label: 'Marge de sortie hover (px)',
245
+ type: 'integer',
246
+ min: 0,
247
+ max: 150,
248
+ step: 1,
249
+ },
250
+ hoverShowDelayMs: {
251
+ label: 'Delai de reaffichage hover (ms)',
252
+ type: 'integer',
253
+ min: 0,
254
+ max: 10000,
255
+ step: 50,
256
+ },
257
+ },
258
+ },
259
+ };
260
+
261
+ export function getManagedConfigSchema(managedPaths = []) {
262
+ const allowed = new Set(managedPaths);
263
+ const sections = {};
264
+
265
+ for (const [sectionKey, section] of Object.entries(CONFIG_SCHEMA)) {
266
+ const fields = Object.fromEntries(
267
+ Object.entries(section.fields).filter(([fieldKey]) => allowed.has(`${sectionKey}.${fieldKey}`)),
268
+ );
269
+
270
+ if (!Object.keys(fields).length) {
271
+ continue;
272
+ }
273
+
274
+ sections[sectionKey] = {
275
+ ...section,
276
+ fields,
277
+ };
278
+ }
279
+
280
+ return sections;
281
+ }
282
+
283
+ const CONFIG_FIELD_DEFINITIONS = new Map();
284
+
285
+ for (const [sectionKey, section] of Object.entries(CONFIG_SCHEMA)) {
286
+ for (const [fieldKey, field] of Object.entries(section.fields)) {
287
+ CONFIG_FIELD_DEFINITIONS.set(`${sectionKey}.${fieldKey}`, field);
288
+ }
289
+ }
290
+
291
+ for (const pathKey of getNotificationPaths()) {
292
+ CONFIG_FIELD_DEFINITIONS.set(pathKey, { type: 'boolean' });
293
+ }
294
+
295
+ export function getConfigFieldDefinition(pathKey) {
296
+ return CONFIG_FIELD_DEFINITIONS.get(String(pathKey || '').trim()) || null;
297
+ }
@@ -0,0 +1,89 @@
1
+ import {deepMerge, setNestedValue} from '../../../utils/object.utils.js';
2
+ import {CONFIG_PATHS} from './configPaths.js';
3
+ import {DEFAULT_PERSISTED_CONFIG} from './defaultConfig.js';
4
+ import {
5
+ PUBSUB_EVENT_CONFIG_DELETED,
6
+ PUBSUB_EVENT_CONFIG_UPDATED,
7
+ PUBSUB_SERVICE_CONFIG,
8
+ } from '../pubsub/serviceEventConstants.js';
9
+
10
+ function isManagedPath(pathKey) {
11
+ return CONFIG_PATHS.includes(pathKey);
12
+ }
13
+
14
+ function getValueAtPath(source, dottedPath) {
15
+ return String(dottedPath || '')
16
+ .split('.')
17
+ .filter(Boolean)
18
+ .reduce((cursor, segment) => (cursor == null ? undefined : cursor[segment]), source);
19
+ }
20
+
21
+ function mapStoredRowsToObject(rows) {
22
+ const config = {};
23
+
24
+ for (const row of rows || []) {
25
+ if (!row?.key || !isManagedPath(row.key)) {
26
+ continue;
27
+ }
28
+
29
+ setNestedValue(config, row.key, row.value);
30
+ }
31
+
32
+ return config;
33
+ }
34
+
35
+ export function createConfigService(services) {
36
+ function getStoredConfigObject() {
37
+ const rows = services.getPersistence().configDao.getAll();
38
+ return mapStoredRowsToObject(rows);
39
+ }
40
+
41
+ function publishChange(changeType, changedKeys) {
42
+ const uniqueChangedKeys = Array.from(new Set(changedKeys));
43
+ services.getPubSub().publish(PUBSUB_SERVICE_CONFIG, {
44
+ changeType,
45
+ changedKeys: uniqueChangedKeys,
46
+ storedConfig: getStoredConfigObject(),
47
+ }, {
48
+ type: changeType === 'deleted' ? PUBSUB_EVENT_CONFIG_DELETED : PUBSUB_EVENT_CONFIG_UPDATED,
49
+ snapshot: false,
50
+ });
51
+ }
52
+
53
+ return {
54
+ getConfigs() {
55
+ return deepMerge(DEFAULT_PERSISTED_CONFIG, getStoredConfigObject());
56
+ },
57
+ getConfig(pathKey) {
58
+ const normalizedPath = String(pathKey || '').trim();
59
+ if (!normalizedPath) {
60
+ return undefined;
61
+ }
62
+
63
+ return getValueAtPath(this.getConfigs(), normalizedPath);
64
+ },
65
+ setConfig(pathKey, value) {
66
+ const normalizedPath = String(pathKey || '').trim();
67
+ if (!isManagedPath(normalizedPath)) {
68
+ throw new Error(`Invalid config path: ${normalizedPath || '(empty)'}`);
69
+ }
70
+
71
+ services.getPersistence().configDao.saveOne(normalizedPath, value);
72
+ publishChange('updated', [normalizedPath]);
73
+ return this.getConfig(normalizedPath);
74
+ },
75
+ resetConfig(pathKey) {
76
+ const normalizedPath = String(pathKey || '').trim();
77
+ if (!isManagedPath(normalizedPath)) {
78
+ throw new Error(`Invalid config path: ${normalizedPath || '(empty)'}`);
79
+ }
80
+
81
+ const changes = services.getPersistence().configDao.deleteOne(normalizedPath);
82
+ if (changes > 0) {
83
+ publishChange('deleted', [normalizedPath]);
84
+ }
85
+
86
+ return this.getConfig(normalizedPath);
87
+ },
88
+ };
89
+ }
@@ -0,0 +1,137 @@
1
+ import {
2
+ packageJson
3
+ } from "./bootstrapConfig.js";
4
+ import { BROWSER_CATALOG } from '../../remotes/browser/browserCatalog.js';
5
+ import {
6
+ createDefaultNotificationSettings,
7
+ NOTIFICATION_ID_UPDATE_AVAILABLE,
8
+ NOTIFICATION_ID_UPDATE_INSTALL,
9
+ NOTIFICATION_ID_SERVICE_RESTARTED,
10
+ NOTIFICATION_ID_SERVICE_RESTARTING,
11
+ NOTIFICATION_ID_SESSION_CREATED,
12
+ } from '../../../utils/notificationSettings.js';
13
+
14
+ const DEFAULT_NOTIFICATION_SETTINGS = createDefaultNotificationSettings(false);
15
+
16
+ DEFAULT_NOTIFICATION_SETTINGS[NOTIFICATION_ID_SERVICE_RESTARTING] = {
17
+ host: true,
18
+ client: true,
19
+ };
20
+ DEFAULT_NOTIFICATION_SETTINGS[NOTIFICATION_ID_SESSION_CREATED] = {
21
+ host: true,
22
+ client: true,
23
+ };
24
+ DEFAULT_NOTIFICATION_SETTINGS[NOTIFICATION_ID_SERVICE_RESTARTED] = {
25
+ host: true,
26
+ client: true,
27
+ };
28
+ DEFAULT_NOTIFICATION_SETTINGS[NOTIFICATION_ID_UPDATE_INSTALL] = {
29
+ host: true,
30
+ client: true,
31
+ };
32
+ DEFAULT_NOTIFICATION_SETTINGS[NOTIFICATION_ID_UPDATE_AVAILABLE] = {
33
+ host: true,
34
+ client: true,
35
+ };
36
+
37
+ const DEFAULT_BROWSER_CONFIG = Object.fromEntries(
38
+ BROWSER_CATALOG.map((browser) => [browser.id, true]),
39
+ );
40
+
41
+ export const DEFAULT_SYSTEM_CONFIG = {
42
+ port: 3000,
43
+ serverHost: '',
44
+ entryPath: {
45
+ enabled: true,
46
+ fixed: '',
47
+ tokenLength: 24,
48
+ rotateMin: 60,
49
+ graceMin: 60 * 24 * 7, // 1 semaine de grâce
50
+ },
51
+ session: {
52
+ cookieName: 'remote_mouse_session',
53
+ cookieSecret: 'change-me',
54
+ cookieMaxAgeDays: 7,
55
+ socketEventMaxAgeMs: 1200,
56
+ },
57
+ adminActionsEnabled: true,
58
+ serviceName: 'remote-mouse.service',
59
+ serviceRestartCommand: '',
60
+ updateCheck: {
61
+ checkCommand: '',
62
+ checkTimeoutSec: 20,
63
+ intervalMin: 360,
64
+ packageName: String(packageJson.name || '').trim(),
65
+ currentVersion: String(packageJson.version || '').trim(),
66
+ installCommand: '',
67
+ installTimeoutSec: 600,
68
+ },
69
+ https: {
70
+ enabled: false,
71
+ sslKeyPath: undefined,
72
+ sslCertPath: undefined,
73
+ },
74
+ persistence: {
75
+ dbPath: './data/remote-mouse.db',
76
+ },
77
+ logging: {
78
+ level: 'info',
79
+ format: 'json',
80
+ },
81
+ };
82
+
83
+ export const DEFAULT_PERSISTED_CONFIG = {
84
+ input: {
85
+ mouseSpeed: 1.3,
86
+ scrollSpeed: 0.25,
87
+ touchDragHoldMs: 420,
88
+ touchDragStillDistancePx: 8,
89
+ },
90
+ browser: {
91
+ enabled: true,
92
+ ...DEFAULT_BROWSER_CONFIG,
93
+ },
94
+ keyboard: {
95
+ enabled: true,
96
+ },
97
+ vlc: {
98
+ enabled: false,
99
+ },
100
+ preview: {
101
+ enabled: true,
102
+ width: 128,
103
+ height: 84,
104
+ fps: 6,
105
+ hideDelayMs: 10000,
106
+ },
107
+ notifications: {
108
+ ttlMs: 2200,
109
+ ...DEFAULT_NOTIFICATION_SETTINGS,
110
+ },
111
+ samsungTv: {
112
+ enabled: false,
113
+ alwaysAutoResolve: true,
114
+ host: '',
115
+ mac: '',
116
+ port: 8002,
117
+ appName: 'Remote Mouse',
118
+ discoveryTimeoutMs: 2500,
119
+ timeoutMs: 5000,
120
+ pcInputKey: 'KEY_HDMI1',
121
+ pcInputSequence: '',
122
+ powerOffKey: 'KEY_POWER',
123
+ },
124
+ updateCheck: {
125
+ enabled: false,
126
+ },
127
+ qrOverlay: {
128
+ enabled: true,
129
+ size: 75,
130
+ margin: 14,
131
+ topOffsetPx: 32,
132
+ autoHideOnHover: true,
133
+ hoverEntryMarginPx: 10,
134
+ hoverExitMarginPx: 18,
135
+ hoverShowDelayMs: 5000
136
+ },
137
+ };
@@ -0,0 +1,49 @@
1
+ import {
2
+ readOptionalBoolean,
3
+ readOptionalNumber,
4
+ readOptionalString
5
+ } from "../../utils/env.js";
6
+
7
+ export function getEnvConfig() {
8
+ return {
9
+ port: readOptionalNumber('PORT'),
10
+ serverHost: readOptionalString('SERVER_HOST'),
11
+ entryPath: {
12
+ enabled: readOptionalBoolean('ENTRY_PATH_ENABLED'),
13
+ fixed: readOptionalString('ENTRY_PATH_FIXED'),
14
+ tokenLength: readOptionalNumber('ENTRY_PATH_TOKEN_LENGTH'),
15
+ rotateMin: readOptionalNumber('ENTRY_PATH_ROTATE_INTERVAL_MIN'),
16
+ graceMin: readOptionalNumber('ENTRY_PATH_GRACE_MIN'),
17
+ },
18
+ session: {
19
+ cookieName: readOptionalString('SESSION_COOKIE_NAME'),
20
+ cookieSecret: readOptionalString('SESSION_COOKIE_SECRET'),
21
+ cookieMaxAgeDays: readOptionalNumber('SESSION_COOKIE_MAX_AGE_DAYS'),
22
+ socketEventMaxAgeMs: readOptionalNumber('SOCKET_EVENT_MAX_AGE_MS'),
23
+ },
24
+ adminActionsEnabled: readOptionalBoolean('ADMIN_ACTIONS_ENABLED'),
25
+ serviceName: readOptionalString('SERVICE_NAME'),
26
+ serviceRestartCommand: readOptionalString('SERVICE_RESTART_COMMAND'),
27
+ https: {
28
+ enabled: readOptionalBoolean('HTTPS'),
29
+ sslKeyPath: readOptionalString('SSL_KEY_PATH'),
30
+ sslCertPath: readOptionalString('SSL_CERT_PATH'),
31
+ },
32
+ updateCheck: {
33
+ checkCommand: readOptionalString('UPDATE_CHECK_COMMAND'),
34
+ checkTimeoutSec: readOptionalNumber('UPDATE_CHECK_TIMEOUT_SEC'),
35
+ intervalMin: readOptionalNumber('UPDATE_CHECK_INTERVAL_MIN'),
36
+ packageName: readOptionalString('UPDATE_CHECK_PACKAGE'),
37
+ currentVersion: readOptionalString('UPDATE_CHECK_CURRENT_VERSION'),
38
+ installCommand: readOptionalString('UPDATE_INSTALL_COMMAND'),
39
+ installTimeoutSec: readOptionalNumber('UPDATE_INSTALL_TIMEOUT_SEC'),
40
+ },
41
+ persistence: {
42
+ dbPath: readOptionalString('PERSISTENCE_DB_PATH'),
43
+ },
44
+ logging: {
45
+ level: readOptionalString('LOG_LEVEL'),
46
+ format: readOptionalString('LOG_FORMAT'),
47
+ },
48
+ };
49
+ }
@@ -0,0 +1,9 @@
1
+ import {
2
+ getStartupSystemConfigSnapshot,
3
+ getSystemConfig,
4
+ } from './system-config.js';
5
+
6
+ export {
7
+ getStartupSystemConfigSnapshot,
8
+ getSystemConfig,
9
+ };
@@ -0,0 +1,54 @@
1
+ function emitConfigLine(logger, message, fields = {}) {
2
+ if (logger && typeof logger.info === 'function') {
3
+ logger.info(fields, message);
4
+ return;
5
+ }
6
+ console.log(`${message} ${JSON.stringify(fields)}`);
7
+ }
8
+
9
+ export function logStartupConfig(logger, config) {
10
+ const systemConfig = config.systemConfig;
11
+ const persistedConfig = config.config;
12
+
13
+ emitConfigLine(logger, 'Configuration');
14
+ emitConfigLine(logger, 'config.network', {
15
+ protocol: systemConfig.protocol,
16
+ port: systemConfig.port,
17
+ serverHost: systemConfig.serverHost || '(auto LAN detection)',
18
+ });
19
+ emitConfigLine(logger, 'config.entryPath', {
20
+ ...systemConfig.entryPath,
21
+ fixed: systemConfig.entryPath.fixed || '(random)',
22
+ });
23
+ emitConfigLine(logger, 'config.session', {
24
+ ...systemConfig.session,
25
+ cookieSecret: undefined,
26
+ });
27
+ emitConfigLine(logger, 'config.input', persistedConfig.input);
28
+ emitConfigLine(logger, 'config.preview', persistedConfig.preview);
29
+ emitConfigLine(logger, 'config.notifications', persistedConfig.notifications);
30
+ emitConfigLine(logger, 'config.admin', {
31
+ adminActionsEnabled: systemConfig.adminActionsEnabled,
32
+ serviceName: systemConfig.serviceName,
33
+ });
34
+ emitConfigLine(logger, 'config.samsungTv', {
35
+ ...persistedConfig.samsungTv,
36
+ mac: persistedConfig.samsungTv.mac ? '(set)' : '(unset)',
37
+ });
38
+ emitConfigLine(logger, 'config.update', {
39
+ ...systemConfig.updateCheck,
40
+ ...persistedConfig.updateCheck,
41
+ packageName: systemConfig.updateCheck.packageName || '(none)',
42
+ currentVersion: systemConfig.updateCheck.currentVersion || '(none)',
43
+ installCommand: systemConfig.updateCheck.installCommand || '(unset)',
44
+ });
45
+ emitConfigLine(logger, 'config.qrOverlay', persistedConfig.qrOverlay);
46
+ emitConfigLine(logger, 'config.runtime', {
47
+ graphicalDisplay: systemConfig.graphicalDisplay,
48
+ https: {
49
+ ...systemConfig.https,
50
+ sslKeyPath: systemConfig.https.enabled ? (systemConfig.https.sslKeyPath || '(missing)') : undefined,
51
+ sslCertPath: systemConfig.https.enabled ? (systemConfig.https.sslCertPath || '(missing)') : undefined,
52
+ },
53
+ });
54
+ }
@@ -0,0 +1,44 @@
1
+ import {
2
+ readString,
3
+ resolvePathFromConfigDir,
4
+ } from '../../utils/env.js';
5
+ import {deepMerge} from '../../../utils/object.utils.js';
6
+ import {CONFIG_DIR} from './bootstrapConfig.js';
7
+ import {DEFAULT_SYSTEM_CONFIG} from './defaultConfig.js';
8
+ import {getEnvConfig as readEnvConfig} from './envConfig.js';
9
+
10
+ export function normalizeSystemConfig(defaultSystemConfig) {
11
+ const httpsEnabled = Boolean(defaultSystemConfig?.https?.enabled);
12
+
13
+ return {
14
+ ...defaultSystemConfig,
15
+ protocol: httpsEnabled ? 'https' : 'http',
16
+ entryPath: {
17
+ ...defaultSystemConfig.entryPath,
18
+ enabled: Boolean(defaultSystemConfig.entryPath.enabled || defaultSystemConfig.entryPath.fixed),
19
+ },
20
+ session: {
21
+ ...defaultSystemConfig.session,
22
+ cookieSecure: httpsEnabled,
23
+ cookieSecretSet: defaultSystemConfig.session.cookieSecret !== 'change-me',
24
+ },
25
+ https: {
26
+ ...defaultSystemConfig.https,
27
+ sslKeyPath: httpsEnabled ? defaultSystemConfig.https.sslKeyPath : undefined,
28
+ sslCertPath: httpsEnabled ? defaultSystemConfig.https.sslCertPath : undefined,
29
+ },
30
+ persistence: {
31
+ ...defaultSystemConfig.persistence,
32
+ dbPath: resolvePathFromConfigDir(defaultSystemConfig.persistence.dbPath, CONFIG_DIR),
33
+ },
34
+ graphicalDisplay: Boolean(readString('DISPLAY') || readString('WAYLAND_DISPLAY')),
35
+ };
36
+ }
37
+
38
+ export function getStartupSystemConfigSnapshot() {
39
+ return deepMerge(DEFAULT_SYSTEM_CONFIG, readEnvConfig());
40
+ }
41
+
42
+ export function getSystemConfig() {
43
+ return normalizeSystemConfig(getStartupSystemConfigSnapshot());
44
+ }