@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
271 lines (257 loc) • 8.92 kB
JavaScript
// LICENSE_CODE ZON
; /*zlint node, br*/
(function(){
var define;
var is_node_ff = typeof module=='object' && module.exports;
if (!is_node_ff)
define = self.define;
else
define = function(setup){ module.exports = setup(); };
define(function(){
var E = {};
var win_versions = {
'10.0': '10.0',
'6.3': '8.1',
'6.2': '8',
'6.1': '7',
'6.0': 'vista',
'5.2': '2003',
'5.1': 'xp',
'5.0': '2000',
};
var arch_mapping = {
x86_64: '64',
i686: '32',
arm: 'arm',
};
var check_opera = /\bOPR\b\/(\d+)/i;
var check_edge = /\bEdge\b\/(\d+)/i;
var check_xbox = /\bxbox\b/i;
var check_ucbrowser = /\bUCBrowser\b\/(\d+)/i;
var check_webview = / Version\/(\d+)(\.\d)/;
var is_browser = !is_node_ff && typeof window!='undefined';
// starting iOS13 iPad returns the same user-agent as MacOS Safari, but
// we still need to detect it as mobile (install links to AppStore etc)
function is_ipad_os(ua){
return /Macintosh/.test(ua) && typeof navigator=='object' &&
navigator.maxTouchPoints>1;
}
function ios_ua(ua, safari_ver){
var res;
if (res = /(?:iPhone|iPad|iPod|iPod touch);.*?OS ([\d._]+)/.exec(ua))
{
var ios_ver = res[1];
var is_chrome = /CriOS/.test(ua);
var is_firefox = /FxiOS/.test(ua);
var ucbrowser_ver = (check_ucbrowser.exec(ua)||[])[1];
var is_ucbrowser = !!ucbrowser_ver;
return {
browser: 'safari',
version: safari_ver||ios_ver,
ios: ios_ver,
chrome: is_chrome,
firefox: is_firefox,
ucbrowser: is_ucbrowser,
ucbrowser_version: ucbrowser_ver,
webview: /Twitter/.test(ua) ? 'twitter' :
/GSA\/\d+/.test(ua) ? 'googlesearch' :
/FBAV\/\d+/.test(ua) ? 'facebook' :
!safari_ver && !is_chrome && !is_firefox && !is_ucbrowser,
};
}
}
function check_chromium(ua){
if (check_webview.test(ua) || /Android/.test(ua) || / Mobile /.test(ua) ||
check_opera.test(ua))
{
return false;
}
var group = '(?: (\\w*)\\/)?', ver = '\\/[\\d\\.]+';
var res = new RegExp('AppleWebKit'+ver+'(?: \\(.*\\))?'+group+'.* Chrome'+
ver+group+'.* Safari'+ver+group).exec(ua);
return res && (res[1]||res[2]||res[3]);
}
E.guess_browser = function(ua){
var res;
ua = ua || (is_browser ? window.navigator&&navigator.userAgent : '');
if (res = /\bOpera Mini\/(\d+)/.exec(ua))
return {browser: 'opera_mini', version: res[1]};
var ucbrowser = check_ucbrowser.exec(ua);
if (res = /[( ]MSIE ([6789]|10).\d[);]/.exec(ua))
return {browser: 'ie', version: res[1], xbox: check_xbox.test(ua)};
if (res = /[( ]Trident\/\d+(\.\d)+.*rv:(\d\d)(\.\d)+[);]/.exec(ua))
return {browser: 'ie', version: res[2], xbox: check_xbox.test(ua)};
if (res = / Chrome\/(\d+)(\.\d+)+.* Safari\/\d+(\.\d+)+/.exec(ua))
{
var opera = check_opera.exec(ua);
var edge;
if (edge = check_edge.exec(ua))
return {browser: 'edge', version: edge[1]};
var chromium_based = check_chromium(ua);
return {browser: 'chrome', version: res[1],
android: ua.match(/Android/),
webview: ua.match(check_webview),
chromium_based: chromium_based,
opera: opera && !!opera[1],
opera_version: opera ? opera[1] : undefined,
ucbrowser: ucbrowser && !!ucbrowser[1],
ucbrowser_version: ucbrowser ? ucbrowser[1] : undefined,
webos_app: /Web0S/.test(ua),
samsung_browser: /SamsungBrowser/.test(ua)};
}
if (res = / QupZilla\/(\d+\.\d+\.\d+).* Safari\/\d+.\d+/.exec(ua))
return {browser: 'qupzilla', version: res[1]};
if (res = /\(PlayStation (\d+) (\d+\.\d+)\).* AppleWebKit\/\d+.\d+/
.exec(ua))
{
return {browser: 'playstation'+res[1], version: res[2]};
}
if (res = /\(SMART-TV; Linux; Tizen ([0-9.]+)\) AppleWebkit\//.exec(ua))
return {browser: 'samsung_tizen', version: res[1]};
if (res = / Version\/(\d+)(\.\d)+.* Safari\/\d+.\d+/.exec(ua))
{
if (!ua.match(/Android/))
return ios_ua(ua, res[1])||{browser: 'safari', version: res[1]};
return {browser: 'chrome', version: res[1], android: true,
webview: true, ucbrowser: ucbrowser && !!ucbrowser[1],
ucbrowser_version: ucbrowser ? ucbrowser[1] : undefined,
samsung_browser: /SamsungBrowser/.test(ua)};
}
if (res = / (Firefox|PaleMoon)\/(\d+).\d/.exec(ua))
{
return {browser: 'firefox', version: res[2],
palemoon: res[1]=='PaleMoon'};
}
if (res = ios_ua(ua))
return res;
return {};
};
E.browser_to_string = function(browser){
if (typeof browser!='object' || !browser.browser)
return 'unknown';
var s = browser.browser=='ie' && browser.version>11
? 'edge' : browser.browser;
if (browser.version)
s += ' '+browser.version;
if (browser.chrome)
s += ' chrome';
if (browser.firefox)
s += ' firefox';
if (browser.xbox)
s += ' xbox';
if (browser.android)
s += ' android';
if (browser.webview)
{
s += ' webview';
if (typeof browser.webview=='string')
s+='-'+browser.webview;
}
if (browser.chromium_based)
s += ' chromium_based';
if (browser.samsung_browser)
s += ' samsung';
if (browser.opera)
{
s += ' opera';
if (browser.opera_version)
s += '-'+browser.opera_version;
}
if (browser.ucbrowser)
{
s += ' ucbrowser';
if (browser.ucbrowser_version)
s += '-'+browser.ucbrowser_version;
}
if (browser.palemoon)
s += ' palemoon';
if (browser.ios)
s += ' ios';
if (browser.webos_app)
s += ' webos_app';
return s ? s : 'unknown';
};
E.guess = function(ua, platform){
var res;
ua = ua || (is_browser ? navigator.userAgent : '');
platform = platform || (is_browser ? navigator.platform : '');
if (check_xbox.exec(ua))
return {os: 'xbox', mobile: false};
if (res = /Windows(?: NT(?: (.*?))?)?[);]/.exec(ua))
{
return {
os: 'windows',
version: win_versions[res[1]],
release_version: res[1],
arch: ua.match(/WOW64|Win64|x64/) ? '64' : '32',
mobile: false,
};
}
if (/Windows Phone/.exec(ua))
return {os: 'winphone', mobile: true};
if (/Macintosh/.exec(ua))
{
if (is_ipad_os(ua))
return {os: 'ios', mobile: true};
if (res = /Macintosh.*; (?:Intel|PPC) Mac OS X (\d+[._]\d+)/.exec(ua))
{
return {os: 'macos', version: res[1].replace('_', '.'),
mobile: false};
}
return {os: 'macos', mobile: false};
}
if (/Web0S.*SmartTV/.exec(ua))
{
return {os: 'webos', version: /Chrome/.test(ua) ? '3' : '2',
mobile: false, tv: true};
}
if (res = /(Android|Andr0id)(?: (\d+\.\d+))?/.exec(ua))
return {os: 'android', version: res[2], mobile: true};
if (res = /(Linux|CrOS|OpenBSD|FreeBSD)(?: (x86_64|i686|arm))?/.exec(ua))
{
if (check_opera.test(ua) && res[1]=='Linux' && res[2]=='x86_64' &&
/^Linux arm/.test(platform))
{
// Opera Mobile bug
return {os: 'android', mobile: true};
}
return {
os: res[1].toLowerCase(),
arch: arch_mapping[res[2]],
nix: true,
mobile: false,
};
}
if (res = /(?:iPhone|iPad|iPod|iPod touch);.*?OS (\d+[._]\d+)/.exec(ua))
return {os: 'ios', version: res[1].replace('_', '.'), mobile: true};
if (/iPhone|iPad|iPod iOS/.exec(ua))
return {os: 'ios', mobile: true};
if (/PLAYSTATION/.exec(ua))
return {os: 'ps', mobile: false};
// HitLeap Viewer (whatever it is) is Windows-only
if (/HitLeap Viewer/.exec(ua))
return {os: 'windows', mobile: false};
return {};
};
E.guess_device = function(ua){
var res;
ua = ua || (is_browser ? navigator.userAgent : '');
if (res = /(iPhone|iPad|iPod)/.exec(ua))
return {device: res[1].toLowerCase()};
if (/Macintosh/.test(ua))
return {device: is_ipad_os(ua) ? 'ipad' : 'mac'};
return {};
};
E.support_fullscreen = function(){
return !!(is_browser && typeof document!='undefined' &&
(document.fullscreenEnabled||document.mozFullScreenEnabled||
document.webkitFullscreenEnabled||document.msFullscreenEnabled));
};
E.support_hover = function(){
if (!is_browser)
return false;
if (window.matchMedia && window.matchMedia('(hover: hover)').matches)
return true;
return !E.guess().mobile;
};
return E; }); }());