@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,70 @@
1
+ import {execShell} from '../../utils/process.js';
2
+
3
+ function normalizeCommandResult(rawText, fallbackTitle) {
4
+ const text = String(rawText || '').trim();
5
+ if (!text) {
6
+ return { hasUpdate: false };
7
+ }
8
+
9
+ try {
10
+ const parsed = JSON.parse(text);
11
+ if (parsed && typeof parsed === 'object') {
12
+ const hasUpdate = Boolean(parsed.hasUpdate);
13
+ if (!hasUpdate) {
14
+ return { hasUpdate: false };
15
+ }
16
+ const key = String(parsed.key || `cmd:${Date.now()}`);
17
+ const title = String(parsed.title || fallbackTitle);
18
+ const message = String(parsed.message || 'Mise a jour detectee.');
19
+ const ttlMs = Number(parsed.ttlMs) > 0 ? Number(parsed.ttlMs) : 8000;
20
+ return { hasUpdate, key, title, message, ttlMs };
21
+ }
22
+ } catch (_error) {
23
+ // Fall back to plain text protocol.
24
+ }
25
+
26
+ const token = text.toLowerCase();
27
+ if (token === '0' || token === 'false' || token === 'no' || token === 'none') {
28
+ return { hasUpdate: false };
29
+ }
30
+
31
+ if (token === '1' || token === 'true' || token === 'yes' || token === 'update' || token === 'has_update') {
32
+ return {
33
+ hasUpdate: true,
34
+ key: `cmd:${Date.now()}`,
35
+ title: fallbackTitle,
36
+ message: 'Mise a jour detectee.',
37
+ ttlMs: 8000,
38
+ };
39
+ }
40
+
41
+ return {
42
+ hasUpdate: true,
43
+ key: `cmd:${text.slice(0, 64)}`,
44
+ title: fallbackTitle,
45
+ message: text,
46
+ ttlMs: 8000,
47
+ };
48
+ }
49
+
50
+ export class CommandUpdateSource {
51
+ constructor({checkCommand, timeoutSec, logger = null}) {
52
+ this.checkCommand = String(checkCommand || '').trim();
53
+ this.timeoutMs = Math.max(1000, Math.round(Number(timeoutSec || 20) * 1000));
54
+ this.logger = logger;
55
+ }
56
+
57
+ async check() {
58
+ if (!this.checkCommand) {
59
+ return { hasUpdate: false };
60
+ }
61
+
62
+ const result = await execShell(this.checkCommand, this.timeoutMs);
63
+ if (!result.ok) {
64
+ this.logger?.warn({stderr: result.stderr, stdout: result.stdout}, 'Update check command failed');
65
+ return { hasUpdate: false };
66
+ }
67
+
68
+ return normalizeCommandResult(result.stdout, 'Mise a jour detectee (commande)');
69
+ }
70
+ }
@@ -0,0 +1,34 @@
1
+ import { fetchJson } from '../../utils/http.js';
2
+ import { isVersionGreater } from '../../utils/semver.js';
3
+
4
+ export class NpmUpdateSource {
5
+ constructor({ packageName, currentVersion }) {
6
+ this.packageName = packageName;
7
+ this.currentVersion = currentVersion;
8
+ }
9
+
10
+ async check() {
11
+ if (!this.packageName || !this.currentVersion) {
12
+ return { hasUpdate: false };
13
+ }
14
+
15
+ const url = `https://registry.npmjs.org/${encodeURIComponent(this.packageName)}/latest`;
16
+ const data = await fetchJson(url);
17
+ const latest = String(data.version || '').trim();
18
+ if (!latest) {
19
+ return { hasUpdate: false };
20
+ }
21
+
22
+ if (!isVersionGreater(latest, this.currentVersion)) {
23
+ return { hasUpdate: false };
24
+ }
25
+
26
+ return {
27
+ hasUpdate: true,
28
+ key: `npm:${latest}`,
29
+ title: 'Mise a jour disponible',
30
+ message: `Version ${latest} disponible (actuelle: ${this.currentVersion}).`,
31
+ ttlMs: 8000,
32
+ };
33
+ }
34
+ }
@@ -0,0 +1,15 @@
1
+ function shellQuote(value) {
2
+ const text = String(value || '').trim();
3
+ if (!text) {
4
+ return '';
5
+ }
6
+ return `'${text.replace(/'/g, `'\"'\"'`)}'`;
7
+ }
8
+
9
+ export function buildNpmGlobalUpdateCommand(packageName) {
10
+ const name = String(packageName || '').trim();
11
+ if (!name) {
12
+ return '';
13
+ }
14
+ return `npm update -g ${shellQuote(name)}`;
15
+ }
@@ -0,0 +1,20 @@
1
+ import { NpmUpdateSource } from './NpmUpdateSource.js';
2
+ import { CommandUpdateSource } from './CommandUpdateSource.js';
3
+ import {createLogger} from '../../application/logger.js';
4
+
5
+ export function chooseUpdateCheckSource({getSystemConfig}) {
6
+ const updateConfig = getSystemConfig().updateCheck || {};
7
+ const checkCommand = String(updateConfig.checkCommand || '').trim();
8
+ const commandSource = new CommandUpdateSource({
9
+ checkCommand,
10
+ timeoutSec: updateConfig.checkTimeoutSec,
11
+ logger: createLogger('update-check'),
12
+ });
13
+ const npmSource = new NpmUpdateSource({
14
+ packageName: updateConfig.packageName,
15
+ currentVersion: updateConfig.currentVersion,
16
+ });
17
+ const checkSource = checkCommand ? commandSource : npmSource;
18
+
19
+ return () => checkSource.check();
20
+ }
@@ -0,0 +1,5 @@
1
+ import {resolveInstallUpdateCommand} from './resolveInstallUpdateCommand.js';
2
+
3
+ export function chooseUpdateInstallSource({getSystemConfig}) {
4
+ return resolveInstallUpdateCommand({getSystemConfig});
5
+ }
@@ -0,0 +1,109 @@
1
+ import {chooseUpdateCheckSource} from "./chooseUpdateCheckSource.js";
2
+ import {chooseUpdateInstallSource} from "./chooseUpdateInstallSource.js";
3
+ import {
4
+ PUBSUB_EVENT_UPDATE_AVAILABLE,
5
+ PUBSUB_EVENT_UPDATE_CHECK,
6
+ PUBSUB_EVENT_UPDATE_ERROR,
7
+ PUBSUB_SERVICE_UPDATE_MANAGER
8
+ } from "../pubsub/serviceEventConstants.js";
9
+ import {createLogger} from '../../application/logger.js';
10
+
11
+ export function createUpdateManager(services) {
12
+ const log = createLogger('update-check');
13
+ let lastKey = '';
14
+ let lastInstallCommand = '';
15
+ let lastResult = null;
16
+
17
+ function publishState(type = PUBSUB_EVENT_UPDATE_CHECK) {
18
+ services.getEvents().publishState(PUBSUB_SERVICE_UPDATE_MANAGER, {
19
+ enabled: Boolean(services.getConfig().updateCheck?.enabled),
20
+ lastKey,
21
+ lastInstallCommand,
22
+ lastResult,
23
+ }, {type});
24
+ }
25
+
26
+ async function check() {
27
+ if (!services.getConfig().updateCheck?.enabled) {
28
+ lastResult = {
29
+ checked: true,
30
+ hasUpdate: false,
31
+ skipped: true,
32
+ checkedAt: new Date().toISOString(),
33
+ };
34
+ publishState(PUBSUB_EVENT_UPDATE_CHECK);
35
+ return {
36
+ checked: true,
37
+ hasUpdate: false,
38
+ };
39
+ }
40
+
41
+ try {
42
+ const result = await chooseUpdateCheckSource(services)();
43
+
44
+ if (!result?.hasUpdate || !result.key || result.key === lastKey) {
45
+ log.debug('Update check: no update');
46
+ lastResult = {
47
+ checked: true,
48
+ hasUpdate: false,
49
+ checkedAt: new Date().toISOString(),
50
+ };
51
+ publishState(PUBSUB_EVENT_UPDATE_CHECK);
52
+ return {
53
+ checked: true,
54
+ hasUpdate: false,
55
+ };
56
+ }
57
+
58
+ lastKey = result.key;
59
+ lastResult = {
60
+ checked: true,
61
+ hasUpdate: true,
62
+ key: result.key,
63
+ title: result.title,
64
+ message: result.message,
65
+ ttlMs: result.ttlMs || 8000,
66
+ checkedAt: new Date().toISOString(),
67
+ };
68
+ publishState(PUBSUB_EVENT_UPDATE_AVAILABLE);
69
+ return {
70
+ checked: true,
71
+ hasUpdate: true,
72
+ key: result.key,
73
+ };
74
+ } catch (_error) {
75
+ log.error({err: _error}, 'Update check: error');
76
+ lastResult = {
77
+ checked: false,
78
+ hasUpdate: false,
79
+ checkedAt: new Date().toISOString(),
80
+ error: _error.message,
81
+ };
82
+ publishState(PUBSUB_EVENT_UPDATE_ERROR);
83
+ return {
84
+ checked: false,
85
+ hasUpdate: false,
86
+ };
87
+ }
88
+ }
89
+
90
+ async function update() {
91
+ const install = chooseUpdateInstallSource(services);
92
+ lastInstallCommand = String(install.command || '');
93
+ log.info({installCommand: lastInstallCommand}, 'Exécution commande install update');
94
+ const result = await install();
95
+ if (result.ok) {
96
+ log.info('Install update terminée avec succès');
97
+ return result;
98
+ }
99
+ if (result?.status === 'failed') {
100
+ log.error({details: result.details}, 'Install update en échec');
101
+ }
102
+ return result;
103
+ }
104
+
105
+ return {
106
+ check,
107
+ update,
108
+ }
109
+ }
@@ -0,0 +1,42 @@
1
+ import {execShell} from '../../utils/process.js';
2
+ import {truncateText} from '../../utils/truncateText.js';
3
+ import {buildNpmGlobalUpdateCommand} from './buildNpmGlobalUpdateCommand.js';
4
+
5
+ export function resolveInstallUpdateCommand({getSystemConfig}) {
6
+ const updateConfig = getSystemConfig().updateCheck || {};
7
+ const installCommand = String(updateConfig.installCommand || '').trim();
8
+ const resolvedCommand = installCommand || buildNpmGlobalUpdateCommand(updateConfig.packageName);
9
+ const timeoutMs = Math.max(10_000, Number(updateConfig.installTimeoutSec || 0) * 1000);
10
+
11
+ const runInstall = async () => {
12
+ if (!resolvedCommand) {
13
+ return {
14
+ ok: false,
15
+ status: 'no-command',
16
+ message: 'Aucune commande update disponible.',
17
+ };
18
+ }
19
+
20
+ const result = await execShell(resolvedCommand, timeoutMs);
21
+ if (result.ok) {
22
+ return {
23
+ ok: true,
24
+ status: 'completed',
25
+ message: 'Installation terminee.',
26
+ command: resolvedCommand,
27
+ };
28
+ }
29
+
30
+ const details = truncateText(result.stderr || result.stdout || 'Erreur inconnue');
31
+ return {
32
+ ok: false,
33
+ status: 'failed',
34
+ message: `Echec installation: ${details}`,
35
+ details,
36
+ command: resolvedCommand,
37
+ };
38
+ };
39
+
40
+ runInstall.command = resolvedCommand;
41
+ return runInstall;
42
+ }
@@ -0,0 +1,42 @@
1
+ import {createLazy} from "../../../utils/createLazy.js";
2
+ import {getSystemConfig} from "../../services/config/index.js";
3
+ import {createPersistence} from "../../services/persistence/index.js";
4
+ import {createApplicationDaemonService} from "../../services/application/createApplicationDaemonService.js";
5
+ import {formatCliCommand} from "./parseCliArgs.js";
6
+
7
+ function createLocalDaemonServices() {
8
+ const services = {};
9
+ services.getSystemConfig = createLazy(() => getSystemConfig());
10
+ services.getPersistence = createLazy(() => createPersistence(services));
11
+ services.getApplicationDaemonService = createLazy(() => createApplicationDaemonService(services));
12
+ return services;
13
+ }
14
+
15
+ export async function executeLocalServiceCommand(command) {
16
+ const services = createLocalDaemonServices();
17
+ const action = String(command?.args?.action || '').trim();
18
+
19
+ if (action === 'install') {
20
+ return services.getApplicationDaemonService().install();
21
+ }
22
+
23
+ if (action === 'disable') {
24
+ return services.getApplicationDaemonService().disable();
25
+ }
26
+
27
+ if (action === 'uninstall') {
28
+ return services.getApplicationDaemonService().uninstall();
29
+ }
30
+
31
+ if (action === 'restart') {
32
+ return services.getApplicationDaemonService().restart({
33
+ cause: 'user',
34
+ source: 'cli',
35
+ });
36
+ }
37
+
38
+ return {
39
+ ok: false,
40
+ message: `Commande inconnue: ${formatCliCommand(command)}`,
41
+ };
42
+ }
@@ -0,0 +1,5 @@
1
+ import {getCliSocketAdapter} from '../cliSocket.js';
2
+
3
+ export function getCliSocketPath() {
4
+ return getCliSocketAdapter().getCliSocketPath();
5
+ }
@@ -0,0 +1,110 @@
1
+ import yargs from 'yargs/yargs.js';
2
+
3
+ function normalizeVerbosity(value) {
4
+ return Math.max(0, Number.parseInt(value || 0, 10) || 0);
5
+ }
6
+
7
+ function joinParts(parts) {
8
+ return parts
9
+ .map((part) => String(part ?? '').trim())
10
+ .filter(Boolean)
11
+ .join(' ');
12
+ }
13
+
14
+ export function parseCliArgs(args) {
15
+ let command = {
16
+ name: '',
17
+ args: {},
18
+ };
19
+
20
+ const parsed = yargs(args)
21
+ .scriptName('remote-mouse')
22
+ .help(false)
23
+ .version(false)
24
+ .parserConfiguration({
25
+ 'camel-case-expansion': false,
26
+ 'strip-aliased': true,
27
+ 'strip-dashed': true,
28
+ })
29
+ .option('verbosity', {
30
+ type: 'number',
31
+ default: 0,
32
+ describe: 'Niveau de verbosite des logs pour la commande CLI.',
33
+ })
34
+ .count('v')
35
+ .command('help', false, () => {}, () => {
36
+ command = {name: 'help', args: {}};
37
+ })
38
+ .command('config [action] [path] [value..]', false, (builder) => builder
39
+ .positional('action', {type: 'string'})
40
+ .positional('path', {type: 'string'})
41
+ .positional('value', {array: true}), (argv) => {
42
+ command = {
43
+ name: 'config',
44
+ args: {
45
+ action: String(argv.action || '').trim(),
46
+ path: String(argv.path || '').trim(),
47
+ value: joinParts(argv.value || []),
48
+ },
49
+ };
50
+ })
51
+ .command('sys-config', false, () => {}, () => {
52
+ command = {name: 'sys-config', args: {}};
53
+ })
54
+ .command('info', false, () => {}, () => {
55
+ command = {name: 'info', args: {}};
56
+ })
57
+ .command('system-info', false, () => {}, () => {
58
+ command = {name: 'system-info', args: {}};
59
+ })
60
+ .command('service <action>', false, (builder) => builder
61
+ .positional('action', {type: 'string'}), (argv) => {
62
+ command = {
63
+ name: 'service',
64
+ args: {
65
+ action: String(argv.action || '').trim(),
66
+ },
67
+ };
68
+ })
69
+ .command('tasks', false, () => {}, () => {
70
+ command = {name: 'tasks', args: {}};
71
+ })
72
+ .command('task-manager', false, () => {}, () => {
73
+ command = {name: 'task-manager', args: {}};
74
+ })
75
+ .command('samsung-detect', false, () => {}, () => {
76
+ command = {name: 'samsung-detect', args: {}};
77
+ })
78
+ .command('tokens', false, () => {}, () => {
79
+ command = {name: 'tokens', args: {}};
80
+ })
81
+ .command('open-qr', false, () => {}, () => {
82
+ command = {name: 'open-qr', args: {}};
83
+ })
84
+ .command('qr', false, () => {}, () => {
85
+ command = {name: 'qr', args: {}};
86
+ })
87
+ .parse();
88
+
89
+ return {
90
+ command,
91
+ options: {
92
+ verbosity: Math.max(normalizeVerbosity(parsed.verbosity), normalizeVerbosity(parsed.v)),
93
+ },
94
+ };
95
+ }
96
+
97
+ export function formatCliCommand(command) {
98
+ if (!command || typeof command !== 'object') {
99
+ return '';
100
+ }
101
+
102
+ if (command.name === 'config') {
103
+ return joinParts(['config', command.args?.action, command.args?.path, command.args?.value]);
104
+ }
105
+ if (command.name === 'service') {
106
+ return joinParts(['service', command.args?.action]);
107
+ }
108
+
109
+ return String(command.name || '').trim();
110
+ }
@@ -0,0 +1,18 @@
1
+ export function printCliLog(entry) {
2
+ const data = entry.data === undefined ? '' : ` ${JSON.stringify(entry.data)}`;
3
+ console.error(`[${entry.at}] ${entry.level} ${entry.scope}: ${entry.message}${data}`);
4
+ }
5
+
6
+ export function printCliResult(result) {
7
+ if (Array.isArray(result?.logs)) {
8
+ for (const entry of result.logs) {
9
+ printCliLog(entry);
10
+ }
11
+ }
12
+ if (result?.data !== undefined) {
13
+ console.log(JSON.stringify(result.data, null, 2));
14
+ }
15
+ if (result?.message) {
16
+ console.log(result.message);
17
+ }
18
+ }
@@ -0,0 +1,50 @@
1
+ import {parseCliArgs} from "./parseCliArgs.js";
2
+ import {executeLocalServiceCommand} from "./executeLocalServiceCommand.js";
3
+ import {printCliLog, printCliResult} from "./printCliResult.js";
4
+ import {sendCliCommand} from "./sendCliCommand.js";
5
+ import {withCliVerbosity} from "../srv/executeCliRequest.js";
6
+
7
+ function isLocalServiceCommand(command) {
8
+ return command?.name === 'service'
9
+ && ['install', 'disable', 'uninstall', 'restart'].includes(String(command.args?.action || '').trim());
10
+ }
11
+
12
+ export async function runCliCmd(args) {
13
+ const normalizedArgs = args[0] === 'cli'
14
+ ? args.slice(1)
15
+ : args;
16
+ const {command, options} = parseCliArgs(normalizedArgs);
17
+
18
+ if (!command?.name || command.name === 'help') {
19
+ console.log('Usage:');
20
+ console.log(' remote-mouse Demarre le serveur');
21
+ console.log(' remote-mouse config Affiche la configuration persistée effective');
22
+ console.log(' remote-mouse service install Installe le daemon/service local');
23
+ console.log(' remote-mouse service disable Desactive le daemon/service local');
24
+ console.log(' remote-mouse service uninstall Desinstalle le daemon/service local');
25
+ console.log(' remote-mouse service restart Redemarre le daemon/service local');
26
+ console.log(' remote-mouse tasks Affiche les informations du task manager');
27
+ console.log(' remote-mouse task-manager Alias de tasks');
28
+ console.log(' remote-mouse info --verbosity 2 Affiche les capacites serveur avec logs detailles');
29
+ console.log(' remote-mouse system-info Alias de info');
30
+ console.log(' remote-mouse tokens Liste les tokens en base');
31
+ console.log(' remote-mouse open-qr Envoie une commande au service deja demarre');
32
+ console.log(' remote-mouse qr Alias de open-qr');
33
+ process.exit(0);
34
+ }
35
+
36
+ try {
37
+ if (isLocalServiceCommand(command)) {
38
+ const result = await withCliVerbosity(options, () => executeLocalServiceCommand(command), printCliLog);
39
+ printCliResult(result);
40
+ process.exit(result?.ok ? 0 : 1);
41
+ }
42
+
43
+ const result = await sendCliCommand(command, options, {onLog: printCliLog});
44
+ printCliResult(result);
45
+ process.exit(result?.ok ? 0 : 1);
46
+ } catch (error) {
47
+ console.error(`Impossible de contacter le service: ${error.message}`);
48
+ process.exit(1);
49
+ }
50
+ }
@@ -0,0 +1,76 @@
1
+ import net from 'node:net';
2
+ import {getCliSocketAdapter} from '../cliSocket.js';
3
+
4
+ function parseResponseLine(line, state, onLog) {
5
+ const payload = JSON.parse(line);
6
+ if (payload?.type === 'log') {
7
+ if (typeof onLog === 'function') {
8
+ onLog(payload.entry);
9
+ }
10
+ return;
11
+ }
12
+
13
+ if (payload?.type === 'result') {
14
+ state.result = payload.result;
15
+ return;
16
+ }
17
+
18
+ state.result = payload;
19
+ }
20
+
21
+ export async function sendCliCommand(command, options = {}, {onLog = null} = {}) {
22
+ const cliSocket = getCliSocketAdapter();
23
+ const socketPath = cliSocket.getCliSocketPath();
24
+
25
+ return new Promise((resolve, reject) => {
26
+ const socket = net.createConnection(socketPath);
27
+ const state = {
28
+ buffer: '',
29
+ result: undefined,
30
+ };
31
+
32
+ socket.setEncoding('utf8');
33
+
34
+ socket.on('connect', () => {
35
+ socket.end(JSON.stringify({
36
+ command,
37
+ options,
38
+ }));
39
+ });
40
+
41
+ socket.on('data', (chunk) => {
42
+ state.buffer += chunk;
43
+ const lines = state.buffer.split('\n');
44
+ state.buffer = lines.pop() || '';
45
+ for (const line of lines) {
46
+ const trimmed = line.trim();
47
+ if (trimmed) {
48
+ parseResponseLine(trimmed, state, onLog);
49
+ }
50
+ }
51
+ });
52
+
53
+ socket.on('end', () => {
54
+ try {
55
+ const remaining = state.buffer.trim();
56
+ if (remaining) {
57
+ parseResponseLine(remaining, state, onLog);
58
+ }
59
+ resolve(state.result || {});
60
+ } catch (error) {
61
+ reject(error);
62
+ }
63
+ });
64
+
65
+ socket.on('error', (error) => {
66
+ const staleSocketRemoved = cliSocket.cleanupCliClientConnectionError(socketPath, error);
67
+
68
+ if (staleSocketRemoved) {
69
+ reject(new Error(`Service indisponible. Le socket stale a été supprimé: ${socketPath}`));
70
+ return;
71
+ }
72
+
73
+ reject(error);
74
+ });
75
+ });
76
+ }
@@ -0,0 +1,29 @@
1
+ import * as darwinCliSocket from '../os/darwin/cliSocket.js';
2
+ import * as linuxCliSocket from '../os/linux/cliSocket.js';
3
+ import * as win32CliSocket from '../os/win32/cliSocket.js';
4
+
5
+ const unsupportedCliSocket = {
6
+ getCliSocketPath() {
7
+ return linuxCliSocket.getCliSocketPath();
8
+ },
9
+ prepareCliServerSocket: linuxCliSocket.prepareCliServerSocket,
10
+ cleanupCliServerSocket: linuxCliSocket.cleanupCliServerSocket,
11
+ secureCliServerSocket: linuxCliSocket.secureCliServerSocket,
12
+ cleanupCliClientConnectionError: linuxCliSocket.cleanupCliClientConnectionError,
13
+ };
14
+
15
+ export function getCliSocketAdapter(platform = process.platform) {
16
+ if (platform === 'win32') {
17
+ return win32CliSocket;
18
+ }
19
+
20
+ if (platform === 'darwin') {
21
+ return darwinCliSocket;
22
+ }
23
+
24
+ if (platform === 'linux') {
25
+ return linuxCliSocket;
26
+ }
27
+
28
+ return unsupportedCliSocket;
29
+ }