Handle process, cluster, servers and req/res for graceful exit
Supports cluster, process events, SIGTERM, SIGINT, SIGHUP, etc.
server.close()
and keep-alive
done right at socket level.
const terminable = require('like-terminable')
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World!')
})
const server = app.listen(3000, function () {
terminable.add(server) // always add it after 'listening' event
})
console.log('Press CTRL+C to clean up the process, twice forces SIGINT')
npm i like-terminable
app.get('/long-polling', function (req, res) {
const timeoutId = setTimeout(() => {
res.send('Hello World!')
}, 3000)
terminable.find(res).once('cleanup', function () {
clearTimeout(timeoutId)
res.end()
})
})
Note: 'cleanup' event could be emitted multiple times,
be aware of on('cleanup', ..)
vs once('cleanup', ..)
.
app.get('/long-processing', function (req, res) {
const state = terminable.find(res)
while (true) {
if (state.terminated) {
res.end()
return
}
if (Math.random() > 0.9999) {
res.json({ processed: true })
return
}
}
})
const server = app.listen(3000, function () {
const state = terminable.add(server)
// ie. close the server and clean up all the resources under server:
state.cleanup()
})
const server = app.listen(3000, function () {
terminable.add(server)
// ie. clean up all the resources under process after 3 seconds
setTimeout(function () {
terminable.cleanup()
}, 3000)
})
Code released under the MIT License.