From 2578b9a30aa4d54cf82631fa4a6ef5171c87eb3a Mon Sep 17 00:00:00 2001 From: Robert Ing Date: Thu, 21 May 2026 20:38:31 -0400 Subject: [PATCH 1/4] feat: Report deprecated method usage through logging dispatcher (#1270) --- src/consent.ts | 10 ++- src/identity.js | 110 +++++++++++++++++------- src/mp-instance.ts | 86 ++++++++++++------ src/reporting/deprecatedMethodLogger.ts | 19 ++++ src/reporting/types.ts | 1 + src/sessionManager.ts | 18 ++-- test/jest/reportingLogger.spec.ts | 41 +++++++++ 7 files changed, 216 insertions(+), 69 deletions(-) create mode 100644 src/reporting/deprecatedMethodLogger.ts diff --git a/src/consent.ts b/src/consent.ts index 81ae944cd..bcf1f6258 100644 --- a/src/consent.ts +++ b/src/consent.ts @@ -9,6 +9,7 @@ import KitFilterHelper from './kitFilterHelper'; import Constants from './constants'; import { IMParticleUser } from './identity-user-interfaces'; import { IMParticleWebSDKInstance } from './mp-instance'; +import { logDeprecatedMethodUsage } from './reporting/deprecatedMethodLogger'; const { CCPAPurpose } = Constants; @@ -505,8 +506,13 @@ export default function Consent(this: IConsent, mpInstance: IMParticleWebSDKInst // TODO: Can we remove this? It is deprecated. function removeCCPAState(this: ConsentState) { - mpInstance.Logger.warning( - 'removeCCPAState is deprecated and will be removed in a future release; use removeCCPAConsentState instead' + logDeprecatedMethodUsage( + { + methodName: 'Consent.removeCCPAState', + warningMessage: 'removeCCPAState is deprecated and will be removed in a future release; use removeCCPAConsentState instead', + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); // @ts-ignore return removeCCPAConsentState(); diff --git a/src/identity.js b/src/identity.js index 29c9dacb9..c9e5dbe4d 100644 --- a/src/identity.js +++ b/src/identity.js @@ -20,6 +20,7 @@ import { } from './utils'; import { hasMPIDAndUserLoginChanged, hasMPIDChanged } from './user-utils'; import { processReadyQueue } from './pre-init-utils'; +import { logDeprecatedMethodUsage } from './reporting/deprecatedMethodLogger'; export default function Identity(mpInstance) { const { getFeatureFlag, extend } = mpInstance._Helpers; @@ -1252,8 +1253,14 @@ export default function Identity(mpInstance) { * @return a cart object */ getCart: function() { - mpInstance.Logger.warning( - 'Deprecated function Identity.getCurrentUser().getCart() will be removed in future releases' + logDeprecatedMethodUsage( + { + methodName: 'Identity.getCurrentUser().getCart()', + warningMessage: + 'Deprecated function Identity.getCurrentUser().getCart() will be removed in future releases', + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); return self.mParticleUserCart(); }, @@ -1334,13 +1341,18 @@ export default function Identity(mpInstance) { * @deprecated */ add: function() { - mpInstance.Logger.warning( - generateDeprecationMessage( - 'Identity.getCurrentUser().getCart().add()', - true, - 'eCommerce.logProductAction()', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: 'Identity.getCurrentUser().getCart().add()', + warningMessage: generateDeprecationMessage( + 'Identity.getCurrentUser().getCart().add()', + true, + 'eCommerce.logProductAction()', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); }, /** @@ -1349,13 +1361,19 @@ export default function Identity(mpInstance) { * @deprecated */ remove: function() { - mpInstance.Logger.warning( - generateDeprecationMessage( - 'Identity.getCurrentUser().getCart().remove()', - true, - 'eCommerce.logProductAction()', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: + 'Identity.getCurrentUser().getCart().remove()', + warningMessage: generateDeprecationMessage( + 'Identity.getCurrentUser().getCart().remove()', + true, + 'eCommerce.logProductAction()', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); }, /** @@ -1364,13 +1382,19 @@ export default function Identity(mpInstance) { * @deprecated */ clear: function() { - mpInstance.Logger.warning( - generateDeprecationMessage( - 'Identity.getCurrentUser().getCart().clear()', - true, - '', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: + 'Identity.getCurrentUser().getCart().clear()', + warningMessage: generateDeprecationMessage( + 'Identity.getCurrentUser().getCart().clear()', + true, + '', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); }, /** @@ -1380,13 +1404,19 @@ export default function Identity(mpInstance) { * @deprecated */ getCartProducts: function() { - mpInstance.Logger.warning( - generateDeprecationMessage( - 'Identity.getCurrentUser().getCart().getCartProducts()', - true, - 'eCommerce.logProductAction()', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: + 'Identity.getCurrentUser().getCart().getCartProducts()', + warningMessage: generateDeprecationMessage( + 'Identity.getCurrentUser().getCart().getCartProducts()', + true, + 'eCommerce.logProductAction()', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); return []; }, @@ -1540,7 +1570,8 @@ export default function Identity(mpInstance) { prevUser, newUser, identityApiData, - mpInstance.Logger + mpInstance.Logger, + mpInstance._LoggingDispatcher ); const persistence = mpInstance._Persistence.getPersistence(); @@ -1775,14 +1806,27 @@ export default function Identity(mpInstance) { } // https://go.mparticle.com/work/SQDSDKS-6359 -function tryOnUserAlias(previousUser, newUser, identityApiData, logger) { +function tryOnUserAlias( + previousUser, + newUser, + identityApiData, + logger, + loggingDispatcher +) { if ( identityApiData && identityApiData.onUserAlias && isFunction(identityApiData.onUserAlias) ) { try { - logger.warning(generateDeprecationMessage('onUserAlias')); + logDeprecatedMethodUsage( + { + methodName: 'onUserAlias', + warningMessage: generateDeprecationMessage('onUserAlias'), + }, + logger, + loggingDispatcher + ); identityApiData.onUserAlias(previousUser, newUser); } catch (e) { logger.error( diff --git a/src/mp-instance.ts b/src/mp-instance.ts index 618b19ab3..4b9078573 100644 --- a/src/mp-instance.ts +++ b/src/mp-instance.ts @@ -55,6 +55,7 @@ import CookieConsentManager, { ICookieConsentManager } from './cookieConsentMana import { ErrorReportingDispatcher } from './reporting/errorReportingDispatcher'; import { LoggingDispatcher } from './reporting/loggingDispatcher'; import { IErrorReportingService, ILoggingService } from './reporting/types'; +import { logDeprecatedMethodUsage } from './reporting/deprecatedMethodLogger'; export interface IErrorLogMessage { message?: string; @@ -772,13 +773,18 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan * @deprecated */ add: function(product, logEventBoolean) { - self.Logger.warning( - generateDeprecationMessage( - 'eCommerce.Cart.add()', - true, - 'eCommerce.logProductAction()', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: 'mPInstance.eCommerce.Cart.add()', + warningMessage: generateDeprecationMessage( + 'eCommerce.Cart.add()', + true, + 'eCommerce.logProductAction()', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + self.Logger, + self._LoggingDispatcher ); }, /** @@ -789,13 +795,18 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan * @deprecated */ remove: function(product, logEventBoolean) { - self.Logger.warning( - generateDeprecationMessage( - 'eCommerce.Cart.remove()', - true, - 'eCommerce.logProductAction()', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: 'mPInstance.eCommerce.Cart.remove()', + warningMessage: generateDeprecationMessage( + 'eCommerce.Cart.remove()', + true, + 'eCommerce.logProductAction()', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + self.Logger, + self._LoggingDispatcher ); }, /** @@ -804,13 +815,18 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan * @deprecated */ clear: function() { - self.Logger.warning( - generateDeprecationMessage( - 'eCommerce.Cart.clear()', - true, - '', - 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' - ) + logDeprecatedMethodUsage( + { + methodName: 'mPInstance.eCommerce.Cart.clear()', + warningMessage: generateDeprecationMessage( + 'eCommerce.Cart.clear()', + true, + '', + 'https://docs.mparticle.com/developers/sdk/web/commerce-tracking' + ), + }, + self.Logger, + self._LoggingDispatcher ); }, }, @@ -940,8 +956,13 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan * @deprecated */ logCheckout: function(step, option, attrs, customFlags) { - self.Logger.warning( - 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead' + logDeprecatedMethodUsage( + { + methodName: 'mParticle.logCheckout', + warningMessage: 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead', + }, + self.Logger, + self._LoggingDispatcher ); if (!self._Store.isInitialized) { @@ -1020,8 +1041,13 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan attrs, customFlags ) { - self.Logger.warning( - 'mParticle.logPurchase is deprecated, please use mParticle.logProductAction instead' + logDeprecatedMethodUsage( + { + methodName: 'mParticle.logPurchase', + warningMessage: 'mParticle.logPurchase is deprecated, please use mParticle.logProductAction instead', + }, + self.Logger, + self._LoggingDispatcher ); if (!self._Store.isInitialized) { self.ready(function() { @@ -1132,8 +1158,13 @@ export default function mParticleInstance(this: IMParticleWebSDKInstance, instan attrs, customFlags ) { - self.Logger.warning( - 'mParticle.logRefund is deprecated, please use mParticle.logProductAction instead' + logDeprecatedMethodUsage( + { + methodName: 'mParticle.logRefund', + warningMessage: 'mParticle.logRefund is deprecated, please use mParticle.logProductAction instead', + }, + self.Logger, + self._LoggingDispatcher ); if (!self._Store.isInitialized) { self.ready(function() { @@ -1741,4 +1772,3 @@ function queueIfNotInitialized(func, self) { }); return true; } - diff --git a/src/reporting/deprecatedMethodLogger.ts b/src/reporting/deprecatedMethodLogger.ts new file mode 100644 index 000000000..33a9b55ed --- /dev/null +++ b/src/reporting/deprecatedMethodLogger.ts @@ -0,0 +1,19 @@ +import { ErrorCodes, ILoggingService } from './types'; +import { SDKLoggerApi } from '../sdkRuntimeModels'; + +interface DeprecatedMethodUsage { + methodName: string; + warningMessage: string; +} + +export function logDeprecatedMethodUsage( + usage: DeprecatedMethodUsage, + logger: Pick, + loggingDispatcher: ILoggingService | undefined +): void { + logger.warning(usage.warningMessage); + loggingDispatcher?.log({ + message: usage.methodName, + code: ErrorCodes.MP_DEPRECATED_METHOD_USAGE, + }); +} diff --git a/src/reporting/types.ts b/src/reporting/types.ts index 7378ca8f0..ba06ef73d 100644 --- a/src/reporting/types.ts +++ b/src/reporting/types.ts @@ -6,6 +6,7 @@ export const ErrorCodes = { IDENTITY_REQUEST: 'IDENTITY_REQUEST', IDENTITY_MISMATCH: 'IDENTITY_MISMATCH', ROKT_KIT_ATTACHED: 'ROKT_KIT_ATTACHED', + MP_DEPRECATED_METHOD_USAGE: 'MP_DEPRECATED_METHOD_USAGE', } as const; export type ErrorCodes = valueof; diff --git a/src/sessionManager.ts b/src/sessionManager.ts index 4b6cf68a4..418c4507e 100644 --- a/src/sessionManager.ts +++ b/src/sessionManager.ts @@ -6,6 +6,7 @@ import { generateDeprecationMessage } from './utils'; import { IMParticleUser } from './identity-user-interfaces'; import { IMParticleWebSDKInstance } from './mp-instance'; import { hasIdentityRequestChanged, hasExplicitIdentifier } from './identity-utils'; +import { logDeprecatedMethodUsage } from './reporting/deprecatedMethodLogger'; const { Messages } = Constants; @@ -67,12 +68,17 @@ export default function SessionManager( }; this.getSession = function (): string { - mpInstance.Logger.warning( - generateDeprecationMessage( - 'SessionManager.getSession()', - false, - 'SessionManager.getSessionId()' - ) + logDeprecatedMethodUsage( + { + methodName: 'SessionManager.getSession()', + warningMessage: generateDeprecationMessage( + 'SessionManager.getSession()', + false, + 'SessionManager.getSessionId()' + ), + }, + mpInstance.Logger, + mpInstance._LoggingDispatcher ); return this.getSessionId(); }; diff --git a/test/jest/reportingLogger.spec.ts b/test/jest/reportingLogger.spec.ts index 82ee5204d..ca4e1d700 100644 --- a/test/jest/reportingLogger.spec.ts +++ b/test/jest/reportingLogger.spec.ts @@ -1,6 +1,7 @@ import { ErrorReportingDispatcher } from '../../src/reporting/errorReportingDispatcher'; import { LoggingDispatcher } from '../../src/reporting/loggingDispatcher'; import { IErrorReportingService, ILoggingService, ISDKError, ISDKLogEntry, WSDKErrorSeverity, ErrorCodes } from '../../src/reporting/types'; +import { logDeprecatedMethodUsage } from '../../src/reporting/deprecatedMethodLogger'; describe('ErrorReportingDispatcher', () => { let dispatcher: ErrorReportingDispatcher; @@ -128,3 +129,43 @@ describe('LoggingDispatcher', () => { expect(service2.log).toHaveBeenCalledWith(entry); }); }); + +describe('logDeprecatedMethodUsage', () => { + it('keeps the console warning and emits structured usage details', () => { + const warning = jest.fn(); + const log = jest.fn(); + + logDeprecatedMethodUsage( + { + methodName: 'mParticle.logCheckout', + warningMessage: 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead', + }, + { warning }, + { log } + ); + + expect(warning).toHaveBeenCalledWith( + 'mParticle.logCheckout is deprecated, please use mParticle.logProductAction instead' + ); + expect(log).toHaveBeenCalledWith({ + message: 'mParticle.logCheckout', + code: ErrorCodes.MP_DEPRECATED_METHOD_USAGE, + }); + }); + + it('does not require a registered logging dispatcher', () => { + const warning = jest.fn(); + + expect(() => logDeprecatedMethodUsage( + { + methodName: 'onUserAlias', + warningMessage: 'onUserAlias is a deprecated method and will be removed in future releases.', + }, + { warning }, + undefined + )).not.toThrow(); + expect(warning).toHaveBeenCalledWith( + 'onUserAlias is a deprecated method and will be removed in future releases.' + ); + }); +}); From ecfbad79490d4e324d626bab1c221374f03e9ced Mon Sep 17 00:00:00 2001 From: Jaissica Date: Mon, 13 Apr 2026 22:04:37 -0400 Subject: [PATCH 2/4] refactor: update persistence module to TS --- src/persistence.interfaces.ts | 16 +- src/{persistence.js => persistence.ts} | 414 +++++++++++++------------ test/jest/persistence.spec.ts | 3 +- 3 files changed, 231 insertions(+), 202 deletions(-) rename src/{persistence.js => persistence.ts} (71%) diff --git a/src/persistence.interfaces.ts b/src/persistence.interfaces.ts index 639de8a3e..2278bd20c 100644 --- a/src/persistence.interfaces.ts +++ b/src/persistence.interfaces.ts @@ -99,7 +99,7 @@ export interface IPersistence { useLocalStorage(): boolean; initializeStorage(): void; update(): void; - storeDataInMemory(obj: IPersistenceMinified, currentMPID: MPID): void; + storeDataInMemory(obj: IPersistenceMinified, currentMPID?: MPID): void; determineLocalStorageAvailability(storage: Storage): boolean; setLocalStorage(): void; getLocalStorage(): IPersistenceMinified | null; @@ -113,17 +113,17 @@ export interface IPersistence { maxCookieSize: number ): string; findPrevCookiesBasedOnUI(identityApiData: IdentityApiData): void; - encodePersistence(persistence: IPersistenceMinified): string; - decodePersistence(persistenceString: string): string; + encodePersistence(persistence: string): string; + decodePersistence(persistenceString: string): string | null; getCookieDomain(): string; - getDomain(doc: string, locationHostname: string): string; + getDomain(doc: Document, locationHostname: string): string; saveUserCookieSyncDatesToPersistence(mpid: MPID, csd: CookieSyncDates): void; savePersistence(persistance: IPersistenceMinified): void; - getPersistence(): IPersistenceMinified; - getFirstSeenTime(mpid: MPID): string | null; - setFirstSeenTime(mpid: MPID, time: number): void; + getPersistence(): IPersistenceMinified | null; + 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/persistence.js b/src/persistence.ts similarity index 71% rename from src/persistence.js rename to src/persistence.ts index 949425837..366651e58 100644 --- a/src/persistence.js +++ b/src/persistence.ts @@ -1,36 +1,44 @@ import Constants from './constants'; import Polyfill from './polyfill'; import * as Utils from './utils'; +import { IMParticleWebSDKInstance } from './mp-instance'; +import { IPersistence, IPersistenceMinified, iForwardingStatsBatches } from './persistence.interfaces'; +import { MPID, IdentityApiData } from '@mparticle/web-sdk'; +import { CookieSyncDates } from './cookieSyncManager'; +import { Dictionary } from './utils'; -var Base64 = Polyfill.Base64, +const Base64 = Polyfill.Base64, Messages = Constants.Messages, Base64CookieKeys = Constants.Base64CookieKeys, SDKv2NonMPIDCookieKeys = Constants.SDKv2NonMPIDCookieKeys, StorageNames = Constants.StorageNames; -export default function _Persistence(mpInstance) { - var self = this; +export default function _Persistence( + this: IPersistence, + mpInstance: IMParticleWebSDKInstance +): void { + const self = this; // https://go.mparticle.com/work/SQDSDKS-5022 - this.useLocalStorage = function() { + this.useLocalStorage = function(): boolean { return ( !mpInstance._Store.SDKConfig.useCookieStorage && mpInstance._Store.isLocalStorageAvailable ); }; - this.initializeStorage = function() { + this.initializeStorage = function(): void { try { - var storage, + let storage: Storage, localStorageData = self.getLocalStorage(), cookies = self.getCookie(), - allData; + allData: IPersistenceMinified; // https://go.mparticle.com/work/SQDSDKS-6045 // Determine if there is any data in cookies or localStorage to figure out if it is the first time the browser is loading mParticle if (!localStorageData && !cookies) { mpInstance._Store.isFirstRun = true; - mpInstance._Store.mpid = 0; + (mpInstance._Store as Dictionary).mpid = 0; } else { mpInstance._Store.isFirstRun = false; } @@ -88,7 +96,7 @@ export default function _Persistence(mpInstance) { // https://go.mparticle.com/work/SQDSDKS-6046 // Stores all non-current user MPID information into the store - for (var key in allData) { + for (const key in allData) { if (allData.hasOwnProperty(key)) { if (!SDKv2NonMPIDCookieKeys[key]) { mpInstance._Store.nonCurrentUserMPIDs[key] = @@ -112,7 +120,7 @@ export default function _Persistence(mpInstance) { } }; - this.update = function() { + this.update = function(): void { if (!mpInstance._Store.webviewBridgeEnabled) { if (mpInstance._Store.SDKConfig.useCookieStorage) { self.setCookie(); @@ -123,7 +131,10 @@ export default function _Persistence(mpInstance) { }; // https://go.mparticle.com/work/SQDSDKS-6045 - this.storeDataInMemory = function(obj, currentMPID) { + this.storeDataInMemory = function( + obj: IPersistenceMinified, + currentMPID?: MPID + ): void { try { if (!obj) { mpInstance.Logger.verbose( @@ -138,12 +149,12 @@ export default function _Persistence(mpInstance) { } else { // Set MPID first, then change object to match MPID data if (currentMPID) { - mpInstance._Store.mpid = currentMPID; + (mpInstance._Store as Dictionary).mpid = currentMPID; } else { - mpInstance._Store.mpid = obj.cu || 0; + (mpInstance._Store as Dictionary).mpid = obj.cu || 0; } - obj.gs = obj.gs || {}; + obj.gs = obj.gs || ({} as IPersistenceMinified['gs']); mpInstance._Store.sessionId = obj.gs.sid || mpInstance._Store.sessionId; @@ -207,10 +218,12 @@ export default function _Persistence(mpInstance) { }; // https://go.mparticle.com/work/SQDSDKS-5022 - this.determineLocalStorageAvailability = function(storage) { - var result; + this.determineLocalStorageAvailability = function( + storage: Storage + ): boolean { + let result: boolean; - if (window.mParticle && window.mParticle._forceNoLocalStorage) { + if (window.mParticle && (window.mParticle as Dictionary)._forceNoLocalStorage) { storage = undefined; } @@ -218,14 +231,14 @@ export default function _Persistence(mpInstance) { storage.setItem('mparticle', 'test'); result = storage.getItem('mparticle') === 'test'; storage.removeItem('mparticle'); - return result && storage; + return result && !!storage; } catch (e) { return false; } }; // https://go.mparticle.com/work/SQDSDKS-6021 - this.setLocalStorage = function() { + this.setLocalStorage = function(): void { if (!mpInstance._Store.isLocalStorageAvailable) { return; } @@ -235,14 +248,14 @@ export default function _Persistence(mpInstance) { return; } - var key = mpInstance._Store.storageName, - localStorageData = self.getLocalStorage() || {}, - currentUser = mpInstance.Identity.getCurrentUser(), - mpid = currentUser ? currentUser.getMPID() : null; + const key = mpInstance._Store.storageName; + let localStorageData = self.getLocalStorage() || ({} as IPersistenceMinified); + const currentUser = mpInstance.Identity.getCurrentUser(); + const mpid = currentUser ? currentUser.getMPID() : null; if (!mpInstance._Store.SDKConfig.useCookieStorage) { - localStorageData.gs = localStorageData.gs || {}; + localStorageData.gs = localStorageData.gs || ({} as IPersistenceMinified['gs']); - localStorageData.l = mpInstance._Store.isLoggedIn ? 1 : 0; + (localStorageData as Dictionary).l = mpInstance._Store.isLoggedIn ? 1 : 0; if (mpInstance._Store.sessionId) { localStorageData.gs.csm = mpInstance._Store.currentSessionMPIDs; @@ -278,8 +291,10 @@ export default function _Persistence(mpInstance) { } }; - function setGlobalStorageAttributes(data) { - var store = mpInstance._Store; + function setGlobalStorageAttributes( + data: IPersistenceMinified + ): IPersistenceMinified { + const store = mpInstance._Store; data.gs.sid = store.sessionId; data.gs.ie = store.isEnabled; data.gs.sa = store.sessionAttributes; @@ -301,21 +316,20 @@ export default function _Persistence(mpInstance) { return data; } - this.getLocalStorage = function() { + this.getLocalStorage = function(): IPersistenceMinified | null { if (!mpInstance._Store.isLocalStorageAvailable) { return null; } - var key = mpInstance._Store.storageName, - localStorageData = self.decodePersistence( - window.localStorage.getItem(key) - ), - obj = {}, - j; + const key = mpInstance._Store.storageName; + const localStorageString = self.decodePersistence( + window.localStorage.getItem(key) + ); + const obj: Dictionary = {}; - if (localStorageData) { - localStorageData = JSON.parse(localStorageData); - for (j in localStorageData) { + if (localStorageString) { + const localStorageData = JSON.parse(localStorageString); + for (const j in localStorageData) { if (localStorageData.hasOwnProperty(j)) { obj[j] = localStorageData[j]; } @@ -323,21 +337,21 @@ export default function _Persistence(mpInstance) { } if (Object.keys(obj).length) { - return obj; + return obj as IPersistenceMinified; } return null; }; - function removeLocalStorage(localStorageName) { + function removeLocalStorage(localStorageName: string): void { localStorage.removeItem(localStorageName); } - this.expireCookies = function(cookieName) { - var date = new Date(), - expires, - domain, - cookieDomain; + this.expireCookies = function(cookieName: string): void { + const date = new Date(); + let expires: string; + let domain: string; + let cookieDomain: string; cookieDomain = self.getCookieDomain(); @@ -352,15 +366,15 @@ export default function _Persistence(mpInstance) { document.cookie = cookieName + '=' + '' + expires + '; path=/' + domain; }; - this.getCookie = function() { - var cookies, - key = mpInstance._Store.storageName, - i, - l, - parts, - name, - cookie, - result = key ? undefined : {}; + this.getCookie = function(): IPersistenceMinified | null { + let cookies: string[]; + const key = mpInstance._Store.storageName; + let i: number; + let l: number; + let parts: string[]; + let name: string; + let cookie: string; + let result: string | Dictionary = key ? undefined : {}; mpInstance.Logger.verbose(Messages.InformationMessages.CookieSearch); @@ -383,18 +397,18 @@ export default function _Persistence(mpInstance) { } if (key && key === name) { - result = mpInstance._Helpers.converted(cookie); + result = (mpInstance._Helpers as Dictionary).converted(cookie); break; } if (!key) { - result[name] = mpInstance._Helpers.converted(cookie); + result[name] = (mpInstance._Helpers as Dictionary).converted(cookie); } } if (result) { mpInstance.Logger.verbose(Messages.InformationMessages.CookieFound); - return JSON.parse(self.decodePersistence(result)); + return JSON.parse(self.decodePersistence(result as string)); } else { return null; } @@ -402,31 +416,31 @@ export default function _Persistence(mpInstance) { // https://go.mparticle.com/work/SQDSDKS-5022 // https://go.mparticle.com/work/SQDSDKS-6021 - this.setCookie = function() { + this.setCookie = function(): void { // Block mprtcl-v4 cookies when noFunctional is true if (mpInstance._CookieConsentManager?.getNoFunctional()) { return; } - var mpid, - currentUser = mpInstance.Identity.getCurrentUser(); + let mpid: MPID; + const currentUser = mpInstance.Identity.getCurrentUser(); if (currentUser) { mpid = currentUser.getMPID(); } - var date = new Date(), - key = mpInstance._Store.storageName, - cookies = self.getCookie() || {}, - expires = new Date( - date.getTime() + - mpInstance._Store.SDKConfig.cookieExpiration * - 24 * - 60 * - 60 * - 1000 - ).toGMTString(), - cookieDomain, - domain, - encodedCookiesWithExpirationAndPath; + const date = new Date(); + const key = mpInstance._Store.storageName; + let cookies = self.getCookie() || ({} as IPersistenceMinified); + const expires = new Date( + date.getTime() + + (mpInstance._Store.SDKConfig as Dictionary).cookieExpiration * + 24 * + 60 * + 60 * + 1000 + ).toUTCString(); + let cookieDomain: string; + let domain: string; + let encodedCookiesWithExpirationAndPath: string; cookieDomain = self.getCookieDomain(); @@ -436,7 +450,7 @@ export default function _Persistence(mpInstance) { domain = ';domain=' + cookieDomain; } - cookies.gs = cookies.gs || {}; + cookies.gs = cookies.gs || ({} as IPersistenceMinified['gs']); if (mpInstance._Store.sessionId) { cookies.gs.csm = mpInstance._Store.currentSessionMPIDs; @@ -446,7 +460,7 @@ export default function _Persistence(mpInstance) { cookies.cu = mpid; } - cookies.l = mpInstance._Store.isLoggedIn ? 1 : 0; + (cookies as Dictionary).l = mpInstance._Store.isLoggedIn ? 1 : 0; cookies = setGlobalStorageAttributes(cookies); @@ -485,16 +499,16 @@ export default function _Persistence(mpInstance) { stores MPIDs based on earliest login. */ this.reduceAndEncodePersistence = function( - persistence, - expires, - domain, - maxCookieSize - ) { - var encodedCookiesWithExpirationAndPath, - currentSessionMPIDs = persistence.gs.csm ? persistence.gs.csm : []; + persistence: IPersistenceMinified, + expires: string, + domain: string, + maxCookieSize: number + ): string { + let encodedCookiesWithExpirationAndPath: string; + const currentSessionMPIDs = persistence.gs.csm ? persistence.gs.csm : []; // Comment 1 above if (!currentSessionMPIDs.length) { - for (var key in persistence) { + for (const key in persistence) { if (persistence.hasOwnProperty(key)) { encodedCookiesWithExpirationAndPath = createFullEncodedCookie( persistence, @@ -516,8 +530,8 @@ export default function _Persistence(mpInstance) { } } else { // Comment 2 above - First create an object of all MPIDs on the cookie - var MPIDsOnCookie = {}; - for (var potentialMPID in persistence) { + const MPIDsOnCookie: Dictionary = {}; + for (const potentialMPID in persistence) { if (persistence.hasOwnProperty(potentialMPID)) { if ( !SDKv2NonMPIDCookieKeys[potentialMPID] && @@ -529,7 +543,7 @@ export default function _Persistence(mpInstance) { } // Comment 2a above if (Object.keys(MPIDsOnCookie).length) { - for (var mpid in MPIDsOnCookie) { + for (const mpid in MPIDsOnCookie) { encodedCookiesWithExpirationAndPath = createFullEncodedCookie( persistence, expires, @@ -548,7 +562,7 @@ export default function _Persistence(mpInstance) { } } // Comment 2b above - for (var i = 0; i < currentSessionMPIDs.length; i++) { + for (let i = 0; i < currentSessionMPIDs.length; i++) { encodedCookiesWithExpirationAndPath = createFullEncodedCookie( persistence, expires, @@ -557,13 +571,13 @@ export default function _Persistence(mpInstance) { if ( encodedCookiesWithExpirationAndPath.length > maxCookieSize ) { - var MPIDtoRemove = currentSessionMPIDs[i]; + const MPIDtoRemove = currentSessionMPIDs[i]; if (persistence[MPIDtoRemove]) { mpInstance.Logger.verbose( 'Size of new encoded cookie is larger than maxCookieSize setting of ' + maxCookieSize + '. Removing from cookie the earliest logged in MPID containing: ' + - JSON.stringify(persistence[MPIDtoRemove], 0, 2) + JSON.stringify(persistence[MPIDtoRemove], null, 2) ); delete persistence[MPIDtoRemove]; } else { @@ -582,7 +596,11 @@ export default function _Persistence(mpInstance) { return encodedCookiesWithExpirationAndPath; }; - function createFullEncodedCookie(persistence, expires, domain) { + function createFullEncodedCookie( + persistence: IPersistenceMinified, + expires: string, + domain: string + ): string { return ( self.encodePersistence(JSON.stringify(persistence)) + ';expires=' + @@ -592,19 +610,21 @@ export default function _Persistence(mpInstance) { ); } - this.findPrevCookiesBasedOnUI = function(identityApiData) { - var persistence = mpInstance._Persistence.getPersistence(); - var matchedUser; + this.findPrevCookiesBasedOnUI = function( + identityApiData: IdentityApiData + ): void { + const persistence = mpInstance._Persistence.getPersistence(); + let matchedUser: string; if (identityApiData) { - for (var requestedIdentityType in identityApiData.userIdentities) { + for (const requestedIdentityType in identityApiData.userIdentities) { if (persistence && Object.keys(persistence).length) { - for (var key in persistence) { + for (const key in persistence) { // any value in persistence that has an MPID key will be an MPID to search through // other keys on the cookie are currentSessionMPIDs and currentMPID which should not be searched if (persistence[key].mpid) { - var cookieUIs = persistence[key].ui; - for (var cookieUIType in cookieUIs) { + const cookieUIs = persistence[key].ui; + for (const cookieUIType in cookieUIs) { if ( requestedIdentityType === cookieUIType && identityApiData.userIdentities[ @@ -626,55 +646,55 @@ export default function _Persistence(mpInstance) { } }; - this.encodePersistence = function(persistence) { - persistence = JSON.parse(persistence); - for (var key in persistence.gs) { - if (persistence.gs.hasOwnProperty(key)) { + this.encodePersistence = function(persistence: string): string { + let parsed = JSON.parse(persistence); + for (const key in parsed.gs) { + if (parsed.gs.hasOwnProperty(key)) { if (Base64CookieKeys[key]) { - if (persistence.gs[key]) { + if (parsed.gs[key]) { // base64 encode any value that is an object or Array in globalSettings if ( - (Array.isArray(persistence.gs[key]) && - persistence.gs[key].length) || + (Array.isArray(parsed.gs[key]) && + parsed.gs[key].length) || (mpInstance._Helpers.isObject( - persistence.gs[key] + parsed.gs[key] ) && - Object.keys(persistence.gs[key]).length) + Object.keys(parsed.gs[key]).length) ) { - persistence.gs[key] = Base64.encode( - JSON.stringify(persistence.gs[key]) + parsed.gs[key] = Base64.encode( + JSON.stringify(parsed.gs[key]) ); } else { - delete persistence.gs[key]; + delete parsed.gs[key]; } } else { - delete persistence.gs[key]; + delete parsed.gs[key]; } } else if (key === 'ie') { - persistence.gs[key] = persistence.gs[key] ? 1 : 0; - } else if (!persistence.gs[key]) { - delete persistence.gs[key]; + parsed.gs[key] = parsed.gs[key] ? 1 : 0; + } else if (!parsed.gs[key]) { + delete parsed.gs[key]; } } } - for (var mpid in persistence) { - if (persistence.hasOwnProperty(mpid)) { + for (const mpid in parsed) { + if (parsed.hasOwnProperty(mpid)) { if (!SDKv2NonMPIDCookieKeys[mpid]) { - for (key in persistence[mpid]) { - if (persistence[mpid].hasOwnProperty(key)) { - if (Base64CookieKeys[key]) { + for (const innerKey in parsed[mpid]) { + if (parsed[mpid].hasOwnProperty(innerKey)) { + if (Base64CookieKeys[innerKey]) { if ( mpInstance._Helpers.isObject( - persistence[mpid][key] + parsed[mpid][innerKey] ) && - Object.keys(persistence[mpid][key]).length + Object.keys(parsed[mpid][innerKey]).length ) { - persistence[mpid][key] = Base64.encode( - JSON.stringify(persistence[mpid][key]) + parsed[mpid][innerKey] = Base64.encode( + JSON.stringify(parsed[mpid][innerKey]) ); } else { - delete persistence[mpid][key]; + delete parsed[mpid][innerKey]; } } } @@ -683,45 +703,45 @@ export default function _Persistence(mpInstance) { } } - return Utils.createCookieString(JSON.stringify(persistence)); + return Utils.createCookieString(JSON.stringify(parsed)); }; // TODO: This should actually be decodePersistenceString or // we should refactor this to take a string and return an object - this.decodePersistence = function(persistence) { + this.decodePersistence = function(persistence: string): string { try { if (persistence) { - persistence = JSON.parse(Utils.revertCookieString(persistence)); + let parsed = JSON.parse(Utils.revertCookieString(persistence)); if ( - mpInstance._Helpers.isObject(persistence) && - Object.keys(persistence).length + mpInstance._Helpers.isObject(parsed) && + Object.keys(parsed).length ) { - for (var key in persistence.gs) { - if (persistence.gs.hasOwnProperty(key)) { + for (const key in parsed.gs) { + if (parsed.gs.hasOwnProperty(key)) { if (Base64CookieKeys[key]) { - persistence.gs[key] = JSON.parse( - Base64.decode(persistence.gs[key]) + parsed.gs[key] = JSON.parse( + Base64.decode(parsed.gs[key]) ); } else if (key === 'ie') { - persistence.gs[key] = Boolean( - persistence.gs[key] + parsed.gs[key] = Boolean( + parsed.gs[key] ); } } } - for (var mpid in persistence) { - if (persistence.hasOwnProperty(mpid)) { + for (const mpid in parsed) { + if (parsed.hasOwnProperty(mpid)) { if (!SDKv2NonMPIDCookieKeys[mpid]) { - for (key in persistence[mpid]) { - if (persistence[mpid].hasOwnProperty(key)) { - if (Base64CookieKeys[key]) { - if (persistence[mpid][key].length) { - persistence[mpid][ - key + for (const innerKey in parsed[mpid]) { + if (parsed[mpid].hasOwnProperty(innerKey)) { + if (Base64CookieKeys[innerKey]) { + if (parsed[mpid][innerKey].length) { + parsed[mpid][ + innerKey ] = JSON.parse( Base64.decode( - persistence[mpid][key] + parsed[mpid][innerKey] ) ); } @@ -729,24 +749,25 @@ export default function _Persistence(mpInstance) { } } } else if (mpid === 'l') { - persistence[mpid] = Boolean(persistence[mpid]); + parsed[mpid] = Boolean(parsed[mpid]); } } } } - return JSON.stringify(persistence); + return JSON.stringify(parsed); } } catch (e) { - mpInstance.Logger.error('Problem with decoding cookie', e); + mpInstance.Logger.error('Problem with decoding cookie'); } + return null; }; - this.getCookieDomain = function() { + this.getCookieDomain = function(): string { if (mpInstance._Store.SDKConfig.cookieDomain) { return mpInstance._Store.SDKConfig.cookieDomain; } else { - var rootDomain = self.getDomain(document, location.hostname); + const rootDomain = self.getDomain(document, location.hostname); if (rootDomain === '') { return ''; } else { @@ -760,12 +781,14 @@ export default function _Persistence(mpInstance) { // "co.uk" -> fail // "domain.co.uk" -> success, return // "subdomain.domain.co.uk" -> skipped, because already found - this.getDomain = function(doc, locationHostname) { - var i, - testParts, - mpTest = 'mptest=cookie', - hostname = locationHostname.split('.'); - for (i = hostname.length - 1; i >= 0; i--) { + this.getDomain = function( + doc: Document, + locationHostname: string + ): string { + let testParts: string; + const mpTest = 'mptest=cookie'; + const hostname = locationHostname.split('.'); + for (let i = hostname.length - 1; i >= 0; i--) { testParts = hostname.slice(i).join('.'); doc.cookie = mpTest + ';domain=.' + testParts + ';'; if (doc.cookie.indexOf(mpTest) > -1) { @@ -780,9 +803,12 @@ export default function _Persistence(mpInstance) { return ''; }; - this.saveUserCookieSyncDatesToPersistence = function(mpid, csd) { + this.saveUserCookieSyncDatesToPersistence = function( + mpid: MPID, + csd: CookieSyncDates + ): void { if (csd) { - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence) { if (persistence[mpid]) { persistence[mpid].csd = csd; @@ -797,12 +823,12 @@ export default function _Persistence(mpInstance) { }; this.swapCurrentUser = function( - previousMPID, - currentMPID, - currentSessionMPIDs - ) { + previousMPID: MPID, + currentMPID: MPID, + currentSessionMPIDs: MPID[] + ): void { if (previousMPID && currentMPID && previousMPID !== currentMPID) { - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence) { persistence.cu = currentMPID; persistence.gs.csm = currentSessionMPIDs; @@ -812,27 +838,29 @@ export default function _Persistence(mpInstance) { }; // https://go.mparticle.com/work/SQDSDKS-6021 - this.savePersistence = function(persistence) { + this.savePersistence = function( + persistence: IPersistenceMinified + ): void { // Block mprtcl-v4 persistence when noFunctional is true if (mpInstance._CookieConsentManager?.getNoFunctional()) { return; } - var encodedPersistence = self.encodePersistence( - JSON.stringify(persistence) - ), - date = new Date(), - key = mpInstance._Store.storageName, - expires = new Date( - date.getTime() + - mpInstance._Store.SDKConfig.cookieExpiration * - 24 * - 60 * - 60 * - 1000 - ).toGMTString(), - cookieDomain = self.getCookieDomain(), - domain; + const encodedPersistence = self.encodePersistence( + JSON.stringify(persistence) + ); + const date = new Date(); + const key = mpInstance._Store.storageName; + const expires = new Date( + date.getTime() + + (mpInstance._Store.SDKConfig as Dictionary).cookieExpiration * + 24 * + 60 * + 60 * + 1000 + ).toUTCString(); + const cookieDomain = self.getCookieDomain(); + let domain: string; if (cookieDomain === '') { domain = ''; @@ -841,7 +869,7 @@ export default function _Persistence(mpInstance) { } if (mpInstance._Store.SDKConfig.useCookieStorage) { - var encodedCookiesWithExpirationAndPath = self.reduceAndEncodePersistence( + const encodedCookiesWithExpirationAndPath = self.reduceAndEncodePersistence( persistence, expires, domain, @@ -861,19 +889,19 @@ export default function _Persistence(mpInstance) { } }; - this.getPersistence = function() { - var persistence = this.useLocalStorage() + this.getPersistence = function(): IPersistenceMinified { + const persistence = this.useLocalStorage() ? this.getLocalStorage() : this.getCookie(); return persistence; }; - this.getFirstSeenTime = function(mpid) { + this.getFirstSeenTime = function(mpid: MPID): number | null { if (!mpid) { return null; } - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence && persistence[mpid] && persistence[mpid].fst) { return persistence[mpid].fst; } else { @@ -885,7 +913,7 @@ export default function _Persistence(mpInstance) { * set the "first seen" time for a user. the time will only be set once for a given * mpid after which subsequent calls will be ignored */ - this.setFirstSeenTime = function(mpid, time) { + this.setFirstSeenTime = function(mpid: MPID, time?: number): void { if (!mpid) { return; } @@ -893,7 +921,7 @@ export default function _Persistence(mpInstance) { if (!time) { time = new Date().getTime(); } - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence) { if (!persistence[mpid]) { persistence[mpid] = {}; @@ -910,7 +938,7 @@ export default function _Persistence(mpInstance) { * return value will always be the current time, otherwise it will be to stored "last seen" * time */ - this.getLastSeenTime = function(mpid) { + this.getLastSeenTime = function(mpid: MPID): number | null { if (!mpid) { return null; } @@ -918,7 +946,7 @@ export default function _Persistence(mpInstance) { //if the mpid is the current user, its last seen time is the current time return new Date().getTime(); } else { - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence && persistence[mpid] && persistence[mpid].lst) { return persistence[mpid].lst; } @@ -926,7 +954,7 @@ export default function _Persistence(mpInstance) { } }; - this.setLastSeenTime = function(mpid, time) { + this.setLastSeenTime = function(mpid: MPID, time?: number): void { if (!mpid) { return; } @@ -934,23 +962,23 @@ export default function _Persistence(mpInstance) { if (!time) { time = new Date().getTime(); } - var persistence = self.getPersistence(); + const persistence = self.getPersistence(); if (persistence && persistence[mpid]) { persistence[mpid].lst = time; self.savePersistence(persistence); } }; - this.getDeviceId = function() { + this.getDeviceId = function(): string { return mpInstance._Store.deviceId; }; - this.setDeviceId = function(guid) { + this.setDeviceId = function(guid: string): void { mpInstance._Store.deviceId = guid; self.update(); }; - this.resetPersistence = function() { + this.resetPersistence = function(): void { localStorage.clear(); self.expireCookies(StorageNames.cookieName); @@ -959,8 +987,8 @@ export default function _Persistence(mpInstance) { self.expireCookies(StorageNames.cookieNameV4); self.expireCookies(mpInstance._Store.storageName); - if (mParticle._isTestEnv) { - var testWorkspaceToken = 'abcdef'; + if ((window.mParticle as Dictionary)?._isTestEnv) { + const testWorkspaceToken = 'abcdef'; removeLocalStorage( mpInstance._Helpers.createMainStorageName(testWorkspaceToken) ); diff --git a/test/jest/persistence.spec.ts b/test/jest/persistence.spec.ts index 3f87e5d6f..9e8c2e5fa 100644 --- a/test/jest/persistence.spec.ts +++ b/test/jest/persistence.spec.ts @@ -3,12 +3,13 @@ import Store, { IStore } from '../../src/store'; import { IMParticleWebSDKInstance } from '../../src/mp-instance'; import { SDKInitConfig } from '../../src/sdkRuntimeModels'; import Persistence from '../../src/persistence'; +import { IPersistence } from '../../src/persistence.interfaces'; import { isObject } from '../../src/utils'; describe('Persistence', () => { let store: IStore; let mockMPInstance: IMParticleWebSDKInstance; - let persistence: Persistence; + let persistence: IPersistence; beforeEach(() => { store = {} as IStore; From d93d5397319e7c2a8fda321738c42cacf0a953e2 Mon Sep 17 00:00:00 2001 From: Jaissica Date: Thu, 21 May 2026 00:13:10 -0400 Subject: [PATCH 3/4] remove self=this pattern --- src/persistence.ts | 94 +++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/src/persistence.ts b/src/persistence.ts index 366651e58..d0acc75f8 100644 --- a/src/persistence.ts +++ b/src/persistence.ts @@ -17,8 +17,6 @@ export default function _Persistence( this: IPersistence, mpInstance: IMParticleWebSDKInstance ): void { - const self = this; - // https://go.mparticle.com/work/SQDSDKS-5022 this.useLocalStorage = function(): boolean { return ( @@ -30,8 +28,8 @@ export default function _Persistence( this.initializeStorage = function(): void { try { let storage: Storage, - localStorageData = self.getLocalStorage(), - cookies = self.getCookie(), + localStorageData = this.getLocalStorage(), + cookies = this.getCookie(), allData: IPersistenceMinified; // https://go.mparticle.com/work/SQDSDKS-6045 @@ -69,7 +67,7 @@ export default function _Persistence( } else if (cookies) { allData = cookies; } - self.storeDataInMemory(allData); + this.storeDataInMemory(allData); } else { // For migrating from cookie to localStorage -- If an instance is newly switching from cookies to localStorage, then // no mParticle localStorage exists yet and there are cookies. Get the cookies, set them to localStorage, then delete the cookies. @@ -84,14 +82,14 @@ export default function _Persistence( } else { allData = cookies; } - self.storeDataInMemory(allData); - self.expireCookies(mpInstance._Store.storageName); + this.storeDataInMemory(allData); + this.expireCookies(mpInstance._Store.storageName); } else { - self.storeDataInMemory(localStorageData); + this.storeDataInMemory(localStorageData); } } } else { - self.storeDataInMemory(cookies); + this.storeDataInMemory(cookies); } // https://go.mparticle.com/work/SQDSDKS-6046 @@ -104,17 +102,17 @@ export default function _Persistence( } } } - self.update(); + this.update(); } catch (e) { // If cookies or local storage is corrupt, we want to remove it // so that in the future, initializeStorage will work if ( - self.useLocalStorage() && + this.useLocalStorage() && mpInstance._Store.isLocalStorageAvailable ) { localStorage.removeItem(mpInstance._Store.storageName); } else { - self.expireCookies(mpInstance._Store.storageName); + this.expireCookies(mpInstance._Store.storageName); } mpInstance.Logger.error('Error initializing storage: ' + e); } @@ -123,10 +121,10 @@ export default function _Persistence( this.update = function(): void { if (!mpInstance._Store.webviewBridgeEnabled) { if (mpInstance._Store.SDKConfig.useCookieStorage) { - self.setCookie(); + this.setCookie(); } - self.setLocalStorage(); + this.setLocalStorage(); } }; @@ -249,7 +247,7 @@ export default function _Persistence( } const key = mpInstance._Store.storageName; - let localStorageData = self.getLocalStorage() || ({} as IPersistenceMinified); + let localStorageData = this.getLocalStorage() || ({} as IPersistenceMinified); const currentUser = mpInstance.Identity.getCurrentUser(); const mpid = currentUser ? currentUser.getMPID() : null; if (!mpInstance._Store.SDKConfig.useCookieStorage) { @@ -281,7 +279,7 @@ export default function _Persistence( try { window.localStorage.setItem( encodeURIComponent(key), - self.encodePersistence(JSON.stringify(localStorageData)) + this.encodePersistence(JSON.stringify(localStorageData)) ); } catch (e) { mpInstance.Logger.error( @@ -322,7 +320,7 @@ export default function _Persistence( } const key = mpInstance._Store.storageName; - const localStorageString = self.decodePersistence( + const localStorageString = this.decodePersistence( window.localStorage.getItem(key) ); const obj: Dictionary = {}; @@ -353,7 +351,7 @@ export default function _Persistence( let domain: string; let cookieDomain: string; - cookieDomain = self.getCookieDomain(); + cookieDomain = this.getCookieDomain(); if (cookieDomain === '') { domain = ''; @@ -408,7 +406,7 @@ export default function _Persistence( if (result) { mpInstance.Logger.verbose(Messages.InformationMessages.CookieFound); - return JSON.parse(self.decodePersistence(result as string)); + return JSON.parse(this.decodePersistence(result as string)); } else { return null; } @@ -429,7 +427,7 @@ export default function _Persistence( } const date = new Date(); const key = mpInstance._Store.storageName; - let cookies = self.getCookie() || ({} as IPersistenceMinified); + let cookies = this.getCookie() || ({} as IPersistenceMinified); const expires = new Date( date.getTime() + (mpInstance._Store.SDKConfig as Dictionary).cookieExpiration * @@ -442,7 +440,7 @@ export default function _Persistence( let domain: string; let encodedCookiesWithExpirationAndPath: string; - cookieDomain = self.getCookieDomain(); + cookieDomain = this.getCookieDomain(); if (cookieDomain === '') { domain = ''; @@ -473,7 +471,7 @@ export default function _Persistence( mpInstance._Store.nonCurrentUserMPIDs = {}; } - encodedCookiesWithExpirationAndPath = self.reduceAndEncodePersistence( + encodedCookiesWithExpirationAndPath = this.reduceAndEncodePersistence( cookies, expires, domain, @@ -596,19 +594,19 @@ export default function _Persistence( return encodedCookiesWithExpirationAndPath; }; - function createFullEncodedCookie( + const createFullEncodedCookie = ( persistence: IPersistenceMinified, expires: string, domain: string - ): string { + ): string => { return ( - self.encodePersistence(JSON.stringify(persistence)) + + this.encodePersistence(JSON.stringify(persistence)) + ';expires=' + expires + ';path=/' + domain ); - } + }; this.findPrevCookiesBasedOnUI = function( identityApiData: IdentityApiData @@ -642,7 +640,7 @@ export default function _Persistence( } if (matchedUser) { - self.storeDataInMemory(persistence, matchedUser); + this.storeDataInMemory(persistence, matchedUser); } }; @@ -767,7 +765,7 @@ export default function _Persistence( if (mpInstance._Store.SDKConfig.cookieDomain) { return mpInstance._Store.SDKConfig.cookieDomain; } else { - const rootDomain = self.getDomain(document, location.hostname); + const rootDomain = this.getDomain(document, location.hostname); if (rootDomain === '') { return ''; } else { @@ -808,7 +806,7 @@ export default function _Persistence( csd: CookieSyncDates ): void { if (csd) { - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence) { if (persistence[mpid]) { persistence[mpid].csd = csd; @@ -818,7 +816,7 @@ export default function _Persistence( }; } } - self.savePersistence(persistence); + this.savePersistence(persistence); } }; @@ -828,11 +826,11 @@ export default function _Persistence( currentSessionMPIDs: MPID[] ): void { if (previousMPID && currentMPID && previousMPID !== currentMPID) { - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence) { persistence.cu = currentMPID; persistence.gs.csm = currentSessionMPIDs; - self.savePersistence(persistence); + this.savePersistence(persistence); } } }; @@ -846,7 +844,7 @@ export default function _Persistence( return; } - const encodedPersistence = self.encodePersistence( + const encodedPersistence = this.encodePersistence( JSON.stringify(persistence) ); const date = new Date(); @@ -859,7 +857,7 @@ export default function _Persistence( 60 * 1000 ).toUTCString(); - const cookieDomain = self.getCookieDomain(); + const cookieDomain = this.getCookieDomain(); let domain: string; if (cookieDomain === '') { @@ -869,7 +867,7 @@ export default function _Persistence( } if (mpInstance._Store.SDKConfig.useCookieStorage) { - const encodedCookiesWithExpirationAndPath = self.reduceAndEncodePersistence( + const encodedCookiesWithExpirationAndPath = this.reduceAndEncodePersistence( persistence, expires, domain, @@ -901,7 +899,7 @@ export default function _Persistence( if (!mpid) { return null; } - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence && persistence[mpid] && persistence[mpid].fst) { return persistence[mpid].fst; } else { @@ -921,14 +919,14 @@ export default function _Persistence( if (!time) { time = new Date().getTime(); } - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence) { if (!persistence[mpid]) { persistence[mpid] = {}; } if (!persistence[mpid].fst) { persistence[mpid].fst = time; - self.savePersistence(persistence); + this.savePersistence(persistence); } } }; @@ -946,7 +944,7 @@ export default function _Persistence( //if the mpid is the current user, its last seen time is the current time return new Date().getTime(); } else { - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence && persistence[mpid] && persistence[mpid].lst) { return persistence[mpid].lst; } @@ -962,10 +960,10 @@ export default function _Persistence( if (!time) { time = new Date().getTime(); } - const persistence = self.getPersistence(); + const persistence = this.getPersistence(); if (persistence && persistence[mpid]) { persistence[mpid].lst = time; - self.savePersistence(persistence); + this.savePersistence(persistence); } }; @@ -975,24 +973,24 @@ export default function _Persistence( this.setDeviceId = function(guid: string): void { mpInstance._Store.deviceId = guid; - self.update(); + this.update(); }; this.resetPersistence = function(): void { localStorage.clear(); - self.expireCookies(StorageNames.cookieName); - self.expireCookies(StorageNames.cookieNameV2); - self.expireCookies(StorageNames.cookieNameV3); - self.expireCookies(StorageNames.cookieNameV4); - self.expireCookies(mpInstance._Store.storageName); + this.expireCookies(StorageNames.cookieName); + this.expireCookies(StorageNames.cookieNameV2); + this.expireCookies(StorageNames.cookieNameV3); + this.expireCookies(StorageNames.cookieNameV4); + this.expireCookies(mpInstance._Store.storageName); if ((window.mParticle as Dictionary)?._isTestEnv) { const testWorkspaceToken = 'abcdef'; removeLocalStorage( mpInstance._Helpers.createMainStorageName(testWorkspaceToken) ); - self.expireCookies( + this.expireCookies( mpInstance._Helpers.createMainStorageName(testWorkspaceToken) ); } From 49280963cb523ef0e4b133954f5d6a9525af4247 Mon Sep 17 00:00:00 2001 From: Jaissica Date: Mon, 25 May 2026 18:22:11 -0400 Subject: [PATCH 4/4] remove unused iForwardingStatsBatches import --- src/persistence.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/persistence.ts b/src/persistence.ts index d0acc75f8..82f6ebef6 100644 --- a/src/persistence.ts +++ b/src/persistence.ts @@ -2,7 +2,7 @@ import Constants from './constants'; import Polyfill from './polyfill'; import * as Utils from './utils'; import { IMParticleWebSDKInstance } from './mp-instance'; -import { IPersistence, IPersistenceMinified, iForwardingStatsBatches } from './persistence.interfaces'; +import { IPersistence, IPersistenceMinified } from './persistence.interfaces'; import { MPID, IdentityApiData } from '@mparticle/web-sdk'; import { CookieSyncDates } from './cookieSyncManager'; import { Dictionary } from './utils';