-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathremote.js
101 lines (82 loc) · 1.9 KB
/
remote.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
var socketio = require('socket.io');
var io;
var decks = {};
var util = {
url: require('url'),
crypto: require('crypto')
};
var max_inactive_time = 1800000; // half-hour
module.exports = remote;
function remote (server) {
// set up the socket
io = socketio(server);
io.on('connection', function(client){
client.on('join', function(data){
var id = getIdFromUrl(data.url),
deck = decks[id];
if (!deck) {
decks[id] = deck = defaultDeckState(id);
}
deck.timestamp = Date.now();
if (data.is_master) {
setupMaster(client, deck);
}
else {
setupViewer(client, deck);
}
});
});
setInterval(function(){
clearInactiveSessions();
}, max_inactive_time);
return io;
}
function setupMaster(client, deck) {
client.on('master', function(data){
if (verifyKey(data.key, data.input)) {
client.emit('master', true);
deck.has_master = true;
io.to(deck.id).emit('notify', { master: true });
client.on('change', function(data){
deck.current = data.current;
deck.timestamp = Date.now();
io.to(deck.id).emit('slide', deck.current);
});
client.on('disconnect', function(){
deck.has_master = false;
io.to(deck.id).emit('notify', { master: false });
});
}
else {
client.emit('master', false);
}
});
}
function setupViewer(client, deck) {
if (deck.has_master) {
client.emit('notify', {master: true, current: deck.current});
}
client.join(deck.id);
}
function getIdFromUrl(url) {
var parsed = util.url.parse(url);
return parsed.hostname + parsed.pathname;
}
function defaultDeckState(id) {
return {
id: id,
current: 0,
has_master: false
};
}
function verifyKey(key, input) {
return (key == util.crypto.createHash('md5').update(input).digest('hex'));
}
function clearInactiveSessions() {
var now = Date.now();
for (var key in decks) {
if (now - decks[key].timestamp > max_inactive_time) {
delete decks[key];
}
}
}