Skip to content
37 changes: 12 additions & 25 deletions src/cookieSyncManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export default function cookieSyncManager(mpInstance) {
var self = this;

// Public
// https://go.mparticle.com/work/SQDSDKS-6375
this.attemptCookieSync = function(previousMPID, mpid, mpidIsNotInCookies) {
// TODO: These should move inside the for loop
var pixelConfig,
Expand All @@ -17,6 +18,8 @@ export default function cookieSyncManager(mpInstance) {

// TODO: Make this exit quicker instead of nested
if (mpid && !mpInstance._Store.webviewBridgeEnabled) {
const cookieSyncDates = mpInstance._Store.getCookieSyncDates(mpid);

mpInstance._Store.pixelConfigurations.forEach(function(
pixelSettings
) {
Expand Down Expand Up @@ -60,22 +63,15 @@ export default function cookieSyncManager(mpInstance) {
: '';
urlWithRedirect = url + encodeURIComponent(redirect);

// TODO: Refactor so that Persistence is only called once
// outside of the loop
var persistence = mpInstance._Persistence.getPersistence();

// TODO: Is there a historic reason for checking for previousMPID?
// it does not appear to be passed in anywhere
if (previousMPID && previousMPID !== mpid) {
if (persistence && persistence[mpid]) {
if (!persistence[mpid].csd) {
persistence[mpid].csd = {};
}
if (cookieSyncDates) {
self.performCookieSync(
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand All @@ -85,16 +81,10 @@ export default function cookieSyncManager(mpInstance) {
} else {
// TODO: Refactor to check for the inverse and exit early
// rather than nesting
if (persistence[mpid]) {
if (!persistence[mpid].csd) {
persistence[mpid].csd = {};
}
lastSyncDateForModule = persistence[mpid].csd[
pixelConfig.moduleId.toString()
]
? persistence[mpid].csd[
pixelConfig.moduleId.toString()
]
if (cookieSyncDates) {
const moduleId = pixelConfig.moduleId.toString();
lastSyncDateForModule = cookieSyncDates[moduleId]
? cookieSyncDates[moduleId]
: null;

if (lastSyncDateForModule) {
Expand All @@ -117,7 +107,7 @@ export default function cookieSyncManager(mpInstance) {
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand All @@ -128,7 +118,7 @@ export default function cookieSyncManager(mpInstance) {
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand Down Expand Up @@ -186,10 +176,7 @@ export default function cookieSyncManager(mpInstance) {
img.onload = function() {
// TODO: Break this out into a convenience method so we can unit test
cookieSyncDates[moduleId.toString()] = new Date().getTime();
mpInstance._Persistence.saveUserCookieSyncDatesToPersistence(
mpid,
cookieSyncDates
);
mpInstance._Store.setCookieSyncDates(mpid, cookieSyncDates);
};
img.src = url;
}
Expand Down
6 changes: 2 additions & 4 deletions src/filteredMparticleUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default function filteredMparticleUser(
return {
getUserIdentities: function() {
var currentUserIdentities = {};
var identities = mpInstance._Persistence.getUserIdentities(mpid);
var identities = mpInstance._Store.getUserIdentities(mpid);

for (var identityType in identities) {
if (identities.hasOwnProperty(identityType)) {
Expand Down Expand Up @@ -68,9 +68,7 @@ export default function filteredMparticleUser(
},
getAllUserAttributes: function() {
var userAttributesCopy = {};
var userAttributes = mpInstance._Persistence.getAllUserAttributes(
mpid
);
var userAttributes = mpInstance._Store.getUserAttributes(mpid);

if (userAttributes) {
for (var prop in userAttributes) {
Expand Down
74 changes: 27 additions & 47 deletions src/identity.js
Original file line number Diff line number Diff line change
Expand Up @@ -806,11 +806,8 @@ export default function Identity(mpInstance) {
* @return {Object} an object with userIdentities as its key
*/
getUserIdentities: function() {
var currentUserIdentities = {};

var identities = mpInstance._Persistence.getUserIdentities(
mpid
);
const currentUserIdentities = {};
const identities = mpInstance._Store.getUserIdentities(mpid);

for (var identityType in identities) {
if (identities.hasOwnProperty(identityType)) {
Expand Down Expand Up @@ -866,12 +863,9 @@ export default function Identity(mpInstance) {
* @param {String} key
* @param {String} value
*/
// https://go.mparticle.com/work/SQDSDKS-4576
// https://go.mparticle.com/work/SQDSDKS-6373
setUserAttribute: function(key, newValue) {
var cookies,
userAttributes,
previousUserAttributeValue,
isNewAttribute;

mpInstance._SessionManager.resetSessionTimer();

if (mpInstance._Helpers.canLog()) {
Expand All @@ -896,11 +890,11 @@ export default function Identity(mpInstance) {
JSON.stringify({ key: key, value: newValue })
);
} else {
cookies = mpInstance._Persistence.getPersistence();

userAttributes = this.getAllUserAttributes();
const userAttributes = this.getAllUserAttributes();
let previousUserAttributeValue;
let isNewAttribute;

var existingProp = mpInstance._Helpers.findKeyInObject(
const existingProp = mpInstance._Helpers.findKeyInObject(
userAttributes,
key
);
Expand All @@ -915,13 +909,10 @@ export default function Identity(mpInstance) {
}

userAttributes[key] = newValue;
if (cookies && cookies[mpid]) {
cookies[mpid].ua = userAttributes;
mpInstance._Persistence.savePersistence(
cookies,
mpid
);
}
mpInstance._Store.setUserAttributes(
mpid,
userAttributes
);

self.sendUserAttributeChangeEvent(
key,
Expand Down Expand Up @@ -949,6 +940,7 @@ export default function Identity(mpInstance) {
* @method setUserAttributes
* @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) {
mpInstance._SessionManager.resetSessionTimer();
if (isObject(userAttributes)) {
Expand Down Expand Up @@ -1036,13 +1028,8 @@ export default function Identity(mpInstance) {
* @param {String} key
* @param {Array} value an array of values
*/
// https://go.mparticle.com/work/SQDSDKS-6373
setUserAttributeList: function(key, newValue) {
var cookies,
userAttributes,
previousUserAttributeValue,
isNewAttribute,
userAttributeChange;

mpInstance._SessionManager.resetSessionTimer();

if (!mpInstance._Helpers.Validators.isValidKeyValue(key)) {
Expand All @@ -1058,19 +1045,20 @@ export default function Identity(mpInstance) {
return;
}

var arrayCopy = newValue.slice();
const arrayCopy = newValue.slice();

if (mpInstance._Store.webviewBridgeEnabled) {
mpInstance._NativeSdkHelpers.sendToNative(
Constants.NativeSdkPaths.SetUserAttributeList,
JSON.stringify({ key: key, value: arrayCopy })
);
} else {
cookies = mpInstance._Persistence.getPersistence();
const userAttributes = this.getAllUserAttributes();
let previousUserAttributeValue;
let isNewAttribute;
let userAttributeChange;

userAttributes = this.getAllUserAttributes();

var existingProp = mpInstance._Helpers.findKeyInObject(
const existingProp = mpInstance._Helpers.findKeyInObject(
userAttributes,
key
);
Expand All @@ -1085,12 +1073,9 @@ export default function Identity(mpInstance) {
}

userAttributes[key] = arrayCopy;
if (cookies && cookies[mpid]) {
cookies[mpid].ua = userAttributes;
mpInstance._Persistence.savePersistence(cookies, mpid);
}
mpInstance._Store.setUserAttributes(mpid, userAttributes);

// If the new attributeList length is different previous, then there is a change event.
// If the new attributeList length is different than the previous, then there is a change event.
// Loop through new attributes list, see if they are all in the same index as previous user attributes list
// If there are any changes, break, and immediately send a userAttributeChangeEvent with full array as a value
if (
Expand Down Expand Up @@ -1195,9 +1180,7 @@ export default function Identity(mpInstance) {
*/
getAllUserAttributes: function() {
var userAttributesCopy = {};
var userAttributes = mpInstance._Persistence.getAllUserAttributes(
mpid
);
var userAttributes = mpInstance._Store.getUserAttributes(mpid);

if (userAttributes) {
for (var prop in userAttributes) {
Expand Down Expand Up @@ -1233,18 +1216,15 @@ export default function Identity(mpInstance) {
* @return a ConsentState object
*/
getConsentState: function() {
return mpInstance._Persistence.getConsentState(mpid);
return mpInstance._Store.getConsentState(mpid);
},
/**
* Sets the Consent State stored locally for this user.
* @method setConsentState
* @param {Object} consent state
*/
setConsentState: function(state) {
mpInstance._Persistence.saveUserConsentStateToCookies(
mpid,
state
);
mpInstance._Store.setConsentState(mpid, state);
mpInstance._Forwarders.initForwarders(
this.getUserIdentities().userIdentities,
mpInstance._APIClient.prepareForwardingStats
Expand Down Expand Up @@ -1549,7 +1529,7 @@ export default function Identity(mpInstance) {
identityApiData.userIdentities
);

mpInstance._Persistence.saveUserIdentitiesToPersistence(
mpInstance._Store.setUserIdentities(
previousMPID,
newIdentitiesByType
);
Expand Down Expand Up @@ -1596,7 +1576,7 @@ export default function Identity(mpInstance) {
}

// https://go.mparticle.com/work/SQDSDKS-6041
mpInstance._Persistence.saveUserIdentitiesToPersistence(
mpInstance._Store.setUserIdentities(
identityApiResult.mpid,
newIdentitiesByType
);
Expand Down
1 change: 1 addition & 0 deletions src/mp-instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,7 @@ function completeSDKInitialization(apiKey, config, mpInstance) {

// Load any settings/identities/attributes from cookie or localStorage
mpInstance._Persistence.initializeStorage();
mpInstance._Store.syncPersistenceData();

// Set up user identitiy variables for later use
const currentUser = mpInstance.Identity.getCurrentUser();
Expand Down
45 changes: 28 additions & 17 deletions src/persistence.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import {
SessionAttributes,
} from './store';
import { Dictionary } from './utils';
import { IMinifiedConsentJSONObject } from './consent';

export type CookieSyncDate = Dictionary<string>;
export type UploadsTable = Dictionary<any>;
export interface iForwardingStatsBatches {
uploadsTable: UploadsTable;
Expand All @@ -36,19 +36,23 @@ export interface IGlobalStoreV2MinifiedKeys {
das: string; // Device ID/ Device Application String
ia: IntegrationAttributes;
c: Context;
csm: MPID[]; // Current Session MPIDs
csm?: MPID[]; // Current Session MPIDs
les: number; // Last Event Sent Timestamp
ssd: number; // Session Start Date
}

export interface IPersistenceMinified extends Dictionary {
cu: MPID; // Current User MPID
gs: IGlobalStoreV2MinifiedKeys;

// Stored as 0 or 1 in device persistence but returned as a
// boolean when decoding from device persistence via
// _Persistence.getPersistence and _Persistence.decodePersistence
l: boolean; // IsLoggedIn

// Persistence Minified can also store optional dictionaries with
// an idex of MPID
// [mpid: MPID]: Dictionary<any>;
// [mpid: MPID]: Dictionary<IUserPersistenceMinified>;

// For Example:
// {
Expand All @@ -70,14 +74,34 @@ export interface IPersistenceMinified extends Dictionary {
// },
// l: false,
// MPID1: {
// csd: [],
// csd: {
// [moduleid]: 1234567890,
// },
// ui: {
// customerid: '12346',
// },
// ua: {
// age '42',
// },
// },
// };
}

export type CookieSyncDates = Dictionary<number>;

export interface IUserPersistenceMinified extends Dictionary {
csd: CookieSyncDates; // Cookie Sync Dates // list of timestamps for last cookie sync
con: IMinifiedConsentJSONObject; // Consent State
ui: UserIdentities; // User Identities
ua: UserAttributes; // User Attributes

// https://go.mparticle.com/work/SQDSDKS-6048
cp: Product[]; // Cart Products

fst: number; // First Seen Time
lst: number; // Last Seen Time
}

export interface IPersistence {
useLocalStorage(): boolean;
initializeStorage(): void;
Expand All @@ -103,23 +127,10 @@ export interface IPersistence {
decodePersistence(persistenceString: string): string;
getCookieDomain(): string;
getDomain(doc: string, locationHostname: string): string;
getUserIdentities(mpid: MPID): UserIdentities;
getAllUserAttributes(mpid: MPID): AllUserAttributes;
getCartProducts(mpid: MPID): Product[];
setCartProducts(allProducts: Product[]): void;
saveUserIdentitiesToPersistence(
mpid: MPID,
userIdentities: UserIdentities
): void;
saveUserAttributesToPersistence(
mpid: MPID,
userAttributes: UserAttributes
): void;
saveUserCookieSyncDatesToPersistence(mpid: MPID, csd: CookieSyncDate): void;
saveUserConsentStateToCookies(mpid, consentState: ConsentState): void;
savePersistence(persistance: IPersistenceMinified): void;
getPersistence(): IPersistenceMinified;
getConsentState(mpid: MPID): ConsentState | null;
getFirstSeenTime(mpid: MPID): string | null;
setFirstSeenTime(mpid: MPID, time: number): void;
getLastSeenTime(mpid: MPID): number | null;
Expand Down
Loading