UNPKG

@routes/graceful-shutdown

Version:
45 lines (36 loc) • 1.3 kB
const { BEFORE, AFTER } = require('../eventNames'); const forceShutdown = require('../forceShutdown'); const getConnections = require('../getConnections'); /** * Shutdown gracefully (delayed event) * @param {net.Server} options.server * @param {Number} options.timeout * @param {Function} options.logger * @param {Set} options.sockets * @param {Object} options.pub * @return {undefined} */ module.exports = async function shutdown({server, timeout, logger, sockets, onsuccess, onfail, pub}) { if (server.shuttingDown) { return; } await pub(BEFORE); server.shuttingDown = true; // eslint-disable-line require-atomic-updates logger.info(`Started shutdown process with ${await getConnections(server)} connections and timeout of ${timeout} ms`); logger.info(`Setting timeout of ${timeout} for ${sockets.size} sockets`); sockets.forEach(socket => { socket.on('timeout', () => socket.end()); socket.setTimeout( Math.max(timeout - 10, 0) ); }); try { logger.info('Asking server to close'); server.close(async function resolution() { logger.info('Closed server successfully'); await pub(AFTER); onsuccess(); }); await forceShutdown({server, timeout, logger, onsuccess, onfail, pub}); } catch (error) { logger.error(error); } };