diff --git a/src/identity-utils.ts b/src/identity-utils.ts index 14ac5753e..b609e66e2 100644 --- a/src/identity-utils.ts +++ b/src/identity-utils.ts @@ -27,7 +27,7 @@ export type IParseCachedIdentityResponse = ( callback: IdentityCallback, identityApiData: IdentityApiData, identityMethod: string, - knownIdentities: IKnownIdentities, + knownIdentities: IKnownIdentities | UserIdentities, fromCachedIdentity: boolean ) => void; diff --git a/src/identity.interfaces.ts b/src/identity.interfaces.ts index 32ad3ea6e..f1315e66f 100644 --- a/src/identity.interfaces.ts +++ b/src/identity.interfaces.ts @@ -1,4 +1,5 @@ import { IdentityApiData, MPID, UserIdentities } from '@mparticle/web-sdk'; +import { Context } from '@mparticle/event-models'; import AudienceManager from './audienceManager'; import { ICachedIdentityCall, IKnownIdentities } from './identity-utils'; import { BaseVault } from './vault'; @@ -17,6 +18,7 @@ const { platform, sdkVendor, sdkVersion, HTTPCodes } = Constants; export type IdentityPreProcessResult = { valid: boolean; error?: string; + cleanedIdentities?: IdentityApiData; }; export type IdentityAPIMethod = valueof; @@ -48,14 +50,14 @@ export enum SDKIdentityTypeEnum { export interface IIdentityAPIRequestData { client_sdk: { - platform: typeof platform; - sdk_vendor: typeof sdkVendor; - sdk_version: typeof sdkVersion; + platform: string; + sdk_vendor: string; + sdk_version: string; }; - context: string | null; + context: Context | null; environment: Environment; request_id: string; - request_timestamp_unixtime_ms: number; + request_timestamp_ms: number; previous_mpid: MPID | null; known_identities: IKnownIdentities; } @@ -85,7 +87,7 @@ export interface IIdentityRequest { sdkVendor: string, sdkVersion: string, deviceId: string, - context: string | null, + context: Context | null, mpid: MPID ): IIdentityAPIRequestData; createModifyIdentityRequest( @@ -94,17 +96,20 @@ export interface IIdentityRequest { platform: string, sdkVendor: string, sdkVersion: string, - context: string | null + context: Context | null ): IIdentityAPIModifyRequestData; createIdentityChanges( previousIdentities: UserIdentities, - newIdentitie: UserIdentities - ): IIdentityAPIIdentityChangeData; + newIdentities: UserIdentities + ): IIdentityAPIIdentityChangeData[]; preProcessIdentityRequest( identityApiData: IdentityApiData, callback: IdentityCallback, method: IdentityAPIMethod ): IdentityPreProcessResult; + createAliasNetworkRequest(aliasRequest: IAliasRequest): object; + convertAliasToNative(aliasRequest: IAliasRequest): object; + convertToNative(identityApiData: IdentityApiData): object | void; } export type AliasRequestScope = 'device' | 'mpid'; @@ -149,7 +154,7 @@ export interface SDKIdentityApi { getUsers?(): IMParticleUser[]; aliasUsers?( aliasRequest?: IAliasRequest, - callback?: IdentityCallback + callback?: IAliasCallback ): void; createAliasRequest?( sourceUser: IMParticleUser, @@ -165,18 +170,18 @@ export interface IIdentity { IdentityAPI: SDKIdentityApi; IdentityRequest: IIdentityRequest; - mParticleUser(mpid: MPID, IsLoggedIn: boolean): IMParticleUser; + mParticleUser(mpid?: MPID, IsLoggedIn?: boolean): IMParticleUser; createUserAttributeChange( key: string, - newValue: string, - previousUserAttributeValue: string, + newValue: string | string[] | null, + previousUserAttributeValue: string | string[] | null, isNewAttribute: boolean, deleted: boolean, user: IMParticleUser ): IUserAttributeChangeEvent; createUserIdentityChange( - identityType: SDKIdentityTypeEnum, + identityType: SDKIdentityTypeEnum | string, newIdentity: string, oldIdentity: string, newCreatedThisBatch: boolean, @@ -188,13 +193,13 @@ export interface IIdentity { callback: IdentityCallback, identityApiData: IdentityApiData, method: IdentityAPIMethod, - knownIdentities: UserIdentities, + knownIdentities: IKnownIdentities | UserIdentities, parsingCachedResponse: boolean ): void; sendUserAttributeChangeEvent( attributeKey: string, - newUserAttributeValue: string, - previousUserAttributeValue: string, + newUserAttributeValue: string | string[] | null, + previousUserAttributeValue: string | string[] | null, isNewAttribute: boolean, deleted: boolean, user: IMParticleUser @@ -205,6 +210,14 @@ export interface IIdentity { mpid: MPID, prevUserIdentities: UserIdentities ): void; + reinitForwardersOnUserChange( + prevUser: IMParticleUser, + newUser: IMParticleUser + ): void; + setForwarderCallbacks( + user: IMParticleUser, + method: IdentityAPIMethod + ): void; /** * @deprecated diff --git a/src/identity.js b/src/identity.ts similarity index 90% rename from src/identity.js rename to src/identity.ts index 0e939b599..725154cc6 100644 --- a/src/identity.js +++ b/src/identity.ts @@ -3,14 +3,17 @@ import Types, { IdentityType } from './types'; import { cacheOrClearIdCache, createKnownIdentities, + IKnownIdentities, + IParseCachedIdentityResponse, tryCacheIdentity, } from './identity-utils'; -import AudienceManager from './audienceManager'; +import AudienceManager, { IAudienceMemberships } from './audienceManager'; const { Messages, HTTPCodes, FeatureFlags, IdentityMethods } = Constants; const { ErrorMessages } = Messages; const { CacheIdentity } = FeatureFlags; const { Identify, Modify, Login, Logout } = IdentityMethods; import { + Environment, generateDeprecationMessage, isEmpty, isFunction, @@ -18,17 +21,39 @@ import { } from './utils'; import { hasMPIDAndUserLoginChanged, hasMPIDChanged } from './user-utils'; import { processReadyQueue } from './pre-init-utils'; - -export default function Identity(mpInstance) { +import { + IdentityCallback, + IIdentityResponse, + IMParticleUser, + mParticleUserCart, +} from './identity-user-interfaces'; +import { + IIdentity, + IIdentityAPIRequestData, + IdentityAPIMethod, + IAliasRequest, + IAliasCallback, + AliasRequestScope, + SDKIdentityTypeEnum, +} from './identity.interfaces'; +import { IMParticleWebSDKInstance } from './mp-instance'; +import { IdentityApiData, UserIdentities, MPID, ConsentState, UserAttributesValue } from '@mparticle/web-sdk'; +import { Context } from '@mparticle/event-models'; +import { BaseEvent, SDKEvent, SDKLoggerApi } from './sdkRuntimeModels'; + +export default function Identity( + this: IIdentity, + mpInstance: IMParticleWebSDKInstance +) { const { getFeatureFlag, extend } = mpInstance._Helpers; - var self = this; + const self: IIdentity = this; this.idCache = null; this.audienceManager = null; // https://go.mparticle.com/work/SQDSDKS-6353 this.IdentityRequest = { - preProcessIdentityRequest: function(identityApiData, callback, method) { + preProcessIdentityRequest: function(identityApiData: IdentityApiData, callback: IdentityCallback, method: IdentityAPIMethod) { mpInstance.Logger.verbose( Messages.InformationMessages.StartingLogEvent + ': ' + method ); @@ -75,24 +100,24 @@ export default function Identity(mpInstance) { }, createIdentityRequest: function( - identityApiData, - platform, - sdkVendor, - sdkVersion, - deviceId, - context, - mpid + identityApiData: IdentityApiData, + platform: string, + sdkVendor: string, + sdkVersion: string, + deviceId: string, + context: Context | null, + mpid: MPID ) { - var APIRequest = { + var APIRequest: IIdentityAPIRequestData = { client_sdk: { platform: platform, sdk_vendor: sdkVendor, sdk_version: sdkVersion, }, context: context, - environment: mpInstance._Store.SDKConfig.isDevelopmentMode + environment: (mpInstance._Store.SDKConfig.isDevelopmentMode ? 'development' - : 'production', + : 'production') as Environment, request_id: mpInstance._Helpers.generateUniqueId(), request_timestamp_ms: new Date().getTime(), previous_mpid: mpid || null, @@ -106,12 +131,12 @@ export default function Identity(mpInstance) { }, createModifyIdentityRequest: function( - currentUserIdentities, - newUserIdentities, - platform, - sdkVendor, - sdkVersion, - context + currentUserIdentities: UserIdentities, + newUserIdentities: UserIdentities, + platform: string, + sdkVendor: string, + sdkVersion: string, + context: Context | null ) { return { client_sdk: { @@ -120,9 +145,9 @@ export default function Identity(mpInstance) { sdk_version: sdkVersion, }, context: context, - environment: mpInstance._Store.SDKConfig.isDevelopmentMode + environment: (mpInstance._Store.SDKConfig.isDevelopmentMode ? 'development' - : 'production', + : 'production') as Environment, request_id: mpInstance._Helpers.generateUniqueId(), request_timestamp_ms: new Date().getTime(), identity_changes: this.createIdentityChanges( @@ -132,7 +157,7 @@ export default function Identity(mpInstance) { }; }, - createIdentityChanges: function(previousIdentities, newIdentities) { + createIdentityChanges: function(previousIdentities: UserIdentities, newIdentities: UserIdentities) { var identityChanges = []; var key; if ( @@ -154,7 +179,7 @@ export default function Identity(mpInstance) { }, // takes 2 UI objects keyed by name, combines them, returns them keyed by type - combineUserIdentities: function(previousUIByName, newUIByName) { + combineUserIdentities: function(previousUIByName: UserIdentities, newUIByName: UserIdentities) { var combinedUIByType = {}; var combinedUIByName = extend({}, previousUIByName, newUIByName); @@ -170,7 +195,7 @@ export default function Identity(mpInstance) { return combinedUIByType; }, - createAliasNetworkRequest: function(aliasRequest) { + createAliasNetworkRequest: function(aliasRequest: IAliasRequest) { return { request_id: mpInstance._Helpers.generateUniqueId(), request_type: 'alias', @@ -189,7 +214,7 @@ export default function Identity(mpInstance) { }; }, - convertAliasToNative: function(aliasRequest) { + convertAliasToNative: function(aliasRequest: IAliasRequest) { return { DestinationMpid: aliasRequest.destinationMpid, SourceMpid: aliasRequest.sourceMpid, @@ -199,7 +224,7 @@ export default function Identity(mpInstance) { }; }, - convertToNative: function(identityApiData) { + convertToNative: function(identityApiData: IdentityApiData) { var nativeIdentityRequest = []; if (identityApiData && identityApiData.userIdentities) { for (var key in identityApiData.userIdentities) { @@ -215,6 +240,7 @@ export default function Identity(mpInstance) { UserIdentities: nativeIdentityRequest, }; } + return undefined; }, }; /** @@ -230,7 +256,7 @@ export default function Identity(mpInstance) { * @param {Object} identityApiData The identityApiData object as indicated [here](https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/README.md#1-customize-the-sdk) * @param {Function} [callback] A callback function that is called when the identify request completes */ - identify: function(identityApiData, callback) { + identify: function(identityApiData: IdentityApiData, callback: IdentityCallback) { // https://go.mparticle.com/work/SQDSDKS-6337 var mpid, currentUser = mpInstance.Identity.getCurrentUser(), @@ -261,7 +287,7 @@ export default function Identity(mpInstance) { const successfullyCachedIdentity = tryCacheIdentity( identityApiRequest.known_identities, self.idCache, - self.parseIdentityResponse, + self.parseIdentityResponse as IParseCachedIdentityResponse, mpid, callback, identityApiData, @@ -315,7 +341,9 @@ export default function Identity(mpInstance) { HTTPCodes.validationIssue, preProcessResult.error ); - mpInstance.Logger.verbose(preProcessResult); + mpInstance.Logger.verbose( + preProcessResult.error ?? JSON.stringify(preProcessResult) + ); } }, /** @@ -324,7 +352,7 @@ export default function Identity(mpInstance) { * @param {Object} identityApiData The identityApiData object as indicated [here](https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/README.md#1-customize-the-sdk) * @param {Function} [callback] A callback function that is called when the logout request completes */ - logout: function(identityApiData, callback) { + logout: function(identityApiData: IdentityApiData, callback: IdentityCallback) { // https://go.mparticle.com/work/SQDSDKS-6337 var mpid, currentUser = mpInstance.Identity.getCurrentUser(), @@ -383,8 +411,9 @@ export default function Identity(mpInstance) { mpInstance._Store.activeForwarders.forEach(function( forwarder ) { - if (forwarder.logOut) { - forwarder.logOut(evt); + const fwd = forwarder as unknown as Record; + if (typeof fwd.logOut === 'function') { + fwd.logOut(evt); } }); } @@ -405,7 +434,9 @@ export default function Identity(mpInstance) { HTTPCodes.validationIssue, preProcessResult.error ); - mpInstance.Logger.verbose(preProcessResult); + mpInstance.Logger.verbose( + preProcessResult.error ?? JSON.stringify(preProcessResult) + ); } }, /** @@ -414,7 +445,7 @@ export default function Identity(mpInstance) { * @param {Object} identityApiData The identityApiData object as indicated [here](https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/README.md#1-customize-the-sdk) * @param {Function} [callback] A callback function that is called when the login request completes */ - login: function(identityApiData, callback) { + login: function(identityApiData: IdentityApiData, callback: IdentityCallback) { // https://go.mparticle.com/work/SQDSDKS-6337 var mpid, currentUser = mpInstance.Identity.getCurrentUser(), @@ -447,7 +478,7 @@ export default function Identity(mpInstance) { const successfullyCachedIdentity = tryCacheIdentity( identityApiRequest.known_identities, self.idCache, - self.parseIdentityResponse, + self.parseIdentityResponse as IParseCachedIdentityResponse, mpid, callback, identityApiData, @@ -501,7 +532,9 @@ export default function Identity(mpInstance) { HTTPCodes.validationIssue, preProcessResult.error ); - mpInstance.Logger.verbose(preProcessResult); + mpInstance.Logger.verbose( + preProcessResult.error ?? JSON.stringify(preProcessResult) + ); } }, /** @@ -510,7 +543,7 @@ export default function Identity(mpInstance) { * @param {Object} identityApiData The identityApiData object as indicated [here](https://github.com/mParticle/mparticle-sdk-javascript/blob/master-v2/README.md#1-customize-the-sdk) * @param {Function} [callback] A callback function that is called when the modify request completes */ - modify: function(identityApiData, callback) { + modify: function(identityApiData: IdentityApiData, callback: IdentityCallback) { // https://go.mparticle.com/work/SQDSDKS-6337 var mpid, currentUser = mpInstance.Identity.getCurrentUser(), @@ -560,8 +593,7 @@ export default function Identity(mpInstance) { callback, identityApiData, self.parseIdentityResponse, - mpid, - identityApiRequest.known_identities + mpid ); } } else { @@ -580,7 +612,9 @@ export default function Identity(mpInstance) { HTTPCodes.validationIssue, preProcessResult.error ); - mpInstance.Logger.verbose(preProcessResult); + mpInstance.Logger.verbose( + preProcessResult.error ?? JSON.stringify(preProcessResult) + ); } }, /** @@ -615,7 +649,7 @@ export default function Identity(mpInstance) { * @param {String} mpid of the desired user * @return {Object} the user for mpid */ - getUser: function(mpid) { + getUser: function(mpid: MPID) { var persistence = mpInstance._Persistence.getPersistence(); if (persistence) { if ( @@ -664,7 +698,7 @@ export default function Identity(mpInstance) { * @param {Object} aliasRequest object representing an AliasRequest * @param {Function} [callback] A callback function that is called when the aliasUsers request completes */ - aliasUsers: function(aliasRequest, callback) { + aliasUsers: function(aliasRequest: IAliasRequest, callback: IAliasCallback) { var message; if (!aliasRequest.destinationMpid || !aliasRequest.sourceMpid) { message = Messages.ValidationMessages.AliasMissingMpid; @@ -712,7 +746,7 @@ export default function Identity(mpInstance) { ); var aliasRequestMessage = mpInstance._Identity.IdentityRequest.createAliasNetworkRequest( aliasRequest - ); + ) as IAliasRequest; mpInstance._IdentityAPIClient.sendAliasRequest( aliasRequestMessage, callback @@ -745,7 +779,7 @@ export default function Identity(mpInstance) { after applying this adjustment it will be impossible to create an aliasRequest passes the aliasUsers() validation that the startTime must be less than the endTime */ - createAliasRequest: function(sourceUser, destinationUser, scope) { + createAliasRequest: function(sourceUser: IMParticleUser, destinationUser: IMParticleUser, scope: AliasRequestScope) { try { if (!destinationUser || !sourceUser) { mpInstance.Logger.error( @@ -806,7 +840,7 @@ export default function Identity(mpInstance) { * Example: mParticle.Identity.getCurrentUser().getAllUserAttributes() * @class mParticle.Identity.getCurrentUser() */ - this.mParticleUser = function(mpid, isLoggedIn) { + this.mParticleUser = function(mpid?: MPID, isLoggedIn?: boolean): IMParticleUser { var self = this; return { /** @@ -845,7 +879,7 @@ export default function Identity(mpInstance) { * @method setUserTag * @param {String} tagName */ - setUserTag: function(tagName) { + setUserTag: function(tagName: string) { if (!mpInstance._Helpers.Validators.isValidKeyValue(tagName)) { mpInstance.Logger.error(Messages.ErrorMessages.BadKey); return; @@ -858,7 +892,7 @@ export default function Identity(mpInstance) { * @method removeUserTag * @param {String} tagName */ - removeUserTag: function(tagName) { + removeUserTag: function(tagName: string) { if (!mpInstance._Helpers.Validators.isValidKeyValue(tagName)) { mpInstance.Logger.error(Messages.ErrorMessages.BadKey); return; @@ -874,7 +908,7 @@ export default function Identity(mpInstance) { */ // https://go.mparticle.com/work/SQDSDKS-4576 // https://go.mparticle.com/work/SQDSDKS-6373 - setUserAttribute: function(key, newValue) { + setUserAttribute: function(key: string, newValue: string) { mpInstance._SessionManager.resetSessionTimer(); if (mpInstance._Helpers.canLog()) { @@ -950,7 +984,7 @@ export default function Identity(mpInstance) { * @param {Object} user attribute object with keys of the attribute type, and value of the attribute value */ // https://go.mparticle.com/work/SQDSDKS-6373 - setUserAttributes: function(userAttributes) { + setUserAttributes: function(userAttributes: Record) { mpInstance._SessionManager.resetSessionTimer(); if (isObject(userAttributes)) { if (mpInstance._Helpers.canLog()) { @@ -972,7 +1006,7 @@ export default function Identity(mpInstance) { * @method removeUserAttribute * @param {String} key */ - removeUserAttribute: function(key) { + removeUserAttribute: function(key: string) { var cookies, userAttributes; mpInstance._SessionManager.resetSessionTimer(); @@ -1038,7 +1072,7 @@ export default function Identity(mpInstance) { * @param {Array} value an array of values */ // https://go.mparticle.com/work/SQDSDKS-6373 - setUserAttributeList: function(key, newValue) { + setUserAttributeList: function(key: string, newValue: UserAttributesValue[]) { mpInstance._SessionManager.resetSessionTimer(); if (!mpInstance._Helpers.Validators.isValidKeyValue(key)) { @@ -1049,7 +1083,7 @@ export default function Identity(mpInstance) { if (!Array.isArray(newValue)) { mpInstance.Logger.error( 'The value you passed in to setUserAttributeList must be an array. You passed in a ' + - typeof value + typeof newValue ); return; } @@ -1108,7 +1142,7 @@ export default function Identity(mpInstance) { if (userAttributeChange) { self.sendUserAttributeChangeEvent( key, - newValue, + newValue as unknown as string[], previousUserAttributeValue, isNewAttribute, false, @@ -1195,12 +1229,11 @@ export default function Identity(mpInstance) { if (userAttributes) { for (const prop in userAttributes) { if (userAttributes.hasOwnProperty(prop)) { - if (Array.isArray(userAttributes[prop])) { - userAttributesCopy[prop] = userAttributes[ - prop - ].slice(); + const attrValue = userAttributes[prop]; + if (Array.isArray(attrValue)) { + userAttributesCopy[prop] = attrValue.slice(); } else { - userAttributesCopy[prop] = userAttributes[prop]; + userAttributesCopy[prop] = attrValue; } } } @@ -1233,7 +1266,7 @@ export default function Identity(mpInstance) { * @method setConsentState * @param {Object} consent state */ - setConsentState: function(state) { + setConsentState: function(state: ConsentState) { mpInstance._Store.setConsentState(mpid, state); mpInstance._Forwarders.initForwarders( this.getUserIdentities().userIdentities, @@ -1256,7 +1289,7 @@ export default function Identity(mpInstance) { * @param {Function} [callback] A callback function that is invoked when the user audience request completes */ // https://go.mparticle.com/work/SQDSDKS-6436 - getUserAudiences: function(callback) { + getUserAudiences: function(callback: IdentityCallback) { // user audience API is feature flagged if ( !mpInstance._Helpers.getFeatureFlag( @@ -1272,12 +1305,14 @@ export default function Identity(mpInstance) { self.audienceManager = new AudienceManager( mpInstance._Store.SDKConfig.userAudienceUrl, mpInstance._Store.devToken, - mpInstance.Logger, - mpid + mpInstance.Logger ); } - self.audienceManager.sendGetUserAudienceRequest(mpid, callback); + self.audienceManager.sendGetUserAudienceRequest( + mpid, + callback as unknown as (userAudiences: IAudienceMemberships) => void + ); }, }; }; @@ -1288,7 +1323,7 @@ export default function Identity(mpInstance) { * @class mParticle.Identity.getCurrentUser().getCart() * @deprecated */ - this.mParticleUserCart = function() { + this.mParticleUserCart = function(): mParticleUserCart { return { /** * Adds a cart product to the user cart @@ -1357,14 +1392,14 @@ export default function Identity(mpInstance) { // https://go.mparticle.com/work/SQDSDKS-6355 this.parseIdentityResponse = function( - identityResponse, - previousMPID, - callback, - identityApiData, - method, - knownIdentities, - parsingCachedResponse - ) { + identityResponse: IIdentityResponse, + previousMPID: MPID, + callback: IdentityCallback, + identityApiData: IdentityApiData, + method: IdentityAPIMethod, + knownIdentities: IKnownIdentities | UserIdentities, + parsingCachedResponse: boolean + ): void { const prevUser = mpInstance.Identity.getUser(previousMPID); const prevUserMPID = prevUser ? prevUser.getMPID() : null; const previousUIByName = prevUser @@ -1587,11 +1622,11 @@ export default function Identity(mpInstance) { // compare what identities exist vs what is previously was for the specific user if they were in memory before. // if it's the first time the user is logging in, send a user identity change request with this.sendUserIdentityChangeEvent = function( - newUserIdentities, - method, - mpid, - prevUserIdentities - ) { + newUserIdentities: UserIdentities, + method: IdentityAPIMethod, + mpid: MPID, + prevUserIdentities: UserIdentities + ): void { if (!mpid) { // https://go.mparticle.com/work/SQDSDKS-6501 if (method !== Modify) { @@ -1620,18 +1655,18 @@ export default function Identity(mpInstance) { currentUserInMemory ); mpInstance._APIClient?.sendEventToServer( - userIdentityChangeEvent + userIdentityChangeEvent as unknown as SDKEvent ); } } }; this.createUserIdentityChange = function( - identityType, - newIdentity, - oldIdentity, - isIdentityTypeNewToBatch, - userInMemory + identityType: string, + newIdentity: string, + oldIdentity: string, + isIdentityTypeNewToBatch: boolean, + userInMemory: IMParticleUser ) { var userIdentityChangeEvent; @@ -1651,19 +1686,19 @@ export default function Identity(mpInstance) { }, }, userInMemory, - }); + } as BaseEvent); return userIdentityChangeEvent; }; this.sendUserAttributeChangeEvent = function( - attributeKey, - newUserAttributeValue, - previousUserAttributeValue, - isNewAttribute, - deleted, - user - ) { + attributeKey: string, + newUserAttributeValue: string | string[] | null, + previousUserAttributeValue: string | string[] | null, + isNewAttribute: boolean, + deleted: boolean, + user: IMParticleUser + ): void { var userAttributeChangeEvent = self.createUserAttributeChange( attributeKey, newUserAttributeValue, @@ -1673,17 +1708,17 @@ export default function Identity(mpInstance) { user ); if (userAttributeChangeEvent) { - mpInstance._APIClient?.sendEventToServer(userAttributeChangeEvent); + mpInstance._APIClient?.sendEventToServer(userAttributeChangeEvent as unknown as SDKEvent); } }; this.createUserAttributeChange = function( - key, - newValue, - previousUserAttributeValue, - isNewAttribute, - deleted, - user + key: string, + newValue: string | string[] | null, + previousUserAttributeValue: string | string[] | null, + isNewAttribute: boolean, + deleted: boolean, + user: IMParticleUser ) { if (typeof previousUserAttributeValue === 'undefined') { previousUserAttributeValue = null; @@ -1696,8 +1731,8 @@ export default function Identity(mpInstance) { messageType: Types.MessageType.UserAttributeChange, userAttributeChanges: { UserAttributeName: key, - New: newValue, - Old: previousUserAttributeValue, + New: newValue as string, + Old: previousUserAttributeValue as string, Deleted: deleted, IsNewAttribute: isNewAttribute, }, @@ -1708,7 +1743,7 @@ export default function Identity(mpInstance) { return userAttributeChangeEvent; }; - this.reinitForwardersOnUserChange = function(prevUser, newUser) { + this.reinitForwardersOnUserChange = function(prevUser: IMParticleUser, newUser: IMParticleUser): void { if (hasMPIDAndUserLoginChanged(prevUser, newUser)) { mpInstance._Forwarders?.initForwarders( newUser.getUserIdentities().userIdentities, @@ -1717,7 +1752,7 @@ export default function Identity(mpInstance) { } }; - this.setForwarderCallbacks = function(user, method) { + this.setForwarderCallbacks = function(user: IMParticleUser, method: IdentityAPIMethod): void { // https://go.mparticle.com/work/SQDSDKS-6036 mpInstance._Forwarders?.setForwarderUserIdentities( user.getUserIdentities().userIdentities @@ -1727,8 +1762,18 @@ export default function Identity(mpInstance) { }; } +interface IdentityApiDataWithAlias extends IdentityApiData { + /** @deprecated */ + onUserAlias?: (previousUser: IMParticleUser, newUser: IMParticleUser) => void; +} + // https://go.mparticle.com/work/SQDSDKS-6359 -function tryOnUserAlias(previousUser, newUser, identityApiData, logger) { +function tryOnUserAlias( + previousUser: IMParticleUser, + newUser: IMParticleUser, + identityApiData: IdentityApiDataWithAlias, + logger: SDKLoggerApi +): void { if ( identityApiData && identityApiData.onUserAlias && diff --git a/src/identityApiClient.ts b/src/identityApiClient.ts index c26b9bade..19d280dad 100644 --- a/src/identityApiClient.ts +++ b/src/identityApiClient.ts @@ -13,6 +13,7 @@ import { IdentityAPIMethod, IIdentity, IIdentityAPIRequestData, + IIdentityAPIModifyRequestData, } from './identity.interfaces'; import { IdentityApiData, @@ -37,13 +38,13 @@ export interface IIdentityApiClient { aliasCallback: IAliasCallback ) => Promise; sendIdentityRequest: ( - identityApiRequest: IIdentityAPIRequestData, + identityApiRequest: IIdentityAPIRequestData | IIdentityAPIModifyRequestData, method: IdentityAPIMethod, callback: IdentityCallback, originalIdentityApiData: IdentityApiData, parseIdentityResponse: IIdentity['parseIdentityResponse'], mpid: MPID, - knownIdentities: UserIdentities + knownIdentities?: UserIdentities ) => Promise; getUploadUrl: (method: IdentityAPIMethod, mpid: MPID) => string; getIdentityResponseFromFetch: ( @@ -186,13 +187,13 @@ export default function IdentityAPIClient( }; this.sendIdentityRequest = async function( - identityApiRequest: IIdentityAPIRequestData, + identityApiRequest: IIdentityAPIRequestData | IIdentityAPIModifyRequestData, method: IdentityAPIMethod, callback: IdentityCallback, originalIdentityApiData: IdentityApiData, parseIdentityResponse: IIdentity['parseIdentityResponse'], mpid: MPID, - knownIdentities: UserIdentities + knownIdentities?: UserIdentities ) { if (mpInstance._RoktManager?.isInitialized) { mpInstance._Store.identifyRequestCount = (mpInstance._Store.identifyRequestCount || 0) + 1; diff --git a/src/mp-instance.ts b/src/mp-instance.ts index 7cd1dd6ab..fd973bcf6 100644 --- a/src/mp-instance.ts +++ b/src/mp-instance.ts @@ -35,7 +35,7 @@ import Identity from './identity'; import Consent, { IConsent } from './consent'; import KitBlocker from './kitBlocking'; import ConfigAPIClient, { IKitConfigs } from './configAPIClient'; -import IdentityAPIClient from './identityApiClient'; +import IdentityAPIClient, { IIdentityApiClient } from './identityApiClient'; import { isFunction, parseConfig, valueof, generateDeprecationMessage, extend } from './utils'; import { DisabledVault, LocalStorageVault } from './vault'; import { removeExpiredIdentityCacheDates, hasExplicitIdentifier } from './identity-utils'; @@ -82,7 +82,7 @@ export interface IMParticleWebSDKInstance extends MParticleWebSDK { _ForwardingStatsUploader: ForwardingStatsUploader; _Helpers: SDKHelpersApi; _Identity: IIdentity; - _IdentityAPIClient: typeof IdentityAPIClient; + _IdentityAPIClient: IIdentityApiClient; _IntegrationCapture: IntegrationCapture; _NativeSdkHelpers: INativeSdkHelpers; _Persistence: IPersistence; diff --git a/src/persistence.interfaces.ts b/src/persistence.interfaces.ts index 639de8a3e..4cc7c9bc1 100644 --- a/src/persistence.interfaces.ts +++ b/src/persistence.interfaces.ts @@ -118,12 +118,12 @@ export interface IPersistence { getCookieDomain(): string; getDomain(doc: string, locationHostname: string): string; saveUserCookieSyncDatesToPersistence(mpid: MPID, csd: CookieSyncDates): void; - savePersistence(persistance: IPersistenceMinified): void; + savePersistence(persistance: IPersistenceMinified, mpid?: MPID): void; getPersistence(): IPersistenceMinified; - getFirstSeenTime(mpid: MPID): string | null; - setFirstSeenTime(mpid: MPID, time: number): void; + getFirstSeenTime(mpid: MPID): number | null; + setFirstSeenTime(mpid: MPID, time?: number): void; getLastSeenTime(mpid: MPID): number | null; - setLastSeenTime(mpid: MPID, time: number): void; + setLastSeenTime(mpid: MPID, time?: number): void; getDeviceId(): string; setDeviceId(guid: string): void; resetPersistence(): void; diff --git a/src/store.ts b/src/store.ts index fe4fe30d7..ba43cc0f8 100644 --- a/src/store.ts +++ b/src/store.ts @@ -156,6 +156,7 @@ export interface IFeatureFlags { export interface IStore { isEnabled: boolean; isInitialized: boolean; + mpid: MPID; // Session Attributes are persistent attributes that are tied to the current session and // are uploaded then cleared when the session ends. diff --git a/test/jest/identity.spec.ts b/test/jest/identity.spec.ts index 22c799e33..1ca1aa9fa 100644 --- a/test/jest/identity.spec.ts +++ b/test/jest/identity.spec.ts @@ -17,6 +17,7 @@ import { import { hasExplicitIdentifier } from '../../src/identity-utils'; import { IStore } from '../../src/store'; import { MessageType } from '../../src/types'; +import { Context } from '@mparticle/event-models'; describe('Identity', () => { describe('#types', () => { @@ -122,10 +123,10 @@ describe('Identity', () => { sdk_vendor: 'mparticle', sdk_version: '1.0.0', }, - context: 'test-context', + context: 'test-context' as unknown as Context, environment: 'development', request_id: '123', - request_timestamp_unixtime_ms: Date.now(), + request_timestamp_ms: Date.now(), previous_mpid: null, known_identities: { email: 'user@mparticle.com', @@ -142,10 +143,10 @@ describe('Identity', () => { sdk_vendor: 'mparticle', sdk_version: '1.0.0', }, - context: 'test-context', + context: 'test-context' as unknown as Context, environment: 'development', request_id: '123', - request_timestamp_unixtime_ms: Date.now(), + request_timestamp_ms: Date.now(), identity_changes: [ { identity_type: SDKIdentityTypeEnum.google, diff --git a/test/src/tests-identity.ts b/test/src/tests-identity.ts index 0d023b0c1..bacce91d9 100644 --- a/test/src/tests-identity.ts +++ b/test/src/tests-identity.ts @@ -15,6 +15,7 @@ import { IdentityApiData, UserIdentities, } from '@mparticle/web-sdk'; +import { Context } from '@mparticle/event-models'; import { IdentityCache } from '../../src/identity-utils'; import { IAliasRequest, @@ -1597,7 +1598,7 @@ describe('identity', function() { 'test-platform', 'test-sdk-vendor', 'test-sdk-version', - 'test-context' + 'test-context' as unknown as Context ); expect(identityRequest.identity_changes[0]).to.have.all.keys([ @@ -1648,7 +1649,7 @@ describe('identity', function() { 'test-platform', 'test-sdk-vendor', 'test-sdk-version', - 'test-context' + 'test-context' as unknown as Context ); expect(identityRequest.identity_changes[0]).to.have.all.keys([ diff --git a/test/src/tests-identityApiClient.ts b/test/src/tests-identityApiClient.ts index 0f3142af2..1b3f296d6 100644 --- a/test/src/tests-identityApiClient.ts +++ b/test/src/tests-identityApiClient.ts @@ -6,6 +6,7 @@ import { IAliasRequest, IIdentityAPIRequestData, } from '../../src/identity.interfaces'; +import { Context } from '@mparticle/event-models'; import Constants, { HTTP_ACCEPTED, HTTP_BAD_REQUEST, @@ -42,10 +43,10 @@ describe('Identity Api Client', () => { sdk_vendor: 'mparticle', sdk_version: '1.0.0', }, - context: 'test-context', + context: 'test-context' as unknown as Context, environment: 'development', request_id: '123', - request_timestamp_unixtime_ms: Date.now(), + request_timestamp_ms: Date.now(), previous_mpid: null, known_identities: { email: 'user@mparticle.com',