Skip to content

Commit

Permalink
refactored signaling server to have multiple resources per single peer
Browse files Browse the repository at this point in the history
  • Loading branch information
arunoda committed Apr 7, 2013
1 parent ab43d90 commit 7dd3930
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 220 deletions.
2 changes: 1 addition & 1 deletion core
145 changes: 71 additions & 74 deletions lib/handlers/connection.js
Original file line number Diff line number Diff line change
@@ -1,83 +1,80 @@
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var logger = require('winstoon')('/lib/handlers/connection');
var metrics = require('../metrics');
var metrics = require('../metrics');

function ConnectionHandler(serverId, clients) {

var count = 0;

this.on('client', function(client) {

var name;
client.once('init', function(initInfo) {
name = initInfo.peerId;
clients[name] = client;
count++;

var connectingTime = Date.now() - initInfo.timestamp;
console.log('======================', connectingTime, initInfo);
metrics.trackMean('conn-time', connectingTime);
});

client.once('disconnect', function(name) {

logger.info('disconnecting client:', name);

client.removeListener('offer', onOffer);
client.removeListener('answer', onAnswer);
client.removeListener('ice-candidate', onIceCandidate);
clients[name] = null;
count--;
});

client.on('offer', onOffer);
client.on('answer', onAnswer);
client.on('ice-candidate', onIceCandidate);

function onOffer(to, desc) {

logger.info('offer request', {from: name, to: to});
var toClient = clients[to];
if(toClient) {
toClient.emit('offer', name, desc);
} else {
logger.warn('no such client to send offer', {from: name, to: to});
client.emit('error', 'offer', {code: 'NO_CLIENT', to: to});
}
}

function onAnswer(to, status, desc) {

logger.info('answer request', {from: name, to: to});
var toClient = clients[to];
if(toClient) {
toClient.emit('answer', name, status, desc);
} else {
logger.warn('no such client to send answer', {from: name, to: to});
client.emit('error', 'answer', {code: 'NO_CLIENT', to: to});
}
}

function onIceCandidate(to, candidate) {

logger.debug('receiving ice-candidate request', {from: name, to: to});
var toClient = clients[to];
if(toClient) {
toClient.emit('ice-candidate', name, candidate);
} else {
logger.warn('no such client to send ice-candidate', {from: name, to: to});
client.emit('error', 'ice-candidate', {code: 'NO_CLIENT', to: to});
}
}

});

//adding metric for peer/connection count
metrics.trackAtSend('peers', function() {
return count;
});
}
var count = 0;

this.on('client', function(client) {

var name;
client.once('init', function(_name) {

name = _name;
clients[name] = client;
count++;
});

client.once('disconnect', function() {

logger.info('disconnecting client:', name);

client.removeListener('offer', onOffer);
client.removeListener('answer', onAnswer);
client.removeListener('ice-candidate', onIceCandidate);
clients[name] = null;
count--;
});

client.on('offer', onOffer);
client.on('answer', onAnswer);
client.on('ice-candidate', onIceCandidate);

function onOffer(resource, to, desc) {

logger.info('offer request', {from: name, to: to, resource: resource});
var toClient = clients[to];
if(toClient) {
toClient.emit('offer-' + resource, name, desc);
} else {
logger.warn('no such client to send offer', {from: name, to: to, resource: resource});
client.emit('error-' + resource, 'offer', {code: 'NO_CLIENT', to: to, resource: resource});
}
}

function onAnswer(resource, to, status, desc) {

logger.info('answer request', {from: name, to: to, resource: resource});
var toClient = clients[to];
if(toClient) {
toClient.emit('answer-' + resource, name, status, desc);
} else {
logger.warn('no such client to send answer', {from: name, to: to, resource: resource});
client.emit('error-' + resource, 'answer', {code: 'NO_CLIENT', to: to, resource: resource});
}
}

function onIceCandidate(resource, to, candidate) {

logger.debug('receiving ice-candidate request', {from: name, to: to, resource: resource});
var toClient = clients[to];
if(toClient) {
toClient.emit('ice-candidate-' + resource, name, candidate);
} else {
logger.warn('no such client to send ice-candidate', {from: name, to: to, resource: resource});
client.emit('error-' + resource, 'ice-candidate', {code: 'NO_CLIENT', to: to, resource: resource});
}
}

});

//adding metric for peer/connection count
metrics.trackAtSend('peers', function() {
return count;
});
}

util.inherits(ConnectionHandler, EventEmitter);

Expand Down
123 changes: 61 additions & 62 deletions lib/handlers/directory.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var logger = require('winstoon')('/lib/handlers/directory');
var metrics = require('../metrics');

function DirectoryHandler(serverId, clients, model) {

Expand All @@ -16,34 +17,60 @@ function DirectoryHandler(serverId, clients, model) {

var name;
client.once('init', onInit);
client.once('init-resource', onInitResource);
client.on('add-peer', onAddPeer);
client.on('update-fields', onUpdateFields);
client.on('remove-peer', onRemovePeer);
client.on('add-resource', onAddResource);
client.on('remove-resource', onRemoveResource);
client.on('request-peers', onRequestPeers);
client.once('disconnect', onDisconnect);

function onInit(initInfo) {
function onInit(_name, loginToken) {

name = _name;
logger.info('initializing client', { client: name });
}

/*
name - name/id of the peer.
This is the same as defined in `init` event.
But used here because, when reconnecting global `name` variable migth be null
*/
function onInitResource(name, resource, initInfo) {

logger.info('initializing client', initInfo);
logger.info('initializing resource', { client: name, resource: resource, initInfo: initInfo});

initInfo = initInfo || {};
var totalInterested = initInfo.totalInterested || 5;
var existingPeerList = initInfo.connectedPeers || [];
var interestedResources = initInfo.resourcesInterested || [];

name = initInfo.peerId;
model.save(name, {
model.save(name, resource, {
online: true,
serverId: serverId,
totalInterested: totalInterested,
stillNeeded: totalInterested - existingPeerList.length,
peers: existingPeerList,
resources: interestedResources
peers: existingPeerList
}, afterPeerSaved);

//add conn-time metrics
var connTime = Date.now() - initInfo.timestamp;
metrics.trackMean('conn-time', connTime);

function afterPeerSaved(err) {

if(err) {
logger.error('error when saving clients', {client: name, error: err.message});
} else {
var client = clients[name];
if(client) {
client.emit('init-success-' + resource);
} else {
logger.warn('clients not found to send peers', {client: name});
}
}
}
}

function onUpdateFields(fields) {
function onUpdateFields(resource, fields) {

var selectedFields = [];
for(var key in fields) {
Expand All @@ -52,38 +79,41 @@ function DirectoryHandler(serverId, clients, model) {
}
}

logger.info('updating filelds', {client: name, fields: fields});
model.save(name, selectedFields, onModelError('onUpdateFields'));
logger.info('updating filelds', {client: name, resource: resource, fields: fields});
model.save(name, resource, selectedFields, onModelError('onUpdateFields'));
}

function onAddPeer(peerId) {
function onAddPeer(resource, peerId) {

logger.info('adding peer', {client: name, peer: peerId});
model.addPeer(name, peerId, onModelError('onAddPeer'));
logger.info('adding peer', {client: name, resource: resource, peer: peerId});
model.addPeer(name, resource, peerId, onModelError('onAddPeer'));
}

function onRemovePeer(peerId) {
function onRemovePeer(resource, peerId) {

logger.info('removing peer', {client: name, peer: peerId});
model.removePeer(name, peerId, onModelError('onRemovePeer'));
}

function onAddResource(resource) {

logger.info('adding resource', {client: name, resource: resource});
model.addResource(name, resource, onModelError('onAddResource'));
}

function onRemoveResource(resource) {

logger.info('removing resource', {client: name, resource: resource});
model.removeResource(name, resource, onModelError('onRemoveResource'));
logger.info('removing peer', {client: name, resource: resource, peer: peerId});
model.removePeer(name, resource, peerId, onModelError('onRemovePeer'));
}

function onRequestPeers(resource, count) {

logger.info('requesting peers', {client: name, resource: resource});
model.findPeersFor(name, resource, serverId, count, afterPeersFound);

function afterPeersFound(err, peers) {

if(err) {
logger.error('error when finding peers', {client: name, error: err.message});
} else {
var client = clients[name];
if(client) {
logger.info('peers found', {client: name, peers: peers})
client.emit('peers-found-' + resource, peers);
} else {
logger.warn('clients not found to send peers', {client: name});
}
}
}
}

function onDisconnect() {
Expand All @@ -92,43 +122,12 @@ function DirectoryHandler(serverId, clients, model) {

client.removeListener('add-peer', onAddPeer);
client.removeListener('remove-peer', onRemovePeer);
client.removeListener('add-resource', onAddResource);
client.removeListener('remove-resource', onRemoveResource);
client.removeListener('request-peers', onRequestPeers);
client.removeListener('update-fields', onUpdateFields);

model.save(name, {online: false}, onModelError('onDisconnect'))
}

function afterPeersFound(err, peers) {

if(err) {
logger.error('error when finding peers', {client: name, error: err.message});
} else {
var client = clients[name];
if(client) {
logger.info('peers found', {client: name, peers: peers})
client.emit('peers-found', peers);
} else {
logger.warn('clients not found to send peers', {client: name});
}
}
model.save(name, null, {online: false}, onModelError('onDisconnect'))
}


function afterPeerSaved(err) {

if(err) {
logger.error('error when saving clients', {client: name, error: err.message});
} else {
var client = clients[name];
if(client) {
client.emit('init-success');
} else {
logger.warn('clients not found to send peers', {client: name});
}
}
}
});

function onModelError(type) {
Expand Down
6 changes: 3 additions & 3 deletions lib/handlers/resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ function ResourceHandler(serverId, clients, resourceModel, accessModel) {
var name;
var accessToken;

client.once('init', function(initInfo) {
client.once('init', function(n, token) {

name = initInfo.peerId;
loginToken = initInfo.loginToken;
name = n;
loginToken = token;

if(loginToken) {
checkLogin(loginToken, function(err, _accessToken) {
Expand Down
Loading

0 comments on commit 7dd3930

Please sign in to comment.