-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
113 lines (103 loc) · 2.32 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"use strict";
var fs = require("fs");
var status = 500;
var toobusy = false;
var stopping = false;
function setStatus(code) {
if (!Number.isInteger(code) || code < 1 || code > 999) {
var e = new Error("status should be an integer between 1 and 999");
e.status = code;
throw e;
}
status = code;
}
function getStatus() {
return status;
}
/**
* returns 503 if server is toobusy, status (as defined by setStatus) otherwise.
*/
function route(req, res) {
if (toobusy && toobusy()) {
res.sendStatus(503).end();
} else {
res.sendStatus(status).end();
}
}
/**
* adds a `Connection: close` to all responses if app.get('stopping') is true.
*/
function gracefulShutdownKeepaliveConnections(req, res, next) {
if (stopping === true) {
res.set("Connection", "close");
}
next();
}
function enableTooBusy(lag) {
if (typeof lag === "undefined") {
lag = 70;
}
if (!Number.isInteger(lag) || lag < 10) {
var e = new Error("lag should be an integer greater than 10");
e.lag = lag;
throw e;
}
toobusy = require("toobusy-js");
toobusy.maxLag(lag);
}
/**
* - logs shutdown to graylog (if log4js logger provided).
* - sets `stopping` to true.
* - dumps error in terminationFile if provided.
*/
function shutdown(signal, error, cb, terminationFile, logger) {
status = 503;
var reason;
if (error) {
if (logger && logger.fatal) {
let uError = {};
const errorKeys = Object.keys(error);
for (let index = 0; index < errorKeys.length; index++) {
const key = errorKeys[index];
uError[`_${key}`] = error[key];
}
logger.fatal(
{ GELF: true, _signal: signal, _stack: error.stack, ...uError },
error.message
);
}
reason = `${signal}\n${error.message}\n${error.stack}`;
} else {
if (logger && logger.info) {
logger.info({ GELF: true, _signal: signal }, "shutdown");
}
reason = "shutdown";
}
if (stopping === true) {
return;
}
stopping = true;
function callback() {
if (cb) {
return cb(signal ? 1 : 0);
}
}
if (terminationFile) {
fs.writeFile(terminationFile, reason, function (err) {
if (err) {
console.error(err);
}
callback();
});
} else {
callback();
}
}
module.exports = {
setStatus: setStatus,
getStatus: getStatus,
route: route,
shutdown: shutdown,
enableTooBusy: enableTooBusy,
gracefulShutdownKeepaliveConnections: gracefulShutdownKeepaliveConnections,
};