@cello-protocol/daemon 0.0.133 → 0.0.135
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/bin/cello-daemon.js +25 -0
- package/dist/bin/cello-daemon.js.map +1 -1
- package/dist/daemon.js +65 -4
- package/dist/daemon.js.map +1 -1
- package/dist/document-store.d.ts +21 -0
- package/dist/document-store.d.ts.map +1 -1
- package/dist/document-store.js +35 -3
- package/dist/document-store.js.map +1 -1
- package/dist/notification-handlers.d.ts.map +1 -1
- package/dist/notification-handlers.js +31 -14
- package/dist/notification-handlers.js.map +1 -1
- package/dist/session-node-manager.d.ts +11 -4
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +13 -6
- package/dist/session-node-manager.js.map +1 -1
- package/dist/session-read-handlers.js +1 -1
- package/dist/session-read-handlers.js.map +1 -1
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -5
package/dist/bin/cello-daemon.js
CHANGED
|
@@ -185,6 +185,26 @@ async function main() {
|
|
|
185
185
|
securityGateway: security.client,
|
|
186
186
|
restartSecurityGateway,
|
|
187
187
|
onShutdown: stopSecurityLayer,
|
|
188
|
+
// DOD-LOGOUT-EXIT-1: THIS is what makes `cello logout` honest. The IPC `shutdown` verb never
|
|
189
|
+
// reaches the signal handlers below, so before this line the logout path had nothing that
|
|
190
|
+
// ended the process — it released the socket, the lock file and the singleton lock (the exact
|
|
191
|
+
// two facts logout consults to decide the daemon is gone) and then kept running, still
|
|
192
|
+
// connected to a directory node. This is the only place that may exit: the daemon module is
|
|
193
|
+
// also used in-process by tests and embedders, where exiting would kill the host.
|
|
194
|
+
//
|
|
195
|
+
// The log line is not decoration — it is the evidence that the exit was DELIBERATE. Without it
|
|
196
|
+
// a daemon whose event loop merely happened to drain is indistinguishable from one that was
|
|
197
|
+
// told to stop, and this wiring could be deleted without any test noticing.
|
|
198
|
+
onStopped: ({ ok, error }) => {
|
|
199
|
+
// A dirty stop still ENDS — a half-stopped daemon may not keep talking to a directory — but
|
|
200
|
+
// it exits non-zero and says why. Exiting 0 for both would let `cello logout` print
|
|
201
|
+
// "Daemon stopped." over a shutdown that never marked its sessions interrupted.
|
|
202
|
+
logger.info("daemon.exit", { pid: process.pid, ok, ...(error ? { error: error.message } : {}) });
|
|
203
|
+
// stdout is a PIPE here (the daemon is spawned detached with piped stdio) and pipe writes are
|
|
204
|
+
// asynchronous, so `process.exit` can truncate the line above — including the one case where
|
|
205
|
+
// it matters most, the `ok:false` cause. Yield one turn so the write drains first.
|
|
206
|
+
setImmediate(() => process.exit(ok ? 0 : 1));
|
|
207
|
+
},
|
|
188
208
|
registryPubkey: REGISTRY_SIGNER_PUBKEY,
|
|
189
209
|
registryPollScheduler: new RandomizedPollScheduler({ minMs: REGISTRY_POLL_MIN_MS, maxMs: REGISTRY_POLL_MAX_MS }),
|
|
190
210
|
});
|
|
@@ -192,6 +212,11 @@ async function main() {
|
|
|
192
212
|
// handle.stop() runs onShutdown (stopSecurityLayer) for us — the teardown lives there so that
|
|
193
213
|
// `cello logout`, which stops the daemon over IPC and never reaches this handler, tears the
|
|
194
214
|
// sidecar down too.
|
|
215
|
+
//
|
|
216
|
+
// DOD-LOGOUT-EXIT-1: stop()'s onStopped hook exits, so this await does not return while the
|
|
217
|
+
// hook is wired above — the line below is unreachable in the shipped binary. It is kept so that
|
|
218
|
+
// removing the hook cannot silently produce a signal path that never exits, which is the state
|
|
219
|
+
// the IPC path was in before this unit.
|
|
195
220
|
await handle.stop(signal);
|
|
196
221
|
process.exit(0);
|
|
197
222
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cello-daemon.js","sourceRoot":"","sources":["../../src/bin/cello-daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cello-daemon.js","sourceRoot":"","sources":["../../src/bin/cello-daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.js
CHANGED
|
@@ -3506,15 +3506,44 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
3506
3506
|
// unauthenticated HTTP (startHttpManifestPoll above), NOT over a signaling stream. Its
|
|
3507
3507
|
// lifecycle is the daemon's, not any agent connection's — so it polls even with zero agents.
|
|
3508
3508
|
// Graceful shutdown
|
|
3509
|
+
// DOD-LOGOUT-EXIT-1: the onStopped hook ends the process in the binary, so it fires at most once
|
|
3510
|
+
// per daemon no matter how many times stop() is called.
|
|
3511
|
+
let stoppedHookFired = false;
|
|
3509
3512
|
async function stop(reason) {
|
|
3510
3513
|
// M14: stop the document delivery sweep first — it opens sessions, and a tick landing during
|
|
3511
3514
|
// teardown would dial into a daemon that is going away.
|
|
3512
3515
|
clearInterval(documentDeliveryTimer);
|
|
3513
|
-
//
|
|
3514
|
-
// which may be mid-dial into a transport that is going away.
|
|
3516
|
+
// `clearInterval` stops the NEXT tick; the flag stops the running one at its next agent.
|
|
3515
3517
|
documentDeliveryStopping = true;
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
+
// BOUNDED. This was a bare `await documentDeliveryInFlight`, and shutdown is the one place that
|
|
3519
|
+
// must not block on the network: a sweep mid-dial against an unreachable peer held `stop()`
|
|
3520
|
+
// open, so the interrupt-marking writes that follow did not complete before the process died —
|
|
3521
|
+
// and sessions came back `active` after a restart, which is the exact defect AC-009 exists to
|
|
3522
|
+
// catch. It failed on CI, where a directory node times out at 5s, and passed locally, where it
|
|
3523
|
+
// does not.
|
|
3524
|
+
//
|
|
3525
|
+
// A tick still gets a moment to finish so the common case is orderly; after that we proceed
|
|
3526
|
+
// without it. What the sweep leaves half-done is safe by construction — delivery state is
|
|
3527
|
+
// derived from the log, so an interrupted pass is re-derived on the next start.
|
|
3528
|
+
// NOT AWAITED AT ALL. Two attempts at waiting for it were both wrong, and the second was worse
|
|
3529
|
+
// than the first:
|
|
3530
|
+
//
|
|
3531
|
+
// 1. a bare await blocked shutdown on the network — a sweep mid-dial against an unreachable
|
|
3532
|
+
// peer held `stop()` open past the point where the interrupt-marking writes had to happen;
|
|
3533
|
+
// 2. bounding it with `setTimeout(...).unref()` looked like the fix and could HANG FOREVER: an
|
|
3534
|
+
// unref'd timer does not hold the event loop open, so while the loop is draining during
|
|
3535
|
+
// shutdown it may never fire, the race never settles, and `stop()` never reaches the line
|
|
3536
|
+
// that logs `daemon.stopped` — which is exactly what CI showed, a daemon whose log ends at
|
|
3537
|
+
// `daemon.started` with no shutdown events at all.
|
|
3538
|
+
//
|
|
3539
|
+
// There is nothing to wait for. `documentDeliveryStopping` stops the loop at its next agent, and
|
|
3540
|
+
// whatever a half-finished sweep leaves behind is safe by construction: delivery state is
|
|
3541
|
+
// DERIVED from the envelope log, so an interrupted pass is simply re-derived on the next start —
|
|
3542
|
+
// the property the offline enforcer proves against two real daemons.
|
|
3543
|
+
//
|
|
3544
|
+
// The rule this cost two CI round trips to learn: shutdown may not await anything that can
|
|
3545
|
+
// block on I/O, and a timeout that can outlive the event loop is not a bound.
|
|
3546
|
+
void documentDeliveryInFlight;
|
|
3518
3547
|
// M8C-TGDOOR-1: stop the single long-lived getUpdates poller (no-op if never started) — bump
|
|
3519
3548
|
// the generation so the running loop's while-condition fails on its next check.
|
|
3520
3549
|
stopTelegramPoller(); // M8C-TGDOOR-1: invalidate the poll loop; it exits on its next generation check
|
|
@@ -3530,6 +3559,11 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
3530
3559
|
config.registryPollScheduler.cancel();
|
|
3531
3560
|
}
|
|
3532
3561
|
logger.info("daemon.stopped", { pid: process.pid, reason });
|
|
3562
|
+
// DOD-LOGOUT-EXIT-1: what the teardown actually DID, carried to onStopped so the binary can
|
|
3563
|
+
// exit non-zero on a dirty stop. Without it a shutdown that threw halfway — sessions never
|
|
3564
|
+
// marked interrupted, database never checkpointed — would exit 0 and `cello logout` would
|
|
3565
|
+
// print "Daemon stopped.", which is this unit's own defect one level up.
|
|
3566
|
+
let teardownError;
|
|
3533
3567
|
try {
|
|
3534
3568
|
// stopAllSignaling() stops the shared manager AND every per-agent manager (best-effort). Do
|
|
3535
3569
|
// not add a separate per-agent stop loop beside it: it would be redundant, and an unguarded
|
|
@@ -3539,6 +3573,12 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
3539
3573
|
await sessionNodeManager.gracefulShutdown();
|
|
3540
3574
|
await ipcServer.stop();
|
|
3541
3575
|
}
|
|
3576
|
+
catch (err) {
|
|
3577
|
+
// Recorded, then RE-THROWN below by the bare `throw` — the existing contract that a failed
|
|
3578
|
+
// stop() rejects is unchanged. This only makes the failure visible to onStopped as well.
|
|
3579
|
+
teardownError = err instanceof Error ? err : new Error(String(err));
|
|
3580
|
+
throw err;
|
|
3581
|
+
}
|
|
3542
3582
|
finally {
|
|
3543
3583
|
// DOD-M9B-WIRE-1: tear down whatever the composition root started alongside us — today the
|
|
3544
3584
|
// screening sidecar. Two reasons it is HERE and not only in the bin's signal handler:
|
|
@@ -3578,6 +3618,27 @@ async function startDaemonHoldingLock(config, singletonLock) {
|
|
|
3578
3618
|
// Released LAST: while we hold it, no successor daemon can start, which is what lets
|
|
3579
3619
|
// ipcServer.stop()'s socket re-check above be race-free.
|
|
3580
3620
|
singletonLock.release();
|
|
3621
|
+
// DOD-LOGOUT-EXIT-1: signal that this daemon is DONE — the binary's handler is
|
|
3622
|
+
// `process.exit(0)`, so nothing may be sequenced after this line.
|
|
3623
|
+
//
|
|
3624
|
+
// AFTER singletonLock.release(), never before: the process is about to end, and dying while
|
|
3625
|
+
// still holding the kernel lock would make the next `cello login` refuse to start beside a
|
|
3626
|
+
// daemon that no longer exists.
|
|
3627
|
+
//
|
|
3628
|
+
// Inside the `finally` so a throw anywhere above still ends the process. A shutdown that
|
|
3629
|
+
// fails halfway and leaves the daemon alive and on the network is the exact defect this line
|
|
3630
|
+
// closes — "it threw" is not a reason to keep talking to a directory.
|
|
3631
|
+
//
|
|
3632
|
+
// Guarded: `stop()` has no idempotence of its own, and a caller that stops twice (an IPC
|
|
3633
|
+
// shutdown followed by an embedder's own stop) must not exit twice.
|
|
3634
|
+
// The hook's own failure is NOT caught. It is the only call that ends the process, so
|
|
3635
|
+
// swallowing a throw here would leave the daemon alive and handle-free while every check
|
|
3636
|
+
// logout makes agrees it is gone — the original defect, reached through the new code. Letting
|
|
3637
|
+
// it propagate makes stop() reject, which is what lets logout time out and say so.
|
|
3638
|
+
if (!stoppedHookFired) {
|
|
3639
|
+
stoppedHookFired = true;
|
|
3640
|
+
await config.onStopped?.({ ok: teardownError === undefined, error: teardownError });
|
|
3641
|
+
}
|
|
3581
3642
|
}
|
|
3582
3643
|
}
|
|
3583
3644
|
function getSessionNodeManager() {
|