File size: 1,320 Bytes
f778c12 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import { Worker } from "node:worker_threads";
export type ShutdownHardExitWatchdog = {
cancel: () => void;
};
export function armShutdownHardExitWatchdog(params: {
delayMs: number;
onError: (error: unknown) => void;
}): ShutdownHardExitWatchdog | null {
const reportError = (error: unknown) => {
try {
params.onError(error);
} catch {
// Shutdown must retain the main-thread fallback even if warning delivery fails.
}
};
let worker: Worker;
try {
worker = new Worker(
`const { parentPort, workerData } = require("node:worker_threads");
const timer = setTimeout(() => process.kill(process.pid, "SIGKILL"), workerData.delayMs);
parentPort.once("message", () => {
clearTimeout(timer);
parentPort.close();
});`,
{
eval: true,
execArgv: [],
workerData: { delayMs: Math.max(0, Math.floor(params.delayMs)) },
},
);
} catch (error) {
reportError(error);
return null;
}
let active = true;
worker.once("error", (error) => {
if (active) {
active = false;
reportError(error);
}
});
return {
cancel: () => {
active = false;
try {
worker.postMessage("cancel", []);
} catch (error) {
reportError(error);
}
},
};
}
|