@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
72 lines (69 loc) • 2.31 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true*/
const logger = require('./logger.js');
const path = require('path');
const file = require('../util/file.js');
const etask = require('../util/etask.js');
const lpm_config = require('../util/lpm_config.js');
const {spawn, fork} = require('child_process');
let puppeteer;
try {
puppeteer = require('puppeteer');
const launch = puppeteer.launch;
puppeteer.ready = file.exists(puppeteer.executablePath());
puppeteer.launch = (opt={})=>{
if (file.exists(puppeteer.executablePath()))
return launch.call(puppeteer, opt);
setTimeout(fetch_chromium);
throw new Error('Chromium binary is not fetched');
};
puppeteer.open_page = (url, port)=>etask(function*(){
if (!puppeteer.ready)
yield fetch_chromium();
const browser = yield puppeteer.launch({
headless: false,
ignoreHTTPSErrors: true,
args: [
`--proxy-server=127.0.0.1:${port}`,
'--ignore-certificate-errors',
'--ignore-certificate-errors-spki-list',
'--no-sandbox',
'--disable-setuid-sandbox',
],
});
const page = (yield browser.pages())[0] || (yield browser.newPage());
yield page.goto(url);
yield browser.disconnect();
});
} catch(e){ logger.error(e.message); }
let pending;
const fetch_chromium = ()=>etask(function*(){
if (pending)
{
pending.push(this);
return yield this.wait();
}
pending = [];
logger.notice('Fetching chromium...');
const install_path = path.resolve(__dirname,
'../node_modules/puppeteer/install.js');
let child;
if (lpm_config.is_win)
child = fork(install_path, {stdio: [0, 1, 2, 'ipc']});
else
child = spawn('node', [install_path], {stdio: 'inherit'});
child.on('exit', (code, signal)=>{
if (code==0)
{
logger.notice('Chromium fetched successfully');
puppeteer.ready = true;
}
else
logger.warn('Could not fetch Chromium');
this.continue();
});
yield this.wait();
pending.forEach(p=>p.continue());
pending = null;
});
module.exports = puppeteer;