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);
      }
    },
  };
}