2017-03-22 16:44:08 +00:00
|
|
|
const TorPool = require('./TorPool');
|
|
|
|
const SOCKSServer = require('./SOCKSServer');
|
|
|
|
const DNSServer = require('./DNSServer');
|
2017-12-08 02:53:16 +00:00
|
|
|
const HTTPServer = require('./HTTPServer');
|
|
|
|
const rpc = require('jrpc2');
|
2017-03-22 16:44:08 +00:00
|
|
|
|
|
|
|
class ControlServer {
|
|
|
|
constructor(logger) {
|
2017-12-08 02:53:16 +00:00
|
|
|
var torPool = this.torPool = new TorPool(null, null, logger);
|
2017-03-22 16:44:08 +00:00
|
|
|
this.logger = logger;
|
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
let server = this.server = new rpc.Server();
|
|
|
|
server.expose('createTorPool', this.createTorPool.bind(this));
|
|
|
|
server.expose('createSOCKSServer', this.createSOCKSServer.bind(this));
|
|
|
|
server.expose('createDNSServer', this.createDNSServer.bind(this));
|
|
|
|
server.expose('createHTTPServer', this.createHTTPServer.bind(this));
|
|
|
|
|
|
|
|
server.expose('queryInstances', function () {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
if (!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 } )) );
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
server.expose('createInstances', function (instances) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
torPool.create(instances, (error, instances) => {
|
|
|
|
if (error) reject(error);
|
|
|
|
else resolve();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2017-03-22 16:44:08 +00:00
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
server.expose('removeInstances', function (instances) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
torPool.remove(instances, (error) => {
|
|
|
|
if (error) reject(error);
|
|
|
|
else resolve();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
server.expose('newIps', function () {
|
|
|
|
torPool.new_ips();
|
|
|
|
return Promise.resolve();
|
|
|
|
});
|
2017-03-22 16:44:08 +00:00
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
server.expose('nextInstance', function () {
|
|
|
|
torPool.next();
|
|
|
|
return Promise.resolve();
|
|
|
|
});
|
2017-11-12 22:54:47 +00:00
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
server.expose('closeInstances', function () {
|
|
|
|
torPool.exit();
|
|
|
|
return Promise.resolve();
|
2017-11-12 22:54:47 +00:00
|
|
|
});
|
2017-03-22 16:44:08 +00:00
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
listen(port, callback) {
|
|
|
|
this.tcpTransport = new rpc.tcpTransport({ port });
|
|
|
|
this.tcpTransport.listen(this.server);
|
|
|
|
callback();
|
|
|
|
}
|
2017-03-22 16:44:08 +00:00
|
|
|
|
2017-12-08 02:53:16 +00:00
|
|
|
close() {
|
|
|
|
return this.tcpTransport.tcpServer.close();
|
2017-03-22 16:44:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
createTorPool(options) {
|
|
|
|
this.torPool = new TorPool(null, options, this.logger);
|
2017-12-08 02:53:16 +00:00
|
|
|
this.torPool;
|
|
|
|
return Promise.resolve();
|
2017-03-22 16:44:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
createSOCKSServer(port) {
|
|
|
|
this.socksServer = new SOCKSServer(this.torPool, this.logger);
|
|
|
|
this.socksServer.listen(port || 9050);
|
|
|
|
this.logger && this.logger.info(`[socks]: Listening on ${port}`);
|
2017-12-08 02:53:16 +00:00
|
|
|
this.socksServer;
|
|
|
|
return Promise.resolve();
|
2017-03-22 16:44:08 +00:00
|
|
|
}
|
|
|
|
|
2017-12-08 01:21:42 +00:00
|
|
|
createHTTPServer(port) {
|
2017-12-08 06:35:13 +00:00
|
|
|
this.httpServer = new HTTPServer(this.torPool, this.logger);
|
2017-12-08 01:21:42 +00:00
|
|
|
this.httpServer.listen(port || 9080);
|
|
|
|
this.logger && this.logger.info(`[http]: Listening on ${port}`);
|
2017-12-08 02:53:16 +00:00
|
|
|
this.httpServer;
|
|
|
|
return Promise.resolve();
|
2017-12-08 01:21:42 +00:00
|
|
|
}
|
|
|
|
|
2017-03-22 16:44:08 +00:00
|
|
|
createDNSServer(port) {
|
|
|
|
this.dnsServer = new DNSServer(this.torPool, this.logger);
|
|
|
|
this.dnsServer.serve(port || 9053);
|
|
|
|
this.logger && this.logger.info(`[dns]: Listening on ${port}`);
|
2017-12-08 02:53:16 +00:00
|
|
|
this.dnsServer;
|
|
|
|
return Promise.resolve();
|
2017-03-22 16:44:08 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = ControlServer;
|