@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
101 lines (94 loc) • 3.43 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true*/
const path = require('path');
const etask = require('../util/etask.js');
const logger = require('./logger.js');
const lpm_file = require('../util/lpm_file.js');
const file = require('../util/file.js');
const util = require('./util.js');
const E = module.exports;
let data;
let pending;
const prepare_data = locs=>{
const locations = {};
const asns = {};
locs.forEach(d=>{
if (!d)
return;
const [country, asn, region, city, mob] = d.split('_');
if (!locations[country])
locations[country] = {_mob: !!mob};
locations[country]._mob = locations[country]._mob||!!mob;
if (!locations[country][region])
locations[country][region] = {_mob: !!mob};
locations[country][region]._mob =
locations[country][region]._mob||!!mob;
if (!locations[country][region][city])
locations[country][region][city] = {_mob: !!mob};
locations[country][region][city]._mob =
locations[country][region][city]._mob||!!mob;
if (!asns[country])
asns[country] = {};
if (!asns[country][asn])
asns[country][asn] = {_mob: !!mob};
asns[country][asn]._mob = asns[country][asn]._mob||!!mob;
});
return {locations, asns};
};
E.all_locations = www_domain=>etask(function*(){
yield E.ensure_data(www_domain);
return data;
});
const get_current_vipdb_version = domain=>etask(function*(){
const res = yield util.fetch(`http://client.${domain}/api/vipdb/version`);
if (res.statusCode==200)
return res.body;
logger.warn('Unable to get current vipdb version');
});
const get_current_vipdb_data = domain=>etask(function*(){
let res = [];
let main = yield util.fetch(`http://client.${domain}/api/vipdb/main`);
if (main.statusCode!=200)
logger.warn('Vipdb main could not be fetched');
else
res = res.concat(main.body.split('\n'));
const small = yield util.fetch(
`http://client.${domain}/api/vipdb/small_geo`);
if (small.statusCode!=200)
logger.warn('Vipdb small could not be fetched');
else
res = res.concat(small.body.split('\n'));
return res.map(v=>v.split(';')[0]);
});
E.ensure_data = www_domain=>etask(function*(){
if (data || data===null)
return;
if (pending)
{
pending.push(this);
return yield this.wait();
}
pending = [];
const vipdb_path = path.resolve(lpm_file.work_dir, 'vipdb.csv');
try { data = JSON.parse(file.read_e(vipdb_path)); }
catch(e){
if (e.code!='ENOENT')
logger.error('Failed to parse vipdb %s', e.message);
}
const current_vipdb_version = yield get_current_vipdb_version(www_domain);
if (!current_vipdb_version)
return;
if (!data || data.version!=current_vipdb_version)
{
logger.notice('Fetching vipdb data. New version %s available '
+'(current is %s)', current_vipdb_version, data && data.version);
const new_vipdb = yield get_current_vipdb_data(www_domain);
if (!new_vipdb)
return;
data = {vipdb: new_vipdb, version: current_vipdb_version};
file.write_e(vipdb_path, JSON.stringify(data));
}
data = prepare_data(data && data.vipdb || []);
pending.forEach(p=>p.continue());
pending = null;
});