From 155da2b03dec838b60b17c6c4ab63be111cbd493 Mon Sep 17 00:00:00 2001 From: Charles Garrett Date: Fri, 26 Jan 2024 13:56:50 -0500 Subject: [PATCH] chore(data): send user agent detail with anonymous usage data as a workaround for chrome's default to reduced user-agent data --- src/index.d.ts | 9 +++++++++ src/utils/analytics.ts | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/index.d.ts b/src/index.d.ts index 0faa5ab17..5187ebc17 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -7,3 +7,12 @@ declare module 'nanoid' { interface Window { zE: (name: string, method: string) => void | undefined; } + +interface ExperimentalNaviagtor extends Navigator { + readonly userAgentData?: NavigatorUAData; +} + +// https://wicg.github.io/ua-client-hints/#navigatoruadata +interface NavigatorUAData extends UALowEntropyJSON { + getHighEntropyValues(hints: string[]): Promise; +} diff --git a/src/utils/analytics.ts b/src/utils/analytics.ts index ca95bfb7c..6a1a9e2ed 100644 --- a/src/utils/analytics.ts +++ b/src/utils/analytics.ts @@ -8,6 +8,7 @@ import { networkId } from './config'; let rudderAnalytics: Analytics | null = null; let anonymousUserId = ''; +let userAgentDetail = ''; let hashId = ''; let anonymousUserIdCreatedAt = ''; let pendingEvents: any = []; @@ -45,7 +46,20 @@ function getAnonymousId() { return anonymousUserId; } +function getUserAgent() { + if (!userAgentDetail) { + const nav: ExperimentalNaviagtor = navigator; + nav.userAgentData && + nav.userAgentData.getHighEntropyValues(['platformVersion', 'model']).then((ua: any) => { + userAgentDetail = ua; + }); + } + return userAgentDetail; +} + export async function init() { + getUserAgent(); + if (window?.rudderAnalytics) return; getAnonymousId(); @@ -93,6 +107,7 @@ export function recordPageView(pageName: string) { rudderAnalytics.page('category', pageName, { hashId: localStorage.getItem('hashId'), url: filterURL(window.location.href), + userAgentDetail, ref: filterURL(document.referrer), }); } catch (e) { @@ -138,6 +153,7 @@ export function recordEventWithProps(eventLabel: string, properties: Record