From 2c80aa0b24796612049498717b0c8e0c74c1ea76 Mon Sep 17 00:00:00 2001 From: perso182 Date: Fri, 28 Mar 2025 11:02:56 +0100 Subject: [PATCH 1/5] Use props passed to identify to define session --- src/app/api/send/route.ts | 10 +++++++++- src/tracker/index.js | 15 +++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index bd255eaf..c520a02b 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -18,6 +18,7 @@ const schema = z.object({ payload: z.object({ website: z.string().uuid(), data: anyObjectParam.optional(), + identity: anyObjectParam.optional(), hostname: z.string().max(100).optional(), language: z.string().max(35).optional(), referrer: urlOrPathParam.optional(), @@ -59,6 +60,7 @@ export async function POST(request: Request) { title, tag, timestamp, + identity, } = payload; // Cache check @@ -97,7 +99,13 @@ export async function POST(request: Request) { const sessionSalt = hash(startOfMonth(createdAt).toUTCString()); const visitSalt = hash(startOfHour(createdAt).toUTCString()); - const sessionId = uuid(websiteId, ip, userAgent, sessionSalt); + const sessionId = uuid( + websiteId, + ip, + userAgent, + sessionSalt, + identity ? JSON.stringify(identity) : '', + ); // Find session if (!clickhouse.enabled && !cache?.sessionId) { diff --git a/src/tracker/index.js b/src/tracker/index.js index c423a66b..2f0fe826 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -233,21 +233,28 @@ }; const track = (obj, data) => { + const identity = JSON.parse(localStorage.getItem('umami.identity')); if (typeof obj === 'string') { return send({ ...getPayload(), name: obj, data: typeof data === 'object' ? data : undefined, + identity: identity !== null ? identity : undefined, }); } else if (typeof obj === 'object') { - return send(obj); + return send({ ...obj, identity: identity !== null ? identity : undefined }); } else if (typeof obj === 'function') { - return send(obj(getPayload())); + return send({ ...obj(getPayload()), identity: identity !== null ? identity : undefined }); } - return send(getPayload()); + return send({ ...getPayload(), identity: identity !== null ? identity : undefined }); }; - const identify = data => send({ ...getPayload(), data }, 'identify'); + const identify = data => { + localStorage.setItem('umami.identity', JSON.stringify(data)); + /* Clear cache since this will result in another session */ + cache = ''; + send({ ...getPayload(), data, identity: data }, 'identify'); + }; /* Start */ From 109e8d6d31cbe16c6d86d66871cbc293a3713522 Mon Sep 17 00:00:00 2001 From: perso182 Date: Mon, 31 Mar 2025 10:14:31 +0200 Subject: [PATCH 2/5] Added error handling for JSON.parse --- src/tracker/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tracker/index.js b/src/tracker/index.js index 2f0fe826..fa5a30e9 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -233,7 +233,12 @@ }; const track = (obj, data) => { - const identity = JSON.parse(localStorage.getItem('umami.identity')); + let identity; + try { + identity = JSON.parse(localStorage.getItem('umami.identity')); + } catch (error) { + identity = null; + } if (typeof obj === 'string') { return send({ ...getPayload(), From 224961447cbaf636ee8bd7a6775349f482c19e28 Mon Sep 17 00:00:00 2001 From: perso182 Date: Mon, 31 Mar 2025 11:04:57 +0200 Subject: [PATCH 3/5] Refactored index.js --- src/tracker/index.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/tracker/index.js b/src/tracker/index.js index fa5a30e9..33651e61 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -235,23 +235,24 @@ const track = (obj, data) => { let identity; try { - identity = JSON.parse(localStorage.getItem('umami.identity')); + const parsedIdentity = JSON.parse(localStorage.getItem('umami.identity')); + identity = parsedIdentity !== null ? parsedIdentity : undefined; } catch (error) { - identity = null; + identity = undefined; } if (typeof obj === 'string') { return send({ ...getPayload(), name: obj, data: typeof data === 'object' ? data : undefined, - identity: identity !== null ? identity : undefined, + identity, }); } else if (typeof obj === 'object') { - return send({ ...obj, identity: identity !== null ? identity : undefined }); + return send({ ...obj, identity }); } else if (typeof obj === 'function') { - return send({ ...obj(getPayload()), identity: identity !== null ? identity : undefined }); + return send({ ...obj(getPayload()), identity }); } - return send({ ...getPayload(), identity: identity !== null ? identity : undefined }); + return send({ ...getPayload(), identity }); }; const identify = data => { From 37ae0374d8ab6480dd9ffc424f3d9be68a25fd0b Mon Sep 17 00:00:00 2001 From: perso182 Date: Tue, 1 Apr 2025 11:24:06 +0200 Subject: [PATCH 4/5] Added id as a parameter to identify and include it in the payload. Removed the usage of localstorage --- src/app/api/send/route.ts | 12 +++--------- src/tracker/index.js | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index c520a02b..0d62cd58 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -18,7 +18,7 @@ const schema = z.object({ payload: z.object({ website: z.string().uuid(), data: anyObjectParam.optional(), - identity: anyObjectParam.optional(), + id: z.string().optional(), hostname: z.string().max(100).optional(), language: z.string().max(35).optional(), referrer: urlOrPathParam.optional(), @@ -60,7 +60,7 @@ export async function POST(request: Request) { title, tag, timestamp, - identity, + id, } = payload; // Cache check @@ -99,13 +99,7 @@ export async function POST(request: Request) { const sessionSalt = hash(startOfMonth(createdAt).toUTCString()); const visitSalt = hash(startOfHour(createdAt).toUTCString()); - const sessionId = uuid( - websiteId, - ip, - userAgent, - sessionSalt, - identity ? JSON.stringify(identity) : '', - ); + const sessionId = uuid(websiteId, ip, userAgent, sessionSalt, id ? id : ''); // Find session if (!clickhouse.enabled && !cache?.sessionId) { diff --git a/src/tracker/index.js b/src/tracker/index.js index 33651e61..520d56ea 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -46,6 +46,7 @@ url: currentUrl, referrer: currentRef, tag: tag ? tag : undefined, + id: identity ? identity : undefined, }); const hasDoNotTrack = () => { @@ -233,33 +234,27 @@ }; const track = (obj, data) => { - let identity; - try { - const parsedIdentity = JSON.parse(localStorage.getItem('umami.identity')); - identity = parsedIdentity !== null ? parsedIdentity : undefined; - } catch (error) { - identity = undefined; - } if (typeof obj === 'string') { return send({ ...getPayload(), name: obj, data: typeof data === 'object' ? data : undefined, - identity, }); } else if (typeof obj === 'object') { - return send({ ...obj, identity }); + return send({ ...obj, ...getPayload().id }); } else if (typeof obj === 'function') { - return send({ ...obj(getPayload()), identity }); + return send(obj(getPayload())); } - return send({ ...getPayload(), identity }); + return send(getPayload()); }; - const identify = data => { - localStorage.setItem('umami.identity', JSON.stringify(data)); + const identify = (data, id = undefined) => { + if (id) { + identity = id; + } /* Clear cache since this will result in another session */ cache = ''; - send({ ...getPayload(), data, identity: data }, 'identify'); + send({ ...getPayload(), data }, 'identify'); }; /* Start */ @@ -277,6 +272,7 @@ let cache; let initialized; let disabled = false; + let identity; if (autoTrack && !trackingDisabled()) { if (document.readyState === 'complete') { From d9666682576365863eddaf502aebfed06e66e0a0 Mon Sep 17 00:00:00 2001 From: perso182 Date: Tue, 1 Apr 2025 16:56:17 +0200 Subject: [PATCH 5/5] Added type check for id --- src/tracker/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracker/index.js b/src/tracker/index.js index 520d56ea..533a640a 100644 --- a/src/tracker/index.js +++ b/src/tracker/index.js @@ -249,7 +249,7 @@ }; const identify = (data, id = undefined) => { - if (id) { + if (id && typeof id === 'string') { identity = id; } /* Clear cache since this will result in another session */