|
|
@@ -0,0 +1,249 @@ |
|
|
var express = require('express'); |
|
|
var redis = require('redis'); |
|
|
|
|
|
const serverType = process.argv[2]; |
|
|
const serverHost = process.argv[3]; |
|
|
const serverPort = parseInt(process.argv[4]); |
|
|
|
|
|
const redisPort = 6379; |
|
|
const redisHost = '127.0.0.1'; |
|
|
|
|
|
var rclient = new redis.createClient(redisPort, redisHost); |
|
|
|
|
|
function writeUserMessageHost(userId, host){ |
|
|
rclient.set('MUPH:'+userId, host); |
|
|
} |
|
|
|
|
|
function deleteUserMessageHost(userId){ |
|
|
rclient.delete('MUPH:'+userId); |
|
|
} |
|
|
|
|
|
function writeChannelMessageHost(channel, host){ |
|
|
rclient.sadd('MCMH:'+channel, host); |
|
|
} |
|
|
|
|
|
function ListenerContainer(){ |
|
|
this.listeners = {}; |
|
|
this.listenersCount = 0; |
|
|
}; |
|
|
|
|
|
ListenerContainer.prototype.addClient = function(client){ |
|
|
this.listeners[client.listenerId] = client; |
|
|
this.listenersCount += 1; |
|
|
writeUserMessageHost(client.listenerId, serverHost+':'+serverPort); |
|
|
}; |
|
|
|
|
|
ListenerContainer.prototype.removeClient = function(client){ |
|
|
delete this.listeners[client.listenerId]; |
|
|
this.listenersCount -= 1; |
|
|
deleteUserMessageHost(client.listenerId, serverHost+':'+serverPort); |
|
|
}; |
|
|
|
|
|
ListenerContainer.prototype.getClients = function(listenerId){ |
|
|
var client = this.listeners[listenerId]; |
|
|
if (client != null){ |
|
|
return {listenerId: client}; |
|
|
}else{ |
|
|
return {}; |
|
|
}; |
|
|
}; |
|
|
|
|
|
ListenerContainer.prototype.count = function(listenerId){ |
|
|
return this.listenersCount; |
|
|
1,17 Top |
|
|
ListenerContainer.prototype.clientsCount = function(){ |
|
|
// find first listener |
|
|
var firstListener = null; |
|
|
for (listenerId in this.listeners){ |
|
|
var firstListener = this.listeners[listenerId].listener; |
|
|
break; |
|
|
}; |
|
|
var listenerCount = 0; |
|
|
if (firstListener){ |
|
|
for(client in firstListener.clients){ |
|
|
listenerCount += 1; |
|
|
}; |
|
|
}; |
|
|
return listenerCount; |
|
|
}; |
|
|
|
|
|
function MultiListenerContainer() { |
|
|
this.listeners = {}; |
|
|
this.listenersCount = {'__total': 0}; |
|
|
}; |
|
|
|
|
|
MultiListenerContainer.prototype.addClient = function(client){ |
|
|
// console.log('add client to channel:', client.listenerId, client.sessionId); |
|
|
if (client.listenerId in this.listeners){ |
|
|
if(!(client.sessionId in this.listeners[client.listenerId])){ |
|
|
this.listeners[client.listenerId][client.sessionId] = client; |
|
|
this.listenersCount[client.listenerId] += 1; |
|
|
this.listenersCount['__total'] += 1; |
|
|
}; |
|
|
|
|
|
}else{ |
|
|
this.listeners[client.listenerId] = {}; |
|
|
this.listeners[client.listenerId][client.sessionId] = client; |
|
|
this.listenersCount[client.listenerId] = 1; |
|
|
this.listenersCount['__total'] += 1; |
|
|
// console.log('init client', client.sessionId); |
|
|
}; |
|
|
writeChannelMessageHost(client.listenerId, serverHost+':'+serverPort); |
|
|
}; |
|
|
|
|
|
MultiListenerContainer.prototype.removeClient = function(client){ |
|
|
if (client.listenerId in this.listeners){ |
|
|
if (client.sessionId in this.listeners[client.listenerId]){ |
|
|
delete this.listeners[client.listenerId][client.sessionId]; |
|
|
this.listenersCount[client.listenerId] -= 1; |
|
|
this.listenersCount['__total'] -= 1; |
|
|
} |
|
|
} |
|
|
}; |
|
|
MultiListenerContainer.prototype.getClients = function(listenerId){ |
|
|
if (listenerId in this.listeners){ |
|
|
var clients = this.listeners[listenerId]; |
|
|
if (clients){ |
|
|
return clients; |
|
|
}else{ |
|
|
return {} |
|
|
}; |
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
MultiListenerContainer.prototype.count = function(listenerId){ |
|
|
if (listenerId){ |
|
|
if (listenerId in this.listenersCount){ |
|
|
return this.listenersCount[listenerId]; |
|
|
}else{ |
|
|
return 0; |
|
|
} |
|
|
}else{ |
|
|
return this.listenersCount; |
|
|
}; |
|
|
}; |
|
|
|
|
|
MultiListenerContainer.prototype.clientsCount = function(){ |
|
|
// find first listener |
|
|
var firstListener = null; |
|
|
for (listenerId in this.listeners){ |
|
|
for (sessionId in this.listeners[listenerId]){ |
|
|
var firstListener = this.listeners[listenerId][sessionId].listener; |
|
|
break; |
|
|
}; |
|
|
}; |
|
|
var listenerCount = 0; |
|
|
if (firstListener){ |
|
|
for(client in firstListener.clients){ |
|
|
listenerCount += 1; |
|
|
}; |
|
|
}; |
|
|
return listenerCount; |
|
|
}; |
|
|
|
|
|
var userContainer = new ListenerContainer(); |
|
|
var channelContainer = new MultiListenerContainer(); |
|
|
|
|
|
var server = module.exports = express.createServer(); |
|
|
server.get('/post/:msg_target/:msg_target_id/:msg', function(req, res){ |
|
|
var sentCounter = 0; |
|
|
if (req.params.msg_target == 'channel'){ |
|
|
var container = channelContainer; |
|
|
}else if(req.params.msg_target == 'user') |
|
|
{ |
|
|
var container = userContainer; |
|
|
} |
|
|
var clients = container.getClients(req.params.msg_target_id); |
|
|
for(listenerId in clients){ |
|
|
var client = clients[listenerId]; |
|
|
var msgBuf = new Buffer(req.params.msg, 'base64'); |
|
|
var msgStr = msgBuf.toString('utf-8'); |
|
|
client.send(msgStr); |
|
|
sentCounter += 1; |
|
|
} |
|
|
res.send(''+sentCounter); |
|
|
}); |
|
|
|
|
|
server.get('/stats/count', function(req, res){ |
|
|
var result = {}; |
|
|
result['user'] = userContainer.count(); |
|
|
result['channel'] = channelContainer.count(); |
|
|
result['user_clients'] = userContainer.clientsCount(); |
|
|
result['channel_clients'] = channelContainer.clientsCount(); |
|
|
res.send(JSON.stringify(result)); |
|
|
}); |
|
|
server.get('/debug/check/session/:session_id', function(req, res){ |
|
|
var found = 'not found'; |
|
|
for(userId in userContainer.listeners){ |
|
|
var client = userContainer.listeners[userId]; |
|
|
if (client.sessionId == req.params.session_id){ |
|
|
found = 'found in user: '+userId; |
|
|
} |
|
|
}; |
|
|
for(channel in channelContainer.listeners){ |
|
|
for(sessionId in channelContainer.listeners[channel]){ |
|
|
if(sessionId == req.params.session_id){ |
|
|
found = 'found in channel: '+channel; |
|
|
} |
|
|
} |
|
|
} |
|
|
res.send(found); |
|
|
}); |
|
|
|
|
|
function getRequestExtra(url){ |
|
|
return url.split('/')[2]; |
|
|
}; |
|
|
|
|
|
|
|
|
const io = require('socket.io'); |
|
|
|
|
|
function serveChannelMessage(){ |
|
|
console.log('starting channel server...'); |
|
|
const socket = io.listen(server, {'resource': 'channelmsg', |
|
|
'flashPolicyServer': false, |
|
|
'transports': ['flashsocket']}); |
|
|
|
|
|
socket.on('connection', function(client){ |
|
|
// console.dir(channelContainer); |
|
|
var extra = getRequestExtra(client.request.url); |
|
|
|
|
|
var extraParts = extra.split('_'); |
|
|
client.listenerId = extraParts[0]; |
|
|
var onlineToken = extraParts[1]; |
|
|
channelContainer.addClient(client); |
|
|
|
|
|
client.on('message', function(msg){ |
|
|
}); |
|
|
|
|
|
client.on('disconnect', function(){ |
|
|
channelContainer.removeClient(this); |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
function serveUserMessage(){ |
|
|
const socket = io.listen(server, {'resource': 'usermsg', |
|
|
'flashPolicyServer': false, |
|
|
'transports': ['flashsocket']}); |
|
|
|
|
|
socket.on('connection', function(client){ |
|
|
client.listenerId = getRequestExtra(client.request.url); |
|
|
userContainer.addClient(client); |
|
|
|
|
|
client.on('message', function(msg){ |
|
|
}); |
|
|
|
|
|
client.on('disconnect', function(){ |
|
|
userContainer.removeClient(this); |
|
|
}); |
|
|
}); |
|
|
|
|
|
}; |
|
|
|
|
|
if(serverType == 'user'){ |
|
|
serveUserMessage(); |
|
|
}else if(serverType == 'channel'){ |
|
|
serveChannelMessage(); |
|
|
} |
|
|
|
|
|
server.listen(serverPort, serverHost); |