From 639ba475a18031780538db8face4a86d9c15615f Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Wed, 11 Dec 2024 09:56:21 -0500 Subject: [PATCH 1/5] Fix: Include allowedVendor param and update ModuleId value --- dist/ID5Kit.common.js | 24 ++++++++++++++++++++---- dist/ID5Kit.iife.js | 24 ++++++++++++++++++++---- src/identity-handler.js | 15 +++++++++++++-- src/initialization.js | 9 +++++++-- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/dist/ID5Kit.common.js b/dist/ID5Kit.common.js index 75d6d4f..e95755f 100644 --- a/dist/ID5Kit.common.js +++ b/dist/ID5Kit.common.js @@ -1264,7 +1264,13 @@ IdentityHandler.prototype.onLoginComplete = function( var partnerData = this.common.buildPartnerData(mParticleUser); if (partnerData) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId, pd: partnerData}); + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + pd: partnerData, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ @@ -1276,7 +1282,12 @@ IdentityHandler.prototype.onLoginComplete = function( //Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID IdentityHandler.prototype.onLogoutComplete = function( ) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId}); + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ @@ -1296,7 +1307,7 @@ var identityHandler = IdentityHandler; var initialization = { name: 'ID5', - moduleId: '248', + moduleId: 248, /* ****** Fill out initForwarder to load your SDK ****** Note that not all arguments may apply to your SDK initialization. These are passed from mParticle, but leave them even if they are not being used. @@ -1322,7 +1333,12 @@ var initialization = { id5Script.onload = function() { - var id5Instance = window.ID5.init({partnerId: common.partnerId}); + var id5Instance = window.ID5.init({ + partnerId: common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); id5Instance.onAvailable(function(status){ common.logId5Id(status.getUserId()); diff --git a/dist/ID5Kit.iife.js b/dist/ID5Kit.iife.js index 177195e..d528a5e 100644 --- a/dist/ID5Kit.iife.js +++ b/dist/ID5Kit.iife.js @@ -1263,7 +1263,13 @@ var ID5Kit = (function (exports) { var partnerData = this.common.buildPartnerData(mParticleUser); if (partnerData) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId, pd: partnerData}); + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + pd: partnerData, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ @@ -1275,7 +1281,12 @@ var ID5Kit = (function (exports) { //Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID IdentityHandler.prototype.onLogoutComplete = function( ) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId}); + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ @@ -1295,7 +1306,7 @@ var ID5Kit = (function (exports) { var initialization = { name: 'ID5', - moduleId: '248', + moduleId: 248, /* ****** Fill out initForwarder to load your SDK ****** Note that not all arguments may apply to your SDK initialization. These are passed from mParticle, but leave them even if they are not being used. @@ -1321,7 +1332,12 @@ var ID5Kit = (function (exports) { id5Script.onload = function() { - var id5Instance = window.ID5.init({partnerId: common.partnerId}); + var id5Instance = window.ID5.init({ + partnerId: common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); id5Instance.onAvailable(function(status){ common.logId5Id(status.getUserId()); diff --git a/src/identity-handler.js b/src/identity-handler.js index 477025f..c3c1381 100644 --- a/src/identity-handler.js +++ b/src/identity-handler.js @@ -31,7 +31,13 @@ IdentityHandler.prototype.onLoginComplete = function( var partnerData = this.common.buildPartnerData(mParticleUser); if (partnerData) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId, pd: partnerData}) + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + pd: partnerData, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }) var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ @@ -43,7 +49,12 @@ IdentityHandler.prototype.onLoginComplete = function( //Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID IdentityHandler.prototype.onLogoutComplete = function( ) { - var id5Instance = window.ID5.init({partnerId: this.common.partnerId}) + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }) var logId5Id = this.common.logId5Id; id5Instance.onAvailable(function(status){ diff --git a/src/initialization.js b/src/initialization.js index 8f79565..74091e9 100644 --- a/src/initialization.js +++ b/src/initialization.js @@ -1,6 +1,6 @@ var initialization = { name: 'ID5', - moduleId: '248', + moduleId: 248, /* ****** Fill out initForwarder to load your SDK ****** Note that not all arguments may apply to your SDK initialization. These are passed from mParticle, but leave them even if they are not being used. @@ -27,7 +27,12 @@ var initialization = { id5Script.onload = function() { isInitialized = true; - var id5Instance = window.ID5.init({partnerId: common.partnerId}) + var id5Instance = window.ID5.init({ + partnerId: common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }) id5Instance.onAvailable(function(status){ common.logId5Id(status.getUserId()); From b0514091bb0a983407e65703edcc933eab377461 Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Wed, 11 Dec 2024 10:03:01 -0500 Subject: [PATCH 2/5] Fix indentation --- src/identity-handler.js | 4 ++-- src/initialization.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/identity-handler.js b/src/identity-handler.js index c3c1381..9403509 100644 --- a/src/identity-handler.js +++ b/src/identity-handler.js @@ -36,7 +36,7 @@ IdentityHandler.prototype.onLoginComplete = function( pd: partnerData, consentData: { allowedVendors: [ '131', 'ID5-1747' ] - } + } }) var logId5Id = this.common.logId5Id; @@ -53,7 +53,7 @@ IdentityHandler.prototype.onLogoutComplete = function( partnerId: this.common.partnerId, consentData: { allowedVendors: [ '131', 'ID5-1747' ] - } + } }) var logId5Id = this.common.logId5Id; diff --git a/src/initialization.js b/src/initialization.js index 74091e9..78c880e 100644 --- a/src/initialization.js +++ b/src/initialization.js @@ -31,7 +31,7 @@ var initialization = { partnerId: common.partnerId, consentData: { allowedVendors: [ '131', 'ID5-1747' ] - } + } }) id5Instance.onAvailable(function(status){ From a69eb7a77f2a814bb7bf11fa70a54e33adef3246 Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Wed, 11 Dec 2024 10:05:31 -0500 Subject: [PATCH 3/5] Added space to re-trigger checks --- src/identity-handler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/identity-handler.js b/src/identity-handler.js index 9403509..735a2df 100644 --- a/src/identity-handler.js +++ b/src/identity-handler.js @@ -46,7 +46,7 @@ IdentityHandler.prototype.onLoginComplete = function( } }; -//Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID +//Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID IdentityHandler.prototype.onLogoutComplete = function( ) { var id5Instance = window.ID5.init({ From 0e60701cb9ad972102abfa6243b7b12c53a64ee8 Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Wed, 18 Dec 2024 10:02:52 -0500 Subject: [PATCH 4/5] Delete dist/ID5Kit.common.js --- dist/ID5Kit.common.js | 1908 ----------------------------------------- 1 file changed, 1908 deletions(-) delete mode 100644 dist/ID5Kit.common.js diff --git a/dist/ID5Kit.common.js b/dist/ID5Kit.common.js deleted file mode 100644 index e95755f..0000000 --- a/dist/ID5Kit.common.js +++ /dev/null @@ -1,1908 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); -} - -function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; -} - -function getCjsExportFromNamespace (n) { - return n && n['default'] || n; -} - -var _nodeResolve_empty = {}; - -var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - 'default': _nodeResolve_empty -}); - -var require$$0 = getCjsExportFromNamespace(_nodeResolve_empty$1); - -var core = createCommonjsModule(function (module, exports) { -(function (root, factory) { - { - // CommonJS - module.exports = exports = factory(); - } -}(commonjsGlobal, function () { - - /*globals window, global, require*/ - - /** - * CryptoJS core components. - */ - var CryptoJS = CryptoJS || (function (Math, undefined$1) { - - var crypto; - - // Native crypto from window (Browser) - if (typeof window !== 'undefined' && window.crypto) { - crypto = window.crypto; - } - - // Native crypto in web worker (Browser) - if (typeof self !== 'undefined' && self.crypto) { - crypto = self.crypto; - } - - // Native crypto from worker - if (typeof globalThis !== 'undefined' && globalThis.crypto) { - crypto = globalThis.crypto; - } - - // Native (experimental IE 11) crypto from window (Browser) - if (!crypto && typeof window !== 'undefined' && window.msCrypto) { - crypto = window.msCrypto; - } - - // Native crypto from global (NodeJS) - if (!crypto && typeof commonjsGlobal !== 'undefined' && commonjsGlobal.crypto) { - crypto = commonjsGlobal.crypto; - } - - // Native crypto import via require (NodeJS) - if (!crypto && typeof commonjsRequire === 'function') { - try { - crypto = require$$0; - } catch (err) {} - } - - /* - * Cryptographically secure pseudorandom number generator - * - * As Math.random() is cryptographically not safe to use - */ - var cryptoSecureRandomInt = function () { - if (crypto) { - // Use getRandomValues method (Browser) - if (typeof crypto.getRandomValues === 'function') { - try { - return crypto.getRandomValues(new Uint32Array(1))[0]; - } catch (err) {} - } - - // Use randomBytes method (NodeJS) - if (typeof crypto.randomBytes === 'function') { - try { - return crypto.randomBytes(4).readInt32LE(); - } catch (err) {} - } - } - - throw new Error('Native crypto module could not be used to get secure random number.'); - }; - - /* - * Local polyfill of Object.create - - */ - var create = Object.create || (function () { - function F() {} - - return function (obj) { - var subtype; - - F.prototype = obj; - - subtype = new F(); - - F.prototype = null; - - return subtype; - }; - }()); - - /** - * CryptoJS namespace. - */ - var C = {}; - - /** - * Library namespace. - */ - var C_lib = C.lib = {}; - - /** - * Base object for prototypal inheritance. - */ - var Base = C_lib.Base = (function () { - - - return { - /** - * Creates a new object that inherits from this object. - * - * @param {Object} overrides Properties to copy into the new object. - * - * @return {Object} The new object. - * - * @static - * - * @example - * - * var MyType = CryptoJS.lib.Base.extend({ - * field: 'value', - * - * method: function () { - * } - * }); - */ - extend: function (overrides) { - // Spawn - var subtype = create(this); - - // Augment - if (overrides) { - subtype.mixIn(overrides); - } - - // Create default initializer - if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { - subtype.init = function () { - subtype.$super.init.apply(this, arguments); - }; - } - - // Initializer's prototype is the subtype object - subtype.init.prototype = subtype; - - // Reference supertype - subtype.$super = this; - - return subtype; - }, - - /** - * Extends this object and runs the init method. - * Arguments to create() will be passed to init(). - * - * @return {Object} The new object. - * - * @static - * - * @example - * - * var instance = MyType.create(); - */ - create: function () { - var instance = this.extend(); - instance.init.apply(instance, arguments); - - return instance; - }, - - /** - * Initializes a newly created object. - * Override this method to add some logic when your objects are created. - * - * @example - * - * var MyType = CryptoJS.lib.Base.extend({ - * init: function () { - * // ... - * } - * }); - */ - init: function () { - }, - - /** - * Copies properties into this object. - * - * @param {Object} properties The properties to mix in. - * - * @example - * - * MyType.mixIn({ - * field: 'value' - * }); - */ - mixIn: function (properties) { - for (var propertyName in properties) { - if (properties.hasOwnProperty(propertyName)) { - this[propertyName] = properties[propertyName]; - } - } - - // IE won't copy toString using the loop above - if (properties.hasOwnProperty('toString')) { - this.toString = properties.toString; - } - }, - - /** - * Creates a copy of this object. - * - * @return {Object} The clone. - * - * @example - * - * var clone = instance.clone(); - */ - clone: function () { - return this.init.prototype.extend(this); - } - }; - }()); - - /** - * An array of 32-bit words. - * - * @property {Array} words The array of 32-bit words. - * @property {number} sigBytes The number of significant bytes in this word array. - */ - var WordArray = C_lib.WordArray = Base.extend({ - /** - * Initializes a newly created word array. - * - * @param {Array} words (Optional) An array of 32-bit words. - * @param {number} sigBytes (Optional) The number of significant bytes in the words. - * - * @example - * - * var wordArray = CryptoJS.lib.WordArray.create(); - * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); - * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); - */ - init: function (words, sigBytes) { - words = this.words = words || []; - - if (sigBytes != undefined$1) { - this.sigBytes = sigBytes; - } else { - this.sigBytes = words.length * 4; - } - }, - - /** - * Converts this word array to a string. - * - * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex - * - * @return {string} The stringified word array. - * - * @example - * - * var string = wordArray + ''; - * var string = wordArray.toString(); - * var string = wordArray.toString(CryptoJS.enc.Utf8); - */ - toString: function (encoder) { - return (encoder || Hex).stringify(this); - }, - - /** - * Concatenates a word array to this word array. - * - * @param {WordArray} wordArray The word array to append. - * - * @return {WordArray} This word array. - * - * @example - * - * wordArray1.concat(wordArray2); - */ - concat: function (wordArray) { - // Shortcuts - var thisWords = this.words; - var thatWords = wordArray.words; - var thisSigBytes = this.sigBytes; - var thatSigBytes = wordArray.sigBytes; - - // Clamp excess bits - this.clamp(); - - // Concat - if (thisSigBytes % 4) { - // Copy one byte at a time - for (var i = 0; i < thatSigBytes; i++) { - var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); - } - } else { - // Copy one word at a time - for (var j = 0; j < thatSigBytes; j += 4) { - thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; - } - } - this.sigBytes += thatSigBytes; - - // Chainable - return this; - }, - - /** - * Removes insignificant bits. - * - * @example - * - * wordArray.clamp(); - */ - clamp: function () { - // Shortcuts - var words = this.words; - var sigBytes = this.sigBytes; - - // Clamp - words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); - words.length = Math.ceil(sigBytes / 4); - }, - - /** - * Creates a copy of this word array. - * - * @return {WordArray} The clone. - * - * @example - * - * var clone = wordArray.clone(); - */ - clone: function () { - var clone = Base.clone.call(this); - clone.words = this.words.slice(0); - - return clone; - }, - - /** - * Creates a word array filled with random bytes. - * - * @param {number} nBytes The number of random bytes to generate. - * - * @return {WordArray} The random word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.lib.WordArray.random(16); - */ - random: function (nBytes) { - var words = []; - - for (var i = 0; i < nBytes; i += 4) { - words.push(cryptoSecureRandomInt()); - } - - return new WordArray.init(words, nBytes); - } - }); - - /** - * Encoder namespace. - */ - var C_enc = C.enc = {}; - - /** - * Hex encoding strategy. - */ - var Hex = C_enc.Hex = { - /** - * Converts a word array to a hex string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The hex string. - * - * @static - * - * @example - * - * var hexString = CryptoJS.enc.Hex.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var hexChars = []; - for (var i = 0; i < sigBytes; i++) { - var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - hexChars.push((bite >>> 4).toString(16)); - hexChars.push((bite & 0x0f).toString(16)); - } - - return hexChars.join(''); - }, - - /** - * Converts a hex string to a word array. - * - * @param {string} hexStr The hex string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Hex.parse(hexString); - */ - parse: function (hexStr) { - // Shortcut - var hexStrLength = hexStr.length; - - // Convert - var words = []; - for (var i = 0; i < hexStrLength; i += 2) { - words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); - } - - return new WordArray.init(words, hexStrLength / 2); - } - }; - - /** - * Latin1 encoding strategy. - */ - var Latin1 = C_enc.Latin1 = { - /** - * Converts a word array to a Latin1 string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The Latin1 string. - * - * @static - * - * @example - * - * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var latin1Chars = []; - for (var i = 0; i < sigBytes; i++) { - var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - latin1Chars.push(String.fromCharCode(bite)); - } - - return latin1Chars.join(''); - }, - - /** - * Converts a Latin1 string to a word array. - * - * @param {string} latin1Str The Latin1 string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); - */ - parse: function (latin1Str) { - // Shortcut - var latin1StrLength = latin1Str.length; - - // Convert - var words = []; - for (var i = 0; i < latin1StrLength; i++) { - words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); - } - - return new WordArray.init(words, latin1StrLength); - } - }; - - /** - * UTF-8 encoding strategy. - */ - var Utf8 = C_enc.Utf8 = { - /** - * Converts a word array to a UTF-8 string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The UTF-8 string. - * - * @static - * - * @example - * - * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); - */ - stringify: function (wordArray) { - try { - return decodeURIComponent(escape(Latin1.stringify(wordArray))); - } catch (e) { - throw new Error('Malformed UTF-8 data'); - } - }, - - /** - * Converts a UTF-8 string to a word array. - * - * @param {string} utf8Str The UTF-8 string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); - */ - parse: function (utf8Str) { - return Latin1.parse(unescape(encodeURIComponent(utf8Str))); - } - }; - - /** - * Abstract buffered block algorithm template. - * - * The property blockSize must be implemented in a concrete subtype. - * - * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 - */ - var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ - /** - * Resets this block algorithm's data buffer to its initial state. - * - * @example - * - * bufferedBlockAlgorithm.reset(); - */ - reset: function () { - // Initial values - this._data = new WordArray.init(); - this._nDataBytes = 0; - }, - - /** - * Adds new data to this block algorithm's buffer. - * - * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. - * - * @example - * - * bufferedBlockAlgorithm._append('data'); - * bufferedBlockAlgorithm._append(wordArray); - */ - _append: function (data) { - // Convert string to WordArray, else assume WordArray already - if (typeof data == 'string') { - data = Utf8.parse(data); - } - - // Append - this._data.concat(data); - this._nDataBytes += data.sigBytes; - }, - - /** - * Processes available data blocks. - * - * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. - * - * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. - * - * @return {WordArray} The processed data. - * - * @example - * - * var processedData = bufferedBlockAlgorithm._process(); - * var processedData = bufferedBlockAlgorithm._process(!!'flush'); - */ - _process: function (doFlush) { - var processedWords; - - // Shortcuts - var data = this._data; - var dataWords = data.words; - var dataSigBytes = data.sigBytes; - var blockSize = this.blockSize; - var blockSizeBytes = blockSize * 4; - - // Count blocks ready - var nBlocksReady = dataSigBytes / blockSizeBytes; - if (doFlush) { - // Round up to include partial blocks - nBlocksReady = Math.ceil(nBlocksReady); - } else { - // Round down to include only full blocks, - // less the number of blocks that must remain in the buffer - nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); - } - - // Count words ready - var nWordsReady = nBlocksReady * blockSize; - - // Count bytes ready - var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); - - // Process blocks - if (nWordsReady) { - for (var offset = 0; offset < nWordsReady; offset += blockSize) { - // Perform concrete-algorithm logic - this._doProcessBlock(dataWords, offset); - } - - // Remove processed words - processedWords = dataWords.splice(0, nWordsReady); - data.sigBytes -= nBytesReady; - } - - // Return processed words - return new WordArray.init(processedWords, nBytesReady); - }, - - /** - * Creates a copy of this object. - * - * @return {Object} The clone. - * - * @example - * - * var clone = bufferedBlockAlgorithm.clone(); - */ - clone: function () { - var clone = Base.clone.call(this); - clone._data = this._data.clone(); - - return clone; - }, - - _minBufferSize: 0 - }); - - /** - * Abstract hasher template. - * - * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) - */ - var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ - /** - * Configuration options. - */ - cfg: Base.extend(), - - /** - * Initializes a newly created hasher. - * - * @param {Object} cfg (Optional) The configuration options to use for this hash computation. - * - * @example - * - * var hasher = CryptoJS.algo.SHA256.create(); - */ - init: function (cfg) { - // Apply config defaults - this.cfg = this.cfg.extend(cfg); - - // Set initial values - this.reset(); - }, - - /** - * Resets this hasher to its initial state. - * - * @example - * - * hasher.reset(); - */ - reset: function () { - // Reset data buffer - BufferedBlockAlgorithm.reset.call(this); - - // Perform concrete-hasher logic - this._doReset(); - }, - - /** - * Updates this hasher with a message. - * - * @param {WordArray|string} messageUpdate The message to append. - * - * @return {Hasher} This hasher. - * - * @example - * - * hasher.update('message'); - * hasher.update(wordArray); - */ - update: function (messageUpdate) { - // Append - this._append(messageUpdate); - - // Update the hash - this._process(); - - // Chainable - return this; - }, - - /** - * Finalizes the hash computation. - * Note that the finalize operation is effectively a destructive, read-once operation. - * - * @param {WordArray|string} messageUpdate (Optional) A final message update. - * - * @return {WordArray} The hash. - * - * @example - * - * var hash = hasher.finalize(); - * var hash = hasher.finalize('message'); - * var hash = hasher.finalize(wordArray); - */ - finalize: function (messageUpdate) { - // Final message update - if (messageUpdate) { - this._append(messageUpdate); - } - - // Perform concrete-hasher logic - var hash = this._doFinalize(); - - return hash; - }, - - blockSize: 512/32, - - /** - * Creates a shortcut function to a hasher's object interface. - * - * @param {Hasher} hasher The hasher to create a helper for. - * - * @return {Function} The shortcut function. - * - * @static - * - * @example - * - * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); - */ - _createHelper: function (hasher) { - return function (message, cfg) { - return new hasher.init(cfg).finalize(message); - }; - }, - - /** - * Creates a shortcut function to the HMAC's object interface. - * - * @param {Hasher} hasher The hasher to use in this HMAC helper. - * - * @return {Function} The shortcut function. - * - * @static - * - * @example - * - * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); - */ - _createHmacHelper: function (hasher) { - return function (message, key) { - return new C_algo.HMAC.init(hasher, key).finalize(message); - }; - } - }); - - /** - * Algorithm namespace. - */ - var C_algo = C.algo = {}; - - return C; - }(Math)); - - - return CryptoJS; - -})); -}); - -var sha256 = createCommonjsModule(function (module, exports) { -(function (root, factory) { - { - // CommonJS - module.exports = exports = factory(core); - } -}(commonjsGlobal, function (CryptoJS) { - - (function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Initialization and round constants tables - var H = []; - var K = []; - - // Compute constants - (function () { - function isPrime(n) { - var sqrtN = Math.sqrt(n); - for (var factor = 2; factor <= sqrtN; factor++) { - if (!(n % factor)) { - return false; - } - } - - return true; - } - - function getFractionalBits(n) { - return ((n - (n | 0)) * 0x100000000) | 0; - } - - var n = 2; - var nPrime = 0; - while (nPrime < 64) { - if (isPrime(n)) { - if (nPrime < 8) { - H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); - } - K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); - - nPrime++; - } - - n++; - } - }()); - - // Reusable object - var W = []; - - /** - * SHA-256 hash algorithm. - */ - var SHA256 = C_algo.SHA256 = Hasher.extend({ - _doReset: function () { - this._hash = new WordArray.init(H.slice(0)); - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var H = this._hash.words; - - // Working variables - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - var f = H[5]; - var g = H[6]; - var h = H[7]; - - // Computation - for (var i = 0; i < 64; i++) { - if (i < 16) { - W[i] = M[offset + i] | 0; - } else { - var gamma0x = W[i - 15]; - var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ - ((gamma0x << 14) | (gamma0x >>> 18)) ^ - (gamma0x >>> 3); - - var gamma1x = W[i - 2]; - var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ - ((gamma1x << 13) | (gamma1x >>> 19)) ^ - (gamma1x >>> 10); - - W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; - } - - var ch = (e & f) ^ (~e & g); - var maj = (a & b) ^ (a & c) ^ (b & c); - - var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); - var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); - - var t1 = h + sigma1 + ch + K[i] + W[i]; - var t2 = sigma0 + maj; - - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - - // Intermediate hash value - H[0] = (H[0] + a) | 0; - H[1] = (H[1] + b) | 0; - H[2] = (H[2] + c) | 0; - H[3] = (H[3] + d) | 0; - H[4] = (H[4] + e) | 0; - H[5] = (H[5] + f) | 0; - H[6] = (H[6] + g) | 0; - H[7] = (H[7] + h) | 0; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Return final computed hash - return this._hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA256('message'); - * var hash = CryptoJS.SHA256(wordArray); - */ - C.SHA256 = Hasher._createHelper(SHA256); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA256(message, key); - */ - C.HmacSHA256 = Hasher._createHmacHelper(SHA256); - }(Math)); - - - return CryptoJS.SHA256; - -})); -}); - -function Common() {} - -Common.prototype.exampleMethod = function () { - return 'I am an example'; -}; - -Common.prototype.logId5Id = function (id5Id) { - if (!id5Id) { - return; - } - - var integrationAttributes = { - encryptedId5Id: id5Id, - id5IdType: this.id5IdType, - }; - - window.mParticle.setIntegrationAttribute(this.moduleId, integrationAttributes); -}; - -Common.prototype.buildPartnerData = function (mParticleUser) { - var pdKeys = {}; - var userIdentities = mParticleUser.getUserIdentities(); - - var email = this.normalizeEmail(userIdentities.userIdentities['email']); - var phone = this.normalizePhone(userIdentities.userIdentities['mobile_number']); - - if (!email && !phone) { - return null; - } - - if (email) { - pdKeys[1] = sha256(email); - } - - if (phone) { - pdKeys[2]= sha256(phone); - } - - var pdRaw = Object.keys(pdKeys).map(function(key){ - return key + '=' + pdKeys[key] - }).join('&'); - - return btoa(pdRaw); -}; - -Common.prototype.normalizeEmail = function(email) { - if (!email || !this.validateEmail(email)) { - return null; - } - var parts = email.split("@"); - var charactersToRemove = ['+', '.']; - - if (parts[1] != 'gmail.com') { - return email; - } - - parts[0]= this.replace(parts[0], charactersToRemove); - - return parts.join('@'); -}; - -Common.prototype.normalizePhone = function(phone) { - if (!phone) { - return null; - } - var charactersToRemove = [' ', '-', '(', ')']; - var normalizedPhone = this.replace(phone, charactersToRemove); - - if (normalizedPhone[0] !== '+') { - normalizedPhone = '+' + normalizedPhone; - } - - if (!this.validatePhone(normalizedPhone)) { - return null; - } - return normalizedPhone; -}; - -Common.prototype.replace = function(string, targets) { - var newString = ''; - for(var i = 0; i < string.length; i++){ - var char = string[i]; - if (!targets.includes(char)){ - newString += char; - } - } - return newString.toLowerCase(); -}; - -Common.prototype.validateEmail = function(email){ - if (!email) { - return false; - } - var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - return emailRegex.test(email); -}; - -Common.prototype.validatePhone = function(phone) { - if (!phone){ - return false; - } - var e164Regex = /^\+?[1-9]\d{1,14}$/; - - return e164Regex.test(phone); -}; -var common = Common; - -function CommerceHandler(common) { - this.common = common || {}; -} - -CommerceHandler.prototype.logCommerceEvent = function() { - /* - Sample ecommerce event schema: - { - CurrencyCode: 'USD', - DeviceId:'a80eea1c-57f5-4f84-815e-06fe971b6ef2', // MP generated - EventAttributes: { key1: 'value1', key2: 'value2' }, - EventType: 16, - EventCategory: 10, // (This is an add product to cart event, see below for additional ecommerce EventCategories) - EventName: "eCommerce - AddToCart", - MPID: "8278431810143183490", - ProductAction: { - Affiliation: 'aff1', - CouponCode: 'coupon', - ProductActionType: 7, - ProductList: [ - { - Attributes: { prodKey1: 'prodValue1', prodKey2: 'prodValue2' }, - Brand: 'Apple', - Category: 'phones', - CouponCode: 'coupon1', - Name: 'iPhone', - Price: '600', - Quantity: 2, - Sku: "SKU123", - TotalAmount: 1200, - Variant: '64GB' - } - ], - TransactionId: "tid1", - ShippingAmount: 10, - TaxAmount: 5, - TotalAmount: 1215, - }, - UserAttributes: { userKey1: 'userValue1', userKey2: 'userValue2' } - UserIdentities: [ - { - Identity: 'test@gmail.com', Type: 7 - } - ] - } - - If your SDK has specific ways to log different eCommerce events, see below for - mParticle's additional ecommerce EventCategory types: - - 10: ProductAddToCart, (as shown above) - 11: ProductRemoveFromCart, - 12: ProductCheckout, - 13: ProductCheckoutOption, - 14: ProductClick, - 15: ProductViewDetail, - 16: ProductPurchase, - 17: ProductRefund, - 18: PromotionView, - 19: PromotionClick, - 20: ProductAddToWishlist, - 21: ProductRemoveFromWishlist, - 22: ProductImpression - */ -}; - -var commerceHandler = CommerceHandler; - -/* -A non-ecommerce event has the following schema: - -{ - DeviceId: "a80eea1c-57f5-4f84-815e-06fe971b6ef2", - EventAttributes: {test: "Error", t: 'stack trace in string form'}, - EventName: "Error", - MPID: "123123123123", - UserAttributes: {userAttr1: 'value1', userAttr2: 'value2'}, - UserIdentities: [{Identity: 'email@gmail.com', Type: 7}] - User Identity Types can be found here: -} - -*/ - -function EventHandler(common) { - this.common = common || {}; -} -EventHandler.prototype.logEvent = function() {}; -EventHandler.prototype.logError = function() { - // The schema for a logError event is the same, but noteworthy differences are as follows: - // { - // EventAttributes: {m: 'name of error passed into MP', s: "Error", t: 'stack trace in string form if applicable'}, - // EventName: "Error" - // } -}; -EventHandler.prototype.logPageView = function() { - /* The schema for a logPagView event is the same, but noteworthy differences are as follows: - { - EventAttributes: {hostname: "www.google.com", title: 'Test Page'}, // These are event attributes only if no additional event attributes are explicitly provided to mParticle.logPageView(...) - } - */ -}; - -var eventHandler = EventHandler; - -/* -The 'mParticleUser' is an object with methods get user Identities and set/get user attributes -Partners can determine what userIds are available to use in their SDK -Call mParticleUser.getUserIdentities() to return an object of userIdentities --> { userIdentities: {customerid: '1234', email: 'email@gmail.com'} } -For more identity types, see https://docs.mparticle.com/developers/sdk/web/idsync/#supported-identity-types -Call mParticleUser.getMPID() to get mParticle ID -For any additional methods, see https://docs.mparticle.com/developers/sdk/web/core-apidocs/classes/mParticle.Identity.getCurrentUser().html -*/ - -/* -identityApiRequest has the schema: -{ - userIdentities: { - customerid: '123', - email: 'abc' - } -} -For more userIdentity types, see https://docs.mparticle.com/developers/sdk/web/idsync/#supported-identity-types -*/ - -function IdentityHandler(common) { - this.common = common || {}; -} -IdentityHandler.prototype.onUserIdentified = function() {}; -IdentityHandler.prototype.onIdentifyComplete = function() {}; - -//Must re-initialize ID5 with partner identities(pd) in the config to collect an updated ID5 ID -IdentityHandler.prototype.onLoginComplete = function( - mParticleUser -) { - var partnerData = this.common.buildPartnerData(mParticleUser); - - if (partnerData) { - var id5Instance = window.ID5.init({ - partnerId: this.common.partnerId, - pd: partnerData, - consentData: { - allowedVendors: [ '131', 'ID5-1747' ] - } - }); - var logId5Id = this.common.logId5Id; - - id5Instance.onAvailable(function(status){ - logId5Id(status.getUserId()); - }.bind(logId5Id)); - } -}; - -//Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID -IdentityHandler.prototype.onLogoutComplete = function( -) { - var id5Instance = window.ID5.init({ - partnerId: this.common.partnerId, - consentData: { - allowedVendors: [ '131', 'ID5-1747' ] - } - }); - var logId5Id = this.common.logId5Id; - - id5Instance.onAvailable(function(status){ - logId5Id(status.getUserId()); - }.bind(logId5Id)); -}; - -IdentityHandler.prototype.onModifyComplete = function() {}; - -/* In previous versions of the mParticle web SDK, setting user identities on - kits is only reachable via the onSetUserIdentity method below. We recommend - filling out `onSetUserIdentity` for maximum compatibility -*/ -IdentityHandler.prototype.onSetUserIdentity = function() {}; - -var identityHandler = IdentityHandler; - -var initialization = { - name: 'ID5', - moduleId: 248, - /* ****** Fill out initForwarder to load your SDK ****** - Note that not all arguments may apply to your SDK initialization. - These are passed from mParticle, but leave them even if they are not being used. - forwarderSettings contain settings that your SDK requires in order to initialize - userAttributes example: {gender: 'male', age: 25} - userIdentities example: { 1: 'customerId', 2: 'facebookId', 7: 'emailid@email.com' } - additional identityTypes can be found at https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/src/types.js#L88-L101 -*/ - initForwarder: function(forwarderSettings, testMode, userAttributes, userIdentities, processEvent, eventQueue, isInitialized, common) { - /* `forwarderSettings` contains your SDK specific settings such as apiKey that your customer needs in order to initialize your SDK properly */ - common.partnerId = forwarderSettings.partnerId; - common.id5IdType = forwarderSettings.id5IdType; - common.moduleId = this.moduleId; - - if (!testMode) { - /* Load your Web SDK here using a variant of your snippet from your readme that your customers would generally put into their tags - Generally, our integrations create script tags and append them to the . Please follow the following format as a guide: - */ - //ID5 docs on initialization can be found here: https://github.com/id5io/id5-api.js/blob/master/README.md - var id5Script = document.createElement('script'); - id5Script.src = 'https://cdn.id5-sync.com/api/1.0/id5-api.js'; - (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(id5Script); - - id5Script.onload = function() { - - var id5Instance = window.ID5.init({ - partnerId: common.partnerId, - consentData: { - allowedVendors: [ '131', 'ID5-1747' ] - } - }); - - id5Instance.onAvailable(function(status){ - common.logId5Id(status.getUserId()); - }.bind(common)); - }; - } else { - - var id5Instance = window.ID5.init({partnerId: common.partnerId}); - - id5Instance.onAvailable(function(status){ - common.logId5Id(status.getUserId()); - }.bind(common)); - } - } -}; - -var initialization_1 = initialization; - -var sessionHandler = { - onSessionStart: function() { - - }, - onSessionEnd: function() { - - } -}; - -var sessionHandler_1 = sessionHandler; - -/* -The 'mParticleUser' is an object with methods on it to get user Identities and set/get user attributes -Partners can determine what userIds are available to use in their SDK -Call mParticleUser.getUserIdentities() to return an object of userIdentities --> { userIdentities: {customerid: '1234', email: 'email@gmail.com'} } -For more identity types, see http://docs.mparticle.com/developers/sdk/javascript/identity#allowed-identity-types -Call mParticleUser.getMPID() to get mParticle ID -For any additional methods, see http://docs.mparticle.com/developers/sdk/javascript/apidocs/classes/mParticle.Identity.getCurrentUser().html -*/ - -function UserAttributeHandler(common) { - this.common = common || {}; -} -UserAttributeHandler.prototype.onRemoveUserAttribute = function() {}; -UserAttributeHandler.prototype.onSetUserAttribute = function() {}; -UserAttributeHandler.prototype.onConsentStateUpdated = function() {}; - -var userAttributeHandler = UserAttributeHandler; - -// =============== REACH OUT TO MPARTICLE IF YOU HAVE ANY QUESTIONS =============== -// -// Copyright 2018 mParticle, Inc. -// -// Licensed 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 name = initialization_1.name, - moduleId = initialization_1.moduleId, - MessageType = { - SessionStart: 1, - SessionEnd: 2, - PageView: 3, - PageEvent: 4, - CrashReport: 5, - OptOut: 6, - Commerce: 16, - Media: 20, - }; - -var constructor = function() { - var self = this, - isInitialized = false, - forwarderSettings, - reportingService, - eventQueue = []; - - self.name = initialization_1.name; - self.moduleId = initialization_1.moduleId; - self.common = new common(); - - function initForwarder( - settings, - service, - testMode, - trackerId, - userAttributes, - userIdentities, - appVersion, - appName, - customFlags, - clientId - ) { - forwarderSettings = settings; - - if ( - typeof window !== 'undefined' && - window.mParticle.isTestEnvironment - ) { - reportingService = function() {}; - } else { - reportingService = service; - } - - try { - initialization_1.initForwarder( - settings, - testMode, - userAttributes, - userIdentities, - processEvent, - eventQueue, - isInitialized, - self.common, - appVersion, - appName, - customFlags, - clientId - ); - self.eventHandler = new eventHandler(self.common); - self.identityHandler = new identityHandler(self.common); - self.userAttributeHandler = new userAttributeHandler(self.common); - self.commerceHandler = new commerceHandler(self.common); - - isInitialized = true; - } catch (e) { - console.log('Failed to initialize ' + name + ' - ' + e); - } - } - - function processEvent(event) { - var reportEvent = false; - if (isInitialized) { - try { - if (event.EventDataType === MessageType.SessionStart) { - reportEvent = logSessionStart(event); - } else if (event.EventDataType === MessageType.SessionEnd) { - reportEvent = logSessionEnd(event); - } else if (event.EventDataType === MessageType.CrashReport) { - reportEvent = logError(event); - } else if (event.EventDataType === MessageType.PageView) { - reportEvent = logPageView(event); - } else if (event.EventDataType === MessageType.Commerce) { - reportEvent = logEcommerceEvent(event); - } else if (event.EventDataType === MessageType.PageEvent) { - reportEvent = logEvent(event); - } else if (event.EventDataType === MessageType.Media) { - // Kits should just treat Media Events as generic Events - reportEvent = logEvent(event); - } - if (reportEvent === true && reportingService) { - reportingService(self, event); - return 'Successfully sent to ' + name; - } else { - return ( - 'Error logging event or event type not supported on forwarder ' + - name - ); - } - } catch (e) { - return 'Failed to send to ' + name + ' ' + e; - } - } else { - eventQueue.push(event); - return ( - "Can't send to forwarder " + - name + - ', not initialized. Event added to queue.' - ); - } - } - - function logSessionStart(event) { - try { - return sessionHandler_1.onSessionStart(event); - } catch (e) { - return { - error: 'Error starting session on forwarder ' + name + '; ' + e, - }; - } - } - - function logSessionEnd(event) { - try { - return sessionHandler_1.onSessionEnd(event); - } catch (e) { - return { - error: 'Error ending session on forwarder ' + name + '; ' + e, - }; - } - } - - function logError(event) { - try { - return self.eventHandler.logError(event); - } catch (e) { - return { - error: 'Error logging error on forwarder ' + name + '; ' + e, - }; - } - } - - function logPageView(event) { - try { - return self.eventHandler.logPageView(event); - } catch (e) { - return { - error: - 'Error logging page view on forwarder ' + name + '; ' + e, - }; - } - } - - function logEvent(event) { - try { - return self.eventHandler.logEvent(event); - } catch (e) { - return { - error: 'Error logging event on forwarder ' + name + '; ' + e, - }; - } - } - - function logEcommerceEvent(event) { - try { - return self.commerceHandler.logCommerceEvent(event); - } catch (e) { - return { - error: - 'Error logging purchase event on forwarder ' + - name + - '; ' + - e, - }; - } - } - - function setUserAttribute(key, value) { - if (isInitialized) { - try { - self.userAttributeHandler.onSetUserAttribute( - key, - value, - forwarderSettings - ); - return 'Successfully set user attribute on forwarder ' + name; - } catch (e) { - return ( - 'Error setting user attribute on forwarder ' + - name + - '; ' + - e - ); - } - } else { - return ( - "Can't set user attribute on forwarder " + - name + - ', not initialized' - ); - } - } - - function removeUserAttribute(key) { - if (isInitialized) { - try { - self.userAttributeHandler.onRemoveUserAttribute( - key, - forwarderSettings - ); - return ( - 'Successfully removed user attribute on forwarder ' + name - ); - } catch (e) { - return ( - 'Error removing user attribute on forwarder ' + - name + - '; ' + - e - ); - } - } else { - return ( - "Can't remove user attribute on forwarder " + - name + - ', not initialized' - ); - } - } - - function setUserIdentity(id, type) { - if (isInitialized) { - try { - self.identityHandler.onSetUserIdentity( - forwarderSettings, - id, - type - ); - return 'Successfully set user Identity on forwarder ' + name; - } catch (e) { - return ( - 'Error removing user attribute on forwarder ' + - name + - '; ' + - e - ); - } - } else { - return ( - "Can't call setUserIdentity on forwarder " + - name + - ', not initialized' - ); - } - } - - function onUserIdentified(user) { - if (isInitialized) { - try { - self.identityHandler.onUserIdentified(user); - - return ( - 'Successfully called onUserIdentified on forwarder ' + name - ); - } catch (e) { - return { - error: - 'Error calling onUserIdentified on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't set new user identities on forwader " + - name + - ', not initialized' - ); - } - } - - function onIdentifyComplete(user, filteredIdentityRequest) { - if (isInitialized) { - try { - self.identityHandler.onIdentifyComplete( - user, - filteredIdentityRequest - ); - - return ( - 'Successfully called onIdentifyComplete on forwarder ' + - name - ); - } catch (e) { - return { - error: - 'Error calling onIdentifyComplete on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't call onIdentifyCompleted on forwader " + - name + - ', not initialized' - ); - } - } - - function onLoginComplete(user, filteredIdentityRequest) { - if (isInitialized) { - try { - self.identityHandler.onLoginComplete( - user, - filteredIdentityRequest - ); - - return ( - 'Successfully called onLoginComplete on forwarder ' + name - ); - } catch (e) { - return { - error: - 'Error calling onLoginComplete on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't call onLoginComplete on forwader " + - name + - ', not initialized' - ); - } - } - - function onLogoutComplete(user, filteredIdentityRequest) { - if (isInitialized) { - try { - self.identityHandler.onLogoutComplete( - user, - filteredIdentityRequest - ); - - return ( - 'Successfully called onLogoutComplete on forwarder ' + name - ); - } catch (e) { - return { - error: - 'Error calling onLogoutComplete on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't call onLogoutComplete on forwader " + - name + - ', not initialized' - ); - } - } - - function onModifyComplete(user, filteredIdentityRequest) { - if (isInitialized) { - try { - self.identityHandler.onModifyComplete( - user, - filteredIdentityRequest - ); - - return ( - 'Successfully called onModifyComplete on forwarder ' + name - ); - } catch (e) { - return { - error: - 'Error calling onModifyComplete on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't call onModifyComplete on forwader " + - name + - ', not initialized' - ); - } - } - - function setOptOut(isOptingOutBoolean) { - if (isInitialized) { - try { - self.initialization.setOptOut(isOptingOutBoolean); - - return 'Successfully called setOptOut on forwarder ' + name; - } catch (e) { - return { - error: - 'Error calling setOptOut on forwarder ' + - name + - '; ' + - e, - }; - } - } else { - return ( - "Can't call setOptOut on forwader " + - name + - ', not initialized' - ); - } - } - - this.init = initForwarder; - this.process = processEvent; - this.setUserAttribute = setUserAttribute; - this.removeUserAttribute = removeUserAttribute; - this.onUserIdentified = onUserIdentified; - this.setUserIdentity = setUserIdentity; - this.onIdentifyComplete = onIdentifyComplete; - this.onLoginComplete = onLoginComplete; - this.onLogoutComplete = onLogoutComplete; - this.onModifyComplete = onModifyComplete; - this.setOptOut = setOptOut; -}; - -function getId() { - return moduleId; -} - -function isObject(val) { - return ( - val != null && typeof val === 'object' && Array.isArray(val) === false - ); -} - -function register(config) { - if (!config) { - console.log( - 'You must pass a config object to register the kit ' + name - ); - return; - } - - if (!isObject(config)) { - console.log( - "'config' must be an object. You passed in a " + typeof config - ); - return; - } - - if (isObject(config.kits)) { - config.kits[name] = { - constructor: constructor, - }; - } else { - config.kits = {}; - config.kits[name] = { - constructor: constructor, - }; - } - console.log( - 'Successfully registered ' + name + ' to your mParticle configuration' - ); -} - -if (typeof window !== 'undefined') { - if (window && window.mParticle && window.mParticle.addForwarder) { - window.mParticle.addForwarder({ - name: name, - constructor: constructor, - getId: getId, - }); - } -} - -var webKitWrapper = { - register: register, -}; -var webKitWrapper_1 = webKitWrapper.register; - -exports.default = webKitWrapper; -exports.register = webKitWrapper_1; From b41f78679cb9eb3bb1dfd0820a9d003322baeb06 Mon Sep 17 00:00:00 2001 From: Michael Murphy Date: Wed, 18 Dec 2024 10:10:59 -0500 Subject: [PATCH 5/5] Revert "Delete dist/ID5Kit.common.js" This reverts commit 0e60701cb9ad972102abfa6243b7b12c53a64ee8. --- dist/ID5Kit.common.js | 1908 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1908 insertions(+) create mode 100644 dist/ID5Kit.common.js diff --git a/dist/ID5Kit.common.js b/dist/ID5Kit.common.js new file mode 100644 index 0000000..e95755f --- /dev/null +++ b/dist/ID5Kit.common.js @@ -0,0 +1,1908 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); +} + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +function getCjsExportFromNamespace (n) { + return n && n['default'] || n; +} + +var _nodeResolve_empty = {}; + +var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': _nodeResolve_empty +}); + +var require$$0 = getCjsExportFromNamespace(_nodeResolve_empty$1); + +var core = createCommonjsModule(function (module, exports) { +(function (root, factory) { + { + // CommonJS + module.exports = exports = factory(); + } +}(commonjsGlobal, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined$1) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof commonjsGlobal !== 'undefined' && commonjsGlobal.crypto) { + crypto = commonjsGlobal.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof commonjsRequire === 'function') { + try { + crypto = require$$0; + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined$1) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); +}); + +var sha256 = createCommonjsModule(function (module, exports) { +(function (root, factory) { + { + // CommonJS + module.exports = exports = factory(core); + } +}(commonjsGlobal, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + return CryptoJS.SHA256; + +})); +}); + +function Common() {} + +Common.prototype.exampleMethod = function () { + return 'I am an example'; +}; + +Common.prototype.logId5Id = function (id5Id) { + if (!id5Id) { + return; + } + + var integrationAttributes = { + encryptedId5Id: id5Id, + id5IdType: this.id5IdType, + }; + + window.mParticle.setIntegrationAttribute(this.moduleId, integrationAttributes); +}; + +Common.prototype.buildPartnerData = function (mParticleUser) { + var pdKeys = {}; + var userIdentities = mParticleUser.getUserIdentities(); + + var email = this.normalizeEmail(userIdentities.userIdentities['email']); + var phone = this.normalizePhone(userIdentities.userIdentities['mobile_number']); + + if (!email && !phone) { + return null; + } + + if (email) { + pdKeys[1] = sha256(email); + } + + if (phone) { + pdKeys[2]= sha256(phone); + } + + var pdRaw = Object.keys(pdKeys).map(function(key){ + return key + '=' + pdKeys[key] + }).join('&'); + + return btoa(pdRaw); +}; + +Common.prototype.normalizeEmail = function(email) { + if (!email || !this.validateEmail(email)) { + return null; + } + var parts = email.split("@"); + var charactersToRemove = ['+', '.']; + + if (parts[1] != 'gmail.com') { + return email; + } + + parts[0]= this.replace(parts[0], charactersToRemove); + + return parts.join('@'); +}; + +Common.prototype.normalizePhone = function(phone) { + if (!phone) { + return null; + } + var charactersToRemove = [' ', '-', '(', ')']; + var normalizedPhone = this.replace(phone, charactersToRemove); + + if (normalizedPhone[0] !== '+') { + normalizedPhone = '+' + normalizedPhone; + } + + if (!this.validatePhone(normalizedPhone)) { + return null; + } + return normalizedPhone; +}; + +Common.prototype.replace = function(string, targets) { + var newString = ''; + for(var i = 0; i < string.length; i++){ + var char = string[i]; + if (!targets.includes(char)){ + newString += char; + } + } + return newString.toLowerCase(); +}; + +Common.prototype.validateEmail = function(email){ + if (!email) { + return false; + } + var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); +}; + +Common.prototype.validatePhone = function(phone) { + if (!phone){ + return false; + } + var e164Regex = /^\+?[1-9]\d{1,14}$/; + + return e164Regex.test(phone); +}; +var common = Common; + +function CommerceHandler(common) { + this.common = common || {}; +} + +CommerceHandler.prototype.logCommerceEvent = function() { + /* + Sample ecommerce event schema: + { + CurrencyCode: 'USD', + DeviceId:'a80eea1c-57f5-4f84-815e-06fe971b6ef2', // MP generated + EventAttributes: { key1: 'value1', key2: 'value2' }, + EventType: 16, + EventCategory: 10, // (This is an add product to cart event, see below for additional ecommerce EventCategories) + EventName: "eCommerce - AddToCart", + MPID: "8278431810143183490", + ProductAction: { + Affiliation: 'aff1', + CouponCode: 'coupon', + ProductActionType: 7, + ProductList: [ + { + Attributes: { prodKey1: 'prodValue1', prodKey2: 'prodValue2' }, + Brand: 'Apple', + Category: 'phones', + CouponCode: 'coupon1', + Name: 'iPhone', + Price: '600', + Quantity: 2, + Sku: "SKU123", + TotalAmount: 1200, + Variant: '64GB' + } + ], + TransactionId: "tid1", + ShippingAmount: 10, + TaxAmount: 5, + TotalAmount: 1215, + }, + UserAttributes: { userKey1: 'userValue1', userKey2: 'userValue2' } + UserIdentities: [ + { + Identity: 'test@gmail.com', Type: 7 + } + ] + } + + If your SDK has specific ways to log different eCommerce events, see below for + mParticle's additional ecommerce EventCategory types: + + 10: ProductAddToCart, (as shown above) + 11: ProductRemoveFromCart, + 12: ProductCheckout, + 13: ProductCheckoutOption, + 14: ProductClick, + 15: ProductViewDetail, + 16: ProductPurchase, + 17: ProductRefund, + 18: PromotionView, + 19: PromotionClick, + 20: ProductAddToWishlist, + 21: ProductRemoveFromWishlist, + 22: ProductImpression + */ +}; + +var commerceHandler = CommerceHandler; + +/* +A non-ecommerce event has the following schema: + +{ + DeviceId: "a80eea1c-57f5-4f84-815e-06fe971b6ef2", + EventAttributes: {test: "Error", t: 'stack trace in string form'}, + EventName: "Error", + MPID: "123123123123", + UserAttributes: {userAttr1: 'value1', userAttr2: 'value2'}, + UserIdentities: [{Identity: 'email@gmail.com', Type: 7}] + User Identity Types can be found here: +} + +*/ + +function EventHandler(common) { + this.common = common || {}; +} +EventHandler.prototype.logEvent = function() {}; +EventHandler.prototype.logError = function() { + // The schema for a logError event is the same, but noteworthy differences are as follows: + // { + // EventAttributes: {m: 'name of error passed into MP', s: "Error", t: 'stack trace in string form if applicable'}, + // EventName: "Error" + // } +}; +EventHandler.prototype.logPageView = function() { + /* The schema for a logPagView event is the same, but noteworthy differences are as follows: + { + EventAttributes: {hostname: "www.google.com", title: 'Test Page'}, // These are event attributes only if no additional event attributes are explicitly provided to mParticle.logPageView(...) + } + */ +}; + +var eventHandler = EventHandler; + +/* +The 'mParticleUser' is an object with methods get user Identities and set/get user attributes +Partners can determine what userIds are available to use in their SDK +Call mParticleUser.getUserIdentities() to return an object of userIdentities --> { userIdentities: {customerid: '1234', email: 'email@gmail.com'} } +For more identity types, see https://docs.mparticle.com/developers/sdk/web/idsync/#supported-identity-types +Call mParticleUser.getMPID() to get mParticle ID +For any additional methods, see https://docs.mparticle.com/developers/sdk/web/core-apidocs/classes/mParticle.Identity.getCurrentUser().html +*/ + +/* +identityApiRequest has the schema: +{ + userIdentities: { + customerid: '123', + email: 'abc' + } +} +For more userIdentity types, see https://docs.mparticle.com/developers/sdk/web/idsync/#supported-identity-types +*/ + +function IdentityHandler(common) { + this.common = common || {}; +} +IdentityHandler.prototype.onUserIdentified = function() {}; +IdentityHandler.prototype.onIdentifyComplete = function() {}; + +//Must re-initialize ID5 with partner identities(pd) in the config to collect an updated ID5 ID +IdentityHandler.prototype.onLoginComplete = function( + mParticleUser +) { + var partnerData = this.common.buildPartnerData(mParticleUser); + + if (partnerData) { + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + pd: partnerData, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); + var logId5Id = this.common.logId5Id; + + id5Instance.onAvailable(function(status){ + logId5Id(status.getUserId()); + }.bind(logId5Id)); + } +}; + +//Must re-initialize ID5 without partner identities (pd) in the config to revert to an anonymous ID5 ID +IdentityHandler.prototype.onLogoutComplete = function( +) { + var id5Instance = window.ID5.init({ + partnerId: this.common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); + var logId5Id = this.common.logId5Id; + + id5Instance.onAvailable(function(status){ + logId5Id(status.getUserId()); + }.bind(logId5Id)); +}; + +IdentityHandler.prototype.onModifyComplete = function() {}; + +/* In previous versions of the mParticle web SDK, setting user identities on + kits is only reachable via the onSetUserIdentity method below. We recommend + filling out `onSetUserIdentity` for maximum compatibility +*/ +IdentityHandler.prototype.onSetUserIdentity = function() {}; + +var identityHandler = IdentityHandler; + +var initialization = { + name: 'ID5', + moduleId: 248, + /* ****** Fill out initForwarder to load your SDK ****** + Note that not all arguments may apply to your SDK initialization. + These are passed from mParticle, but leave them even if they are not being used. + forwarderSettings contain settings that your SDK requires in order to initialize + userAttributes example: {gender: 'male', age: 25} + userIdentities example: { 1: 'customerId', 2: 'facebookId', 7: 'emailid@email.com' } + additional identityTypes can be found at https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/src/types.js#L88-L101 +*/ + initForwarder: function(forwarderSettings, testMode, userAttributes, userIdentities, processEvent, eventQueue, isInitialized, common) { + /* `forwarderSettings` contains your SDK specific settings such as apiKey that your customer needs in order to initialize your SDK properly */ + common.partnerId = forwarderSettings.partnerId; + common.id5IdType = forwarderSettings.id5IdType; + common.moduleId = this.moduleId; + + if (!testMode) { + /* Load your Web SDK here using a variant of your snippet from your readme that your customers would generally put into their tags + Generally, our integrations create script tags and append them to the . Please follow the following format as a guide: + */ + //ID5 docs on initialization can be found here: https://github.com/id5io/id5-api.js/blob/master/README.md + var id5Script = document.createElement('script'); + id5Script.src = 'https://cdn.id5-sync.com/api/1.0/id5-api.js'; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(id5Script); + + id5Script.onload = function() { + + var id5Instance = window.ID5.init({ + partnerId: common.partnerId, + consentData: { + allowedVendors: [ '131', 'ID5-1747' ] + } + }); + + id5Instance.onAvailable(function(status){ + common.logId5Id(status.getUserId()); + }.bind(common)); + }; + } else { + + var id5Instance = window.ID5.init({partnerId: common.partnerId}); + + id5Instance.onAvailable(function(status){ + common.logId5Id(status.getUserId()); + }.bind(common)); + } + } +}; + +var initialization_1 = initialization; + +var sessionHandler = { + onSessionStart: function() { + + }, + onSessionEnd: function() { + + } +}; + +var sessionHandler_1 = sessionHandler; + +/* +The 'mParticleUser' is an object with methods on it to get user Identities and set/get user attributes +Partners can determine what userIds are available to use in their SDK +Call mParticleUser.getUserIdentities() to return an object of userIdentities --> { userIdentities: {customerid: '1234', email: 'email@gmail.com'} } +For more identity types, see http://docs.mparticle.com/developers/sdk/javascript/identity#allowed-identity-types +Call mParticleUser.getMPID() to get mParticle ID +For any additional methods, see http://docs.mparticle.com/developers/sdk/javascript/apidocs/classes/mParticle.Identity.getCurrentUser().html +*/ + +function UserAttributeHandler(common) { + this.common = common || {}; +} +UserAttributeHandler.prototype.onRemoveUserAttribute = function() {}; +UserAttributeHandler.prototype.onSetUserAttribute = function() {}; +UserAttributeHandler.prototype.onConsentStateUpdated = function() {}; + +var userAttributeHandler = UserAttributeHandler; + +// =============== REACH OUT TO MPARTICLE IF YOU HAVE ANY QUESTIONS =============== +// +// Copyright 2018 mParticle, Inc. +// +// Licensed 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 name = initialization_1.name, + moduleId = initialization_1.moduleId, + MessageType = { + SessionStart: 1, + SessionEnd: 2, + PageView: 3, + PageEvent: 4, + CrashReport: 5, + OptOut: 6, + Commerce: 16, + Media: 20, + }; + +var constructor = function() { + var self = this, + isInitialized = false, + forwarderSettings, + reportingService, + eventQueue = []; + + self.name = initialization_1.name; + self.moduleId = initialization_1.moduleId; + self.common = new common(); + + function initForwarder( + settings, + service, + testMode, + trackerId, + userAttributes, + userIdentities, + appVersion, + appName, + customFlags, + clientId + ) { + forwarderSettings = settings; + + if ( + typeof window !== 'undefined' && + window.mParticle.isTestEnvironment + ) { + reportingService = function() {}; + } else { + reportingService = service; + } + + try { + initialization_1.initForwarder( + settings, + testMode, + userAttributes, + userIdentities, + processEvent, + eventQueue, + isInitialized, + self.common, + appVersion, + appName, + customFlags, + clientId + ); + self.eventHandler = new eventHandler(self.common); + self.identityHandler = new identityHandler(self.common); + self.userAttributeHandler = new userAttributeHandler(self.common); + self.commerceHandler = new commerceHandler(self.common); + + isInitialized = true; + } catch (e) { + console.log('Failed to initialize ' + name + ' - ' + e); + } + } + + function processEvent(event) { + var reportEvent = false; + if (isInitialized) { + try { + if (event.EventDataType === MessageType.SessionStart) { + reportEvent = logSessionStart(event); + } else if (event.EventDataType === MessageType.SessionEnd) { + reportEvent = logSessionEnd(event); + } else if (event.EventDataType === MessageType.CrashReport) { + reportEvent = logError(event); + } else if (event.EventDataType === MessageType.PageView) { + reportEvent = logPageView(event); + } else if (event.EventDataType === MessageType.Commerce) { + reportEvent = logEcommerceEvent(event); + } else if (event.EventDataType === MessageType.PageEvent) { + reportEvent = logEvent(event); + } else if (event.EventDataType === MessageType.Media) { + // Kits should just treat Media Events as generic Events + reportEvent = logEvent(event); + } + if (reportEvent === true && reportingService) { + reportingService(self, event); + return 'Successfully sent to ' + name; + } else { + return ( + 'Error logging event or event type not supported on forwarder ' + + name + ); + } + } catch (e) { + return 'Failed to send to ' + name + ' ' + e; + } + } else { + eventQueue.push(event); + return ( + "Can't send to forwarder " + + name + + ', not initialized. Event added to queue.' + ); + } + } + + function logSessionStart(event) { + try { + return sessionHandler_1.onSessionStart(event); + } catch (e) { + return { + error: 'Error starting session on forwarder ' + name + '; ' + e, + }; + } + } + + function logSessionEnd(event) { + try { + return sessionHandler_1.onSessionEnd(event); + } catch (e) { + return { + error: 'Error ending session on forwarder ' + name + '; ' + e, + }; + } + } + + function logError(event) { + try { + return self.eventHandler.logError(event); + } catch (e) { + return { + error: 'Error logging error on forwarder ' + name + '; ' + e, + }; + } + } + + function logPageView(event) { + try { + return self.eventHandler.logPageView(event); + } catch (e) { + return { + error: + 'Error logging page view on forwarder ' + name + '; ' + e, + }; + } + } + + function logEvent(event) { + try { + return self.eventHandler.logEvent(event); + } catch (e) { + return { + error: 'Error logging event on forwarder ' + name + '; ' + e, + }; + } + } + + function logEcommerceEvent(event) { + try { + return self.commerceHandler.logCommerceEvent(event); + } catch (e) { + return { + error: + 'Error logging purchase event on forwarder ' + + name + + '; ' + + e, + }; + } + } + + function setUserAttribute(key, value) { + if (isInitialized) { + try { + self.userAttributeHandler.onSetUserAttribute( + key, + value, + forwarderSettings + ); + return 'Successfully set user attribute on forwarder ' + name; + } catch (e) { + return ( + 'Error setting user attribute on forwarder ' + + name + + '; ' + + e + ); + } + } else { + return ( + "Can't set user attribute on forwarder " + + name + + ', not initialized' + ); + } + } + + function removeUserAttribute(key) { + if (isInitialized) { + try { + self.userAttributeHandler.onRemoveUserAttribute( + key, + forwarderSettings + ); + return ( + 'Successfully removed user attribute on forwarder ' + name + ); + } catch (e) { + return ( + 'Error removing user attribute on forwarder ' + + name + + '; ' + + e + ); + } + } else { + return ( + "Can't remove user attribute on forwarder " + + name + + ', not initialized' + ); + } + } + + function setUserIdentity(id, type) { + if (isInitialized) { + try { + self.identityHandler.onSetUserIdentity( + forwarderSettings, + id, + type + ); + return 'Successfully set user Identity on forwarder ' + name; + } catch (e) { + return ( + 'Error removing user attribute on forwarder ' + + name + + '; ' + + e + ); + } + } else { + return ( + "Can't call setUserIdentity on forwarder " + + name + + ', not initialized' + ); + } + } + + function onUserIdentified(user) { + if (isInitialized) { + try { + self.identityHandler.onUserIdentified(user); + + return ( + 'Successfully called onUserIdentified on forwarder ' + name + ); + } catch (e) { + return { + error: + 'Error calling onUserIdentified on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't set new user identities on forwader " + + name + + ', not initialized' + ); + } + } + + function onIdentifyComplete(user, filteredIdentityRequest) { + if (isInitialized) { + try { + self.identityHandler.onIdentifyComplete( + user, + filteredIdentityRequest + ); + + return ( + 'Successfully called onIdentifyComplete on forwarder ' + + name + ); + } catch (e) { + return { + error: + 'Error calling onIdentifyComplete on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't call onIdentifyCompleted on forwader " + + name + + ', not initialized' + ); + } + } + + function onLoginComplete(user, filteredIdentityRequest) { + if (isInitialized) { + try { + self.identityHandler.onLoginComplete( + user, + filteredIdentityRequest + ); + + return ( + 'Successfully called onLoginComplete on forwarder ' + name + ); + } catch (e) { + return { + error: + 'Error calling onLoginComplete on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't call onLoginComplete on forwader " + + name + + ', not initialized' + ); + } + } + + function onLogoutComplete(user, filteredIdentityRequest) { + if (isInitialized) { + try { + self.identityHandler.onLogoutComplete( + user, + filteredIdentityRequest + ); + + return ( + 'Successfully called onLogoutComplete on forwarder ' + name + ); + } catch (e) { + return { + error: + 'Error calling onLogoutComplete on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't call onLogoutComplete on forwader " + + name + + ', not initialized' + ); + } + } + + function onModifyComplete(user, filteredIdentityRequest) { + if (isInitialized) { + try { + self.identityHandler.onModifyComplete( + user, + filteredIdentityRequest + ); + + return ( + 'Successfully called onModifyComplete on forwarder ' + name + ); + } catch (e) { + return { + error: + 'Error calling onModifyComplete on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't call onModifyComplete on forwader " + + name + + ', not initialized' + ); + } + } + + function setOptOut(isOptingOutBoolean) { + if (isInitialized) { + try { + self.initialization.setOptOut(isOptingOutBoolean); + + return 'Successfully called setOptOut on forwarder ' + name; + } catch (e) { + return { + error: + 'Error calling setOptOut on forwarder ' + + name + + '; ' + + e, + }; + } + } else { + return ( + "Can't call setOptOut on forwader " + + name + + ', not initialized' + ); + } + } + + this.init = initForwarder; + this.process = processEvent; + this.setUserAttribute = setUserAttribute; + this.removeUserAttribute = removeUserAttribute; + this.onUserIdentified = onUserIdentified; + this.setUserIdentity = setUserIdentity; + this.onIdentifyComplete = onIdentifyComplete; + this.onLoginComplete = onLoginComplete; + this.onLogoutComplete = onLogoutComplete; + this.onModifyComplete = onModifyComplete; + this.setOptOut = setOptOut; +}; + +function getId() { + return moduleId; +} + +function isObject(val) { + return ( + val != null && typeof val === 'object' && Array.isArray(val) === false + ); +} + +function register(config) { + if (!config) { + console.log( + 'You must pass a config object to register the kit ' + name + ); + return; + } + + if (!isObject(config)) { + console.log( + "'config' must be an object. You passed in a " + typeof config + ); + return; + } + + if (isObject(config.kits)) { + config.kits[name] = { + constructor: constructor, + }; + } else { + config.kits = {}; + config.kits[name] = { + constructor: constructor, + }; + } + console.log( + 'Successfully registered ' + name + ' to your mParticle configuration' + ); +} + +if (typeof window !== 'undefined') { + if (window && window.mParticle && window.mParticle.addForwarder) { + window.mParticle.addForwarder({ + name: name, + constructor: constructor, + getId: getId, + }); + } +} + +var webKitWrapper = { + register: register, +}; +var webKitWrapper_1 = webKitWrapper.register; + +exports.default = webKitWrapper; +exports.register = webKitWrapper_1;