enigma-bbs/core/client_connections.js

98 lines
2.3 KiB
JavaScript

/* jslint node: true */
'use strict';
var logger = require('./logger.js');
var _ = require('lodash');
var moment = require('moment');
exports.getActiveConnections = getActiveConnections;
exports.getActiveNodeList = getActiveNodeList;
exports.addNewClient = addNewClient;
exports.removeClient = removeClient;
var clientConnections = [];
exports.clientConnections = clientConnections;
function getActiveConnections() {
return clientConnections;
}
function getActiveNodeList() {
const now = moment();
return _.map(getActiveConnections(), ac => {
let entry = {
node : ac.node,
authenticated : ac.user.isAuthenticated(),
userId : ac.user.userId,
action : _.has(ac, 'currentMenuModule.menuConfig.desc') ? ac.currentMenuModule.menuConfig.desc : 'Unknown',
};
//
// There may be a connection, but not a logged in user as of yet
//
if(ac.user.isAuthenticated()) {
entry.userName = ac.user.username;
entry.realName = ac.user.properties.real_name;
entry.location = ac.user.properties.location;
entry.affils = ac.user.properties.affiliation;
const diff = now.diff(moment(ac.user.properties.last_login_timestamp), 'minutes');
entry.timeOn = moment.duration(diff, 'minutes');
}
return entry;
});
}
function addNewClient(client, clientSock) {
var id = client.session.id = clientConnections.push(client) - 1;
// Create a client specific logger
// Note that this will be updated @ login with additional information
client.log = logger.log.child( { clientId : id } );
var connInfo = {
ip : clientSock.remoteAddress,
serverName : client.session.serverName,
isSecure : client.session.isSecure,
};
if(client.log.debug()) {
connInfo.port = clientSock.localPort;
connInfo.family = clientSock.localFamily;
}
client.log.info(connInfo, 'Client connected');
return id;
}
function removeClient(client) {
client.end();
var i = clientConnections.indexOf(client);
if(i > -1) {
clientConnections.splice(i, 1);
logger.log.info(
{
connectionCount : clientConnections.length,
clientId : client.session.id
},
'Client disconnected'
);
}
}
/* :TODO: make a public API elsewhere
function getActiveClientInformation() {
var info = {};
clientConnections.forEach(function connEntry(cc) {
});
return info;
}
*/