@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
130 lines (126 loc) • 4.63 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true*/
if (process.env.LPM_DEBUG)
require('longjohn');
const Server = require('./server.js');
const logger = require('./logger.js').child({category: 'Worker'});
const zerr = require('../util/zerr.js');
class Worker {
constructor(){
this.ports = {};
}
run(){
process.on('message', this.handle_message.bind(this));
['SIGTERM', 'SIGINT', 'uncaughtException'].forEach(sig=>{
process.on(sig, ()=>{ });
});
}
handle_message(msg){
if (msg.code=='CREATE')
{
const port = msg.opt.port;
const serv = new Server(msg.opt);
this.ports[msg.opt.port] = serv;
serv.on('ready', ()=>{
process.send({code: 'READY', port});
});
serv.on('error', e=>{
process.send({
code: 'ERROR',
e: {code: e.code, message: e.message},
port,
});
});
serv.on('idle', data=>{
process.send({code: 'IDLE', data, port});
});
serv.on('usage_start', data=>{
process.send({code: 'USAGE_START', data, port});
});
serv.on('usage', data=>{
process.send({code: 'USAGE', data, port});
});
serv.on('usage_abort', data=>{
process.send({code: 'USAGE_ABORT', data, port});
});
serv.on('stopped', ()=>{
process.send({code: 'STOPPED', port});
});
serv.on('banip', data=>{
process.send({code: 'BANIP', data, port});
});
serv.on('unbanip', data=>{
process.send({code: 'UNBANIP', data, port});
});
serv.on('refresh_ip', data=>{
process.send({code: 'REFRESH_IP', data, port});
});
serv.on('retry', data=>{
const other_serv = this.ports[data.port];
if (!other_serv)
{
// XXX krzysztof: need to emit error
return logger.warn('retry failed: no server %s',
data.port);
}
other_serv.lpm_request(data.req, data.res, data.head);
const cb = res=>{
if (data.req.ctx.uuid==res.uuid)
{
data.post(res);
other_serv.removeListener('response', cb);
}
};
other_serv.on('response', cb);
});
serv.on('banip_global', data=>{
process.send({code: 'BANIP_GLOBAL', data, port});
});
serv.on('first_lpm_action', data=>{
process.send({code: 'FIRST_LPM_ACTION', data, port});
});
serv.on('send_rule_mail', data=>{
process.send({code: 'SEND_RULE_MAIL', data, port});
});
serv.on('request_session', ()=>{
logger.error('requesting session');
});
serv.on('add_static_ip', ip=>{
process.send({code: 'ADD_STATIC_IP', data: {ip, port}, port});
});
serv.on('remove_static_ip', ip=>{
process.send({code: 'REMOVE_STATIC_IP', data: {ip, port},
port});
});
serv.on('access_denied', ip=>{
process.send({code: 'ADD_PENDING_IP', data: ip, port});
});
serv.on('tls_error', ()=>{
process.send({code: 'TLS_ERROR', port});
});
serv.listen();
}
else if (msg.code=='STOP')
this.ports[msg.port].stop();
else if (msg.code=='REFRESH_SESSIONS')
this.ports[msg.port].session_mgr.refresh_sessions();
else if (msg.code=='UPDATE_CONFIG')
this.ports[msg.port].update_config(msg.opt);
else if (msg.code=='BANIP')
{
this.ports[msg.port].banip(msg.data.ip, msg.data.ms, null,
msg.data.domain);
}
else if (msg.code=='UNBANIP')
this.ports[msg.port].unbanip(msg.data.ip, msg.data.domain);
else if (msg.code=='UPDATE_LOG_LEVEL')
logger.set_level(msg.level);
else
logger.warn('unknown message: %s', msg.code);
}
}
process.on('uncaughtException', e=>{
logger.error(zerr.e2s(e));
});
new Worker().run();