@flavoai/fastfold
Version:
Flavo frontend package
144 lines • 3.8 kB
TypeScript
export interface ObservabilityEvent {
event_id: string;
app_id: string;
session_id: string;
visitor_id: string;
user_id?: string;
user_email?: string;
event_type: 'pageview' | 'session_start' | 'session_end' | 'error_frontend' | 'error_backend' | 'error_api' | 'custom';
event_name?: string;
timestamp: string;
url?: string;
page_path?: string;
referrer?: string;
user_agent?: string;
pageview_count?: number;
geo?: {
country: string;
lat?: number;
lng?: number;
} | null;
error?: {
message?: string;
stack?: string;
component?: string;
endpoint?: string;
severity?: string;
status_code?: number;
};
properties?: Record<string, unknown>;
}
export interface AnalyticsConfig {
flushIntervalMs?: number;
maxBufferSize?: number;
enabled?: boolean;
}
export declare class AnalyticsBufferManager {
private eventBuffer;
private sessionMap;
private flushTimer;
private sessionCleanupTimer;
private isShuttingDown;
private isFlushing;
private shutdownHandlerRegistered;
private db;
private schema;
private eventCountLastMinute;
private lastMinuteReset;
private static readonly MAX_EVENTS_PER_MINUTE;
private static readonly SESSION_TIMEOUT_MS;
private static readonly MAX_STACK_LENGTH;
private config;
constructor(config?: AnalyticsConfig);
/**
* Initialize with Drizzle database and schema
*/
initialize(db: any, schema: any): void;
/**
* Start timer to cleanup stale sessions (every 5 minutes)
*/
private startSessionCleanupTimer;
/**
* Remove sessions older than SESSION_TIMEOUT_MS
*/
private cleanupStaleSessions;
/**
* Add event to buffer with rate limiting and validation
*/
addEvent(event: ObservabilityEvent): void;
/**
* Validate event has required fields
*/
private validateEvent;
/**
* Add multiple events to buffer
*/
addEvents(events: ObservabilityEvent[]): void;
/**
* Start the periodic flush timer
*/
private startFlushTimer;
/**
* Setup graceful shutdown handler (only once)
*/
private setupShutdownHandler;
/**
* Flush buffered events to database (with concurrency protection)
*/
flush(): Promise<{
analytics: number;
errors: number;
}>;
/**
* Process events and aggregate into database
*/
private processEvents;
/**
* Extract path from URL
*/
private extractPath;
/**
* Upsert analytics daily record (with table existence check)
*/
private upsertAnalyticsDaily;
/**
* Limit number of keys in a JSON object to prevent unbounded growth
*/
private limitJsonKeys;
/**
* Merge existing analytics with new stats
*/
private mergeAnalytics;
/**
* Upsert error record (with table existence check)
*/
private upsertError;
/**
* Get current buffer size (for monitoring)
*/
getBufferSize(): number;
/**
* Destroy the manager
*/
destroy(): Promise<void>;
}
/**
* Initialize analytics buffer manager
*/
export declare function initializeAnalytics(db: any, schema: any, config?: AnalyticsConfig): AnalyticsBufferManager;
/**
* Get the analytics buffer manager instance
*/
export declare function getAnalyticsManager(): AnalyticsBufferManager | null;
/**
* Add events to the analytics buffer
*/
export declare function trackEvents(events: ObservabilityEvent[]): void;
/**
* Force flush analytics buffer
*/
export declare function flushAnalytics(): Promise<{
analytics: number;
errors: number;
}>;
//# sourceMappingURL=analytics.d.ts.map