From f2450b6e2ea06039f1d2f915bead160d19f822d1 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 20 Mar 2026 18:54:11 -0700 Subject: [PATCH] refactor(web): migrate telemetry + diagnostics to createWebTelemetry/createWebDiagnostics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - telemetry.ts: 54 → 42 lines via createWebTelemetry() (keeps product-specific trackTimerEvent) - diagnostics.ts: 53 → 22 lines via createWebDiagnostics() - 394/394 web tests pass, typecheck clean --- web/src/lib/diagnostics.ts | 59 +++++++++----------------------------- web/src/lib/telemetry.ts | 36 ++++++++--------------- 2 files changed, 26 insertions(+), 69 deletions(-) diff --git a/web/src/lib/diagnostics.ts b/web/src/lib/diagnostics.ts index 17ae1cb..1bfb8e2 100644 --- a/web/src/lib/diagnostics.ts +++ b/web/src/lib/diagnostics.ts @@ -3,51 +3,20 @@ // Polls platform-service for active debug sessions targeting this install. // Privacy: only captures console logs + JS errors when a session is active. -import { DiagnosticsClient } from '@bytelyst/diagnostics-client'; +import { createWebDiagnostics } from '@bytelyst/diagnostics-client'; import { getAuthClient, PRODUCT_ID, getBaseUrl } from './auth-api'; -function getOrCreateInstallId(): string { - const key = `${PRODUCT_ID}_diag_install_id`; - let id = localStorage.getItem(key); - if (!id) { - id = - typeof crypto?.randomUUID === 'function' - ? crypto.randomUUID() - : Math.random().toString(36).slice(2) + Date.now().toString(36); - localStorage.setItem(key, id); - } - return id; -} +const { init: initDiagnostics, stop: stopDiagnostics } = createWebDiagnostics({ + productId: PRODUCT_ID, + channel: 'pwa', + serverUrl: getBaseUrl(), + getAuthToken: () => { + const token = getAuthClient().getAccessToken(); + if (!token) throw new Error('unauthenticated'); + return token; + }, + releaseChannel: 'beta', + captureConsole: true, +}); -export function initDiagnostics(): void { - if (typeof window === 'undefined') return; - DiagnosticsClient.getInstance({ - productId: PRODUCT_ID, - anonymousInstallId: getOrCreateInstallId(), - platform: 'web', - channel: 'pwa', - osFamily: 'unknown', - appVersion: process.env.NEXT_PUBLIC_APP_VERSION ?? '0.1.0', - buildNumber: process.env.NEXT_PUBLIC_BUILD_NUMBER ?? '1', - releaseChannel: process.env.NEXT_PUBLIC_RELEASE_CHANNEL ?? 'beta', - serverUrl: getBaseUrl(), - getAuthToken: () => { - const token = getAuthClient().getAccessToken(); - if (!token) throw new Error('unauthenticated'); - return token; - }, - captureConsole: true, - captureErrors: true, - captureNetwork: false, - pollIntervalMs: 30_000, - }); - void DiagnosticsClient.getInstance().start(); -} - -export function stopDiagnostics(): void { - try { - DiagnosticsClient.getInstance().stop(); - } catch { - // not initialized - } -} +export { initDiagnostics, stopDiagnostics }; diff --git a/web/src/lib/telemetry.ts b/web/src/lib/telemetry.ts index 02eb232..e8de23e 100644 --- a/web/src/lib/telemetry.ts +++ b/web/src/lib/telemetry.ts @@ -2,26 +2,16 @@ // Delegates to @bytelyst/telemetry-client shared package. // Privacy: no PII, only action names + timing. -import { createTelemetryClient, type TelemetryClient } from '@bytelyst/telemetry-client'; +import { createWebTelemetry } from '@bytelyst/telemetry-client'; import { PRODUCT_ID } from './auth-api'; -let _client: TelemetryClient | null = null; - -function getClient(): TelemetryClient { - if (!_client) { - _client = createTelemetryClient({ - productId: PRODUCT_ID, - baseUrl: process.env.NEXT_PUBLIC_PLATFORM_SERVICE_URL ?? 'https://api.chronomind.app', - platform: 'web', - channel: 'pwa', - transport: 'beacon', - appVersion: '0.1.0', - buildNumber: '1', - releaseChannel: 'beta', - }); - } - return _client; -} +const webTelemetry = createWebTelemetry({ + productId: PRODUCT_ID, + channel: 'pwa', + baseUrl: process.env.NEXT_PUBLIC_PLATFORM_SERVICE_URL ?? 'https://api.chronomind.app', + transport: 'beacon', + releaseChannel: 'beta', +}); export function trackEvent( eventType: 'debug' | 'info' | 'warn' | 'error', @@ -34,21 +24,19 @@ export function trackEvent( metrics?: Record; } ): void { - getClient().trackEvent(eventType, module, eventName, options); + webTelemetry.client.trackEvent(eventType, module, eventName, options); } export function trackTimerEvent(eventName: string, tags?: Record, metrics?: Record): void { trackEvent('info', 'timers', eventName, { tags, metrics }); } -export function trackPageView(path: string): void { - trackEvent('info', 'navigation', 'page_view', { tags: { path } }); -} +export const { trackPageView } = webTelemetry; export function flush(): void { - getClient().flush(); + webTelemetry.client.flush(); } export function initTelemetry(): void { - getClient().init(); + webTelemetry.init(); }