mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 01:21:43 +00:00
KISS/DRY sweep — drops ~90 LOC with no behavior change. - circularBuffer: drop unused pushAll/toArray/size; fold toArray into drain - gracefulExit: inline Cleanup type + failsafe const; signal→code as a record instead of nested ternary; drop dead .catch on Promise.allSettled; drop unused forceExit - memory: inline heapDumpRoot() + writeSnapshot() (single-use); collapse the two fd/smaps try/catch blocks behind one `swallow` helper; build potentialLeaks functionally (array+filter) instead of imperative push-chain; UNITS at file bottom - memoryMonitor: inline DEFAULTS; drop unused onSnapshot; collapse dumpedHigh/dumpedCritical bools to a single Set; single callback dispatch line instead of duplicated if-chains - entry.tsx: factor `dumpNotice` formatter (used twice by onHigh + onCritical) - useMainApp resize debounce: drop redundant `if (timer)` guards (clearTimeout(undefined) is a no-op); init as undefined not null - useVirtualHistory: trim wall-of-text comment to one-line intent; hoist `const n = items.length`; split comma-declared lets; remove the `;[start, end] = frozenRange` destructure in favor of direct Math.min clamps; hoist `hi` init in upperBound for consistency Validation: tsc clean (both configs), eslint clean on touched files, vitest 102/102, build produces shebang-preserved dist/entry.js, performHeapDump smoke-test still writes valid snapshot + diagnostics.
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
interface SetupOptions {
|
|
cleanups?: (() => Promise<void> | void)[]
|
|
failsafeMs?: number
|
|
onError?: (scope: 'uncaughtException' | 'unhandledRejection', err: unknown) => void
|
|
onSignal?: (signal: NodeJS.Signals) => void
|
|
}
|
|
|
|
const SIGNAL_EXIT_CODE: Record<'SIGHUP' | 'SIGINT' | 'SIGTERM', number> = {
|
|
SIGHUP: 129,
|
|
SIGINT: 130,
|
|
SIGTERM: 143
|
|
}
|
|
|
|
let wired = false
|
|
|
|
export function setupGracefulExit({ cleanups = [], failsafeMs = 4000, onError, onSignal }: SetupOptions = {}) {
|
|
if (wired) {
|
|
return
|
|
}
|
|
|
|
wired = true
|
|
|
|
let shuttingDown = false
|
|
|
|
const exit = (code: number, signal?: NodeJS.Signals) => {
|
|
if (shuttingDown) {
|
|
return
|
|
}
|
|
|
|
shuttingDown = true
|
|
|
|
if (signal) {
|
|
onSignal?.(signal)
|
|
}
|
|
|
|
setTimeout(() => process.exit(code), failsafeMs).unref?.()
|
|
|
|
void Promise.allSettled(cleanups.map(fn => Promise.resolve().then(fn))).finally(() => process.exit(code))
|
|
}
|
|
|
|
for (const sig of ['SIGINT', 'SIGTERM', 'SIGHUP'] as const) {
|
|
process.on(sig, () => exit(SIGNAL_EXIT_CODE[sig], sig))
|
|
}
|
|
|
|
process.on('uncaughtException', err => onError?.('uncaughtException', err))
|
|
process.on('unhandledRejection', reason => onError?.('unhandledRejection', reason))
|
|
}
|