Spaces:
Configuration error
Configuration error
; | |
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); | |
}; | |
}; | |