@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,10 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+
7
+ export const projectRoot = path.resolve(__dirname, '../..');
8
+ export const publicDir = path.join(projectRoot, 'public');
9
+ export const clientDir = path.join(projectRoot, 'client');
10
+ export const sharedUtilsDir = path.join(projectRoot, 'utils');
@@ -0,0 +1,57 @@
1
+ import { exec, execFile, spawn } from 'node:child_process';
2
+
3
+ export function execFileAsync(command, args = [], options = {}) {
4
+ const timeout = options.timeout ?? 3000;
5
+ return new Promise((resolve) => {
6
+ execFile(command, args, {
7
+ timeout,
8
+ env: options.env,
9
+ maxBuffer: options.maxBuffer,
10
+ }, (error, stdout = '', stderr = '') => {
11
+ resolve({
12
+ ok: !error,
13
+ stdout: String(stdout),
14
+ stderr: String(stderr),
15
+ });
16
+ });
17
+ });
18
+ }
19
+
20
+ export function execShell(command, timeoutMs) {
21
+ return new Promise((resolve) => {
22
+ exec(command, { timeout: timeoutMs, maxBuffer: 1024 * 1024 }, (error, stdout = '', stderr = '') => {
23
+ resolve({
24
+ ok: !error,
25
+ stdout: String(stdout).trim(),
26
+ stderr: String(stderr).trim(),
27
+ });
28
+ });
29
+ });
30
+ }
31
+
32
+ export function spawnDetached(command, args = []) {
33
+ return new Promise((resolve) => {
34
+ try {
35
+ const child = spawn(command, args, {
36
+ detached: true,
37
+ stdio: 'ignore',
38
+ });
39
+
40
+ let settled = false;
41
+ const done = (value) => {
42
+ if (!settled) {
43
+ settled = true;
44
+ resolve(value);
45
+ }
46
+ };
47
+
48
+ child.once('error', () => done(false));
49
+ child.once('spawn', () => {
50
+ child.unref();
51
+ done(true);
52
+ });
53
+ } catch (_error) {
54
+ resolve(false);
55
+ }
56
+ });
57
+ }
@@ -0,0 +1,11 @@
1
+ export async function loadRobot() {
2
+ try {
3
+ const robotModule = await import('@hurdlegroup/robotjs');
4
+ return robotModule.default || robotModule;
5
+ } catch (error) {
6
+ console.error('RobotJS n\'est pas disponible. Installez les dépendances natives puis relancez.');
7
+ console.error(error.message);
8
+ throw error;
9
+ }
10
+
11
+ }
@@ -0,0 +1,33 @@
1
+ export function parseSemver(version) {
2
+ const normalized = String(version || '').replace(/^v/i, '').trim();
3
+ const [core] = normalized.split('-');
4
+ const parts = core.split('.');
5
+ if (parts.length < 1 || parts.length > 3) {
6
+ return null;
7
+ }
8
+ const nums = parts.map((part) => Number(part));
9
+ if (nums.some((n) => !Number.isInteger(n) || n < 0)) {
10
+ return null;
11
+ }
12
+ while (nums.length < 3) {
13
+ nums.push(0);
14
+ }
15
+ return nums;
16
+ }
17
+
18
+ export function isVersionGreater(a, b) {
19
+ const av = parseSemver(a);
20
+ const bv = parseSemver(b);
21
+ if (!av || !bv) {
22
+ return false;
23
+ }
24
+ for (let i = 0; i < 3; i += 1) {
25
+ if (av[i] > bv[i]) {
26
+ return true;
27
+ }
28
+ if (av[i] < bv[i]) {
29
+ return false;
30
+ }
31
+ }
32
+ return false;
33
+ }
@@ -0,0 +1,7 @@
1
+ export function truncateText(value, max = 220) {
2
+ const text = String(value || '').trim();
3
+ if (text.length <= max) {
4
+ return text;
5
+ }
6
+ return `${text.slice(0, max)}...`;
7
+ }
@@ -0,0 +1,13 @@
1
+ export function createLazy(provider) {
2
+ let hasValue = false;
3
+ let value;
4
+
5
+ return () => {
6
+ if (!hasValue) {
7
+ value = provider();
8
+ hasValue = true;
9
+ }
10
+
11
+ return value;
12
+ };
13
+ }
@@ -0,0 +1,48 @@
1
+ export function disableReentrancy(callback, lock = {}) {
2
+ lock.reentrant = false;
3
+ return (...args) => {
4
+ if (!lock.reentrant) {
5
+ lock.reentrant = true;
6
+ try {
7
+ return callback(...args);
8
+ } finally {
9
+ lock.reentrant = false;
10
+ }
11
+ }
12
+ return undefined;
13
+ };
14
+ }
15
+
16
+ export function createReentrancyDisabler(callback) {
17
+ const lock = {};
18
+ return callback => disableReentrancy(callback, lock);
19
+ }
20
+
21
+ export function disableConcurrentCalls(...functions) {
22
+ const lock = {};
23
+ return functions.map(fun => disableReentrancy(fun, lock));
24
+ }
25
+
26
+ export function createQueuedRecompute(recompute) {
27
+ let running = false;
28
+ let pending = false;
29
+
30
+ return (...args) => {
31
+ if (running) {
32
+ pending = true;
33
+ return undefined;
34
+ }
35
+
36
+ running = true;
37
+ try {
38
+ let result;
39
+ do {
40
+ pending = false;
41
+ result = recompute(...args);
42
+ } while (pending);
43
+ return result;
44
+ } finally {
45
+ running = false;
46
+ }
47
+ };
48
+ }
package/utils/math.js ADDED
@@ -0,0 +1,26 @@
1
+ export function clamp(value, min, max) {
2
+ return Math.min(Math.max(value, min), max);
3
+ }
4
+
5
+ export function distance2D(a, b) {
6
+ return Math.hypot(a.x - b.x, a.y - b.y);
7
+ }
8
+
9
+ export function scaleSigned(value, gain) {
10
+ return Math.sign(value) * Math.abs(value) * gain;
11
+ }
12
+
13
+ export function applyNonLinearAcceleration(dx, dy, elapsedMs) {
14
+ const dt = Math.max(elapsedMs, 1);
15
+ const dist = Math.hypot(dx, dy);
16
+ const speed = dist / dt; // px/ms
17
+
18
+ // Courbe non lineaire: fine precision a basse vitesse, acceleration plus forte quand ca bouge vite.
19
+ const normalized = clamp(speed / 0.75, 0, 5);
20
+ const gain = clamp(0.55 + normalized ** 1.65, 0.55, 5.5);
21
+
22
+ return {
23
+ dx: dx * gain,
24
+ dy: dy * gain,
25
+ };
26
+ }
@@ -0,0 +1,61 @@
1
+ export const NOTIFICATION_TARGET_CLIENT = 'client';
2
+ export const NOTIFICATION_TARGET_HOST = 'host';
3
+
4
+ export const NOTIFICATION_ID_CLIENT_CONNECTED = 'clientConnected';
5
+ export const NOTIFICATION_ID_CLIENT_DISCONNECTED = 'clientDisconnected';
6
+ export const NOTIFICATION_ID_SESSION_CREATED = 'sessionCreated';
7
+ export const NOTIFICATION_ID_UPDATE_AVAILABLE = 'updateAvailable';
8
+ export const NOTIFICATION_ID_FORCE_UPDATE_CHECK = 'forceUpdateCheck';
9
+ export const NOTIFICATION_ID_UPDATE_INSTALL = 'updateInstall';
10
+ export const NOTIFICATION_ID_QR = 'qr';
11
+ export const NOTIFICATION_ID_SERVER_INFO = 'serverInfo';
12
+ export const NOTIFICATION_ID_SERVICE_RESTARTING = 'serviceRestarting';
13
+ export const NOTIFICATION_ID_SERVICE_RESTARTED = 'serviceRestarted';
14
+ export const NOTIFICATION_ID_QR_OVERLAY = 'qrOverlay';
15
+ export const NOTIFICATION_ID_ENTRY_TOKEN = 'entryToken';
16
+
17
+ export const NOTIFICATION_EVENT_DEFINITIONS = [
18
+ { id: NOTIFICATION_ID_CLIENT_CONNECTED, labelKey: 'adminConfig.notification.clientConnected' },
19
+ { id: NOTIFICATION_ID_CLIENT_DISCONNECTED, labelKey: 'adminConfig.notification.clientDisconnected' },
20
+ { id: NOTIFICATION_ID_SESSION_CREATED, labelKey: 'adminConfig.notification.sessionCreated' },
21
+ { id: NOTIFICATION_ID_UPDATE_AVAILABLE, labelKey: 'adminConfig.notification.updateAvailable' },
22
+ { id: NOTIFICATION_ID_FORCE_UPDATE_CHECK, labelKey: 'adminConfig.notification.forceUpdateCheck' },
23
+ { id: NOTIFICATION_ID_UPDATE_INSTALL, labelKey: 'adminConfig.notification.updateInstall' },
24
+ { id: NOTIFICATION_ID_QR, labelKey: 'adminConfig.notification.qr' },
25
+ { id: NOTIFICATION_ID_SERVER_INFO, labelKey: 'adminConfig.notification.serverInfo' },
26
+ { id: NOTIFICATION_ID_SERVICE_RESTARTING, labelKey: 'adminConfig.notification.serviceRestarting' },
27
+ { id: NOTIFICATION_ID_SERVICE_RESTARTED, labelKey: 'adminConfig.notification.serviceRestarted' },
28
+ { id: NOTIFICATION_ID_QR_OVERLAY, labelKey: 'adminConfig.notification.qrOverlay' },
29
+ { id: NOTIFICATION_ID_ENTRY_TOKEN, labelKey: 'adminConfig.notification.entryToken' },
30
+ ];
31
+
32
+ export function getNotificationTargetPath(notificationId, target) {
33
+ return `notifications.${notificationId}.${target}`;
34
+ }
35
+
36
+ export function getNotificationPaths() {
37
+ return NOTIFICATION_EVENT_DEFINITIONS.flatMap(({ id }) => [
38
+ getNotificationTargetPath(id, NOTIFICATION_TARGET_HOST),
39
+ getNotificationTargetPath(id, NOTIFICATION_TARGET_CLIENT),
40
+ ]);
41
+ }
42
+
43
+ export function createDefaultNotificationSettings(defaultValue = true) {
44
+ return Object.fromEntries(
45
+ NOTIFICATION_EVENT_DEFINITIONS.map(({ id }) => [
46
+ id,
47
+ {
48
+ [NOTIFICATION_TARGET_HOST]: defaultValue,
49
+ [NOTIFICATION_TARGET_CLIENT]: defaultValue,
50
+ },
51
+ ]),
52
+ );
53
+ }
54
+
55
+ export function isNotificationTargetEnabled(notificationsConfig, notificationId, target) {
56
+ if (!notificationId || !target) {
57
+ return true;
58
+ }
59
+
60
+ return Boolean(notificationsConfig?.[notificationId]?.[target]);
61
+ }
@@ -0,0 +1,79 @@
1
+ export function isPlainObject(value) {
2
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
3
+ }
4
+
5
+ export function setNestedValue(target, dottedPath, value) {
6
+ const segments = String(dottedPath || '').split('.').filter(Boolean);
7
+ if (!segments.length) {
8
+ return;
9
+ }
10
+
11
+ let cursor = target;
12
+ for (let index = 0; index < segments.length - 1; index += 1) {
13
+ const segment = segments[index];
14
+ if (!isPlainObject(cursor[segment])) {
15
+ cursor[segment] = {};
16
+ }
17
+ cursor = cursor[segment];
18
+ }
19
+
20
+ cursor[segments[segments.length - 1]] = value;
21
+ }
22
+
23
+ export function toFlatMap(value, prefix = '', target = new Map()) {
24
+ if (!isPlainObject(value)) {
25
+ if (prefix) {
26
+ target.set(prefix, value);
27
+ }
28
+ return target;
29
+ }
30
+
31
+ for (const [key, nestedValue] of Object.entries(value)) {
32
+ const nextPrefix = prefix ? `${prefix}.${key}` : key;
33
+ if (isPlainObject(nestedValue)) {
34
+ toFlatMap(nestedValue, nextPrefix, target);
35
+ } else {
36
+ target.set(nextPrefix, nestedValue);
37
+ }
38
+ }
39
+
40
+ return target;
41
+ }
42
+
43
+ export function deepMerge(base, override) {
44
+ if (!override || typeof override !== 'object' || Array.isArray(override)) {
45
+ return base;
46
+ }
47
+
48
+ const result = Array.isArray(base) ? [...base] : {...base};
49
+ for (const [key, value] of Object.entries(override)) {
50
+ const current = result[key];
51
+ if (
52
+ current
53
+ && typeof current === 'object'
54
+ && !Array.isArray(current)
55
+ && value
56
+ && typeof value === 'object'
57
+ && !Array.isArray(value)
58
+ ) {
59
+ result[key] = deepMerge(current, value);
60
+ } else if (value !== undefined && value !== null && value !== ''){
61
+ result[key] = value;
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+
67
+ export function compactObject(value) {
68
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
69
+ return value;
70
+ }
71
+
72
+ const compacted = Object.fromEntries(
73
+ Object.entries(value)
74
+ .map(([key, nestedValue]) => [key, compactObject(nestedValue)])
75
+ .filter(([, nestedValue]) => nestedValue !== undefined)
76
+ );
77
+
78
+ return Object.keys(compacted).length ? compacted : undefined;
79
+ }
@@ -0,0 +1,17 @@
1
+ export function createExactMatchPredicate(filters = {}) {
2
+ const entries = Object.entries(filters);
3
+ if (!entries.length) {
4
+ return () => true;
5
+ }
6
+
7
+ return (value) => entries.every(([key, expected]) => value?.[key] === expected);
8
+ }
9
+
10
+ export async function findFirstAvailable(items = [], tester = async () => false) {
11
+ for (const item of items) {
12
+ if (await tester(item)) {
13
+ return item;
14
+ }
15
+ }
16
+ return '';
17
+ }
@@ -0,0 +1,40 @@
1
+ export const REMOTE_EVENT_MOUSE_MOVE = 'mouse:move';
2
+ export const REMOTE_EVENT_MOUSE_CLICK = 'mouse:click';
3
+ export const REMOTE_EVENT_MOUSE_BUTTON = 'mouse:button';
4
+ export const REMOTE_EVENT_MOUSE_SCROLL = 'mouse:scroll';
5
+
6
+ export const REMOTE_EVENT_KEYBOARD_TEXT = 'keyboard:text';
7
+ export const REMOTE_EVENT_KEYBOARD_KEY = 'keyboard:key';
8
+
9
+ export const REMOTE_EVENT_PREVIEW_START = 'preview:start';
10
+ export const REMOTE_EVENT_PREVIEW_STOP = 'preview:stop';
11
+ export const REMOTE_EVENT_SYSTEM_RELOAD = 'system:reload';
12
+
13
+ export const REMOTE_EVENT_BROWSER_OPEN = 'browser:open';
14
+ export const REMOTE_EVENT_VLC_OPEN = 'vlc:open';
15
+ export const REMOTE_EVENT_VLC_COMMAND = 'vlc:command';
16
+ export const REMOTE_EVENT_VLC_WINDOW_TOGGLE = 'vlc:window-toggle';
17
+ export const REMOTE_EVENT_VLC_WINDOW_CLOSE = 'vlc:window-close';
18
+ export const REMOTE_EVENT_WINDOW_TOGGLE_MAXIMIZE = 'window:toggle-maximize';
19
+ export const REMOTE_EVENT_WINDOW_CLOSE = 'window:close';
20
+
21
+ export const REMOTE_EVENT_SAMSUNG_ON = 'samsung:on';
22
+ export const REMOTE_EVENT_SAMSUNG_OFF = 'samsung:off';
23
+ export const REMOTE_EVENT_SAMSUNG_VOL_UP = 'samsung:volup';
24
+ export const REMOTE_EVENT_SAMSUNG_VOL_DOWN = 'samsung:voldown';
25
+ export const REMOTE_EVENT_SAMSUNG_MUTE = 'samsung:mute';
26
+ export const REMOTE_EVENT_SAMSUNG_INPUT = 'samsung:input';
27
+ export const REMOTE_EVENT_SAMSUNG_ENTER = 'samsung:enter';
28
+ export const REMOTE_EVENT_SAMSUNG_PC_INPUT = 'samsung:pc-input';
29
+
30
+ export const REMOTE_EVENT_ADMIN_PREFIX = 'admin:';
31
+ export const REMOTE_EVENT_ADMIN_RESULT = 'admin:result';
32
+ export const REMOTE_EVENT_ADMIN_UPDATE_CHECK = 'admin:update-check';
33
+ export const REMOTE_EVENT_ADMIN_UPDATE_INSTALL = 'admin:update-install';
34
+ export const REMOTE_EVENT_ADMIN_SERVICE_RESTART = 'admin:service-restart';
35
+ export const REMOTE_EVENT_ADMIN_OPEN_QR_BROWSER_SERVER = 'admin:open-qr-browser-server';
36
+ export const REMOTE_EVENT_ADMIN_OPEN_QR_BROWSER_CLIENT = 'admin:open-qr-browser-client';
37
+ export const REMOTE_EVENT_ADMIN_OPEN_SERVER_INFO_BROWSER_SERVER = 'admin:open-server-info-browser-server';
38
+ export const REMOTE_EVENT_ADMIN_OPEN_SERVER_INFO_BROWSER_CLIENT = 'admin:open-server-info-browser-client';
39
+ export const REMOTE_EVENT_ADMIN_ROTATE_ENTRY_TOKEN = 'admin:rotate-entry-token';
40
+ export const REMOTE_EVENT_ADMIN_TOGGLE_QR_OVERLAY = 'admin:toggle-qr-overlay';
package/utils/sync.js ADDED
@@ -0,0 +1,3 @@
1
+ export function sleep(ms) {
2
+ return new Promise((resolve) => setTimeout(resolve, ms));
3
+ }
Binary file