@remotepilot/cli 0.1.1 → 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.
- package/dist/cli.js +199 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +0 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/pair.d.ts +15 -2
- package/dist/commands/pair.d.ts.map +1 -1
- package/dist/commands/pair.js +66 -20
- package/dist/commands/pair.js.map +1 -1
- package/dist/commands/setup.d.ts +19 -2
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +161 -66
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts +8 -2
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +152 -57
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +48 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/daemon-manager.ps1 +10 -1
- package/dist/daemon.d.ts +7 -6
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +271 -46
- package/dist/daemon.js.map +1 -1
- package/package.json +3 -3
package/dist/daemon.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
/**
|
|
4
|
-
* RemotePilot Daemon -
|
|
4
|
+
* RemotePilot Daemon - Host Service Entry Point
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 1. Service mode: When launched by the Windows Service Control Manager
|
|
6
|
+
* Modes:
|
|
7
|
+
* 1. Service mode: When launched by OS service manager (SCM/systemd/launchd)
|
|
9
8
|
* 2. Foreground mode: When launched directly for development/testing
|
|
10
9
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Security:
|
|
11
|
+
* - HTTP endpoints require Authorization header matching API_TOKEN
|
|
12
|
+
* - Gateway and HTTP bind to 127.0.0.1 by default (set --listen=0.0.0.0 to expose)
|
|
13
|
+
* - API_TOKEN is generated on first run and stored in host.json
|
|
13
14
|
*/
|
|
14
15
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
16
|
if (k2 === undefined) k2 = k;
|
|
@@ -48,29 +49,205 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
48
49
|
exports.startDaemon = startDaemon;
|
|
49
50
|
const fs = __importStar(require("node:fs"));
|
|
50
51
|
const path = __importStar(require("node:path"));
|
|
52
|
+
const crypto = __importStar(require("node:crypto"));
|
|
51
53
|
const node_http_1 = require("node:http");
|
|
54
|
+
const node_child_process_1 = require("node:child_process");
|
|
52
55
|
const core_1 = require("@remotepilot/core");
|
|
53
56
|
const gateway_1 = require("@remotepilot/gateway");
|
|
54
57
|
const core_2 = require("@remotepilot/core");
|
|
55
58
|
let server = null;
|
|
56
59
|
let gateway = null;
|
|
57
60
|
let logger;
|
|
58
|
-
|
|
61
|
+
let shutdownRequested = false;
|
|
62
|
+
let cloudflaredProcess = null;
|
|
63
|
+
let tunnelUrl = null;
|
|
64
|
+
const sshTunnels = [];
|
|
65
|
+
const sshRetryTimers = [];
|
|
66
|
+
const SSH_MAX_RETRIES = 10;
|
|
67
|
+
const SSH_BASE_DELAY_MS = 2000;
|
|
68
|
+
const SSH_MAX_DELAY_MS = 60000;
|
|
69
|
+
const SHUTDOWN_TIMEOUT_MS = 5000;
|
|
70
|
+
const sshTunnelStates = [];
|
|
71
|
+
function parseSshTunnels() {
|
|
72
|
+
const tunnels = [];
|
|
73
|
+
const tunnelsPath = path.join(process.env.HOME || process.env.USERPROFILE || "~", ".remotepilot", "ssh-tunnels.json");
|
|
74
|
+
if (fs.existsSync(tunnelsPath)) {
|
|
75
|
+
try {
|
|
76
|
+
const data = JSON.parse(fs.readFileSync(tunnelsPath, "utf-8"));
|
|
77
|
+
if (Array.isArray(data)) {
|
|
78
|
+
for (const t of data) {
|
|
79
|
+
if (t.localPort && t.remoteHost && t.remotePort && t.sshHost) {
|
|
80
|
+
tunnels.push(t);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// ignore parse errors
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return tunnels;
|
|
90
|
+
}
|
|
91
|
+
function startSingleSshTunnel(tunnel, retryCount) {
|
|
92
|
+
const args = [
|
|
93
|
+
"-L", `127.0.0.1:${tunnel.localPort}:${tunnel.remoteHost}:${tunnel.remotePort}`,
|
|
94
|
+
"-N",
|
|
95
|
+
tunnel.sshHost
|
|
96
|
+
];
|
|
97
|
+
logger.info("starting SSH tunnel", {
|
|
98
|
+
localPort: tunnel.localPort,
|
|
99
|
+
remote: `${tunnel.remoteHost}:${tunnel.remotePort}`,
|
|
100
|
+
sshHost: tunnel.sshHost,
|
|
101
|
+
retryCount
|
|
102
|
+
});
|
|
103
|
+
const proc = (0, node_child_process_1.spawn)("ssh", args, {
|
|
104
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
105
|
+
detached: false,
|
|
106
|
+
windowsHide: true
|
|
107
|
+
});
|
|
108
|
+
proc.on("error", (err) => {
|
|
109
|
+
logger.error(`SSH tunnel to ${tunnel.sshHost} failed`, err);
|
|
110
|
+
});
|
|
111
|
+
return proc;
|
|
112
|
+
}
|
|
113
|
+
function scheduleSshRetry(tunnel, currentRetry) {
|
|
114
|
+
if (currentRetry >= SSH_MAX_RETRIES) {
|
|
115
|
+
logger.error(`SSH tunnel to ${tunnel.sshHost} exhausted ${SSH_MAX_RETRIES} retries, giving up`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const delay = Math.min(SSH_BASE_DELAY_MS * Math.pow(2, currentRetry) + Math.random() * 1000, SSH_MAX_DELAY_MS);
|
|
119
|
+
logger.warn(`SSH tunnel to ${tunnel.sshHost} retry ${currentRetry + 1}/${SSH_MAX_RETRIES} in ${Math.round(delay)}ms`);
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
const proc = startSingleSshTunnel(tunnel, currentRetry + 1);
|
|
122
|
+
const state = { config: tunnel, process: proc, retryCount: currentRetry + 1 };
|
|
123
|
+
proc.on("exit", (code) => {
|
|
124
|
+
logger.warn(`SSH tunnel to ${tunnel.sshHost} exited with code ${code}`);
|
|
125
|
+
const idx = sshTunnelStates.indexOf(state);
|
|
126
|
+
if (idx !== -1)
|
|
127
|
+
sshTunnelStates.splice(idx, 1);
|
|
128
|
+
if (!shutdownRequested)
|
|
129
|
+
scheduleSshRetry(tunnel, currentRetry + 1);
|
|
130
|
+
});
|
|
131
|
+
sshTunnelStates.push(state);
|
|
132
|
+
}, delay);
|
|
133
|
+
sshRetryTimers.push(timer);
|
|
134
|
+
}
|
|
135
|
+
function startSshTunnels() {
|
|
136
|
+
const tunnels = parseSshTunnels();
|
|
137
|
+
for (const tunnel of tunnels) {
|
|
138
|
+
const proc = startSingleSshTunnel(tunnel, 0);
|
|
139
|
+
const state = { config: tunnel, process: proc, retryCount: 0 };
|
|
140
|
+
proc.on("exit", (code) => {
|
|
141
|
+
logger.warn(`SSH tunnel to ${tunnel.sshHost} exited with code ${code}`);
|
|
142
|
+
const idx = sshTunnelStates.indexOf(state);
|
|
143
|
+
if (idx !== -1)
|
|
144
|
+
sshTunnelStates.splice(idx, 1);
|
|
145
|
+
if (!shutdownRequested)
|
|
146
|
+
scheduleSshRetry(tunnel, 0);
|
|
147
|
+
});
|
|
148
|
+
sshTunnelStates.push(state);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function stopSshTunnels() {
|
|
152
|
+
for (const timer of sshRetryTimers)
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
sshRetryTimers.length = 0;
|
|
155
|
+
for (const state of sshTunnelStates) {
|
|
156
|
+
try {
|
|
157
|
+
state.process.kill();
|
|
158
|
+
}
|
|
159
|
+
catch { }
|
|
160
|
+
}
|
|
161
|
+
sshTunnelStates.length = 0;
|
|
162
|
+
}
|
|
163
|
+
function startCloudflaredTunnel(port) {
|
|
164
|
+
const cloudflaredPath = findCloudflared();
|
|
165
|
+
if (!cloudflaredPath) {
|
|
166
|
+
logger.error("cloudflared not found. Install from https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/");
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
logger.info("starting cloudflare quick tunnel", { port });
|
|
170
|
+
cloudflaredProcess = (0, node_child_process_1.spawn)(cloudflaredPath, [
|
|
171
|
+
"tunnel", "--url", `http://localhost:${port}`
|
|
172
|
+
], {
|
|
173
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
174
|
+
detached: false,
|
|
175
|
+
windowsHide: true
|
|
176
|
+
});
|
|
177
|
+
cloudflaredProcess.stdout?.on("data", (data) => {
|
|
178
|
+
const line = data.toString().trim();
|
|
179
|
+
if (line)
|
|
180
|
+
logger.info(`cloudflared: ${line}`);
|
|
181
|
+
const urlMatch = line.match(/(https:\/\/[a-z0-9-]+\.trycloudflare\.com)/);
|
|
182
|
+
if (urlMatch) {
|
|
183
|
+
tunnelUrl = urlMatch[1];
|
|
184
|
+
logger.info(`TUNNEL_URL=${tunnelUrl}`);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
cloudflaredProcess.stderr?.on("data", (data) => {
|
|
188
|
+
const line = data.toString().trim();
|
|
189
|
+
if (line)
|
|
190
|
+
logger.info(`cloudflared: ${line}`);
|
|
191
|
+
// Quick tunnel URL comes via stderr
|
|
192
|
+
const urlMatch = line.match(/(https:\/\/[a-z0-9-]+\.trycloudflare\.com)/);
|
|
193
|
+
if (urlMatch) {
|
|
194
|
+
tunnelUrl = urlMatch[1];
|
|
195
|
+
logger.info(`TUNNEL_URL=${tunnelUrl}`);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
cloudflaredProcess.on("error", (err) => {
|
|
199
|
+
logger.error("cloudflared failed to start", err);
|
|
200
|
+
cloudflaredProcess = null;
|
|
201
|
+
});
|
|
202
|
+
cloudflaredProcess.on("exit", (code) => {
|
|
203
|
+
logger.warn(`cloudflared exited with code ${code}`);
|
|
204
|
+
cloudflaredProcess = null;
|
|
205
|
+
tunnelUrl = null;
|
|
206
|
+
if (!shutdownRequested) {
|
|
207
|
+
logger.info("restarting cloudflared in 5s...");
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
if (!shutdownRequested)
|
|
210
|
+
startCloudflaredTunnel(port);
|
|
211
|
+
}, 5000);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function stopCloudflared() {
|
|
216
|
+
if (cloudflaredProcess) {
|
|
217
|
+
try {
|
|
218
|
+
cloudflaredProcess.kill();
|
|
219
|
+
}
|
|
220
|
+
catch { }
|
|
221
|
+
cloudflaredProcess = null;
|
|
222
|
+
}
|
|
223
|
+
tunnelUrl = null;
|
|
224
|
+
}
|
|
225
|
+
function findCloudflared() {
|
|
226
|
+
if (process.platform === "win32") {
|
|
227
|
+
const paths = [
|
|
228
|
+
"C:\\Program Files (x86)\\cloudflared\\cloudflared.exe",
|
|
229
|
+
"C:\\Program Files\\cloudflared\\cloudflared.exe",
|
|
230
|
+
];
|
|
231
|
+
for (const p of paths) {
|
|
232
|
+
if (fs.existsSync(p))
|
|
233
|
+
return p;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return "cloudflared";
|
|
237
|
+
}
|
|
238
|
+
function parseCliArg(name) {
|
|
59
239
|
for (let i = 0; i < process.argv.length; i++) {
|
|
60
240
|
const arg = process.argv[i];
|
|
61
|
-
if (arg ===
|
|
241
|
+
if (arg === `--${name}` && process.argv[i + 1])
|
|
62
242
|
return process.argv[i + 1];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return arg.slice("--data-dir=".length);
|
|
66
|
-
}
|
|
243
|
+
if (arg.startsWith(`--${name}=`))
|
|
244
|
+
return arg.slice(`--${name}=`.length);
|
|
67
245
|
}
|
|
68
246
|
return null;
|
|
69
247
|
}
|
|
70
248
|
function getConfigPath(dataDir) {
|
|
71
|
-
if (dataDir)
|
|
249
|
+
if (dataDir)
|
|
72
250
|
return path.join(dataDir, "host.json");
|
|
73
|
-
}
|
|
74
251
|
const homeDir = process.env.HOME || process.env.USERPROFILE || "~";
|
|
75
252
|
return path.join(homeDir, ".remotepilot", "host.json");
|
|
76
253
|
}
|
|
@@ -79,16 +256,31 @@ function loadConfig(configPath) {
|
|
|
79
256
|
if (!fs.existsSync(resolvedPath)) {
|
|
80
257
|
throw new Error(`Host not configured. Run 'remotepilot setup' first. Config path: ${resolvedPath}`);
|
|
81
258
|
}
|
|
82
|
-
|
|
259
|
+
const config = JSON.parse(fs.readFileSync(resolvedPath, "utf-8"));
|
|
260
|
+
if (!config.apiToken) {
|
|
261
|
+
config.apiToken = crypto.randomBytes(32).toString("hex");
|
|
262
|
+
fs.writeFileSync(resolvedPath, JSON.stringify(config, null, 2));
|
|
263
|
+
}
|
|
264
|
+
return config;
|
|
265
|
+
}
|
|
266
|
+
function verifyAuth(req, config) {
|
|
267
|
+
if (!config.apiToken)
|
|
268
|
+
return false;
|
|
269
|
+
const auth = req.headers.authorization;
|
|
270
|
+
if (!auth)
|
|
271
|
+
return false;
|
|
272
|
+
return auth === `Bearer ${config.apiToken}`;
|
|
273
|
+
}
|
|
274
|
+
function rejectUnauthorized(res) {
|
|
275
|
+
res.writeHead(401, { "Content-Type": "application/json" });
|
|
276
|
+
res.end(JSON.stringify({ error: "Unauthorized. Provide Authorization: Bearer <token>" }));
|
|
83
277
|
}
|
|
84
278
|
function startDaemon() {
|
|
85
|
-
const dataDir =
|
|
279
|
+
const dataDir = parseCliArg("data-dir");
|
|
280
|
+
const listenAddr = parseCliArg("listen") || "127.0.0.1";
|
|
86
281
|
const configPath = getConfigPath(dataDir);
|
|
87
282
|
const config = loadConfig(configPath);
|
|
88
|
-
|
|
89
|
-
const logDir = dataDir
|
|
90
|
-
? path.join(dataDir, "logs")
|
|
91
|
-
: undefined;
|
|
283
|
+
const logDir = dataDir ? path.join(dataDir, "logs") : undefined;
|
|
92
284
|
const logFile = logDir ? path.join(logDir, "remotepilot.log") : undefined;
|
|
93
285
|
logger = (0, core_1.createLogger)("daemon", {
|
|
94
286
|
level: "info",
|
|
@@ -100,11 +292,12 @@ function startDaemon() {
|
|
|
100
292
|
hostName: config.hostName,
|
|
101
293
|
platform: config.platform,
|
|
102
294
|
port: config.port,
|
|
295
|
+
listen: listenAddr,
|
|
103
296
|
pid: process.pid,
|
|
104
297
|
dataDir: dataDir || "(user profile)"
|
|
105
298
|
});
|
|
106
|
-
// Create HTTP server for health checks
|
|
107
299
|
server = (0, node_http_1.createServer)((req, res) => {
|
|
300
|
+
// /health is unauthenticated (used by load balancers / systemd watchdog)
|
|
108
301
|
if (req.url === "/health") {
|
|
109
302
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
110
303
|
res.end(JSON.stringify({
|
|
@@ -114,6 +307,11 @@ function startDaemon() {
|
|
|
114
307
|
}));
|
|
115
308
|
return;
|
|
116
309
|
}
|
|
310
|
+
// All other endpoints require auth
|
|
311
|
+
if (!verifyAuth(req, config)) {
|
|
312
|
+
rejectUnauthorized(res);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
117
315
|
if (req.url === "/ready") {
|
|
118
316
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
119
317
|
res.end(JSON.stringify({
|
|
@@ -130,25 +328,24 @@ function startDaemon() {
|
|
|
130
328
|
hostName: config.hostName,
|
|
131
329
|
platform: config.platform,
|
|
132
330
|
uptime: process.uptime(),
|
|
133
|
-
pid: process.pid
|
|
331
|
+
pid: process.pid,
|
|
332
|
+
sshTunnels: sshTunnelStates.length,
|
|
333
|
+
tunnelUrl: tunnelUrl || "starting..."
|
|
134
334
|
}));
|
|
135
335
|
return;
|
|
136
336
|
}
|
|
137
337
|
if (req.method === "POST" && req.url === "/shutdown") {
|
|
138
338
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
139
339
|
res.end(JSON.stringify({ status: "shutting down" }));
|
|
140
|
-
|
|
141
|
-
process.exit(0);
|
|
340
|
+
gracefulShutdown().then(() => process.exit(0));
|
|
142
341
|
return;
|
|
143
342
|
}
|
|
144
343
|
res.writeHead(404);
|
|
145
344
|
res.end("Not Found");
|
|
146
345
|
});
|
|
147
|
-
// Create HostManager (loads config from ~/.remotepilot/)
|
|
148
346
|
const hostManager = new core_2.HostManager();
|
|
149
347
|
hostManager.load();
|
|
150
|
-
|
|
151
|
-
gateway = new gateway_1.Gateway({ port: config.port, host: "0.0.0.0" }, hostManager);
|
|
348
|
+
gateway = new gateway_1.Gateway({ port: config.port, host: listenAddr }, hostManager);
|
|
152
349
|
gateway.on("started", (port) => {
|
|
153
350
|
logger.info("gateway started", {
|
|
154
351
|
port,
|
|
@@ -165,52 +362,80 @@ function startDaemon() {
|
|
|
165
362
|
gateway.on("error", (error) => {
|
|
166
363
|
logger.error("gateway error", error);
|
|
167
364
|
});
|
|
168
|
-
// Start gateway (creates WebSocket server internally)
|
|
169
365
|
gateway.start().catch((error) => {
|
|
170
366
|
logger.error("failed to start gateway", error);
|
|
171
367
|
process.exit(1);
|
|
172
368
|
});
|
|
173
|
-
|
|
174
|
-
server.listen(config.port + 1, () => {
|
|
369
|
+
server.listen(config.port + 1, listenAddr, () => {
|
|
175
370
|
logger.info("http server listening", {
|
|
176
371
|
port: config.port + 1,
|
|
372
|
+
listen: listenAddr,
|
|
177
373
|
health: `http://localhost:${config.port + 1}/health`
|
|
178
374
|
});
|
|
375
|
+
startSshTunnels();
|
|
376
|
+
// Start Cloudflare Quick Tunnel (no account needed)
|
|
377
|
+
startCloudflaredTunnel(config.port);
|
|
179
378
|
});
|
|
180
379
|
server.on("error", (error) => {
|
|
181
380
|
logger.error("server error", error);
|
|
182
381
|
});
|
|
183
382
|
}
|
|
184
|
-
async function
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
383
|
+
async function gracefulShutdown() {
|
|
384
|
+
if (shutdownRequested)
|
|
385
|
+
return;
|
|
386
|
+
shutdownRequested = true;
|
|
387
|
+
if (logger)
|
|
388
|
+
logger.info("daemon shutting down");
|
|
389
|
+
stopSshTunnels();
|
|
390
|
+
stopCloudflared();
|
|
391
|
+
const shutdownTimeout = setTimeout(() => {
|
|
392
|
+
if (logger)
|
|
393
|
+
logger.warn("shutdown timed out, forcing exit");
|
|
394
|
+
process.exit(1);
|
|
395
|
+
}, SHUTDOWN_TIMEOUT_MS);
|
|
396
|
+
shutdownTimeout.unref();
|
|
397
|
+
try {
|
|
398
|
+
if (gateway) {
|
|
399
|
+
await Promise.race([
|
|
400
|
+
gateway.stop(),
|
|
401
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), SHUTDOWN_TIMEOUT_MS))
|
|
402
|
+
]);
|
|
403
|
+
gateway = null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// gateway.stop() timed out or errored — force close
|
|
189
408
|
}
|
|
190
409
|
if (server) {
|
|
191
410
|
server.close();
|
|
192
411
|
server = null;
|
|
193
412
|
}
|
|
194
|
-
logger
|
|
413
|
+
if (logger)
|
|
414
|
+
logger.info("daemon stopped");
|
|
195
415
|
}
|
|
196
416
|
// --- Auto-start only when run directly (not when imported) ---
|
|
197
|
-
// When run directly: start the daemon (foreground or service mode)
|
|
198
|
-
// When imported: only export startDaemon for CLI to call explicitly
|
|
199
417
|
const isRunDirectly = require.main === module;
|
|
200
418
|
if (isRunDirectly) {
|
|
201
|
-
const isServiceMode = process.argv.includes("--service");
|
|
202
|
-
// Register shutdown handlers for both modes.
|
|
203
|
-
// In service mode, the C wrapper sends POST /shutdown for graceful shutdown,
|
|
204
|
-
// but SIGTERM may also arrive as a fallback from TerminateProcess.
|
|
205
419
|
startDaemon();
|
|
206
420
|
process.on("SIGINT", () => {
|
|
207
|
-
|
|
421
|
+
gracefulShutdown().then(() => process.exit(0));
|
|
208
422
|
});
|
|
209
423
|
process.on("SIGTERM", () => {
|
|
210
|
-
|
|
424
|
+
gracefulShutdown().then(() => process.exit(0));
|
|
425
|
+
});
|
|
426
|
+
process.on("uncaughtException", (err) => {
|
|
427
|
+
if (logger)
|
|
428
|
+
logger.error("uncaught exception", err);
|
|
429
|
+
else
|
|
430
|
+
console.error("uncaught exception:", err);
|
|
431
|
+
gracefulShutdown().then(() => process.exit(1));
|
|
211
432
|
});
|
|
212
|
-
process.on("
|
|
213
|
-
|
|
433
|
+
process.on("unhandledRejection", (reason) => {
|
|
434
|
+
if (logger)
|
|
435
|
+
logger.error("unhandled rejection", reason);
|
|
436
|
+
else
|
|
437
|
+
console.error("unhandled rejection:", reason);
|
|
438
|
+
gracefulShutdown().then(() => process.exit(1));
|
|
214
439
|
});
|
|
215
440
|
}
|
|
216
441
|
//# sourceMappingURL=daemon.js.map
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotepilot/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "RemotePilot — Connect your phone to any computer.
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "RemotePilot — Connect your phone to any computer. One command to start, scan QR, done.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"prepublishOnly": "npm run build",
|
|
13
|
-
"postinstall": "node -e \"console.log('✅ RemotePilot CLI installed
|
|
13
|
+
"postinstall": "node -e \"console.log('\\n ✅ RemotePilot CLI installed!\\n\\n Run: npx remotepilot\\n\\n That\\'s it. One command. Scan the QR. Done.\\n')\"",
|
|
14
14
|
"test": "vitest run",
|
|
15
15
|
"test:watch": "vitest",
|
|
16
16
|
"lint": "eslint src/",
|