bridge-node-server/node_server/swagger_api/api_expiry_middleware.js
Martin Donnelly 57bd6c8e6a init
2018-06-24 21:15:03 +01:00

76 lines
2.2 KiB
JavaScript

//
// Middleware to handle returning the expiry time for the session.
// This will allow clients to accurately manage session keep alive requests.
//
// In a similar manner to the swagger respone validator, we replace res.end()
// with our own function, so that we will be called at the end of the response
// tree.
// etc.
//
'use strict';
var debug = require('debug')('webconsole-api:cors-middleware');
var sessionTimeout = require(global.pathPrefix + 'utils.js').sessionTimeout;
module.exports = middleware;
/**
* Define a middleware function to add the session expiry to responses, so that
* clients can manage the session keepalive effectively.
*
* @param {Object} req - the express request
* @param {Object} res - the express response
*/
function reportSessionExpiry(req, res) {
const session = req.session;
if (session && session.lastModified) {
let expiry = new Date(session.lastModified);
expiry.setMinutes(expiry.getMinutes() + sessionTimeout);
const now = new Date();
const secondsLeft = Math.floor((expiry.getTime() - now.getTime()) / 1000);
res.setHeader('X-BRIDGE-SESSION-EXPIRY', secondsLeft);
}
}
/**
* Define a middleware function to add the session expiry to responses, so that
* clients can manage the session keepalive effectively.
* This uses a replacement for the original res.end so that we get called at
* the end as part of the response.
*
* @param {Object} req - the express request
* @param {Object} res - the express response
* @param {function} next - the callback for the next middleware in the chain
*
* @returns {any} - the result of the next() callback
*/
function middleware(req, res, next) {
// Store the original end so we can restore it later
var originalEnd = res.end;
// Replace the end with our own function
res.end = function(data, encoding) {
//
// Put the real end back
//
res.end = originalEnd;
//
// Add our header
//
reportSessionExpiry(req, res);
//
// Call the original end function to continue
//
res.end(data, encoding);
};
//
// Call the next item on the stack
//
return next();
}