From 0dcf44ded33d32a484fc4227c1efc21ccd33fbda Mon Sep 17 00:00:00 2001 From: ericz Date: Wed, 13 Feb 2013 00:28:39 -0800 Subject: [PATCH] working --- lib/server.js | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/server.js b/lib/server.js index 023f912..f0f5621 100644 --- a/lib/server.js +++ b/lib/server.js @@ -38,6 +38,9 @@ function PeerServer(options) { // before a socket is opened for a Peer. this._initializeHTTP(); + // Mark concurrent users per ip + this._ips = {}; + var self = this; setInterval(function(){ self._pruneOutstanding(); @@ -71,7 +74,8 @@ PeerServer.prototype._initializeWSS = function() { if (!self._clients[key] || !self._clients[key][id]) { self._checkKey(key, ip, function(err) { if (!err) { - self._clients[key][id] = { token: token }; + self._clients[key][id] = { token: token, ip: ip }; + self._ips[ip]++; socket.send(JSON.stringify({ type: 'OPEN' })); self._configureWS(socket, key, id, token); } else { @@ -154,16 +158,28 @@ PeerServer.prototype._configureWS = function(socket, key, id, token) { PeerServer.prototype._checkKey = function(key, ip, cb) { - if (key == 'peerjs') { + if (key == this._options.key) { if (!this._clients[key]) { this._clients[key] = {}; } if (!this._outstanding[key]) { this._outstanding[key] = {}; } + if (!this._ips[ip]) { + this._ips[ip] = 0; + } + // Check concurrent limit + if (Object.keys(this._clients[key]).length >= this._options.concurrent_limit) { + cb('Server has reached its concurrent user limit'); + return; + } + if (this._ips[ip] >= this._options.ip_limit) { + cb(ip + ' has reached its concurrent user limit'); + return; + } cb(null); } else { - cb('Bad key!'); + cb('Invalid key provided'); } } @@ -190,11 +206,13 @@ PeerServer.prototype._initializeHTTP = function() { var id = req.params.id; var token = req.params.token; var key = req.params.key; + var ip = req.ip; if (!self._clients[key] || !self._clients[key][id]) { - self._checkKey(key, req.ip, function(err) { + self._checkKey(key, ip, function(err) { if (!err) { - self._clients[key][id] = { token: token }; + self._clients[key][id] = { token: token, ip: ip }; + self._ips[ip]++; self._startStreaming(res, key, id, token, true); } else { res.send({ type: 'ERROR', payload: { msg: err } }); @@ -311,7 +329,10 @@ PeerServer.prototype._processOutstanding = function(key, id) { }; PeerServer.prototype._removePeer = function(key, id) { - delete this._clients[key][id]; + if (this._clients[key][id]) { + this._ips[this._clients[key][id].ip]--; + delete this._clients[key][id]; + } }; /** Handles passing on a message. */