UNPKG

@luminati-io/luminati-proxy

Version:

A configurable local proxy for luminati.io

556 lines (520 loc) 14.9 kB
// LICENSE_CODE ZON ISC 'use strict'; /*zlint node, br*/ (function(){ var define, node_util; var is_node = typeof module=='object' && module.exports && module.children; 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) define = self.define; else { node_util = require('util'); define = require('./require_node.js').define(module, '../'); } define(['/util/array.js'], function(array){ var E = {}; E._is_mocha = undefined; E.is_mocha = function(){ if (E._is_mocha!==undefined) return E._is_mocha; if (typeof process!='undefined' && typeof process.env!='undefined') return E._is_mocha = process.env.IS_MOCHA||false; return E._is_mocha = false; }; E.is_lxc = function(){ return is_node && +process.env.LXC; }; E.f_mset = function(flags, mask, bits){ return flags&~mask | bits; }; E.f_lset = function(flags, bits, logic){ return E.f_mset(flags, bits, logic ? bits : 0); }; E.f_meq = function(flags, mask, bits){ return (flags & mask)==bits; }; E.f_eq = function(flags, bits){ return (flags & bits)==bits; }; E.f_cmp = function(f1, f2, mask){ return (f1 & mask)==(f2 & mask); }; E.xor = function(a, b){ return !a != !b; }; E.div_ceil = function(a, b){ return Math.floor((a+b-1)/b); }; E.ceil_mul = function(a, b){ return E.div_ceil(a, b)*b; }; E.floor_mul = function(a, b){ return Math.floor(a/b)*b; }; E.range = function(x, a, b){ return x>=a && x<=b; }; E.range.ii = function(x, a, b){ return x>=a && x<=b; }; E.range.ie = function(x, a, b){ return x>=a && x<b; }; E.range.ei = function(x, a, b){ return x>a && x<=b; }; E.range.ee = function(x, a, b){ return x>a && x<b; }; E.clamp = function(lower_bound, value, upper_bound){ if (value < lower_bound) return lower_bound; if (value < upper_bound) return value; return upper_bound; }; E.revcmp = function(a, b){ return a>b ? -1 : a<b ? 1 : 0; }; /* Union given objects, using fn to resolve conflicting keys */ E.union_with = function(fn /* [o1, [o2, [...]]]*/){ var res = {}, args; if (arguments.length==2 && typeof arguments[1]=='object') args = arguments[1]; else args = array.slice(arguments, 1); for (var i = 0; i < args.length; ++i) { for (var key in args[i]) { var arg = args[i]; res[key] = res.hasOwnProperty(key) ? fn(res[key], arg[key]) : arg[key]; } } return res; }; function _clone_deep(obj){ var i, n, ret; if (obj instanceof Array) { ret = new Array(obj.length); n = obj.length; for (i = 0; i < n; i++) ret[i] = obj[i] instanceof Object ? _clone_deep(obj[i]): obj[i]; return ret; } else if (obj instanceof Date) return new Date(obj); else if (obj instanceof RegExp) return new RegExp(obj); else if (obj instanceof Function) return obj; ret = {}; for (i in obj) ret[i] = obj[i] instanceof Object ? _clone_deep(obj[i]) : obj[i]; return ret; } E.clone_deep = function(obj){ if (!(obj instanceof Object)) return obj; return _clone_deep(obj); }; // prefer to normally Object.assign() instead of extend() E.extend = function(obj){ // like _.extend for (var i=1; i<arguments.length; i++) { var source = arguments[i]; if (!source) continue; for (var prop in source) obj[prop] = source[prop]; } return obj; }; E.is_object = function(obj){ return obj && obj.constructor==Object; }; E.extend_deep = function(obj){ if (!E.is_object(obj)) return obj; for (var i=1; i<arguments.length; i++) { var source = arguments[i]; if (!source) continue; for (var prop in source) { if (E.is_object(source[prop]) && E.is_object(obj[prop])) E.extend_deep(obj[prop], source[prop]); else obj[prop] = source[prop]; } } return obj; }; E.extend_deep_del_null = function(obj){ for (var i=1; i<arguments.length; i++) { var source = arguments[i]; if (!source) continue; for (var prop in source) { if (E.is_object(source[prop])) { if (!E.is_object(obj[prop])) obj[prop] = {}; E.extend_deep_del_null(obj[prop], source[prop]); } else if (source[prop]==null) delete obj[prop]; else obj[prop] = source[prop]; } } return obj; }; E.defaults = function(obj){ // like _.defaults if (!obj) obj = {}; for (var i=1; i<arguments.length; i++) { var source = arguments[i]; if (obj===undefined) continue; for (var prop in source) { if (obj[prop]===undefined) obj[prop] = source[prop]; } } return obj; }; E.defaults_deep = function(obj){ if (obj!==undefined && !E.is_object(obj)) return obj; for (var i=1; i<arguments.length; i++) { var source = arguments[i]; if (obj===undefined) obj = E.clone_deep(source); else if (E.is_object(source)) { for (var prop in source) { var s = source[prop], d = obj[prop]; if (d===undefined) obj[prop] = E.clone_deep(s); else E.defaults_deep(d, s); } } } return obj; }; E.clone = function(obj){ // like _.clone if (!(obj instanceof Object)) return obj; if (obj instanceof Array) { var a = new Array(obj.length); for (var i=0; i<obj.length; i++) a[i] = obj[i]; return a; } return E.extend({}, obj); }; E.freeze_deep = function(obj){ if (typeof obj=='object') { for (var prop in obj) { if (obj.hasOwnProperty(prop)) E.freeze_deep(obj[prop]); } } return Object.freeze(obj); }; // Limitations: // We know that not every data type can be reliably compared for equivalence // (other than with ===). In equal_deep, we try to be conservative, returning // false when we cannot be sure. Functions, however, are compared by their // string serializations, which can lead to conflation of distinct closures. // Cyclic references are not supported (cause a stack overflow). E.equal_deep = function(a, b){ var i; if (a===b) return true; if (!a || !b || a.constructor!==b.constructor) return false; if (a instanceof Function || a instanceof RegExp) return a.toString()==b.toString(); if (a instanceof Date) return +a == +b; if (Array.isArray(a)) { if (a.length!=b.length) return false; for (i = 0; i<a.length; i++) { if (!E.equal_deep(a[i], b[i])) return false; } return true; } if (E.is_object(a)) { var a_keys = Object.keys(a), b_keys = Object.keys(b); if (a_keys.length!=b_keys.length) return false; for (i = 0; i<a_keys.length; i++) { var key = a_keys[i]; if (!E.equal_deep(a[key], b[key])) return false; } return true; } return false; }; // like _.map() except returns object, not array E.map_obj = function(obj, fn){ var ret = {}; for (var i in obj) ret[i] = fn(obj[i], i, obj); return ret; }; // recursivelly recreate objects with keys added in order E.sort_obj = function(obj, fn){ if (obj instanceof Array || !(obj instanceof Object)) return obj; var ret = {}, keys = Object.keys(obj).sort(fn); for (var i=0; i<keys.length; i++) ret[keys[i]] = E.sort_obj(obj[keys[i]], fn); return ret; }; // an Object equivalent of Array.prototype.forEach E.forEach = function(obj, fn, _this){ for (var i in obj) fn.call(_this, obj[i], i, obj); }; // an Object equivalent of Array.prototype.find E.find = function(obj, fn, _this){ for (var i in obj) { if (fn.call(_this, obj[i], i, obj)) return obj[i]; } }; E.find_prop = function(obj, prop, val){ return E.find(obj, function(o){ return o[prop]===val; }); }; E.isspace = function(c){ return /\s/.test(c); }; E.isdigit = function(c){ return c>='0' && c<='9'; }; E.isalpha = function(c){ return c>='a'&&c<='z' || c>='A'&&c<='Z'; }; E.isalnum = function(c){ return E.isdigit(c)||E.isalpha(c); }; E.obj_pluck = function(obj, prop){ var val = obj[prop]; delete obj[prop]; return val; }; // Object.keys() does not work on prototype E.proto_keys = function(proto){ var keys = []; for (var i in proto) keys.push(i); return keys; }; E.values = function(obj){ var values = []; for (var i in obj) values.push(obj[i]); return values; }; E.path = function(path){ if (Array.isArray(path)) return path; path = ''+path; if (!path) return []; return path.split('.'); }; E.get = function(o, path, def){ path = E.path(path); for (var i=0; i<path.length; i++) { // XXX vladimir/ron: decide on implementation without in operator if (!o || typeof o!='object'&&typeof o!='function' || !(path[i] in o)) return def; o = o[path[i]]; } return o; }; E.set = function(o, path, value){ var orig = o; path = E.path(path); for (var i=0; i<path.length-1; i++) { var p = path[i]; o = o[p] || (o[p] = {}); } o[path[path.length-1]] = value; return orig; }; E.unset = function(o, path){ path = E.path(path); for (var i=0; i<path.length-1; i++) { var p = path[i]; if (!o[p]) return; o = o[p]; } delete o[path[path.length-1]]; }; var has_unique = {}; E.has = function(o, path){ return E.get(o, path, has_unique)!==has_unique; }; E.own = function(o, prop){ return o!=null && Object.prototype.hasOwnProperty.call(o, prop); }; E.bool_lookup = function(a, split){ var ret = {}, i; if (typeof a=='string') a = a.split(split||/\s/); for (i=0; i<a.length; i++) ret[a[i]] = true; return ret; }; E.clone_inplace = function(dst, src){ if (dst===src) return dst; if (Array.isArray(dst)) { for (var i=0; i<src.length; i++) dst[i] = src[i]; dst.splice(src.length); } else if (typeof dst=='object') { var k; for (k in src) dst[k] = src[k]; for (k in dst) { if (!src.hasOwnProperty(k)) delete dst[k]; } } return dst; }; if (node_util && node_util.inherits) E.inherits = node_util.inherits; else { // implementation from node.js 'util' module E.inherits = function inherits(ctor, superCtor){ ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, {constructor: {value: ctor, enumerable: false, writable: true, configurable: true}}); }; } // ctor must only have one prototype level // XXX vladislav: ES6 class is not supported for ctor E.inherit_init = function(obj, ctor, params){ var orig_proto = Object.getPrototypeOf(obj); var ctor_proto = Object.assign({}, ctor.prototype); Object.setPrototypeOf(ctor_proto, orig_proto); Object.setPrototypeOf(obj, ctor_proto); return ctor.apply(obj, params); }; E.pick = function(obj){ var i, j, o = {}; for (i=1; i<arguments.length; i++) { var fields = E.ensure_array(arguments[i]); for (j=0; j<fields.length; j++) { if (E.own(obj, fields[j])) o[fields[j]] = obj[fields[j]]; } } return o; }; // subset of _.omit E.omit = function(obj, omit){ var i, o = {}; obj = Object(obj); for (i in obj) { if (!omit.includes(i)) o[i] = obj[i]; } return o; }; E.if_set = function(val, o, name){ if (val!==undefined) o[name] = val; }; E.escape_dotted_keys = function(obj, repl){ if (!Array.isArray(obj) && !E.is_object(obj)) return obj; repl = repl||'_'; for (var prop in obj) { if (E.own(obj, prop)) { var new_prop = prop.replace(/\./g, repl); if (prop != new_prop) { obj[new_prop] = obj[prop]; delete obj[prop]; } if (Array.isArray(obj[new_prop])) { obj[new_prop].forEach(function(e){ E.escape_dotted_keys(e, repl); }); } else if (E.is_object(obj[new_prop])) E.escape_dotted_keys(obj[new_prop], repl); } } }; E.ensure_array = function(v, split){ if (v==null || Array.isArray(v)) return v||[]; if (split && typeof v=='string') return v.split(split==true ? /[\s,]+/ : split).filter(Boolean); return [v]; }; E.reduce_obj = function(coll, key_cb, val_cb){ if (coll==null) return {}; if (key_cb==null) key_cb = function(it){ return it; }; else if (typeof key_cb=='string') { var kpath = E.path(key_cb); key_cb = function(it){ return E.get(it, kpath); }; } if (val_cb==null) val_cb = function(it){ return it; }; else if (typeof val_cb=='string') { var vpath = E.path(val_cb); val_cb = function(it){ return E.get(it, vpath); }; } var obj = {}; if (Array.isArray(coll)) { coll.forEach(function(item, i){ var k = key_cb(item, i), v = val_cb(item, i); if (k!==undefined && v!==undefined) obj[k] = v; }); } else if (typeof coll=='object') { Object.keys(coll).forEach(function(i){ var k = key_cb(coll[i], i), v = val_cb(coll[i], i); if (k!==undefined && v!==undefined) obj[k] = v; }); } return obj; }; E.flatten_obj = function(obj){ if (!E.is_object(obj) && !Array.isArray(obj)) return obj; var res = {}, k, keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { k = keys[i]; if (!E.is_object(obj[k]) && !Array.isArray(obj[k])) res[k] = obj[k]; else { var o = E.flatten_obj(obj[keys[i]]), _keys = Object.keys(o); for (var j = 0; j < _keys.length; j++) res[k+'_'+_keys[j]] = o[_keys[j]]; } } return res; }; return E; }); }());