import { SessionState } from './session'; /** * Event types emitted by SessionManager */ export type SessionEvent = 'stateChanged' | 'connected' | 'disconnected' | 'reconnecting' | 'connectionQualityChanged' | 'error'; /** * Connection quality levels */ export type ConnectionQuality = 'excellent' | 'good' | 'poor' | 'unknown'; /** * Base event payload */ export interface BaseEventPayload { /** * Session ID */ sessionId: string; /** * Event timestamp */ timestamp: Date; } /** * State change event payload */ export interface StateChangedPayload extends BaseEventPayload { /** * Previous state */ previousState: SessionState; /** * New state */ newState: SessionState; } /** * Connected event payload */ export interface ConnectedPayload extends BaseEventPayload { /** * Room name */ roomName: string; /** * Number of participants in room */ participantCount: number; } /** * Disconnected event payload */ export interface DisconnectedPayload extends BaseEventPayload { /** * Reason for disconnection */ reason?: string; } /** * Reconnecting event payload */ export interface ReconnectingPayload extends BaseEventPayload { /** * Number of reconnection attempts so far */ attempt: number; } /** * Connection quality changed event payload */ export interface ConnectionQualityChangedPayload extends BaseEventPayload { /** * Previous quality level */ previousQuality: ConnectionQuality; /** * New quality level */ newQuality: ConnectionQuality; } /** * Error event payload */ export interface ErrorPayload extends BaseEventPayload { /** * Error that occurred */ error: Error; /** * Whether the error is recoverable */ recoverable: boolean; } /** * Union type of all event payloads */ export type EventPayload = StateChangedPayload | ConnectedPayload | DisconnectedPayload | ReconnectingPayload | ConnectionQualityChangedPayload | ErrorPayload; /** * Event handler function type */ export type EventHandler = (payload: T) => void; /** * Event subscription manager interface */ export interface EventEmitter { /** * Subscribe to an event */ on(event: SessionEvent, handler: EventHandler): () => void; /** * Unsubscribe from an event */ off(event: SessionEvent, handler: EventHandler): void; /** * Emit an event */ emit(event: SessionEvent, payload: EventPayload): void; }