@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
package/.env.example ADDED
@@ -0,0 +1,93 @@
1
+ # HTTP/HTTPS server listen port
2
+ PORT=3000
3
+
4
+ # Host/IP to display in the URL/QR code (leave empty for LAN auto-detection)
5
+ SERVER_HOST=
6
+
7
+ # Main configuration directory (env + sqlite)
8
+ CONFIG_DIR=~/.config/remote-mouse
9
+
10
+ # Full or relative path to the persistence SQLite file
11
+ PERSISTENCE_DB_PATH=~/.config/remote-mouse/remote-mouse.sqlite3
12
+
13
+ # Explicit environment file path (optional)
14
+ # If empty, the server looks for CONFIG_DIR/.env first
15
+ ENV_FILE_PATH=
16
+
17
+
18
+ # Enable HTTPS (true/false)
19
+ HTTPS=false
20
+
21
+ # Path to the PEM private key (required if HTTPS=true)
22
+ SSL_KEY_PATH=
23
+
24
+ # Path to the PEM certificate (required if HTTPS=true)
25
+ SSL_CERT_PATH=
26
+
27
+ # Enable the random entry path (true/false)
28
+ ENTRY_PATH_ENABLED=true
29
+
30
+ # Fixed path instead of a random token (optional)
31
+ ENTRY_PATH_FIXED=
32
+
33
+ # Random entry token length
34
+ ENTRY_PATH_TOKEN_LENGTH=24
35
+
36
+ # Automatic entry token rotation interval (minutes)
37
+ ENTRY_PATH_ROTATE_INTERVAL_MIN=60
38
+
39
+ # Grace period for previous tokens (minutes)
40
+ ENTRY_PATH_GRACE_MIN=120
41
+
42
+ # Session cookie name (used for HTTP + WebSocket)
43
+ SESSION_COOKIE_NAME=remote_mouse_session
44
+
45
+ # Cookie signing secret (MUST be changed in production)
46
+ SESSION_COOKIE_SECRET=change-me
47
+
48
+ # Session cookie lifetime (days)
49
+ SESSION_COOKIE_MAX_AGE_DAYS=7
50
+
51
+ # Maximum accepted age for a client-to-server Socket.IO event (ms)
52
+ SOCKET_EVENT_MAX_AGE_MS=1200
53
+
54
+ # Server log verbosity: trace, debug, info, warn, error, fatal
55
+ LOG_LEVEL=info
56
+
57
+ # Server log format: json, pretty, flat
58
+ LOG_FORMAT=json
59
+
60
+ # Allow admin actions triggered from the client
61
+ ADMIN_ACTIONS_ENABLED=true
62
+
63
+ # Name of the systemd --user service to restart
64
+ SERVICE_NAME=remote-mouse.service
65
+
66
+ # Optional custom shell command used to restart the local service/daemon
67
+ # If set, it takes precedence over the platform-specific restart strategy
68
+ SERVICE_RESTART_COMMAND=
69
+
70
+ # Update check shell command (optional, takes precedence)
71
+ # Supported protocols:
72
+ # - JSON: {"hasUpdate":true,"key":"...","title":"...","message":"...","ttlMs":8000}
73
+ # - Text: "1"/"true"/"update" => update detected; "0"/"false"/"none" => no update
74
+ UPDATE_CHECK_COMMAND=
75
+
76
+ # Maximum timeout for the update check command (seconds)
77
+ UPDATE_CHECK_TIMEOUT_SEC=20
78
+
79
+ # Update check interval (minutes)
80
+ UPDATE_CHECK_INTERVAL_MIN=360
81
+
82
+ # npm package to check (leave empty to use the local package name)
83
+ UPDATE_CHECK_PACKAGE=
84
+
85
+ # Forced current version (leave empty to use package.json)
86
+ UPDATE_CHECK_CURRENT_VERSION=
87
+
88
+ # Shell command to install an update (optional)
89
+ # If empty: automatic fallback to "npm update -g <UPDATE_CHECK_PACKAGE> --force"
90
+ UPDATE_INSTALL_COMMAND=
91
+
92
+ # Maximum timeout for the install command (seconds)
93
+ UPDATE_INSTALL_TIMEOUT_SEC=600
package/README.md ADDED
@@ -0,0 +1,370 @@
1
+ # Remote Mouse
2
+
3
+ Remote Mouse is a web-based remote control for operating a computer from a phone, tablet, or another browser on the same network. The server exposes a mobile-friendly interface for mouse and keyboard control, browser shortcuts, admin actions, and optional Samsung TV remote commands.
4
+
5
+ ## Overview
6
+
7
+ The application includes:
8
+
9
+ - a token-based entry path with QR code access
10
+ - a mobile touchpad for mouse movement, clicking, and scrolling
11
+ - a keyboard panel for text input and special keys
12
+ - browser shortcut actions
13
+ - VLC media controls when VLC is available on the host
14
+ - admin actions from the client UI
15
+ - a server info page
16
+ - optional Samsung TV remote integration
17
+
18
+ ## Screenshots
19
+
20
+ Regenerate these assets with `npm run screenshots:mobile`.
21
+
22
+ | Remote control | Local preferences |
23
+ | --- | --- |
24
+ | <img src=".artifacts/screenshots/remote-mobile-home.png" alt="Mobile remote control screen" width="260"> | <img src=".artifacts/screenshots/remote-mobile-preferences.png" alt="Mobile local preferences screen" width="260"> |
25
+
26
+ | VLC remote | Admin configuration |
27
+ | --- | --- |
28
+ | <img src=".artifacts/screenshots/remote-mobile-vlc.png" alt="Mobile VLC remote screen" width="260"> | <img src=".artifacts/screenshots/remote-mobile-config.png" alt="Mobile admin configuration screen" width="260"> |
29
+
30
+ | Server info |
31
+ | --- |
32
+ | <img src=".artifacts/screenshots/remote-mobile-server-info.png" alt="Mobile server info screen" width="260"> |
33
+
34
+ ## Install
35
+
36
+ ### Automatic (preferred)
37
+
38
+ Linux installer:
39
+
40
+ [scripts/install-linux.sh](https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-linux.sh)
41
+
42
+ ```bash
43
+ curl -fsSL https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-linux.sh | bash
44
+ ```
45
+
46
+ For local development from this repository, run [`scripts/install-linux.sh`](./scripts/install-linux.sh):
47
+
48
+ ```bash
49
+ scripts/install-linux.sh
50
+ ```
51
+
52
+ Use `-y` to automatically accept every confirmation prompt:
53
+
54
+ ```bash
55
+ scripts/install-linux.sh -y
56
+ ```
57
+
58
+ When running the installer through `curl | bash`, pass options after `bash -s --`:
59
+
60
+ ```bash
61
+ curl -fsSL https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-linux.sh | bash -s -- -y
62
+ ```
63
+
64
+ Windows installer:
65
+
66
+ [scripts/install-windows.ps1](https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-windows.ps1)
67
+
68
+ ```powershell
69
+ powershell -ExecutionPolicy Bypass -File scripts/install-windows.ps1
70
+ ```
71
+
72
+ Use `-Yes` to automatically accept every confirmation prompt:
73
+
74
+ ```powershell
75
+ powershell -ExecutionPolicy Bypass -File scripts/install-windows.ps1 -Yes
76
+ ```
77
+
78
+ For a downloaded script:
79
+
80
+ ```powershell
81
+ iwr https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-windows.ps1 -OutFile install-windows.ps1
82
+ powershell -ExecutionPolicy Bypass -File .\install-windows.ps1
83
+ ```
84
+
85
+ Downloaded script with automatic confirmations:
86
+
87
+ ```powershell
88
+ iwr https://raw.githubusercontent.com/glennerichall/node-mouse/main/scripts/install-windows.ps1 -OutFile install-windows.ps1
89
+ powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 -Yes
90
+ ```
91
+
92
+ macOS installer scripts will be added later.
93
+
94
+ The automatic installer is expected to handle:
95
+
96
+ - Node.js installation or validation
97
+ - platform native dependencies
98
+ - npm package installation
99
+ - initial `.env` creation
100
+ - optional local service installation
101
+ - first-run access URL and QR code display
102
+
103
+ ### Custom
104
+
105
+ Use the custom installation path when you want to install each dependency yourself, run from source, or tune the host service manually.
106
+
107
+ #### Node.js
108
+
109
+ Install an active Node.js LTS release before installing Remote Mouse. The application uses npm scripts and native Node.js modules, so both `node` and `npm` must be available in your terminal.
110
+
111
+ ##### Linux and macOS
112
+
113
+ Using `nvm` is recommended because it keeps the Node.js version isolated from the system packages:
114
+
115
+ ```bash
116
+ curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
117
+ nvm install --lts
118
+ nvm use --lts
119
+ ```
120
+
121
+ Restart your terminal if `nvm` is not available immediately after installation.
122
+
123
+ ##### Windows
124
+
125
+ Install the Node.js LTS release from the official installer, or use `winget`:
126
+
127
+ ```powershell
128
+ winget install OpenJS.NodeJS.LTS
129
+ ```
130
+
131
+ Open a new terminal after installation so `node` and `npm` are available in `PATH`.
132
+
133
+ ##### Verify
134
+
135
+ ```bash
136
+ node --version
137
+ npm --version
138
+ ```
139
+
140
+ #### Platform Dependencies
141
+
142
+ This project relies on `@hurdlegroup/robotjs`, which requires native dependencies.
143
+
144
+ VLC media player is optional. Install it on the host machine if you want the VLC remote to appear and control media playback.
145
+
146
+ ##### Linux
147
+
148
+ Typical Debian or Ubuntu packages:
149
+
150
+ ```bash
151
+ sudo apt-get update
152
+ sudo apt-get install -y build-essential libx11-dev libxtst-dev libpng++-dev wmctrl yad
153
+ ```
154
+
155
+ Notes:
156
+
157
+ - `libx11-dev`, `libxtst-dev`, and `libpng++-dev` are required for the native mouse and keyboard integration
158
+ - `wmctrl` is used for browser focus and window activation on Linux
159
+ - `yad` is used for the Linux QR overlay
160
+ - an X11 session is required for the Linux desktop control features
161
+
162
+ ##### Windows
163
+
164
+ Typical requirements:
165
+
166
+ - Microsoft Visual Studio C++ Build Tools for native Node modules
167
+ - Python available in `PATH` if native module compilation is needed
168
+ - PowerShell and Windows Forms support for the QR overlay behavior
169
+
170
+ Notes:
171
+
172
+ - the Windows QR overlay uses PowerShell with Windows Forms
173
+ - depending on your environment, `npm install` may use a prebuilt binary or may require local native compilation
174
+
175
+ #### Package Install
176
+
177
+ Install the published npm package globally:
178
+
179
+ ```bash
180
+ npm install -g @velor/remote-mouse
181
+ remote-mouse
182
+ ```
183
+
184
+ On startup, the server prints the client access URL and the corresponding QR code.
185
+
186
+ #### Source Install
187
+
188
+ Use this path when working from a checked-out repository:
189
+
190
+ ```bash
191
+ npm install
192
+ npm start
193
+ ```
194
+
195
+ On startup, the server prints the client access URL and the corresponding QR code.
196
+
197
+ #### Self-Signed HTTPS Certificate
198
+
199
+ HTTPS can be enabled with a local self-signed certificate. This is useful when a browser feature or deployment context requires a secure origin.
200
+
201
+ Create a local certificate directory:
202
+
203
+ ```bash
204
+ mkdir -p certs
205
+ ```
206
+
207
+ Generate a self-signed certificate:
208
+
209
+ ```bash
210
+ openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
211
+ -keyout certs/remote-mouse.key \
212
+ -out certs/remote-mouse.crt \
213
+ -subj "/CN=remote-mouse.local" \
214
+ -addext "subjectAltName=DNS:localhost,DNS:remote-mouse.local,IP:127.0.0.1"
215
+ ```
216
+
217
+ Enable HTTPS in `.env`:
218
+
219
+ ```dotenv
220
+ HTTPS=true
221
+ SSL_KEY_PATH=certs/remote-mouse.key
222
+ SSL_CERT_PATH=certs/remote-mouse.crt
223
+ ```
224
+
225
+ Browsers will warn about self-signed certificates until the certificate is trusted locally. This is expected for a local self-signed certificate. Open the advanced/details option in the browser warning and choose to continue to the site.
226
+
227
+ #### Linux Deployment
228
+
229
+ The application can manage its own `systemd --user` service.
230
+
231
+ Typical setup:
232
+
233
+ 1. Install the package with npm, or use the source install path above.
234
+ 2. Create a `.env` file based on [`.env.example`](./.env.example).
235
+ 3. Run `remote-mouse service install`.
236
+ 4. Use `remote-mouse service restart`, `remote-mouse service disable`, or `remote-mouse service uninstall` as needed.
237
+
238
+ The generated unit is equivalent to the following:
239
+
240
+ ```ini
241
+ [Unit]
242
+ Description=Remote Mouse Server
243
+ After=graphical-session.target network-online.target
244
+ Wants=network-online.target
245
+
246
+ [Service]
247
+ Type=simple
248
+ ExecStart=/path/to/remote-mouse/bin/remote-mouse.js
249
+ Restart=on-failure
250
+ RestartSec=2
251
+ Environment=PATH=/path/to/nodejs:/usr/local/bin:/usr/bin:/bin
252
+ Environment=NODE_ENV=production
253
+ PassEnvironment=DISPLAY WAYLAND_DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS
254
+
255
+ [Install]
256
+ WantedBy=default.target
257
+ ```
258
+
259
+ Depending on the graphical environment, passing the user session environment may be necessary for UI-related integrations.
260
+
261
+ An X11 session is required for the Linux desktop control features.
262
+
263
+ #### Windows Deployment
264
+
265
+ On Windows, the application manages a Task Scheduler entry that runs at user logon.
266
+
267
+ Typical setup:
268
+
269
+ 1. Install the package with npm, or use the source install path above.
270
+ 2. Create a `.env` file based on [`.env.example`](./.env.example).
271
+ 3. Run `remote-mouse service install`.
272
+ 4. Use `remote-mouse service restart`, `remote-mouse service disable`, or `remote-mouse service uninstall` as needed.
273
+
274
+ The generated scheduled task follows this model:
275
+
276
+ - Trigger: `At log on`
277
+ - Action: `schtasks /Create`
278
+ - Task name: the configured `serviceName`
279
+ - Command: launches the `remote-mouse` entrypoint with `REMOTE_MOUSE_DAEMON=1`
280
+ - Run only when the user is logged on
281
+
282
+ Notes:
283
+
284
+ - running in a user session is usually preferable because mouse, keyboard, browser, and overlay integrations depend on an interactive desktop session
285
+ - if you rely on the QR overlay or browser-opening actions, make sure the task runs in the same desktop session as the logged-in user
286
+ - if you installed the app globally, the generated task uses the `remote-mouse` CLI entrypoint directly
287
+
288
+ ## Configuration
289
+
290
+ Startup configuration is handled through a `.env` file. Instead of duplicating every environment variable here, use [`.env.example`](./.env.example) as the reference.
291
+
292
+ ### Access and Administration
293
+
294
+ Useful server pages:
295
+
296
+ - `/qr` displays the entry QR code
297
+ - `/ui/admin/server-info` shows server state, effective configuration, and recent logs
298
+ - `/ui/admin/config` lets you edit persisted settings grouped to match the configuration object structure
299
+
300
+ Useful CLI commands:
301
+
302
+ - `help` displays the available CLI commands
303
+ - `info` prints the server capabilities
304
+ - `config` prints the effective persisted configuration
305
+ - `config get <path>` prints one persisted configuration value
306
+ - `config set <path> <value>` updates one persisted configuration value
307
+ - `sys-config` prints the system configuration
308
+ - `service install` installs the local daemon/service
309
+ - `service disable` disables the local daemon/service
310
+ - `service uninstall` uninstalls the local daemon/service
311
+ - `service restart` restarts the local daemon/service
312
+ - `tasks` prints the task manager snapshot
313
+ - `task-manager` is an alias of `tasks`
314
+ - `samsung-detect` detects Samsung TVs available on the network
315
+ - `tokens` lists persisted entry tokens
316
+ - `open-qr` opens the QR page on the server
317
+ - `qr` is an alias of `open-qr`
318
+
319
+ Example:
320
+
321
+ - `remote-mouse config get logging.level`
322
+
323
+ ### Routes
324
+
325
+ The server exposes two main HTTP surfaces:
326
+
327
+ - UI routes for HTML pages
328
+ - API routes for JSON and SSE
329
+
330
+ #### UI Routes
331
+
332
+ - `GET /` serves the client application
333
+ - `GET /qr` displays the entry QR code page
334
+ - `GET /ui/admin/server-info` serves the server info page
335
+ - `GET /ui/admin/config` serves the admin configuration page
336
+
337
+ #### Session Route
338
+
339
+ - `GET /api/sessions/:token` validates an entry token, creates the signed session cookie, and redirects to `/`
340
+
341
+ #### Admin API Routes
342
+
343
+ - `GET /api/admin/server-info/data` returns the current server snapshot:
344
+ version, uptime, connected clients, tasks, tokens, effective config, system config, and recent logs
345
+ - `GET /api/admin/configs` returns the managed configuration entries, schema, defaults, and managed paths
346
+ - `GET /api/admin/configs/:configId` returns one managed configuration entry
347
+ - `PATCH /api/admin/configs/:configId` updates one managed configuration entry
348
+ - `DELETE /api/admin/configs/:configId` resets one managed configuration entry to its default value
349
+ - `POST /api/admin/subs/configs` creates a config SSE subscription and returns its id plus the stream URL
350
+ - `GET /api/admin/subs/:id` opens the SSE stream for a previously created subscription
351
+ - `DELETE /api/admin/subs/:id` deletes a previously created subscription
352
+ - `POST /api/admin/restart-service` requests a local service restart through the application daemon service
353
+
354
+ #### Health Route
355
+
356
+ - `GET /health` returns a simple health payload with the current application version
357
+
358
+ #### Static Assets
359
+
360
+ After session validation, static assets are also available through:
361
+
362
+ - `/client/*`
363
+ - `/utils/shared/*`
364
+ - files served from `public/`
365
+
366
+ ## Notes
367
+
368
+ - client access is controlled by either a generated token path or a fixed entry path, depending on configuration
369
+ - HTTPS can be enabled when required by the deployment context
370
+ - Samsung TV integration is optional and disabled by default
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import {startServer} from '../server/index.js';
3
+ import {runCliCmd} from "../server/term/cli/runCliCmd.js";
4
+
5
+ async function main() {
6
+ const args = process.argv.slice(2);
7
+
8
+ if (args.length === 0) {
9
+ await startServer();
10
+ } else {
11
+ await runCliCmd(args);
12
+ }
13
+
14
+ }
15
+
16
+ main().catch((error) => {
17
+ console.error('Erreur au démarrage:', error);
18
+ process.exit(1);
19
+ });
@@ -0,0 +1,148 @@
1
+ function getElement(id) {
2
+ return document.getElementById(id);
3
+ }
4
+
5
+ function getLayoutDom() {
6
+ return {
7
+ app: getElement('app'),
8
+ adminDrawerScrim: getElement('admin-drawer-scrim'),
9
+ leftMenu: getElement('left-menu'),
10
+ remoteStack: getElement('remote-stack'),
11
+ scrollZoneIndicator: getElement('scroll-zone-indicator'),
12
+ connectionOverlay: getElement('connection-overlay'),
13
+ notificationsRoot: getElement('client-notifications'),
14
+ };
15
+ }
16
+
17
+ function getMouseRemoteDom() {
18
+ return {
19
+ touchpad: getElement('touchpad'),
20
+ };
21
+ }
22
+
23
+ function getKeyboardRemoteDom() {
24
+ return {
25
+ menu: getElement('menu'),
26
+ keyboardPanel: getElement('keyboard-panel'),
27
+ keyboardShortcutsBar: getElement('keyboard-shortcuts-bar'),
28
+ keyboardPanelPreview: getElement('keyboard-panel-preview'),
29
+ keyboardTextMode: getElement('keyboard-text-mode'),
30
+ keyboardLiveMode: getElement('keyboard-live-mode'),
31
+ textInput: getElement('text-input'),
32
+ liveTextInput: getElement('live-text-input'),
33
+ keyboardEsc: getElement('keyboard-esc'),
34
+ keyboardTab: getElement('keyboard-tab'),
35
+ keyboardEnter: getElement('keyboard-enter'),
36
+ keyboardShift: getElement('keyboard-shift'),
37
+ keyboardAlt: getElement('keyboard-alt'),
38
+ keyboardCtrl: getElement('keyboard-ctrl'),
39
+ btnTextEntry: getElement('btn-text-entry'),
40
+ btnLiveKeyboard: getElement('btn-live-keyboard'),
41
+ btnSendText: getElement('send-text'),
42
+ };
43
+ }
44
+
45
+ function getBrowserRemoteDom() {
46
+ return {
47
+ root: getElement('browser-shortcuts'),
48
+ browserLaunchers: getElement('browser-launchers'),
49
+ btnBrowserBack: getElement('btn-browser-back'),
50
+ btnBrowserForward: getElement('btn-browser-forward'),
51
+ btnPrevTab: getElement('btn-prev-tab'),
52
+ btnNextTab: getElement('btn-next-tab'),
53
+ btnNewTab: getElement('btn-new-tab'),
54
+ btnCloseTab: getElement('btn-close-tab'),
55
+ btnAddressBar: getElement('btn-address-bar'),
56
+ btnHardReload: getElement('btn-hard-reload'),
57
+ btnFullscreen: getElement('btn-fullscreen'),
58
+ btnVideoPlayPause: getElement('btn-video-play-pause'),
59
+ btnVideoMute: getElement('btn-video-mute'),
60
+ btnVideoFullscreen: getElement('btn-video-fullscreen'),
61
+ };
62
+ }
63
+
64
+ function getSystemRemoteDom() {
65
+ return {
66
+ root: getElement('system-controls'),
67
+ btnSystemShowDesktop: getElement('btn-system-show-desktop'),
68
+ btnSystemWindowLeft: getElement('btn-system-window-left'),
69
+ btnSystemWindowRight: getElement('btn-system-window-right'),
70
+ btnSystemStartMenu: getElement('btn-system-start-menu'),
71
+ btnSystemWindowToggle: getElement('btn-system-window-toggle'),
72
+ btnSystemWindowClose: getElement('btn-system-window-close'),
73
+ };
74
+ }
75
+
76
+ function getVlcRemoteDom() {
77
+ return {
78
+ root: getElement('vlc-controls'),
79
+ btnVlcOpen: getElement('btn-vlc-open'),
80
+ btnVlcWindowToggle: getElement('btn-vlc-window-toggle'),
81
+ btnVlcWindowClose: getElement('btn-vlc-window-close'),
82
+ btnVlcPrevious: getElement('btn-vlc-previous'),
83
+ btnVlcPlayPause: getElement('btn-vlc-play-pause'),
84
+ btnVlcNext: getElement('btn-vlc-next'),
85
+ btnVlcSeekBackward: getElement('btn-vlc-seek-backward'),
86
+ btnVlcStop: getElement('btn-vlc-stop'),
87
+ btnVlcSeekForward: getElement('btn-vlc-seek-forward'),
88
+ btnVlcVolumeDown: getElement('btn-vlc-volume-down'),
89
+ btnVlcMute: getElement('btn-vlc-mute'),
90
+ btnVlcVolumeUp: getElement('btn-vlc-volume-up'),
91
+ btnVlcFullscreen: getElement('btn-vlc-fullscreen'),
92
+ };
93
+ }
94
+
95
+ function getSamsungRemoteDom() {
96
+ return {
97
+ root: getElement('tv-controls'),
98
+ btnSamsungOn: getElement('btn-samsung-on'),
99
+ btnSamsungOff: getElement('btn-samsung-off'),
100
+ btnSamsungVolUp: getElement('btn-samsung-volup'),
101
+ btnSamsungVolDown: getElement('btn-samsung-voldown'),
102
+ btnSamsungMute: getElement('btn-samsung-mute'),
103
+ btnSamsungInput: getElement('btn-samsung-input'),
104
+ btnSamsungEnter: getElement('btn-samsung-enter'),
105
+ btnSamsungPcInput: getElement('btn-samsung-pc-input'),
106
+ };
107
+ }
108
+
109
+ function getAdminRemoteDom() {
110
+ return {
111
+ btnForceUpdateCheck: getElement('btn-force-update-check'),
112
+ btnInstallUpdate: getElement('btn-install-update'),
113
+ btnRestartService: getElement('btn-restart-service'),
114
+ btnOpenQrBrowserServer: getElement('btn-open-qr-browser-server'),
115
+ btnOpenQrBrowserClient: getElement('btn-open-qr-browser-client'),
116
+ btnToggleQrOverlay: getElement('btn-toggle-qr-overlay'),
117
+ btnOpenServerInfoBrowserServer: getElement('btn-open-server-info-browser-server'),
118
+ btnOpenServerInfoBrowserClient: getElement('btn-open-server-info-browser-client'),
119
+ btnOpenConfigPage: getElement('btn-open-config-page'),
120
+ btnOpenPreferencesPage: getElement('btn-open-preferences-page'),
121
+ btnRotateEntryToken: getElement('btn-rotate-entry-token'),
122
+ adminActionsDisabledMessage: getElement('admin-actions-disabled-message'),
123
+ adminAppVersion: getElement('admin-app-version'),
124
+ };
125
+ }
126
+
127
+ function getPreviewRemoteDom() {
128
+ return {
129
+ root: getElement('cursor-preview'),
130
+ previewCanvas: getElement('preview-canvas'),
131
+ };
132
+ }
133
+
134
+ export function getDom() {
135
+ return {
136
+ ...getLayoutDom(),
137
+ remotes: {
138
+ mouse: getMouseRemoteDom(),
139
+ keyboard: getKeyboardRemoteDom(),
140
+ browser: getBrowserRemoteDom(),
141
+ system: getSystemRemoteDom(),
142
+ vlc: getVlcRemoteDom(),
143
+ samsung: getSamsungRemoteDom(),
144
+ admin: getAdminRemoteDom(),
145
+ preview: getPreviewRemoteDom(),
146
+ },
147
+ };
148
+ }