@cello-protocol/daemon 0.0.4 → 0.0.6
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-or-start.d.ts","sourceRoot":"","sources":["../src/connect-or-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"connect-or-start.d.ts","sourceRoot":"","sources":["../src/connect-or-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAiCxB"}
|
package/dist/connect-or-start.js
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* - Return client connected to new daemon
|
|
17
17
|
*/
|
|
18
18
|
import { spawn } from "node:child_process";
|
|
19
|
+
import { openSync } from "node:fs";
|
|
20
|
+
import { readFile } from "node:fs/promises";
|
|
19
21
|
import { join } from "node:path";
|
|
20
22
|
import { readLock, removeLock, isProcessAlive } from "./lock-file.js";
|
|
21
23
|
import { connectToDaemon } from "./ipc-client.js";
|
|
@@ -53,65 +55,56 @@ export async function connectOrStart(celloDir, logger, daemonBin) {
|
|
|
53
55
|
return { client, alreadyRunning: false };
|
|
54
56
|
}
|
|
55
57
|
async function spawnDaemon(celloDir, daemonBin, _lockFilePath, _logger) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// Look for daemon.started event line
|
|
73
|
-
const lines = stdoutBuf.split("\n");
|
|
74
|
-
for (const line of lines) {
|
|
75
|
-
if (line.trim().length === 0)
|
|
76
|
-
continue;
|
|
77
|
-
try {
|
|
78
|
-
const event = JSON.parse(line);
|
|
79
|
-
if (event.event === "daemon.started") {
|
|
80
|
-
clearTimeout(timeout);
|
|
81
|
-
child.stdout.removeAllListeners();
|
|
82
|
-
child.unref();
|
|
83
|
-
// Connect to the newly started daemon
|
|
84
|
-
const socketPath = event.ipcSocketPath;
|
|
85
|
-
connectToDaemon(socketPath).then(resolve).catch(reject);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
if (event.event === "daemon.startup.failed") {
|
|
89
|
-
clearTimeout(timeout);
|
|
90
|
-
child.stdout.removeAllListeners();
|
|
91
|
-
const errorMsg = typeof event.error === "string"
|
|
92
|
-
? event.error
|
|
93
|
-
: event.error instanceof Error
|
|
94
|
-
? event.error.message
|
|
95
|
-
: String(event.error || "Daemon startup failed");
|
|
96
|
-
reject(new Error(errorMsg));
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// Not JSON — ignore
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
child.on("error", (err) => {
|
|
106
|
-
clearTimeout(timeout);
|
|
107
|
-
reject(err);
|
|
108
|
-
});
|
|
109
|
-
child.on("exit", (code) => {
|
|
110
|
-
clearTimeout(timeout);
|
|
111
|
-
if (code !== 0) {
|
|
112
|
-
reject(new Error(`Daemon exited with code ${code}`));
|
|
113
|
-
}
|
|
114
|
-
});
|
|
58
|
+
const socketPath = join(celloDir, "daemon.sock");
|
|
59
|
+
const logPath = join(celloDir, "daemon.log");
|
|
60
|
+
// The daemon's stdout/stderr go to a LOG FILE, never a pipe to this process.
|
|
61
|
+
// A pipe (the previous design) breaks the moment the cli exits after reading the
|
|
62
|
+
// daemon.started line — the daemon's next log write (e.g. directory.signaling.connected)
|
|
63
|
+
// then hits a broken pipe and, with no stdout 'error' handler, EPIPE-crashes it. The
|
|
64
|
+
// daemon would "start" and die a second later → ECONNREFUSED on the socket. Writing to
|
|
65
|
+
// a file also gives operators a durable ~/.cello/daemon.log to debug from.
|
|
66
|
+
const out = openSync(logPath, "a");
|
|
67
|
+
const child = spawn(process.execPath, [daemonBin], {
|
|
68
|
+
detached: true,
|
|
69
|
+
stdio: ["ignore", out, out],
|
|
70
|
+
env: {
|
|
71
|
+
...process.env,
|
|
72
|
+
CELLO_DIR: celloDir,
|
|
73
|
+
},
|
|
115
74
|
});
|
|
75
|
+
child.unref();
|
|
76
|
+
// Readiness is detected by polling the IPC socket (deterministic path:
|
|
77
|
+
// celloDir/daemon.sock) until the daemon is accepting connections — not by reading
|
|
78
|
+
// stdout, which is now the log file. Track spawn/exit so we fail fast with context.
|
|
79
|
+
let spawnError = null;
|
|
80
|
+
let exitCode;
|
|
81
|
+
child.on("error", (err) => { spawnError = err; });
|
|
82
|
+
child.on("exit", (code) => { exitCode = code; });
|
|
83
|
+
const deadline = Date.now() + 10_000;
|
|
84
|
+
while (Date.now() < deadline) {
|
|
85
|
+
if (spawnError)
|
|
86
|
+
throw spawnError;
|
|
87
|
+
try {
|
|
88
|
+
return await connectToDaemon(socketPath);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Not accepting yet (ENOENT/ECONNREFUSED). If the child has already exited, it
|
|
92
|
+
// died during startup — surface the log tail rather than spinning to the deadline.
|
|
93
|
+
if (exitCode !== undefined) {
|
|
94
|
+
throw new Error(`Daemon exited (code ${exitCode}) during startup.\n${await daemonLogTail(logPath)}`);
|
|
95
|
+
}
|
|
96
|
+
await new Promise((r) => setTimeout(r, 150));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw new Error(`Daemon failed to start within 10 seconds.\n${await daemonLogTail(logPath)}`);
|
|
100
|
+
}
|
|
101
|
+
async function daemonLogTail(logPath) {
|
|
102
|
+
try {
|
|
103
|
+
const lines = (await readFile(logPath, "utf-8")).split("\n").filter((l) => l.trim().length > 0);
|
|
104
|
+
return `--- daemon.log (last 15 lines) ---\n${lines.slice(-15).join("\n")}`;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return `(no daemon.log at ${logPath})`;
|
|
108
|
+
}
|
|
116
109
|
}
|
|
117
110
|
//# sourceMappingURL=connect-or-start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-or-start.js","sourceRoot":"","sources":["../src/connect-or-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAQlE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAAc,EACd,SAAiB;IAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEnD,qBAAqB;IACrB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,wCAAwC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;oBAC/B,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,MAAM,EAAE,oBAAoB;oBAC5B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;gBACH,MAAM,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/B,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,cAAc;aACvB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAgB,EAChB,SAAiB,EACjB,aAAqB,EACrB,OAAe;IAEf,
|
|
1
|
+
{"version":3,"file":"connect-or-start.js","sourceRoot":"","sources":["../src/connect-or-start.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cello-protocol/daemon",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"@libp2p/interface": "^3.0.0",
|
|
30
30
|
"cbor-x": "^1.6.0",
|
|
31
31
|
"it-length-prefixed": "^10.0.1",
|
|
32
|
-
"@cello-protocol/crypto": "0.0.
|
|
33
|
-
"@cello-protocol/
|
|
34
|
-
"@cello-protocol/
|
|
32
|
+
"@cello-protocol/crypto": "0.0.9",
|
|
33
|
+
"@cello-protocol/protocol-types": "0.0.6",
|
|
34
|
+
"@cello-protocol/transport": "0.0.6"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^25.6.2",
|