@mparticle/web-sdk 3.4.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ map:function map(a,b){var c,d,e;if(null===this)throw new TypeError(" this is nul
15
15
  filter:function filter(a/*, thisArg*/){if(void 0===this||null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if("function"!=typeof a)throw new TypeError;for(var d=[],e=2<=arguments.length?arguments[1]:void 0,f=0;f<c;f++)if(f in b){var g=b[f];a.call(e,g,f,b)&&d.push(g);}return d},// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
16
16
  isArray:function isArray(a){return "[object Array]"===Object.prototype.toString.call(a)},Base64:Base64$1};
17
17
 
18
- var version = "3.4.0";
18
+ var version = "3.6.0";
19
19
 
20
20
  var Constants={sdkVersion:version,sdkVendor:"mparticle",platform:"web",Messages:{DeprecationMessages:{MethodHasBeenDeprecated:"has been deprecated.",MethodMarkedForDeprecationPostfix:"is a deprecated method and will be removed in future releases.",AlternativeMethodPrefix:"Please use the alternate method:"},ErrorMessages:{NoToken:"A token must be specified.",EventNameInvalidType:"Event name must be a valid string value.",EventDataInvalidType:"Event data must be a valid object hash.",LoggingDisabled:"Event logging is currently disabled.",CookieParseError:"Could not parse cookie",EventEmpty:"Event object is null or undefined, cancelling send",APIRequestEmpty:"APIRequest is null or undefined, cancelling send",NoEventType:"Event type must be specified.",TransactionIdRequired:"Transaction ID is required",TransactionRequired:"A transaction attributes object is required",PromotionIdRequired:"Promotion ID is required",BadAttribute:"Attribute value cannot be object or array",BadKey:"Key value cannot be object or array",BadLogPurchase:"Transaction attributes and a product are both required to log a purchase, https://docs.mparticle.com/?javascript#measuring-transactions",AudienceAPINotEnabled:"Your workspace is not enabled to retrieve user audiences."},InformationMessages:{CookieSearch:"Searching for cookie",CookieFound:"Cookie found, parsing values",CookieNotFound:"Cookies not found",CookieSet:"Setting cookie",CookieSync:"Performing cookie sync",SendBegin:"Starting to send event",SendIdentityBegin:"Starting to send event to identity server",SendWindowsPhone:"Sending event to Windows Phone container",SendIOS:"Calling iOS path: ",SendAndroid:"Calling Android JS interface method: ",SendHttp:"Sending event to mParticle HTTP service",SendAliasHttp:"Sending alias request to mParticle HTTP service",SendIdentityHttp:"Sending event to mParticle HTTP service",StartingNewSession:"Starting new Session",StartingLogEvent:"Starting to log event",StartingLogOptOut:"Starting to log user opt in/out",StartingEndSession:"Starting to end session",StartingInitialization:"Starting to initialize",StartingLogCommerceEvent:"Starting to log commerce event",StartingAliasRequest:"Starting to Alias MPIDs",LoadingConfig:"Loading configuration options",AbandonLogEvent:"Cannot log event, logging disabled or developer token not set",AbandonAliasUsers:"Cannot Alias Users, logging disabled or developer token not set",AbandonStartSession:"Cannot start session, logging disabled or developer token not set",AbandonEndSession:"Cannot end session, logging disabled or developer token not set",NoSessionToEnd:"Cannot end session, no active session found"},ValidationMessages:{ModifyIdentityRequestUserIdentitiesPresent:"identityRequests to modify require userIdentities to be present. Request not sent to server. Please fix and try again",IdentityRequesetInvalidKey:"There is an invalid key on your identityRequest object. It can only contain a `userIdentities` object and a `onUserAlias` function. Request not sent to server. Please fix and try again.",OnUserAliasType:"The onUserAlias value must be a function.",UserIdentities:"The userIdentities key must be an object with keys of identityTypes and values of strings. Request not sent to server. Please fix and try again.",UserIdentitiesInvalidKey:"There is an invalid identity key on your `userIdentities` object within the identityRequest. Request not sent to server. Please fix and try again.",UserIdentitiesInvalidValues:"All user identity values must be strings or null. Request not sent to server. Please fix and try again.",AliasMissingMpid:"Alias Request must contain both a destinationMpid and a sourceMpid",AliasNonUniqueMpid:"Alias Request's destinationMpid and sourceMpid must be unique",AliasMissingTime:"Alias Request must have both a startTime and an endTime",AliasStartBeforeEndTime:"Alias Request's endTime must be later than its startTime"}},NativeSdkPaths:{LogEvent:"logEvent",SetUserTag:"setUserTag",RemoveUserTag:"removeUserTag",SetUserAttribute:"setUserAttribute",RemoveUserAttribute:"removeUserAttribute",SetSessionAttribute:"setSessionAttribute",LogOut:"logOut",SetUserAttributeList:"setUserAttributeList",RemoveAllUserAttributes:"removeAllUserAttributes",GetUserAttributesLists:"getUserAttributesLists",GetAllUserAttributes:"getAllUserAttributes",Identify:"identify",Logout:"logout",Login:"login",Modify:"modify",Alias:"aliasUsers",Upload:"upload"},StorageNames:{localStorageName:"mprtcl-api",localStorageNameV3:"mprtcl-v3",cookieName:"mprtcl-api",cookieNameV2:"mprtcl-v2",cookieNameV3:"mprtcl-v3",localStorageNameV4:"mprtcl-v4",cookieNameV4:"mprtcl-v4",currentStorageName:"mprtcl-v4"},DefaultConfig:{cookieDomain:null,cookieExpiration:365,logLevel:null,timeout:300,sessionTimeout:30,forwarderStatsTimeout:5e3,integrationDelayTimeout:5e3,maxCookieSize:3e3,aliasMaxWindow:90,uploadInterval:0// Maximum milliseconds in between batch uploads, below 500 will mean immediate upload. The server returns this as a string, but we are using it as a number internally
21
21
  },DefaultBaseUrls:{v1SecureServiceUrl:"jssdks.mparticle.com/v1/JS/",v2SecureServiceUrl:"jssdks.mparticle.com/v2/JS/",v3SecureServiceUrl:"jssdks.mparticle.com/v3/JS/",configUrl:"jssdkcdns.mparticle.com/JS/v2/",identityUrl:"identity.mparticle.com/v1/",aliasUrl:"jssdks.mparticle.com/v1/identity/",userAudienceUrl:"nativesdks.mparticle.com/v1/"},// These are the paths that are used to construct the CNAME urls
@@ -623,7 +623,9 @@ if(!g||a._Store.requireDelay||!a._Store.configurationLoaded)return a.Logger.verb
623
623
 
624
624
  var KitFilterHelper=/** @class */function(){function a(){}a.hashEventType=function(a){return generateHash(a)},a.hashEventName=function(a,b){return generateHash(b+a)},a.hashEventAttributeKey=function(a,b,c){return generateHash(a+b+c)},a.hashUserAttribute=function(a){return generateHash(a)},a.hashUserIdentity=function(a){return a},a.hashConsentPurpose=function(a,b){return generateHash(a+b)},a.hashAttributeConditionalForwarding=function(a){return generateHash(a).toString()},a.hashConsentPurposeConditionalForwarding=function(a,b){return this.hashConsentPurpose(a,b).toString()};var b;return b=a,a.filterUserAttributes=function(a,c){return filterDictionaryWithHash(a,c,function(a){return b.hashUserAttribute(a)})},a.filterUserIdentities=function(a,c){return filterDictionaryWithHash(a,c,function(a){return b.hashUserIdentity(IdentityType.getIdentityType(a))})},a.isFilteredUserAttribute=function(a,c){var d=b.hashUserAttribute(a);return c&&inArray(c,d)},a}();
625
625
 
626
- var StorageNames$1=Constants.StorageNames;function appendFilteredUserIdentity(a,b,c){c===Types.IdentityType.CustomerId?a.unshift(b):a.push(b);}function buildFilteredUserIdentities$1(a,b,c){var d=[];if(!a||!Object.keys(a).length)return d;for(var e in a)if(a.hasOwnProperty(e)){var f=Types.IdentityType.getIdentityType(e);c(b,f)||appendFilteredUserIdentity(d,{Type:f,Identity:a[e]},f);}return d}function Helpers(a){var b=this;// TODO: Refactor SDK to directly use these methods
626
+ var StorageNames$1=Constants.StorageNames;function appendFilteredUserIdentity(a,b,c){c===Types.IdentityType.CustomerId?a.unshift(b):a.push(b);}function buildFilteredUserIdentities$1(a,b,c){var d=[];if(!a||!Object.keys(a).length)return d;for(var e in a)if(a.hasOwnProperty(e)){// Must be `=== false`: IdentityType.Other is 0, so a falsy check would
627
+ // drop a valid type.
628
+ var f=Types.IdentityType.getIdentityType(e),g=!1===f;g||c(b,f)||appendFilteredUserIdentity(d,{Type:f,Identity:a[e]},f);}return d}function Helpers(a){var b=this;// TODO: Refactor SDK to directly use these methods
627
629
  // https://go.mparticle.com/work/SQDSDKS-5239
628
630
  // Utility Functions
629
631
  // Imported Validators
@@ -766,9 +768,11 @@ function k(b){var c=a._Store;return b.gs.sid=c.sessionId,b.gs.ie=c.isEnabled,b.g
766
768
  a. Remove at random MPIDs on the cookie that are not part of the currentSessionMPIDs
767
769
  b. Then remove MPIDs based on order in currentSessionMPIDs array, which
768
770
  stores MPIDs based on earliest login.
769
- */function l(a,b){return a.length>b}function m(a,b,c,d){var e;for(var f in a)a.hasOwnProperty(f)&&(e=r(a,b,c),!!l(e,d))&&(SDKv2NonMPIDCookieKeys[f]||f===a.cu||delete a[f]);return e}function n(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(SDKv2NonMPIDCookieKeys[c]||c===a.cu||(b[c]=1));return b}function o(a,b,c,d,e,f){var g;for(var h in b)(g=r(a,d,e),!!l(g,f))&&b.hasOwnProperty(h)&&-1===c.indexOf(h)&&delete a[h];return g}function p(b,c,d){return b[c]?(a.Logger.verbose("Size of new encoded cookie is larger than maxCookieSize setting of "+d+". Removing from cookie the earliest logged in MPID containing: "+JSON.stringify(b[c],null,2)),void delete b[c]):void a.Logger.error("Unable to save MPID data to cookies because the resulting encoded cookie is larger than the maxCookieSize setting of "+d+". We recommend using a maxCookieSize of 1500.")}function q(a,b,c,d,e){for(var f,g=0;g<b.length&&(f=r(a,c,d),!!l(f,e));g++)p(a,b[g],e);return f}function r(a,b,c){return E.encodePersistence(JSON.stringify(a))+";expires="+b+";path=/"+c}function s(a,b,c){for(var d in a)if(b===d&&c===a[d])return !0;return !1}function t(a,b,c){var d;for(var e in a)// any value in persistence that has an MPID key will be an MPID to search through
771
+ */function l(a,b){return a.length>b}function m(a,b,c,d){var e;for(var f in a)a.hasOwnProperty(f)&&(e=r(a,b,c),!!l(e,d))&&(SDKv2NonMPIDCookieKeys[f]||f===a.cu||delete a[f]);return e}function n(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(SDKv2NonMPIDCookieKeys[c]||c===a.cu||(b[c]=1));return b}function o(a,b,c,d,e,f){var g;for(var h in b)(g=r(a,d,e),!!l(g,f))&&b.hasOwnProperty(h)&&-1===c.indexOf(h)&&delete a[h];return g}function p(b,c,d){return b[c]?(a.Logger.verbose("Size of new encoded cookie is larger than maxCookieSize setting of "+d+". Removing from cookie the earliest logged in MPID containing: "+JSON.stringify(b[c],null,2)),void delete b[c]):void a.Logger.error("Unable to save MPID data to cookies because the resulting encoded cookie is larger than the maxCookieSize setting of "+d+". We recommend using a maxCookieSize of 1500.")}function q(a,b,c,d,e){for(var f,g=0;g<b.length&&(f=r(a,c,d),!!l(f,e));g++)p(a,b[g],e);return f}function r(a,b,c){return E.encodePersistence(JSON.stringify(a))+";expires="+b+";path=/"+c}function s(a,b,c){for(var d in a)if(b===d&&c===a[d])return !0;return !1}function t(b,c,d){var e;for(var f in b)// any value in persistence that has an MPID key will be an MPID to search through
770
772
  // other keys on the cookie are currentSessionMPIDs and currentMPID which should not be searched
771
- a[e].mpid&&s(a[e].ui,b,c)&&(d=e);return d}function u(a,b){var c;for(var d in b.userIdentities)if(a&&Object.keys(a).length){var e=t(a,d,b.userIdentities[d]);e&&(c=e);}return c}function v(b){return Array.isArray(b)?0<b.length:!!a._Helpers.isObject(b)&&0<Object.keys(b).length}function w(a,b){return a[b]&&v(a[b])?void(a[b]=Base64.encode(JSON.stringify(a[b]))):void delete a[b]}function x(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){w(a,b);continue}if("ie"==b){a[b]=a[b]?1:0;continue}a[b]||delete a[b];}}function y(b,c){var d=b[c];return a._Helpers.isObject(d)&&Object.keys(d).length?void(b[c]=Base64.encode(JSON.stringify(d))):void delete b[c]}function z(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&y(a,b);}function A(a){for(var b in a)a.hasOwnProperty(b)&&(SDKv2NonMPIDCookieKeys[b]||z(a[b]));}function B(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){a[b]=JSON.parse(Base64.decode(a[b]));continue}"ie"==b&&(a[b]=!!a[b]);}}function C(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&a[b].length&&(a[b]=JSON.parse(Base64.decode(a[b])));}function D(a){for(var b in a)if(a.hasOwnProperty(b)){if(!SDKv2NonMPIDCookieKeys[b]){C(a[b]);continue}"l"==b&&(a[b]=!!a[b]);}}// TODO: This should actually be decodePersistenceString or
773
+ a._Helpers.isObject(b[f])&&b[f].mpid&&s(b[f].ui,c,d)&&(e=f);return e}function u(a,b){var c;for(var d in b.userIdentities)if(a&&Object.keys(a).length){var e=t(a,d,b.userIdentities[d]);e&&(c=e);}return c}function v(b){return Array.isArray(b)?0<b.length:!!a._Helpers.isObject(b)&&0<Object.keys(b).length}function w(a,b){return a[b]&&v(a[b])?void(a[b]=Base64.encode(JSON.stringify(a[b]))):void delete a[b]}function x(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){w(a,b);continue}if("ie"==b){a[b]=a[b]?1:0;continue}a[b]||delete a[b];}}function y(b,c){var d=b[c];return a._Helpers.isObject(d)&&Object.keys(d).length?void(b[c]=Base64.encode(JSON.stringify(d))):void delete b[c]}function z(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&y(a,b);}function A(a){for(var b in a)a.hasOwnProperty(b)&&(SDKv2NonMPIDCookieKeys[b]||z(a[b]));}function B(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){a[b]=JSON.parse(Base64.decode(a[b])),"csm"!==b||Array.isArray(a[b])||delete a[b];continue}"ie"==b&&(a[b]=!!a[b]);}}function C(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&a[b].length&&(a[b]=JSON.parse(Base64.decode(a[b])));}function D(b){for(var c in b)if(b.hasOwnProperty(c)){if(!SDKv2NonMPIDCookieKeys[c]){// Written as an object by encodeMpidRecords, then read as one by
774
+ // findMpidForRequestedIdentity and copied by copyNonCurrentUserMpids.
775
+ if(!a._Helpers.isObject(b[c])){delete b[c];continue}C(b[c]);continue}"l"==c&&(b[c]=!!b[c]);}}// TODO: This should actually be decodePersistenceString or
772
776
  // we should refactor this to take a string and return an object
773
777
  var E=this;// https://go.mparticle.com/work/SQDSDKS-5022
774
778
  // https://go.mparticle.com/work/SQDSDKS-5022
@@ -936,7 +940,7 @@ function isAttributeKeyAllowed(a,b){return !(null!==a&&void 0!==a)||!a.isAttribu
936
940
  var FORWARDING_RULE_MESSAGE_TYPES=[Types.MessageType.PageEvent,Types.MessageType.PageView,Types.MessageType.Commerce];function inFilteredList(a,b){return !!(a&&a.length)&&inArray(a,b)}function isBlockedByForwardingRule(a,b,c){if(!FORWARDING_RULE_MESSAGE_TYPES.includes(a)||!c.filteringEventAttributeValue||!c.filteringEventAttributeValue.eventAttributeName||!c.filteringEventAttributeValue.eventAttributeValue)return !1;var d=null;if(b)for(var e in b)if(b.hasOwnProperty(e)){var f=KitFilterHelper.hashAttributeConditionalForwarding(e);if(f===c.filteringEventAttributeValue.eventAttributeName){d={name:f,value:KitFilterHelper.hashAttributeConditionalForwarding(b[e])};break}}var g=null!==d&&d.value===c.filteringEventAttributeValue.eventAttributeValue,h=!0===c.filteringEventAttributeValue.includeOnMatch?g:!g;return !h}function isBlockedByEventFilter(a,b,c,d){if(a===Types.MessageType.PageEvent&&(inFilteredList(d.eventNameFilters,b)||inFilteredList(d.eventTypeFilters,c)))return !0;return !!(a===Types.MessageType.Commerce&&inFilteredList(d.eventTypeFilters,c))||!!(a===Types.MessageType.PageView&&inFilteredList(d.screenNameFilters,b))}function filterEventAttributes(a,b,c,d,e){if(!d)return d;var f;if(a===Types.MessageType.PageEvent?f=e.attributeFilters:a===Types.MessageType.PageView&&(f=e.screenAttributeFilters),!f)return d;var g={};for(var h in d)if(d.hasOwnProperty(h)){var i=KitFilterHelper.hashEventAttributeKey(b,c,h);inArray(f,i)||(g[h]=d[h]);}return g}function filterUserIdentities(a,b){return a&&a.length?a.filter(function(a){return !inArray(b,KitFilterHelper.hashUserIdentity(a.Type))}):a||[]}
937
941
 
938
942
  var _a;var _b=Constants.IdentityMethods,Modify$2=_b.Modify,Identify$1=_b.Identify,Login$1=_b.Login,Logout$1=_b.Logout,identityCompleteKitMethods=(_a={},_a[Identify$1]="onIdentifyComplete",_a[Login$1]="onLoginComplete",_a[Logout$1]="onLogoutComplete",_a[Modify$2]="onModifyComplete",_a);// Maps an identity method to the kit callback that reports its completion.
939
- function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){var d=KitFilterHelper.hashAttributeConditionalForwarding(c),e=KitFilterHelper.hashAttributeConditionalForwarding(a[c]);if(d===b.userAttributeName&&e===b.userAttributeValue)return !0}return !1}function Forwarders(a,b){var c=this,d=this;this.forwarderStatsUploader=new APIClient(a,b).initializeForwarderStatsUploader();var e={setUserAttribute:"setUserAttribute",removeUserAttribute:"removeUserAttribute"};// TODO: https://go.mparticle.com/work/SQDSDKS-6036
943
+ function removeBlockedUserIdentities(a,b){var c=a,d={};for(var e in c)c.hasOwnProperty(e)&&isIdentityAllowed(b,e)&&(d[e]=c[e]);return d}function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){var d=KitFilterHelper.hashAttributeConditionalForwarding(c),e=KitFilterHelper.hashAttributeConditionalForwarding(a[c]);if(d===b.userAttributeName&&e===b.userAttributeValue)return !0}return !1}function Forwarders(a,b){var c=this,d=this;this.forwarderStatsUploader=new APIClient(a,b).initializeForwarderStatsUploader();var e={setUserAttribute:"setUserAttribute",removeUserAttribute:"removeUserAttribute"};// TODO: https://go.mparticle.com/work/SQDSDKS-6036
940
944
  // Processing forwarders is a 2 step process:
941
945
  // 1. Configure the kit
942
946
  // 2. Initialize the kit
@@ -956,10 +960,11 @@ function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){v
956
960
  // there being a separate process for MP configured kits and
957
961
  // sideloaded kits, this will need to be refactored.
958
962
  // kits can be included via mParticle UI, or via sideloaded kit config API
959
- this.initForwarders=function(b,c){var e=a.Identity.getCurrentUser();!a._Store.webviewBridgeEnabled&&a._Store.configuredForwarders&&(a._Store.configuredForwarders.sort(function(a,b){return a.settings.PriorityValue=a.settings.PriorityValue||0,b.settings.PriorityValue=b.settings.PriorityValue||0,-1*(a.settings.PriorityValue-b.settings.PriorityValue)}),a._Store.activeForwarders=a._Store.configuredForwarders.filter(function(f){if(!a._Consent.isEnabledForUserConsent(f.filteringConsentRuleValues,e))return !1;if(!d.isEnabledForUserAttributes(f.filteringUserAttributeValue,e))return !1;if(!d.isEnabledForUnknownUser(f.excludeAnonymousUser,e))return !1;var g=a._Helpers.filterUserIdentities(b,f.userIdentityFilters),h=KitFilterHelper.filterUserAttributes(e?e.getAllUserAttributes():{},f.userAttributeFilters);return f.initialized||(f.logger=a.Logger,f.init(f.settings,c,!1,null,h,g,a._Store.SDKConfig.appVersion,a._Store.SDKConfig.appName,a._Store.SDKConfig.customFlags,a._Store.clientId),f.initialized=!0),!0}));},this.isEnabledForUserAttributes=function(b,c){if(!b||!a._Helpers.isObject(b)||!Object.keys(b).length)return !0;if(!c)return !1;var d=c.getAllUserAttributes();try{var e=d&&a._Helpers.isObject(d)&&0<Object.keys(d).length,f=!!e&&userAttributesMatchFilter(d,b);return b.includeOnMatch===f}catch(a){// in any error scenario, err on side of returning true and forwarding event
963
+ this.initForwarders=function(c,e){var f=a.Identity.getCurrentUser();if(!a._Store.webviewBridgeEnabled&&a._Store.configuredForwarders){var g=removeBlockedUserIdentities(c,b);// Some js libraries require that they be loaded first, or last, etc
964
+ a._Store.configuredForwarders.sort(function(a,b){return a.settings.PriorityValue=a.settings.PriorityValue||0,b.settings.PriorityValue=b.settings.PriorityValue||0,-1*(a.settings.PriorityValue-b.settings.PriorityValue)}),a._Store.activeForwarders=a._Store.configuredForwarders.filter(function(c){if(!a._Consent.isEnabledForUserConsent(c.filteringConsentRuleValues,f))return !1;if(!d.isEnabledForUserAttributes(c.filteringUserAttributeValue,f))return !1;if(!d.isEnabledForUnknownUser(c.excludeAnonymousUser,f))return !1;var h=a._Helpers.filterUserIdentities(g,c.userIdentityFilters),i=f?filteredMparticleUser(f.getMPID(),c,a,b).getAllUserAttributes():{};return c.initialized||(c.logger=a.Logger,c.init(c.settings,e,!1,null,i,h,a._Store.SDKConfig.appVersion,a._Store.SDKConfig.appName,a._Store.SDKConfig.customFlags,a._Store.clientId),c.initialized=!0),!0});}},this.isEnabledForUserAttributes=function(b,c){if(!b||!a._Helpers.isObject(b)||!Object.keys(b).length)return !0;if(!c)return !1;var d=c.getAllUserAttributes();try{var e=d&&a._Helpers.isObject(d)&&0<Object.keys(d).length,f=!!e&&userAttributesMatchFilter(d,b);return b.includeOnMatch===f}catch(a){// in any error scenario, err on side of returning true and forwarding event
960
965
  return !0}},this.isEnabledForUnknownUser=function(a,b){return !!(b&&b.isLoggedIn()||!a)},this.applyToForwarders=function(b,c){a._Store.activeForwarders.length&&a._Store.activeForwarders.forEach(function(d){var e=d[b];if(e)try{var f=d[b](c);f&&a.Logger.verbose(f);}catch(b){a.Logger.verbose(b);}});},this.sendEventToForwarders=function(b){if(!a._Store.webviewBridgeEnabled&&a._Store.activeForwarders){// Not for...of: the downleveled loop is miscompiled in cjs/esm builds.
961
966
  var c=KitFilterHelper.hashEventName(b.EventName,b.EventCategory),d=KitFilterHelper.hashEventType(b.EventCategory),e=function(e){if(!isBlockedByForwardingRule(b.EventDataType,b.EventAttributes,e)){// Clone the event object, as we could be sending different attributes to each forwarder
962
- var f=extend(!0,{},b);if(!isBlockedByEventFilter(b.EventDataType,c,d,e)&&(f.EventAttributes=filterEventAttributes(b.EventDataType,b.EventCategory,b.EventName,f.EventAttributes,e),f.UserIdentities=filterUserIdentities(f.UserIdentities,e.userIdentityFilters),f.UserAttributes=KitFilterHelper.filterUserAttributes(f.UserAttributes,e.userAttributeFilters),!!e.process)){a.Logger.verbose("Sending message to forwarder: "+e.name);var g=e.process(f);g&&a.Logger.verbose(g);}}};a._Store.activeForwarders.forEach(function(a){e(a);});}},this.handleForwarderUserAttributes=function(c,d,f){b&&b.isAttributeKeyBlocked(d)||!a._Store.activeForwarders.length||a._Store.activeForwarders.forEach(function(b){var g=b[c];if(g&&!KitFilterHelper.isFilteredUserAttribute(d,b.userAttributeFilters))try{var h;c===e.setUserAttribute?h=b.setUserAttribute(d,f):c===e.removeUserAttribute&&(h=b.removeUserAttribute(d)),h&&a.Logger.verbose(h);}catch(b){a.Logger.error(b);}});},this.setForwarderUserIdentities=function(b){a._Store.activeForwarders.forEach(function(c){var d=a._Helpers.filterUserIdentities(b,c.userIdentityFilters);c.setUserIdentity&&d.forEach(function(b){var d=c.setUserIdentity(b.Identity,b.Type);d&&a.Logger.verbose(d);});});},this.setForwarderOnUserIdentified=function(c){a._Store.activeForwarders.forEach(function(d){var e=filteredMparticleUser(c.getMPID(),d,a,b);if(d.onUserIdentified){var f=d.onUserIdentified(e);f&&a.Logger.verbose(f);}});},this.setForwarderOnIdentityComplete=function(c,d){var e=identityCompleteKitMethods[d];e&&a._Store.activeForwarders.forEach(function(d){var f=d[e];if(f){var g=filteredMparticleUser(c.getMPID(),d,a,b),h=f.call(d,g,g.getUserIdentities());h&&a.Logger.verbose(h);}});},this.getForwarderStatsQueue=function(){return a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue},this.setForwarderStatsQueue=function(b){a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue=b;},this.processForwarders=function(b,c){b?(this.processUIEnabledKits(b),this.processSideloadedKits(b),d.initForwarders(a._Store.SDKConfig.identifyRequest.userIdentities,c)):a.Logger.warning("No config was passed. Cannot process forwarders");},this.processUIEnabledKits=function(b){var c=this.returnKitConstructors();try{Array.isArray(b.kitConfigs)&&b.kitConfigs.length&&b.kitConfigs.forEach(function(a){d.configureUIEnabledKit(a,c);});}catch(b){a.Logger.error("MP Kits not configured propertly. Kits may not be initialized. "+b);}},this.returnKitConstructors=function(){var b={};// If there are kits inside of mpInstance._Store.SDKConfig.kits, then mParticle is self hosted
967
+ var f=extend(!0,{},b);if(!isBlockedByEventFilter(b.EventDataType,c,d,e)&&(f.EventAttributes=filterEventAttributes(b.EventDataType,b.EventCategory,b.EventName,f.EventAttributes,e),f.UserIdentities=filterUserIdentities(f.UserIdentities,e.userIdentityFilters),f.UserAttributes=KitFilterHelper.filterUserAttributes(f.UserAttributes,e.userAttributeFilters),!!e.process)){a.Logger.verbose("Sending message to forwarder: "+e.name);var g=e.process(f);g&&a.Logger.verbose(g);}}};a._Store.activeForwarders.forEach(function(a){e(a);});}},this.handleForwarderUserAttributes=function(c,d,f){b&&b.isAttributeKeyBlocked(d)||!a._Store.activeForwarders.length||a._Store.activeForwarders.forEach(function(b){var g=b[c];if(g&&!KitFilterHelper.isFilteredUserAttribute(d,b.userAttributeFilters))try{var h;c===e.setUserAttribute?h=b.setUserAttribute(d,f):c===e.removeUserAttribute&&(h=b.removeUserAttribute(d)),h&&a.Logger.verbose(h);}catch(b){a.Logger.error(b);}});},this.setForwarderUserIdentities=function(c){var d=removeBlockedUserIdentities(c,b);a._Store.activeForwarders.forEach(function(b){var c=a._Helpers.filterUserIdentities(d,b.userIdentityFilters);b.setUserIdentity&&c.forEach(function(c){var d=b.setUserIdentity(c.Identity,c.Type);d&&a.Logger.verbose(d);});});},this.setForwarderOnUserIdentified=function(c){a._Store.activeForwarders.forEach(function(d){var e=filteredMparticleUser(c.getMPID(),d,a,b);if(d.onUserIdentified){var f=d.onUserIdentified(e);f&&a.Logger.verbose(f);}});},this.setForwarderOnIdentityComplete=function(c,d){var e=identityCompleteKitMethods[d];e&&a._Store.activeForwarders.forEach(function(d){var f=d[e];if(f){var g=filteredMparticleUser(c.getMPID(),d,a,b),h=f.call(d,g,g.getUserIdentities());h&&a.Logger.verbose(h);}});},this.getForwarderStatsQueue=function(){return a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue},this.setForwarderStatsQueue=function(b){a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue=b;},this.processForwarders=function(b,c){b?(this.processUIEnabledKits(b),this.processSideloadedKits(b),d.initForwarders(a._Store.SDKConfig.identifyRequest.userIdentities,c)):a.Logger.warning("No config was passed. Cannot process forwarders");},this.processUIEnabledKits=function(b){var c=this.returnKitConstructors();try{Array.isArray(b.kitConfigs)&&b.kitConfigs.length&&b.kitConfigs.forEach(function(a){d.configureUIEnabledKit(a,c);});}catch(b){a.Logger.error("MP Kits not configured propertly. Kits may not be initialized. "+b);}},this.returnKitConstructors=function(){var b={};// If there are kits inside of mpInstance._Store.SDKConfig.kits, then mParticle is self hosted
963
968
  return isEmpty(a._Store.SDKConfig.kits)?!isEmpty(a._preInit.forwarderConstructors)&&a._preInit.forwarderConstructors.forEach(function(a){// A suffix is added to a kitConstructor and kit config if there are multiple different
964
969
  // versions of a client kit. This matches the suffix in the DB. As an example
965
970
  // the GA4 kit has a client kit and a server side kit which has a client side
@@ -1129,7 +1134,7 @@ return e<f&&(e=f,g<e&&a.Logger.warning("Source User has not been seen in the las
1129
1134
  * @param {String} value
1130
1135
  */ // https://go.mparticle.com/work/SQDSDKS-4576
1131
1136
  // https://go.mparticle.com/work/SQDSDKS-6373
1132
- setUserAttribute:function setUserAttribute(c,d){if(a._SessionManager.resetSessionTimer(),a._Helpers.canLog()){if(!a._Helpers.Validators.isValidAttributeValue(d))return void a.Logger.error(Messages$2.ErrorMessages.BadAttribute);if(!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttribute,JSON.stringify({key:c,value:d}));else {var f=this.getAllUserAttributes(),g=void 0,h=void 0,i=a._Helpers.findKeyInObject(f,c);i?(h=!1,g=f[i],delete f[i]):h=!0,f[c]=d,a._Store.setUserAttributes(b,f),e.sendUserAttributeChangeEvent(c,d,g,h,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,d);}}},/**
1137
+ setUserAttribute:function setUserAttribute(c,d){if(a._SessionManager.resetSessionTimer(),a._Helpers.canLog()){if(!a._Helpers.Validators.isValidAttributeValue(d))return void a.Logger.error(Messages$2.ErrorMessages.BadAttribute);if(!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttribute,JSON.stringify({key:c,value:d}));else {var f=this.getAllUserAttributes(),g=void 0,h=void 0,i=a._Helpers.findKeyInObject(f,c);i?(h=!1,g=f[i],delete f[i]):h=!0,f[c]=d,a._Store.setUserAttributes(b,f),e.sendUserAttributeChangeEvent(c,d,g,h,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,d);}}},/**
1133
1138
  * Set multiple user attributes
1134
1139
  * @method setUserAttributes
1135
1140
  * @param {Object} user attribute object with keys of the attribute type, and value of the attribute value
@@ -1138,7 +1143,7 @@ setUserAttributes:function setUserAttributes(b){if(a._SessionManager.resetSessio
1138
1143
  * Removes a specific user attribute
1139
1144
  * @method removeUserAttribute
1140
1145
  * @param {String} key
1141
- */removeUserAttribute:function removeUserAttribute(c){var d,f;if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveUserAttribute,JSON.stringify({key:c,value:null}));else {d=a._Persistence.getPersistence(),f=this.getAllUserAttributes();var g=a._Helpers.findKeyInObject(f,c);g&&(c=g);var h=f[c]?f[c].toString():null;delete f[c],d&&d[b]&&(d[b].ua=f,a._Persistence.savePersistence(d)),e.sendUserAttributeChangeEvent(c,null,h,!1,!0,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null);}},/**
1146
+ */removeUserAttribute:function removeUserAttribute(c){var d,f;if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveUserAttribute,JSON.stringify({key:c,value:null}));else {d=a._Persistence.getPersistence(),f=this.getAllUserAttributes();var g=a._Helpers.findKeyInObject(f,c);g&&(c=g);var h=f[c]?f[c].toString():null;delete f[c],d&&d[b]&&(d[b].ua=f,a._Persistence.savePersistence(d)),e.sendUserAttributeChangeEvent(c,null,h,!1,!0,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null);}},/**
1142
1147
  * Sets a list of user attributes
1143
1148
  * @method setUserAttributeList
1144
1149
  * @param {String} key
@@ -1147,10 +1152,10 @@ setUserAttributes:function setUserAttributes(b){if(a._SessionManager.resetSessio
1147
1152
  setUserAttributeList:function setUserAttributeList(c,d){if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(!Array.isArray(d))return void a.Logger.error("The value you passed in to setUserAttributeList must be an array. You passed in a "+_typeof(d));var f=d.slice();if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttributeList,JSON.stringify({key:c,value:f}));else {var g=this.getAllUserAttributes(),h=void 0,j=void 0,k=void 0,l=a._Helpers.findKeyInObject(g,c);// If the new attributeList length is different than the previous, then there is a change event.
1148
1153
  // Loop through new attributes list, see if they are all in the same index as previous user attributes list
1149
1154
  // If there are any changes, break, and immediately send a userAttributeChangeEvent with full array as a value
1150
- if(l?(j=!1,h=g[l],delete g[l]):j=!0,g[c]=f,a._Store.setUserAttributes(b,g),!h||!Array.isArray(h))k=!0;else if(d.length!==h.length)k=!0;else for(var m=0;m<d.length;m++)if(h[m]!==d[m]){k=!0;break}k&&e.sendUserAttributeChangeEvent(c,d,h,j,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,f);}},/**
1155
+ if(l?(j=!1,h=g[l],delete g[l]):j=!0,g[c]=f,a._Store.setUserAttributes(b,g),!h||!Array.isArray(h))k=!0;else if(d.length!==h.length)k=!0;else for(var m=0;m<d.length;m++)if(h[m]!==d[m]){k=!0;break}k&&e.sendUserAttributeChangeEvent(c,d,h,j,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,f);}},/**
1151
1156
  * Removes all user attributes
1152
1157
  * @method removeAllUserAttributes
1153
- */removeAllUserAttributes:function removeAllUserAttributes(){var b;if(a._SessionManager.resetSessionTimer(),a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveAllUserAttributes);else if(b=this.getAllUserAttributes(),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),b)for(var c in b)b.hasOwnProperty(c)&&a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null),this.removeUserAttribute(c);},/**
1158
+ */removeAllUserAttributes:function removeAllUserAttributes(){var b;if(a._SessionManager.resetSessionTimer(),a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveAllUserAttributes);else if(b=this.getAllUserAttributes(),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),b)for(var c in b)b.hasOwnProperty(c)&&a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null),this.removeUserAttribute(c);},/**
1154
1159
  * Returns all user attribute keys that have values that are arrays
1155
1160
  * @method getUserAttributesLists
1156
1161
  * @return {Object} an object of only keys with array values. Example: { attr1: [1, 2, 3], attr2: ['a', 'b', 'c'] }
@@ -1268,7 +1273,9 @@ if(v=null===(u=null===(t=null===(s=null===(r=null===(q=null===(p=null===(o=null=
1268
1273
  // will be a boolean, otherwise it will return an object
1269
1274
  return !("boolean"==typeof b&&b)&&"object"===_typeof(b)&&!0!==b[a];// When "Block unplanned user attributes" is enabled and "Allow unplanned user
1270
1275
  // attributes" is also enabled in the UI, allowing unplanned user attributes will be prioritized
1271
- },a.prototype.isIdentityBlocked=function(a){/* used when an attribute is added to the user */if(!this.blockUserIdentities)return !1;if(this.blockUserIdentities){var b=this.dataPlanMatchLookups.user_identities;if(!0===b)return !1;if(!b[a])return !0}else return !1;return !1},a.prototype.transformUserIdentities=function(a){var b,c=this,d=__assign({},a);/*
1276
+ },a.prototype.isIdentityBlocked=function(a){/* used when an attribute is added to the user */if(!this.blockUserIdentities)return !1;if(this.blockUserIdentities){var b=this.dataPlanMatchLookups.user_identities;// The lookup is absent, not empty, when the plan carries no
1277
+ // user_identities data point, and indexing it would throw.
1278
+ if(!0===b||!b)return !1;if(!b[a])return !0}else return !1;return !1},a.prototype.transformUserIdentities=function(a){var b,c=this,d=__assign({},a);/*
1272
1279
  If the user identity is not found in matchedIdentities
1273
1280
  then remove it from event.UserIdentities as it is blocked.
1274
1281
  event.UserIdentities is of type [{Identity: 'id1', Type: 7}, ...]
@@ -15,7 +15,7 @@ map:function map(a,b){var c,d,e;if(null===this)throw new TypeError(" this is nul
15
15
  filter:function filter(a/*, thisArg*/){if(void 0===this||null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if("function"!=typeof a)throw new TypeError;for(var d=[],e=2<=arguments.length?arguments[1]:void 0,f=0;f<c;f++)if(f in b){var g=b[f];a.call(e,g,f,b)&&d.push(g);}return d},// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
16
16
  isArray:function isArray(a){return "[object Array]"===Object.prototype.toString.call(a)},Base64:Base64$1};
17
17
 
18
- var version = "3.4.0";
18
+ var version = "3.6.0";
19
19
 
20
20
  var Constants={sdkVersion:version,sdkVendor:"mparticle",platform:"web",Messages:{DeprecationMessages:{MethodHasBeenDeprecated:"has been deprecated.",MethodMarkedForDeprecationPostfix:"is a deprecated method and will be removed in future releases.",AlternativeMethodPrefix:"Please use the alternate method:"},ErrorMessages:{NoToken:"A token must be specified.",EventNameInvalidType:"Event name must be a valid string value.",EventDataInvalidType:"Event data must be a valid object hash.",LoggingDisabled:"Event logging is currently disabled.",CookieParseError:"Could not parse cookie",EventEmpty:"Event object is null or undefined, cancelling send",APIRequestEmpty:"APIRequest is null or undefined, cancelling send",NoEventType:"Event type must be specified.",TransactionIdRequired:"Transaction ID is required",TransactionRequired:"A transaction attributes object is required",PromotionIdRequired:"Promotion ID is required",BadAttribute:"Attribute value cannot be object or array",BadKey:"Key value cannot be object or array",BadLogPurchase:"Transaction attributes and a product are both required to log a purchase, https://docs.mparticle.com/?javascript#measuring-transactions",AudienceAPINotEnabled:"Your workspace is not enabled to retrieve user audiences."},InformationMessages:{CookieSearch:"Searching for cookie",CookieFound:"Cookie found, parsing values",CookieNotFound:"Cookies not found",CookieSet:"Setting cookie",CookieSync:"Performing cookie sync",SendBegin:"Starting to send event",SendIdentityBegin:"Starting to send event to identity server",SendWindowsPhone:"Sending event to Windows Phone container",SendIOS:"Calling iOS path: ",SendAndroid:"Calling Android JS interface method: ",SendHttp:"Sending event to mParticle HTTP service",SendAliasHttp:"Sending alias request to mParticle HTTP service",SendIdentityHttp:"Sending event to mParticle HTTP service",StartingNewSession:"Starting new Session",StartingLogEvent:"Starting to log event",StartingLogOptOut:"Starting to log user opt in/out",StartingEndSession:"Starting to end session",StartingInitialization:"Starting to initialize",StartingLogCommerceEvent:"Starting to log commerce event",StartingAliasRequest:"Starting to Alias MPIDs",LoadingConfig:"Loading configuration options",AbandonLogEvent:"Cannot log event, logging disabled or developer token not set",AbandonAliasUsers:"Cannot Alias Users, logging disabled or developer token not set",AbandonStartSession:"Cannot start session, logging disabled or developer token not set",AbandonEndSession:"Cannot end session, logging disabled or developer token not set",NoSessionToEnd:"Cannot end session, no active session found"},ValidationMessages:{ModifyIdentityRequestUserIdentitiesPresent:"identityRequests to modify require userIdentities to be present. Request not sent to server. Please fix and try again",IdentityRequesetInvalidKey:"There is an invalid key on your identityRequest object. It can only contain a `userIdentities` object and a `onUserAlias` function. Request not sent to server. Please fix and try again.",OnUserAliasType:"The onUserAlias value must be a function.",UserIdentities:"The userIdentities key must be an object with keys of identityTypes and values of strings. Request not sent to server. Please fix and try again.",UserIdentitiesInvalidKey:"There is an invalid identity key on your `userIdentities` object within the identityRequest. Request not sent to server. Please fix and try again.",UserIdentitiesInvalidValues:"All user identity values must be strings or null. Request not sent to server. Please fix and try again.",AliasMissingMpid:"Alias Request must contain both a destinationMpid and a sourceMpid",AliasNonUniqueMpid:"Alias Request's destinationMpid and sourceMpid must be unique",AliasMissingTime:"Alias Request must have both a startTime and an endTime",AliasStartBeforeEndTime:"Alias Request's endTime must be later than its startTime"}},NativeSdkPaths:{LogEvent:"logEvent",SetUserTag:"setUserTag",RemoveUserTag:"removeUserTag",SetUserAttribute:"setUserAttribute",RemoveUserAttribute:"removeUserAttribute",SetSessionAttribute:"setSessionAttribute",LogOut:"logOut",SetUserAttributeList:"setUserAttributeList",RemoveAllUserAttributes:"removeAllUserAttributes",GetUserAttributesLists:"getUserAttributesLists",GetAllUserAttributes:"getAllUserAttributes",Identify:"identify",Logout:"logout",Login:"login",Modify:"modify",Alias:"aliasUsers",Upload:"upload"},StorageNames:{localStorageName:"mprtcl-api",localStorageNameV3:"mprtcl-v3",cookieName:"mprtcl-api",cookieNameV2:"mprtcl-v2",cookieNameV3:"mprtcl-v3",localStorageNameV4:"mprtcl-v4",cookieNameV4:"mprtcl-v4",currentStorageName:"mprtcl-v4"},DefaultConfig:{cookieDomain:null,cookieExpiration:365,logLevel:null,timeout:300,sessionTimeout:30,forwarderStatsTimeout:5e3,integrationDelayTimeout:5e3,maxCookieSize:3e3,aliasMaxWindow:90,uploadInterval:0// Maximum milliseconds in between batch uploads, below 500 will mean immediate upload. The server returns this as a string, but we are using it as a number internally
21
21
  },DefaultBaseUrls:{v1SecureServiceUrl:"jssdks.mparticle.com/v1/JS/",v2SecureServiceUrl:"jssdks.mparticle.com/v2/JS/",v3SecureServiceUrl:"jssdks.mparticle.com/v3/JS/",configUrl:"jssdkcdns.mparticle.com/JS/v2/",identityUrl:"identity.mparticle.com/v1/",aliasUrl:"jssdks.mparticle.com/v1/identity/",userAudienceUrl:"nativesdks.mparticle.com/v1/"},// These are the paths that are used to construct the CNAME urls
@@ -623,7 +623,9 @@ if(!g||a._Store.requireDelay||!a._Store.configurationLoaded)return a.Logger.verb
623
623
 
624
624
  var KitFilterHelper=/** @class */function(){function a(){}a.hashEventType=function(a){return generateHash(a)},a.hashEventName=function(a,b){return generateHash(b+a)},a.hashEventAttributeKey=function(a,b,c){return generateHash(a+b+c)},a.hashUserAttribute=function(a){return generateHash(a)},a.hashUserIdentity=function(a){return a},a.hashConsentPurpose=function(a,b){return generateHash(a+b)},a.hashAttributeConditionalForwarding=function(a){return generateHash(a).toString()},a.hashConsentPurposeConditionalForwarding=function(a,b){return this.hashConsentPurpose(a,b).toString()};var b;return b=a,a.filterUserAttributes=function(a,c){return filterDictionaryWithHash(a,c,function(a){return b.hashUserAttribute(a)})},a.filterUserIdentities=function(a,c){return filterDictionaryWithHash(a,c,function(a){return b.hashUserIdentity(IdentityType.getIdentityType(a))})},a.isFilteredUserAttribute=function(a,c){var d=b.hashUserAttribute(a);return c&&inArray(c,d)},a}();
625
625
 
626
- var StorageNames$1=Constants.StorageNames;function appendFilteredUserIdentity(a,b,c){c===Types.IdentityType.CustomerId?a.unshift(b):a.push(b);}function buildFilteredUserIdentities$1(a,b,c){var d=[];if(!a||!Object.keys(a).length)return d;for(var e in a)if(a.hasOwnProperty(e)){var f=Types.IdentityType.getIdentityType(e);c(b,f)||appendFilteredUserIdentity(d,{Type:f,Identity:a[e]},f);}return d}function Helpers(a){var b=this;// TODO: Refactor SDK to directly use these methods
626
+ var StorageNames$1=Constants.StorageNames;function appendFilteredUserIdentity(a,b,c){c===Types.IdentityType.CustomerId?a.unshift(b):a.push(b);}function buildFilteredUserIdentities$1(a,b,c){var d=[];if(!a||!Object.keys(a).length)return d;for(var e in a)if(a.hasOwnProperty(e)){// Must be `=== false`: IdentityType.Other is 0, so a falsy check would
627
+ // drop a valid type.
628
+ var f=Types.IdentityType.getIdentityType(e),g=!1===f;g||c(b,f)||appendFilteredUserIdentity(d,{Type:f,Identity:a[e]},f);}return d}function Helpers(a){var b=this;// TODO: Refactor SDK to directly use these methods
627
629
  // https://go.mparticle.com/work/SQDSDKS-5239
628
630
  // Utility Functions
629
631
  // Imported Validators
@@ -766,9 +768,11 @@ function k(b){var c=a._Store;return b.gs.sid=c.sessionId,b.gs.ie=c.isEnabled,b.g
766
768
  a. Remove at random MPIDs on the cookie that are not part of the currentSessionMPIDs
767
769
  b. Then remove MPIDs based on order in currentSessionMPIDs array, which
768
770
  stores MPIDs based on earliest login.
769
- */function l(a,b){return a.length>b}function m(a,b,c,d){var e;for(var f in a)a.hasOwnProperty(f)&&(e=r(a,b,c),!!l(e,d))&&(SDKv2NonMPIDCookieKeys[f]||f===a.cu||delete a[f]);return e}function n(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(SDKv2NonMPIDCookieKeys[c]||c===a.cu||(b[c]=1));return b}function o(a,b,c,d,e,f){var g;for(var h in b)(g=r(a,d,e),!!l(g,f))&&b.hasOwnProperty(h)&&-1===c.indexOf(h)&&delete a[h];return g}function p(b,c,d){return b[c]?(a.Logger.verbose("Size of new encoded cookie is larger than maxCookieSize setting of "+d+". Removing from cookie the earliest logged in MPID containing: "+JSON.stringify(b[c],null,2)),void delete b[c]):void a.Logger.error("Unable to save MPID data to cookies because the resulting encoded cookie is larger than the maxCookieSize setting of "+d+". We recommend using a maxCookieSize of 1500.")}function q(a,b,c,d,e){for(var f,g=0;g<b.length&&(f=r(a,c,d),!!l(f,e));g++)p(a,b[g],e);return f}function r(a,b,c){return E.encodePersistence(JSON.stringify(a))+";expires="+b+";path=/"+c}function s(a,b,c){for(var d in a)if(b===d&&c===a[d])return !0;return !1}function t(a,b,c){var d;for(var e in a)// any value in persistence that has an MPID key will be an MPID to search through
771
+ */function l(a,b){return a.length>b}function m(a,b,c,d){var e;for(var f in a)a.hasOwnProperty(f)&&(e=r(a,b,c),!!l(e,d))&&(SDKv2NonMPIDCookieKeys[f]||f===a.cu||delete a[f]);return e}function n(a){var b={};for(var c in a)a.hasOwnProperty(c)&&(SDKv2NonMPIDCookieKeys[c]||c===a.cu||(b[c]=1));return b}function o(a,b,c,d,e,f){var g;for(var h in b)(g=r(a,d,e),!!l(g,f))&&b.hasOwnProperty(h)&&-1===c.indexOf(h)&&delete a[h];return g}function p(b,c,d){return b[c]?(a.Logger.verbose("Size of new encoded cookie is larger than maxCookieSize setting of "+d+". Removing from cookie the earliest logged in MPID containing: "+JSON.stringify(b[c],null,2)),void delete b[c]):void a.Logger.error("Unable to save MPID data to cookies because the resulting encoded cookie is larger than the maxCookieSize setting of "+d+". We recommend using a maxCookieSize of 1500.")}function q(a,b,c,d,e){for(var f,g=0;g<b.length&&(f=r(a,c,d),!!l(f,e));g++)p(a,b[g],e);return f}function r(a,b,c){return E.encodePersistence(JSON.stringify(a))+";expires="+b+";path=/"+c}function s(a,b,c){for(var d in a)if(b===d&&c===a[d])return !0;return !1}function t(b,c,d){var e;for(var f in b)// any value in persistence that has an MPID key will be an MPID to search through
770
772
  // other keys on the cookie are currentSessionMPIDs and currentMPID which should not be searched
771
- a[e].mpid&&s(a[e].ui,b,c)&&(d=e);return d}function u(a,b){var c;for(var d in b.userIdentities)if(a&&Object.keys(a).length){var e=t(a,d,b.userIdentities[d]);e&&(c=e);}return c}function v(b){return Array.isArray(b)?0<b.length:!!a._Helpers.isObject(b)&&0<Object.keys(b).length}function w(a,b){return a[b]&&v(a[b])?void(a[b]=Base64.encode(JSON.stringify(a[b]))):void delete a[b]}function x(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){w(a,b);continue}if("ie"==b){a[b]=a[b]?1:0;continue}a[b]||delete a[b];}}function y(b,c){var d=b[c];return a._Helpers.isObject(d)&&Object.keys(d).length?void(b[c]=Base64.encode(JSON.stringify(d))):void delete b[c]}function z(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&y(a,b);}function A(a){for(var b in a)a.hasOwnProperty(b)&&(SDKv2NonMPIDCookieKeys[b]||z(a[b]));}function B(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){a[b]=JSON.parse(Base64.decode(a[b]));continue}"ie"==b&&(a[b]=!!a[b]);}}function C(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&a[b].length&&(a[b]=JSON.parse(Base64.decode(a[b])));}function D(a){for(var b in a)if(a.hasOwnProperty(b)){if(!SDKv2NonMPIDCookieKeys[b]){C(a[b]);continue}"l"==b&&(a[b]=!!a[b]);}}// TODO: This should actually be decodePersistenceString or
773
+ a._Helpers.isObject(b[f])&&b[f].mpid&&s(b[f].ui,c,d)&&(e=f);return e}function u(a,b){var c;for(var d in b.userIdentities)if(a&&Object.keys(a).length){var e=t(a,d,b.userIdentities[d]);e&&(c=e);}return c}function v(b){return Array.isArray(b)?0<b.length:!!a._Helpers.isObject(b)&&0<Object.keys(b).length}function w(a,b){return a[b]&&v(a[b])?void(a[b]=Base64.encode(JSON.stringify(a[b]))):void delete a[b]}function x(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){w(a,b);continue}if("ie"==b){a[b]=a[b]?1:0;continue}a[b]||delete a[b];}}function y(b,c){var d=b[c];return a._Helpers.isObject(d)&&Object.keys(d).length?void(b[c]=Base64.encode(JSON.stringify(d))):void delete b[c]}function z(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&y(a,b);}function A(a){for(var b in a)a.hasOwnProperty(b)&&(SDKv2NonMPIDCookieKeys[b]||z(a[b]));}function B(a){for(var b in a)if(a.hasOwnProperty(b)){if(Base64CookieKeys[b]){a[b]=JSON.parse(Base64.decode(a[b])),"csm"!==b||Array.isArray(a[b])||delete a[b];continue}"ie"==b&&(a[b]=!!a[b]);}}function C(a){for(var b in a)a.hasOwnProperty(b)&&Base64CookieKeys[b]&&a[b].length&&(a[b]=JSON.parse(Base64.decode(a[b])));}function D(b){for(var c in b)if(b.hasOwnProperty(c)){if(!SDKv2NonMPIDCookieKeys[c]){// Written as an object by encodeMpidRecords, then read as one by
774
+ // findMpidForRequestedIdentity and copied by copyNonCurrentUserMpids.
775
+ if(!a._Helpers.isObject(b[c])){delete b[c];continue}C(b[c]);continue}"l"==c&&(b[c]=!!b[c]);}}// TODO: This should actually be decodePersistenceString or
772
776
  // we should refactor this to take a string and return an object
773
777
  var E=this;// https://go.mparticle.com/work/SQDSDKS-5022
774
778
  // https://go.mparticle.com/work/SQDSDKS-5022
@@ -936,7 +940,7 @@ function isAttributeKeyAllowed(a,b){return !(null!==a&&void 0!==a)||!a.isAttribu
936
940
  var FORWARDING_RULE_MESSAGE_TYPES=[Types.MessageType.PageEvent,Types.MessageType.PageView,Types.MessageType.Commerce];function inFilteredList(a,b){return !!(a&&a.length)&&inArray(a,b)}function isBlockedByForwardingRule(a,b,c){if(!FORWARDING_RULE_MESSAGE_TYPES.includes(a)||!c.filteringEventAttributeValue||!c.filteringEventAttributeValue.eventAttributeName||!c.filteringEventAttributeValue.eventAttributeValue)return !1;var d=null;if(b)for(var e in b)if(b.hasOwnProperty(e)){var f=KitFilterHelper.hashAttributeConditionalForwarding(e);if(f===c.filteringEventAttributeValue.eventAttributeName){d={name:f,value:KitFilterHelper.hashAttributeConditionalForwarding(b[e])};break}}var g=null!==d&&d.value===c.filteringEventAttributeValue.eventAttributeValue,h=!0===c.filteringEventAttributeValue.includeOnMatch?g:!g;return !h}function isBlockedByEventFilter(a,b,c,d){if(a===Types.MessageType.PageEvent&&(inFilteredList(d.eventNameFilters,b)||inFilteredList(d.eventTypeFilters,c)))return !0;return !!(a===Types.MessageType.Commerce&&inFilteredList(d.eventTypeFilters,c))||!!(a===Types.MessageType.PageView&&inFilteredList(d.screenNameFilters,b))}function filterEventAttributes(a,b,c,d,e){if(!d)return d;var f;if(a===Types.MessageType.PageEvent?f=e.attributeFilters:a===Types.MessageType.PageView&&(f=e.screenAttributeFilters),!f)return d;var g={};for(var h in d)if(d.hasOwnProperty(h)){var i=KitFilterHelper.hashEventAttributeKey(b,c,h);inArray(f,i)||(g[h]=d[h]);}return g}function filterUserIdentities(a,b){return a&&a.length?a.filter(function(a){return !inArray(b,KitFilterHelper.hashUserIdentity(a.Type))}):a||[]}
937
941
 
938
942
  var _a;var _b=Constants.IdentityMethods,Modify$2=_b.Modify,Identify$1=_b.Identify,Login$1=_b.Login,Logout$1=_b.Logout,identityCompleteKitMethods=(_a={},_a[Identify$1]="onIdentifyComplete",_a[Login$1]="onLoginComplete",_a[Logout$1]="onLogoutComplete",_a[Modify$2]="onModifyComplete",_a);// Maps an identity method to the kit callback that reports its completion.
939
- function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){var d=KitFilterHelper.hashAttributeConditionalForwarding(c),e=KitFilterHelper.hashAttributeConditionalForwarding(a[c]);if(d===b.userAttributeName&&e===b.userAttributeValue)return !0}return !1}function Forwarders(a,b){var c=this,d=this;this.forwarderStatsUploader=new APIClient(a,b).initializeForwarderStatsUploader();var e={setUserAttribute:"setUserAttribute",removeUserAttribute:"removeUserAttribute"};// TODO: https://go.mparticle.com/work/SQDSDKS-6036
943
+ function removeBlockedUserIdentities(a,b){var c=a,d={};for(var e in c)c.hasOwnProperty(e)&&isIdentityAllowed(b,e)&&(d[e]=c[e]);return d}function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){var d=KitFilterHelper.hashAttributeConditionalForwarding(c),e=KitFilterHelper.hashAttributeConditionalForwarding(a[c]);if(d===b.userAttributeName&&e===b.userAttributeValue)return !0}return !1}function Forwarders(a,b){var c=this,d=this;this.forwarderStatsUploader=new APIClient(a,b).initializeForwarderStatsUploader();var e={setUserAttribute:"setUserAttribute",removeUserAttribute:"removeUserAttribute"};// TODO: https://go.mparticle.com/work/SQDSDKS-6036
940
944
  // Processing forwarders is a 2 step process:
941
945
  // 1. Configure the kit
942
946
  // 2. Initialize the kit
@@ -956,10 +960,11 @@ function userAttributesMatchFilter(a,b){for(var c in a)if(a.hasOwnProperty(c)){v
956
960
  // there being a separate process for MP configured kits and
957
961
  // sideloaded kits, this will need to be refactored.
958
962
  // kits can be included via mParticle UI, or via sideloaded kit config API
959
- this.initForwarders=function(b,c){var e=a.Identity.getCurrentUser();!a._Store.webviewBridgeEnabled&&a._Store.configuredForwarders&&(a._Store.configuredForwarders.sort(function(a,b){return a.settings.PriorityValue=a.settings.PriorityValue||0,b.settings.PriorityValue=b.settings.PriorityValue||0,-1*(a.settings.PriorityValue-b.settings.PriorityValue)}),a._Store.activeForwarders=a._Store.configuredForwarders.filter(function(f){if(!a._Consent.isEnabledForUserConsent(f.filteringConsentRuleValues,e))return !1;if(!d.isEnabledForUserAttributes(f.filteringUserAttributeValue,e))return !1;if(!d.isEnabledForUnknownUser(f.excludeAnonymousUser,e))return !1;var g=a._Helpers.filterUserIdentities(b,f.userIdentityFilters),h=KitFilterHelper.filterUserAttributes(e?e.getAllUserAttributes():{},f.userAttributeFilters);return f.initialized||(f.logger=a.Logger,f.init(f.settings,c,!1,null,h,g,a._Store.SDKConfig.appVersion,a._Store.SDKConfig.appName,a._Store.SDKConfig.customFlags,a._Store.clientId),f.initialized=!0),!0}));},this.isEnabledForUserAttributes=function(b,c){if(!b||!a._Helpers.isObject(b)||!Object.keys(b).length)return !0;if(!c)return !1;var d=c.getAllUserAttributes();try{var e=d&&a._Helpers.isObject(d)&&0<Object.keys(d).length,f=!!e&&userAttributesMatchFilter(d,b);return b.includeOnMatch===f}catch(a){// in any error scenario, err on side of returning true and forwarding event
963
+ this.initForwarders=function(c,e){var f=a.Identity.getCurrentUser();if(!a._Store.webviewBridgeEnabled&&a._Store.configuredForwarders){var g=removeBlockedUserIdentities(c,b);// Some js libraries require that they be loaded first, or last, etc
964
+ a._Store.configuredForwarders.sort(function(a,b){return a.settings.PriorityValue=a.settings.PriorityValue||0,b.settings.PriorityValue=b.settings.PriorityValue||0,-1*(a.settings.PriorityValue-b.settings.PriorityValue)}),a._Store.activeForwarders=a._Store.configuredForwarders.filter(function(c){if(!a._Consent.isEnabledForUserConsent(c.filteringConsentRuleValues,f))return !1;if(!d.isEnabledForUserAttributes(c.filteringUserAttributeValue,f))return !1;if(!d.isEnabledForUnknownUser(c.excludeAnonymousUser,f))return !1;var h=a._Helpers.filterUserIdentities(g,c.userIdentityFilters),i=f?filteredMparticleUser(f.getMPID(),c,a,b).getAllUserAttributes():{};return c.initialized||(c.logger=a.Logger,c.init(c.settings,e,!1,null,i,h,a._Store.SDKConfig.appVersion,a._Store.SDKConfig.appName,a._Store.SDKConfig.customFlags,a._Store.clientId),c.initialized=!0),!0});}},this.isEnabledForUserAttributes=function(b,c){if(!b||!a._Helpers.isObject(b)||!Object.keys(b).length)return !0;if(!c)return !1;var d=c.getAllUserAttributes();try{var e=d&&a._Helpers.isObject(d)&&0<Object.keys(d).length,f=!!e&&userAttributesMatchFilter(d,b);return b.includeOnMatch===f}catch(a){// in any error scenario, err on side of returning true and forwarding event
960
965
  return !0}},this.isEnabledForUnknownUser=function(a,b){return !!(b&&b.isLoggedIn()||!a)},this.applyToForwarders=function(b,c){a._Store.activeForwarders.length&&a._Store.activeForwarders.forEach(function(d){var e=d[b];if(e)try{var f=d[b](c);f&&a.Logger.verbose(f);}catch(b){a.Logger.verbose(b);}});},this.sendEventToForwarders=function(b){if(!a._Store.webviewBridgeEnabled&&a._Store.activeForwarders){// Not for...of: the downleveled loop is miscompiled in cjs/esm builds.
961
966
  var c=KitFilterHelper.hashEventName(b.EventName,b.EventCategory),d=KitFilterHelper.hashEventType(b.EventCategory),e=function(e){if(!isBlockedByForwardingRule(b.EventDataType,b.EventAttributes,e)){// Clone the event object, as we could be sending different attributes to each forwarder
962
- var f=extend(!0,{},b);if(!isBlockedByEventFilter(b.EventDataType,c,d,e)&&(f.EventAttributes=filterEventAttributes(b.EventDataType,b.EventCategory,b.EventName,f.EventAttributes,e),f.UserIdentities=filterUserIdentities(f.UserIdentities,e.userIdentityFilters),f.UserAttributes=KitFilterHelper.filterUserAttributes(f.UserAttributes,e.userAttributeFilters),!!e.process)){a.Logger.verbose("Sending message to forwarder: "+e.name);var g=e.process(f);g&&a.Logger.verbose(g);}}};a._Store.activeForwarders.forEach(function(a){e(a);});}},this.handleForwarderUserAttributes=function(c,d,f){b&&b.isAttributeKeyBlocked(d)||!a._Store.activeForwarders.length||a._Store.activeForwarders.forEach(function(b){var g=b[c];if(g&&!KitFilterHelper.isFilteredUserAttribute(d,b.userAttributeFilters))try{var h;c===e.setUserAttribute?h=b.setUserAttribute(d,f):c===e.removeUserAttribute&&(h=b.removeUserAttribute(d)),h&&a.Logger.verbose(h);}catch(b){a.Logger.error(b);}});},this.setForwarderUserIdentities=function(b){a._Store.activeForwarders.forEach(function(c){var d=a._Helpers.filterUserIdentities(b,c.userIdentityFilters);c.setUserIdentity&&d.forEach(function(b){var d=c.setUserIdentity(b.Identity,b.Type);d&&a.Logger.verbose(d);});});},this.setForwarderOnUserIdentified=function(c){a._Store.activeForwarders.forEach(function(d){var e=filteredMparticleUser(c.getMPID(),d,a,b);if(d.onUserIdentified){var f=d.onUserIdentified(e);f&&a.Logger.verbose(f);}});},this.setForwarderOnIdentityComplete=function(c,d){var e=identityCompleteKitMethods[d];e&&a._Store.activeForwarders.forEach(function(d){var f=d[e];if(f){var g=filteredMparticleUser(c.getMPID(),d,a,b),h=f.call(d,g,g.getUserIdentities());h&&a.Logger.verbose(h);}});},this.getForwarderStatsQueue=function(){return a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue},this.setForwarderStatsQueue=function(b){a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue=b;},this.processForwarders=function(b,c){b?(this.processUIEnabledKits(b),this.processSideloadedKits(b),d.initForwarders(a._Store.SDKConfig.identifyRequest.userIdentities,c)):a.Logger.warning("No config was passed. Cannot process forwarders");},this.processUIEnabledKits=function(b){var c=this.returnKitConstructors();try{Array.isArray(b.kitConfigs)&&b.kitConfigs.length&&b.kitConfigs.forEach(function(a){d.configureUIEnabledKit(a,c);});}catch(b){a.Logger.error("MP Kits not configured propertly. Kits may not be initialized. "+b);}},this.returnKitConstructors=function(){var b={};// If there are kits inside of mpInstance._Store.SDKConfig.kits, then mParticle is self hosted
967
+ var f=extend(!0,{},b);if(!isBlockedByEventFilter(b.EventDataType,c,d,e)&&(f.EventAttributes=filterEventAttributes(b.EventDataType,b.EventCategory,b.EventName,f.EventAttributes,e),f.UserIdentities=filterUserIdentities(f.UserIdentities,e.userIdentityFilters),f.UserAttributes=KitFilterHelper.filterUserAttributes(f.UserAttributes,e.userAttributeFilters),!!e.process)){a.Logger.verbose("Sending message to forwarder: "+e.name);var g=e.process(f);g&&a.Logger.verbose(g);}}};a._Store.activeForwarders.forEach(function(a){e(a);});}},this.handleForwarderUserAttributes=function(c,d,f){b&&b.isAttributeKeyBlocked(d)||!a._Store.activeForwarders.length||a._Store.activeForwarders.forEach(function(b){var g=b[c];if(g&&!KitFilterHelper.isFilteredUserAttribute(d,b.userAttributeFilters))try{var h;c===e.setUserAttribute?h=b.setUserAttribute(d,f):c===e.removeUserAttribute&&(h=b.removeUserAttribute(d)),h&&a.Logger.verbose(h);}catch(b){a.Logger.error(b);}});},this.setForwarderUserIdentities=function(c){var d=removeBlockedUserIdentities(c,b);a._Store.activeForwarders.forEach(function(b){var c=a._Helpers.filterUserIdentities(d,b.userIdentityFilters);b.setUserIdentity&&c.forEach(function(c){var d=b.setUserIdentity(c.Identity,c.Type);d&&a.Logger.verbose(d);});});},this.setForwarderOnUserIdentified=function(c){a._Store.activeForwarders.forEach(function(d){var e=filteredMparticleUser(c.getMPID(),d,a,b);if(d.onUserIdentified){var f=d.onUserIdentified(e);f&&a.Logger.verbose(f);}});},this.setForwarderOnIdentityComplete=function(c,d){var e=identityCompleteKitMethods[d];e&&a._Store.activeForwarders.forEach(function(d){var f=d[e];if(f){var g=filteredMparticleUser(c.getMPID(),d,a,b),h=f.call(d,g,g.getUserIdentities());h&&a.Logger.verbose(h);}});},this.getForwarderStatsQueue=function(){return a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue},this.setForwarderStatsQueue=function(b){a._Persistence.forwardingStatsBatches.forwardingStatsEventQueue=b;},this.processForwarders=function(b,c){b?(this.processUIEnabledKits(b),this.processSideloadedKits(b),d.initForwarders(a._Store.SDKConfig.identifyRequest.userIdentities,c)):a.Logger.warning("No config was passed. Cannot process forwarders");},this.processUIEnabledKits=function(b){var c=this.returnKitConstructors();try{Array.isArray(b.kitConfigs)&&b.kitConfigs.length&&b.kitConfigs.forEach(function(a){d.configureUIEnabledKit(a,c);});}catch(b){a.Logger.error("MP Kits not configured propertly. Kits may not be initialized. "+b);}},this.returnKitConstructors=function(){var b={};// If there are kits inside of mpInstance._Store.SDKConfig.kits, then mParticle is self hosted
963
968
  return isEmpty(a._Store.SDKConfig.kits)?!isEmpty(a._preInit.forwarderConstructors)&&a._preInit.forwarderConstructors.forEach(function(a){// A suffix is added to a kitConstructor and kit config if there are multiple different
964
969
  // versions of a client kit. This matches the suffix in the DB. As an example
965
970
  // the GA4 kit has a client kit and a server side kit which has a client side
@@ -1129,7 +1134,7 @@ return e<f&&(e=f,g<e&&a.Logger.warning("Source User has not been seen in the las
1129
1134
  * @param {String} value
1130
1135
  */ // https://go.mparticle.com/work/SQDSDKS-4576
1131
1136
  // https://go.mparticle.com/work/SQDSDKS-6373
1132
- setUserAttribute:function setUserAttribute(c,d){if(a._SessionManager.resetSessionTimer(),a._Helpers.canLog()){if(!a._Helpers.Validators.isValidAttributeValue(d))return void a.Logger.error(Messages$2.ErrorMessages.BadAttribute);if(!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttribute,JSON.stringify({key:c,value:d}));else {var f=this.getAllUserAttributes(),g=void 0,h=void 0,i=a._Helpers.findKeyInObject(f,c);i?(h=!1,g=f[i],delete f[i]):h=!0,f[c]=d,a._Store.setUserAttributes(b,f),e.sendUserAttributeChangeEvent(c,d,g,h,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,d);}}},/**
1137
+ setUserAttribute:function setUserAttribute(c,d){if(a._SessionManager.resetSessionTimer(),a._Helpers.canLog()){if(!a._Helpers.Validators.isValidAttributeValue(d))return void a.Logger.error(Messages$2.ErrorMessages.BadAttribute);if(!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttribute,JSON.stringify({key:c,value:d}));else {var f=this.getAllUserAttributes(),g=void 0,h=void 0,i=a._Helpers.findKeyInObject(f,c);i?(h=!1,g=f[i],delete f[i]):h=!0,f[c]=d,a._Store.setUserAttributes(b,f),e.sendUserAttributeChangeEvent(c,d,g,h,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,d);}}},/**
1133
1138
  * Set multiple user attributes
1134
1139
  * @method setUserAttributes
1135
1140
  * @param {Object} user attribute object with keys of the attribute type, and value of the attribute value
@@ -1138,7 +1143,7 @@ setUserAttributes:function setUserAttributes(b){if(a._SessionManager.resetSessio
1138
1143
  * Removes a specific user attribute
1139
1144
  * @method removeUserAttribute
1140
1145
  * @param {String} key
1141
- */removeUserAttribute:function removeUserAttribute(c){var d,f;if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveUserAttribute,JSON.stringify({key:c,value:null}));else {d=a._Persistence.getPersistence(),f=this.getAllUserAttributes();var g=a._Helpers.findKeyInObject(f,c);g&&(c=g);var h=f[c]?f[c].toString():null;delete f[c],d&&d[b]&&(d[b].ua=f,a._Persistence.savePersistence(d)),e.sendUserAttributeChangeEvent(c,null,h,!1,!0,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null);}},/**
1146
+ */removeUserAttribute:function removeUserAttribute(c){var d,f;if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveUserAttribute,JSON.stringify({key:c,value:null}));else {d=a._Persistence.getPersistence(),f=this.getAllUserAttributes();var g=a._Helpers.findKeyInObject(f,c);g&&(c=g);var h=f[c]?f[c].toString():null;delete f[c],d&&d[b]&&(d[b].ua=f,a._Persistence.savePersistence(d)),e.sendUserAttributeChangeEvent(c,null,h,!1,!0,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null);}},/**
1142
1147
  * Sets a list of user attributes
1143
1148
  * @method setUserAttributeList
1144
1149
  * @param {String} key
@@ -1147,10 +1152,10 @@ setUserAttributes:function setUserAttributes(b){if(a._SessionManager.resetSessio
1147
1152
  setUserAttributeList:function setUserAttributeList(c,d){if(a._SessionManager.resetSessionTimer(),!a._Helpers.Validators.isValidKeyValue(c))return void a.Logger.error(Messages$2.ErrorMessages.BadKey);if(!Array.isArray(d))return void a.Logger.error("The value you passed in to setUserAttributeList must be an array. You passed in a "+_typeof(d));var f=d.slice();if(a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.SetUserAttributeList,JSON.stringify({key:c,value:f}));else {var g=this.getAllUserAttributes(),h=void 0,j=void 0,k=void 0,l=a._Helpers.findKeyInObject(g,c);// If the new attributeList length is different than the previous, then there is a change event.
1148
1153
  // Loop through new attributes list, see if they are all in the same index as previous user attributes list
1149
1154
  // If there are any changes, break, and immediately send a userAttributeChangeEvent with full array as a value
1150
- if(l?(j=!1,h=g[l],delete g[l]):j=!0,g[c]=f,a._Store.setUserAttributes(b,g),!h||!Array.isArray(h))k=!0;else if(d.length!==h.length)k=!0;else for(var m=0;m<d.length;m++)if(h[m]!==d[m]){k=!0;break}k&&e.sendUserAttributeChangeEvent(c,d,h,j,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,f);}},/**
1155
+ if(l?(j=!1,h=g[l],delete g[l]):j=!0,g[c]=f,a._Store.setUserAttributes(b,g),!h||!Array.isArray(h))k=!0;else if(d.length!==h.length)k=!0;else for(var m=0;m<d.length;m++)if(h[m]!==d[m]){k=!0;break}k&&e.sendUserAttributeChangeEvent(c,d,h,j,!1,this),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),a._Forwarders.handleForwarderUserAttributes("setUserAttribute",c,f);}},/**
1151
1156
  * Removes all user attributes
1152
1157
  * @method removeAllUserAttributes
1153
- */removeAllUserAttributes:function removeAllUserAttributes(){var b;if(a._SessionManager.resetSessionTimer(),a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveAllUserAttributes);else if(b=this.getAllUserAttributes(),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities(),a._APIClient.prepareForwardingStats),b)for(var c in b)b.hasOwnProperty(c)&&a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null),this.removeUserAttribute(c);},/**
1158
+ */removeAllUserAttributes:function removeAllUserAttributes(){var b;if(a._SessionManager.resetSessionTimer(),a._Store.webviewBridgeEnabled)a._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveAllUserAttributes);else if(b=this.getAllUserAttributes(),a._Forwarders.initForwarders(e.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities,a._APIClient.prepareForwardingStats),b)for(var c in b)b.hasOwnProperty(c)&&a._Forwarders.handleForwarderUserAttributes("removeUserAttribute",c,null),this.removeUserAttribute(c);},/**
1154
1159
  * Returns all user attribute keys that have values that are arrays
1155
1160
  * @method getUserAttributesLists
1156
1161
  * @return {Object} an object of only keys with array values. Example: { attr1: [1, 2, 3], attr2: ['a', 'b', 'c'] }
@@ -1268,7 +1273,9 @@ if(v=null===(u=null===(t=null===(s=null===(r=null===(q=null===(p=null===(o=null=
1268
1273
  // will be a boolean, otherwise it will return an object
1269
1274
  return !("boolean"==typeof b&&b)&&"object"===_typeof(b)&&!0!==b[a];// When "Block unplanned user attributes" is enabled and "Allow unplanned user
1270
1275
  // attributes" is also enabled in the UI, allowing unplanned user attributes will be prioritized
1271
- },a.prototype.isIdentityBlocked=function(a){/* used when an attribute is added to the user */if(!this.blockUserIdentities)return !1;if(this.blockUserIdentities){var b=this.dataPlanMatchLookups.user_identities;if(!0===b)return !1;if(!b[a])return !0}else return !1;return !1},a.prototype.transformUserIdentities=function(a){var b,c=this,d=__assign({},a);/*
1276
+ },a.prototype.isIdentityBlocked=function(a){/* used when an attribute is added to the user */if(!this.blockUserIdentities)return !1;if(this.blockUserIdentities){var b=this.dataPlanMatchLookups.user_identities;// The lookup is absent, not empty, when the plan carries no
1277
+ // user_identities data point, and indexing it would throw.
1278
+ if(!0===b||!b)return !1;if(!b[a])return !0}else return !1;return !1},a.prototype.transformUserIdentities=function(a){var b,c=this,d=__assign({},a);/*
1272
1279
  If the user identity is not found in matchedIdentities
1273
1280
  then remove it from event.UserIdentities as it is blocked.
1274
1281
  event.UserIdentities is of type [{Identity: 'id1', Type: 7}, ...]
package/dist/mparticle.js CHANGED
@@ -204,7 +204,7 @@ var mParticle = (function () {
204
204
  Base64: Base64$1
205
205
  };
206
206
 
207
- var version = "3.4.0";
207
+ var version = "3.6.0";
208
208
 
209
209
  var Constants = {
210
210
  sdkVersion: version,
@@ -3869,6 +3869,12 @@ var mParticle = (function () {
3869
3869
  continue;
3870
3870
  }
3871
3871
  var userIdentityType = Types.IdentityType.getIdentityType(userIdentityName);
3872
+ // Must be `=== false`: IdentityType.Other is 0, so a falsy check would
3873
+ // drop a valid type.
3874
+ var isUnrecognisedIdentityName = userIdentityType === false;
3875
+ if (isUnrecognisedIdentityName) {
3876
+ continue;
3877
+ }
3872
3878
  if (inArray(filterList, userIdentityType)) {
3873
3879
  continue;
3874
3880
  }
@@ -6025,7 +6031,7 @@ var mParticle = (function () {
6025
6031
  for (var key in persistence) {
6026
6032
  // any value in persistence that has an MPID key will be an MPID to search through
6027
6033
  // other keys on the cookie are currentSessionMPIDs and currentMPID which should not be searched
6028
- if (!persistence[key].mpid) {
6034
+ if (!mpInstance._Helpers.isObject(persistence[key]) || !persistence[key].mpid) {
6029
6035
  continue;
6030
6036
  }
6031
6037
  if (cookieUiMatchesRequestedIdentity(persistence[key].ui, requestedIdentityType, requestedValue)) {
@@ -6133,6 +6139,11 @@ var mParticle = (function () {
6133
6139
  }
6134
6140
  if (Base64CookieKeys[key]) {
6135
6141
  gs[key] = JSON.parse(Base64.decode(gs[key]));
6142
+ // Written as an array of MPIDs by encodeGsBase64Field, then read
6143
+ // as one by addMpidToSessionHistory and reduceAndEncodePersistence.
6144
+ if (key === 'csm' && !Array.isArray(gs[key])) {
6145
+ delete gs[key];
6146
+ }
6136
6147
  continue;
6137
6148
  }
6138
6149
  if (key === 'ie') {
@@ -6159,6 +6170,12 @@ var mParticle = (function () {
6159
6170
  continue;
6160
6171
  }
6161
6172
  if (!SDKv2NonMPIDCookieKeys[mpid]) {
6173
+ // Written as an object by encodeMpidRecords, then read as one by
6174
+ // findMpidForRequestedIdentity and copied by copyNonCurrentUserMpids.
6175
+ if (!mpInstance._Helpers.isObject(persistence[mpid])) {
6176
+ delete persistence[mpid];
6177
+ continue;
6178
+ }
6162
6179
  decodeMpidRecord(persistence[mpid]);
6163
6180
  continue;
6164
6181
  }
@@ -7215,6 +7232,17 @@ var mParticle = (function () {
7215
7232
  Logout$1 = _b.Logout;
7216
7233
  // Maps an identity method to the kit callback that reports its completion.
7217
7234
  var identityCompleteKitMethods = (_a = {}, _a[Identify$1] = 'onIdentifyComplete', _a[Login$1] = 'onLoginComplete', _a[Logout$1] = 'onLogoutComplete', _a[Modify$2] = 'onModifyComplete', _a);
7235
+ function removeBlockedUserIdentities(userIdentities, kitBlocker) {
7236
+ var identitiesByName = userIdentities;
7237
+ var allowedUserIdentities = {};
7238
+ for (var identityName in identitiesByName) {
7239
+ if (!identitiesByName.hasOwnProperty(identityName) || !isIdentityAllowed(kitBlocker, identityName)) {
7240
+ continue;
7241
+ }
7242
+ allowedUserIdentities[identityName] = identitiesByName[identityName];
7243
+ }
7244
+ return allowedUserIdentities;
7245
+ }
7218
7246
  function userAttributesMatchFilter(userAttributes, filterObject) {
7219
7247
  for (var attrName in userAttributes) {
7220
7248
  if (!userAttributes.hasOwnProperty(attrName)) {
@@ -7239,6 +7267,7 @@ var mParticle = (function () {
7239
7267
  this.initForwarders = function (userIdentities, forwardingStatsCallback) {
7240
7268
  var user = mpInstance.Identity.getCurrentUser();
7241
7269
  if (!mpInstance._Store.webviewBridgeEnabled && mpInstance._Store.configuredForwarders) {
7270
+ var allowedUserIdentities_1 = removeBlockedUserIdentities(userIdentities, kitBlocker);
7242
7271
  // Some js libraries require that they be loaded first, or last, etc
7243
7272
  mpInstance._Store.configuredForwarders.sort(function (x, y) {
7244
7273
  x.settings.PriorityValue = x.settings.PriorityValue || 0;
@@ -7255,8 +7284,8 @@ var mParticle = (function () {
7255
7284
  if (!self.isEnabledForUnknownUser(forwarder.excludeAnonymousUser, user)) {
7256
7285
  return false;
7257
7286
  }
7258
- var filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(userIdentities, forwarder.userIdentityFilters);
7259
- var filteredUserAttributes = KitFilterHelper.filterUserAttributes(user ? user.getAllUserAttributes() : {}, forwarder.userAttributeFilters);
7287
+ var filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(allowedUserIdentities_1, forwarder.userIdentityFilters);
7288
+ var filteredUserAttributes = user ? filteredMparticleUser(user.getMPID(), forwarder, mpInstance, kitBlocker).getAllUserAttributes() : {};
7260
7289
  if (!forwarder.initialized) {
7261
7290
  forwarder.logger = mpInstance.Logger;
7262
7291
  forwarder.init(forwarder.settings, forwardingStatsCallback, false, null, filteredUserAttributes, filteredUserIdentities, mpInstance._Store.SDKConfig.appVersion, mpInstance._Store.SDKConfig.appName, mpInstance._Store.SDKConfig.customFlags, mpInstance._Store.clientId);
@@ -7368,8 +7397,9 @@ var mParticle = (function () {
7368
7397
  };
7369
7398
  // TODO: https://go.mparticle.com/work/SQDSDKS-6036
7370
7399
  this.setForwarderUserIdentities = function (userIdentities) {
7400
+ var allowedUserIdentities = removeBlockedUserIdentities(userIdentities, kitBlocker);
7371
7401
  mpInstance._Store.activeForwarders.forEach(function (forwarder) {
7372
- var filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(userIdentities, forwarder.userIdentityFilters);
7402
+ var filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(allowedUserIdentities, forwarder.userIdentityFilters);
7373
7403
  if (forwarder.setUserIdentity) {
7374
7404
  filteredUserIdentities.forEach(function (identity) {
7375
7405
  var result = forwarder.setUserIdentity(identity.Identity, identity.Type);
@@ -8645,7 +8675,7 @@ var mParticle = (function () {
8645
8675
  userAttributes[key] = newValue;
8646
8676
  mpInstance._Store.setUserAttributes(mpid, userAttributes);
8647
8677
  self.sendUserAttributeChangeEvent(key, newValue, previousUserAttributeValue, isNewAttribute, false, this);
8648
- mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities(), mpInstance._APIClient.prepareForwardingStats);
8678
+ mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities, mpInstance._APIClient.prepareForwardingStats);
8649
8679
  mpInstance._Forwarders.handleForwarderUserAttributes('setUserAttribute', key, newValue);
8650
8680
  }
8651
8681
  }
@@ -8702,7 +8732,7 @@ var mParticle = (function () {
8702
8732
  mpInstance._Persistence.savePersistence(cookies);
8703
8733
  }
8704
8734
  self.sendUserAttributeChangeEvent(key, null, deletedUAKeyCopy, false, true, this);
8705
- mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities(), mpInstance._APIClient.prepareForwardingStats);
8735
+ mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities, mpInstance._APIClient.prepareForwardingStats);
8706
8736
  mpInstance._Forwarders.handleForwarderUserAttributes('removeUserAttribute', key, null);
8707
8737
  }
8708
8738
  },
@@ -8762,7 +8792,7 @@ var mParticle = (function () {
8762
8792
  if (userAttributeChange) {
8763
8793
  self.sendUserAttributeChangeEvent(key, newValue, previousUserAttributeValue, isNewAttribute, false, this);
8764
8794
  }
8765
- mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities(), mpInstance._APIClient.prepareForwardingStats);
8795
+ mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities, mpInstance._APIClient.prepareForwardingStats);
8766
8796
  mpInstance._Forwarders.handleForwarderUserAttributes('setUserAttribute', key, arrayCopy);
8767
8797
  }
8768
8798
  },
@@ -8777,7 +8807,7 @@ var mParticle = (function () {
8777
8807
  mpInstance._NativeSdkHelpers.sendToNative(Constants.NativeSdkPaths.RemoveAllUserAttributes);
8778
8808
  } else {
8779
8809
  userAttributes = this.getAllUserAttributes();
8780
- mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities(), mpInstance._APIClient.prepareForwardingStats);
8810
+ mpInstance._Forwarders.initForwarders(self.IdentityAPI.getCurrentUser().getUserIdentities().userIdentities, mpInstance._APIClient.prepareForwardingStats);
8781
8811
  if (userAttributes) {
8782
8812
  for (var prop in userAttributes) {
8783
8813
  if (userAttributes.hasOwnProperty(prop)) {
@@ -9783,7 +9813,11 @@ var mParticle = (function () {
9783
9813
  }
9784
9814
  if (this.blockUserIdentities) {
9785
9815
  var matchedIdentities = this.dataPlanMatchLookups['user_identities'];
9786
- if (matchedIdentities === true) {
9816
+ var unplannedIdentitiesAllowed = matchedIdentities === true;
9817
+ // The lookup is absent, not empty, when the plan carries no
9818
+ // user_identities data point, and indexing it would throw.
9819
+ var planHasNoIdentityDataPoint = !matchedIdentities;
9820
+ if (unplannedIdentitiesAllowed || planHasNoIdentityDataPoint) {
9787
9821
  return false;
9788
9822
  }
9789
9823
  if (!matchedIdentities[key]) {
@@ -2,7 +2,6 @@ import { BatchUploader } from './batchUploader';
2
2
  import { SDKEvent, SDKDataPlan } from './sdkRuntimeModels';
3
3
  import KitBlocker from './kitBlocking';
4
4
  import { Dictionary } from './utils';
5
- import { IUploadObject } from './serverModel';
6
5
  import { MPForwarder } from './forwarders.interfaces';
7
6
  import { IMParticleUser, ISDKUserAttributes } from './identity-user-interfaces';
8
7
  import { AsyncUploader } from './uploaders';
@@ -16,7 +15,7 @@ export interface IAPIClient {
16
15
  sendSingleEventToServer: (event: SDKEvent) => void;
17
16
  sendBatchForwardingStatsToServer: (forwardingStatsData: IForwardingStatsData, xhr: XMLHttpRequest) => void;
18
17
  initializeForwarderStatsUploader: () => AsyncUploader;
19
- prepareForwardingStats: (forwarder: MPForwarder, event: IUploadObject) => void;
18
+ prepareForwardingStats: (forwarder: MPForwarder, event: SDKEvent) => void;
20
19
  }
21
20
  export interface IForwardingStatsData {
22
21
  mid: number;
@@ -11,6 +11,7 @@ export interface IFilteredMparticleUser {
11
11
  getUserAttributesLists(forwarder: MPForwarder): Dictionary<string[]>;
12
12
  getAllUserAttributes(): Dictionary;
13
13
  }
14
+ export declare function isIdentityAllowed(kitBlocker: KitBlocker | undefined, identityName: string): boolean;
14
15
  export default function filteredMparticleUser(mpid: MPID, forwarder: MPForwarder | {
15
16
  userAttributeFilters: number[];
16
17
  }, mpInstance: IMParticleWebSDKInstance, kitBlocker?: KitBlocker): IFilteredMparticleUser;
@@ -2,6 +2,7 @@ import { IAPIClient } from './apiClient';
2
2
  import { ICookieSyncManager } from './cookieSyncManager';
3
3
  import { ISessionManager } from './sessionManager';
4
4
  import { IStore } from './store';
5
+ import { IForwarders } from './forwarders.interfaces';
5
6
  import { IServerModel } from './serverModel';
6
7
  import { IForwardingStatsUploader } from './forwardingStatsUploader';
7
8
  import { IConsent } from './consent';
@@ -38,7 +39,7 @@ export interface IMParticleWebSDKInstance extends MParticleWebSDK {
38
39
  _CookieSyncManager: ICookieSyncManager;
39
40
  _Ecommerce: IECommerce;
40
41
  _Events: IEvents;
41
- _Forwarders: any;
42
+ _Forwarders: Pick<IForwarders, 'initForwarders'> & Record<Exclude<keyof IForwarders, 'initForwarders'>, any>;
42
43
  _ForwardingStatsUploader: IForwardingStatsUploader;
43
44
  _Helpers: SDKHelpersApi;
44
45
  _Identity: IIdentity;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mparticle/web-sdk",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "mParticle core SDK for web applications",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
package/src/apiClient.ts CHANGED
@@ -4,7 +4,6 @@ import { BatchUploader } from './batchUploader';
4
4
  import { SDKEvent, SDKDataPlan } from './sdkRuntimeModels';
5
5
  import KitBlocker from './kitBlocking';
6
6
  import { Dictionary, isEmpty, parseNumber, extend } from './utils';
7
- import { IUploadObject } from './serverModel';
8
7
  import { MPForwarder } from './forwarders.interfaces';
9
8
  import { IMParticleUser, ISDKUserAttributes } from './identity-user-interfaces';
10
9
  import { AsyncUploader, FetchUploader, XHRUploader } from './uploaders';
@@ -26,7 +25,7 @@ export interface IAPIClient {
26
25
  initializeForwarderStatsUploader: () => AsyncUploader;
27
26
  prepareForwardingStats: (
28
27
  forwarder: MPForwarder,
29
- event: IUploadObject
28
+ event: SDKEvent
30
29
  ) => void;
31
30
  }
32
31
 
@@ -19,7 +19,7 @@ function isAttributeKeyAllowed(
19
19
  return !kitBlocker?.isAttributeKeyBlocked(key);
20
20
  }
21
21
 
22
- function isIdentityAllowed(
22
+ export function isIdentityAllowed(
23
23
  kitBlocker: KitBlocker | undefined,
24
24
  identityName: string
25
25
  ): boolean {
package/src/forwarders.ts CHANGED
@@ -1,4 +1,6 @@
1
- import filteredMparticleUser from './filteredMparticleUser';
1
+ import filteredMparticleUser, {
2
+ isIdentityAllowed,
3
+ } from './filteredMparticleUser';
2
4
  import { isEmpty, extend, Dictionary } from './utils';
3
5
  import KitFilterHelper from './kitFilterHelper';
4
6
  import Constants from './constants';
@@ -41,6 +43,27 @@ const identityCompleteKitMethods: Dictionary<
41
43
  [Modify]: 'onModifyComplete',
42
44
  };
43
45
 
46
+ function removeBlockedUserIdentities(
47
+ userIdentities: UserIdentities,
48
+ kitBlocker: KitBlocker | undefined
49
+ ): UserIdentities {
50
+ const identitiesByName = userIdentities as Dictionary<string>;
51
+ const allowedUserIdentities: Dictionary<string> = {};
52
+
53
+ for (const identityName in identitiesByName) {
54
+ if (
55
+ !identitiesByName.hasOwnProperty(identityName) ||
56
+ !isIdentityAllowed(kitBlocker, identityName)
57
+ ) {
58
+ continue;
59
+ }
60
+
61
+ allowedUserIdentities[identityName] = identitiesByName[identityName];
62
+ }
63
+
64
+ return allowedUserIdentities as UserIdentities;
65
+ }
66
+
44
67
  function userAttributesMatchFilter(
45
68
  userAttributes: Dictionary,
46
69
  filterObject: Partial<IFilteringUserAttributeValue>
@@ -93,6 +116,11 @@ export default function Forwarders(
93
116
  !mpInstance._Store.webviewBridgeEnabled &&
94
117
  mpInstance._Store.configuredForwarders
95
118
  ) {
119
+ const allowedUserIdentities = removeBlockedUserIdentities(
120
+ userIdentities,
121
+ kitBlocker
122
+ );
123
+
96
124
  // Some js libraries require that they be loaded first, or last, etc
97
125
  mpInstance._Store.configuredForwarders.sort(function(x, y) {
98
126
  x.settings.PriorityValue = x.settings.PriorityValue || 0;
@@ -130,13 +158,17 @@ export default function Forwarders(
130
158
  }
131
159
 
132
160
  const filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(
133
- userIdentities,
161
+ allowedUserIdentities,
134
162
  forwarder.userIdentityFilters
135
163
  );
136
- const filteredUserAttributes = KitFilterHelper.filterUserAttributes(
137
- user ? user.getAllUserAttributes() : {},
138
- forwarder.userAttributeFilters
139
- );
164
+ const filteredUserAttributes = user
165
+ ? filteredMparticleUser(
166
+ user.getMPID(),
167
+ forwarder,
168
+ mpInstance,
169
+ kitBlocker
170
+ ).getAllUserAttributes()
171
+ : {};
140
172
  if (!forwarder.initialized) {
141
173
  forwarder.logger = mpInstance.Logger;
142
174
  forwarder.init(
@@ -356,9 +388,14 @@ export default function Forwarders(
356
388
 
357
389
  // TODO: https://go.mparticle.com/work/SQDSDKS-6036
358
390
  this.setForwarderUserIdentities = function(userIdentities: UserIdentities): void {
391
+ const allowedUserIdentities = removeBlockedUserIdentities(
392
+ userIdentities,
393
+ kitBlocker
394
+ );
395
+
359
396
  mpInstance._Store.activeForwarders.forEach(function(forwarder) {
360
397
  const filteredUserIdentities = mpInstance._Helpers.filterUserIdentities(
361
- userIdentities,
398
+ allowedUserIdentities,
362
399
  forwarder.userIdentityFilters
363
400
  );
364
401
  if (forwarder.setUserIdentity) {
package/src/helpers.ts CHANGED
@@ -48,6 +48,14 @@ function buildFilteredUserIdentities(
48
48
  userIdentityName
49
49
  );
50
50
 
51
+ // Must be `=== false`: IdentityType.Other is 0, so a falsy check would
52
+ // drop a valid type.
53
+ const isUnrecognisedIdentityName = userIdentityType === false;
54
+
55
+ if (isUnrecognisedIdentityName) {
56
+ continue;
57
+ }
58
+
51
59
  if (inArray(filterList, userIdentityType)) {
52
60
  continue;
53
61
  }
package/src/identity.ts CHANGED
@@ -1007,7 +1007,8 @@ export default function Identity(
1007
1007
  );
1008
1008
 
1009
1009
  mpInstance._Forwarders.initForwarders(
1010
- self.IdentityAPI.getCurrentUser().getUserIdentities(),
1010
+ self.IdentityAPI.getCurrentUser().getUserIdentities()
1011
+ .userIdentities,
1011
1012
  mpInstance._APIClient.prepareForwardingStats
1012
1013
  );
1013
1014
  mpInstance._Forwarders.handleForwarderUserAttributes(
@@ -1096,7 +1097,8 @@ export default function Identity(
1096
1097
  );
1097
1098
 
1098
1099
  mpInstance._Forwarders.initForwarders(
1099
- self.IdentityAPI.getCurrentUser().getUserIdentities(),
1100
+ self.IdentityAPI.getCurrentUser().getUserIdentities()
1101
+ .userIdentities,
1100
1102
  mpInstance._APIClient.prepareForwardingStats
1101
1103
  );
1102
1104
  mpInstance._Forwarders.handleForwarderUserAttributes(
@@ -1192,7 +1194,8 @@ export default function Identity(
1192
1194
  }
1193
1195
 
1194
1196
  mpInstance._Forwarders.initForwarders(
1195
- self.IdentityAPI.getCurrentUser().getUserIdentities(),
1197
+ self.IdentityAPI.getCurrentUser().getUserIdentities()
1198
+ .userIdentities,
1196
1199
  mpInstance._APIClient.prepareForwardingStats
1197
1200
  );
1198
1201
  mpInstance._Forwarders.handleForwarderUserAttributes(
@@ -1219,7 +1222,8 @@ export default function Identity(
1219
1222
  userAttributes = this.getAllUserAttributes();
1220
1223
 
1221
1224
  mpInstance._Forwarders.initForwarders(
1222
- self.IdentityAPI.getCurrentUser().getUserIdentities(),
1225
+ self.IdentityAPI.getCurrentUser().getUserIdentities()
1226
+ .userIdentities,
1223
1227
  mpInstance._APIClient.prepareForwardingStats
1224
1228
  );
1225
1229
  if (userAttributes) {
@@ -490,7 +490,11 @@ export default class KitBlocker {
490
490
 
491
491
  if (this.blockUserIdentities) {
492
492
  const matchedIdentities = this.dataPlanMatchLookups['user_identities'];
493
- if (matchedIdentities === true) {
493
+ const unplannedIdentitiesAllowed = matchedIdentities === true;
494
+ // The lookup is absent, not empty, when the plan carries no
495
+ // user_identities data point, and indexing it would throw.
496
+ const planHasNoIdentityDataPoint = !matchedIdentities;
497
+ if (unplannedIdentitiesAllowed || planHasNoIdentityDataPoint) {
494
498
  return false
495
499
  }
496
500
  if (!matchedIdentities[key]) {
@@ -29,6 +29,7 @@ import { Logger } from './logger';
29
29
  import Persistence from './persistence';
30
30
  import Events from './events';
31
31
  import Forwarders from './forwarders';
32
+ import { IForwarders } from './forwarders.interfaces';
32
33
  import ServerModel, { IServerModel } from './serverModel';
33
34
  import ForwardingStatsUploader, {
34
35
  IForwardingStatsUploader,
@@ -88,7 +89,9 @@ export interface IMParticleWebSDKInstance extends MParticleWebSDK {
88
89
  _CookieSyncManager: ICookieSyncManager;
89
90
  _Ecommerce: IECommerce;
90
91
  _Events: IEvents;
91
- _Forwarders: any; // https://go.mparticle.com/work/SQDSDKS-5767
92
+ // https://go.mparticle.com/work/SQDSDKS-5767
93
+ _Forwarders: Pick<IForwarders, 'initForwarders'> &
94
+ Record<Exclude<keyof IForwarders, 'initForwarders'>, any>;
92
95
  _ForwardingStatsUploader: IForwardingStatsUploader;
93
96
  _Helpers: SDKHelpersApi;
94
97
  _Identity: IIdentity;
@@ -765,7 +765,10 @@ export default function _Persistence(
765
765
  for (let key in persistence) {
766
766
  // any value in persistence that has an MPID key will be an MPID to search through
767
767
  // other keys on the cookie are currentSessionMPIDs and currentMPID which should not be searched
768
- if (!persistence[key].mpid) {
768
+ if (
769
+ !mpInstance._Helpers.isObject(persistence[key]) ||
770
+ !persistence[key].mpid
771
+ ) {
769
772
  continue;
770
773
  }
771
774
  if (
@@ -904,6 +907,12 @@ export default function _Persistence(
904
907
  }
905
908
  if (Base64CookieKeys[key]) {
906
909
  gs[key] = JSON.parse(Base64.decode(gs[key]));
910
+
911
+ // Written as an array of MPIDs by encodeGsBase64Field, then read
912
+ // as one by addMpidToSessionHistory and reduceAndEncodePersistence.
913
+ if (key === 'csm' && !Array.isArray(gs[key])) {
914
+ delete gs[key];
915
+ }
907
916
  continue;
908
917
  }
909
918
  if (key === 'ie') {
@@ -932,6 +941,12 @@ export default function _Persistence(
932
941
  continue;
933
942
  }
934
943
  if (!SDKv2NonMPIDCookieKeys[mpid]) {
944
+ // Written as an object by encodeMpidRecords, then read as one by
945
+ // findMpidForRequestedIdentity and copied by copyNonCurrentUserMpids.
946
+ if (!mpInstance._Helpers.isObject(persistence[mpid])) {
947
+ delete persistence[mpid];
948
+ continue;
949
+ }
935
950
  decodeMpidRecord(persistence[mpid]);
936
951
  continue;
937
952
  }