learning_ai_common_plat/packages/telemetry-client/src/web.ts
saravanakumardb1 b9e37bb8b4 feat(telemetry-client,diagnostics-client): add createWebTelemetry + createWebDiagnostics convenience factories
- telemetry-client: createWebTelemetry() wraps createTelemetryClient() with web defaults
- diagnostics-client: createWebDiagnostics() wraps DiagnosticsClient with install ID + web defaults
- Eliminates ~70 lines of boilerplate per web app
- 11/11 telemetry tests pass, 21/21 diagnostics tests pass
2026-03-20 18:47:18 -07:00

82 lines
2.5 KiB
TypeScript

/**
* Convenience factory for web dashboard telemetry.
*
* Eliminates ~30 lines of boilerplate per web app by wrapping
* createTelemetryClient() with sensible web defaults.
*
* @example
* ```ts
* import { createWebTelemetry } from '@bytelyst/telemetry-client';
*
* const { client, init, trackPageView } = createWebTelemetry({
* productId: 'nomgap',
* channel: 'nomgap_web',
* });
* export { client as telemetryClient, init as initTelemetry, trackPageView };
* ```
*/
import { createTelemetryClient } from './client.js';
import type { TelemetryClient } from './types.js';
export interface WebTelemetryConfig {
/** Product identifier (e.g. 'nomgap', 'chronomind'). */
productId: string;
/** Channel identifier (e.g. 'nomgap_web', 'pwa'). */
channel: string;
/** Platform-service base URL. Default: 'http://localhost:4003/api'. */
baseUrl?: string;
/** Telemetry ingest endpoint path. Default: '/telemetry/events'. */
endpoint?: string;
/** Transport: 'beacon' or 'fetch'. Default: 'fetch'. */
transport?: 'beacon' | 'fetch';
/** App version string. Default: '0.1.0'. */
appVersion?: string;
/** Build number. Default: '1'. */
buildNumber?: string;
/** Release channel. Default: 'dev'. */
releaseChannel?: string;
/** OS family. Default: 'other'. */
osFamily?: string;
}
export interface WebTelemetry {
/** The underlying telemetry client instance. */
client: TelemetryClient;
/** Initialize telemetry and track app_initialized event. Idempotent. */
init(): TelemetryClient;
/** Track a page view event. */
trackPageView(page: string): void;
}
export function createWebTelemetry(config: WebTelemetryConfig): WebTelemetry {
let initialized = false;
const client = createTelemetryClient({
productId: config.productId,
baseUrl: config.baseUrl ?? 'http://localhost:4003/api',
endpoint: config.endpoint ?? '/telemetry/events',
platform: 'web',
channel: config.channel,
transport: config.transport ?? 'fetch',
appVersion: config.appVersion ?? '0.1.0',
buildNumber: config.buildNumber ?? '1',
releaseChannel: config.releaseChannel ?? 'dev',
osFamily: config.osFamily ?? 'other',
});
function init(): TelemetryClient {
if (initialized) return client;
client.init();
client.trackEvent('info', 'app_shell', 'web_app_initialized');
initialized = true;
return client;
}
function trackPageView(page: string): void {
client.trackEvent('info', 'navigation', 'page_view', { feature: page });
}
return { client, init, trackPageView };
}