summaryrefslogtreecommitdiff
path: root/node_modules/stoppable/lib/stoppable.js
diff options
context:
space:
mode:
authorakiyamn2023-09-24 23:22:21 +1000
committerakiyamn2023-09-24 23:22:21 +1000
commit4e87195739f2a5d9a05451b48773c8afdc680765 (patch)
tree9cba501844a4a11dcbdffc4050ed8189561c55ed /node_modules/stoppable/lib/stoppable.js
downloadprice-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.tar.gz
price-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.zip
Initial commit (by create-cloudflare CLI)
Diffstat (limited to 'node_modules/stoppable/lib/stoppable.js')
-rw-r--r--node_modules/stoppable/lib/stoppable.js65
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())
+ })
+ }
+}