-
Notifications
You must be signed in to change notification settings - Fork 0
/
messager.js
121 lines (105 loc) · 3.56 KB
/
messager.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
114
115
116
117
118
119
120
121
(function(){
var events = require('events');
var sys = require('sys');
var initialStatus = 40;
sys.inherits(Messager, events.EventEmitter);
function Messager(socketio, cookiename){
var tickmessageuid = 0;
var tickList = {};
var staleSessions = {};
var activeSessions = {};
var cookieRegExp = new RegExp(cookiename + '=([^;]+)');
events.EventEmitter.call(this);
var io = socketio;
var that = this;
this.doPersonalMessage = function(client, command, value){
console.log('sending: ' + command);
client.send(JSON.stringify([{
'type': 'personal'
,'command': command
,'value': value
}]));
}
this.appendPublicMessage = function(command, value){
this.replacePublicMessage('append_' + (tickmessageuid++) , command, value)
}
this.replacePublicMessage = function(key, command, value){
tickList[key] = {
'timestamp': Date.now()
,'type': 'public'
,'command': command
,'value': value
};
}
io.on('connection', function(client){
var match = client.request.headers.cookie.match(cookieRegExp);
if(match){
console.log('Client ('+match[1]+') Connected. With a socket.io client id of: ' + client.sessionId);
if(staleSessions.hasOwnProperty(match[1])){
//this is a stale user reconnecting so lets revive them before they die
var thesession = staleSessions[match[1]];
delete staleSessions[match[1]];
thesession['status'] = initialStatus;
activeSessions[match[1]] = thesession;
that.emit('user-reconnect', thesession, client);
}
else{
//new user
var thesession = activeSessions[match[1]] = {
'status': initialStatus
,'id': match[1]
}
that.emit('new-user', thesession, client);
}
client.on('disconnect', function(){
delete activeSessions[thesession.id];
staleSessions[thesession.id] = thesession;
that.emit('user-disconnect', thesession, client);
});
client.on('message', function(message){
message = JSON.parse(message);
if(message.hasOwnProperty('cmd')){
that.emit(message['cmd'], (new Date()).getTime(), message, tickList, client, thesession);
}
});
}
else{
//this should not be happening, so lets act like it didnt
console.log('Error: Recieved a socketIO connection, but the user has no cookie.');
}
});
//Kick off the ticker:
setInterval(function(){
messageTick();
sessionTick();
}, 300);
function messageTick(){
tickmessageuid = 0;
//sort the tickList by timestamp
var tosort = Array();
for(key in tickList){
if(tickList[key].hasOwnProperty('timestamp')){
tosort.push(tickList[key]);
}
}
if (tosort.length > 0) {
tosort = tosort.sort(function(a,b){ return (b['timestamp']<a['timestamp']);});
//send out the messages for this tick
io.broadcast(JSON.stringify(tosort));
console.log('sending: ' + sys.inspect(tosort));
}
//reset the ticklist for the next round
tickList = {};
}
function sessionTick(){
for(key in staleSessions){
var s = staleSessions[key];
if(s['status']-- == 0){
delete staleSessions[key];
that.emit('destroy-user', s);
}
}
}
};
exports.Messager = Messager;
})();