server-shutdown
Advanced tools
Comparing version 0.2.0 to 0.3.0
{ | ||
"name": "server-shutdown", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "Gracefully shutdown any number of HTTP and WebSocket servers in node", | ||
@@ -45,4 +45,6 @@ "main": "src/index.js", | ||
"nyc": "^8.3.1", | ||
"request": "^2.75.0" | ||
"request": "^2.75.0", | ||
"socket.io": "^1.5.1", | ||
"socket.io-client": "^1.5.1" | ||
} | ||
} |
@@ -53,12 +53,14 @@ # Server Shutdown | ||
const io = socketio(httpServer); | ||
serverShutdown.registerServer(io.engine); | ||
serverShutdown.registerServer(io, ServerShutdown.Adapters.socketio); | ||
## API | ||
### `ServerShutdown.registerServer(server)` | ||
### Methods | ||
Registers a server with the library. | ||
#### `ServerShutdown.registerServer(server[, adapterName = ServerShutdown.Adapters.http])` | ||
### `ServerShutdown.shutdown([force = false][, callback])` | ||
Registers a server with the library. The adapter name argument is used to set the type of server being registered. | ||
#### `ServerShutdown.shutdown([force = false][, callback])` | ||
Shutdown all the servers registered. If the optional `force` flag is provided and true all connections | ||
@@ -68,2 +70,18 @@ are forecfully disconnected. The `callback` is called once all connections are disconnected and servers | ||
#### `ServerShutdown.registerAdapter(name, adapter)` | ||
Register a server adapter with the system. Name should be a string and adapter is an object that contains a | ||
`close(server, callback)` function that is responsible for closing the server and a `socketClose(socket)` | ||
function that is responsible for destroying the sockets the server creates. | ||
### Constants | ||
#### `ServerShutdown.Adapters.http` | ||
The adapter name for the http adapter. Used with `ServerShutdown.registerAdapter`. | ||
#### `ServerShutdown.Adapters.socketio` | ||
The adapter name for the Socket.io adapter. Used with `ServerShutdown.registerAdapter`. | ||
## Development | ||
@@ -87,3 +105,3 @@ | ||
[6]: https://nodejs.org/api/http.html#http_event_request | ||
[7]: https://nodejs.org/api/http.html#http_class_http_serverresponse | ||
[7]: https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback | ||
[8]: https://github.com/visionmedia/debug |
@@ -5,2 +5,4 @@ 'use strict'; | ||
const debug = require('debug')('server-shutdown'); | ||
const httpAdapter = require('./adapter/http'); | ||
const socketioAdapter = require('./adapter/socketio'); | ||
@@ -10,2 +12,3 @@ function noop() { | ||
} | ||
class ServerShutdown { | ||
@@ -15,2 +18,3 @@ constructor() { | ||
this.servers = new Set(); | ||
this.adapters = new Map(); | ||
this.stopped = false; | ||
@@ -21,10 +25,28 @@ this._serverConnectionHandler = this._serverConnectionHandler.bind(this); | ||
this._destroySockets = this._destroySockets.bind(this); | ||
this.registerAdapter(ServerShutdown.Adapters.http, httpAdapter); | ||
this.registerAdapter(ServerShutdown.Adapters.socketio, socketioAdapter); | ||
} | ||
registerServer(server) { | ||
registerAdapter(name, adapter) { | ||
this.adapters.set(name, adapter); | ||
} | ||
registerServer(server, adapterName) { | ||
if (!adapterName) { | ||
/* eslint-disable no-param-reassign */ | ||
adapterName = ServerShutdown.Adapters.http; | ||
/* eslint-enable no-param-reassign */ | ||
} | ||
if (!this.adapters.has(adapterName)) { | ||
throw new Error(`The adapter, ${adapterName}, is not registered`); | ||
} | ||
debug('Added server'); | ||
const adapter = this.adapters.get(adapterName); | ||
this.servers.add(server); | ||
server.serverShutdownAdapter = adapter; | ||
server.on('request', this._socketRequestHandler); | ||
server.on('upgrade', this._socketUpgradeHandler); | ||
server.on('connection', this._serverConnectionHandler); | ||
server.on('connection', (s) => this._serverConnectionHandler(s, adapter)); | ||
} | ||
@@ -43,3 +65,3 @@ | ||
for (const server of this.servers) { | ||
tasks.push(server.close.bind(server)); | ||
tasks.push((cb) => server.serverShutdownAdapter.close(server, cb)); | ||
} | ||
@@ -54,5 +76,6 @@ tasks.push(async.ensureAsync((cb) => this._destroySockets(force, cb))); | ||
_serverConnectionHandler(socket) { | ||
_serverConnectionHandler(socket, adapter) { | ||
debug('Starting connection'); | ||
socket.serverShutdownIdle = true; | ||
socket.serverShutdownAdapter = adapter; | ||
this.sockets.add(socket); | ||
@@ -112,4 +135,3 @@ socket.on('close', () => { | ||
debug('Destroying socket'); | ||
// Some sockets use close (engine.io), Node.js uses destroy | ||
(socket.destroy || socket.close).call(socket); | ||
socket.serverShutdownAdapter.socketClose(socket); | ||
this.sockets.delete(socket); | ||
@@ -119,2 +141,7 @@ } | ||
ServerShutdown.Adapters = { | ||
http: 'http', | ||
socketio: 'socketio' | ||
}; | ||
module.exports = ServerShutdown; |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
10708
8
147
105
0
9