ericz 12 tahun lalu
induk
melakukan
0dcf44ded3
1 mengubah file dengan 27 tambahan dan 6 penghapusan
  1. 27 6
      lib/server.js

+ 27 - 6
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. */