Fix issue for dynamically created Tor instances

The root cause was that the "this" binding was missing
for the calls that dynamically create the tor instances
and update the references within the _instances array.
[#4]
This commit is contained in:
Roman Brunner 2018-05-07 09:50:52 +02:00
parent ddaa185d17
commit 4ccc9e0e8f
4 changed files with 5777 additions and 22 deletions

5752
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,8 @@
},
"scripts": {
"start": "bin/tor-router -s -d -j 1",
"test": "mocha test/test.js"
"test": "mocha test/test.js",
"debug": "node --inspect-brk bin/tor-router"
},
"devDependencies": {
"mocha": "^3.2.0",

View file

@ -6,7 +6,7 @@ const rpc = require('jrpc2');
class ControlServer {
constructor(logger) {
var torPool = this.torPool = new TorPool(null, null, logger);
this.torPool = this.torPool = new TorPool(null, null, logger);
this.logger = logger;
let server = this.server = new rpc.Server();
@ -15,47 +15,47 @@ class ControlServer {
server.expose('createDNSServer', this.createDNSServer.bind(this));
server.expose('createHTTPServer', this.createHTTPServer.bind(this));
server.expose('queryInstances', function () {
server.expose('queryInstances', (function () {
return new Promise((resolve, reject) => {
if (!torPool)
if (!this.torPool)
return reject({ message: 'No pool created' });
resolve(torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
resolve(this.torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
});
});
}).bind(this));
server.expose('createInstances', function (instances) {
server.expose('createInstances', (function (instances) {
return new Promise((resolve, reject) => {
torPool.create(instances, (error, instances) => {
this.torPool.create(instances, (error, instances) => {
if (error) reject(error);
else resolve();
});
});
});
}).bind(this) );
server.expose('removeInstances', function (instances) {
server.expose('removeInstances', (function (instances) {
return new Promise((resolve, reject) => {
torPool.remove(instances, (error) => {
this.torPool.remove(instances, (error) => {
if (error) reject(error);
else resolve();
});
});
});
}).bind(this) );
server.expose('newIps', function () {
torPool.new_ips();
server.expose('newIps', (function() {
this.torPool.new_ips();
return Promise.resolve();
});
}).bind(this) );
server.expose('nextInstance', function () {
torPool.next();
server.expose('nextInstance', (function () {
this.torPool.next();
return Promise.resolve();
});
}).bind(this) );
server.expose('closeInstances', function () {
torPool.exit();
server.expose('closeInstances', (function () {
this.torPool.exit();
return Promise.resolve();
});
}).bind(this) );
}

View file

@ -37,7 +37,9 @@ class TorPool extends EventEmitter {
this.logger = logger;
}
get instances() { return this._instances.filter((tor) => tor.ready).slice(0); }
get instances() {
return this._instances.filter((tor) => tor.ready).slice(0);
}
create_instance(callback) {
let config = _.extend({}, this.tor_config)