-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathannounce.js
67 lines (52 loc) · 1.78 KB
/
announce.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
var extend = require('cog/extend');
module.exports = function(signaller) {
function dataAllowed(data) {
var cloned = extend({ allow: true }, data);
signaller('peer:filter', data.id, cloned);
return cloned.allow;
}
return function(args, messageType, srcData, srcState, isDM) {
var data = args[0];
var peer;
// if we have valid data then process
if (data && data.id && data.id !== signaller.id) {
if (! dataAllowed(data)) {
return;
}
// check to see if this is a known peer
peer = signaller.peers.get(data.id);
// trigger the peer connected event to flag that we know about a
// peer connection. The peer has passed the "filter" check but may
// be announced / updated depending on previous connection status
signaller('peer:connected', data.id, data);
// if the peer is existing, then update the data
if (peer) {
// update the data
extend(peer.data, data);
// trigger the peer update event
return signaller('peer:update', data, srcData);
}
// create a new peer
peer = {
id: data.id,
// initialise the local role index
roleIdx: [data.id, signaller.id].sort().indexOf(data.id),
// initialise the peer data
data: {}
};
// initialise the peer data
extend(peer.data, data);
// set the peer data
signaller.peers.set(data.id, peer);
// if this is an initial announce message (no vector clock attached)
// then send a announce reply
if (signaller.autoreply && (! isDM)) {
signaller
.to(data.id)
.send('/announce', signaller.attributes);
}
// emit a new peer announce event
return signaller('peer:announce', data, peer);
}
};
};