Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
650 changes: 53 additions & 597 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
"cross-env": "^7.0.3",
"eslint": "^8.36.0",
"eslint-config-prettier": "9.0.0",
"eslint-plugin-prettier": "3.4.1",
"eslint-plugin-prettier": "5.1.3",
"fetch-mock": "^9.1.1",
"gts": "^5.0.1",
"jest": "^29.5.0",
Expand All @@ -128,7 +128,7 @@
"karma-should": "^1.0.0",
"mocha": "^9.0.0",
"pre-commit": "^1.2.2",
"prettier": "1.18.2",
"prettier": "3.2.4",
"rollup": "^2.75.7",
"shelljs": "^0.8.4",
"should": "^7.1.0",
Expand Down
9 changes: 8 additions & 1 deletion src/cookieSyncManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@ export default function cookieSyncManager(mpInstance) {
var self = this;

// Public
this.attemptCookieSync = function(previousMPID, mpid, mpidIsNotInCookies) {
this.attemptCookieSync = function (previousMPID, mpid, mpidIsNotInCookies) {
if (
mpInstance._Store &&
mpInstance._Store.SDKConfig &&
!mpInstance._Store.SDKConfig.usePersistence
) {
return;
}
// TODO: These should move inside the for loop
var pixelConfig,
lastSyncDateForModule,
Expand Down
157 changes: 124 additions & 33 deletions src/identity.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Constants from './constants';
import Types from './types';
import { isEmpty, isObject } from './utils';

var Messages = Constants.Messages,
HTTPCodes = Constants.HTTPCodes;
Expand All @@ -18,8 +19,17 @@ export default function Identity(mpInstance) {
if (persistence) {
persistence.cu = currentMPID;
persistence.gs.csm = currentSessionMPIDs;
mpInstance._Persistence.savePersistence(persistence);
} else {
persistence = mpInstance._Store.getPersistence();
}

// TODO: Maybe create an updateIdentity method?
// Store relevant identity settings into Store
mpInstance._Store.mpid = currentMPID;
mpInstance._Store.currentSessionMPIDs = currentSessionMPIDs;
Copy link
Collaborator Author

@alexs-mparticle alexs-mparticle Jan 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lines 20 and 21 can just be removed in favor of this approach.

Line 23 can be combined with the check on 18 so it's using Persistence or Store.

Suggested change
mpInstance._Store.currentSessionMPIDs = currentSessionMPIDs;
mpInstance._Store.currentSessionMPIDs = currentSessionMPIDs;
persistence.cu = currentMPID;
persistence.gs.csm = currentSessionMPIDs;


mpInstance._Persistence.savePersistence(persistence);
mpInstance._Store.savePersistence(persistence);
}
};

Expand Down Expand Up @@ -62,6 +72,7 @@ export default function Identity(mpInstance) {
};
}

// https://go.mparticle.com/work/SQDSDKS-6096
if (
callback &&
!mpInstance._Helpers.Validators.isFunction(callback)
Expand Down Expand Up @@ -144,9 +155,9 @@ export default function Identity(mpInstance) {
var key;
if (
newIdentities &&
mpInstance._Helpers.isObject(newIdentities) &&
isObject(newIdentities) &&
previousIdentities &&
mpInstance._Helpers.isObject(previousIdentities)
isObject(previousIdentities)
) {
for (key in newIdentities) {
identityChanges.push({
Expand Down Expand Up @@ -183,7 +194,7 @@ export default function Identity(mpInstance) {

createAliasNetworkRequest: function(aliasRequest) {
return {
request_id: mpInstance._Helpers.generateUniqueId(),
request_id: generateUniqueId(),
request_type: 'alias',
environment: mpInstance._Store.SDKConfig.isDevelopmentMode
? 'development'
Expand Down Expand Up @@ -579,7 +590,14 @@ export default function Identity(mpInstance) {
* @return {Object} the user for mpid
*/
getUser: function(mpid) {
// FIXME: This seems to break if persistence is not enabled

var persistence = mpInstance._Persistence.getPersistence();

if (isEmpty(persistence)) {
persistence = mpInstance._Store.getPersistence();
}

if (persistence) {
if (
persistence[mpid] &&
Expand All @@ -601,6 +619,10 @@ export default function Identity(mpInstance) {
*/
getUsers: function() {
var persistence = mpInstance._Persistence.getPersistence();
if (isEmpty(persistence)) {
persistence = mpInstance._Store.getPersistence();
}

var users = [];
if (persistence) {
for (var key in persistence) {
Expand Down Expand Up @@ -778,9 +800,12 @@ export default function Identity(mpInstance) {
getUserIdentities: function() {
var currentUserIdentities = {};

var identities = mpInstance._Persistence.getUserIdentities(
mpid
);
var identities =
mpInstance._Persistence.getUserIdentities(mpid);

if (isEmpty(identities)) {
identities = mpInstance._Store.getUserIdentities(mpid);
}

for (var identityType in identities) {
if (identities.hasOwnProperty(identityType)) {
Expand Down Expand Up @@ -844,6 +869,7 @@ export default function Identity(mpInstance) {

mpInstance._SessionManager.resetSessionTimer();

// TODO: Reverse this guard
if (mpInstance._Helpers.canLog()) {
if (
!mpInstance._Helpers.Validators.isValidAttributeValue(
Expand All @@ -866,7 +892,10 @@ export default function Identity(mpInstance) {
JSON.stringify({ key: key, value: newValue })
);
} else {
cookies = mpInstance._Persistence.getPersistence();
persistence = mpInstance._Persistence.getPersistence();
if (isEmpty(persistence)) {
persistence = mpInstance._Store.getPersistence();
}

userAttributes = this.getAllUserAttributes();

Expand All @@ -885,10 +914,14 @@ export default function Identity(mpInstance) {
}

userAttributes[key] = newValue;
if (cookies && cookies[mpid]) {
cookies[mpid].ua = userAttributes;
if (persistence && persistence[mpid]) {
persistence[mpid].ua = userAttributes;
mpInstance._Persistence.savePersistence(
cookies,
persistence,
mpid
);
mpInstance._Store.savePersistence(
persistence,
mpid
);
}
Expand Down Expand Up @@ -921,7 +954,7 @@ export default function Identity(mpInstance) {
*/
setUserAttributes: function(userAttributes) {
mpInstance._SessionManager.resetSessionTimer();
if (mpInstance._Helpers.isObject(userAttributes)) {
if (isObject(userAttributes)) {
if (mpInstance._Helpers.canLog()) {
for (var key in userAttributes) {
if (userAttributes.hasOwnProperty(key)) {
Expand All @@ -941,8 +974,10 @@ export default function Identity(mpInstance) {
* @method removeUserAttribute
* @param {String} key
*/
removeUserAttribute: function(key) {
var cookies, userAttributes;
removeUserAttribute: function (key) {
var persistence;
var userAttributes;

mpInstance._SessionManager.resetSessionTimer();

if (!mpInstance._Helpers.Validators.isValidKeyValue(key)) {
Expand All @@ -956,7 +991,10 @@ export default function Identity(mpInstance) {
JSON.stringify({ key: key, value: null })
);
} else {
cookies = mpInstance._Persistence.getPersistence();
persistence = mpInstance._Persistence.getPersistence();
if (isEmpty(persistence)) {
persistence = mpInstance._Store.getPersistence();
}

userAttributes = this.getAllUserAttributes();

Expand All @@ -975,9 +1013,13 @@ export default function Identity(mpInstance) {

delete userAttributes[key];

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

self.sendUserAttributeChangeEvent(
Expand Down Expand Up @@ -1007,7 +1049,7 @@ export default function Identity(mpInstance) {
* @param {Array} value an array of values
*/
setUserAttributeList: function(key, newValue) {
var cookies,
var persistence,
userAttributes,
previousUserAttributeValue,
isNewAttribute,
Expand Down Expand Up @@ -1036,7 +1078,10 @@ export default function Identity(mpInstance) {
JSON.stringify({ key: key, value: arrayCopy })
);
} else {
cookies = mpInstance._Persistence.getPersistence();
persistence = mpInstance._Persistence.getPersistence();
if (isEmpty(persistence)) {
persistence = mpInstance._Persistence.getPersistence();
}

userAttributes = this.getAllUserAttributes();

Expand All @@ -1055,9 +1100,13 @@ export default function Identity(mpInstance) {
}

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

// If the new attributeList length is different previous, then there is a change event.
Expand Down Expand Up @@ -1165,10 +1214,14 @@ export default function Identity(mpInstance) {
*/
getAllUserAttributes: function() {
var userAttributesCopy = {};
var userAttributes = mpInstance._Persistence.getAllUserAttributes(
mpid
);
var userAttributes =
mpInstance._Persistence.getAllUserAttributes(mpid);

if (isEmpty(userAttributes)) {
userAttributes = mpInstance._Store.getUserAttributes(mpid);
}

// QUESTION: Is this just trying to do a deep copy?
if (userAttributes) {
for (var prop in userAttributes) {
if (userAttributes.hasOwnProperty(prop)) {
Expand Down Expand Up @@ -1202,8 +1255,12 @@ export default function Identity(mpInstance) {
* @method getConsentState
* @return a ConsentState object
*/
getConsentState: function() {
return mpInstance._Persistence.getConsentState(mpid);
getConsentState: function () {
const consentState =
mpInstance._Persistence.getConsentState(mpid);
return !isEmpty(consentState)
? consentState
: mpInstance._Store.getConsentState(mpid);
},
/**
* Sets the Consent State stored locally for this user.
Expand All @@ -1215,6 +1272,9 @@ export default function Identity(mpInstance) {
mpid,
state
);

mpInstance._Store.setConsentState(mpid, state);

mpInstance._Forwarders.initForwarders(
this.getUserIdentities().userIdentities,
mpInstance._APIClient.prepareForwardingStats
Expand Down Expand Up @@ -1464,30 +1524,42 @@ export default function Identity(mpInstance) {

if (prevUser) {
mpInstance._Persistence.setLastSeenTime(previousMPID);
mpInstance._Store.setLastSeenTime(previousMPID);
}

// QUESTION: Does this only matter for cookies or do we need it for
Copy link
Collaborator Author

@alexs-mparticle alexs-mparticle Jan 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's called cookies, but actually applies to all persistence methods.

Also requires access to the DOM, so we may need a control for that to make sure dom exists.

// other persistence strategies?
if (
!mpInstance._Persistence.getFirstSeenTime(
identityApiResult.mpid
)
)
) {
mpidIsNotInCookies = true;
}

mpInstance._Persistence.setFirstSeenTime(
identityApiResult.mpid
);
mpInstance._Store.setFirstSeenTime(identityApiResult.mpid);
}

// TODO: Reverse this guard to remove nesting
if (xhr.status === 200) {
if (method === Modify) {
newIdentitiesByType = mpInstance._Identity.IdentityRequest.combineUserIdentities(
previousUIByName,
identityApiData.userIdentities
);
newIdentitiesByType =
mpInstance._Identity.IdentityRequest.combineUserIdentities(
previousUIByName,
identityApiData.userIdentities
);

mpInstance._Persistence.saveUserIdentitiesToPersistence(
previousMPID,
newIdentitiesByType
);
mpInstance._Store.setUserIdentities(
previousMPID,
newIdentitiesByType
);
} else {
var incomingUser = self.IdentityAPI.getUser(
identityApiResult.mpid
Expand Down Expand Up @@ -1516,6 +1588,9 @@ export default function Identity(mpInstance) {
mpInstance._Persistence.setFirstSeenTime(
identityApiResult.mpid
);
mpInstance._Store.setFirstSeenTime(
identityApiResult.mpid
);
}

indexOfMPID = mpInstance._Store.currentSessionMPIDs.indexOf(
Expand Down Expand Up @@ -1575,8 +1650,15 @@ export default function Identity(mpInstance) {
identityApiResult.mpid,
newIdentitiesByType
);

mpInstance._Store.setUserIdentities(
identityApiResult.mpid,
newIdentitiesByType
);

mpInstance._Persistence.update();

// QUESTION: Do we need this in a non-persistent world?
mpInstance._Persistence.findPrevCookiesBasedOnUI(
identityApiData
);
Expand Down Expand Up @@ -1607,12 +1689,21 @@ export default function Identity(mpInstance) {
}
}
var persistence = mpInstance._Persistence.getPersistence();
if (isEmpty(persistence)) {
persistence = mpInstance._Store.getPersistence();
}

if (newUser) {
mpInstance._Persistence.storeDataInMemory(
persistence,
newUser.getMPID()
);

mpInstance._Store.storeDataInMemory(
persistence,
newUser.getMPID()
);

if (
!prevUser ||
newUser.getMPID() !== prevUser.getMPID() ||
Expand Down
Loading