Skip to content

Commit 3998573

Browse files
disintegratorgergelyke
authored andcommitted
fix(lib): support handling multiple servers in one process
1 parent 2b4def9 commit 3998573

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
'use strict'
2+
const http = require('http')
3+
const server1 = http.createServer((req, res) => res.end('hello1'))
4+
const server2 = http.createServer((req, res) => res.end('hello2'))
5+
const server3 = http.createServer((req, res) => res.end('hello3'))
6+
7+
const terminus = require('../terminus')
8+
9+
terminus(server1, {
10+
onSignal: () => {
11+
console.log('server1:onSignal')
12+
return Promise.resolve()
13+
}
14+
})
15+
terminus(server2, {
16+
onSignal: () => {
17+
console.log('server2:onSignal')
18+
return Promise.resolve()
19+
}
20+
})
21+
terminus(server3, {
22+
onSignal: () => {
23+
console.log('server3:onSignal')
24+
return Promise.resolve()
25+
}
26+
})
27+
28+
new Promise((resolve) => {
29+
let counter = 3
30+
const handle = () => {
31+
counter -= 1
32+
if (counter <= 0) { resolve() }
33+
}
34+
server1.listen(8000, handle)
35+
server2.listen(8001, handle)
36+
server3.listen(8002, handle)
37+
})
38+
.then(() => process.kill(process.pid, 'SIGTERM'))

lib/terminus.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ function sendFailure (res) {
3131
res.end(FAILURE_RESPONSE)
3232
}
3333

34-
const state = {
34+
const intialState = {
3535
isShuttingDown: false
3636
}
3737

3838
function noop () {}
3939

40-
function decorateWithHealthCheck (server, options) {
40+
function decorateWithHealthCheck (server, state, options) {
4141
const { healthChecks, logger } = options
4242

4343
server.listeners('request').forEach((listener) => {
@@ -62,7 +62,7 @@ function decorateWithHealthCheck (server, options) {
6262
})
6363
}
6464

65-
function decorateWithSignalHandler (server, options) {
65+
function decorateWithSignalHandler (server, state, options) {
6666
const { signals, onSignal, beforeShutdown, onShutdown, timeout, logger } = options
6767

6868
stoppable(server, timeout)
@@ -100,9 +100,10 @@ function terminus (server, options = {}) {
100100
beforeShutdown = noopResolves,
101101
logger = noop } = options
102102
const onSignal = options.onSignal || options.onSigterm || noopResolves
103+
const state = Object.assign({}, intialState)
103104

104105
if (Object.keys(healthChecks).length > 0) {
105-
decorateWithHealthCheck(server, {
106+
decorateWithHealthCheck(server, state, {
106107
healthChecks,
107108
logger
108109
})
@@ -111,7 +112,7 @@ function terminus (server, options = {}) {
111112
// push the signal into the array
112113
// for backwards compatability
113114
if (!signals.includes(signal)) signals.push(signal)
114-
decorateWithSignalHandler(server, {
115+
decorateWithSignalHandler(server, state, {
115116
signals,
116117
onSignal,
117118
beforeShutdown,

lib/terminus.spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,13 @@ describe('Terminus', () => {
188188
const result = spawnSync('node', ['lib/standalone-tests/terminus.onshutdown.multiple.js', 'SIGUSR2'])
189189
expect(result.stdout.toString().trim()).to.eql('on-sigusr2-runs\non-shutdown-runs')
190190
})
191+
192+
it('manages multiple servers', () => {
193+
const result = spawnSync('node', ['lib/standalone-tests/terminus.multiserver.js'])
194+
expect(result.stdout.toString().trim()).to.eql([
195+
'server1:onSignal',
196+
'server2:onSignal',
197+
'server3:onSignal'
198+
].join('\n'))
199+
})
191200
})

0 commit comments

Comments
 (0)