From 4e87195739f2a5d9a05451b48773c8afdc680765 Mon Sep 17 00:00:00 2001 From: akiyamn Date: Sun, 24 Sep 2023 23:22:21 +1000 Subject: Initial commit (by create-cloudflare CLI) --- node_modules/exit-hook/index.js | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 node_modules/exit-hook/index.js (limited to 'node_modules/exit-hook/index.js') diff --git a/node_modules/exit-hook/index.js b/node_modules/exit-hook/index.js new file mode 100644 index 0000000..fc309b0 --- /dev/null +++ b/node_modules/exit-hook/index.js @@ -0,0 +1,46 @@ +'use strict'; + +const callbacks = new Set(); +let isCalled = false; +let isRegistered = false; + +function exit(exit, signal) { + if (isCalled) { + return; + } + + isCalled = true; + + for (const callback of callbacks) { + callback(); + } + + if (exit === true) { + process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit + } +} + +module.exports = callback => { + callbacks.add(callback); + + if (!isRegistered) { + isRegistered = true; + + process.once('exit', exit); + process.once('SIGINT', exit.bind(null, true, 2)); + process.once('SIGTERM', exit.bind(null, true, 15)); + + // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because + // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit + // event cannot support async handlers, since the event loop is never called after it. + process.on('message', message => { + if (message === 'shutdown') { + exit(true, -128); + } + }); + } + + return () => { + callbacks.delete(callback); + }; +}; -- cgit v1.2.3