Comparing version 0.6.5 to 0.6.6
@@ -11,2 +11,9 @@ Contributing | ||
Reporting Issues | ||
---------------- | ||
When submitting an issue, please take care to follow the | ||
`ISSUE_TEMPLATE.md` and include as much information as possible. Bonus points | ||
for a corresponding pull request that fixes the issue. | ||
Style & Conventions | ||
@@ -13,0 +20,0 @@ ------------------- |
@@ -6,3 +6,2 @@ 'use strict'; | ||
var assert = require('assert'); | ||
var Transport = require('../network/transport'); | ||
var Manager = require('../manager'); | ||
@@ -19,3 +18,3 @@ var events = require('events'); | ||
* @param {Object} options | ||
* @param {Transport} options.transport - Transport adapter from {@link Network} | ||
* @param {http.Server} options.server - A http(s).Server instance | ||
* @param {Manager} options.manager - The Manager from {@link Network} | ||
@@ -33,7 +32,7 @@ * @param {kad.Logger} options.logger - Logger to use from {@link Network} | ||
this._transport = options.transport; | ||
this._server = options.server; | ||
this._manager = options.manager; | ||
this._log = options.logger; | ||
this._ttl = options.ttl || ms('2m'); | ||
this._server = new ws.Server({ server: this._transport._server }); | ||
this._server = new ws.Server({ server: this._server }); | ||
this._allowed = {}; | ||
@@ -66,9 +65,11 @@ | ||
if (this._allowed[token]) { | ||
if (this._allowed[token].client) { | ||
if (this._allowed[token] && this._allowed[token].client) { | ||
var client = this._allowed[token].client; | ||
if ([ws.CONNECTING, ws.OPEN].indexOf(client.readyState) !== -1) { | ||
this._allowed[token].client.close(); | ||
} | ||
} | ||
delete this._allowed[token]; | ||
} | ||
delete this._allowed[token]; | ||
}; | ||
@@ -89,3 +90,2 @@ | ||
assert.ok(options, 'No options were supplied to constructor'); | ||
assert(options.transport instanceof Transport, 'Invalid transport adapter'); | ||
assert(options.manager instanceof Manager, 'Invalid manager supplied'); | ||
@@ -113,6 +113,2 @@ assert.ok(options.logger, 'Invalid logger supplied'); | ||
socket.on('message', function(data) { | ||
if (self._allowed[token] && self._allowed[token].client !== null) { | ||
return; | ||
} | ||
try { | ||
@@ -183,3 +179,3 @@ data = JSON.parse(data); | ||
if (err) { | ||
socket.send(JSON.stringify({ code: 500, message: err.message })); | ||
socket.close(500, err.message ); | ||
return self.reject(token); | ||
@@ -214,6 +210,3 @@ } | ||
if (utils.rmd160(hasher.digest('hex')) !== hash) { | ||
socket.send(JSON.stringify({ | ||
code: 400, | ||
message: 'Calculated hash does not match the expected result' | ||
})); | ||
socket.close(400, 'Calculated hash does not match the expected result'); | ||
return self.reject(token); | ||
@@ -245,3 +238,3 @@ } | ||
if (err) { | ||
socket.send(JSON.stringify({ code: 500, message: err.message })); | ||
socket.close(500, err.message); | ||
return self.reject(token); | ||
@@ -276,6 +269,3 @@ } | ||
client.send({ | ||
code: 400, | ||
message: 'Failed to handle the defined operation' | ||
}); | ||
client.close(400, 'Failed to handle the defined operation'); | ||
@@ -282,0 +272,0 @@ this.reject(token); |
@@ -33,6 +33,2 @@ 'use strict'; | ||
Network.call(this, options); | ||
this._transport.on( | ||
'ready', | ||
this._listenForContracts.bind(this, options.opcodes) | ||
); | ||
} | ||
@@ -52,2 +48,20 @@ | ||
/** | ||
* Wraps the super call to {@link Network#join} to listen for contract after | ||
* successfully establishing a connection to the network | ||
* @param {Function} callback - Called on successful join | ||
*/ | ||
FarmerInterface.prototype.join = function(callback) { | ||
var self = this; | ||
Network.prototype.join.call(this, function(err) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
self._listenForContracts(self._options.opcodes); | ||
callback(); | ||
}); | ||
}; | ||
/** | ||
* Handles a received contract and negotiates storage | ||
@@ -57,3 +71,3 @@ * @private | ||
*/ | ||
Network.prototype._negotiateContract = function(contract) { | ||
FarmerInterface.prototype._negotiateContract = function(contract) { | ||
var self = this; | ||
@@ -60,0 +74,0 @@ |
@@ -96,3 +96,3 @@ 'use strict'; | ||
)); | ||
this._node = new kad.Node({ | ||
@@ -115,9 +115,8 @@ transport: this._transport, | ||
}, function() { | ||
self._listenForTunnelers(); | ||
if (self._transport._isPublic) { | ||
return callback(null, self); | ||
self._listenForTunnelers(); | ||
callback(null, self); | ||
} else { | ||
self._setupTunnelClient(callback); | ||
} | ||
self._setupTunnelClient(callback); | ||
}); | ||
@@ -169,3 +168,3 @@ }; | ||
return new kad.contacts.AddressPortContact({ | ||
return new Contact({ | ||
address: parsed.hostname, | ||
@@ -212,3 +211,3 @@ port: Number(parsed.port), | ||
this._channel = new DataChannelServer({ | ||
transport: this._transport, | ||
server: this._transport._server, | ||
manager: this._manager, | ||
@@ -406,2 +405,3 @@ logger: this._logger | ||
); | ||
self._listenForTunnelers(); | ||
callback(null); | ||
@@ -507,2 +507,3 @@ }); | ||
self._listenForTunnelers(); | ||
callback(); | ||
@@ -509,0 +510,0 @@ }); |
@@ -83,10 +83,10 @@ 'use strict'; | ||
var self = this; | ||
var authID = null; | ||
var usedPort = null; | ||
// TODO: Pass in SSL options into first arg if provided | ||
var gateway = new TunnelGateway({}, this._getAvailablePort()); | ||
var authID = gateway.getEntranceToken(); | ||
var usedPort = null; | ||
gateway.on('close', function() { | ||
delete self._gateways[authID]; | ||
self._usedPorts.splice(usedPort, 1); | ||
self._usedPorts.splice(self._usedPorts.indexOf(usedPort), 1); | ||
self.emit('unlocked'); | ||
@@ -159,10 +159,15 @@ }); | ||
var end = this._options.portRange.max; | ||
var available = []; | ||
while (start <= end) { | ||
if (this._usedPorts.indexOf(start) === -1) { | ||
return start; | ||
available.push(++start); | ||
} | ||
for (var i = 0; i < this._usedPorts.length; i++) { | ||
if (available.indexOf(this._usedPorts[i]) !== -1) { | ||
available.splice(available.indexOf(this._usedPorts[i]), 1); | ||
} | ||
start++; | ||
} | ||
return available[Math.floor(Math.random() * available.length)]; | ||
}; | ||
@@ -199,32 +204,40 @@ | ||
demuxer.on('error', function(err) { | ||
client.close(400, { error: err.message }); | ||
}); | ||
function cleanup() { | ||
gateway.close(); | ||
demuxer.removeAllListeners(); | ||
muxer.removeAllListeners(); | ||
} | ||
demuxer.on('data', function(object) { | ||
switch (object.type) { | ||
case 'rpc': | ||
return gateway.respond(object.data); | ||
case 'datachannel': | ||
return gateway.transfer(object.flags.quid, object.data); | ||
default: | ||
// NOOP | ||
} | ||
}); | ||
demuxer | ||
.on('error', function(err) { | ||
client.close(400, { error: err.message }); | ||
}) | ||
.on('data', function(object) { | ||
switch (object.type) { | ||
case 'rpc': | ||
return gateway.respond(object.data); | ||
case 'datachannel': | ||
return gateway.transfer(object.flags.quid, object.data); | ||
default: | ||
// NOOP | ||
} | ||
}); | ||
muxer.on('error', function(err) { | ||
client.close(400, { error: err.message }); | ||
}); | ||
muxer | ||
.on('error', function(err) { | ||
client.close(400, { error: err.message }); | ||
}) | ||
.on('data', function(data) { | ||
client.send(data, { binary: true }); | ||
}) | ||
.source(gateway); | ||
muxer.on('data', function(data) { | ||
client.send(data, { binary: true }); | ||
}); | ||
muxer.source(gateway); | ||
client.on('message', function(data) { | ||
demuxer.write(data); | ||
}); | ||
client | ||
.on('message', function(data) { | ||
demuxer.write(data); | ||
}) | ||
.on('close', cleanup) | ||
.on('error', cleanup); | ||
}; | ||
module.exports = TunnelServer; |
{ | ||
"name": "storj", | ||
"version": "0.6.5", | ||
"version": "0.6.6", | ||
"description": "implementation of the storj protocol for node.js and the browser", | ||
@@ -17,3 +17,3 @@ "main": "index.js", | ||
"build": "./node_modules/.bin/browserify index.js -s storj -o dist/storj.browser.js", | ||
"make-docs": "./node_modules/.bin/jsdoc index.js lib -r -R README.md -u ./doc -c .jsdoc.json --verbose -d ./jsdoc", | ||
"make-docs": "mkdir -p ./jsdoc && rm -r ./jsdoc && ./node_modules/.bin/jsdoc index.js lib -r -R README.md -u ./doc -c .jsdoc.json --verbose -d ./jsdoc", | ||
"publish-docs": "npm run make-docs && node script/publishdoc.js" | ||
@@ -20,0 +20,0 @@ }, |
@@ -5,2 +5,3 @@ 'use strict'; | ||
var TunnelServer = require('../../lib/tunnel/server'); | ||
var EventEmitter = require('events').EventEmitter; | ||
@@ -47,9 +48,14 @@ describe('TunnelServer', function() { | ||
}); | ||
var options = [55000, 55001, 55002]; | ||
ts.createGateway(function(err, gw1) { | ||
expect(gw1.getEntranceAddress().port).to.equal(55000); | ||
options.splice(options.indexOf(gw1.getEntranceAddress().port), 1); | ||
ts.createGateway(function(err, gw2) { | ||
expect(gw2.getEntranceAddress().port).to.equal(55001); | ||
options.splice(options.indexOf(gw2.getEntranceAddress().port), 1); | ||
ts.createGateway(function(err, gw3) { | ||
expect(gw3.getEntranceAddress().port).to.equal(55002); | ||
done(); | ||
options.splice(options.indexOf(gw3.getEntranceAddress().port), 1); | ||
expect(options).to.have.lengthOf(0); | ||
ts.createGateway(function(err) { | ||
expect(err).to.not.equal(null); | ||
done(); | ||
}); | ||
}); | ||
@@ -93,4 +99,22 @@ }); | ||
it('should glose the gateway if client disconnects', function(done) { | ||
var ts = new TunnelServer({ port: 0 }); | ||
var client = new EventEmitter(); | ||
ts.createGateway(function(err, gateway) { | ||
client.upgradeReq = { | ||
url: 'ws://127.0.0.1:' + gateway.getEntranceAddress().port + | ||
'/tun?token=' + gateway.getEntranceToken() | ||
}; | ||
ts._handleClient(client); | ||
client.emit('close'); | ||
setImmediate(function() { | ||
expect(Object.keys(ts._gateways)).to.have.lengthOf(0); | ||
expect(ts._usedPorts).to.have.lengthOf(0); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
314150
78
6791
6