-
Notifications
You must be signed in to change notification settings - Fork 8
/
socket.js
96 lines (86 loc) · 3.27 KB
/
socket.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
var io = mustekala.io = require('socket.io').listen(app);
io.configure('development', function(){
io.set('transports', ['websocket']);
});
io.configure('production', function(){
// TODO: Fix this (non-responsive mustekala.js)
// io.enable('browser client minification');
// io.enable('browser client etag');
io.set('log level', 1);
if(!mustekala.config.socketIO || !mustekala.config.socketIO.transports) {
io.set('transports', ['websocket','flashsocket','htmlfile','xhr-polling','jsonp-polling']);
}
});
// Configure with user params
if(mustekala.config.socketIO) {
for(var name in mustekala.config.socketIO)
io.set(name, mustekala.config.socketIO[name]);
}
// Mustekala won't support gzip yet
io.disable('browser client gzip');
// Sockets
var socket = mustekala.socket = io.of('/mustekala');
socket.on('connection', function(client) {
mustekala.addClient(client.id);
client.on('subscribe', function(channelName,authKey) {
if(channelName) {
// Checks
var auth;
var authMatch=new RegExp(/^(presence|private)@(.+)$/).exec(channelName);
var channelType=authMatch?authMatch[1]:'public';
if(channelType!='public') {
// validate authKey
auth=mustekala.authKeys[authKey];
// console.log('checking auth key:',auth);
if(!auth||auth.channel!=channelName||!auth.user) {
// invalid authentication
// TODO: emit('error', 'Bad authentication')....
return;
}
}
// Create channel
mustekala.addChannel(channelName, channelType);
// Check if client already subscribed channel
if(!mustekala.addClientToChannel(client.id, channelName)) {
// TODO: emit('error', 'Already joined channel')....
return;
}
// Do presence channel jobs
if(channelType=="presence") {
// console.log('presence.memberJoin', channelName, auth.user)
mustekala.addUser(auth.user.id, auth.user.data);
mustekala.addUserToClient(auth.user.id, client.id);
if(mustekala.addUserToChannel(auth.user.id, channelName)) {
socket.to(channelName).emit('presence.memberJoin', channelName, mustekala.getUser(auth.user.id));
// Remember: must tell others about 'memberJoined' before actually adding member to channel to avoid possible duplicates on client side.
}
var channelMembers=mustekala.getChannelUsers(channelName);
var selfMember=mustekala.getClientUser(client.id);
client.emit('presence.memberList', channelName, channelMembers, selfMember);
// Remember: 'memberList' must be sent before 'subscribe' event
}
// Subscribe client
client.join(channelName);
client.emit('subscribe', channelName);
}
});
client.on('trigger', function(password, channel, action, data) {
// console.log('***trigger.data:',data)
var result=mustekala.trigger(password, channel, action, data)
});
client.on('disconnect',function() {
var user=mustekala.getClientUser(client.id);
mustekala.eachClientChannel(client.id, function(channelName, channel) {
if(channel.type=="presence") {
if(user) {
if(mustekala.removeUserFromChannel(user.id, channelName)) {
socket.to(channelName).emit('presence.memberLeave', channelName, user);
}
}
}
mustekala.removeClientFromChannel(client.id, channelName);
});
if(user) mustekala.removeUserFromClient(user.id, client.id);
mustekala.removeClient(client.id);
});
});