Skip to content
Closed
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
57 changes: 24 additions & 33 deletions src/authorization/authorization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
SHARED_PREF_USER_ID,
RETRY_USER_ATTEMPTS
} from '../constants';
import { safeGetItem, safeSetItem, safeRemoveItem } from '../utils/safeStorage';
import { UnknownUserMerge } from '../unknownUserTracking/unknownUserMerge';
import {
UnknownUserEventManager,
Expand Down Expand Up @@ -93,7 +94,7 @@ const doesRequestUrlContain = (routeConfig: RouteConfig) =>
const addUserIdToRequest = (userId: string) => {
setTypeOfAuth('userID');
authIdentifier = userId;
localStorage.setItem(SHARED_PREF_USER_ID, userId);
safeSetItem(SHARED_PREF_USER_ID, userId);

if (typeof userInterceptor === 'number') {
baseAxiosRequest.interceptors.request.eject(userInterceptor);
Expand Down Expand Up @@ -217,18 +218,18 @@ export const setUnknownUserId = async (userId: string) => {
}

addUserIdToRequest(userId);
localStorage.setItem(SHARED_PREF_UNKNOWN_USER_ID, userId);
safeSetItem(SHARED_PREF_UNKNOWN_USER_ID, userId);
};

registerUnknownUserIdSetter(setUnknownUserId);

const clearUnknownUser = () => {
localStorage.removeItem(SHARED_PREF_UNKNOWN_USER_ID);
safeRemoveItem(SHARED_PREF_UNKNOWN_USER_ID);
};

const getUnknownUserId = () => {
if (config.getConfig('enableUnknownActivation')) {
const unknownUser = localStorage.getItem(SHARED_PREF_UNKNOWN_USER_ID);
const unknownUser = safeGetItem(SHARED_PREF_UNKNOWN_USER_ID);
return unknownUser === undefined ? null : unknownUser;
}
return null;
Expand All @@ -242,7 +243,7 @@ const initializeUserId = (userId: string) => {
const addEmailToRequest = (email: string) => {
setTypeOfAuth('email');
authIdentifier = email;
localStorage.setItem(SHARED_PREF_EMAIL, email);
safeSetItem(SHARED_PREF_EMAIL, email);

if (typeof userInterceptor === 'number') {
baseAxiosRequest.interceptors.request.eject(userInterceptor);
Expand Down Expand Up @@ -621,9 +622,9 @@ export function initialize(
unknownUserManager.removeUnknownSessionCriteriaData();
setTypeOfAuth(null);
authIdentifier = null;
localStorage.removeItem(SHARED_PREF_EMAIL);
localStorage.removeItem(SHARED_PREF_USER_ID);
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
safeRemoveItem(SHARED_PREF_EMAIL);
safeRemoveItem(SHARED_PREF_USER_ID);
safeRemoveItem(SHARED_PREF_CONSENT_TIMESTAMP);
/* clear fetched in-app messages */
clearMessages();

Expand Down Expand Up @@ -652,17 +653,12 @@ export function initialize(
/* if consent is true, we want to clear unknown user data and start tracking */
if (consent) {
unknownUserManager.removeUnknownSessionCriteriaData();
localStorage.removeItem(SHARED_PREFS_CRITERIA);
safeRemoveItem(SHARED_PREFS_CRITERIA);

// Store consent timestamp when user grants consent
const existingConsent = localStorage.getItem(
SHARED_PREF_CONSENT_TIMESTAMP
);
const existingConsent = safeGetItem(SHARED_PREF_CONSENT_TIMESTAMP);
if (!existingConsent) {
localStorage.setItem(
SHARED_PREF_CONSENT_TIMESTAMP,
Date.now().toString()
);
safeSetItem(SHARED_PREF_CONSENT_TIMESTAMP, Date.now().toString());
}
enableUnknownTracking();
} else {
Expand All @@ -671,9 +667,9 @@ export function initialize(
if (unknownUsageTracked) {
unknownUserManager.removeUnknownSessionCriteriaData();

localStorage.removeItem(SHARED_PREFS_CRITERIA);
localStorage.removeItem(SHARED_PREF_UNKNOWN_USER_ID);
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
safeRemoveItem(SHARED_PREFS_CRITERIA);
safeRemoveItem(SHARED_PREF_UNKNOWN_USER_ID);
safeRemoveItem(SHARED_PREF_CONSENT_TIMESTAMP);

setTypeOfAuth(null);
authIdentifier = null;
Expand Down Expand Up @@ -1066,9 +1062,9 @@ export function initialize(
unknownUserManager.removeUnknownSessionCriteriaData();
setTypeOfAuth(null);
authIdentifier = null;
localStorage.removeItem(SHARED_PREF_EMAIL);
localStorage.removeItem(SHARED_PREF_USER_ID);
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
safeRemoveItem(SHARED_PREF_EMAIL);
safeRemoveItem(SHARED_PREF_USER_ID);
safeRemoveItem(SHARED_PREF_CONSENT_TIMESTAMP);
/* clear fetched in-app messages */
clearMessages();

Expand Down Expand Up @@ -1116,17 +1112,12 @@ export function initialize(
/* if consent is true, we want to clear unknown user data and start tracking */
if (consent) {
unknownUserManager.removeUnknownSessionCriteriaData();
localStorage.removeItem(SHARED_PREFS_CRITERIA);
safeRemoveItem(SHARED_PREFS_CRITERIA);

// Store consent timestamp when user grants consent
const existingConsent = localStorage.getItem(
SHARED_PREF_CONSENT_TIMESTAMP
);
const existingConsent = safeGetItem(SHARED_PREF_CONSENT_TIMESTAMP);
if (!existingConsent) {
localStorage.setItem(
SHARED_PREF_CONSENT_TIMESTAMP,
Date.now().toString()
);
safeSetItem(SHARED_PREF_CONSENT_TIMESTAMP, Date.now().toString());
}
enableUnknownTracking();
} else {
Expand All @@ -1135,9 +1126,9 @@ export function initialize(
if (unknownUsageTracked) {
unknownUserManager.removeUnknownSessionCriteriaData();

localStorage.removeItem(SHARED_PREFS_CRITERIA);
localStorage.removeItem(SHARED_PREF_UNKNOWN_USER_ID);
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
safeRemoveItem(SHARED_PREFS_CRITERIA);
safeRemoveItem(SHARED_PREF_UNKNOWN_USER_ID);
safeRemoveItem(SHARED_PREF_CONSENT_TIMESTAMP);

setTypeOfAuth(null);
authIdentifier = null;
Expand Down
72 changes: 26 additions & 46 deletions src/unknownUserTracking/unknownUserEventManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
SHARED_PREF_EMAIL,
SHARED_PREF_USER_ID
} from '../constants';
import { safeGetItem, safeSetItem, safeRemoveItem } from '../utils/safeStorage';
import { baseIterableRequest } from '../request';
import { getTypeOfAuth } from '../utils/typeOfAuth';
import { IterableResponse } from '../types';
Expand Down Expand Up @@ -103,7 +104,7 @@ export function isUnknownUsageTracked(): boolean {
if (!isEnabled) return false;

// Also check if user has given consent (consent timestamp exists)
const consentTimestamp = localStorage.getItem(SHARED_PREF_CONSENT_TIMESTAMP);
const consentTimestamp = safeGetItem(SHARED_PREF_CONSENT_TIMESTAMP);
return consentTimestamp !== null;
}

Expand All @@ -114,9 +115,7 @@ export class UnknownUserEventManager {

if (!unknownUsageTracked) return;

const strUnknownSessionInfo = localStorage.getItem(
SHARED_PREFS_UNKNOWN_SESSIONS
);
const strUnknownSessionInfo = safeGetItem(SHARED_PREFS_UNKNOWN_SESSIONS);
let unknownSessionInfo: {
itbl_unknown_sessions?: {
number_of_sessions?: number;
Expand Down Expand Up @@ -145,10 +144,7 @@ export class UnknownUserEventManager {
itbl_unknown_sessions: unknownSessionInfo.itbl_unknown_sessions
};

localStorage.setItem(
SHARED_PREFS_UNKNOWN_SESSIONS,
JSON.stringify(outputObject)
);
safeSetItem(SHARED_PREFS_UNKNOWN_SESSIONS, JSON.stringify(outputObject));
} catch (error) {
console.error('Error updating unknown session:', error);
}
Expand All @@ -168,10 +164,7 @@ export class UnknownUserEventManager {
.then((response) => {
const criteriaData: any = response.data;
if (criteriaData) {
localStorage.setItem(
SHARED_PREFS_CRITERIA,
JSON.stringify(criteriaData)
);
safeSetItem(SHARED_PREFS_CRITERIA, JSON.stringify(criteriaData));
}
})
.catch((e) => {
Expand Down Expand Up @@ -220,11 +213,9 @@ export class UnknownUserEventManager {
}

private checkCriteriaCompletion(): string | null {
const criteriaData = localStorage.getItem(SHARED_PREFS_CRITERIA);
const localStoredEventList = localStorage.getItem(
SHARED_PREFS_EVENT_LIST_KEY
);
const localStoredUserUpdate = localStorage.getItem(
const criteriaData = safeGetItem(SHARED_PREFS_CRITERIA);
const localStoredEventList = safeGetItem(SHARED_PREFS_EVENT_LIST_KEY);
const localStoredUserUpdate = safeGetItem(
SHARED_PREFS_USER_UPDATE_OBJECT_KEY
);
try {
Expand All @@ -248,17 +239,15 @@ export class UnknownUserEventManager {

if (!unknownUsageTracked) return;

let userData = localStorage.getItem(SHARED_PREFS_UNKNOWN_SESSIONS);
let userData = safeGetItem(SHARED_PREFS_UNKNOWN_SESSIONS);

// If no session data exists, create it first
if (!userData) {
this.updateUnknownSession();
userData = localStorage.getItem(SHARED_PREFS_UNKNOWN_SESSIONS);
userData = safeGetItem(SHARED_PREFS_UNKNOWN_SESSIONS);
}

const strUserUpdate = localStorage.getItem(
SHARED_PREFS_USER_UPDATE_OBJECT_KEY
);
const strUserUpdate = safeGetItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY);
const dataFields = strUserUpdate ? JSON.parse(strUserUpdate) : {};

delete dataFields[SHARED_PREFS_EVENT_TYPE];
Expand Down Expand Up @@ -317,14 +306,12 @@ export class UnknownUserEventManager {
}

async syncEvents() {
const strTrackEventList = localStorage.getItem(SHARED_PREFS_EVENT_LIST_KEY);
const strTrackEventList = safeGetItem(SHARED_PREFS_EVENT_LIST_KEY);
const trackEventList = strTrackEventList
? JSON.parse(strTrackEventList)
: [];

const strUserUpdate = localStorage.getItem(
SHARED_PREFS_USER_UPDATE_OBJECT_KEY
);
const strUserUpdate = safeGetItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY);
const userUpdateObject = strUserUpdate ? JSON.parse(strUserUpdate) : {};

if (trackEventList.length) {
Expand Down Expand Up @@ -387,9 +374,7 @@ export class UnknownUserEventManager {
if (replayEnabled) {
try {
if (isUserKnown === true) {
const unknownUserCreated = localStorage.getItem(
SHARED_PREF_UNKNOWN_USER_ID
);
const unknownUserCreated = safeGetItem(SHARED_PREF_UNKNOWN_USER_ID);
if (!unknownUserCreated) {
await this.trackConsent(true);
}
Expand All @@ -407,17 +392,17 @@ export class UnknownUserEventManager {
}

removeUnknownSessionCriteriaData() {
localStorage.removeItem(SHARED_PREFS_UNKNOWN_SESSIONS);
localStorage.removeItem(SHARED_PREFS_EVENT_LIST_KEY);
localStorage.removeItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY);
safeRemoveItem(SHARED_PREFS_UNKNOWN_SESSIONS);
safeRemoveItem(SHARED_PREFS_EVENT_LIST_KEY);
safeRemoveItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY);
}

private async storeEventListToLocalStorage(newDataObject: UnknownEventData) {
const unknownUsageTracked = isUnknownUsageTracked();

if (!unknownUsageTracked) return;

const strTrackEventList = localStorage.getItem(SHARED_PREFS_EVENT_LIST_KEY);
const strTrackEventList = safeGetItem(SHARED_PREFS_EVENT_LIST_KEY);
let previousDataArray = [];

if (strTrackEventList) {
Expand All @@ -439,10 +424,7 @@ export class UnknownUserEventManager {
);
}

localStorage.setItem(
SHARED_PREFS_EVENT_LIST_KEY,
JSON.stringify(previousDataArray)
);
safeSetItem(SHARED_PREFS_EVENT_LIST_KEY, JSON.stringify(previousDataArray));
const criteriaId = this.checkCriteriaCompletion();
if (criteriaId !== null) {
this.createUnknownUser(criteriaId);
Expand All @@ -456,9 +438,7 @@ export class UnknownUserEventManager {

if (!unknownUsageTracked) return;

const strUserUpdate = localStorage.getItem(
SHARED_PREFS_USER_UPDATE_OBJECT_KEY
);
const strUserUpdate = safeGetItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY);
let userUpdateObject = {};

if (strUserUpdate) {
Expand All @@ -470,7 +450,7 @@ export class UnknownUserEventManager {
...newDataObject
};

localStorage.setItem(
safeSetItem(
SHARED_PREFS_USER_UPDATE_OBJECT_KEY,
JSON.stringify(userUpdateObject)
);
Expand Down Expand Up @@ -547,7 +527,7 @@ export class UnknownUserEventManager {

// Consent tracking methods
getConsentTimestamp(): string | null {
return localStorage.getItem(SHARED_PREF_CONSENT_TIMESTAMP);
return safeGetItem(SHARED_PREF_CONSENT_TIMESTAMP);
}

hasConsent(): boolean {
Expand All @@ -559,21 +539,21 @@ export class UnknownUserEventManager {

// First priority: actual user credentials from login/signup
if (typeOfAuth === 'email') {
const email = localStorage.getItem(SHARED_PREF_EMAIL);
const email = safeGetItem(SHARED_PREF_EMAIL);
if (email) {
return { email };
}
}

if (typeOfAuth === 'userID') {
const userId = localStorage.getItem(SHARED_PREF_USER_ID);
const userId = safeGetItem(SHARED_PREF_USER_ID);
if (userId) {
return { userId };
}
}

// Fallback: generated unknown user ID (for scenario 1: after /session call)
const unknownUserId = localStorage.getItem(SHARED_PREF_UNKNOWN_USER_ID);
const unknownUserId = safeGetItem(SHARED_PREF_UNKNOWN_USER_ID);
if (unknownUserId) {
return { userId: unknownUserId };
}
Expand Down Expand Up @@ -608,7 +588,7 @@ export class UnknownUserEventManager {
});

// Remove consent timestamp after successful call
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
safeRemoveItem(SHARED_PREF_CONSENT_TIMESTAMP);

return response;
} catch (error) {
Expand Down
7 changes: 4 additions & 3 deletions src/utils/authorizationToken.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import { SHARED_PREF_USER_TOKEN } from '../constants';
import { safeGetItem, safeSetItem, safeRemoveItem } from './safeStorage';

class AuthorizationToken {
public token: string | null = null;

setToken(token: string) {
this.token = token;
localStorage.setItem(SHARED_PREF_USER_TOKEN, token);
safeSetItem(SHARED_PREF_USER_TOKEN, token);
}

getToken(): string | null {
return this.token && this.token.length > 0
? this.token
: localStorage.getItem(SHARED_PREF_USER_TOKEN);
: safeGetItem(SHARED_PREF_USER_TOKEN);
}

clearToken() {
this.token = null;
localStorage.removeItem(SHARED_PREF_USER_TOKEN);
safeRemoveItem(SHARED_PREF_USER_TOKEN);
}
}

Expand Down
Loading
Loading