This is an automated email from the ASF dual-hosted git repository. jkevan pushed a commit to branch backport-UNOMI-758 in repository https://gitbox.apache.org/repos/asf/unomi.git
commit edff92fde5578016a62f0483c1d48264cd7e1375 Author: Kevan <ke...@jahia.com> AuthorDate: Fri Mar 31 11:23:21 2023 +0200 fix cherry-pick --- .../web-tracker/wab/dist/unomi-web-tracker.js | 3867 -------------------- .../web-tracker/wab/dist/unomi-web-tracker.js.map | 1 - .../web-tracker/wab/dist/unomi-web-tracker.min.js | 1 - 3 files changed, 3869 deletions(-) diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.js b/extensions/web-tracker/wab/dist/unomi-web-tracker.js deleted file mode 100644 index 334517d2b..000000000 --- a/extensions/web-tracker/wab/dist/unomi-web-tracker.js +++ /dev/null @@ -1,3867 +0,0 @@ -(function () { - 'use strict'; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - var global$1 = (typeof global !== "undefined" ? global : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - - var lookup = []; - var revLookup = []; - var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; - var inited = false; - function init () { - inited = true; - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i]; - revLookup[code.charCodeAt(i)] = i; - } - - revLookup['-'.charCodeAt(0)] = 62; - revLookup['_'.charCodeAt(0)] = 63; - } - - function toByteArray (b64) { - if (!inited) { - init(); - } - var i, j, l, tmp, placeHolders, arr; - var len = b64.length; - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders); - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len; - - var L = 0; - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; - arr[L++] = (tmp >> 16) & 0xFF; - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); - arr[L++] = tmp & 0xFF; - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - return arr - } - - function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] - } - - function encodeChunk (uint8, start, end) { - var tmp; - var output = []; - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); - output.push(tripletToBase64(tmp)); - } - return output.join('') - } - - function fromByteArray (uint8) { - if (!inited) { - init(); - } - var tmp; - var len = uint8.length; - var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes - var output = ''; - var parts = []; - var maxChunkLength = 16383; // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1]; - output += lookup[tmp >> 2]; - output += lookup[(tmp << 4) & 0x3F]; - output += '=='; - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); - output += lookup[tmp >> 10]; - output += lookup[(tmp >> 4) & 0x3F]; - output += lookup[(tmp << 2) & 0x3F]; - output += '='; - } - - parts.push(output); - - return parts.join('') - } - - function read (buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? (nBytes - 1) : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) - } - - function write (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); - var i = isLE ? 0 : (nBytes - 1); - var d = isLE ? 1 : -1; - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128; - } - - var toString = {}.toString; - - var isArray = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; - }; - - /*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh <fer...@feross.org> <http://feross.org> - * @license MIT - */ - - var INSPECT_MAX_BYTES = 50; - - /** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ - Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined - ? global$1.TYPED_ARRAY_SUPPORT - : true; - - /* - * Export kMaxLength after typed array support is determined. - */ - kMaxLength(); - - function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff - } - - function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length); - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length); - } - that.length = length; - } - - return that - } - - /** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - - function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from(this, arg, encodingOrOffset, length) - } - - Buffer.poolSize = 8192; // not used by this implementation - - // TODO: Legacy, not needed anymore. Remove in next major version. - Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype; - return arr - }; - - function from (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) - } - - /** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ - Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) - }; - - if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype; - Buffer.__proto__ = Uint8Array; - } - - function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } - } - - function alloc (that, size, fill, encoding) { - assertSize(size); - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) - } - - /** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ - Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) - }; - - function allocUnsafe (that, size) { - assertSize(size); - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0; - } - } - return that - } - - /** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ - Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) - }; - /** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ - Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) - }; - - function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8'; - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0; - that = createBuffer(that, length); - - var actual = that.write(string, encoding); - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual); - } - - return that - } - - function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0; - that = createBuffer(that, length); - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255; - } - return that - } - - function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength; // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array); - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset); - } else { - array = new Uint8Array(array, byteOffset, length); - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array; - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array); - } - return that - } - - function fromObject (that, obj) { - if (internalIsBuffer(obj)) { - var len = checked(obj.length) | 0; - that = createBuffer(that, len); - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len); - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) - } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') - } - - function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 - } - Buffer.isBuffer = isBuffer; - function internalIsBuffer (b) { - return !!(b != null && b._isBuffer) - } - - Buffer.compare = function compare (a, b) { - if (!internalIsBuffer(a) || !internalIsBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 - }; - - Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } - }; - - Buffer.concat = function concat (list, length) { - if (!isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i; - if (length === undefined) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - - var buffer = Buffer.allocUnsafe(length); - var pos = 0; - for (i = 0; i < list.length; ++i) { - var buf = list[i]; - if (!internalIsBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer - }; - - function byteLength (string, encoding) { - if (internalIsBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string; - } - - var len = string.length; - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } - } - Buffer.byteLength = byteLength; - - function slowToString (encoding, start, end) { - var loweredCase = false; - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0; - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length; - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0; - start >>>= 0; - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8'; - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase(); - loweredCase = true; - } - } - } - - // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect - // Buffer instances. - Buffer.prototype._isBuffer = true; - - function swap (b, n, m) { - var i = b[n]; - b[n] = b[m]; - b[m] = i; - } - - Buffer.prototype.swap16 = function swap16 () { - var len = this.length; - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1); - } - return this - }; - - Buffer.prototype.swap32 = function swap32 () { - var len = this.length; - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3); - swap(this, i + 1, i + 2); - } - return this - }; - - Buffer.prototype.swap64 = function swap64 () { - var len = this.length; - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7); - swap(this, i + 1, i + 6); - swap(this, i + 2, i + 5); - swap(this, i + 3, i + 4); - } - return this - }; - - Buffer.prototype.toString = function toString () { - var length = this.length | 0; - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) - }; - - Buffer.prototype.equals = function equals (b) { - if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 - }; - - Buffer.prototype.inspect = function inspect () { - var str = ''; - var max = INSPECT_MAX_BYTES; - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); - if (this.length > max) str += ' ... '; - } - return '<Buffer ' + str + '>' - }; - - Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!internalIsBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0; - } - if (end === undefined) { - end = target ? target.length : 0; - } - if (thisStart === undefined) { - thisStart = 0; - } - if (thisEnd === undefined) { - thisEnd = this.length; - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - - if (this === target) return 0 - - var x = thisEnd - thisStart; - var y = end - start; - var len = Math.min(x, y); - - var thisCopy = this.slice(thisStart, thisEnd); - var targetCopy = target.slice(start, end); - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 - }; - - // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, - // OR the last index of `val` in `buffer` at offset <= `byteOffset`. - // - // Arguments: - // - buffer - a Buffer to search - // - val - a string, Buffer, or number - // - byteOffset - an index into `buffer`; will be clamped to an int32 - // - encoding - an optional encoding, relevant is val is a string - // - dir - true for indexOf, false for lastIndexOf - function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff; - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000; - } - byteOffset = +byteOffset; // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1); - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) byteOffset = 0; - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding); - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (internalIsBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF; // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') - } - - function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1; - var arrLength = arr.length; - var valLength = val.length; - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase(); - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i; - if (dir) { - var foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i; - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex; - foundIndex = -1; - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - var found = true; - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break - } - } - if (found) return i - } - } - - return -1 - } - - Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 - }; - - Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) - }; - - Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) - }; - - function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0; - var remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; - } - } - - // must be an even number of digits - var strLen = string.length; - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2; - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16); - if (isNaN(parsed)) return i - buf[offset + i] = parsed; - } - return i - } - - function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) - } - - function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) - } - - function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) - } - - function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) - } - - function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) - } - - Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset; - length = this.length; - offset = 0; - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0; - if (isFinite(length)) { - length = length | 0; - if (encoding === undefined) encoding = 'utf8'; - } else { - encoding = length; - length = undefined; - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset; - if (length === undefined || length > remaining) length = remaining; - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8'; - - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } - }; - - Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } - }; - - function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return fromByteArray(buf) - } else { - return fromByteArray(buf.slice(start, end)) - } - } - - function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end); - var res = []; - - var i = start; - while (i < end) { - var firstByte = buf[i]; - var codePoint = null; - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1; - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint; - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte; - } - break - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint; - } - } - break - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint; - } - } - break - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint; - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD; - bytesPerSequence = 1; - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000; - res.push(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - - res.push(codePoint); - i += bytesPerSequence; - } - - return decodeCodePointsArray(res) - } - - // Based on http://stackoverflow.com/a/22747272/680742, the browser with - // the lowest limit is Chrome, with 0x10000 args. - // We go 1 magnitude less, for safety - var MAX_ARGUMENTS_LENGTH = 0x1000; - - function decodeCodePointsArray (codePoints) { - var len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = ''; - var i = 0; - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ); - } - return res - } - - function asciiSlice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F); - } - return ret - } - - function latin1Slice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret - } - - function hexSlice (buf, start, end) { - var len = buf.length; - - if (!start || start < 0) start = 0; - if (!end || end < 0 || end > len) end = len; - - var out = ''; - for (var i = start; i < end; ++i) { - out += toHex(buf[i]); - } - return out - } - - function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end); - var res = ''; - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res - } - - Buffer.prototype.slice = function slice (start, end) { - var len = this.length; - start = ~~start; - end = end === undefined ? len : ~~end; - - if (start < 0) { - start += len; - if (start < 0) start = 0; - } else if (start > len) { - start = len; - } - - if (end < 0) { - end += len; - if (end < 0) end = 0; - } else if (end > len) { - end = len; - } - - if (end < start) end = start; - - var newBuf; - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end); - newBuf.__proto__ = Buffer.prototype; - } else { - var sliceLen = end - start; - newBuf = new Buffer(sliceLen, undefined); - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start]; - } - } - - return newBuf - }; - - /* - * Need to make sure that buffer isn't trying to write out of bounds. - */ - function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') - } - - Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - - return val - }; - - Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - checkOffset(offset, byteLength, this.length); - } - - var val = this[offset + --byteLength]; - var mul = 1; - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul; - } - - return val - }; - - Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - return this[offset] - }; - - Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return this[offset] | (this[offset + 1] << 8) - }; - - Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return (this[offset] << 8) | this[offset + 1] - }; - - Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) - }; - - Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) - }; - - Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val - }; - - Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); - - var i = byteLength; - var mul = 1; - var val = this[offset + --i]; - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul; - } - mul *= 0x80; - - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - - return val - }; - - Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) - }; - - Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset] | (this[offset + 1] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val - }; - - Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset + 1] | (this[offset] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val - }; - - Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) - }; - - Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) - }; - - Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, true, 23, 4) - }; - - Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, false, 23, 4) - }; - - Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, true, 52, 8) - }; - - Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, false, 52, 8) - }; - - function checkInt (buf, value, offset, ext, max, min) { - if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') - } - - Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var mul = 1; - var i = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength - }; - - Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } - - var i = byteLength - 1; - var mul = 1; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - - return offset + byteLength - }; - - Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - this[offset] = (value & 0xff); - return offset + 1 - }; - - function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8; - } - } - - Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 - }; - - Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 - }; - - function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; - } - } - - Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24); - this[offset + 2] = (value >>> 16); - this[offset + 1] = (value >>> 8); - this[offset] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 - }; - - Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 - }; - - Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = 0; - var mul = 1; - var sub = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength - }; - - Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } - - var i = byteLength - 1; - var mul = 1; - var sub = 0; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - - return offset + byteLength - }; - - Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - if (value < 0) value = 0xff + value + 1; - this[offset] = (value & 0xff); - return offset + 1 - }; - - Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 - }; - - Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 - }; - - Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - this[offset + 2] = (value >>> 16); - this[offset + 3] = (value >>> 24); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 - }; - - Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (value < 0) value = 0xffffffff + value + 1; - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 - }; - - function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') - } - - function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4); - } - write(buf, value, offset, littleEndian, 23, 4); - return offset + 4 - } - - Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) - }; - - Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) - }; - - function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8); - } - write(buf, value, offset, littleEndian, 52, 8); - return offset + 8 - } - - Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) - }; - - Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) - }; - - // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) - Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0; - if (!end && end !== 0) end = this.length; - if (targetStart >= target.length) targetStart = target.length; - if (!targetStart) targetStart = 0; - if (end > 0 && end < start) end = start; - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } - - var len = end - start; - var i; - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start]; - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start]; - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ); - } - - return len - }; - - // Usage: - // buffer.fill(number[, offset[, end]]) - // buffer.fill(buffer[, offset[, end]]) - // buffer.fill(string[, offset[, end]][, encoding]) - Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === 'string') { - encoding = end; - end = this.length; - } - if (val.length === 1) { - var code = val.charCodeAt(0); - if (code < 256) { - val = code; - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255; - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0; - end = end === undefined ? this.length : end >>> 0; - - if (!val) val = 0; - - var i; - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val; - } - } else { - var bytes = internalIsBuffer(val) - ? val - : utf8ToBytes(new Buffer(val, encoding).toString()); - var len = bytes.length; - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; - } - } - - return this - }; - - // HELPER FUNCTIONS - // ================ - - var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; - - function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, ''); - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '='; - } - return str - } - - function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') - } - - function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) - } - - function utf8ToBytes (string, units) { - units = units || Infinity; - var codePoint; - var length = string.length; - var leadSurrogate = null; - var bytes = []; - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } - - // valid lead - leadSurrogate = codePoint; - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - leadSurrogate = codePoint; - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - } - - leadSurrogate = null; - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint); - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else { - throw new Error('Invalid code point') - } - } - - return bytes - } - - function asciiToBytes (str) { - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF); - } - return byteArray - } - - function utf16leToBytes (str, units) { - var c, hi, lo; - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - - return byteArray - } - - - function base64ToBytes (str) { - return toByteArray(base64clean(str)) - } - - function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i]; - } - return i - } - - function isnan (val) { - return val !== val // eslint-disable-line no-self-compare - } - - - // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence - // The _isBuffer check is for Safari 5-7 support, because it's missing - // Object.prototype.constructor. Remove this eventually - function isBuffer(obj) { - return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) - } - - function isFastBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) - } - - // For Node v0.10 support. Remove this eventually. - function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) - } - - class Provider$3 { - constructor() {} - - getAll() { - return this.data; - } - - } - - var provider = Provider$3; - - const Provider$2 = provider; - - class Crawlers$1 extends Provider$2 { - constructor() { - super(); - this.data = [' YLT', '^Aether', '^Amazon Simple Notification Service Agent$', '^Amazon-Route53-Health-Check-Service', '^b0t$', '^bluefish ', '^Calypso v\\/', '^COMODO DCV', '^Corax', '^DangDang', '^DavClnt', '^DHSH', '^docker\\/[0-9]', '^Expanse', '^FDM ', '^git\\/', '^Goose\\/', '^Grabber', '^Gradle\\/', '^HTTPClient\\/', '^HTTPing', '^Java\\/', '^Jeode\\/', '^Jetty\\/', '^Mail\\/', '^Mget', '^Microsoft URL Control', '^Mikrotik\\/', '^Netlab360', '^NG\\/[0-9\\.]', '^NING\\/', '^np [...] - } - - } - - var crawlers = Crawlers$1; - - const Provider$1 = provider; - - class Exclusions$1 extends Provider$1 { - constructor() { - super(); - this.data = ['Safari.[\\d\\.]*', 'Firefox.[\\d\\.]*', ' Chrome.[\\d\\.]*', 'Chromium.[\\d\\.]*', 'MSIE.[\\d\\.]', 'Opera\\/[\\d\\.]*', 'Mozilla.[\\d\\.]*', 'AppleWebKit.[\\d\\.]*', 'Trident.[\\d\\.]*', 'Windows NT.[\\d\\.]*', 'Android [\\d\\.]*', 'Macintosh.', 'Ubuntu', 'Linux', '[ ]Intel', 'Mac OS X [\\d_]*', '(like )?Gecko(.[\\d\\.]*)?', 'KHTML,', 'CriOS.[\\d\\.]*', 'CPU iPhone OS ([0-9_])* like Mac OS X', 'CPU OS ([0-9_])* like Mac OS X', 'iPod', 'compatible', 'x86_..', 'i686', [...] - } - - } - - var exclusions = Exclusions$1; - - const Provider = provider; - - class Headers$1 extends Provider { - constructor() { - super(); - this.data = ['USER-AGENT', 'X-OPERAMINI-PHONE-UA', 'X-DEVICE-USER-AGENT', 'X-ORIGINAL-USER-AGENT', 'X-SKYFIRE-PHONE', 'X-BOLT-PHONE-UA', 'DEVICE-STOCK-UA', 'X-UCBROWSER-DEVICE-UA', 'FROM', 'X-SCANNER']; - } - - } - - var headers = Headers$1; - - const Crawlers = crawlers; - const Exclusions = exclusions; - const Headers = headers; - - class Crawler$1 { - constructor(request, headers, userAgent) { - /** - * Init classes - */ - this._init(); - /** - * This request must be an object - */ - - - this.request = typeof request === 'object' ? request : {}; // The regex-list must not be used with g-flag! - // See: https://stackoverflow.com/questions/1520800/why-does-a-regexp-with-global-flag-give-wrong-results - - this.compiledRegexList = this.compileRegex(this.crawlers.getAll(), 'i'); // The exclusions should be used with g-flag in order to remove each value. - - this.compiledExclusions = this.compileRegex(this.exclusions.getAll(), 'gi'); - /** - * Set http headers - */ - - this.setHttpHeaders(headers); - /** - * Set userAgent - */ - - this.userAgent = this.setUserAgent(userAgent); - } - /** - * Init Classes Instances - */ - - - _init() { - this.crawlers = new Crawlers(); - this.headers = new Headers(); - this.exclusions = new Exclusions(); - } - - compileRegex(patterns, flags) { - return new RegExp(patterns.join('|'), flags); - } - /** - * Set HTTP headers. - */ - - - setHttpHeaders(headers) { - // Use the Request headers if httpHeaders is not defined - if (typeof headers === 'undefined' || Object.keys(headers).length === 0) { - headers = Object.keys(this.request).length ? this.request.headers : {}; - } // Save the headers. - - - this.httpHeaders = headers; - } - /** - * Set user agent - */ - - - setUserAgent(userAgent) { - if (typeof userAgent === 'undefined' || userAgent === null || !userAgent.length) { - for (const header of this.getUaHttpHeaders()) { - if (Object.keys(this.httpHeaders).indexOf(header.toLowerCase()) >= 0) { - userAgent += this.httpHeaders[header.toLowerCase()] + ' '; - } - } - } - - return userAgent; - } - /** - * Get user agent headers - */ - - - getUaHttpHeaders() { - return this.headers.getAll(); - } - /** - * Check user agent string against the regex. - */ - - - isCrawler(userAgent = undefined) { - if (Buffer.byteLength(userAgent || '', 'utf8') > 4096) { - return false; - } - - var agent = typeof userAgent === 'undefined' || userAgent === null ? this.userAgent : userAgent; // test on compiled regx - - agent = agent.replace(this.compiledExclusions, ''); - - if (agent.trim().length === 0) { - return false; - } - - var matches = this.compiledRegexList.exec(agent); - - if (matches) { - this.matches = matches; - } - - return matches !== null ? matches.length ? true : false : false; - } - /** - * Return the matches. - */ - - - getMatches() { - return this.matches !== undefined ? this.matches.length ? this.matches[0] : null : {}; - } - - } - - var crawler = Crawler$1; - - const Crawler = crawler; - var src = { - Crawler, - - middleware(cb) { - return (req, res, next) => { - // If there is a cb, execute it - if (typeof cb === 'function') { - cb.call(req, res); - } // Initiate - - - req.Crawler = new Crawler(req); - next(); - }; - } - - }; - - /** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - function _createForOfIteratorHelper(o, allowArrayLike) { - var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; - - if (!it) { - if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { - if (it) o = it; - var i = 0; - - var F = function F() {}; - - return { - s: F, - n: function n() { - if (i >= o.length) return { - done: true - }; - return { - done: false, - value: o[i++] - }; - }, - e: function e(_e) { - throw _e; - }, - f: F - }; - } - - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var normalCompletion = true, - didErr = false, - err; - return { - s: function s() { - it = it.call(o); - }, - n: function n() { - var step = it.next(); - normalCompletion = step.done; - return step; - }, - e: function e(_e2) { - didErr = true; - err = _e2; - }, - f: function f() { - try { - if (!normalCompletion && it.return != null) it.return(); - } finally { - if (didErr) throw err; - } - } - }; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - var newTracker = function newTracker() { - var wem = { - /** - * This function initialize the tracker - * - * @param {object} digitalData config of the tracker - * @returns {undefined} - */ - initTracker: function initTracker(digitalData) { - wem.digitalData = digitalData; - wem.trackerProfileIdCookieName = wem.digitalData.wemInitConfig.trackerProfileIdCookieName ? wem.digitalData.wemInitConfig.trackerProfileIdCookieName : 'wem-profile-id'; - wem.trackerSessionIdCookieName = wem.digitalData.wemInitConfig.trackerSessionIdCookieName ? wem.digitalData.wemInitConfig.trackerSessionIdCookieName : 'wem-session-id'; - wem.browserGeneratedSessionSuffix = wem.digitalData.wemInitConfig.browserGeneratedSessionSuffix ? wem.digitalData.wemInitConfig.browserGeneratedSessionSuffix : ''; - wem.disableTrackedConditionsListeners = wem.digitalData.wemInitConfig.disableTrackedConditionsListeners; - wem.activateWem = wem.digitalData.wemInitConfig.activateWem; - var _wem$digitalData$wemI = wem.digitalData.wemInitConfig, - contextServerUrl = _wem$digitalData$wemI.contextServerUrl, - timeoutInMilliseconds = _wem$digitalData$wemI.timeoutInMilliseconds, - contextServerCookieName = _wem$digitalData$wemI.contextServerCookieName; - wem.contextServerCookieName = contextServerCookieName; - wem.contextServerUrl = contextServerUrl; - wem.timeoutInMilliseconds = timeoutInMilliseconds; - wem.formNamesToWatch = []; - wem.eventsPrevented = []; - wem.sessionID = wem.getCookie(wem.trackerSessionIdCookieName); - wem.fallback = false; - - if (wem.sessionID === null) { - console.warn('[WEM] sessionID is null !'); - } else if (!wem.sessionID || wem.sessionID === '') { - console.warn('[WEM] empty sessionID, setting to null !'); - wem.sessionID = null; - } - }, - - /** - * This function start the tracker by loading the context in the page - * Note: that the tracker will start once the current DOM is complete loaded, using listener on current document: DOMContentLoaded - * - * @param {object[]} digitalDataOverrides optional, list of digitalData extensions, they will be merged with original digitalData before context loading - * @returns {undefined} - */ - startTracker: function startTracker() { - var digitalDataOverrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; // Check before start - - var cookieDisabled = !navigator.cookieEnabled; - var noSessionID = !wem.sessionID || wem.sessionID === ''; - var crawlerDetected = navigator.userAgent; - - if (crawlerDetected) { - var browserDetector = new src.Crawler(); - crawlerDetected = browserDetector.isCrawler(navigator.userAgent); - } - - if (cookieDisabled || noSessionID || crawlerDetected) { - document.addEventListener('DOMContentLoaded', function () { - wem._executeFallback('navigator cookie disabled: ' + cookieDisabled + ', no sessionID: ' + noSessionID + ', web crawler detected: ' + crawlerDetected); - }); - return; - } // Register base context callback - - - wem._registerCallback(function () { - if (wem.cxs.profileId) { - wem.setCookie(wem.trackerProfileIdCookieName, wem.cxs.profileId); - } - - if (!wem.cxs.profileId) { - wem.removeCookie(wem.trackerProfileIdCookieName); - } - - if (!wem.disableTrackedConditionsListeners) { - wem._registerListenersForTrackedConditions(); - } - }, 'Default tracker', 0); // Load the context once document is ready - - - document.addEventListener('DOMContentLoaded', function () { - wem.DOMLoaded = true; // enrich digital data considering extensions - - wem._handleDigitalDataOverrides(digitalDataOverrides); // complete already registered events - - - wem._checkUncompleteRegisteredEvents(); // Dispatch javascript events for the experience (perso/opti displayed from SSR, based on unomi events) - - - wem._dispatchJSExperienceDisplayedEvents(); // Some event may not need to be send to unomi, check for them and filter them out. - - - wem._filterUnomiEvents(); // Add referrer info into digitalData.page object. - - - wem._processReferrer(); // Build view event - - - var viewEvent = wem.buildEvent('view', wem.buildTargetPage(), wem.buildSource(wem.digitalData.site.siteInfo.siteID, 'site')); - viewEvent.flattenedProperties = {}; // Add URLParameters - - if (location.search) { - viewEvent.flattenedProperties['URLParameters'] = wem.convertUrlParametersToObj(location.search); - } // Add interests - - - if (wem.digitalData.interests) { - viewEvent.flattenedProperties['interests'] = wem.digitalData.interests; - } // Register the page view event, it's unshift because it should be the first event, this is just for logical purpose. (page view comes before perso displayed event for example) - - - wem._registerEvent(viewEvent, true); - - if (wem.activateWem) { - wem.loadContext(); - } else { - wem._executeFallback('wem is not activated on current page'); - } - }); - }, - - /** - * get the current loaded context from Unomi, will be accessible only after loadContext() have been performed - * @returns {object} loaded context - */ - getLoadedContext: function getLoadedContext() { - return wem.cxs; - }, - - /** - * In case Unomi contains rules related to HTML forms in the current page. - * The logic is simple, in case a rule exists in Unomi targeting a form event within the current webpage path - * - then this form will be identified as form to be watched. - * You can reuse this function to get the list of concerned forms in order to attach listeners automatically for those form for example - * (not that current tracker is doing that by default, check function: _registerListenersForTrackedConditions()) - * @returns {string[]} form names/ids in current web page - */ - getFormNamesToWatch: function getFormNamesToWatch() { - return wem.formNamesToWatch; - }, - - /** - * Get current session id - * @returns {null|string} get current session id - */ - getSessionId: function getSessionId() { - return wem.sessionID; - }, - - /** - * This function will register a personalization - * - * @param {object} personalization the personalization object - * @param {object} variants the variants - * @param {boolean} [ajax] Deprecated: Ajax rendering is not supported anymore - * @param {function} [resultCallback] the callback to be executed after personalization resolved - * @returns {undefined} - */ - registerPersonalizationObject: function registerPersonalizationObject(personalization, variants, ajax, resultCallback) { - var target = personalization.id; - - wem._registerPersonalizationCallback(personalization, function (result, additionalResultInfos) { - var selectedFilter = null; - var successfulFilters = []; - var inControlGroup = additionalResultInfos && additionalResultInfos.inControlGroup; // In case of control group Unomi is not resolving any strategy or fallback for us. So we have to do the fallback here. - - if (inControlGroup && personalization.strategyOptions && personalization.strategyOptions.fallback) { - selectedFilter = variants[personalization.strategyOptions.fallback]; - successfulFilters.push(selectedFilter); - } else { - for (var i = 0; i < result.length; i++) { - successfulFilters.push(variants[result[i]]); - } - - if (successfulFilters.length > 0) { - selectedFilter = successfulFilters[0]; - var minPos = successfulFilters[0].position; - - if (minPos >= 0) { - for (var j = 1; j < successfulFilters.length; j++) { - if (successfulFilters[j].position < minPos) { - selectedFilter = successfulFilters[j]; - } - } - } - } - } - - if (resultCallback) { - // execute callback - resultCallback(successfulFilters, selectedFilter); - } else { - if (selectedFilter) { - var targetFilters = document.getElementById(target).children; - - for (var fIndex in targetFilters) { - var filter = targetFilters.item(fIndex); - - if (filter) { - filter.style.display = filter.id === selectedFilter.content ? '' : 'none'; - } - } // we now add control group information to event if the user is in the control group. - - - if (inControlGroup) { - console.info('[WEM] Profile is in control group for target: ' + target + ', adding to personalization event...'); - selectedFilter.event.target.properties.inControlGroup = true; - - if (selectedFilter.event.target.properties.variants) { - selectedFilter.event.target.properties.variants.forEach(function (variant) { - return variant.inControlGroup = true; - }); - } - } // send event to unomi - - - wem.collectEvent(wem._completeEvent(selectedFilter.event), function () { - console.info('[WEM] Personalization event successfully collected.'); - }, function () { - console.error('[WEM] Could not send personalization event.'); - }); //Trigger variant display event for personalization - - wem._dispatchJSExperienceDisplayedEvent(selectedFilter.event); - } else { - var elements = document.getElementById(target).children; - - for (var eIndex in elements) { - var el = elements.item(eIndex); - el.style.display = 'none'; - } - } - } - }); - }, - - /** - * This function will register an optimization test or A/B test - * - * @param {string} optimizationTestNodeId the optimization test node id - * @param {string} goalId the associated goal Id - * @param {string} containerId the HTML container Id - * @param {object} variants the variants - * @param {boolean} [ajax] Deprecated: Ajax rendering is not supported anymore - * @param {object} [variantsTraffic] the associated traffic allocation - * @return {undefined} - */ - registerOptimizationTest: function registerOptimizationTest(optimizationTestNodeId, goalId, containerId, variants, ajax, variantsTraffic) { - // check persona panel forced variant - var selectedVariantId = wem.getUrlParameter('wemSelectedVariantId-' + optimizationTestNodeId); // check already resolved variant stored in local - - if (selectedVariantId === null) { - if (wem.storageAvailable('sessionStorage')) { - selectedVariantId = sessionStorage.getItem(optimizationTestNodeId); - } else { - selectedVariantId = wem.getCookie('selectedVariantId'); - - if (selectedVariantId != null && selectedVariantId === '') { - selectedVariantId = null; - } - } - } // select random variant and call unomi - - - if (!(selectedVariantId && variants[selectedVariantId])) { - var keys = Object.keys(variants); - - if (variantsTraffic) { - var rand = 100 * Math.random() << 0; - - for (var nodeIdentifier in variantsTraffic) { - if ((rand -= variantsTraffic[nodeIdentifier]) < 0 && selectedVariantId == null) { - selectedVariantId = nodeIdentifier; - } - } - } else { - selectedVariantId = keys[keys.length * Math.random() << 0]; - } - - if (wem.storageAvailable('sessionStorage')) { - sessionStorage.setItem(optimizationTestNodeId, selectedVariantId); - } else { - wem.setCookie('selectedVariantId', selectedVariantId, 1); - } // spread event to unomi - - - wem._registerEvent(wem._completeEvent(variants[selectedVariantId].event)); - } //Trigger variant display event for optimization - // (Wrapped in DOMContentLoaded because opti are resulted synchronously at page load, so we dispatch the JS even after page load, to be sure that listeners are ready) - - - window.addEventListener('DOMContentLoaded', function () { - wem._dispatchJSExperienceDisplayedEvent(variants[selectedVariantId].event); - }); - - if (selectedVariantId) { - // update persona panel selected variant - if (window.optimizedContentAreas && window.optimizedContentAreas[optimizationTestNodeId]) { - window.optimizedContentAreas[optimizationTestNodeId].selectedVariant = selectedVariantId; - } // display the good variant - - - document.getElementById(variants[selectedVariantId].content).style.display = ''; - } - }, - - /** - * This function is used to load the current context in the page - * - * @param {boolean} [skipEvents=false] Should we send the events - * @param {boolean} [invalidate=false] Should we invalidate the current context - * @param {boolean} [forceReload=false] This function contains an internal check to avoid loading of the context multiple times. - * But in some rare cases, it could be useful to force the reloading of the context and bypass the check. - * @return {undefined} - */ - loadContext: function loadContext() { - var skipEvents = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var invalidate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var forceReload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (wem.contextLoaded && !forceReload) { - console.log('Context already requested by', wem.contextLoaded); - return; - } - - var jsonData = { - requiredProfileProperties: wem.digitalData.wemInitConfig.requiredProfileProperties, - requiredSessionProperties: wem.digitalData.wemInitConfig.requiredSessionProperties, - requireSegments: wem.digitalData.wemInitConfig.requireSegments, - requireScores: wem.digitalData.wemInitConfig.requireScores, - source: wem.buildSourcePage() - }; - - if (!skipEvents) { - jsonData.events = wem.digitalData.events; - } - - if (wem.digitalData.personalizationCallback) { - jsonData.personalizations = wem.digitalData.personalizationCallback.map(function (x) { - return x.personalization; - }); - } - - jsonData.sessionId = wem.sessionID; - var contextUrl = wem.contextServerUrl + '/context.json'; - - if (invalidate) { - contextUrl += '?invalidateSession=true&invalidateProfile=true'; - } - - wem.ajax({ - url: contextUrl, - type: 'POST', - async: true, - contentType: 'text/plain;charset=UTF-8', - // Use text/plain to avoid CORS preflight - jsonData: jsonData, - dataType: 'application/json', - invalidate: invalidate, - success: wem._onSuccess, - error: function error() { - wem._executeFallback('error during context loading'); - } - }); - wem.contextLoaded = Error().stack; - console.info('[WEM] context loading...'); - }, - - /** - * This function will send an event to Apache Unomi - * @param {object} event The event object to send, you can build it using wem.buildEvent(eventType, target, source) - * @param {function} successCallback optional, will be executed in case of success - * @param {function} errorCallback optional, will be executed in case of error - * @return {undefined} - */ - collectEvent: function collectEvent(event) { - var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - wem.collectEvents({ - events: [event] - }, successCallback, errorCallback); - }, - - /** - * This function will send the events to Apache Unomi - * - * @param {object} events Javascript object { events: [event1, event2] } - * @param {function} successCallback optional, will be executed in case of success - * @param {function} errorCallback optional, will be executed in case of error - * @return {undefined} - */ - collectEvents: function collectEvents(events) { - var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - - if (wem.fallback) { - // in case of fallback we don't want to collect any events - return; - } - - events.sessionId = wem.sessionID ? wem.sessionID : ''; - var data = JSON.stringify(events); - wem.ajax({ - url: wem.contextServerUrl + '/eventcollector', - type: 'POST', - async: true, - contentType: 'text/plain;charset=UTF-8', - // Use text/plain to avoid CORS preflight - data: data, - dataType: 'application/json', - success: successCallback, - error: errorCallback - }); - }, - - /** - * This function will build an event of type click and send it to Apache Unomi - * - * @param {object} event javascript - * @param {function} [successCallback] optional, will be executed if case of success - * @param {function} [errorCallback] optional, will be executed if case of error - * @return {undefined} - */ - sendClickEvent: function sendClickEvent(event) { - var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - - if (event.target.id || event.target.name) { - console.info('[WEM] Send click event'); - var targetId = event.target.id ? event.target.id : event.target.name; - var clickEvent = wem.buildEvent('click', wem.buildTarget(targetId, event.target.localName), wem.buildSourcePage()); - var eventIndex = wem.eventsPrevented.indexOf(targetId); - - if (eventIndex !== -1) { - wem.eventsPrevented.splice(eventIndex, 0); - } else { - wem.eventsPrevented.push(targetId); - event.preventDefault(); - var target = event.target; - wem.collectEvent(clickEvent, function (xhr) { - console.info('[WEM] Click event successfully collected.'); - - if (successCallback) { - successCallback(xhr); - } else { - target.click(); - } - }, function (xhr) { - console.error('[WEM] Could not send click event.'); - - if (errorCallback) { - errorCallback(xhr); - } else { - target.click(); - } - }); - } - } - }, - - /** - * This function will build an event of type video and send it to Apache Unomi - * - * @param {object} event javascript - * @param {function} [successCallback] optional, will be executed if case of success - * @param {function} [errorCallback] optional, will be executed if case of error - * @return {undefined} - */ - sendVideoEvent: function sendVideoEvent(event) { - var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - console.info('[WEM] catching video event'); - var videoEvent = wem.buildEvent('video', wem.buildTarget(event.target.id, 'video', { - action: event.type - }), wem.buildSourcePage()); - wem.collectEvent(videoEvent, function (xhr) { - console.info('[WEM] Video event successfully collected.'); - - if (successCallback) { - successCallback(xhr); - } - }, function (xhr) { - console.error('[WEM] Could not send video event.'); - - if (errorCallback) { - errorCallback(xhr); - } - }); - }, - - /** - * This function will invalidate the Apache Unomi session and profile, - * by removing the associated cookies, set the loaded context to undefined - * and set the session id cookie with a newly generated ID - * @return {undefined} - */ - invalidateSessionAndProfile: function invalidateSessionAndProfile() { - wem.sessionID = wem.generateGuid() + wem.browserGeneratedSessionSuffix; - wem.setCookie(wem.trackerSessionIdCookieName, wem.sessionID, 1); - wem.removeCookie(wem.contextServerCookieName); - wem.removeCookie(wem.trackerProfileIdCookieName); - wem.cxs = undefined; - }, - - /** - * This function return the basic structure for an event, it must be adapted to your need - * - * @param {string} eventType The name of your event - * @param {object} [target] The target object for your event can be build with wem.buildTarget(targetId, targetType, targetProperties) - * @param {object} [source] The source object for your event can be build with wem.buildSource(sourceId, sourceType, sourceProperties) - * @returns {object} the event - */ - buildEvent: function buildEvent(eventType, target, source) { - var event = { - eventType: eventType, - scope: wem.digitalData.scope - }; - - if (target) { - event.target = target; - } - - if (source) { - event.source = source; - } - - return event; - }, - - /** - * This function return an event of type form - * - * @param {string} formName The HTML name of id of the form to use in the target of the event - * @param {HTMLFormElement} form optional HTML form element, if provided will be used to extract the form fields and populate the form event - * @returns {object} the form event - */ - buildFormEvent: function buildFormEvent(formName) { - var form = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var formEvent = wem.buildEvent('form', wem.buildTarget(formName, 'form'), wem.buildSourcePage()); - formEvent.flattenedProperties = { - fields: form ? wem._extractFormData(form) : {} - }; - return formEvent; - }, - - /** - * This function return the source object for a source of type page - * - * @returns {object} the target page - */ - buildTargetPage: function buildTargetPage() { - return wem.buildTarget(wem.digitalData.page.pageInfo.pageID, 'page', wem.digitalData.page); - }, - - /** - * This function return the source object for a source of type page - * - * @returns {object} the source page - */ - buildSourcePage: function buildSourcePage() { - return wem.buildSource(wem.digitalData.page.pageInfo.pageID, 'page', wem.digitalData.page); - }, - - /** - * This function return the basic structure for the target of your event - * - * @param {string} targetId The ID of the target - * @param {string} targetType The type of the target - * @param {object} [targetProperties] The optional properties of the target - * @returns {object} the target - */ - buildTarget: function buildTarget(targetId, targetType) { - var targetProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - return wem._buildObject(targetId, targetType, targetProperties); - }, - - /** - * This function return the basic structure for the source of your event - * - * @param {string} sourceId The ID of the source - * @param {string} sourceType The type of the source - * @param {object} [sourceProperties] The optional properties of the source - * @returns {object} the source - */ - buildSource: function buildSource(sourceId, sourceType) { - var sourceProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - return wem._buildObject(sourceId, sourceType, sourceProperties); - }, - - /*************************************/ - - /* Utility functions under this line */ - - /*************************************/ - - /** - * This is an utility function to set a cookie - * - * @param {string} cookieName name of the cookie - * @param {string} cookieValue value of the cookie - * @param {number} [expireDays] number of days to set the expire date - * @return {undefined} - */ - setCookie: function setCookie(cookieName, cookieValue, expireDays) { - var expires = ''; - - if (expireDays) { - var d = new Date(); - d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000); - expires = '; expires=' + d.toUTCString(); - } - - document.cookie = cookieName + '=' + cookieValue + expires + '; path=/; SameSite=Strict'; - }, - - /** - * This is an utility function to get a cookie - * - * @param {string} cookieName name of the cookie to get - * @returns {string} the value of the first cookie with the corresponding name or null if not found - */ - getCookie: function getCookie(cookieName) { - var name = cookieName + '='; - var ca = document.cookie.split(';'); - - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - - while (c.charAt(0) == ' ') { - c = c.substring(1); - } - - if (c.indexOf(name) == 0) { - return c.substring(name.length, c.length); - } - } - - return null; - }, - - /** - * This is an utility function to remove a cookie - * - * @param {string} cookieName the name of the cookie to rename - * @return {undefined} - */ - removeCookie: function removeCookie(cookieName) { - wem.setCookie(cookieName, '', -1); - }, - - /** - * This is an utility function to execute AJAX call - * - * @param {object} options options of the request - * @return {undefined} - */ - ajax: function ajax(options) { - var xhr = new XMLHttpRequest(); - - if ('withCredentials' in xhr) { - xhr.open(options.type, options.url, options.async); - xhr.withCredentials = true; - } else if (typeof XDomainRequest != 'undefined') { - /* global XDomainRequest */ - xhr = new XDomainRequest(); - xhr.open(options.type, options.url); - } - - if (options.contentType) { - xhr.setRequestHeader('Content-Type', options.contentType); - } - - if (options.dataType) { - xhr.setRequestHeader('Accept', options.dataType); - } - - if (options.responseType) { - xhr.responseType = options.responseType; - } - - var requestExecuted = false; - - if (wem.timeoutInMilliseconds !== -1) { - setTimeout(function () { - if (!requestExecuted) { - console.error('[WEM] XML request timeout, url: ' + options.url); - requestExecuted = true; - - if (options.error) { - options.error(xhr); - } - } - }, wem.timeoutInMilliseconds); - } - - xhr.onreadystatechange = function () { - if (!requestExecuted) { - if (xhr.readyState === 4) { - if (xhr.status === 200 || xhr.status === 204 || xhr.status === 304) { - if (xhr.responseText != null) { - requestExecuted = true; - - if (options.success) { - options.success(xhr); - } - } - } else { - requestExecuted = true; - - if (options.error) { - options.error(xhr); - } - - console.error('[WEM] XML request error: ' + xhr.statusText + ' (' + xhr.status + ')'); - } - } - } - }; - - if (options.jsonData) { - xhr.send(JSON.stringify(options.jsonData)); - } else if (options.data) { - xhr.send(options.data); - } else { - xhr.send(); - } - }, - - /** - * This is an utility function to generate a new UUID - * - * @returns {string} the newly generated UUID - */ - generateGuid: function generateGuid() { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); - }, - - /** - * This is an utility function to check if the local storage is available or not - * @param {string} type the type of storage to test - * @returns {boolean} true in case storage is available, false otherwise - */ - storageAvailable: function storageAvailable(type) { - try { - var storage = window[type], - x = '__storage_test__'; - storage.setItem(x, x); - storage.removeItem(x); - return true; - } catch (e) { - return false; - } - }, - - /** - * Dispatch a JavaScript event in current HTML document - * - * @param {string} name the name of the event - * @param {boolean} canBubble does the event can bubble ? - * @param {boolean} cancelable is the event cancelable ? - * @param {*} detail event details - * @return {undefined} - */ - dispatchJSEvent: function dispatchJSEvent(name, canBubble, cancelable, detail) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent(name, canBubble, cancelable, detail); - document.dispatchEvent(event); - }, - - /** - * Fill the wem.digitalData.displayedVariants with the javascript event passed as parameter - * @param {object} jsEvent javascript event - * @private - * @return {undefined} - */ - _fillDisplayedVariants: function _fillDisplayedVariants(jsEvent) { - if (!wem.digitalData.displayedVariants) { - wem.digitalData.displayedVariants = []; - } - - wem.digitalData.displayedVariants.push(jsEvent); - }, - - /** - * This is an utility function to get current url parameter value - * - * @param {string} name, the name of the parameter - * @returns {string} the value of the parameter - */ - getUrlParameter: function getUrlParameter(name) { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); - var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); - var results = regex.exec(window.location.search); - return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, ' ')); - }, - - /** - * convert the passed query string into JS object. - * @param {string} searchString The URL query string - * @returns {object} converted URL params - */ - convertUrlParametersToObj: function convertUrlParametersToObj(searchString) { - if (!searchString) { - return null; - } - - return searchString.replace(/^\?/, '') // Only trim off a single leading interrobang. - .split('&').reduce(function (result, next) { - if (next === '') { - return result; - } - - var pair = next.split('='); - var key = decodeURIComponent(pair[0]); - var value = typeof pair[1] !== 'undefined' && decodeURIComponent(pair[1]) || undefined; - - if (Object.prototype.hasOwnProperty.call(result, key)) { - // Check to see if this property has been met before. - if (Array.isArray(result[key])) { - // Is it already an array? - result[key].push(value); - } else { - // Make it an array. - result[key] = [result[key], value]; - } - } else { - // First time seen, just add it. - result[key] = value; - } - - return result; - }, {}); - }, - - /*************************************/ - - /* Private functions under this line */ - - /*************************************/ - - /** - * Used to override the default digitalData values, - * the result will impact directly the current instance wem.digitalData - * - * @param {object[]} digitalDataOverrides list of overrides - * @private - * @return {undefined} - */ - _handleDigitalDataOverrides: function _handleDigitalDataOverrides(digitalDataOverrides) { - if (digitalDataOverrides && digitalDataOverrides.length > 0) { - var _iterator = _createForOfIteratorHelper(digitalDataOverrides), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var digitalDataOverride = _step.value; - wem.digitalData = wem._deepMergeObjects(digitalDataOverride, wem.digitalData); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } - }, - - /** - * Check for tracked conditions in the current loaded context, and attach listeners for the known tracked condition types: - * - formEventCondition - * - videoViewEventCondition - * - clickOnLinkEventCondition - * - * @private - * @return {undefined} - */ - _registerListenersForTrackedConditions: function _registerListenersForTrackedConditions() { - console.info('[WEM] Check for tracked conditions and attach related HTML listeners'); - var videoNamesToWatch = []; - var clickToWatch = []; - - if (wem.cxs.trackedConditions && wem.cxs.trackedConditions.length > 0) { - for (var i = 0; i < wem.cxs.trackedConditions.length; i++) { - switch (wem.cxs.trackedConditions[i].type) { - case 'formEventCondition': - if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.formId) { - wem.formNamesToWatch.push(wem.cxs.trackedConditions[i].parameterValues.formId); - } - - break; - - case 'videoViewEventCondition': - if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.videoId) { - videoNamesToWatch.push(wem.cxs.trackedConditions[i].parameterValues.videoId); - } - - break; - - case 'clickOnLinkEventCondition': - if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.itemId) { - clickToWatch.push(wem.cxs.trackedConditions[i].parameterValues.itemId); - } - - break; - } - } - } - - var forms = document.querySelectorAll('form'); - - for (var formIndex = 0; formIndex < forms.length; formIndex++) { - var form = forms.item(formIndex); - var formName = form.getAttribute('name') ? form.getAttribute('name') : form.getAttribute('id'); // test attribute data-form-id to not add a listener on FF form - - if (formName && wem.formNamesToWatch.indexOf(formName) > -1 && form.getAttribute('data-form-id') == null) { - // add submit listener on form that we need to watch only - console.info('[WEM] Watching form ' + formName); - form.addEventListener('submit', wem._formSubmitEventListener, true); - } - } - - for (var videoIndex = 0; videoIndex < videoNamesToWatch.length; videoIndex++) { - var videoName = videoNamesToWatch[videoIndex]; - var video = document.getElementById(videoName) || document.getElementById(wem._resolveId(videoName)); - - if (video) { - video.addEventListener('play', wem.sendVideoEvent); - video.addEventListener('ended', wem.sendVideoEvent); - console.info('[WEM] Watching video ' + videoName); - } else { - console.warn('[WEM] Unable to watch video ' + videoName + ', video not found in the page'); - } - } - - for (var clickIndex = 0; clickIndex < clickToWatch.length; clickIndex++) { - var clickIdName = clickToWatch[clickIndex]; - var click = document.getElementById(clickIdName) || document.getElementById(wem._resolveId(clickIdName)) ? document.getElementById(clickIdName) || document.getElementById(wem._resolveId(clickIdName)) : document.getElementsByName(clickIdName)[0]; - - if (click) { - click.addEventListener('click', wem.sendClickEvent); - console.info('[WEM] Watching click ' + clickIdName); - } else { - console.warn('[WEM] Unable to watch click ' + clickIdName + ', element not found in the page'); - } - } - }, - - /** - * Check for currently registered events in wem.digitalData.events that would be incomplete: - * - autocomplete the event with the current digitalData page infos for the source - * @private - * @return {undefined} - */ - _checkUncompleteRegisteredEvents: function _checkUncompleteRegisteredEvents() { - if (wem.digitalData && wem.digitalData.events) { - var _iterator2 = _createForOfIteratorHelper(wem.digitalData.events), - _step2; - - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var event = _step2.value; - - wem._completeEvent(event); - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - } - }, - - /** - * dispatch JavaScript event in current HTML document for perso and opti events contains in digitalData.events - * @private - * @return {undefined} - */ - _dispatchJSExperienceDisplayedEvents: function _dispatchJSExperienceDisplayedEvents() { - if (wem.digitalData && wem.digitalData.events) { - var _iterator3 = _createForOfIteratorHelper(wem.digitalData.events), - _step3; - - try { - for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { - var event = _step3.value; - - if (event.eventType === 'optimizationTestEvent' || event.eventType === 'personalizationEvent') { - wem._dispatchJSExperienceDisplayedEvent(event); - } - } - } catch (err) { - _iterator3.e(err); - } finally { - _iterator3.f(); - } - } - }, - - /** - * build and dispatch JavaScript event in current HTML document for the given Unomi event (perso/opti) - * @private - * @param {object} experienceUnomiEvent perso/opti Unomi event - * @return {undefined} - */ - _dispatchJSExperienceDisplayedEvent: function _dispatchJSExperienceDisplayedEvent(experienceUnomiEvent) { - if (!wem.fallback && experienceUnomiEvent && experienceUnomiEvent.target && experienceUnomiEvent.target.properties && experienceUnomiEvent.target.properties.variants && experienceUnomiEvent.target.properties.variants.length > 0) { - var typeMapper = { - optimizationTestEvent: 'optimization', - personalizationEvent: 'personalization' - }; - - var _iterator4 = _createForOfIteratorHelper(experienceUnomiEvent.target.properties.variants), - _step4; - - try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { - var variant = _step4.value; - var jsEventDetail = { - id: variant.id, - name: variant.systemName, - displayableName: variant.displayableName, - path: variant.path, - type: typeMapper[experienceUnomiEvent.eventType], - variantType: experienceUnomiEvent.target.properties.type, - tags: variant.tags, - nodeType: variant.nodeType, - wrapper: { - id: experienceUnomiEvent.target.itemId, - name: experienceUnomiEvent.target.properties.systemName, - displayableName: experienceUnomiEvent.target.properties.displayableName, - path: experienceUnomiEvent.target.properties.path, - tags: experienceUnomiEvent.target.properties.tags, - nodeType: experienceUnomiEvent.target.properties.nodeType - } - }; - - if (experienceUnomiEvent.eventType === 'personalizationEvent') { - jsEventDetail.wrapper.inControlGroup = experienceUnomiEvent.target.properties.inControlGroup; - } - - wem._fillDisplayedVariants(jsEventDetail); - - wem.dispatchJSEvent('displayWemVariant', false, false, jsEventDetail); - } - } catch (err) { - _iterator4.e(err); - } finally { - _iterator4.f(); - } - } - }, - - /** - * Filter events in digitalData.events that would have the property: event.properties.doNotSendToUnomi - * The effect is directly stored in a new version of wem.digitalData.events - * @private - * @return {undefined} - */ - _filterUnomiEvents: function _filterUnomiEvents() { - if (wem.digitalData && wem.digitalData.events) { - wem.digitalData.events = wem.digitalData.events.filter(function (event) { - return !event.properties || !event.properties.doNotSendToUnomi; - }).map(function (event) { - if (event.properties) { - delete event.properties.doNotSendToUnomi; - } - - return event; - }); - } - }, - - /** - * Check if event is incomplete and complete what is missing: - * - source: if missing, use the current source page - * - scope: if missing, use the current scope - * @param {object} event, the event to be checked - * @private - * @return {object} the complete event - */ - _completeEvent: function _completeEvent(event) { - if (!event.source) { - event.source = wem.buildSourcePage(); - } - - if (!event.scope) { - event.scope = wem.digitalData.scope; - } - - if (event.target && !event.target.scope) { - event.target.scope = wem.digitalData.scope; - } - - return event; - }, - - /** - * Register an event in the wem.digitalData.events. - * Registered event, will be sent automatically during the context loading process. - * - * Beware this function is useless in case the context is already loaded. - * in case the context is already loaded (check: wem.getLoadedContext()), then you should use: wem.collectEvent(s) functions - * - * @private - * @param {object} event the Unomi event to be registered - * @param {boolean} unshift optional, if true, the event will be added at the beginning of the list otherwise at the end of the list. (default: false) - * @return {undefined} - */ - _registerEvent: function _registerEvent(event) { - var unshift = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (wem.digitalData) { - if (wem.cxs) { - console.error('[WEM] already loaded, too late...'); - return; - } - } else { - wem.digitalData = {}; - } - - wem.digitalData.events = wem.digitalData.events || []; - - if (unshift) { - wem.digitalData.events.unshift(event); - } else { - wem.digitalData.events.push(event); - } - }, - - /** - * This function allow for registering callback that will be executed once the context is loaded. - * @param {function} onLoadCallback the callback to be executed - * @param {string} name optional name for the call, used mostly for logging the execution - * @param {number} priority optional priority to execute the callbacks in a specific order - * (default: 5, to leave room for the tracker default callback(s)) - * @private - * @return {undefined} - */ - _registerCallback: function _registerCallback(onLoadCallback) { - var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; - - if (wem.digitalData) { - if (wem.cxs) { - console.info('[WEM] Trying to register context load callback, but context already loaded, executing now...'); - - if (onLoadCallback) { - console.info('[WEM] executing context load callback: ' + (name ? name : 'Callback without name')); - onLoadCallback(wem.digitalData); - } - } else { - console.info('[WEM] registering context load callback: ' + (name ? name : 'Callback without name')); - - if (onLoadCallback) { - wem.digitalData.loadCallbacks = wem.digitalData.loadCallbacks || []; - wem.digitalData.loadCallbacks.push({ - priority: priority, - name: name, - execute: onLoadCallback - }); - } - } - } else { - console.info('[WEM] Trying to register context load callback, but no digitalData conf found, creating it and registering the callback: ' + (name ? name : 'Callback without name')); - wem.digitalData = {}; - - if (onLoadCallback) { - wem.digitalData.loadCallbacks = []; - wem.digitalData.loadCallbacks.push({ - priority: priority, - name: name, - execute: onLoadCallback - }); - } - } - }, - - /** - * Internal function for personalization specific callbacks (used for HTML dom manipulation once we get the context loaded) - * @param {object} personalization the personalization - * @param {function} callback the callback - * @private - * @return {undefined} - */ - _registerPersonalizationCallback: function _registerPersonalizationCallback(personalization, callback) { - if (wem.digitalData) { - if (wem.cxs) { - console.error('[WEM] already loaded, too late...'); - } else { - console.info('[WEM] digitalData object present but not loaded, registering sort callback...'); - wem.digitalData.personalizationCallback = wem.digitalData.personalizationCallback || []; - wem.digitalData.personalizationCallback.push({ - personalization: personalization, - callback: callback - }); - } - } else { - wem.digitalData = {}; - wem.digitalData.personalizationCallback = wem.digitalData.personalizationCallback || []; - wem.digitalData.personalizationCallback.push({ - personalization: personalization, - callback: callback - }); - } - }, - - /** - * Build a simple Unomi object - * @param {string} itemId the itemId of the object - * @param {string} itemType the itemType of the object - * @param {object} properties optional properties for the object - * @private - * @return {object} the built Unomi JSON object - */ - _buildObject: function _buildObject(itemId, itemType) { - var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - var object = { - scope: wem.digitalData.scope, - itemId: itemId, - itemType: itemType - }; - - if (properties) { - object.properties = properties; - } - - return object; - }, - - /** - * Main callback used once the Ajax context request succeed - * @param {XMLHttpRequest} xhr the request - * @private - * @return {undefined} - */ - _onSuccess: function _onSuccess(xhr) { - wem.cxs = JSON.parse(xhr.responseText); - - if (wem.digitalData.loadCallbacks && wem.digitalData.loadCallbacks.length > 0) { - console.info('[WEM] Found context server load callbacks, calling now...'); - - wem._executeLoadCallbacks(wem.digitalData); - - if (wem.digitalData.personalizationCallback) { - for (var j = 0; j < wem.digitalData.personalizationCallback.length; j++) { - if (wem.cxs.personalizationResults) { - // Since Unomi 2.1.0 personalization results are available with more infos - var personalizationResult = wem.cxs.personalizationResults[wem.digitalData.personalizationCallback[j].personalization.id]; - wem.digitalData.personalizationCallback[j].callback(personalizationResult.contentIds, personalizationResult.additionalResultInfos); - } else { - // probably a version older than Unomi 2.1.0, fallback to old personalization results - wem.digitalData.personalizationCallback[j].callback(wem.cxs.personalizations[wem.digitalData.personalizationCallback[j].personalization.id]); - } - } - } - } - }, - - /** - * Main callback used once the Ajax context request failed - * @param {string} logMessage the log message, to identify the place of failure - * @private - * @return {undefined} - */ - _executeFallback: function _executeFallback(logMessage) { - console.warn('[WEM] execute fallback' + (logMessage ? ': ' + logMessage : '') + ', load fallback callbacks, calling now...'); - wem.fallback = true; - wem.cxs = {}; - - wem._executeLoadCallbacks(undefined); - - if (wem.digitalData.personalizationCallback) { - for (var i = 0; i < wem.digitalData.personalizationCallback.length; i++) { - wem.digitalData.personalizationCallback[i].callback([wem.digitalData.personalizationCallback[i].personalization.strategyOptions.fallback]); - } - } - }, - - /** - * Executed the registered context loaded callbacks - * @param {*} callbackParam param of the callbacks - * @private - * @return {undefined} - */ - _executeLoadCallbacks: function _executeLoadCallbacks(callbackParam) { - if (wem.digitalData.loadCallbacks && wem.digitalData.loadCallbacks.length > 0) { - wem.digitalData.loadCallbacks.sort(function (a, b) { - return a.priority - b.priority; - }).forEach(function (loadCallback) { - console.info('[WEM] executing context load callback: ' + (loadCallback.name ? loadCallback.name : 'callback without name')); - loadCallback.execute(callbackParam); - }); - } - }, - - /** - * Parse current HTML document referrer information to enrich the digitalData page infos - * @private - * @return {undefined} - */ - _processReferrer: function _processReferrer() { - var referrerURL = wem.digitalData.page.pageInfo.referringURL || document.referrer; - var sameDomainReferrer = false; - - if (referrerURL) { - // parse referrer URL - var referrer = new URL(referrerURL); // Set sameDomainReferrer property - - sameDomainReferrer = referrer.host === window.location.host; // only process referrer if it's not coming from the same site as the current page - - if (!sameDomainReferrer) { - // get search element if it exists and extract search query if available - var search = referrer.search; - var query = undefined; - - if (search && search != '') { - // parse parameters - var queryParams = [], - param; - var queryParamPairs = search.slice(1).split('&'); - - for (var i = 0; i < queryParamPairs.length; i++) { - param = queryParamPairs[i].split('='); - queryParams.push(param[0]); - queryParams[param[0]] = param[1]; - } // try to extract query: q is Google-like (most search engines), p is Yahoo - - - query = queryParams.q || queryParams.p; - query = decodeURIComponent(query).replace(/\+/g, ' '); - } // register referrer event - // Create deep copy of wem.digitalData.page and add data to pageInfo sub object - - - if (wem.digitalData && wem.digitalData.page && wem.digitalData.page.pageInfo) { - wem.digitalData.page.pageInfo.referrerHost = referrer.host; - wem.digitalData.page.pageInfo.referrerQuery = query; - } - } - } - - wem.digitalData.page.pageInfo.sameDomainReferrer = sameDomainReferrer; - }, - - /** - * Listener callback that can be attached to a specific HTML form, - * this listener will automatically send the form event to Unomi, by parsing the HTML form data. - * (NOTE: the form listener only work for know forms to be watch due to tracked conditions) - * - * @param {object} event the original HTML form submition event for the watch form. - * @private - * @return {undefined} - */ - _formSubmitEventListener: function _formSubmitEventListener(event) { - console.info('[WEM] Registering form event callback'); - var form = event.target; - var formName = form.getAttribute('name') ? form.getAttribute('name') : form.getAttribute('id'); - - if (formName && wem.formNamesToWatch.indexOf(formName) > -1) { - console.info('[WEM] catching form ' + formName); - var eventCopy = document.createEvent('Event'); // Define that the event name is 'build'. - - eventCopy.initEvent('submit', event.bubbles, event.cancelable); - event.stopImmediatePropagation(); - event.preventDefault(); - wem.collectEvent(wem.buildFormEvent(formName, form), function () { - form.removeEventListener('submit', wem._formSubmitEventListener, true); - form.dispatchEvent(eventCopy); - - if (!eventCopy.defaultPrevented && !eventCopy.cancelBubble) { - form.submit(); - } - - form.addEventListener('submit', wem._formSubmitEventListener, true); - }, function (xhr) { - console.error('[WEM] Error while collecting form event: ' + xhr.status + ' ' + xhr.statusText); - xhr.abort(); - form.removeEventListener('submit', wem._formSubmitEventListener, true); - form.dispatchEvent(eventCopy); - - if (!eventCopy.defaultPrevented && !eventCopy.cancelBubble) { - form.submit(); - } - - form.addEventListener('submit', wem._formSubmitEventListener, true); - }); - } - }, - - /** - * Utility function to extract data from an HTML form. - * - * @param {HTMLFormElement} form the HTML form element - * @private - * @return {object} the form data as JSON - */ - _extractFormData: function _extractFormData(form) { - var params = {}; - - for (var i = 0; i < form.elements.length; i++) { - var e = form.elements[i]; // ignore empty and undefined key (e.name) - - if (e.name) { - switch (e.nodeName) { - case 'TEXTAREA': - case 'INPUT': - switch (e.type) { - case 'checkbox': - var checkboxes = document.querySelectorAll('input[name="' + e.name + '"]'); - - if (checkboxes.length > 1) { - if (!params[e.name]) { - params[e.name] = []; - } - - if (e.checked) { - params[e.name].push(e.value); - } - } - - break; - - case 'radio': - if (e.checked) { - params[e.name] = e.value; - } - - break; - - default: - if (!e.value || e.value == '') { - // ignore element if no value is provided - break; - } - - params[e.name] = e.value; - } - - break; - - case 'SELECT': - if (e.options && e.options[e.selectedIndex]) { - if (e.multiple) { - params[e.name] = []; - - for (var j = 0; j < e.options.length; j++) { - if (e.options[j].selected) { - params[e.name].push(e.options[j].value); - } - } - } else { - params[e.name] = e.options[e.selectedIndex].value; - } - } - - break; - } - } - } - - return params; - }, - - /** - * Internal function used for mapping ids when current HTML document ids doesn't match ids stored in Unomi backend - * @param {string} id the id to resolve - * @return {string} the resolved id or the original id if not match found - * @private - */ - _resolveId: function _resolveId(id) { - if (wem.digitalData.sourceLocalIdentifierMap) { - var source = Object.keys(wem.digitalData.sourceLocalIdentifierMap).filter(function (source) { - return id.indexOf(source) > 0; - }); - return source ? id.replace(source, wem.digitalData.sourceLocalIdentifierMap[source]) : id; - } - - return id; - }, - - /** - * Enable or disable tracking in current page - * @param {boolean} enable true will enable the tracking feature, otherwise they will be disabled - * @param {function} callback an optional callback that can be used to perform additional logic based on enabling/disabling results - * @private - * @return {undefined} - */ - _enableWem: function _enableWem(enable) { - var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; // display fallback if wem is not enable - - wem.fallback = !enable; // remove cookies, reset cxs - - if (!enable) { - wem.cxs = {}; - document.cookie = wem.trackerProfileIdCookieName + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; - document.cookie = wem.contextServerCookieName + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; - delete wem.contextLoaded; - } else { - if (wem.DOMLoaded) { - wem.loadContext(); - } else { - // As Dom loaded listener not triggered, enable global value. - wem.activateWem = true; - } - } - - if (callback) { - callback(enable); - } - - console.log("[WEM] successfully ".concat(enable ? 'enabled' : 'disabled', " tracking in current page")); - }, - - /** - * Utility function used to merge two JSON object together (arrays are concat for example) - * @param {object} source the source object for merge - * @param {object} target the target object for merge - * @private - * @return {object} the merged results - */ - _deepMergeObjects: function _deepMergeObjects(source, target) { - if (!wem._isObject(target) || !wem._isObject(source)) { - return source; - } - - Object.keys(source).forEach(function (key) { - var targetValue = target[key]; - var sourceValue = source[key]; // concat arrays || merge objects || add new props - - if (Array.isArray(targetValue) && Array.isArray(sourceValue)) { - target[key] = targetValue.concat(sourceValue); - } else if (wem._isObject(targetValue) && wem._isObject(sourceValue)) { - target[key] = wem._deepMergeObjects(sourceValue, Object.assign({}, targetValue)); - } else { - target[key] = sourceValue; - } - }); - return target; - }, - - /** - * Utility function used to check if the given variable is a JavaScript object. - * @param {*} obj the variable to check - * @private - * @return {boolean} true if the variable is an object, false otherwise - */ - _isObject: function _isObject(obj) { - return obj && _typeof(obj) === 'object'; - } - }; - return wem; - }; - /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - var useTracker = function useTracker() { - return newTracker(); - }; - - /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - // we will store an instance in the current browser window to make it accessible - - window.unomiWebTracker = useTracker(); - -})(); -//# sourceMappingURL=unomi-web-tracker.js.map diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map b/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map deleted file mode 100644 index d91fdebe4..000000000 --- a/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"unomi-web-tracker.js","sources":["../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/es6-crawler-detect/src/lib/crawler/provider.js","../node_modules/es6-crawler-detect/src/lib/crawler/crawlers.js","../node_modules/es6-crawler-detect/src/lib/crawler/exclusions.js","../node_modules/es6-crawler-detect/src/lib/crawler/headers.js","../node_modules/es6-crawler-detect/src/lib/crawler.js","../node_modules/es6-crawler-detect/src/index.js","../node_modules [...] \ No newline at end of file diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js b/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js deleted file mode 100644 index 5e1925a54..000000000 --- a/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}var t="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i=!1;function a(){i=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij [...]