@jayeshsadhwani/telemetry-sdk
Version:
A lightweight, configurable telemetry tracking library for JavaScript/TypeScript applications with comprehensive error handling, event batching, and graceful degradation
245 lines (225 loc) • 7.29 kB
text/typescript
declare enum LogLevel {
ERROR = 0,
WARN = 1,
INFO = 2,
DEBUG = 3,
SILENT = 4
}
interface LoggerConfig {
level?: LogLevel;
enableConsole?: boolean;
enableTimestamp?: boolean;
prefix?: string;
formatter?: (level: LogLevel, message: string, meta?: Record<string, unknown>) => string;
}
interface Logger {
error(message: string, meta?: Record<string, unknown>): void;
warn(message: string, meta?: Record<string, unknown>): void;
info(message: string, meta?: Record<string, unknown>): void;
debug(message: string, meta?: Record<string, unknown>): void;
setLevel(level: LogLevel): void;
setConfig(config: Partial<LoggerConfig>): void;
}
type TelemetryEvent<T = Record<string, unknown>> = {
eventType: string;
eventName: string;
payload: T;
timestamp: string;
sessionId?: string;
userId?: string;
};
type TelemetryExporter = {
export(events: TelemetryEvent[], endpoint?: string): Promise<void>;
};
type TelemetryPlugin = {
/** Called once, passing in the manager to call `.capture(...)` on */
initialize(manager: {
capture(event: {
eventType: string;
eventName: string;
payload: Record<string, unknown>;
timestamp: string;
}): void;
}): void;
/** Optional cleanup hook */
teardown?(): void;
/** Destroy the plugin and clean up all resources */
destroy?(): void;
};
declare enum ExporterType {
HYPERLOOK = "hyperlook",
HTTP = "http"
}
type TelemetryConfig = {
endpoint?: string;
hyperlookApiKey?: string;
exporters?: ExporterType[];
enablePageViews?: boolean;
enableClicks?: boolean;
enableLogs?: boolean;
enableNetwork?: boolean;
enablePerformance?: boolean;
enableErrors?: boolean;
batchSize?: number;
flushInterval?: number;
maxRetries?: number;
retryDelay?: number;
samplingRate?: number;
logging?: LoggerConfig;
sessionId?: string;
userId?: string;
enableCustomEvents?: boolean;
};
declare enum TelemetryState {
INITIALIZING = "initializing",
RUNNING = "running",
SHUTTING_DOWN = "shutting_down",
SHUTDOWN = "shutdown",
ERROR = "error"
}
declare class TelemetryManager {
private state;
private logger;
private sessionId;
private userId?;
private flushTimer;
private flushInterval;
private failedEvents;
private maxFailedEvents;
private pluginManager;
private eventProcessor;
private exportManager;
constructor(config: TelemetryConfig);
register(plugin: TelemetryPlugin): void;
capture(event: TelemetryEvent): void;
private processEventQueueAsync;
private flushAsync;
private startFlushTimer;
flush(): Promise<void>;
shutdown(): Promise<void>;
destroy(): void;
retryFailedEvents(): void;
getFailedEventsCount(): number;
getQueuedEventsCount(): number;
getBufferedEventsCount(): number;
getState(): TelemetryState;
isShutdown(): boolean;
identify(userId: string, traits?: Record<string, unknown>): void;
getSessionId(): string;
getUserId(): string | undefined;
getCustomEventsPlugin(): CustomEventsPlugin | undefined;
getEndpoint(): string;
private processEarlyEventQueue;
}
declare class HTTPExporter implements TelemetryExporter {
private logger;
constructor();
export(events: TelemetryEvent[], endpoint?: string): Promise<void>;
}
declare function getLogger(): Logger;
declare function setLogger(logger: Logger): void;
declare function createLogger(config?: LoggerConfig): Logger;
declare abstract class BasePlugin {
protected manager: TelemetryManager;
protected logger: Logger;
protected isEnabled: boolean;
protected isInitialized: boolean;
protected isDestroyed: boolean;
constructor();
initialize(manager: TelemetryManager): void;
protected abstract isSupported(): boolean;
protected abstract setup(): void;
protected safeCapture(event: TelemetryEvent): void;
teardown?(): void;
destroy(): void;
isPluginEnabled(): boolean;
}
declare class ClickPlugin extends BasePlugin {
private handler;
protected isSupported(): boolean;
protected setup(): void;
teardown(): void;
}
declare class LogPlugin extends BasePlugin {
private originals;
protected isSupported(): boolean;
protected setup(): void;
teardown(): void;
}
declare class NetworkPlugin extends BasePlugin {
private originalFetch;
private originalXHROpen;
private originalXHRSend;
private unregister;
private telemetryEndpoint;
private xhrHandlers;
private patchedXHRs;
private cleanupInterval;
protected isSupported(): boolean;
constructor();
initialize(manager: TelemetryManager): void;
protected setup(): void;
private setupCleanupInterval;
private cleanupDeadXHRs;
teardown(): void;
private cleanupAllXHRHandlers;
}
declare class PerformancePlugin extends BasePlugin {
private hasCapturedInitialMetrics;
private longTaskObserver;
private layoutShiftObserver;
private pageLoadTimeout;
protected isSupported(): boolean;
private capturePerformanceMetrics;
protected setup(): void;
teardown(): void;
}
declare class CustomEventsPlugin extends BasePlugin {
private readonly MAX_EVENT_TYPE_LENGTH;
private readonly MAX_EVENT_NAME_LENGTH;
private readonly MAX_PAYLOAD_SIZE;
private readonly RESERVED_EVENT_TYPES;
protected isSupported(): boolean;
private validateEventType;
private validateEventName;
private validatePayload;
/**
* Capture a custom event with the specified type, name, and payload
*/
captureCustomEvent<T = Record<string, unknown>>(eventType: string, eventName: string, payload: T): void;
/**
* Capture a custom event with a pre-built TelemetryEvent object
*/
captureEvent<T = Record<string, unknown>>(event: TelemetryEvent<T>): void;
protected setup(): void;
}
declare class PageViewPlugin extends BasePlugin {
private hasCapturedInitialPageView;
private lastUrl;
private lastTitle;
private popstateListener;
private navigationTimeout;
private originalPushState;
private originalReplaceState;
private domContentLoadedListener;
private loadListener;
private navigationListener;
constructor();
protected isSupported(): boolean;
private capturePageView;
private captureInitialPageView;
private handleNavigation;
protected setup(): void;
private setupNavigationTracking;
private setupHistoryTracking;
teardown(): void;
}
declare class ErrorPlugin extends BasePlugin {
private errorHandler;
private unhandledRejectionHandler;
protected isSupported(): boolean;
protected setup(): void;
teardown(): void;
}
declare function initTelemetry(config?: Partial<TelemetryConfig>): TelemetryManager;
export { BasePlugin, ClickPlugin, CustomEventsPlugin, ErrorPlugin, HTTPExporter, LogLevel, LogPlugin, type Logger, type LoggerConfig, NetworkPlugin, PageViewPlugin, PerformancePlugin, type TelemetryConfig, type TelemetryEvent, type TelemetryExporter, TelemetryManager, type TelemetryPlugin, createLogger, getLogger, initTelemetry, setLogger };