chore: lint ./app/server/app.js reorg socket and safe shutdown
This commit is contained in:
parent
bd0760eafb
commit
aa580b54a5
1 changed files with 33 additions and 31 deletions
|
|
@ -122,11 +122,35 @@ const server = require('http').Server(app);
|
||||||
const validator = require('validator');
|
const validator = require('validator');
|
||||||
const io = require('socket.io')(server, { serveClient: false, path: '/ssh/socket.io', origins: config.http.origins });
|
const io = require('socket.io')(server, { serveClient: false, path: '/ssh/socket.io', origins: config.http.origins });
|
||||||
const favicon = require('serve-favicon');
|
const favicon = require('serve-favicon');
|
||||||
const socket = require('./socket');
|
const appSocket = require('./socket');
|
||||||
const expressOptions = require('./expressOptions');
|
const expressOptions = require('./expressOptions');
|
||||||
const myutil = require('./util');
|
const myutil = require('./util');
|
||||||
|
|
||||||
myutil.setDefaultCredentials(config.user.name, config.user.password, config.user.privatekey);
|
myutil.setDefaultCredentials(config.user.name, config.user.password, config.user.privatekey);
|
||||||
|
|
||||||
|
// safe shutdown
|
||||||
|
let shutdownMode = false;
|
||||||
|
let shutdownInterval = 0;
|
||||||
|
let connectionCount = 0;
|
||||||
|
// eslint-disable-next-line consistent-return
|
||||||
|
function safeShutdownGuard(req, res, next) {
|
||||||
|
if (shutdownMode) {
|
||||||
|
res.status(503).end('Service unavailable: Server shutting down');
|
||||||
|
} else {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// clean stop
|
||||||
|
function stopApp(reason) {
|
||||||
|
shutdownMode = false;
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
if (reason) console.log(`Stopping: ${reason}`);
|
||||||
|
if (shutdownInterval) clearInterval(shutdownInterval);
|
||||||
|
io.close();
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { server, config };
|
||||||
// express
|
// express
|
||||||
app.use(safeShutdownGuard);
|
app.use(safeShutdownGuard);
|
||||||
app.use(session);
|
app.use(session);
|
||||||
|
|
@ -147,7 +171,7 @@ app.get('/ssh/reauth', (req, res, next) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line complexity
|
// eslint-disable-next-line complexity
|
||||||
app.get('/ssh/host/:host?', (req, res, next) => {
|
app.get('/ssh/host/:host?', (req, res) => {
|
||||||
res.sendFile(path.join(path.join(publicPath, 'client.htm')));
|
res.sendFile(path.join(path.join(publicPath, 'client.htm')));
|
||||||
// capture, assign, and validated variables
|
// capture, assign, and validated variables
|
||||||
req.session.ssh = {
|
req.session.ssh = {
|
||||||
|
|
@ -201,6 +225,9 @@ app.use((err, req, res, next) => {
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// bring up socket
|
||||||
|
io.on('connection', appSocket);
|
||||||
|
|
||||||
// socket.io
|
// socket.io
|
||||||
// expose express session with socket.request.session
|
// expose express session with socket.request.session
|
||||||
io.use((socket, next) => {
|
io.use((socket, next) => {
|
||||||
|
|
@ -209,33 +236,20 @@ io.use((socket, next) => {
|
||||||
: next(next); // eslint disable-line
|
: next(next); // eslint disable-line
|
||||||
});
|
});
|
||||||
|
|
||||||
// bring up socket
|
|
||||||
io.on('connection', socket);
|
|
||||||
|
|
||||||
// safe shutdown
|
|
||||||
let shutdownMode = false;
|
|
||||||
let shutdownInterval = 0;
|
|
||||||
let connectionCount = 0;
|
|
||||||
|
|
||||||
function safeShutdownGuard(req, res, next) {
|
|
||||||
if (shutdownMode) res.status(503).end('Service unavailable: Server shutting down');
|
|
||||||
else return next();
|
|
||||||
}
|
|
||||||
|
|
||||||
io.on('connection', (socket) => {
|
io.on('connection', (socket) => {
|
||||||
connectionCount += 1;
|
connectionCount += 1;
|
||||||
|
|
||||||
socket.on('disconnect', () => {
|
socket.on('disconnect', () => {
|
||||||
connectionCount -= 1;
|
connectionCount -= 1;
|
||||||
if ((connectionCount <= 0) && shutdownMode) {
|
if ((connectionCount <= 0) && shutdownMode) {
|
||||||
stop('All clients disconnected');
|
stopApp('All clients disconnected');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const signals = ['SIGTERM', 'SIGINT'];
|
const signals = ['SIGTERM', 'SIGINT'];
|
||||||
signals.forEach((signal) => process.on(signal, () => {
|
signals.forEach((signal) => process.on(signal, () => {
|
||||||
if (shutdownMode) stop('Safe shutdown aborted, force quitting');
|
if (shutdownMode) stopApp('Safe shutdown aborted, force quitting');
|
||||||
else if (connectionCount > 0) {
|
else if (connectionCount > 0) {
|
||||||
let remainingSeconds = config.safeShutdownDuration;
|
let remainingSeconds = config.safeShutdownDuration;
|
||||||
shutdownMode = true;
|
shutdownMode = true;
|
||||||
|
|
@ -249,22 +263,10 @@ signals.forEach((signal) => process.on(signal, () => {
|
||||||
shutdownInterval = setInterval(() => {
|
shutdownInterval = setInterval(() => {
|
||||||
remainingSeconds -= 1;
|
remainingSeconds -= 1;
|
||||||
if ((remainingSeconds) <= 0) {
|
if ((remainingSeconds) <= 0) {
|
||||||
stop('Countdown is over');
|
stopApp('Countdown is over');
|
||||||
} else {
|
} else {
|
||||||
io.sockets.emit('shutdownCountdownUpdate', remainingSeconds);
|
io.sockets.emit('shutdownCountdownUpdate', remainingSeconds);
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
} else stop();
|
} else stopApp();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// clean stop
|
|
||||||
function stop(reason) {
|
|
||||||
shutdownMode = false;
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
if (reason) console.log(`Stopping: ${reason}`);
|
|
||||||
if (shutdownInterval) clearInterval(shutdownInterval);
|
|
||||||
io.close();
|
|
||||||
server.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { server, config };
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue