@luminati-io/luminati-proxy
Version:
A configurable local proxy for brightdata.com
73 lines (70 loc) • 2.65 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true*/
const hostname = require('os').hostname();
const request = require('../util/lpm_request.js').defaults({gzip: true});
const etask = require('../util/etask.js');
const date = require('../util/date.js');
const zerr = require('../util/zerr.js');
const logger = require('./logger.js').child({category: 'Cloud'});
class Cloud_mgr {
constructor(mgr){
this.mgr = mgr;
}
request(za, opt){
let _this = this;
return etask(function*_request(){
const _url = `http://${za}.luminati.io:22999/api/${opt.endpoint}`;
const method = opt.method||'GET';
let lpm_token = (_this.mgr._defaults.lpm_token||'').split('|')[0];
logger.debug('API: %s %s %s', method, _url,
JSON.stringify(opt.qs||{}));
const res = yield etask.nfn_apply(request, [{
method,
url: _url,
qs: opt.qs,
json: opt.json===false ? false : true,
form: opt.form,
timeout: opt.timeout||20*date.ms.SEC,
headers: {
cookie: `lpm_token=${lpm_token}`,
},
}]);
if (res.statusCode==502)
throw new Error('Server unavailable');
if (!/2../.test(res.statusCode) && !opt.no_throw)
{
let msg = `API call to ${_url} FAILED with status`
+' '+res.statusCode;
if (res.body && res.statusCode!=404)
msg += ' '+(res.body.slice && res.body.slice(0, 40) || '');
throw new Error(msg);
}
return res.body;
});
}
get_instances(){
let _this = this;
return etask(function*_get_instances(){
this.on('uncaught', e=>
logger.error('Could not get instances: %s', zerr.e2s(e)));
let res = yield _this.mgr.lpm_f.get_cloud_zagents();
if (res.err)
throw res.err;
return res.zagents.filter(s=>s!=hostname);
});
}
get_logs(qs){
let _this = this;
return etask(function*_get_logs(){
this.on('uncaught', e=>
logger.error('Could not get logs: %s', zerr.e2s(e)));
let servers = yield _this.get_instances();
if (!servers.length)
return [];
let opt = {endpoint: 'logs', qs};
return yield etask.all(servers.map(s=>_this.request(s, opt)));
});
}
}
module.exports = Cloud_mgr;