2.1.0 • Published 5 years ago

@routes/graceful-shutdown v2.1.0

Weekly downloads
16
License
MIT
Repository
github
Last release
5 years ago

@routes/graceful-shutdown npm.io

💀 Shut down server gracefully

npm.io npm.io npm.io

net.Server or Express, whatever you're using should be fine

const graceful = require('@routes/graceful-shutdown');

const server = app.listen(1337); // express will return the server instance here
graceful(server);

Arguments

  • First argument is an net.Server instance (including Express server)
  • Second argument is options:
optiontypemeaningdefault
timeoutNumberTime (in milliseconds) to wait before forcefully shutting down10000 (10 sec)
loggerObjectObject with info and error functions (supports async loggers). Pass false to disableconsole
eventsArrayProcess events to handle['SIGTERM', 'SIGINT']
onsuccessFunctionFinal functionality when shutdown finished correctlyprocess.exit(0)
onfailFunctionFinal functionality when shutdown finished incorrectlyprocess.exit(1)

Example of using options

graceful(server, {
	timeout: 3e4,
	logger: winston.createLogger({level: 'error'}),
});

What happens on process termination?

  1. Process termination is interrupted
  2. Open connections are instructed to end (FIN packet) and receive a new timeout to allow them to close in time
  3. The server is firing a close function
  4. After correct closing: onsuccess (default: process exists with exit code 0)
    • End correct behaviour
  5. After timeout passes - an error log is printed with the amount of connection that will be forcefully terminated
  6. onfail: (default: process exists with an exit code 1)

Add custom functionality to shutdown

Add behaviour to the graceful shut down process using a built in pub/sub mechanism

const { sub, BEFORE, AFTER } = graceful(server, {...});

// Will be triggered first thing before the procedure starts
sub(BEFORE, async() => {
	await flushThrottledThings();
	await closeDatabaseConnections();
});

// Will be triggered once the procedure has ended
sub(AFTER, () => logger.info('Okay okay, closing down'));

server.shuttingDown

After shutdown has initiated, the attribute shuttingDown is attached to server with value of true.

User can query this value on service to know not to send any more requests to the service

app.get(
	'/health',
	(request, response) => response.status(server.shuttingDown ? 503 : 200).end()
);

What else does graceful expose?

  • {Set} sockets A reference to the sockets collection
const { sockets } = graceful(server, {...});

// Monitor size of set every two minutes
setInterval(() => stats.time('graceful_stored_sockets', sockets.size), 12e4);
2.1.0

5 years ago

2.1.0-rc.1

5 years ago

2.0.0

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.0

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago

0.0.0

5 years ago