test: narrow gateway loop signal harness

This commit is contained in:
Peter Steinberger
2026-03-09 07:42:15 +00:00
parent d0847ee322
commit 3caab9260c

View File

@@ -47,10 +47,10 @@ vi.mock("../../logging/subsystem.js", () => ({
createSubsystemLogger: () => gatewayLog, createSubsystemLogger: () => gatewayLog,
})); }));
function removeNewSignalListeners( const LOOP_SIGNALS = ["SIGTERM", "SIGINT", "SIGUSR1"] as const;
signal: NodeJS.Signals, type LoopSignal = (typeof LOOP_SIGNALS)[number];
existing: Set<(...args: unknown[]) => void>,
) { function removeNewSignalListeners(signal: LoopSignal, existing: Set<(...args: unknown[]) => void>) {
for (const listener of process.listeners(signal)) { for (const listener of process.listeners(signal)) {
const fn = listener as (...args: unknown[]) => void; const fn = listener as (...args: unknown[]) => void;
if (!existing.has(fn)) { if (!existing.has(fn)) {
@@ -60,7 +60,7 @@ function removeNewSignalListeners(
} }
function addedSignalListener( function addedSignalListener(
signal: NodeJS.Signals, signal: LoopSignal,
existing: Set<(...args: unknown[]) => void>, existing: Set<(...args: unknown[]) => void>,
): (() => void) | null { ): (() => void) | null {
const listeners = process.listeners(signal) as Array<(...args: unknown[]) => void>; const listeners = process.listeners(signal) as Array<(...args: unknown[]) => void>;
@@ -74,14 +74,15 @@ function addedSignalListener(
} }
async function withIsolatedSignals( async function withIsolatedSignals(
run: (helpers: { captureSignal: (signal: NodeJS.Signals) => () => void }) => Promise<void>, run: (helpers: { captureSignal: (signal: LoopSignal) => () => void }) => Promise<void>,
) { ) {
const existingListeners = { const existingListeners = Object.fromEntries(
SIGTERM: new Set(process.listeners("SIGTERM") as Array<(...args: unknown[]) => void>), LOOP_SIGNALS.map((signal) => [
SIGINT: new Set(process.listeners("SIGINT") as Array<(...args: unknown[]) => void>), signal,
SIGUSR1: new Set(process.listeners("SIGUSR1") as Array<(...args: unknown[]) => void>), new Set(process.listeners(signal) as Array<(...args: unknown[]) => void>),
} satisfies Record<NodeJS.Signals, Set<(...args: unknown[]) => void>>; ]),
const captureSignal = (signal: NodeJS.Signals) => { ) as Record<LoopSignal, Set<(...args: unknown[]) => void>>;
const captureSignal = (signal: LoopSignal) => {
const listener = addedSignalListener(signal, existingListeners[signal]); const listener = addedSignalListener(signal, existingListeners[signal]);
if (!listener) { if (!listener) {
throw new Error(`expected new ${signal} listener`); throw new Error(`expected new ${signal} listener`);
@@ -91,9 +92,9 @@ async function withIsolatedSignals(
try { try {
await run({ captureSignal }); await run({ captureSignal });
} finally { } finally {
removeNewSignalListeners("SIGTERM", existingListeners.SIGTERM); for (const signal of LOOP_SIGNALS) {
removeNewSignalListeners("SIGINT", existingListeners.SIGINT); removeNewSignalListeners(signal, existingListeners[signal]);
removeNewSignalListeners("SIGUSR1", existingListeners.SIGUSR1); }
} }
} }