|
@@ -5,8 +5,6 @@ var EventEmitter = require('events').EventEmitter;
|
|
|
var WebSocketServer = require('ws').Server;
|
|
|
var url = require('url');
|
|
|
|
|
|
-
|
|
|
-
|
|
|
function PeerServer(options) {
|
|
|
if (!(this instanceof PeerServer)) return new PeerServer(options);
|
|
|
EventEmitter.call(this);
|
|
@@ -40,9 +38,11 @@ function PeerServer(options) {
|
|
|
|
|
|
// Mark concurrent users per ip
|
|
|
this._ips = {};
|
|
|
+
|
|
|
+ this._setCleanupIntervals();
|
|
|
|
|
|
var self = this;
|
|
|
- setInterval(function(){
|
|
|
+ setInterval(function() {
|
|
|
self._pruneOutstanding();
|
|
|
}, 5000);
|
|
|
};
|
|
@@ -76,7 +76,7 @@ PeerServer.prototype._initializeWSS = function() {
|
|
|
if (!err) {
|
|
|
if (!self._clients[key][id]) {
|
|
|
self._clients[key][id] = { token: token, ip: ip };
|
|
|
- self._ips[ip]++;
|
|
|
+ self._ips[ip]++;
|
|
|
socket.send(JSON.stringify({ type: 'OPEN' }));
|
|
|
}
|
|
|
self._configureWS(socket, key, id, token);
|
|
@@ -225,7 +225,7 @@ PeerServer.prototype._initializeHTTP = function() {
|
|
|
});
|
|
|
|
|
|
|
|
|
- var handle = function(req, res){
|
|
|
+ var handle = function(req, res) {
|
|
|
var key = req.params.key;
|
|
|
var id = req.params.id;
|
|
|
var client = self._clients[key][id];
|
|
@@ -279,7 +279,7 @@ PeerServer.prototype._startStreaming = function(res, key, id, token, open) {
|
|
|
|
|
|
if (token === client.token) {
|
|
|
// Client already exists
|
|
|
- res.on('close', function(){
|
|
|
+ res.on('close', function() {
|
|
|
if (client.res === res) {
|
|
|
if (!client.socket) {
|
|
|
// No new request yet, peer dead
|
|
@@ -299,13 +299,13 @@ PeerServer.prototype._startStreaming = function(res, key, id, token, open) {
|
|
|
|
|
|
PeerServer.prototype._pruneOutstanding = function() {
|
|
|
var keys = Object.keys(this._outstanding);
|
|
|
- for (var k = 0, kk = keys.length; k < kk; k++) {
|
|
|
+ for (var k = 0, kk = keys.length; k < kk; k += 1) {
|
|
|
var key = keys[k];
|
|
|
var dsts = Object.keys(this._outstanding[key]);
|
|
|
- for (var i = 0, ii = dsts.length; i < ii; i++) {
|
|
|
+ for (var i = 0, ii = dsts.length; i < ii; i += 1) {
|
|
|
var offers = this._outstanding[key][dsts[i]];
|
|
|
var seen = {};
|
|
|
- for (var j = 0, jj = offers.length; j < jj; j++) {
|
|
|
+ for (var j = 0, jj = offers.length; j < jj; j += 1) {
|
|
|
var message = offers[j];
|
|
|
if (!seen[message.src]) {
|
|
|
this._handleTransmission(key, { type: 'EXPIRE', src: message.dst, dst: message.src });
|
|
@@ -315,7 +315,22 @@ PeerServer.prototype._pruneOutstanding = function() {
|
|
|
}
|
|
|
this._outstanding[key] = {};
|
|
|
}
|
|
|
-}
|
|
|
+};
|
|
|
+
|
|
|
+/** Cleanup every 10 mins. */
|
|
|
+PeerServer.prototype._setCleanupIntervals = function() {
|
|
|
+ var self = this;
|
|
|
+ setInterval(function() {
|
|
|
+ // Cleanup ips.
|
|
|
+ var keys = Object.keys(self._ips);
|
|
|
+ for (var i = 0, ii = keys.length; i < ii; i += 1) {
|
|
|
+ var key = keys[i];
|
|
|
+ if (self._ips[key] == 0) {
|
|
|
+ delete self._ips[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 600000);
|
|
|
+};
|
|
|
|
|
|
/** Process outstanding peer offers. */
|
|
|
PeerServer.prototype._processOutstanding = function(key, id) {
|