fix: daemon lifecycle cleanup and error logging improvements

- Refactor HealthDaemon to use a tracked session (AbortController + awaitable
  promise) instead of fire-and-forget health check loops, preventing health
  checks from running after a service is stopped
- Stop health checks before terminating daemon to avoid false crash reports
  during intentional shutdown
- Guard onExit callbacks with AbortSignal to prevent stale session callbacks
- Add logErrorOnce utility to deduplicate repeated error logging
- Fix SystemForEmbassy.stop() to capture clean promise before deleting ref
- Treat SIGTERM (signal 15) as successful exit in subcontainer sync
- Fix asError to return original Error instead of wrapping in new Error
- Remove unused ExtendedVersion import from Backups.ts
This commit is contained in:
Aiden McClelland
2026-03-20 13:35:24 -06:00
parent b54f10af55
commit 7335e52ab3
10 changed files with 73 additions and 52 deletions

View File

@@ -37,7 +37,7 @@
},
"../sdk/dist": {
"name": "@start9labs/start-sdk",
"version": "0.4.0-beta.61",
"version": "0.4.0-beta.62",
"license": "MIT",
"dependencies": {
"@iarna/toml": "^3.0.0",

View File

@@ -445,15 +445,14 @@ export class SystemForEmbassy implements System {
}
callCallback(_callback: number, _args: any[]): void {}
async stop(): Promise<void> {
const { currentRunning } = this
this.currentRunning?.clean()
const clean = this.currentRunning?.clean({
timeout: fromDuration(
(this.manifest.main["sigterm-timeout"] as any) || "30s",
),
})
delete this.currentRunning
if (currentRunning) {
await currentRunning.clean({
timeout: fromDuration(
(this.manifest.main["sigterm-timeout"] as any) || "30s",
),
})
if (clean) {
await clean
}
}