@hakimedes/dsh-easyremote 0.2.0

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/android.js +50 -0
  4. package/dist/android.js.map +1 -0
  5. package/dist/autostart.js +104 -0
  6. package/dist/autostart.js.map +1 -0
  7. package/dist/cli-views.js +32 -0
  8. package/dist/cli-views.js.map +1 -0
  9. package/dist/cli.js +584 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cloudflared.js +54 -0
  12. package/dist/cloudflared.js.map +1 -0
  13. package/dist/command-router.js +12 -0
  14. package/dist/command-router.js.map +1 -0
  15. package/dist/connector-install.js +42 -0
  16. package/dist/connector-install.js.map +1 -0
  17. package/dist/controller.js +206 -0
  18. package/dist/controller.js.map +1 -0
  19. package/dist/doctor.js +46 -0
  20. package/dist/doctor.js.map +1 -0
  21. package/dist/domain.js +33 -0
  22. package/dist/domain.js.map +1 -0
  23. package/dist/download.js +59 -0
  24. package/dist/download.js.map +1 -0
  25. package/dist/index.js +16 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/install-state.js +48 -0
  28. package/dist/install-state.js.map +1 -0
  29. package/dist/local-runtime.js +115 -0
  30. package/dist/local-runtime.js.map +1 -0
  31. package/dist/maintenance.js +58 -0
  32. package/dist/maintenance.js.map +1 -0
  33. package/dist/named-tunnel.js +49 -0
  34. package/dist/named-tunnel.js.map +1 -0
  35. package/dist/runtime.js +110 -0
  36. package/dist/runtime.js.map +1 -0
  37. package/dist/setup-progress.js +23 -0
  38. package/dist/setup-progress.js.map +1 -0
  39. package/dist/supervisor.js +81 -0
  40. package/dist/supervisor.js.map +1 -0
  41. package/dist/wizard.js +251 -0
  42. package/dist/wizard.js.map +1 -0
  43. package/package.json +56 -0
  44. package/runtime/connector/README.md +52 -0
  45. package/runtime/connector/cordis.patch.yml +3 -0
  46. package/runtime/connector/dsh.plugin.json +16 -0
  47. package/runtime/connector/lib/client.js +262 -0
  48. package/runtime/connector/lib/command-cache.d.ts +7 -0
  49. package/runtime/connector/lib/command-cache.js +37 -0
  50. package/runtime/connector/lib/command-cache.js.map +1 -0
  51. package/runtime/connector/lib/connector-config.d.ts +20 -0
  52. package/runtime/connector/lib/connector-config.js +74 -0
  53. package/runtime/connector/lib/connector-config.js.map +1 -0
  54. package/runtime/connector/lib/dsh-api.d.ts +38 -0
  55. package/runtime/connector/lib/dsh-api.js +76 -0
  56. package/runtime/connector/lib/dsh-api.js.map +1 -0
  57. package/runtime/connector/lib/index.d.ts +4 -0
  58. package/runtime/connector/lib/index.js +913 -0
  59. package/runtime/connector/lib/index.js.map +1 -0
  60. package/runtime/connector/lib/protocol.d.ts +15 -0
  61. package/runtime/connector/lib/protocol.js +96 -0
  62. package/runtime/connector/lib/protocol.js.map +1 -0
  63. package/runtime/connector/package.json +44 -0
  64. package/runtime/hub/database.js +239 -0
  65. package/runtime/hub/database.js.map +1 -0
  66. package/runtime/hub/index.js +1804 -0
  67. package/runtime/hub/index.js.map +1 -0
  68. package/runtime/hub/schema.js +111 -0
  69. package/runtime/hub/schema.js.map +1 -0
package/dist/cli.js ADDED
@@ -0,0 +1,584 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'node:child_process';
3
+ import { accessSync, chmodSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync, } from 'node:fs';
4
+ import { homedir, hostname } from 'node:os';
5
+ import { delimiter, dirname, join, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { v7 as uuidv7 } from 'uuid';
8
+ import { installCommunityApk } from './android.js';
9
+ import { installUserAutostart, removeUserAutostart } from './autostart.js';
10
+ import { formatHelp, formatStatus } from './cli-views.js';
11
+ import { routeCommand } from './command-router.js';
12
+ import { buildConnectorInstallLaunch, inferDshHomeFromLauncher, updateCordisPatch } from './connector-install.js';
13
+ import { EasyRemoteController } from './controller.js';
14
+ import { probeWebSocket, runDoctor } from './doctor.js';
15
+ import { normalizeHostname, normalizeNameserver, verifyNameservers } from './domain.js';
16
+ import { loadInstallState } from './install-state.js';
17
+ import { ensureCloudflaredRuntime, findAvailablePort, inspectCloudflaredRuntime, runProcessLaunch, spawnLoggedProcess } from './local-runtime.js';
18
+ import { buildLoginLaunch, provisionNamedTunnel } from './named-tunnel.js';
19
+ import { createRuntimePaths } from './runtime.js';
20
+ import { loadSetupProgress, saveSetupProgress } from './setup-progress.js';
21
+ import { stopManagedChild, waitForHubMeta, waitForQuickOrigin } from './supervisor.js';
22
+ import { startWizardServer } from './wizard.js';
23
+ const VERSION = '0.2.0';
24
+ const PACKAGE_NAME = '@hakimedes/dsh-easyremote';
25
+ const CONNECTOR_VERSION = '0.2.0';
26
+ const COMMUNITY_APK_NAME = 'DSH-EasyRemote-Community.apk';
27
+ const RELEASE_BASE = 'https://github.com/hakimedes/dsh-easyremote/releases/latest/download';
28
+ const CLI_SCRIPT = fileURLToPath(import.meta.url);
29
+ const PACKAGE_ROOT = resolve(dirname(CLI_SCRIPT), '..');
30
+ const APP_HOME = process.env.DSH_EASYREMOTE_HOME || join(homedir(), '.dsh-easyremote');
31
+ const paths = createRuntimePaths(APP_HOME);
32
+ const hubScript = join(PACKAGE_ROOT, 'runtime', 'hub', 'index.js');
33
+ const connectorRuntime = join(PACKAGE_ROOT, 'runtime', 'connector');
34
+ const originCertificate = join(homedir(), '.cloudflared', 'cert.pem');
35
+ const controller = new EasyRemoteController(paths, {
36
+ ensureCloudflared: () => ensureCloudflaredRuntime(paths),
37
+ findPort: (preferred) => findAvailablePort(preferred),
38
+ spawnProcess: (launch, role) => spawnLoggedProcess(paths, launch, role),
39
+ waitForHub: (origin) => waitForHubMeta(origin),
40
+ waitForQuick: (child) => waitForQuickOrigin(child),
41
+ waitForNamed: async (origin) => {
42
+ const meta = await waitForHubMeta(origin, { timeoutMs: 60_000, retryMs: 1_000 });
43
+ const state = loadInstallState(paths.installState);
44
+ if (state?.hub.hubId && meta.hubId !== state.hub.hubId)
45
+ throw new Error('Fixed hostname points to a different DSH EasyRemote Hub');
46
+ },
47
+ provisionNamed: (options) => provisionNamedTunnel({
48
+ ...options,
49
+ run: runProcessLaunch,
50
+ }),
51
+ stopProcess: (child) => stopManagedChild(child),
52
+ hubScript,
53
+ createInstallId: uuidv7,
54
+ nodeName: hostname,
55
+ });
56
+ async function main() {
57
+ assertNodeVersion();
58
+ const handlers = {
59
+ setup: setupCommand,
60
+ quick: quickCommand,
61
+ start: startCommand,
62
+ stop: stopCommand,
63
+ status: statusCommand,
64
+ doctor: doctorCommand,
65
+ backup: backupCommand,
66
+ restore: restoreCommand,
67
+ upgrade: upgradeCommand,
68
+ uninstall: uninstallCommand,
69
+ help: async () => console.log(formatHelp()),
70
+ serviceRun: serviceRunCommand,
71
+ };
72
+ await routeCommand(process.argv.slice(2), {
73
+ loadState: () => loadInstallState(paths.installState),
74
+ handlers,
75
+ });
76
+ }
77
+ async function setupCommand() {
78
+ const actions = {
79
+ quick: async () => {
80
+ persistProgress({ schemaVersion: 1, mode: 'quick', phase: 'quick-starting', updatedAt: Date.now() });
81
+ const result = await controller.startQuick();
82
+ const connector = await installConnectorSafely('web');
83
+ persistProgress({ schemaVersion: 1, mode: 'quick', phase: 'complete', updatedAt: Date.now() });
84
+ monitorController();
85
+ return {
86
+ ok: true,
87
+ message: [
88
+ `临时连接已建立:${result.state.tunnel.publicOrigin}`,
89
+ result.recoveryRequired ? '公网地址已变化,请在 DSH Web 配对页扫描一次恢复二维码。' : '请打开 DSH Web 的 /__dsh_remote_v1/pair 扫码。',
90
+ connector,
91
+ ].join('\n'),
92
+ };
93
+ },
94
+ 'named/domain': async (body) => {
95
+ const domain = parseNamedBody(body, false);
96
+ const progress = {
97
+ schemaVersion: 1,
98
+ mode: 'named',
99
+ phase: 'cloudflare-site',
100
+ rootDomain: domain.rootDomain,
101
+ hostname: domain.hostname,
102
+ ...(domain.nameservers ? { nameservers: domain.nameservers } : {}),
103
+ updatedAt: Date.now(),
104
+ };
105
+ persistProgress(progress);
106
+ return { ok: true, progress, message: '域名已保存。请在 Cloudflare 添加站点,并填写其分配的两条 Nameserver。' };
107
+ },
108
+ 'named/check-ns': async (body) => {
109
+ const domain = parseNamedBody(body, true);
110
+ const result = await verifyNameservers(domain.rootDomain, domain.nameservers);
111
+ const progress = {
112
+ schemaVersion: 1,
113
+ mode: 'named',
114
+ phase: result.active ? 'cloudflare-site' : 'nameservers-pending',
115
+ rootDomain: domain.rootDomain,
116
+ hostname: domain.hostname,
117
+ nameservers: domain.nameservers,
118
+ updatedAt: Date.now(),
119
+ };
120
+ persistProgress(progress);
121
+ return {
122
+ ok: result.active,
123
+ progress,
124
+ message: result.active ? 'Nameserver 已生效,可以进行 Cloudflare 授权。' : `仍在等待:${result.missing.join(', ')}`,
125
+ };
126
+ },
127
+ 'named/authorize': async (body) => {
128
+ const domain = parseNamedBody(body, true);
129
+ const ns = await verifyNameservers(domain.rootDomain, domain.nameservers);
130
+ if (!ns.active)
131
+ throw new Error(`Nameserver 尚未生效:${ns.missing.join(', ')}`);
132
+ await ensureCloudflaredRuntime(paths);
133
+ persistProgress(namedProgress(domain, 'cloudflare-authorizing'));
134
+ if (!existsSync(originCertificate))
135
+ await runProcessLaunch(buildLoginLaunch(paths.cloudflaredExecutable), true);
136
+ if (!existsSync(originCertificate))
137
+ throw new Error('Cloudflare 授权未生成 cert.pem');
138
+ persistProgress(namedProgress(domain, 'cloudflare-authorized'));
139
+ return { ok: true, message: 'Cloudflare 授权完成。程序未读取账号密码。' };
140
+ },
141
+ 'named/provision': async (body) => {
142
+ const domain = parseNamedBody(body, true);
143
+ const ns = await verifyNameservers(domain.rootDomain, domain.nameservers);
144
+ if (!ns.active)
145
+ throw new Error(`Nameserver 尚未生效:${ns.missing.join(', ')}`);
146
+ persistProgress(namedProgress(domain, 'named-provisioning'));
147
+ const previous = loadInstallState(paths.installState);
148
+ const installId = previous?.installId ?? uuidv7();
149
+ const result = await controller.configureNamed({
150
+ hostname: domain.hostname,
151
+ tunnelName: `dsh-easyremote-${installId}`,
152
+ originCertificate,
153
+ });
154
+ const connector = await installConnectorSafely('web');
155
+ await controller.stop();
156
+ const serviceCommand = await materializeServiceCommand();
157
+ await installUserAutostart({
158
+ home: homedir(),
159
+ command: serviceCommand,
160
+ run: (command, args) => runProcessLaunch({ command, args }),
161
+ });
162
+ persistProgress(namedProgress(domain, 'complete'));
163
+ return {
164
+ ok: true,
165
+ message: [
166
+ `固定连接已建立:${result.state.tunnel.publicOrigin}`,
167
+ result.recoveryRequired ? '请扫描一次恢复二维码,让手机切换到固定域名。' : '请在 DSH Web 配对页扫码。',
168
+ connector,
169
+ '已安装当前用户登录后自启服务。',
170
+ ].join('\n'),
171
+ };
172
+ },
173
+ 'apk/install-adb': installApkWizardAction,
174
+ };
175
+ const wizard = await startWizardServer({
176
+ version: VERSION,
177
+ getState: async () => ({
178
+ state: loadInstallState(paths.installState),
179
+ progress: loadSetupProgress(paths.setupProgress),
180
+ message: '本机控制面已就绪。请选择连接路径。',
181
+ }),
182
+ actions,
183
+ });
184
+ console.log(`DSH EasyRemote setup: ${wizard.launchUrl}`);
185
+ openBrowser(wizard.launchUrl);
186
+ await waitForSignal();
187
+ await controller.stop();
188
+ await wizard.close();
189
+ }
190
+ async function quickCommand() {
191
+ const result = await controller.startQuick();
192
+ console.log(`Quick Tunnel: ${result.state.tunnel.publicOrigin}`);
193
+ console.log(result.recoveryRequired
194
+ ? 'Address changed. Open DSH Web /__dsh_remote_v1/pair and scan the recovery QR.'
195
+ : 'Open DSH Web /__dsh_remote_v1/pair to pair the Community APK.');
196
+ await runForeground(formatStatus(result.state, true));
197
+ }
198
+ async function startCommand() {
199
+ const state = loadInstallState(paths.installState);
200
+ if (!state)
201
+ return setupCommand();
202
+ if (await localHubOnline(state.hub.port)) {
203
+ const status = formatStatus(state, true);
204
+ console.log(status);
205
+ await holdControlConsole(status);
206
+ return;
207
+ }
208
+ const result = state.activeMode === 'named' ? await controller.startNamed() : await controller.startQuick();
209
+ const status = formatStatus(result.state, true);
210
+ console.log(status);
211
+ await runForeground(status);
212
+ }
213
+ async function serviceRunCommand() {
214
+ const state = loadInstallState(paths.installState);
215
+ if (state?.activeMode !== 'named')
216
+ throw new Error('service-run requires a configured Named Tunnel');
217
+ await controller.startNamed();
218
+ await runForeground(undefined, false);
219
+ }
220
+ async function stopCommand() {
221
+ await stopUserService();
222
+ for (const path of [paths.tunnelPid, paths.hubPid]) {
223
+ if (!existsSync(path))
224
+ continue;
225
+ const pid = Number(readFileSync(path, 'utf8').trim());
226
+ if (Number.isInteger(pid) && pid > 1) {
227
+ try {
228
+ process.kill(pid, 'SIGTERM');
229
+ }
230
+ catch (error) {
231
+ if (error?.code !== 'ESRCH')
232
+ throw error;
233
+ }
234
+ }
235
+ unlinkSync(path);
236
+ }
237
+ console.log('DSH EasyRemote stopped. Local data was preserved.');
238
+ }
239
+ async function statusCommand() {
240
+ const state = loadInstallState(paths.installState);
241
+ console.log(formatStatus(state, state ? await localHubOnline(state.hub.port) : false));
242
+ }
243
+ async function doctorCommand(args) {
244
+ const state = loadInstallState(paths.installState);
245
+ const progress = loadSetupProgress(paths.setupProgress);
246
+ const report = await runDoctor({
247
+ checks: {
248
+ installState: async () => ({ ok: Boolean(state), detail: state?.activeMode ?? 'not configured' }),
249
+ cloudflared: async () => inspectCloudflaredRuntime(paths),
250
+ localHub: async () => ({ ok: Boolean(state && await localHubOnline(state.hub.port)), detail: state ? `${state.hub.host}:${state.hub.port}` : 'not configured' }),
251
+ publicOrigin: async () => {
252
+ if (!state?.tunnel.publicOrigin)
253
+ return { ok: false, detail: 'not configured' };
254
+ const response = await fetch(`${state.tunnel.publicOrigin}/v1/meta`);
255
+ const meta = response.ok ? await response.json() : {};
256
+ return { ok: response.ok && meta.hubId === state.hub.hubId, detail: `${response.status} ${state.tunnel.publicOrigin}` };
257
+ },
258
+ websocket: async () => state?.tunnel.publicOrigin
259
+ ? probeWebSocket(state.tunnel.publicOrigin)
260
+ : ({ ok: false, detail: 'not configured' }),
261
+ connector: async () => ({ ok: existsSync(paths.connectorConfig), detail: paths.connectorConfig }),
262
+ nameservers: async () => {
263
+ if (state?.activeMode !== 'named')
264
+ return { ok: true, detail: 'not required in quick mode' };
265
+ if (!progress?.rootDomain || !progress.nameservers)
266
+ return { ok: false, detail: 'setup checkpoint is missing NS values' };
267
+ const result = await verifyNameservers(progress.rootDomain, progress.nameservers);
268
+ return { ok: result.active, detail: result.active ? 'active' : `missing ${result.missing.join(', ')}` };
269
+ },
270
+ },
271
+ });
272
+ if (args.includes('--json'))
273
+ console.log(JSON.stringify(report, null, 2));
274
+ else
275
+ for (const check of report.checks)
276
+ console.log(`${check.ok ? '✓' : '✗'} ${check.name}: ${check.detail}`);
277
+ if (!report.ok)
278
+ process.exitCode = 1;
279
+ }
280
+ async function backupCommand(args) {
281
+ const { createBackup } = await import('./maintenance.js');
282
+ const destination = await createBackup(paths, args[0] ? resolve(args[0]) : undefined);
283
+ console.log(`Backup created: ${destination}`);
284
+ }
285
+ async function restoreCommand(args) {
286
+ if (!args[0])
287
+ throw new Error('restore requires a backup directory');
288
+ const { restoreBackup } = await import('./maintenance.js');
289
+ await restoreBackup(paths, resolve(args[0]), { isRunning: () => pidAlive(paths.hubPid) });
290
+ console.log('Backup restored. Run `dsh-easyremote start`.');
291
+ }
292
+ async function upgradeCommand() {
293
+ const { createBackup } = await import('./maintenance.js');
294
+ const backupPath = await createBackup(paths);
295
+ const serviceCommand = await installPackageRuntime('latest');
296
+ const state = loadInstallState(paths.installState);
297
+ if (state?.activeMode === 'named') {
298
+ await installUserAutostart({
299
+ home: homedir(),
300
+ command: serviceCommand,
301
+ run: (command, args) => runProcessLaunch({ command, args }),
302
+ });
303
+ }
304
+ console.log(`Upgrade staged after backup: ${backupPath}`);
305
+ }
306
+ async function uninstallCommand(args) {
307
+ await stopCommand();
308
+ const command = await currentServiceCommand();
309
+ try {
310
+ await removeUserAutostart({
311
+ home: homedir(),
312
+ command,
313
+ run: (program, programArgs) => runProcessLaunch({ command: program, args: programArgs }),
314
+ });
315
+ }
316
+ catch (error) {
317
+ console.warn(`Autostart cleanup warning: ${error instanceof Error ? error.message : String(error)}`);
318
+ }
319
+ if (args.includes('--purge')) {
320
+ throw new Error('For safety, --purge is not non-interactive. Remove ~/.dsh-easyremote manually after verifying backups.');
321
+ }
322
+ console.log(`Uninstalled launch integration. Data and Cloudflare resources remain in ${paths.root}.`);
323
+ }
324
+ async function runForeground(message, showControl = true) {
325
+ const control = showControl ? await openControlConsole(message) : null;
326
+ const signal = waitForSignal();
327
+ const exit = controller.waitForExit();
328
+ try {
329
+ const outcome = await Promise.race([
330
+ signal.then(() => ({ signal: true })),
331
+ exit.then((value) => ({ signal: false, value })),
332
+ ]);
333
+ if (!outcome.signal)
334
+ throw new Error(`${outcome.value.role} exited unexpectedly (${outcome.value.code ?? 'signal'})`);
335
+ }
336
+ finally {
337
+ await controller.stop();
338
+ await control?.close();
339
+ }
340
+ }
341
+ async function openControlConsole(message) {
342
+ const control = await startWizardServer({
343
+ version: VERSION,
344
+ controlMode: true,
345
+ getState: async () => ({
346
+ state: loadInstallState(paths.installState),
347
+ progress: loadSetupProgress(paths.setupProgress),
348
+ message: message ?? formatStatus(loadInstallState(paths.installState), true),
349
+ }),
350
+ actions: { 'apk/install-adb': installApkWizardAction },
351
+ });
352
+ console.log(`DSH EasyRemote console: ${control.launchUrl}`);
353
+ openBrowser(control.launchUrl);
354
+ return control;
355
+ }
356
+ async function holdControlConsole(message) {
357
+ const control = await openControlConsole(message);
358
+ try {
359
+ await waitForSignal();
360
+ }
361
+ finally {
362
+ await control.close();
363
+ }
364
+ }
365
+ async function installApkWizardAction() {
366
+ const result = await installCommunityApk({
367
+ apkUrl: `${RELEASE_BASE}/${COMMUNITY_APK_NAME}`,
368
+ checksumUrl: `${RELEASE_BASE}/SHA256SUMS`,
369
+ destination: join(paths.packagesDir, COMMUNITY_APK_NAME),
370
+ capture: captureCommand,
371
+ run: (command, args) => runProcessLaunch({ command, args }, true),
372
+ });
373
+ return { ok: true, message: `Community APK 已安装到设备:${result.device}` };
374
+ }
375
+ function monitorController() {
376
+ controller.waitForExit().then(({ role, code }) => {
377
+ console.error(`${role} exited (${code ?? 'signal'}); reopen the wizard or run start to retry.`);
378
+ }).catch(() => { });
379
+ }
380
+ function persistProgress(progress) {
381
+ saveSetupProgress(paths.setupProgress, progress);
382
+ }
383
+ function parseNamedBody(body, requireNameservers) {
384
+ const rootDomain = normalizeHostname(String(body.rootDomain || ''));
385
+ const hostnameValue = String(body.hostname || `dsh.${rootDomain}`);
386
+ const publicHostname = normalizeHostname(hostnameValue);
387
+ if (publicHostname !== rootDomain && !publicHostname.endsWith(`.${rootDomain}`)) {
388
+ throw new Error('Public hostname must belong to the root domain');
389
+ }
390
+ const rawNameservers = Array.isArray(body.nameservers) ? body.nameservers : [];
391
+ const provided = rawNameservers.filter((value) => String(value).trim());
392
+ if (requireNameservers && provided.length !== 2)
393
+ throw new Error('Enter both Cloudflare Nameservers');
394
+ const nameservers = provided.length === 2
395
+ ? provided.map((value) => normalizeNameserver(String(value)))
396
+ : undefined;
397
+ if (nameservers && nameservers[0] === nameservers[1])
398
+ throw new Error('Nameservers must be distinct');
399
+ return { rootDomain, hostname: publicHostname, nameservers };
400
+ }
401
+ function namedProgress(domain, phase) {
402
+ return {
403
+ schemaVersion: 1,
404
+ mode: 'named',
405
+ phase,
406
+ rootDomain: domain.rootDomain,
407
+ hostname: domain.hostname,
408
+ ...(domain.nameservers ? { nameservers: domain.nameservers } : {}),
409
+ updatedAt: Date.now(),
410
+ };
411
+ }
412
+ async function installConnectorSafely(profile) {
413
+ try {
414
+ await installPackagedConnector(profile);
415
+ return `Connector 已安装到 DSH profile: ${profile}。如 DSH 已运行,请重启一次。`;
416
+ }
417
+ catch (error) {
418
+ return `Connector 自动安装未完成:${error instanceof Error ? error.message : String(error)}`;
419
+ }
420
+ }
421
+ async function installPackagedConnector(profile) {
422
+ if (!existsSync(join(connectorRuntime, 'package.json')))
423
+ throw new Error('npm package does not contain the Connector runtime');
424
+ const dshExecutable = findExecutable(process.platform === 'win32' ? 'dsh.cmd' : 'dsh');
425
+ if (!dshExecutable)
426
+ throw new Error('dsh executable was not found in PATH');
427
+ mkdirSync(paths.packagesDir, { recursive: true, mode: 0o700 });
428
+ await runProcessLaunch({
429
+ command: process.platform === 'win32' ? 'npm.cmd' : 'npm',
430
+ args: ['pack', connectorRuntime, '--pack-destination', paths.packagesDir, '--ignore-scripts'],
431
+ });
432
+ const packagePath = readdirSync(paths.packagesDir)
433
+ .filter((name) => name.endsWith('.tgz') && name.includes('dsh-easyremote-connector'))
434
+ .map((name) => join(paths.packagesDir, name))
435
+ .sort()
436
+ .at(-1);
437
+ if (!packagePath)
438
+ throw new Error('Unable to build the Connector package');
439
+ await runProcessLaunch(buildConnectorInstallLaunch(dshExecutable, profile, packagePath), true);
440
+ const dshHome = detectDshHome(dshExecutable);
441
+ if (!dshHome)
442
+ throw new Error('Connector installed, but DSH_HOME could not be detected; set DSH_HOME and rerun setup');
443
+ const patchPath = join(dshHome, 'profiles', profile, 'cordis.patch.yml');
444
+ if (!existsSync(dirname(patchPath)))
445
+ throw new Error(`DSH profile not found: ${profile}`);
446
+ const existing = existsSync(patchPath) ? readFileSync(patchPath, 'utf8') : '';
447
+ writeFileSync(patchPath, updateCordisPatch(existing), { mode: 0o600 });
448
+ if (process.platform !== 'win32')
449
+ chmodSync(patchPath, 0o600);
450
+ }
451
+ function detectDshHome(dshExecutable) {
452
+ if (process.env.DSH_HOME && existsSync(process.env.DSH_HOME))
453
+ return process.env.DSH_HOME;
454
+ try {
455
+ const inferred = inferDshHomeFromLauncher(readFileSync(dshExecutable, 'utf8'));
456
+ if (inferred && existsSync(inferred))
457
+ return inferred;
458
+ }
459
+ catch { }
460
+ const fallback = join(homedir(), '.dsh');
461
+ return existsSync(fallback) ? fallback : null;
462
+ }
463
+ function findExecutable(name) {
464
+ for (const directory of (process.env.PATH || '').split(delimiter)) {
465
+ const candidate = join(directory, name);
466
+ try {
467
+ accessSync(candidate, constants.X_OK);
468
+ return candidate;
469
+ }
470
+ catch { }
471
+ }
472
+ return null;
473
+ }
474
+ async function materializeServiceCommand() {
475
+ try {
476
+ return await installPackageRuntime(VERSION);
477
+ }
478
+ catch {
479
+ return currentServiceCommand();
480
+ }
481
+ }
482
+ async function installPackageRuntime(version) {
483
+ const prefix = join(paths.serviceDir, 'runtime');
484
+ mkdirSync(prefix, { recursive: true, mode: 0o700 });
485
+ await runProcessLaunch({
486
+ command: process.platform === 'win32' ? 'npm.cmd' : 'npm',
487
+ args: ['install', '--prefix', prefix, '--ignore-scripts', '--no-audit', '--no-fund', `${PACKAGE_NAME}@${version}`],
488
+ }, true);
489
+ const installedCli = join(prefix, 'node_modules', '@hakimedes', 'dsh-easyremote', 'dist', 'cli.js');
490
+ if (!existsSync(installedCli))
491
+ throw new Error('Installed package does not contain dist/cli.js');
492
+ return { executable: process.execPath, args: [installedCli, 'service-run'] };
493
+ }
494
+ async function currentServiceCommand() {
495
+ return { executable: process.execPath, args: [CLI_SCRIPT, 'service-run'] };
496
+ }
497
+ async function stopUserService() {
498
+ try {
499
+ if (process.platform === 'darwin') {
500
+ await runProcessLaunch({ command: 'launchctl', args: ['stop', 'io.github.hakimedes.dsheasyremote'] });
501
+ }
502
+ else if (process.platform === 'linux') {
503
+ await runProcessLaunch({ command: 'systemctl', args: ['--user', 'stop', 'dsh-easyremote.service'] });
504
+ }
505
+ else if (process.platform === 'win32') {
506
+ await runProcessLaunch({ command: 'schtasks', args: ['/End', '/TN', 'DSH EasyRemote'] });
507
+ }
508
+ }
509
+ catch { }
510
+ }
511
+ function pidAlive(path) {
512
+ if (!existsSync(path))
513
+ return false;
514
+ const pid = Number(readFileSync(path, 'utf8').trim());
515
+ if (!Number.isInteger(pid) || pid <= 1)
516
+ return false;
517
+ try {
518
+ process.kill(pid, 0);
519
+ return true;
520
+ }
521
+ catch (error) {
522
+ return error?.code === 'EPERM';
523
+ }
524
+ }
525
+ async function localHubOnline(port) {
526
+ try {
527
+ const response = await fetch(`http://127.0.0.1:${port}/healthz`, { signal: AbortSignal.timeout(1_000) });
528
+ return response.ok;
529
+ }
530
+ catch {
531
+ return false;
532
+ }
533
+ }
534
+ function waitForSignal() {
535
+ return new Promise((resolveSignal) => {
536
+ const finish = (signal) => {
537
+ process.off('SIGINT', onInt);
538
+ process.off('SIGTERM', onTerm);
539
+ resolveSignal(signal);
540
+ };
541
+ const onInt = () => finish('SIGINT');
542
+ const onTerm = () => finish('SIGTERM');
543
+ process.once('SIGINT', onInt);
544
+ process.once('SIGTERM', onTerm);
545
+ });
546
+ }
547
+ function openBrowser(url) {
548
+ const launch = process.platform === 'darwin'
549
+ ? { command: 'open', args: [url] }
550
+ : process.platform === 'win32'
551
+ ? { command: 'cmd.exe', args: ['/d', '/s', '/c', 'start', '', url] }
552
+ : { command: 'xdg-open', args: [url] };
553
+ try {
554
+ const child = spawn(launch.command, launch.args, { detached: true, stdio: 'ignore', windowsHide: true });
555
+ child.unref();
556
+ }
557
+ catch { }
558
+ }
559
+ function captureCommand(command, args) {
560
+ return new Promise((resolveOutput, rejectOutput) => {
561
+ const child = spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
562
+ const output = [];
563
+ const errors = [];
564
+ child.stdout.on('data', (chunk) => output.push(chunk));
565
+ child.stderr.on('data', (chunk) => errors.push(chunk));
566
+ child.once('error', rejectOutput);
567
+ child.once('close', (code) => {
568
+ if (code === 0)
569
+ resolveOutput(Buffer.concat(output).toString('utf8'));
570
+ else
571
+ rejectOutput(new Error(`${command} failed: ${Buffer.concat(errors).toString('utf8').trim()}`));
572
+ });
573
+ });
574
+ }
575
+ function assertNodeVersion() {
576
+ const [major = 0, minor = 0] = process.versions.node.split('.').map(Number);
577
+ if (major < 22 || (major === 22 && minor < 19))
578
+ throw new Error('DSH EasyRemote requires Node.js 22.19 or newer');
579
+ }
580
+ main().catch((error) => {
581
+ console.error(`DSH EasyRemote: ${error instanceof Error ? error.message : String(error)}`);
582
+ process.exitCode = 1;
583
+ });
584
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}