From 779bd757c1780c00a0f3f01b1bfec9a1a3a1c6ea Mon Sep 17 00:00:00 2001 From: maxx-GENIUS Date: Sat, 10 Oct 2026 15:10:38 -0700 Subject: [PATCH 1/2] feat(telemetry): add TelemetryEvent and TelemetrySink contracts --- src/lib/telemetry.types.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/lib/telemetry.types.ts diff --git a/src/lib/telemetry.types.ts b/src/lib/telemetry.types.ts new file mode 100644 index 0000000..eaca327 --- /dev/null +++ b/src/lib/telemetry.types.ts @@ -0,0 +1,23 @@ +export type ErrorSource = 'transaction' | 'auth' | 'mutation' | 'render' | 'global'; + +export interface ErrorContext { + source: ErrorSource; + operation?: string; + statusCode?: number; + code?: string; + userRejected?: boolean; + metadata?: Record; +} + +export interface TelemetryEvent { + name: string; + message: string; + stack?: string; + context: ErrorContext; + timestamp: number; +} + +export interface TelemetrySink { + capture(event: TelemetryEvent): void; + flush?(): Promise; +} \ No newline at end of file From 3894b8b2eee66be9044932a52f135b3fb617f962 Mon Sep 17 00:00:00 2001 From: maxx-GENIUS Date: Sat, 10 Oct 2026 15:10:39 -0700 Subject: [PATCH 2/2] feat(telemetry): implement reportError dispatcher and registerSink --- src/lib/telemetry.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/lib/telemetry.ts diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts new file mode 100644 index 0000000..0a23757 --- /dev/null +++ b/src/lib/telemetry.ts @@ -0,0 +1,40 @@ +import { TelemetryEvent, TelemetrySink, ErrorContext } from './telemetry.types'; + +class ConsoleSink implements TelemetrySink { + capture(event: TelemetryEvent): void { + if (process.env.NODE_ENV !== 'production') { + console.warn('[Telemetry]', event.context.source, event.context.operation, event.message); + } + } +} + +let activeSink: TelemetrySink = new ConsoleSink(); +let telemetryEnabled = true; + +export function registerSink(sink: TelemetrySink): void { + activeSink = sink; +} + +export function setTelemetryEnabled(enabled: boolean): void { + telemetryEnabled = enabled; +} + +export function reportError(error: unknown, context: ErrorContext): void { + if (!telemetryEnabled || context.userRejected) { + return; + } + + try { + const errObj = error instanceof Error ? error : new Error(String(error)); + const event: TelemetryEvent = { + name: errObj.name, + message: errObj.message, + stack: errObj.stack, + context, + timestamp: Date.now() + }; + activeSink.capture(event); + } catch (sinkErr) { + console.error('Telemetry dispatch failed:', sinkErr); + } +} \ No newline at end of file