diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index dc7c23f40e..a99452b098 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,27 +1,25 @@ import crypto from 'node:crypto'; -import { posthogServerClient } from '$lib/experiments'; import { getAllChangelogEntries } from './changelog/utils'; export const trailingSlash = 'never'; -const generateDistinctId = (fingerprintData: Record) => { - return crypto.createHash('sha256').update(JSON.stringify(fingerprintData)).digest('hex'); +const generateDistinctId = (request: Request, clientAddress?: string) => { + const headers = Object.fromEntries(request.headers); + + const identifiers = [ + clientAddress || 'unknown-ip', + headers['user-agent'] || 'unknown-ua', + + !clientAddress ? Math.random().toString() : '', + request.headers.get('cookie')?.match(/sessionid=([^;]+)/)?.[1] || '' + ].join('|'); + + return crypto.createHash('sha256').update(identifiers).digest('hex'); }; export const load = async ({ request, getClientAddress }) => { - const clientAddress = getClientAddress(); - const headers = Object.fromEntries(request.headers); - const fingerprintData = { - ip: clientAddress, - userAgent: headers['user-agent'], - acceptLanguage: headers['accept-language'], - platform: headers['sec-ch-ua-platform'], - mobile: headers['sec-ch-ua-mobile'], - browserBrand: headers['sec-ch-ua'] - }; - - const distinctId = generateDistinctId(fingerprintData); + const distinctId = generateDistinctId(request, getClientAddress()); const ctaVariant = await posthogServerClient?.getFeatureFlag('cta-copy_ab-test', distinctId); const ctaCopy =