@luminati-io/luminati-proxy
Version:
A configurable local proxy for brightdata.com
251 lines (234 loc) • 7.3 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, browser:true*/
(function(){
var define;
var is_node_ff = typeof module=='object' && module.exports;
var is_rn = typeof global=='object' && !!global.nativeRequire ||
typeof navigator=='object' && navigator.product=='ReactNative';
if (is_rn)
{
define = require('./require_node.js').define(module, '../',
require('/util/array.js'));
}
else if (is_node_ff)
define = require('./require_node.js').define(module, '../');
else
define = self.define;
define(['/util/array.js'], function(array){
var E = {};
E.rm_empty_last = function(a){
if (a[a.length-1]==='')
a.pop();
return a;
};
E.split_trim = function(s, sep, limit){
return array.compact_self(s.split(sep, limit)); };
E.split_ws = function(s){ return E.split_trim(s, /\s+/); };
E.qw = function(s){
if (Array.isArray(s) && !s.raw)
return s;
return E.split_ws(!Array.isArray(s) ? s : E.es6_str(arguments));
};
E.chomp = function(s){ return s.replace(/\n$/, ''); };
E.split_crlf = function(s){
return E.rm_empty_last(s.split(/\r?\n/)); };
E.split_nl = function(s){
return E.rm_empty_last(s.split('\n')); };
E.to_array_buffer = function(s){
return new TextEncoder().encode(s).buffer; };
E.from_array_buffer = function(buf, enc){
return new TextDecoder(enc||'utf8').decode(buf); };
E.capitalize = function(s){
s = ''+s;
return (s[0]||'').toUpperCase()+s.slice(1);
};
E.trunc = function(s, len){
if (s.length<=len)
return s;
return s.slice(0, len)+'...';
};
// es6 template
E.template = function(strings){
var keys = Array.prototype.slice.call(arguments, 1);
return function(){
var values = arguments;
var dict = values[values.length-1]||{};
var result = [strings[0]];
keys.forEach(function(key, i){
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i+1]);
});
return result.join('');
};
};
/**
* @deprecated use es6_str_template instead
*/
E.es6_str = function(args){
var parts = args[0], s = '';
if (!Array.isArray(parts))
return parts;
s += parts[0];
for (var i = 1; i<parts.length; i++)
{
s += args[i];
s += parts[i];
}
return s;
};
E.es6_str_template = function(parts){
if (!Array.isArray(parts))
return parts;
var s = parts[0];
for (var i = 1; i<parts.length; i++)
s += arguments[i] + parts[i];
return s;
};
var ALIGN_REGEXP = {
first_or_empty_line: /^\n|(?<=^|\n)[\t ]+(?=(\n|$))/g,
line_start_spaces: /(?<=(^|\n))[\t ]*(?=[^\t\n ])/g,
};
// align paragraph to the left
E.align = function(){
var str = E.es6_str_template.apply(null, arguments)
.replace(ALIGN_REGEXP.first_or_empty_line, '');
var spaces = str.match(ALIGN_REGEXP.line_start_spaces);
if (spaces == null)
return str;
var min_length = Infinity;
for (var i=0; i<spaces.length; i++)
{
if (spaces[i].length<min_length)
{
min_length = spaces[i].length;
if (!min_length)
return str;
}
}
return E.dedent(min_length)(str);
};
// merge lines
E.nl2sp = function(){ return E.es6_str(arguments).replace(/\n\s*/g, ' '); };
// join lines
E.nl2jn = function(){ return E.es6_str(arguments).replace(/\n\s*/g, ''); };
// split lines (html)
E.nl2br = function(){ return E.es6_str(arguments).replace(/\n\s*/g, '<br>'); };
// V8 often keeps large strings in memory when only a short substring is
// referenced, see https://bugs.chromium.org/p/v8/issues/detail?id=2869
// This function forces V8 to make a copy and release the parent string.
E.detach = function(s){ return (' '+s).slice(1); };
E.hash = function(s){
var hash = 0;
for (var i = 0, l = s.length; i<l; i++)
hash = (hash<<5) - hash + s.charCodeAt(i) >>> 0;
return hash;
};
var def_alphabet = '0123456789abcdefghijklmnopqrstuvwxyz';
E.generate = function(len, alphabet){
len = len||12;
alphabet = alphabet||def_alphabet;
var ret = '';
for (var i=0; i<len; i++)
ret += alphabet[Math.random()*alphabet.length|0];
return ret;
};
// longest string among arguments
E.longest = function(){
var i, s;
for (i=0; i<arguments.length; i++)
s = (arguments[i]||'').length>(s||'').length ? arguments[i] : s;
return s;
};
// trims newlines, nbsp, zwnj
E.trim = function(s){
return (''+s).replace(/^[\s\u00a0\u200c]*/g, '')
.replace(/[\s\u00a0\u200c]*$/g, '');
};
E.object_to_str = function(obj){
return Object.entries(obj)
.map(function(entry){
if (entry[1]!=null)
return entry[0]+'='+entry[1];
})
.filter(Boolean)
.join(' ');
};
var snake_case_regex = /(([A-Z](?![^A-Z]))+|[A-Z])[^A-Z]*|[^A-Z]+/g;
E.to_snake_case = function(str){
return Array.from((str||'').matchAll(snake_case_regex))
.map(function(m){ return m[0].toLowerCase(); }).join('_');
};
/* eslint-disable-next-line no-control-regex*/
E.str_rm_null = function(s){ return (s||'').replace(/\u0000/g, ''); };
E.count = function(s, p){
if (!p || !p.toString || (p=p.toString()).length<1 || p.length>s.length)
return 0;
var c, i;
for (c=-1, i=-1-p.length; i!=-1; ++c, i=s.indexOf(p, i+p.length));
return c;
};
E.internalize_pool = typeof Map=='function' ? function(){
var pool = new Map(); // jshint ignore:line
return function internalize_string(str){
var v = pool.get(str);
if (v===undefined)
pool.set(str, v = str);
return v;
};
} : function(v){ return v; };
E.wrap = function wrap(str, width, nbsp_to_space){
nbsp_to_space = nbsp_to_space!==false;
var lines = str.split('\n');
if (lines.length>1)
{
return lines.map(function(line){
return wrap(line, width);
}).join('\n');
}
var words = str.split(' ');
var output = '';
var cur_line = '';
for (var i = 0; i < words.length; i++)
{
var word = words[i];
var possible_line = cur_line ? cur_line+' '+word : word;
if (possible_line[width])
{
output += cur_line+'\n';
cur_line = word;
}
else
cur_line = possible_line;
}
output += cur_line;
return nbsp_to_space ? output.replace(/\u00A0/g, ' ') : output;
};
E.sp2nbsp = function(){
return E.es6_str(arguments).replace(/ /g, '\u00A0');
};
var INDENT_REGEXP = /(?<=^|\n)(?=[\t ]*[^\s])/g;
E.indent = function(space_amount){
if (space_amount<1)
return E.es6_str_template;
var template = new Array(space_amount+1).join(' ');
return function(){
var str = E.es6_str_template.apply(null, arguments);
return str.replace(INDENT_REGEXP, template);
};
};
E.dedent = function(space_amount){
if (space_amount<1)
return E.es6_str_template;
var dedent_regexp = new RegExp('(?<=^|\n)[\\t ]{1,'+space_amount+'}', 'g');
return function(){
var str = E.es6_str_template.apply(null, arguments);
return str.replace(dedent_regexp, '');
};
};
var SDK_UUID_REGEXP = /^sdk-[a-z]*-[0-9a-f]{32}$/;
E.is_uuid = function(str){
return SDK_UUID_REGEXP.test(str);
};
return E;
});
})();