diff options
| author | akiyamn | 2023-09-24 23:22:21 +1000 |
|---|---|---|
| committer | akiyamn | 2023-09-24 23:22:21 +1000 |
| commit | 4e87195739f2a5d9a05451b48773c8afdc680765 (patch) | |
| tree | 9cba501844a4a11dcbdffc4050ed8189561c55ed /node_modules/stoppable/lib | |
| download | price-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.tar.gz price-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.zip | |
Initial commit (by create-cloudflare CLI)
Diffstat (limited to 'node_modules/stoppable/lib')
| -rw-r--r-- | node_modules/stoppable/lib/stoppable.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/node_modules/stoppable/lib/stoppable.js b/node_modules/stoppable/lib/stoppable.js new file mode 100644 index 0000000..68d526c --- /dev/null +++ b/node_modules/stoppable/lib/stoppable.js @@ -0,0 +1,65 @@ +'use strict' + +const https = require('https') + +module.exports = (server, grace) => { + grace = typeof grace === 'undefined' ? Infinity : grace + const reqsPerSocket = new Map() + let stopped = false + let gracefully = true + + if (server instanceof https.Server) { + server.on('secureConnection', onConnection) + } else { + server.on('connection', onConnection) + } + + server.on('request', onRequest) + server.stop = stop + server._pendingSockets = reqsPerSocket + return server + + function onConnection (socket) { + reqsPerSocket.set(socket, 0) + socket.once('close', () => reqsPerSocket.delete(socket)) + } + + function onRequest (req, res) { + reqsPerSocket.set(req.socket, reqsPerSocket.get(req.socket) + 1) + res.once('finish', () => { + const pending = reqsPerSocket.get(req.socket) - 1 + reqsPerSocket.set(req.socket, pending) + if (stopped && pending === 0) { + req.socket.end() + } + }) + } + + function stop (callback) { + // allow request handlers to update state before we act on that state + setImmediate(() => { + stopped = true + if (grace < Infinity) { + setTimeout(destroyAll, grace).unref() + } + server.close(e => { + if (callback) { + callback(e, gracefully) + } + }) + reqsPerSocket.forEach(endIfIdle) + }) + } + + function endIfIdle (requests, socket) { + if (requests === 0) socket.end() + } + + function destroyAll () { + gracefully = false + reqsPerSocket.forEach((reqs, socket) => socket.end()) + setImmediate(() => { + reqsPerSocket.forEach((reqs, socket) => socket.destroy()) + }) + } +} |
