mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
test: narrow gateway loop signal harness
This commit is contained in:
@@ -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);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user