|
@@ -38,6 +38,9 @@ function PeerServer(options) {
|
|
// before a socket is opened for a Peer.
|
|
// before a socket is opened for a Peer.
|
|
this._initializeHTTP();
|
|
this._initializeHTTP();
|
|
|
|
|
|
|
|
+ // Mark concurrent users per ip
|
|
|
|
+ this._ips = {};
|
|
|
|
+
|
|
var self = this;
|
|
var self = this;
|
|
setInterval(function(){
|
|
setInterval(function(){
|
|
self._pruneOutstanding();
|
|
self._pruneOutstanding();
|
|
@@ -71,7 +74,8 @@ PeerServer.prototype._initializeWSS = function() {
|
|
if (!self._clients[key] || !self._clients[key][id]) {
|
|
if (!self._clients[key] || !self._clients[key][id]) {
|
|
self._checkKey(key, ip, function(err) {
|
|
self._checkKey(key, ip, function(err) {
|
|
if (!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' }));
|
|
socket.send(JSON.stringify({ type: 'OPEN' }));
|
|
self._configureWS(socket, key, id, token);
|
|
self._configureWS(socket, key, id, token);
|
|
} else {
|
|
} else {
|
|
@@ -154,16 +158,28 @@ PeerServer.prototype._configureWS = function(socket, key, id, token) {
|
|
|
|
|
|
|
|
|
|
PeerServer.prototype._checkKey = function(key, ip, cb) {
|
|
PeerServer.prototype._checkKey = function(key, ip, cb) {
|
|
- if (key == 'peerjs') {
|
|
|
|
|
|
+ if (key == this._options.key) {
|
|
if (!this._clients[key]) {
|
|
if (!this._clients[key]) {
|
|
this._clients[key] = {};
|
|
this._clients[key] = {};
|
|
}
|
|
}
|
|
if (!this._outstanding[key]) {
|
|
if (!this._outstanding[key]) {
|
|
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);
|
|
cb(null);
|
|
} else {
|
|
} else {
|
|
- cb('Bad key!');
|
|
|
|
|
|
+ cb('Invalid key provided');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -190,11 +206,13 @@ PeerServer.prototype._initializeHTTP = function() {
|
|
var id = req.params.id;
|
|
var id = req.params.id;
|
|
var token = req.params.token;
|
|
var token = req.params.token;
|
|
var key = req.params.key;
|
|
var key = req.params.key;
|
|
|
|
+ var ip = req.ip;
|
|
|
|
|
|
if (!self._clients[key] || !self._clients[key][id]) {
|
|
if (!self._clients[key] || !self._clients[key][id]) {
|
|
- self._checkKey(key, req.ip, function(err) {
|
|
|
|
|
|
+ self._checkKey(key, ip, function(err) {
|
|
if (!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);
|
|
self._startStreaming(res, key, id, token, true);
|
|
} else {
|
|
} else {
|
|
res.send({ type: 'ERROR', payload: { msg: err } });
|
|
res.send({ type: 'ERROR', payload: { msg: err } });
|
|
@@ -311,7 +329,10 @@ PeerServer.prototype._processOutstanding = function(key, id) {
|
|
};
|
|
};
|
|
|
|
|
|
PeerServer.prototype._removePeer = 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. */
|
|
/** Handles passing on a message. */
|