vg-x07df 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/auth.manager.ts","../src/utils/logger.ts","../src/state/types.ts","../src/state/store.ts","../src/state/errors.ts","../src/core/socketio/handlers/base.handler.ts","../src/utils/participant-adapter.ts","../src/core/events/event-bus.ts","../src/core/events/types.ts","../src/core/socketio/handlers/schema.ts","../src/core/socketio/handlers/call-incoming.handler.ts","../src/core/socketio/handlers/call-accepted.handler.ts","../src/core/socketio/handlers/call-declined.handler.ts","../src/core/socketio/handlers/call-ended.handler.ts","../src/core/socketio/handlers/call-join-info.handler.ts","../src/core/socketio/handlers/call-timeout.handler.ts","../src/core/socketio/handlers/call-canceled.handler.ts","../src/core/socketio/handlers/handler.registry.ts","../src/core/socketio/socket.manager.ts","../src/generated/api/core/ApiError.ts","../src/generated/api/core/CancelablePromise.ts","../src/generated/api/core/OpenAPI.ts","../src/generated/api/core/request.ts","../src/generated/api/services.ts","../src/core/signal/signal.client.ts","../src/core/signal/api.config.ts","../src/services/call-actions.ts","../src/services/sdk-builder.ts","../src/provider/RtcProvider.tsx","../src/hooks/useCallState.ts","../src/hooks/useCallActions.ts","../src/hooks/useEvent.ts"],"names":["create","immer","logger","SdkEventType","z","io","request","resolve","headers","createContext","useMemo","useEffect","React","useContext","useState","useRef"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AuthProvider, Nullable } from \"./types\";\r\n\r\nexport class AuthManager {\r\n private readonly authProvider: AuthProvider;\r\n private lastToken: Nullable<string> = null;\r\n\r\n constructor(authProvider: AuthProvider) {\r\n this.authProvider = authProvider;\r\n }\r\n\r\n getCurrentToken(): string | null {\r\n const token = this.authProvider();\r\n if (token !== this.lastToken) {\r\n this.lastToken = token;\r\n }\r\n\r\n return token;\r\n }\r\n}\r\n","/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","export type SessionStatus =\r\n | \"IDLE\"\r\n | \"CALLING\" // Caller initiated, waiting for acceptance\r\n | \"RINGING\" // Incoming call (callee perspective)\r\n | \"ACCEPTED\" // Call accepted but not yet joined media\r\n | \"AWAITING_JOIN_INFO\" // Waiting for join credentials\r\n | \"READY_TO_JOIN\" // Has join-info but not connected to media\r\n | \"CONNECTING\" // Joining LiveKit room\r\n | \"ACTIVE\" // Successfully connected to the media session\r\n | \"ENDED\";\r\n\r\nexport interface ParticipantInfo {\r\n id: string;\r\n firstName?: string;\r\n lastName?: string;\r\n avatarUrl?: string;\r\n email?: string;\r\n}\r\n\r\nexport interface Participant {\r\n id: string;\r\n info?: ParticipantInfo;\r\n // Call state\r\n role: \"CALLER\" | \"CALLEE\" | \"HOST\" | \"MEMBER\";\r\n // Media state\r\n audioEnabled: boolean;\r\n videoEnabled: boolean;\r\n isSpeaking: boolean;\r\n connectionQuality?: \"excellent\" | \"good\" | \"poor\" | \"lost\" | \"unknown\";\r\n // Timestamps\r\n joinedAt: number;\r\n}\r\n\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n callId: string;\r\n url?: string;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface TrackReference {\r\n participant: Participant;\r\n publication: import(\"livekit-client\").TrackPublication;\r\n source: import(\"livekit-client\").Track.Source;\r\n track?: import(\"livekit-client\").Track;\r\n}\r\n\r\nexport interface RtcState {\r\n session: {\r\n id?: string;\r\n status: SessionStatus;\r\n mode?: \"AUDIO\" | \"VIDEO\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n // Identity context: how did I get into this call?\r\n myRole?: \"CALLER\" | \"CALLEE\";\r\n initiatedByMe: boolean;\r\n };\r\n\r\n room: {\r\n participants: Record<string, Participant>;\r\n };\r\n\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n session: { status: \"IDLE\", initiatedByMe: false },\r\n room: {\r\n participants: {},\r\n },\r\n errors: [],\r\n};\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import type { LogLevel } from \"../utils/logger\";\r\nimport { rtcStore } from \"./store\";\r\nimport type { RtcError } from \"./types\";\r\n\r\n// Re-export RtcError type for external consumption\r\nexport type { RtcError } from \"./types\";\r\n\r\nexport type ErrorCode =\r\n | \"NETWORK\"\r\n | \"SOCKET_PAYLOAD\"\r\n | \"JOIN_FLOW\"\r\n | \"LIVEKIT_CONNECT\"\r\n | \"LIVEKIT_MEDIA\"\r\n | \"MEDIA_PERMISSION\"\r\n | \"DEVICE_SWITCH\"\r\n | \"API_ERROR\"\r\n | \"UNEXPECTED\";\r\n\r\nexport function pushError(\r\n code: ErrorCode,\r\n message: string,\r\n context?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const error: RtcError = {\r\n code,\r\n message,\r\n timestamp: Date.now(),\r\n context,\r\n };\r\n\r\n // Log the error if logger is provided\r\n logger?.(\"error\", message, { code, context });\r\n rtcStore.getState().addError(error);\r\n}\r\n\r\n/**\r\n * Clear errors from the store\r\n * @param predicate Optional filter function - if provided, only matching errors are removed\r\n */\r\nexport function clearErrors(predicate?: (error: RtcError) => boolean): void {\r\n rtcStore.getState().patch((state) => {\r\n if (predicate) {\r\n // Remove only errors matching the predicate\r\n state.errors = state.errors.filter((error) => !predicate(error));\r\n } else {\r\n // Clear all errors\r\n state.errors = [];\r\n }\r\n });\r\n}\r\n\r\n// Convenience helpers for common error scenarios\r\nexport function pushSocketValidationError(\r\n eventType: string,\r\n issues: any,\r\n payload?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"SOCKET_PAYLOAD\",\r\n `Invalid ${eventType} event payload`,\r\n { eventType, issues, payload },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushIdentityGuardError(\r\n reason: string,\r\n expected?: string,\r\n received?: string,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"JOIN_FLOW\", // Use new error code\r\n `Identity guard failed: ${reason}`,\r\n { expected, received },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushLiveKitConnectError(\r\n message: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"LIVEKIT_CONNECT\",\r\n `LiveKit connection failed: ${message}`,\r\n { originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushStaleEventError(\r\n eventType: string,\r\n reason: string,\r\n context?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"JOIN_FLOW\", // Use new error code\r\n `Ignored stale ${eventType} event: ${reason}`,\r\n context,\r\n logger\r\n );\r\n}\r\n\r\nexport function pushApiError(\r\n operation: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"API_ERROR\",\r\n `API ${operation} failed: ${errorMessage}`,\r\n { operation, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushNetworkError(\r\n operation: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"NETWORK\",\r\n `Network error during ${operation}: ${errorMessage}`,\r\n { operation, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushMediaPermissionError(\r\n device: string,\r\n error?: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"MEDIA_PERMISSION\",\r\n `${device} permission denied`,\r\n { device, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushDeviceError(\r\n operation: string,\r\n device: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"DEVICE_SWITCH\",\r\n `Failed to ${operation} ${device}: ${errorMessage}`,\r\n { operation, device, originalError: error },\r\n logger\r\n );\r\n}\r\n","import type { ZodSchema } from \"zod\";\r\nimport { pushSocketValidationError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport { createLogger } from \"../../../utils/logger\";\r\nimport type { CallpadLogger } from \"../../../utils/logger\";\r\nimport type { AuthManager } from \"../../auth.manager\";\r\n\r\nexport interface SocketHandlerOptions {\r\n livekit?: any;\r\n authManager?: AuthManager;\r\n}\r\n\r\nexport abstract class BaseSocketHandler<T = any> {\r\n protected abstract readonly eventName: string;\r\n protected abstract readonly schema: ZodSchema<T>;\r\n private _logger?: CallpadLogger;\r\n\r\n constructor(protected readonly options: SocketHandlerOptions = {}) {}\r\n\r\n protected get logger(): CallpadLogger {\r\n if (!this._logger) {\r\n this._logger = createLogger(`socketio:${this.eventName}`);\r\n }\r\n return this._logger;\r\n }\r\n\r\n async handleRaw(rawData: unknown): Promise<void> {\r\n this.logger.info(`${this.eventName} received`, rawData);\r\n\r\n const result = this.schema.safeParse(rawData);\r\n if (!result.success) {\r\n this.logger.error(\r\n `${this.eventName} validation failed`,\r\n result.error.issues\r\n );\r\n pushSocketValidationError(\r\n this.eventName,\r\n result.error.issues,\r\n rawData,\r\n (level, message, meta) => {\r\n switch (level) {\r\n case \"debug\":\r\n this.logger.debug(message, meta);\r\n break;\r\n case \"info\":\r\n this.logger.info(message, meta);\r\n break;\r\n case \"warn\":\r\n this.logger.warn(message, meta);\r\n break;\r\n case \"error\":\r\n this.logger.error(message, meta);\r\n break;\r\n }\r\n }\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n await this.handle(result.data);\r\n this.logger.debug(`${this.eventName} handled successfully`);\r\n } catch (error) {\r\n this.logger.error(`${this.eventName} handler error`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n protected abstract handle(data: T): Promise<void> | void;\r\n\r\n protected updateStore(updater: (state: any) => void): void {\r\n rtcStore.getState().patch(updater);\r\n }\r\n\r\n protected get livekit() {\r\n return this.options.livekit;\r\n }\r\n}\r\n","/**\r\n * Utility functions for extracting caller information from socket event participants\r\n */\r\n\r\nimport type { z } from \"zod\";\r\nimport type { socketParticipantSchema } from \"../core/socketio/handlers/schema\";\r\n\r\n// Use the actual socket schema type instead of a separate interface\r\ntype SocketParticipant = z.infer<typeof socketParticipantSchema>;\r\n\r\n/**\r\n * Find caller from participants array in socket events\r\n */\r\nexport function findCaller(\r\n participants: SocketParticipant[]\r\n): SocketParticipant | null {\r\n return (\r\n participants.find((p) => p.role === \"CALLER\" || p.role === \"HOST\") || null\r\n );\r\n}\r\n\r\n/**\r\n * Extract caller info for incoming call events\r\n */\r\nexport function extractCallerInfo(participants: SocketParticipant[]): {\r\n id: string;\r\n name: string;\r\n avatarUrl?: string;\r\n} | null {\r\n const caller = findCaller(participants);\r\n if (!caller) return null;\r\n\r\n const result: { id: string; name: string; avatarUrl?: string } = {\r\n id: caller.id,\r\n name:\r\n [caller.firstName, caller.lastName].filter(Boolean).join(\" \") ||\r\n `Guest ${caller.id}`,\r\n };\r\n\r\n if (caller.profilePhoto) {\r\n result.avatarUrl = caller.profilePhoto;\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * SDK Event Bus Implementation\r\n *\r\n * Provides a centralized event system for internal SDK communication.\r\n * Supports type-safe event subscription, filtering, and debugging.\r\n */\r\n\r\nimport { createLogger } from \"../../utils/logger\";\r\nimport type {\r\n EventFilter,\r\n EventHandler,\r\n EventSubscription,\r\n SdkEvent,\r\n SdkEventType,\r\n} from \"./types\";\r\n\r\nconst logger = createLogger(\"core:event-bus\");\r\n\r\nexport class EventBus {\r\n private listeners = new Map<string, Set<EventHandler>>();\r\n private isDebugMode = false;\r\n private eventHistory: SdkEvent[] = [];\r\n private maxHistorySize = 100;\r\n\r\n constructor(debugMode = false) {\r\n this.isDebugMode = debugMode;\r\n }\r\n\r\n /**\r\n * Subscribe to events of a specific type\r\n */\r\n on<T = any>(\r\n eventType: string | SdkEventType,\r\n handler: EventHandler<T>,\r\n filter?: EventFilter<T>\r\n ): EventSubscription {\r\n const actualHandler = filter\r\n ? (event: SdkEvent<T>) => {\r\n if (filter(event)) {\r\n handler(event);\r\n }\r\n }\r\n : handler;\r\n\r\n if (!this.listeners.has(eventType)) {\r\n this.listeners.set(eventType, new Set());\r\n }\r\n\r\n this.listeners.get(eventType)?.add(actualHandler);\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`Event listener added for: ${eventType}`, {\r\n eventType,\r\n totalListeners: this.listeners.get(eventType)?.size,\r\n });\r\n }\r\n\r\n return {\r\n unsubscribe: () => {\r\n const handlers = this.listeners.get(eventType);\r\n if (handlers) {\r\n handlers.delete(actualHandler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(eventType);\r\n }\r\n }\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`Event listener removed for: ${eventType}`, {\r\n eventType,\r\n remainingListeners: handlers?.size || 0,\r\n });\r\n }\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Subscribe to events matching a pattern (e.g., \"call:*\")\r\n */\r\n onPattern<T = any>(\r\n pattern: string,\r\n handler: EventHandler<T>,\r\n filter?: EventFilter<T>\r\n ): EventSubscription {\r\n const regex = new RegExp(pattern.replace(/\\*/g, \".*\"));\r\n const patternHandler: EventHandler<T> = (event: SdkEvent<T>) => {\r\n if (regex.test(event.type)) {\r\n if (filter && !filter(event)) return;\r\n handler(event);\r\n }\r\n };\r\n\r\n // Store pattern handlers separately to avoid conflicts\r\n const patternKey = `__pattern__${pattern}`;\r\n if (!this.listeners.has(patternKey)) {\r\n this.listeners.set(patternKey, new Set());\r\n }\r\n\r\n this.listeners.get(patternKey)?.add(patternHandler);\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`Pattern listener added: ${pattern}`, { pattern });\r\n }\r\n\r\n return {\r\n unsubscribe: () => {\r\n const handlers = this.listeners.get(patternKey);\r\n if (handlers) {\r\n handlers.delete(patternHandler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(patternKey);\r\n }\r\n }\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`Pattern listener removed: ${pattern}`, { pattern });\r\n }\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Subscribe to a single event occurrence\r\n */\r\n once<T = any>(\r\n eventType: string | SdkEventType,\r\n handler: EventHandler<T>,\r\n filter?: EventFilter<T>\r\n ): EventSubscription {\r\n const subscription = this.on(\r\n eventType,\r\n (event: SdkEvent<T>) => {\r\n handler(event);\r\n subscription.unsubscribe();\r\n },\r\n filter\r\n );\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n emit<T = any>(\r\n eventType: string | SdkEventType,\r\n payload: T,\r\n source: \"socket\" | \"livekit\" | \"user\" = \"user\"\r\n ): void {\r\n const event: SdkEvent<T> = {\r\n type: eventType.toString(),\r\n payload,\r\n timestamp: Date.now(),\r\n source,\r\n };\r\n\r\n // Add to history for debugging\r\n this.addToHistory(event);\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`Event emitted: ${eventType}`, {\r\n eventType,\r\n payload,\r\n source,\r\n timestamp: event.timestamp,\r\n });\r\n }\r\n\r\n // Emit to exact type listeners\r\n const exactListeners = this.listeners.get(eventType.toString());\r\n if (exactListeners) {\r\n for (const handler of exactListeners) {\r\n try {\r\n handler(event);\r\n } catch (error) {\r\n logger.error(`Error in event handler for ${eventType}`, {\r\n error,\r\n eventType,\r\n payload,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Emit to pattern listeners\r\n this.listeners.forEach((handlers, key) => {\r\n if (key.startsWith(\"__pattern__\")) {\r\n for (const handler of handlers) {\r\n try {\r\n handler(event);\r\n } catch (error) {\r\n logger.error(`Error in pattern handler for ${eventType}`, {\r\n error,\r\n eventType,\r\n pattern: key,\r\n payload,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove all listeners for a specific event type\r\n */\r\n off(eventType: string | SdkEventType): void {\r\n this.listeners.delete(eventType.toString());\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(`All listeners removed for: ${eventType}`, { eventType });\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners\r\n */\r\n removeAllListeners(): void {\r\n const totalListeners = Array.from(this.listeners.values()).reduce(\r\n (sum, handlers) => sum + handlers.size,\r\n 0\r\n );\r\n\r\n this.listeners.clear();\r\n\r\n if (this.isDebugMode) {\r\n logger.debug(\"All listeners removed\", { removedCount: totalListeners });\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of listeners for an event type\r\n */\r\n listenerCount(eventType: string | SdkEventType): number {\r\n return this.listeners.get(eventType.toString())?.size || 0;\r\n }\r\n\r\n /**\r\n * Get all event types that have listeners\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n /**\r\n * Enable or disable debug mode\r\n */\r\n setDebugMode(enabled: boolean): void {\r\n this.isDebugMode = enabled;\r\n logger.debug(`Debug mode ${enabled ? \"enabled\" : \"disabled\"}`);\r\n }\r\n\r\n /**\r\n * Get event history for debugging\r\n */\r\n getEventHistory(): SdkEvent[] {\r\n return [...this.eventHistory];\r\n }\r\n\r\n /**\r\n * Clear event history\r\n */\r\n clearHistory(): void {\r\n this.eventHistory = [];\r\n if (this.isDebugMode) {\r\n logger.debug(\"Event history cleared\");\r\n }\r\n }\r\n\r\n /**\r\n * Get events matching a filter\r\n */\r\n getEventsWhere(filter: EventFilter): SdkEvent[] {\r\n return this.eventHistory.filter(filter);\r\n }\r\n\r\n private addToHistory(event: SdkEvent): void {\r\n this.eventHistory.push(event);\r\n\r\n // Keep history size manageable\r\n if (this.eventHistory.length > this.maxHistorySize) {\r\n this.eventHistory.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Set maximum history size\r\n */\r\n setMaxHistorySize(size: number): void {\r\n this.maxHistorySize = size;\r\n\r\n // Trim existing history if needed\r\n if (this.eventHistory.length > size) {\r\n this.eventHistory = this.eventHistory.slice(-size);\r\n }\r\n }\r\n}\r\n\r\n// Global event bus instance\r\nexport const eventBus = new EventBus(false);\r\n","/**\r\n * SDK Event System Types\r\n *\r\n * This file defines the event types and interfaces for the internal SDK event system.\r\n * The event system provides extensibility and allows components to communicate\r\n * through a unified, type-safe event bus.\r\n */\r\n\r\nexport interface SdkEvent<T = any> {\r\n type: string;\r\n payload: T;\r\n timestamp: number;\r\n source: \"socket\" | \"livekit\" | \"user\";\r\n}\r\n\r\n/**\r\n * SDK Event Types\r\n * Following the pattern from other WebRTC SDKs like LiveKit\r\n */\r\nexport enum SdkEventType {\r\n // Call lifecycle events\r\n CALL_INITIATED = \"call:initiated\",\r\n CALL_INCOMING = \"call:incoming\",\r\n CALL_DECLINED = \"call:declined\",\r\n CALL_ENDED = \"call:ended\",\r\n CALL_CANCELED = \"call:canceled\",\r\n CALL_TIMEOUT = \"call:timeout\",\r\n JOIN_INFO_RECEIVED = \"join-info:received\",\r\n\r\n // Participant events\r\n PARTICIPANT_UPDATED = \"participant:updated\",\r\n PARTICIPANT_INVITED = \"participant:invited\",\r\n\r\n // Media events\r\n MEDIA_ENABLED = \"media:enabled\",\r\n MEDIA_DISABLED = \"media:disabled\",\r\n MEDIA_DEVICE_CHANGED = \"media:device-changed\",\r\n MEDIA_PERMISSION_GRANTED = \"media:permission-granted\",\r\n MEDIA_PERMISSION_DENIED = \"media:permission-denied\",\r\n\r\n // Connection events\r\n CONNECTION_ESTABLISHED = \"connection:established\",\r\n CONNECTION_LOST = \"connection:lost\",\r\n CONNECTION_RECONNECTING = \"connection:reconnecting\",\r\n CONNECTION_QUALITY_CHANGED = \"connection:quality-changed\",\r\n\r\n // Error events\r\n ERROR_OCCURRED = \"error:occurred\",\r\n}\r\n\r\n/**\r\n * Specific event payload types\r\n */\r\nexport interface CallInitiatedEvent {\r\n callId: string;\r\n participants: string[];\r\n type: \"AUDIO\" | \"VIDEO\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface CallIncomingEvent {\r\n callId: string;\r\n caller: {\r\n id: string;\r\n name: string;\r\n avatarUrl?: string;\r\n };\r\n type: \"AUDIO\" | \"VIDEO\";\r\n timestamp: number;\r\n // Additional participants info for context (but not stored in state)\r\n participants?: Array<{\r\n id: string;\r\n firstName?: string;\r\n lastName?: string;\r\n avatarUrl?: string;\r\n role?: \"CALLER\" | \"CALLEE\" | \"HOST\" | \"MEMBER\";\r\n }>;\r\n}\r\n\r\nexport interface CallDeclinedEvent {\r\n callId: string;\r\n participantId?: string;\r\n reason?: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface CallEndedEvent {\r\n callId: string;\r\n endedBy?: string;\r\n reason?: \"user\" | \"timeout\" | \"error\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface JoinInfoReceivedEvent {\r\n callId: string;\r\n participantId: string;\r\n timestamp: number;\r\n url: string;\r\n token: string;\r\n}\r\n\r\nexport interface MediaEnabledEvent {\r\n participantId: string;\r\n mediaType: \"audio\" | \"video\" | \"screen\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface MediaDisabledEvent {\r\n participantId: string;\r\n mediaType: \"audio\" | \"video\" | \"screen\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface ConnectionQualityChangedEvent {\r\n participantId: string;\r\n quality: \"excellent\" | \"good\" | \"poor\" | \"lost\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface ErrorOccurredEvent {\r\n code: string;\r\n message: string;\r\n details?: any;\r\n source: \"socket\" | \"livekit\" | \"user\";\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Event handler type\r\n */\r\nexport type EventHandler<T = any> = (event: SdkEvent<T>) => void;\r\n\r\n/**\r\n * Event subscription interface\r\n */\r\nexport interface EventSubscription {\r\n unsubscribe: () => void;\r\n}\r\n\r\n/**\r\n * Event filter function type\r\n */\r\nexport type EventFilter<T = any> = (event: SdkEvent<T>) => boolean;\r\n\r\nexport interface ParticipantInvitedEvent {\r\n callId: string;\r\n participant: {\r\n id: string;\r\n name: string;\r\n avatarUrl?: string;\r\n };\r\n timestamp: number;\r\n}\r\n","import { z } from \"zod\";\r\n\r\n// Participant with a role for socket events\r\nexport const socketParticipantSchema = z.object({\r\n id: z.string(),\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n role: z.enum([\"CALLER\", \"CALLEE\", \"HOST\", \"MEMBER\"]).optional(),\r\n});\r\n\r\n// call.incoming event schema\r\nexport const callIncomingSchema = z.object({\r\n callId: z.string(),\r\n type: z.enum([\"AUDIO\", \"VIDEO\"]),\r\n participants: z.array(socketParticipantSchema).min(1), // Required, at least 1 participant\r\n timestamp: z.number(),\r\n});\r\n\r\n// call.participant-accepted event schema\r\nexport const callParticipantAcceptedSchema = z.object({\r\n callId: z.string(),\r\n participantId: z.string(),\r\n participant: socketParticipantSchema,\r\n acceptedAt: z.string().optional(),\r\n});\r\n\r\n// call.join-info event schema\r\nexport const callJoinInfoSchema = z.object({\r\n callId: z.string(),\r\n token: z.string(),\r\n url: z.string().optional(),\r\n roomName: z.string(),\r\n expiresAt: z.number().optional(),\r\n});\r\n\r\n// call.ended event schema\r\nexport const callEndedSchema = z\r\n .object({\r\n callId: z.string(),\r\n reason: z.string().optional(),\r\n endedAt: z.string().optional(),\r\n })\r\n .passthrough(); // Allow additional fields to pass through\r\n\r\n// call.timeout event schema\r\nexport const callTimeoutSchema = z.object({\r\n callId: z.string(),\r\n reason: z.string().optional(),\r\n timestamp: z.number().optional(),\r\n});\r\n\r\n// call.participant-declined event schema\r\nexport const callParticipantDeclinedSchema = z.object({\r\n callId: z.string(),\r\n participantId: z.string(),\r\n participant: socketParticipantSchema,\r\n declinedAt: z.string().optional(),\r\n});\r\n\r\n// call.canceled event schema\r\nexport const callCanceledSchema = z.object({\r\n callId: z.string(),\r\n reason: z.string().optional(),\r\n timestamp: z.number().optional(),\r\n by: socketParticipantSchema.optional(),\r\n});\r\n\r\n// Inferred types for use in handlers\r\nexport type CallIncomingEvent = z.infer<typeof callIncomingSchema>;\r\nexport type CallParticipantAcceptedEvent = z.infer<\r\n typeof callParticipantAcceptedSchema\r\n>;\r\nexport type CallJoinInfoEvent = z.infer<typeof callJoinInfoSchema>;\r\nexport type CallEndedEvent = z.infer<typeof callEndedSchema>;\r\nexport type CallTimeoutEvent = z.infer<typeof callTimeoutSchema>;\r\nexport type CallParticipantDeclinedEvent = z.infer<\r\n typeof callParticipantDeclinedSchema\r\n>;\r\nexport type CallCanceledEvent = z.infer<typeof callCanceledSchema>;\r\n","import { extractCallerInfo } from \"../../../utils/participant-adapter\";\r\nimport { SdkEventType, eventBus } from \"../../events\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callIncomingSchema } from \"./schema\";\r\nimport type { CallIncomingEvent } from \"./schema\";\r\n\r\nexport class CallIncomingHandler extends BaseSocketHandler<CallIncomingEvent> {\r\n protected readonly eventName = \"call.incoming\";\r\n protected readonly schema = callIncomingSchema;\r\n\r\n protected handle(data: CallIncomingEvent): void {\r\n const callerInfo = extractCallerInfo(data.participants);\r\n\r\n if (!callerInfo) {\r\n this.logger.error(\"No active caller found in participants\", data);\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.session = {\r\n id: data.callId,\r\n status: \"RINGING\",\r\n mode: data.type,\r\n initiatedByMe: false,\r\n };\r\n\r\n // Participants will be populated by LiveKit EventBridge when they connect\r\n state.room.participants = {};\r\n });\r\n\r\n eventBus.emit(\r\n SdkEventType.CALL_INCOMING,\r\n {\r\n callId: data.callId,\r\n caller: callerInfo,\r\n type: data.type,\r\n timestamp: data.timestamp,\r\n participants: data.participants,\r\n },\r\n \"socket\"\r\n );\r\n\r\n this.logger.debug(\"Incoming call event emitted\", {\r\n callId: data.callId,\r\n caller: callerInfo.name,\r\n type: data.type,\r\n });\r\n }\r\n}\r\n","import { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callParticipantAcceptedSchema } from \"./schema\";\r\nimport type { CallParticipantAcceptedEvent } from \"./schema\";\r\n\r\nexport class CallParticipantAcceptedHandler extends BaseSocketHandler<CallParticipantAcceptedEvent> {\r\n protected readonly eventName = \"call.participant-accepted\";\r\n protected readonly schema = callParticipantAcceptedSchema;\r\n\r\n protected async handle(data: CallParticipantAcceptedEvent): Promise<void> {\r\n const currentState = rtcStore.getState();\r\n\r\n if (currentState.session.id !== data.callId) {\r\n pushStaleEventError(\"call.participant-accepted\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session.id,\r\n });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.session.status = \"ACCEPTED\";\r\n });\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callParticipantDeclinedSchema } from \"./schema\";\r\nimport type { CallParticipantDeclinedEvent } from \"./schema\";\r\n\r\nexport class CallParticipantDeclinedHandler extends BaseSocketHandler<CallParticipantDeclinedEvent> {\r\n protected readonly eventName = \"call.participant-declined\";\r\n protected readonly schema = callParticipantDeclinedSchema;\r\n\r\n protected handle(data: CallParticipantDeclinedEvent): void {\r\n this.updateStore((state) => {\r\n if (state.session.id === data.callId) {\r\n state.session.status = \"IDLE\";\r\n }\r\n });\r\n\r\n eventBus.emit(\r\n SdkEventType.CALL_DECLINED,\r\n {\r\n callId: data.callId,\r\n participantId: data.participantId,\r\n reason: \"declined\",\r\n timestamp: Date.now(),\r\n },\r\n \"socket\"\r\n );\r\n }\r\n}\r\n","import { pushStaleEventError } from \"../../../state/errors\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callEndedSchema } from \"./schema\";\r\nimport type { CallEndedEvent } from \"./schema\";\r\n\r\nexport class CallEndedHandler extends BaseSocketHandler<CallEndedEvent> {\r\n protected readonly eventName = \"call.ended\";\r\n protected readonly schema = callEndedSchema;\r\n\r\n protected handle(data: CallEndedEvent): void {\r\n this.updateStore((state) => {\r\n if (state.session.id !== data.callId) {\r\n pushStaleEventError(\"call.ended\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: state.session.id,\r\n });\r\n return;\r\n }\r\n\r\n state.session.status = \"ENDED\";\r\n\r\n // Clear participants - LiveKit will handle disconnections\r\n state.room.participants = {};\r\n });\r\n\r\n if (this.livekit) {\r\n this.livekit.disconnect().catch((error: any) => {\r\n this.logger.error(\"Error disconnecting from LiveKit\", { error });\r\n });\r\n }\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callJoinInfoSchema } from \"./schema\";\r\nimport type { CallJoinInfoEvent } from \"./schema\";\r\n\r\nexport class CallJoinInfoHandler extends BaseSocketHandler<CallJoinInfoEvent> {\r\n protected readonly eventName = \"call.join-info\";\r\n protected readonly schema = callJoinInfoSchema;\r\n\r\n protected async handle(data: CallJoinInfoEvent): Promise<void> {\r\n this.updateStore((state) => {\r\n state.session.livekitInfo = {\r\n token: data.token,\r\n url: data.url,\r\n roomName: data.roomName,\r\n callId: data.callId,\r\n };\r\n state.session.status = \"READY_TO_JOIN\";\r\n });\r\n\r\n eventBus.emit(\r\n SdkEventType.JOIN_INFO_RECEIVED,\r\n {\r\n callId: data.callId,\r\n timestamp: Date.now(),\r\n url: data.url,\r\n roomName: data.roomName,\r\n token: data.token,\r\n },\r\n \"socket\"\r\n );\r\n }\r\n}\r\n","import type { Participant } from \"../../../state/types\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callTimeoutSchema } from \"./schema\";\r\nimport type { CallTimeoutEvent } from \"./schema\";\r\n\r\nexport class CallTimeoutHandler extends BaseSocketHandler<CallTimeoutEvent> {\r\n protected readonly eventName = \"call.timeout\";\r\n protected readonly schema = callTimeoutSchema;\r\n\r\n protected handle(data: CallTimeoutEvent): void {\r\n const reason = data.reason || \"timeout\";\r\n this.logger.info(`Call timeout: ${reason}`, { callId: data.callId });\r\n\r\n this.updateStore((state) => {\r\n if (state.session.id === data.callId) {\r\n state.session.status = \"ENDED\";\r\n\r\n state.room.participants = {};\r\n }\r\n });\r\n }\r\n}\r\n","import type { Participant } from \"../../../state/types\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\nimport { callCanceledSchema } from \"./schema\";\r\nimport type { CallCanceledEvent } from \"./schema\";\r\n\r\nexport class CallCanceledHandler extends BaseSocketHandler<CallCanceledEvent> {\r\n protected readonly eventName = \"call.canceled\";\r\n protected readonly schema = callCanceledSchema;\r\n\r\n protected handle(data: CallCanceledEvent): void {\r\n const reason = data.reason || \"canceled\";\r\n this.logger.info(`Call canceled: ${reason}`, {\r\n callId: data.callId,\r\n by: data.by?.id,\r\n });\r\n\r\n this.updateStore((state) => {\r\n if (state.session.id === data.callId) {\r\n state.session.status = \"ENDED\";\r\n\r\n state.room.participants = {};\r\n }\r\n });\r\n }\r\n}\r\n","import type { Socket } from \"socket.io-client\";\r\nimport { createLogger } from \"../../../utils/logger\";\r\nimport type { SocketHandlerOptions } from \"./base.handler\";\r\nimport { CallParticipantAcceptedHandler } from \"./call-accepted.handler\";\r\nimport { CallCanceledHandler } from \"./call-canceled.handler\";\r\nimport { CallParticipantDeclinedHandler } from \"./call-declined.handler\";\r\nimport { CallEndedHandler } from \"./call-ended.handler\";\r\nimport { CallIncomingHandler } from \"./call-incoming.handler\";\r\nimport { CallJoinInfoHandler } from \"./call-join-info.handler\";\r\nimport { CallTimeoutHandler } from \"./call-timeout.handler\";\r\n\r\nconst logger = createLogger(\"socketio:registry\");\r\n\r\nexport class SocketHandlerRegistry {\r\n private handlers = new Map<string, any>();\r\n\r\n constructor(private options: SocketHandlerOptions = {}) {\r\n this.initializeHandlers();\r\n }\r\n\r\n private initializeHandlers(): void {\r\n const handlers = [\r\n new CallIncomingHandler(this.options),\r\n new CallParticipantAcceptedHandler(this.options),\r\n new CallParticipantDeclinedHandler(this.options),\r\n new CallEndedHandler(this.options),\r\n new CallJoinInfoHandler(this.options),\r\n new CallTimeoutHandler(this.options),\r\n new CallCanceledHandler(this.options),\r\n ];\r\n\r\n for (const handler of handlers) {\r\n this.handlers.set((handler as any).eventName, handler);\r\n }\r\n }\r\n\r\n registerEventListeners(socket: Socket): void {\r\n for (const [eventName, handler] of this.handlers) {\r\n socket.on(eventName, (rawData: any) => {\r\n handler.handleRaw(rawData).catch((error: Error) => {\r\n logger.error(`Handler error for ${eventName}:`, error);\r\n });\r\n });\r\n }\r\n }\r\n\r\n removeEventListeners(socket: Socket): void {\r\n for (const eventName of this.handlers.keys()) {\r\n socket.off(eventName);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.handlers.clear();\r\n }\r\n}\r\n","import { type Socket, io } from \"socket.io-client\";\r\nimport { createLogger } from \"../../utils/logger\";\r\nimport type { AuthManager } from \"../auth.manager\";\r\nimport type { Nullable } from \"../types\";\r\nimport { SocketHandlerRegistry } from \"./handlers\";\r\nimport type { SocketHandlerOptions } from \"./handlers/base.handler\";\r\nimport type { ConnectionConfig, ConnectionState } from \"./types\";\r\n\r\nexport class SocketManager {\r\n private static instance: Nullable<SocketManager> = null;\r\n private logger = createLogger(\"socket\");\r\n\r\n private socket: Nullable<Socket> = null;\r\n private connectionState: ConnectionState = \"DISCONNECTED\";\r\n private livekit: any = null;\r\n private handlerRegistry: Nullable<SocketHandlerRegistry> = null;\r\n private authManager: Nullable<AuthManager> = null;\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): SocketManager {\r\n if (!SocketManager.instance) {\r\n SocketManager.instance = new SocketManager();\r\n }\r\n return SocketManager.instance;\r\n }\r\n\r\n async initialize(\r\n baseUrl: string,\r\n authManager: AuthManager,\r\n config: ConnectionConfig = {},\r\n livekit?: any\r\n ): Promise<void> {\r\n this.livekit = livekit;\r\n this.authManager = authManager;\r\n if (this.socket?.connected) {\r\n return;\r\n }\r\n\r\n this.updateConnectionState(\"CONNECTING\");\r\n const token = authManager.getCurrentToken();\r\n if (!token) {\r\n throw new Error(\"No authentication token available\");\r\n }\r\n\r\n try {\r\n this.socket = io(baseUrl, {\r\n auth: { token },\r\n autoConnect: false,\r\n reconnection: true,\r\n reconnectionAttempts: config.reconnectAttempts ?? 5,\r\n reconnectionDelay: config.reconnectDelay ?? 1000,\r\n reconnectionDelayMax: config.reconnectDelayMax ?? 30000,\r\n timeout: config.timeout ?? 10000,\r\n forceNew: true,\r\n path: \"/signal/socket.io\",\r\n transports: [\"websocket\"],\r\n withCredentials: false,\r\n });\r\n\r\n this.setupConnectionHandlers(authManager);\r\n this.setupEventHandlers();\r\n this.socket.connect();\r\n } catch (error) {\r\n this.updateConnectionState(\"ERROR\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupConnectionHandlers(authManager: AuthManager): void {\r\n if (!this.socket) return;\r\n\r\n this.socket.on(\"connect\", () => {\r\n this.updateConnectionState(\"CONNECTED\");\r\n this.logger.info(\"Connected to server\");\r\n });\r\n\r\n this.socket.on(\"disconnect\", (reason: string) => {\r\n this.updateConnectionState(\"DISCONNECTED\");\r\n this.logger.info(\"Disconnected\", { reason });\r\n });\r\n\r\n this.socket.on(\"connect_error\", (error: Error) => {\r\n this.updateConnectionState(\"ERROR\");\r\n this.logger.error(\"Connection error\", { error: error.message });\r\n });\r\n\r\n this.socket.io.on(\"reconnect_attempt\", () => {\r\n this.updateConnectionState(\"RECONNECTING\");\r\n const freshToken = authManager.getCurrentToken();\r\n if (freshToken && this.socket) {\r\n this.logger.debug(\"Refreshing auth token for reconnection\");\r\n this.socket.auth = { token: freshToken };\r\n }\r\n });\r\n\r\n this.socket.io.on(\"reconnect\", (attemptNumber: number) => {\r\n this.logger.info(\"Reconnected successfully\", { attemptNumber });\r\n });\r\n\r\n this.socket.io.on(\"reconnect_error\", (error: Error) => {\r\n this.logger.error(\"Reconnection error\", { error: error.message });\r\n if (this.isAuthError(error)) {\r\n this.updateConnectionState(\"FAILED\");\r\n }\r\n });\r\n\r\n this.socket.io.on(\"reconnect_failed\", () => {\r\n this.updateConnectionState(\"FAILED\");\r\n this.logger.error(\"All reconnection attempts failed\");\r\n });\r\n }\r\n\r\n private setupEventHandlers(): void {\r\n if (!this.socket) {\r\n return;\r\n }\r\n\r\n this.logger.debug(\"Setting up event handlers via registry\");\r\n\r\n console.log(\"[SOCKET_MANAGER] Setting up event handlers\", {\r\n socketId: this.socket.id,\r\n connected: this.socket.connected,\r\n });\r\n\r\n // Clean up existing handlers to prevent duplicate registrations\r\n if (this.handlerRegistry) {\r\n this.handlerRegistry.removeEventListeners(this.socket);\r\n this.handlerRegistry.destroy();\r\n }\r\n\r\n const options: SocketHandlerOptions = {\r\n livekit: this.livekit,\r\n };\r\n\r\n if (this.authManager) {\r\n options.authManager = this.authManager;\r\n }\r\n\r\n this.handlerRegistry = new SocketHandlerRegistry(options);\r\n\r\n this.handlerRegistry.registerEventListeners(this.socket);\r\n\r\n console.log(\"[SOCKET_MANAGER] Event handlers registered successfully\");\r\n }\r\n\r\n private isAuthError(error: Error): boolean {\r\n const authErrorIndicators = [\r\n \"unauthorized\",\r\n \"authentication\",\r\n \"token\",\r\n \"401\",\r\n \"403\",\r\n ];\r\n const errorMessage = error.message.toLowerCase();\r\n return authErrorIndicators.some((indicator) =>\r\n errorMessage.includes(indicator)\r\n );\r\n }\r\n\r\n private updateConnectionState(newState: ConnectionState): void {\r\n if (this.connectionState !== newState) {\r\n this.connectionState = newState;\r\n this.logger.debug(\"Connection state changed\", { newState });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.socket) {\r\n if (this.handlerRegistry) {\r\n this.handlerRegistry.removeEventListeners(this.socket);\r\n this.handlerRegistry.destroy();\r\n this.handlerRegistry = null;\r\n }\r\n this.socket.removeAllListeners();\r\n this.socket.disconnect();\r\n this.socket = null;\r\n }\r\n this.connectionState = \"DISCONNECTED\";\r\n SocketManager.instance = null;\r\n this.logger.debug(\"Destroyed and cleaned up\");\r\n }\r\n}\r\n","import type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\n\r\nexport class ApiError extends Error {\r\n\tpublic readonly url: string;\r\n\tpublic readonly status: number;\r\n\tpublic readonly statusText: string;\r\n\tpublic readonly body: unknown;\r\n\tpublic readonly request: ApiRequestOptions;\r\n\r\n\tconstructor(request: ApiRequestOptions, response: ApiResult, message: string) {\r\n\t\tsuper(message);\r\n\r\n\t\tthis.name = 'ApiError';\r\n\t\tthis.url = response.url;\r\n\t\tthis.status = response.status;\r\n\t\tthis.statusText = response.statusText;\r\n\t\tthis.body = response.body;\r\n\t\tthis.request = request;\r\n\t}\r\n}","export class CancelError extends Error {\r\n\tconstructor(message: string) {\r\n\t\tsuper(message);\r\n\t\tthis.name = 'CancelError';\r\n\t}\r\n\r\n\tpublic get isCancelled(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport interface OnCancel {\r\n\treadonly isResolved: boolean;\r\n\treadonly isRejected: boolean;\r\n\treadonly isCancelled: boolean;\r\n\r\n\t(cancelHandler: () => void): void;\r\n}\r\n\r\nexport class CancelablePromise<T> implements Promise<T> {\r\n\tprivate _isResolved: boolean;\r\n\tprivate _isRejected: boolean;\r\n\tprivate _isCancelled: boolean;\r\n\treadonly cancelHandlers: (() => void)[];\r\n\treadonly promise: Promise<T>;\r\n\tprivate _resolve?: (value: T | PromiseLike<T>) => void;\r\n\tprivate _reject?: (reason?: unknown) => void;\r\n\r\n\tconstructor(\r\n\t\texecutor: (\r\n\t\t\tresolve: (value: T | PromiseLike<T>) => void,\r\n\t\t\treject: (reason?: unknown) => void,\r\n\t\t\tonCancel: OnCancel\r\n\t\t) => void\r\n\t) {\r\n\t\tthis._isResolved = false;\r\n\t\tthis._isRejected = false;\r\n\t\tthis._isCancelled = false;\r\n\t\tthis.cancelHandlers = [];\r\n\t\tthis.promise = new Promise<T>((resolve, reject) => {\r\n\t\t\tthis._resolve = resolve;\r\n\t\t\tthis._reject = reject;\r\n\r\n\t\t\tconst onResolve = (value: T | PromiseLike<T>): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._isResolved = true;\r\n\t\t\t\tif (this._resolve) this._resolve(value);\r\n\t\t\t};\r\n\r\n\t\t\tconst onReject = (reason?: unknown): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._isRejected = true;\r\n\t\t\t\tif (this._reject) this._reject(reason);\r\n\t\t\t};\r\n\r\n\t\t\tconst onCancel = (cancelHandler: () => void): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.cancelHandlers.push(cancelHandler);\r\n\t\t\t};\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isResolved', {\r\n\t\t\t\tget: (): boolean => this._isResolved,\r\n\t\t\t});\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isRejected', {\r\n\t\t\t\tget: (): boolean => this._isRejected,\r\n\t\t\t});\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isCancelled', {\r\n\t\t\t\tget: (): boolean => this._isCancelled,\r\n\t\t\t});\r\n\r\n\t\t\treturn executor(onResolve, onReject, onCancel as OnCancel);\r\n\t\t});\r\n\t}\r\n\r\n\tget [Symbol.toStringTag]() {\r\n\t\treturn \"Cancellable Promise\";\r\n\t}\r\n\r\n\tpublic then<TResult1 = T, TResult2 = never>(\r\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\r\n\t\tonRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\r\n\t): Promise<TResult1 | TResult2> {\r\n\t\treturn this.promise.then(onFulfilled, onRejected);\r\n\t}\r\n\r\n\tpublic catch<TResult = never>(\r\n\t\tonRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\r\n\t): Promise<T | TResult> {\r\n\t\treturn this.promise.catch(onRejected);\r\n\t}\r\n\r\n\tpublic finally(onFinally?: (() => void) | null): Promise<T> {\r\n\t\treturn this.promise.finally(onFinally);\r\n\t}\r\n\r\n\tpublic cancel(): void {\r\n\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._isCancelled = true;\r\n\t\tif (this.cancelHandlers.length) {\r\n\t\t\ttry {\r\n\t\t\t\tfor (const cancelHandler of this.cancelHandlers) {\r\n\t\t\t\t\tcancelHandler();\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.warn('Cancellation threw an error', error);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.cancelHandlers.length = 0;\r\n\t\tif (this._reject) this._reject(new CancelError('Request aborted'));\r\n\t}\r\n\r\n\tpublic get isCancelled(): boolean {\r\n\t\treturn this._isCancelled;\r\n\t}\r\n}","import type { ApiRequestOptions } from './ApiRequestOptions';\r\n\r\ntype Headers = Record<string, string>;\r\ntype Middleware<T> = (value: T) => T | Promise<T>;\r\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\r\n\r\nexport class Interceptors<T> {\r\n _fns: Middleware<T>[];\r\n\r\n constructor() {\r\n this._fns = [];\r\n }\r\n\r\n eject(fn: Middleware<T>) {\r\n const index = this._fns.indexOf(fn);\r\n if (index !== -1) {\r\n this._fns = [\r\n ...this._fns.slice(0, index),\r\n ...this._fns.slice(index + 1),\r\n ];\r\n }\r\n }\r\n\r\n use(fn: Middleware<T>) {\r\n this._fns = [...this._fns, fn];\r\n }\r\n}\r\n\r\nexport type OpenAPIConfig = {\r\n\tBASE: string;\r\n\tCREDENTIALS: 'include' | 'omit' | 'same-origin';\r\n\tENCODE_PATH?: ((path: string) => string) | undefined;\r\n\tHEADERS?: Headers | Resolver<Headers> | undefined;\r\n\tPASSWORD?: string | Resolver<string> | undefined;\r\n\tTOKEN?: string | Resolver<string> | undefined;\r\n\tUSERNAME?: string | Resolver<string> | undefined;\r\n\tVERSION: string;\r\n\tWITH_CREDENTIALS: boolean;\r\n\tinterceptors: {request: Interceptors<RequestInit>;\r\n\t\tresponse: Interceptors<Response>;};\r\n};\r\n\r\nexport const OpenAPI: OpenAPIConfig = {\r\n\tBASE: '',\r\n\tCREDENTIALS: 'include',\r\n\tENCODE_PATH: undefined,\r\n\tHEADERS: undefined,\r\n\tPASSWORD: undefined,\r\n\tTOKEN: undefined,\r\n\tUSERNAME: undefined,\r\n\tVERSION: '0.0.1',\r\n\tWITH_CREDENTIALS: false,\r\n\tinterceptors: {request: new Interceptors(),response: new Interceptors(),\r\n\t},\r\n};","import { ApiError } from './ApiError';\r\nimport type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\nimport { CancelablePromise } from './CancelablePromise';\r\nimport type { OnCancel } from './CancelablePromise';\r\nimport type { OpenAPIConfig } from './OpenAPI';\r\n\r\nexport const isString = (value: unknown): value is string => {\r\n\treturn typeof value === 'string';\r\n};\r\n\r\nexport const isStringWithValue = (value: unknown): value is string => {\r\n\treturn isString(value) && value !== '';\r\n};\r\n\r\nexport const isBlob = (value: any): value is Blob => {\r\n\treturn value instanceof Blob;\r\n};\r\n\r\nexport const isFormData = (value: unknown): value is FormData => {\r\n\treturn value instanceof FormData;\r\n};\r\n\r\nexport const base64 = (str: string): string => {\r\n\ttry {\r\n\t\treturn btoa(str);\r\n\t} catch (err) {\r\n\t\t// @ts-ignore\r\n\t\treturn Buffer.from(str).toString('base64');\r\n\t}\r\n};\r\n\r\nexport const getQueryString = (params: Record<string, unknown>): string => {\r\n\tconst qs: string[] = [];\r\n\r\n\tconst append = (key: string, value: unknown) => {\r\n\t\tqs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\r\n\t};\r\n\r\n\tconst encodePair = (key: string, value: unknown) => {\r\n\t\tif (value === undefined || value === null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tvalue.forEach(v => encodePair(key, v));\r\n\t\t} else if (typeof value === 'object') {\r\n\t\t\tObject.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));\r\n\t\t} else {\r\n\t\t\tappend(key, value);\r\n\t\t}\r\n\t};\r\n\r\n\tObject.entries(params).forEach(([key, value]) => encodePair(key, value));\r\n\r\n\treturn qs.length ? `?${qs.join('&')}` : '';\r\n};\r\n\r\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\r\n\tconst encoder = config.ENCODE_PATH || encodeURI;\r\n\r\n\tconst path = options.url\r\n\t\t.replace('{api-version}', config.VERSION)\r\n\t\t.replace(/{(.*?)}/g, (substring: string, group: string) => {\r\n\t\t\tif (options.path?.hasOwnProperty(group)) {\r\n\t\t\t\treturn encoder(String(options.path[group]));\r\n\t\t\t}\r\n\t\t\treturn substring;\r\n\t\t});\r\n\r\n\tconst url = config.BASE + path;\r\n\treturn options.query ? url + getQueryString(options.query) : url;\r\n};\r\n\r\nexport const getFormData = (options: ApiRequestOptions): FormData | undefined => {\r\n\tif (options.formData) {\r\n\t\tconst formData = new FormData();\r\n\r\n\t\tconst process = (key: string, value: unknown) => {\r\n\t\t\tif (isString(value) || isBlob(value)) {\r\n\t\t\t\tformData.append(key, value);\r\n\t\t\t} else {\r\n\t\t\t\tformData.append(key, JSON.stringify(value));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tObject.entries(options.formData)\r\n\t\t\t.filter(([, value]) => value !== undefined && value !== null)\r\n\t\t\t.forEach(([key, value]) => {\r\n\t\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\t\tvalue.forEach(v => process(key, v));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tprocess(key, value);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\treturn formData;\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\r\n\r\nexport const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => {\r\n\tif (typeof resolver === 'function') {\r\n\t\treturn (resolver as Resolver<T>)(options);\r\n\t}\r\n\treturn resolver;\r\n};\r\n\r\nexport const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise<Headers> => {\r\n\tconst [token, username, password, additionalHeaders] = await Promise.all([\r\n\t\tresolve(options, config.TOKEN),\r\n\t\tresolve(options, config.USERNAME),\r\n\t\tresolve(options, config.PASSWORD),\r\n\t\tresolve(options, config.HEADERS),\r\n\t]);\r\n\r\n\tconst headers = Object.entries({\r\n\t\tAccept: 'application/json',\r\n\t\t...additionalHeaders,\r\n\t\t...options.headers,\r\n\t})\r\n\t\t.filter(([, value]) => value !== undefined && value !== null)\r\n\t\t.reduce((headers, [key, value]) => ({\r\n\t\t\t...headers,\r\n\t\t\t[key]: String(value),\r\n\t\t}), {} as Record<string, string>);\r\n\r\n\tif (isStringWithValue(token)) {\r\n\t\theaders['Authorization'] = `Bearer ${token}`;\r\n\t}\r\n\r\n\tif (isStringWithValue(username) && isStringWithValue(password)) {\r\n\t\tconst credentials = base64(`${username}:${password}`);\r\n\t\theaders['Authorization'] = `Basic ${credentials}`;\r\n\t}\r\n\r\n\tif (options.body !== undefined) {\r\n\t\tif (options.mediaType) {\r\n\t\t\theaders['Content-Type'] = options.mediaType;\r\n\t\t} else if (isBlob(options.body)) {\r\n\t\t\theaders['Content-Type'] = options.body.type || 'application/octet-stream';\r\n\t\t} else if (isString(options.body)) {\r\n\t\t\theaders['Content-Type'] = 'text/plain';\r\n\t\t} else if (!isFormData(options.body)) {\r\n\t\t\theaders['Content-Type'] = 'application/json';\r\n\t\t}\r\n\t}\r\n\r\n\treturn new Headers(headers);\r\n};\r\n\r\nexport const getRequestBody = (options: ApiRequestOptions): unknown => {\r\n\tif (options.body !== undefined) {\r\n\t\tif (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) {\r\n\t\t\treturn JSON.stringify(options.body)\r\n\t\t} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {\r\n\t\t\treturn options.body;\r\n\t\t} else {\r\n\t\t\treturn JSON.stringify(options.body);\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const sendRequest = async (\r\n\tconfig: OpenAPIConfig,\r\n\toptions: ApiRequestOptions,\r\n\turl: string,\r\n\tbody: any,\r\n\tformData: FormData | undefined,\r\n\theaders: Headers,\r\n\tonCancel: OnCancel\r\n): Promise<Response> => {\r\n\tconst controller = new AbortController();\r\n\r\n\tlet request: RequestInit = {\r\n\t\theaders,\r\n\t\tbody: body ?? formData,\r\n\t\tmethod: options.method,\r\n\t\tsignal: controller.signal,\r\n\t};\r\n\r\n\tif (config.WITH_CREDENTIALS) {\r\n\t\trequest.credentials = config.CREDENTIALS;\r\n\t}\r\n\r\n\tfor (const fn of config.interceptors.request._fns) {\r\n\t\trequest = await fn(request)\r\n\t}\r\n\r\n\tonCancel(() => controller.abort());\r\n\r\n\treturn await fetch(url, request);\r\n};\r\n\r\nexport const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {\r\n\tif (responseHeader) {\r\n\t\tconst content = response.headers.get(responseHeader);\r\n\t\tif (isString(content)) {\r\n\t\t\treturn content;\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const getResponseBody = async (response: Response): Promise<unknown> => {\r\n\tif (response.status !== 204) {\r\n\t\ttry {\r\n\t\t\tconst contentType = response.headers.get('Content-Type');\r\n\t\t\tif (contentType) {\r\n\t\t\t\tconst binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/'];\r\n\t\t\t\tif (contentType.includes('application/json') || contentType.includes('+json')) {\r\n\t\t\t\t\treturn await response.json();\r\n\t\t\t\t} else if (binaryTypes.some(type => contentType.includes(type))) {\r\n\t\t\t\t\treturn await response.blob();\r\n\t\t\t\t} else if (contentType.includes('multipart/form-data')) {\r\n\t\t\t\t\treturn await response.formData();\r\n\t\t\t\t} else if (contentType.includes('text/')) {\r\n\t\t\t\t\treturn await response.text();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(error);\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {\r\n\tconst errors: Record<number, string> = {\r\n\t\t400: 'Bad Request',\r\n\t\t401: 'Unauthorized',\r\n\t\t402: 'Payment Required',\r\n\t\t403: 'Forbidden',\r\n\t\t404: 'Not Found',\r\n\t\t405: 'Method Not Allowed',\r\n\t\t406: 'Not Acceptable',\r\n\t\t407: 'Proxy Authentication Required',\r\n\t\t408: 'Request Timeout',\r\n\t\t409: 'Conflict',\r\n\t\t410: 'Gone',\r\n\t\t411: 'Length Required',\r\n\t\t412: 'Precondition Failed',\r\n\t\t413: 'Payload Too Large',\r\n\t\t414: 'URI Too Long',\r\n\t\t415: 'Unsupported Media Type',\r\n\t\t416: 'Range Not Satisfiable',\r\n\t\t417: 'Expectation Failed',\r\n\t\t418: 'Im a teapot',\r\n\t\t421: 'Misdirected Request',\r\n\t\t422: 'Unprocessable Content',\r\n\t\t423: 'Locked',\r\n\t\t424: 'Failed Dependency',\r\n\t\t425: 'Too Early',\r\n\t\t426: 'Upgrade Required',\r\n\t\t428: 'Precondition Required',\r\n\t\t429: 'Too Many Requests',\r\n\t\t431: 'Request Header Fields Too Large',\r\n\t\t451: 'Unavailable For Legal Reasons',\r\n\t\t500: 'Internal Server Error',\r\n\t\t501: 'Not Implemented',\r\n\t\t502: 'Bad Gateway',\r\n\t\t503: 'Service Unavailable',\r\n\t\t504: 'Gateway Timeout',\r\n\t\t505: 'HTTP Version Not Supported',\r\n\t\t506: 'Variant Also Negotiates',\r\n\t\t507: 'Insufficient Storage',\r\n\t\t508: 'Loop Detected',\r\n\t\t510: 'Not Extended',\r\n\t\t511: 'Network Authentication Required',\r\n\t\t...options.errors,\r\n\t}\r\n\r\n\tconst error = errors[result.status];\r\n\tif (error) {\r\n\t\tthrow new ApiError(options, result, error);\r\n\t}\r\n\r\n\tif (!result.ok) {\r\n\t\tconst errorStatus = result.status ?? 'unknown';\r\n\t\tconst errorStatusText = result.statusText ?? 'unknown';\r\n\t\tconst errorBody = (() => {\r\n\t\t\ttry {\r\n\t\t\t\treturn JSON.stringify(result.body, null, 2);\r\n\t\t\t} catch (e) {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t})();\r\n\r\n\t\tthrow new ApiError(options, result,\r\n\t\t\t`Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * Request method\r\n * @param config The OpenAPI configuration object\r\n * @param options The request options from the service\r\n * @returns CancelablePromise<T>\r\n * @throws ApiError\r\n */\r\nexport const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {\r\n\treturn new CancelablePromise(async (resolve, reject, onCancel) => {\r\n\t\ttry {\r\n\t\t\tconst url = getUrl(config, options);\r\n\t\t\tconst formData = getFormData(options);\r\n\t\t\tconst body = getRequestBody(options);\r\n\t\t\tconst headers = await getHeaders(config, options);\r\n\r\n\t\t\tif (!onCancel.isCancelled) {\r\n\t\t\t\tlet response = await sendRequest(config, options, url, body, formData, headers, onCancel);\r\n\r\n\t\t\t\tfor (const fn of config.interceptors.response._fns) {\r\n\t\t\t\t\tresponse = await fn(response)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst responseBody = await getResponseBody(response);\r\n\t\t\t\tconst responseHeader = getResponseHeader(response, options.responseHeader);\r\n\r\n\t\t\t\tconst result: ApiResult = {\r\n\t\t\t\t\turl,\r\n\t\t\t\t\tok: response.ok,\r\n\t\t\t\t\tstatus: response.status,\r\n\t\t\t\t\tstatusText: response.statusText,\r\n\t\t\t\t\tbody: responseHeader ?? responseBody,\r\n\t\t\t\t};\r\n\r\n\t\t\t\tcatchErrorCodes(options, result);\r\n\r\n\t\t\t\tresolve(result.body);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\treject(error);\r\n\t\t}\r\n\t});\r\n};","import type { CancelablePromise } from './core/CancelablePromise';\r\nimport { OpenAPI } from './core/OpenAPI';\r\nimport { request as __request } from './core/request';\r\nimport type { HealthData, UserPresenceData, CallsData } from './models';\r\n\r\nexport class HealthService {\r\n\r\n\t/**\r\n\t * @returns any Service is healthy\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getHealth(): CancelablePromise<HealthData['responses']['GetHealth']> {\r\n\t\t\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/health',\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Service is healthy\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalHealth(): CancelablePromise<HealthData['responses']['GetSignalHealth']> {\r\n\t\t\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/health',\r\n\t\t});\r\n\t}\r\n\r\n}\r\n\r\nexport class UserPresenceService {\r\n\r\n\t/**\r\n\t * @returns any User presence retrieved successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalPresenceUsersByUserId(data: UserPresenceData['payloads']['GetSignalPresenceUsersByUserId']): CancelablePromise<UserPresenceData['responses']['GetSignalPresenceUsersByUserId']> {\r\n\t\tconst {\r\n \r\n userId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/presence/users/{userId}',\r\n\t\t\tpath: {\r\n\t\t\t\tuserId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `Insufficient permissions`,\r\n\t\t\t\t404: `User not found or presence unavailable`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Bulk presence retrieved successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalPresenceBulk(data: UserPresenceData['payloads']['GetSignalPresenceBulk']): CancelablePromise<UserPresenceData['responses']['GetSignalPresenceBulk']> {\r\n\t\tconst {\r\n \r\n userIds\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/presence/bulk',\r\n\t\t\tquery: {\r\n\t\t\t\tuserIds\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `Insufficient permissions`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n}\r\n\r\nexport class CallsService {\r\n\r\n\t/**\r\n\t * @returns any Call started successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCalls(data: CallsData['payloads']['PostSignalCalls']): CancelablePromise<CallsData['responses']['PostSignalCalls']> {\r\n\t\tconst {\r\n \r\n appId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls',\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call accepted successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdAccept(data: CallsData['payloads']['PostSignalCallsByCallIdAccept']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdAccept']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/accept',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User is not a participant`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be accepted in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call declined successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdDecline(data: CallsData['payloads']['PostSignalCallsByCallIdDecline']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdDecline']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/decline',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User is not a participant`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be declined in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Left call successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdLeave(data: CallsData['payloads']['PostSignalCallsByCallIdLeave']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdLeave']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/leave',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User is not a participant`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be left in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call retrieved successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalCallsByCallId(data: CallsData['payloads']['GetSignalCallsByCallId']): CancelablePromise<CallsData['responses']['GetSignalCallsByCallId']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/calls/{callId}',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have access to this call`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Participant info retrieved successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalCallsParticipantsByIdentity(data: CallsData['payloads']['GetSignalCallsParticipantsByIdentity']): CancelablePromise<CallsData['responses']['GetSignalCallsParticipantsByIdentity']> {\r\n\t\tconst {\r\n \r\n identity,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/calls/participants/{identity}',\r\n\t\t\tpath: {\r\n\t\t\t\tidentity\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t404: `Participant not found`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n}","import { CallsService } from \"../../generated/api\";\r\nimport type { CallsData } from \"../../generated/api/models\";\r\nimport { createLogger } from \"../../utils/logger\";\r\nimport type {\r\n CallActionResponse,\r\n CallResponse,\r\n InitiateCallParams,\r\n SignalClientConfig,\r\n} from \"./types\";\r\n\r\nexport class SignalClient {\r\n private config: SignalClientConfig;\r\n private logger = createLogger(\"signal\");\r\n\r\n constructor(config: SignalClientConfig) {\r\n this.config = config;\r\n }\r\n\r\n async initiate(params: InitiateCallParams): Promise<CallResponse> {\r\n try {\r\n return await CallsService.postSignalCalls({\r\n appId: this.config.appId,\r\n requestBody: {\r\n mode: params.mode || \"AUDIO\",\r\n participants: params.invitees.map((userId) => ({ userId })),\r\n },\r\n });\r\n } catch (error) {\r\n this.handleApiError(\"initiate\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async accept(callId: string): Promise<CallActionResponse> {\r\n try {\r\n const response = await CallsService.postSignalCallsByCallIdAccept({\r\n callId,\r\n appId: this.config.appId,\r\n });\r\n return {\r\n ...response,\r\n callId,\r\n state: \"ACTIVE\" as const,\r\n message: \"Call accepted\",\r\n };\r\n } catch (error) {\r\n this.handleApiError(\"accept\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async decline(callId: string): Promise<CallActionResponse> {\r\n try {\r\n const response = await CallsService.postSignalCallsByCallIdDecline({\r\n callId,\r\n appId: this.config.appId,\r\n });\r\n return {\r\n ...response,\r\n callId,\r\n state: \"ENDED\" as const,\r\n message: \"Call declined\",\r\n };\r\n } catch (error) {\r\n this.handleApiError(\"decline\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async leave(callId: string): Promise<CallActionResponse> {\r\n try {\r\n const response = await CallsService.postSignalCallsByCallIdLeave({\r\n callId,\r\n appId: this.config.appId,\r\n });\r\n return {\r\n ...response,\r\n callId,\r\n state: \"ENDED\" as const,\r\n message: \"Left call\",\r\n };\r\n } catch (error) {\r\n this.handleApiError(\"leave\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n private handleApiError(operation: string, error: any): void {\r\n const errorMessage =\r\n error?.body?.message || error?.message || \"Unknown error\";\r\n const errorCode = error?.status || error?.code || \"UNKNOWN\";\r\n\r\n // Log error for debugging - real-time error handling happens via Socket.IO\r\n this.logger.error(`Signal API error during ${operation}`, {\r\n operation,\r\n errorCode,\r\n errorMessage,\r\n error,\r\n });\r\n }\r\n}\r\n","import { OpenAPI } from \"../../generated/api\";\r\nimport type { ApiConfig } from \"./types\";\r\n\r\nexport class OpenApiConfigService {\r\n private static instance: OpenApiConfigService;\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): OpenApiConfigService {\r\n if (!OpenApiConfigService.instance) {\r\n OpenApiConfigService.instance = new OpenApiConfigService();\r\n }\r\n return OpenApiConfigService.instance;\r\n }\r\n\r\n configure(config: ApiConfig): void {\r\n OpenAPI.BASE = config.baseUrl;\r\n\r\n // Handle token - OpenAPI expects string | Resolver<string>\r\n // Resolver<string> = (options: ApiRequestOptions) => Promise<string>\r\n if (typeof config.token === \"function\") {\r\n const tokenFn = config.token; // Capture the function reference\r\n OpenAPI.TOKEN = async (_options) => {\r\n const result = tokenFn();\r\n return typeof result === \"string\" ? result : await result;\r\n };\r\n } else {\r\n OpenAPI.TOKEN = config.token;\r\n }\r\n\r\n OpenAPI.CREDENTIALS = config.credentials ?? \"include\";\r\n OpenAPI.WITH_CREDENTIALS = config.withCredentials ?? false;\r\n\r\n if (config.headers) {\r\n OpenAPI.HEADERS = config.headers;\r\n }\r\n }\r\n\r\n setToken(token: string): void {\r\n OpenAPI.TOKEN = token;\r\n }\r\n}\r\n\r\nexport const apiConfig = OpenApiConfigService.getInstance();\r\n\r\nexport { OpenAPI };\r\n\r\n// Re-export ApiConfig type\r\nexport type { ApiConfig } from \"./types\";\r\n","import type { AuthManager } from \"../core\";\r\nimport { SdkEventType, eventBus } from \"../core/events\";\r\nimport type {\r\n CallActionResponse,\r\n CallResponse,\r\n InitiateCallParams,\r\n SignalClient,\r\n} from \"../core/signal\";\r\nimport { rtcStore } from \"../state/store\";\r\nimport type { SessionStatus } from \"../state/types\";\r\nimport { createLogger } from \"../utils/logger\";\r\n\r\n\r\nexport interface CallActions {\r\n initiate: (params: InitiateCallParams) => Promise<CallResponse>;\r\n accept: (callId: string) => Promise<CallActionResponse>;\r\n decline: (callId: string, reason?: string) => Promise<CallActionResponse>;\r\n leave: (callId: string) => Promise<void>;\r\n}\r\n\r\nexport function createCallActions(\r\n signal: SignalClient,\r\n auth: AuthManager,\r\n): CallActions {\r\n const logger = createLogger(\"call-actions\");\r\n async function initiate(params: InitiateCallParams): Promise<CallResponse> {\r\n const response = await signal.initiate(params);\r\n\r\n rtcStore.getState().patch((state) => {\r\n state.session = {\r\n id: response.id,\r\n status: \"CALLING\", // Caller initiated, waiting for acceptance\r\n mode: response.mode as \"AUDIO\" | \"VIDEO\",\r\n // Identity context: I initiated this call, so I'm the caller\r\n myRole: \"CALLER\",\r\n initiatedByMe: true,\r\n };\r\n\r\n state.room.participants = {};\r\n\r\n logger.debug(\"Call initiated - waiting for participants to join\", {\r\n callId: response.id,\r\n invitedCount: response.participants?.length || 0,\r\n });\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async function accept(callId: string): Promise<CallActionResponse> {\r\n const response = await signal.accept(callId);\r\n\r\n rtcStore.getState().patch((state) => {\r\n state.session = {\r\n ...state.session,\r\n id: callId,\r\n status: \"ACCEPTED\", // Call accepted but not yet joined media\r\n myRole: \"CALLEE\",\r\n initiatedByMe: false,\r\n };\r\n\r\n // Participants will be populated by LiveKit EventBridge when they connect\r\n // No need to pre-populate from API response\r\n state.room.participants = {};\r\n });\r\n\r\n return response;\r\n }\r\n\r\n async function decline(\r\n callId: string,\r\n reason?: string\r\n ): Promise<CallActionResponse> {\r\n logger.debug(\"Starting decline action\", { callId, reason });\r\n\r\n try {\r\n const response = await signal.decline(callId);\r\n logger.info(\"Decline API success\", { callId, response });\r\n\r\n rtcStore.getState().patch((state) => {\r\n if (state.session.id === callId) {\r\n state.session.status = response.state as SessionStatus;\r\n }\r\n });\r\n\r\n eventBus.emit(\r\n SdkEventType.CALL_DECLINED,\r\n {\r\n callId,\r\n reason,\r\n timestamp: Date.now(),\r\n },\r\n \"user\"\r\n );\r\n\r\n return response;\r\n } catch (error) {\r\n logger.error(\"Decline API failed\", { callId, error });\r\n\r\n rtcStore.getState().patch((state) => {\r\n state.session.status = \"IDLE\";\r\n logger.warn(\"Force-cleared session due to API failure\");\r\n });\r\n\r\n eventBus.emit(\r\n SdkEventType.CALL_DECLINED,\r\n {\r\n callId,\r\n reason: \"api_error\",\r\n timestamp: Date.now(),\r\n },\r\n \"user\"\r\n );\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n async function leave(callId: string): Promise<void> {\r\n // await signal.leave(callId);\r\n rtcStore.getState().patch((state) => {\r\n state.session.status = \"IDLE\";\r\n });\r\n }\r\n\r\n return {\r\n initiate,\r\n accept,\r\n decline,\r\n leave,\r\n };\r\n}\r\n","import { AuthManager, SocketManager } from \"../core\";\r\nimport { type ApiConfig, SignalClient, apiConfig } from \"../core/signal\";\r\nimport { rtcStore } from \"../state/store\";\r\nimport { type LogLevel, setGlobalLoggerOptions } from \"../utils/logger\";\r\nimport { type CallActions, createCallActions } from \"./call-actions\";\r\n\r\nexport interface SdkBuildOptions {\r\n appId: string;\r\n signalHost: string;\r\n authProvider: () => string | null;\r\n\r\n // Logging configuration\r\n logLevel?: LogLevel;\r\n enableDebug?: boolean;\r\n\r\n // Custom log callback\r\n log?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface RtcSdk extends CallActions {\r\n store: typeof rtcStore;\r\n auth: AuthManager;\r\n socket: SocketManager;\r\n signal: SignalClient;\r\n cleanup: () => void;\r\n\r\n configureApi: (config: ApiConfig) => void;\r\n}\r\n\r\nexport function buildSdk(opts: SdkBuildOptions): RtcSdk {\r\n // Configure global logging system\r\n const loggerOptions: any = {};\r\n if (opts.logLevel !== undefined) {\r\n loggerOptions.level = opts.logLevel;\r\n }\r\n if (opts.enableDebug !== undefined) {\r\n loggerOptions.enableDebug = opts.enableDebug;\r\n }\r\n if (opts.log !== undefined) {\r\n loggerOptions.customLogger = opts.log;\r\n }\r\n setGlobalLoggerOptions(loggerOptions);\r\n\r\n // Initialize core managers\r\n const auth = new AuthManager(opts.authProvider);\r\n const socket = SocketManager.getInstance();\r\n const signal = new SignalClient({\r\n baseUrl: opts.signalHost,\r\n appId: opts.appId,\r\n authManager: auth,\r\n });\r\n const callActions = createCallActions(signal, auth);\r\n\r\n // Socket now handles events directly - no event bridge needed\r\n\r\n const cleanup = () => {\r\n socket.destroy();\r\n rtcStore.getState().reset();\r\n };\r\n\r\n return {\r\n store: rtcStore,\r\n auth,\r\n socket,\r\n signal,\r\n ...callActions,\r\n cleanup,\r\n\r\n // API configuration\r\n configureApi: (config: ApiConfig) => {\r\n apiConfig.configure(config);\r\n },\r\n };\r\n}\r\n","import React, { createContext, useContext, useEffect, useMemo } from \"react\";\r\nimport type { Nullable } from \"../core\";\r\nimport { type RtcSdk, type SdkBuildOptions, buildSdk } from \"../services\";\r\nimport { rtcStore } from \"../state/store\";\r\n\r\nexport type RtcOptions = SdkBuildOptions;\r\nexport type { RtcSdk };\r\n\r\nconst RtcContext = createContext<Nullable<RtcSdk>>(null);\r\n\r\nexport function RtcProvider({\r\n options,\r\n children,\r\n}: {\r\n options: RtcOptions;\r\n children: React.ReactNode;\r\n}) {\r\n const sdk = useMemo(() => buildSdk(options), [options]);\r\n\r\n useEffect(() => {\r\n // Configure API first\r\n try {\r\n sdk.configureApi({\r\n baseUrl: options.signalHost,\r\n token: async () => {\r\n const token = sdk.auth.getCurrentToken();\r\n return token || \"\";\r\n },\r\n });\r\n options.log?.(\"info\", \"API configured successfully\");\r\n } catch (error) {\r\n options.log?.(\"error\", \"Failed to configure API\", error);\r\n rtcStore.getState().addError({\r\n code: \"API_CONFIG_ERROR\",\r\n message: \"Failed to configure API\",\r\n timestamp: Date.now(),\r\n context: error,\r\n });\r\n }\r\n\r\n // Initialize socket connection with livekit service\r\n sdk.socket\r\n .initialize(\r\n options.signalHost,\r\n sdk.auth,\r\n {\r\n reconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n },\r\n undefined\r\n )\r\n .catch((error) => {\r\n options.log?.(\"error\", \"Failed to initialize socket connection\", error);\r\n\r\n rtcStore.getState().addError({\r\n code: \"SOCKET_INIT_ERROR\",\r\n message: \"Failed to initialize socket connection\",\r\n timestamp: Date.now(),\r\n context: error,\r\n });\r\n });\r\n\r\n return () => {\r\n sdk.cleanup();\r\n };\r\n }, [sdk, options]);\r\n\r\n return React.createElement(RtcContext.Provider, { value: sdk }, children);\r\n}\r\n\r\nexport const useSdk = (): RtcSdk => {\r\n const ctx = useContext(RtcContext);\r\n if (!ctx) {\r\n throw new Error(\"useSdk must be used within RtcProvider\");\r\n }\r\n return ctx;\r\n};\r\n","import { useRtcStore } from \"../state/store\";\r\nimport type { SessionStatus } from \"../state/types\";\r\n\r\nexport interface CallState {\r\n id: string | undefined;\r\n status: SessionStatus;\r\n mode: \"AUDIO\" | \"VIDEO\" | undefined;\r\n roomName: string | undefined;\r\n}\r\n\r\nexport function useCallState(): CallState {\r\n const session = useRtcStore((state) => state.session);\r\n\r\n return {\r\n id: session.id,\r\n status: session.status,\r\n mode: session.mode,\r\n roomName: session.livekitInfo?.roomName,\r\n };\r\n}\r\n","import { useSdk } from \"../provider/RtcProvider\";\r\n\r\nexport function useCallActions() {\r\n const sdk = useSdk();\r\n\r\n return {\r\n initiate: (participants: string[], type: \"AUDIO\" | \"VIDEO\") => {\r\n return sdk.initiate({ invitees: participants, mode: type });\r\n },\r\n accept: (callId: string) => {\r\n return sdk.accept(callId);\r\n },\r\n decline: (callId: string) => {\r\n return sdk.decline(callId);\r\n },\r\n end: (callId: string) => {\r\n return sdk.leave(callId);\r\n },\r\n cancel: (callId: string) => {\r\n return sdk.leave(callId);\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { eventBus } from \"../core/events\";\r\nimport type {\r\n EventFilter,\r\n EventHandler,\r\n SdkEvent,\r\n SdkEventType,\r\n} from \"../core/events\";\r\n\r\nexport function useEvent<T = any>(\r\n eventType: string | SdkEventType,\r\n callback?: EventHandler<T> | null,\r\n filter?: EventFilter<T>\r\n): SdkEvent<T> | undefined {\r\n const [lastEvent, setLastEvent] = useState<SdkEvent<T> | undefined>(\r\n undefined\r\n );\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n const handler: EventHandler<T> = (event: SdkEvent<T>) => {\r\n setLastEvent(event);\r\n if (callbackRef.current) {\r\n callbackRef.current(event);\r\n }\r\n };\r\n\r\n // Support pattern matching (e.g., \"call:*\")\r\n const subscription = eventType.includes(\"*\")\r\n ? eventBus.onPattern(eventType, handler, filter)\r\n : eventBus.on(eventType, handler, filter);\r\n\r\n return () => {\r\n subscription.unsubscribe();\r\n };\r\n }, [eventType, filter]);\r\n\r\n return lastEvent;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/core/auth.manager.ts","../src/utils/logger.ts","../src/state/types.ts","../src/state/store.ts","../src/state/errors.ts","../src/core/socketio/handlers/base.handler.ts","../src/core/events/event-bus.ts","../src/core/events/types.ts","../src/generated/socket/events.ts","../src/core/socketio/handlers/invite.handler.ts","../src/core/socketio/handlers/invite-sent.handler.ts","../src/core/socketio/handlers/invite-accepted.handler.ts","../src/core/socketio/handlers/invite-declined.handler.ts","../src/core/socketio/handlers/invite-missed.handler.ts","../src/core/socketio/handlers/invite-cancelled.handler.ts","../src/core/socketio/handlers/call-created.handler.ts","../src/core/socketio/handlers/call-ended.handler.ts","../src/core/socketio/handlers/call-cancelled.handler.ts","../src/core/socketio/handlers/call-missed.handler.ts","../src/core/socketio/handlers/join-info.handler.ts","../src/core/socketio/handlers/participant-added.handler.ts","../src/core/socketio/handlers/handler.registry.ts","../src/core/socketio/socket.manager.ts","../src/generated/api/core/ApiError.ts","../src/generated/api/core/CancelablePromise.ts","../src/generated/api/core/OpenAPI.ts","../src/generated/api/core/request.ts","../src/generated/api/services.ts","../src/core/signal/api.config.ts","../src/services/calls.service.ts","../src/services/sdk-builder.ts","../src/provider/RtcProvider.tsx","../src/hooks/useCallState.ts","../src/hooks/useSessionId.ts","../src/hooks/useIncomingInvite.ts","../src/hooks/useCallActions.ts","../src/hooks/useEvent.ts","../src/hooks/useOutgoingInvites.ts","../src/hooks/useInviteAccepted.ts","../src/hooks/useCallInitiated.ts","../src/hooks/useSessionDuration.ts","../src/hooks/useRoom.ts","../src/hooks/useParticipantMetadata.ts"],"names":["create","immer","logger","mitt","SdkEventType","z","io","request","resolve","headers","createContext","useMemo","useEffect","React","useContext","useState","useRef","Room","useParticipants","useLiveKitParticipantInfo"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AuthProvider, Nullable } from \"./types\";\r\n\r\nexport class AuthManager {\r\n private readonly authProvider: AuthProvider;\r\n private lastToken: Nullable<string> = null;\r\n\r\n constructor(authProvider: AuthProvider) {\r\n this.authProvider = authProvider;\r\n }\r\n\r\n getCurrentToken(): string | null {\r\n const token = this.authProvider();\r\n if (token !== this.lastToken) {\r\n this.lastToken = token;\r\n }\r\n\r\n return token;\r\n }\r\n}\r\n","/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","export interface ParticipantMetadata {\r\n userId: string;\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n firstName: string;\r\n lastName: string;\r\n username: string;\r\n email: string;\r\n profilePhoto: string;\r\n}\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n url: string;\r\n}\r\n\r\nexport interface Session {\r\n id: string;\r\n status: \"pending\" | \"active\" | \"ended\";\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n}\r\n\r\nexport interface IncomingInvite {\r\n callId: string;\r\n caller: ParticipantMetadata;\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n expiresAt: string;\r\n expiresInMs: number;\r\n}\r\n\r\nexport interface OutgoingInvite {\r\n userId: string;\r\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\r\n participant: ParticipantMetadata;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface RtcState {\r\n // Did we initiate the current call?\r\n initiated: boolean;\r\n\r\n // Active session (null when no active call)\r\n session: Session | null;\r\n\r\n // Incoming invitation (null when no pending invite)\r\n incomingInvite: IncomingInvite | null;\r\n\r\n outgoingInvites: Record<string, OutgoingInvite>;\r\n\r\n // Error tracking\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n initiated: false,\r\n session: null,\r\n incomingInvite: null,\r\n outgoingInvites: {},\r\n errors: [],\r\n};\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import type { LogLevel } from \"../utils/logger\";\r\nimport { rtcStore } from \"./store\";\r\nimport type { RtcError } from \"./types\";\r\n\r\n// Re-export RtcError type for external consumption\r\nexport type { RtcError } from \"./types\";\r\n\r\nexport type ErrorCode =\r\n | \"NETWORK\"\r\n | \"SOCKET_PAYLOAD\"\r\n | \"JOIN_FLOW\"\r\n | \"LIVEKIT_CONNECT\"\r\n | \"LIVEKIT_MEDIA\"\r\n | \"MEDIA_PERMISSION\"\r\n | \"DEVICE_SWITCH\"\r\n | \"API_ERROR\"\r\n | \"UNEXPECTED\";\r\n\r\nexport function pushError(\r\n code: ErrorCode,\r\n message: string,\r\n context?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const error: RtcError = {\r\n code,\r\n message,\r\n timestamp: Date.now(),\r\n context,\r\n };\r\n\r\n // Log the error if logger is provided\r\n logger?.(\"error\", message, { code, context });\r\n rtcStore.getState().addError(error);\r\n}\r\n\r\n/**\r\n * Clear errors from the store\r\n * @param predicate Optional filter function - if provided, only matching errors are removed\r\n */\r\nexport function clearErrors(predicate?: (error: RtcError) => boolean): void {\r\n rtcStore.getState().patch((state) => {\r\n if (predicate) {\r\n // Remove only errors matching the predicate\r\n state.errors = state.errors.filter((error) => !predicate(error));\r\n } else {\r\n // Clear all errors\r\n state.errors = [];\r\n }\r\n });\r\n}\r\n\r\n// Convenience helpers for common error scenarios\r\nexport function pushSocketValidationError(\r\n eventType: string,\r\n issues: any,\r\n payload?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"SOCKET_PAYLOAD\",\r\n `Invalid ${eventType} event payload`,\r\n { eventType, issues, payload },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushIdentityGuardError(\r\n reason: string,\r\n expected?: string,\r\n received?: string,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"JOIN_FLOW\", // Use new error code\r\n `Identity guard failed: ${reason}`,\r\n { expected, received },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushLiveKitConnectError(\r\n message: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"LIVEKIT_CONNECT\",\r\n `LiveKit connection failed: ${message}`,\r\n { originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushStaleEventError(\r\n eventType: string,\r\n reason: string,\r\n context?: any,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"JOIN_FLOW\", // Use new error code\r\n `Ignored stale ${eventType} event: ${reason}`,\r\n context,\r\n logger\r\n );\r\n}\r\n\r\nexport function pushApiError(\r\n operation: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"API_ERROR\",\r\n `API ${operation} failed: ${errorMessage}`,\r\n { operation, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushNetworkError(\r\n operation: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"NETWORK\",\r\n `Network error during ${operation}: ${errorMessage}`,\r\n { operation, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushMediaPermissionError(\r\n device: string,\r\n error?: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n pushError(\r\n \"MEDIA_PERMISSION\",\r\n `${device} permission denied`,\r\n { device, originalError: error },\r\n logger\r\n );\r\n}\r\n\r\nexport function pushDeviceError(\r\n operation: string,\r\n device: string,\r\n error: unknown,\r\n logger?: (level: LogLevel, message: string, meta?: any) => void\r\n): void {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n pushError(\r\n \"DEVICE_SWITCH\",\r\n `Failed to ${operation} ${device}: ${errorMessage}`,\r\n { operation, device, originalError: error },\r\n logger\r\n );\r\n}\r\n","import type { ZodSchema } from \"zod\";\r\nimport { pushSocketValidationError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport { createLogger } from \"../../../utils/logger\";\r\nimport type { CallpadLogger } from \"../../../utils/logger\";\r\nimport type { AuthManager } from \"../../auth.manager\";\r\n\r\nexport interface SocketHandlerOptions {\r\n livekit?: any;\r\n authManager?: AuthManager;\r\n}\r\n\r\n/**\r\n * Base handler for Socket.IO events with automatic validation and type safety.\r\n *\r\n * @template TPayload - The type of the event payload\r\n */\r\nexport abstract class BaseSocketHandler<TPayload = any> {\r\n protected abstract readonly eventName: string;\r\n protected abstract readonly schema: ZodSchema<TPayload>;\r\n private _logger?: CallpadLogger;\r\n\r\n constructor(protected readonly options: SocketHandlerOptions = {}) {}\r\n\r\n protected get logger(): CallpadLogger {\r\n if (!this._logger) {\r\n this._logger = createLogger(`socketio:${this.eventName}`);\r\n }\r\n return this._logger;\r\n }\r\n\r\n async handleRaw(rawData: unknown): Promise<void> {\r\n this.logger.info(`${this.eventName} received`, rawData);\r\n\r\n const result = this.schema.safeParse(rawData);\r\n if (!result.success) {\r\n this.logger.error(\r\n `${this.eventName} validation failed`,\r\n result.error.issues\r\n );\r\n pushSocketValidationError(\r\n this.eventName,\r\n result.error.issues,\r\n rawData,\r\n (level, message, meta) => {\r\n switch (level) {\r\n case \"debug\":\r\n this.logger.debug(message, meta);\r\n break;\r\n case \"info\":\r\n this.logger.info(message, meta);\r\n break;\r\n case \"warn\":\r\n this.logger.warn(message, meta);\r\n break;\r\n case \"error\":\r\n this.logger.error(message, meta);\r\n break;\r\n }\r\n }\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n await this.handle(result.data);\r\n this.logger.debug(`${this.eventName} handled successfully`);\r\n } catch (error) {\r\n this.logger.error(`${this.eventName} handler error`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n protected abstract handle(data: TPayload): Promise<void> | void;\r\n\r\n protected updateStore(updater: (state: any) => void): void {\r\n rtcStore.getState().patch(updater);\r\n }\r\n\r\n protected get livekit() {\r\n return this.options.livekit;\r\n }\r\n}\r\n","import mitt, { type Emitter } from \"mitt\";\r\nimport type { EventHandler, EventSubscription, SdkEvent, SdkEventType } from \"./types\";\r\n\r\ntype Events = Record<string, any>;\r\n\r\nclass EventBus {\r\n private emitter: Emitter<Events>;\r\n\r\n constructor() {\r\n this.emitter = mitt<Events>();\r\n }\r\n\r\n on<T = any>(\r\n eventType: string | SdkEventType,\r\n handler: EventHandler<T>\r\n ): EventSubscription {\r\n const wrappedHandler = (event: SdkEvent<T>) => {\r\n handler(event);\r\n };\r\n\r\n this.emitter.on(eventType.toString(), wrappedHandler);\r\n\r\n return {\r\n unsubscribe: () => {\r\n this.emitter.off(eventType.toString(), wrappedHandler);\r\n },\r\n };\r\n }\r\n\r\n emit<T = any>(eventType: string | SdkEventType, payload: T): void {\r\n const event: SdkEvent<T> = {\r\n type: eventType.toString(),\r\n payload,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.emitter.emit(eventType.toString(), event);\r\n }\r\n\r\n off(eventType: string | SdkEventType): void {\r\n this.emitter.off(eventType.toString());\r\n }\r\n\r\n removeAllListeners(): void {\r\n this.emitter.all.clear();\r\n }\r\n}\r\n\r\nexport const eventBus = new EventBus();\r\nexport { EventBus };\r\n","/**\r\n * SDK Event System Types\r\n *\r\n * This file defines the event types and interfaces for the internal SDK event system.\r\n * The event system provides extensibility and allows components to communicate\r\n * through a unified, type-safe event bus.\r\n */\r\n\r\nexport interface SdkEvent<T = any> {\r\n type: string;\r\n payload: T;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * SDK Event Types\r\n * Following the pattern from other WebRTC SDKs like LiveKit\r\n */\r\nexport enum SdkEventType {\r\n // Call lifecycle events\r\n CALL_INITIATED = \"call:initiated\",\r\n CALL_INCOMING = \"call:incoming\",\r\n CALL_DECLINED = \"call:declined\",\r\n CALL_ENDED = \"call:ended\",\r\n CALL_CANCELED = \"call:canceled\",\r\n CALL_TIMEOUT = \"call:timeout\",\r\n JOIN_INFO_RECEIVED = \"join-info:received\",\r\n\r\n // Participant events\r\n PARTICIPANT_UPDATED = \"participant:updated\",\r\n PARTICIPANT_INVITED = \"participant:invited\",\r\n\r\n // Media events\r\n MEDIA_ENABLED = \"media:enabled\",\r\n MEDIA_DISABLED = \"media:disabled\",\r\n MEDIA_DEVICE_CHANGED = \"media:device-changed\",\r\n MEDIA_PERMISSION_GRANTED = \"media:permission-granted\",\r\n MEDIA_PERMISSION_DENIED = \"media:permission-denied\",\r\n\r\n // Connection events\r\n CONNECTION_ESTABLISHED = \"connection:established\",\r\n CONNECTION_LOST = \"connection:lost\",\r\n CONNECTION_RECONNECTING = \"connection:reconnecting\",\r\n CONNECTION_QUALITY_CHANGED = \"connection:quality-changed\",\r\n\r\n // Error events\r\n ERROR_OCCURRED = \"error:occurred\",\r\n}\r\n\r\n/**\r\n * Specific event payload types\r\n */\r\nexport interface CallInitiatedEvent {\r\n callId: string;\r\n participants: string[];\r\n type: \"AUDIO\" | \"VIDEO\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface CallIncomingEvent {\r\n callId: string;\r\n caller: {\r\n id: string;\r\n firstName: string | null;\r\n lastName: string | null;\r\n avatarUrl: string | null;\r\n };\r\n type: \"AUDIO\" | \"VIDEO\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface CallDeclinedEvent {\r\n callId: string;\r\n participantId?: string;\r\n reason?: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface CallEndedEvent {\r\n callId: string;\r\n endedBy?: string;\r\n reason?: \"user\" | \"timeout\" | \"error\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface JoinInfoReceivedEvent {\r\n callId: string;\r\n participantId: string;\r\n timestamp: number;\r\n url: string;\r\n token: string;\r\n}\r\n\r\nexport interface MediaEnabledEvent {\r\n participantId: string;\r\n mediaType: \"audio\" | \"video\" | \"screen\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface MediaDisabledEvent {\r\n participantId: string;\r\n mediaType: \"audio\" | \"video\" | \"screen\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface ConnectionQualityChangedEvent {\r\n participantId: string;\r\n quality: \"excellent\" | \"good\" | \"poor\" | \"lost\";\r\n timestamp: number;\r\n}\r\n\r\nexport interface ErrorOccurredEvent {\r\n code: string;\r\n message: string;\r\n details?: any;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Event handler type\r\n */\r\nexport type EventHandler<T = any> = (event: SdkEvent<T>) => void;\r\n\r\n/**\r\n * Event subscription interface\r\n */\r\nexport interface EventSubscription {\r\n unsubscribe: () => void;\r\n}\r\n\r\nexport interface ParticipantInvitedEvent {\r\n callId: string;\r\n participant: {\r\n id: string;\r\n firstName: string | null;\r\n lastName: string | null;\r\n avatarUrl: string | null;\r\n };\r\n timestamp: number;\r\n}\r\n","// Generated by scripts/generate-socket-types.ts\r\n// Do not edit this file manually\r\n\r\nimport { z } from \"zod\";\r\n\r\n// Event: call:cancelled\r\n// Event: call:cancelled\r\nexport const callCancelledSchema = z.object({\r\n callId: z.string(),\r\n status: z.literal(\"cancelled\"),\r\n cancelledAt: z.string(),\r\n}).strict();\r\n\r\nexport type CallCancelledEvent = z.infer<typeof callCancelledSchema>;\r\n\r\n// Event: call:created\r\n// Event: call:created\r\nexport const callCreatedSchema = z.object({\r\n callId: z.string(),\r\n status: z.literal(\"pending\"),\r\n roomName: z.string(),\r\n createdAt: z.string(),\r\n host: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n participants: z.array(z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict()),\r\n}).strict();\r\n\r\nexport type CallCreatedEvent = z.infer<typeof callCreatedSchema>;\r\n\r\n// Event: call:ended\r\n// Event: call:ended\r\nexport const callEndedSchema = z.object({\r\n callId: z.string(),\r\n endedAt: z.string(),\r\n endedByUserId: z.string().optional(),\r\n reason: z.string().optional(),\r\n}).strict();\r\n\r\nexport type CallEndedEvent = z.infer<typeof callEndedSchema>;\r\n\r\n// Event: call:invite\r\n// Event: call:invite\r\nexport const callInviteSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n caller: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n mode: z.enum([\"VIDEO\", \"AUDIO\"]),\r\n expiresAt: z.string(),\r\n expiresInMs: z.number(),\r\n}).strict();\r\n\r\nexport type CallInviteEvent = z.infer<typeof callInviteSchema>;\r\n\r\n// Event: call:inviteAccepted\r\n// Event: call:inviteAccepted\r\nexport const callInviteAcceptedSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n participant: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n acceptedAt: z.string(),\r\n}).strict();\r\n\r\nexport type CallInviteAcceptedEvent = z.infer<typeof callInviteAcceptedSchema>;\r\n\r\n// Event: call:inviteCancelled\r\n// Event: call:inviteCancelled\r\nexport const callInviteCancelledSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n cancelledByUserId: z.string(),\r\n cancelledAt: z.string(),\r\n reason: z.string(),\r\n}).strict();\r\n\r\nexport type CallInviteCancelledEvent = z.infer<typeof callInviteCancelledSchema>;\r\n\r\n// Event: call:inviteDeclined\r\n// Event: call:inviteDeclined\r\nexport const callInviteDeclinedSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n participant: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n reason: z.string().optional(),\r\n declinedAt: z.string(),\r\n}).strict();\r\n\r\nexport type CallInviteDeclinedEvent = z.infer<typeof callInviteDeclinedSchema>;\r\n\r\n// Event: call:inviteMissed\r\n// Event: call:inviteMissed\r\nexport const callInviteMissedSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n participant: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n missedAt: z.string(),\r\n}).strict();\r\n\r\nexport type CallInviteMissedEvent = z.infer<typeof callInviteMissedSchema>;\r\n\r\n// Event: call:inviteSent\r\n// Event: call:inviteSent\r\nexport const callInviteSentSchema = z.object({\r\n callId: z.string(),\r\n invitee: z.object({\r\n firstName: z.string().nullable(),\r\n lastName: z.string().nullable(),\r\n username: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profilePhoto: z.string().nullable(),\r\n userId: z.string(),\r\n }).strict(),\r\n status: z.literal(\"sent\"),\r\n}).strict();\r\n\r\nexport type CallInviteSentEvent = z.infer<typeof callInviteSentSchema>;\r\n\r\n// Event: call:joinInfo\r\n// Event: call:joinInfo\r\nexport const callJoinInfoSchema = z.object({\r\n callId: z.string(),\r\n token: z.string(),\r\n roomName: z.string(),\r\n lkUrl: z.string(),\r\n role: z.enum([\"HOST\", \"PARTICIPANT\", \"GUEST\"]),\r\n participantId: z.string().optional(),\r\n}).strict();\r\n\r\nexport type CallJoinInfoEvent = z.infer<typeof callJoinInfoSchema>;\r\n\r\n// Event: call:missed\r\n// Event: call:missed\r\nexport const callMissedSchema = z.object({\r\n callId: z.string(),\r\n endedAt: z.string(),\r\n}).strict();\r\n\r\nexport type CallMissedEvent = z.infer<typeof callMissedSchema>;\r\n\r\n// Event: call:participantAdded\r\n// Event: call:participantAdded\r\nexport const callParticipantAddedSchema = z.object({\r\n callId: z.string(),\r\n status: z.enum([\"pending\", \"active\", \"ended\"]),\r\n participant: z.object({\r\n participantId: z.string(),\r\n userId: z.string(),\r\n firstName: z.string().optional(),\r\n lastName: z.string().optional(),\r\n username: z.string().optional(),\r\n email: z.string().optional(),\r\n profilePhoto: z.string().optional(),\r\n role: z.enum([\"HOST\", \"PARTICIPANT\", \"GUEST\"]),\r\n joinState: z.enum([\"not_joined\", \"joined\"]),\r\n }).strict(),\r\n}).strict();\r\n\r\nexport type CallParticipantAddedEvent = z.infer<typeof callParticipantAddedSchema>;\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport type { CallInviteEvent } from \"../../../generated/socket\";\r\nimport { callInviteSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles incoming call invitation (call:invite)\r\n *\r\n * Sets incomingInvite state to show incoming call UI\r\n */\r\nexport class InviteHandler extends BaseSocketHandler<CallInviteEvent> {\r\n protected readonly eventName = \"call:invite\";\r\n protected readonly schema = callInviteSchema;\r\n\r\n protected handle(data: CallInviteEvent): void {\r\n this.logger.info(\"Incoming call invitation\", {\r\n callId: data.callId,\r\n caller: data.caller.userId,\r\n mode: data.mode,\r\n });\r\n\r\n this.updateStore((state) => {\r\n state.incomingInvite = {\r\n callId: data.callId,\r\n caller: {\r\n userId: data.caller.userId,\r\n firstName: data.caller.firstName,\r\n lastName: data.caller.lastName,\r\n username: data.caller.username,\r\n email: data.caller.email,\r\n profilePhoto: data.caller.profilePhoto,\r\n },\r\n mode: data.mode,\r\n expiresAt: data.expiresAt,\r\n expiresInMs: data.expiresInMs,\r\n };\r\n\r\n state.session = {\r\n id: data.callId,\r\n status: \"pending\",\r\n mode: data.mode,\r\n role: \"PARTICIPANT\",\r\n };\r\n });\r\n\r\n // Emit SDK event for the application layer\r\n eventBus.emit(SdkEventType.CALL_INCOMING, {\r\n callId: data.callId,\r\n caller: {\r\n id: data.caller.userId,\r\n firstName: data.caller.firstName,\r\n lastName: data.caller.lastName,\r\n avatarUrl: data.caller.profilePhoto,\r\n },\r\n type: data.mode,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Incoming invite state updated\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallInviteSentEvent } from \"../../../generated/socket\";\r\nimport { callInviteSentSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles invitation sent confirmation (call:inviteSent)\r\n *\r\n * Tracks each sent invitation in outgoingInvites map\r\n * Only relevant for HOST/caller perspective\r\n */\r\nexport class InviteSentHandler extends BaseSocketHandler<CallInviteSentEvent> {\r\n protected readonly eventName = \"call:inviteSent\";\r\n protected readonly schema = callInviteSentSchema;\r\n\r\n protected handle(data: CallInviteSentEvent): void {\r\n const currentState = rtcStore.getState();\r\n this.logger.info(\"Invitation sent to participant\", {\r\n callId: data.callId,\r\n invitee: data.invitee.userId,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:inviteSent\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring invite sent for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n const userId = data.invitee.userId;\r\n\r\n state.outgoingInvites[userId] = {\r\n userId,\r\n status: \"sent\",\r\n participant: {\r\n userId: data.invitee.userId,\r\n firstName: data.invitee.firstName,\r\n lastName: data.invitee.lastName,\r\n username: data.invitee.username,\r\n email: data.invitee.email,\r\n profilePhoto: data.invitee.profilePhoto,\r\n },\r\n };\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.PARTICIPANT_INVITED, {\r\n callId: data.callId,\r\n participant: {\r\n id: data.invitee.userId,\r\n firstName: data.invitee.firstName,\r\n lastName: data.invitee.lastName,\r\n avatarUrl: data.invitee.profilePhoto,\r\n },\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Outgoing invite tracked\", {\r\n userId: data.invitee.userId,\r\n });\r\n }\r\n}\r\n","import { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallInviteAcceptedEvent } from \"../../../generated/socket\";\r\nimport { callInviteAcceptedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles invitation accepted (call:inviteAccepted)\r\n *\r\n * Updates outgoingInvites status when a participant accepts\r\n * Only relevant for HOST/caller perspective\r\n */\r\nexport class InviteAcceptedHandler extends BaseSocketHandler<CallInviteAcceptedEvent> {\r\n protected readonly eventName = \"call:inviteAccepted\";\r\n protected readonly schema = callInviteAcceptedSchema;\r\n\r\n protected handle(data: CallInviteAcceptedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Participant accepted invitation\", {\r\n callId: data.callId,\r\n participant: data.participant.userId,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:inviteAccepted\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring accept event for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n const userId = data.participant.userId;\r\n\r\n if (state.outgoingInvites[userId]) {\r\n state.outgoingInvites[userId].status = \"accepted\";\r\n } else {\r\n state.outgoingInvites[userId] = {\r\n userId,\r\n status: \"accepted\",\r\n participant: {\r\n userId: data.participant.userId,\r\n firstName: data.participant.firstName,\r\n lastName: data.participant.lastName,\r\n username: data.participant.username,\r\n email: data.participant.email,\r\n profilePhoto: data.participant.profilePhoto,\r\n },\r\n };\r\n }\r\n });\r\n\r\n this.logger.debug(\"Outgoing invite marked as accepted\", {\r\n userId: data.participant.userId,\r\n });\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallInviteDeclinedEvent } from \"../../../generated/socket\";\r\nimport { callInviteDeclinedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles invitation declined (call:inviteDeclined)\r\n *\r\n * Updates outgoingInvites status when a participant declines\r\n * Only relevant for HOST/caller perspective\r\n */\r\nexport class InviteDeclinedHandler extends BaseSocketHandler<CallInviteDeclinedEvent> {\r\n protected readonly eventName = \"call:inviteDeclined\";\r\n protected readonly schema = callInviteDeclinedSchema;\r\n\r\n protected handle(data: CallInviteDeclinedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Participant declined invitation\", {\r\n callId: data.callId,\r\n participant: data.participant.userId,\r\n reason: data.reason,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:inviteDeclined\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring decline event for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n const userId = data.participant.userId;\r\n\r\n if (state.outgoingInvites[userId]) {\r\n state.outgoingInvites[userId].status = \"declined\";\r\n } else {\r\n state.outgoingInvites[userId] = {\r\n userId,\r\n status: \"declined\",\r\n participant: {\r\n userId: data.participant.userId,\r\n firstName: data.participant.firstName,\r\n lastName: data.participant.lastName,\r\n username: data.participant.username,\r\n email: data.participant.email,\r\n profilePhoto: data.participant.profilePhoto,\r\n },\r\n };\r\n }\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_DECLINED, {\r\n callId: data.callId,\r\n participantId: data.participant.userId,\r\n reason: data.reason,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Outgoing invite marked as declined\", {\r\n userId: data.participant.userId,\r\n });\r\n }\r\n}\r\n","import { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallInviteMissedEvent } from \"../../../generated/socket\";\r\nimport { callInviteMissedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles invitation missed/timeout (call:inviteMissed)\r\n *\r\n * Updates outgoingInvites status when a participant doesn't respond\r\n * Only relevant for HOST/caller perspective\r\n */\r\nexport class InviteMissedHandler extends BaseSocketHandler<CallInviteMissedEvent> {\r\n protected readonly eventName = \"call:inviteMissed\";\r\n protected readonly schema = callInviteMissedSchema;\r\n\r\n protected handle(data: CallInviteMissedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Participant missed invitation\", {\r\n callId: data.callId,\r\n participant: data.participant.userId,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:inviteMissed\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring missed invite for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n const userId = data.participant.userId;\r\n\r\n if (state.outgoingInvites[userId]) {\r\n state.outgoingInvites[userId].status = \"missed\";\r\n } else {\r\n state.outgoingInvites[userId] = {\r\n userId,\r\n status: \"missed\",\r\n participant: {\r\n userId: data.participant.userId,\r\n firstName: data.participant.firstName,\r\n lastName: data.participant.lastName,\r\n username: data.participant.username,\r\n email: data.participant.email,\r\n profilePhoto: data.participant.profilePhoto,\r\n },\r\n };\r\n }\r\n });\r\n\r\n this.logger.debug(\"Outgoing invite marked as missed\", {\r\n userId: data.participant.userId,\r\n });\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallInviteCancelledEvent } from \"../../../generated/socket\";\r\nimport { callInviteCancelledSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles invitation cancelled (call:inviteCancelled)\r\n *\r\n * Clears incomingInvite when host cancels the invitation\r\n * Only relevant for PARTICIPANT/callee perspective\r\n */\r\nexport class InviteCancelledHandler extends BaseSocketHandler<CallInviteCancelledEvent> {\r\n protected readonly eventName = \"call:inviteCancelled\";\r\n protected readonly schema = callInviteCancelledSchema;\r\n\r\n protected handle(data: CallInviteCancelledEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Invitation cancelled by host\", {\r\n callId: data.callId,\r\n cancelledBy: data.cancelledByUserId,\r\n reason: data.reason,\r\n });\r\n\r\n // Only clear if this matches our incoming invite\r\n if (currentState.incomingInvite?.callId !== data.callId) {\r\n this.logger.debug(\"Ignoring cancelled invite for different call\", {\r\n callId: data.callId,\r\n });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.incomingInvite = null;\r\n state.session = null;\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_CANCELED, {\r\n callId: data.callId,\r\n reason: data.reason,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Incoming invite cleared due to cancellation\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport type { CallCreatedEvent } from \"../../../generated/socket\";\r\nimport { callCreatedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles call session created (call:created)\r\n *\r\n * Creates session state when caller initiates a call\r\n * This is the outbound call flow (I'm the HOST)\r\n */\r\nexport class SessionCreatedHandler extends BaseSocketHandler<CallCreatedEvent> {\r\n protected readonly eventName = \"call:created\";\r\n protected readonly schema = callCreatedSchema;\r\n\r\n protected handle(data: CallCreatedEvent): void {\r\n this.logger.info(\"Call session created\", {\r\n callId: data.callId,\r\n roomName: data.roomName,\r\n host: data.host.userId,\r\n participantCount: data.participants.length,\r\n });\r\n\r\n this.updateStore((state) => {\r\n state.initiated = true;\r\n\r\n state.session = {\r\n id: data.callId,\r\n status: \"pending\",\r\n mode: \"VIDEO\",\r\n role: \"HOST\",\r\n };\r\n\r\n state.outgoingInvites = {};\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_INITIATED, {\r\n callId: data.callId,\r\n participants: data.participants.map((p) => p.userId),\r\n type: \"VIDEO\", // Default, TODO: get from API request context\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Session created for outbound call\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallEndedEvent } from \"../../../generated/socket\";\r\nimport { callEndedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles call session ended (call:ended)\r\n *\r\n * Clears session state and disconnects from LiveKit\r\n */\r\nexport class SessionEndedHandler extends BaseSocketHandler<CallEndedEvent> {\r\n protected readonly eventName = \"call:ended\";\r\n protected readonly schema = callEndedSchema;\r\n\r\n protected handle(data: CallEndedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Call session ended\", {\r\n callId: data.callId,\r\n endedBy: data.endedByUserId,\r\n reason: data.reason,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:ended\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring end event for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.initiated = false;\r\n state.session = null;\r\n state.outgoingInvites = {};\r\n state.room.participants = {};\r\n });\r\n\r\n // Disconnect from LiveKit if connected\r\n if (this.livekit) {\r\n this.livekit.disconnect().catch((error: any) => {\r\n this.logger.error(\"Error disconnecting from LiveKit\", { error });\r\n });\r\n }\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_ENDED, {\r\n callId: data.callId,\r\n endedBy: data.endedByUserId,\r\n reason: \"user\",\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Session cleared and LiveKit disconnected\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallCancelledEvent } from \"../../../generated/socket\";\r\nimport { callCancelledSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles call session cancelled (call:cancelled)\r\n *\r\n * Clears session when call is fully cancelled (no active participants)\r\n * This is sent to the HOST when their outbound call is cancelled\r\n */\r\nexport class SessionCancelledHandler extends BaseSocketHandler<CallCancelledEvent> {\r\n protected readonly eventName = \"call:cancelled\";\r\n protected readonly schema = callCancelledSchema;\r\n\r\n protected handle(data: CallCancelledEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Call session cancelled\", {\r\n callId: data.callId,\r\n status: data.status,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:cancelled\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring cancel event for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.initiated = false;\r\n state.session = null;\r\n state.outgoingInvites = {};\r\n state.room.participants = {};\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_CANCELED, {\r\n callId: data.callId,\r\n reason: \"cancelled by host\",\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Session cleared due to cancellation\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallMissedEvent } from \"../../../generated/socket\";\r\nimport { callMissedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles call missed (call:missed)\r\n *\r\n * Clears session when all participants declined/missed\r\n * This is sent to the HOST when nobody answered\r\n */\r\nexport class SessionMissedHandler extends BaseSocketHandler<CallMissedEvent> {\r\n protected readonly eventName = \"call:missed\";\r\n protected readonly schema = callMissedSchema;\r\n\r\n protected handle(data: CallMissedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Call missed by all participants\", {\r\n callId: data.callId,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:missed\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring missed call for different session\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n state.initiated = false;\r\n state.session = null;\r\n state.outgoingInvites = {};\r\n state.room.participants = {};\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.CALL_TIMEOUT, {\r\n callId: data.callId,\r\n reason: \"All participants missed/declined\",\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Session cleared - call was missed by all\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallJoinInfoEvent } from \"../../../generated/socket\";\r\nimport { callJoinInfoSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles LiveKit join credentials (call:joinInfo)\r\n *\r\n * Sets LiveKit credentials and role in existing session\r\n */\r\nexport class JoinInfoHandler extends BaseSocketHandler<CallJoinInfoEvent> {\r\n protected readonly eventName = \"call:joinInfo\";\r\n protected readonly schema = callJoinInfoSchema;\r\n\r\n protected handle(data: CallJoinInfoEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Received LiveKit join info\", {\r\n callId: data.callId,\r\n roomName: data.roomName,\r\n role: data.role,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:joinInfo\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring join info for unknown call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n this.updateStore((state) => {\r\n if (state.session?.id === data.callId) {\r\n state.session.livekitInfo = {\r\n token: data.token,\r\n roomName: data.roomName,\r\n url: data.lkUrl,\r\n };\r\n state.session.role = data.role;\r\n }\r\n });\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.JOIN_INFO_RECEIVED, {\r\n callId: data.callId,\r\n participantId: data.participantId || \"\",\r\n timestamp: Date.now(),\r\n url: data.lkUrl,\r\n token: data.token,\r\n });\r\n\r\n this.logger.debug(\"Session updated with LiveKit credentials\");\r\n }\r\n}\r\n","import { SdkEventType, eventBus } from \"../../events\";\r\nimport { pushStaleEventError } from \"../../../state/errors\";\r\nimport { rtcStore } from \"../../../state/store\";\r\nimport type { CallParticipantAddedEvent } from \"../../../generated/socket\";\r\nimport { callParticipantAddedSchema } from \"../../../generated/socket\";\r\nimport { BaseSocketHandler } from \"./base.handler\";\r\n\r\n/**\r\n * Handles participant added to call (call:participantAdded)\r\n *\r\n * Updates room participants when someone joins\r\n * Note: This is supplementary - LiveKit also tracks participants\r\n */\r\nexport class ParticipantAddedHandler extends BaseSocketHandler<CallParticipantAddedEvent> {\r\n protected readonly eventName = \"call:participantAdded\";\r\n protected readonly schema = callParticipantAddedSchema;\r\n\r\n protected handle(data: CallParticipantAddedEvent): void {\r\n const currentState = rtcStore.getState();\r\n\r\n this.logger.info(\"Participant added to call\", {\r\n callId: data.callId,\r\n participantId: data.participant.participantId,\r\n userId: data.participant.userId,\r\n role: data.participant.role,\r\n });\r\n\r\n // Verify this matches our current session\r\n if (currentState.session?.id !== data.callId) {\r\n pushStaleEventError(\"call:participantAdded\", \"callId mismatch\", {\r\n eventCallId: data.callId,\r\n sessionCallId: currentState.session?.id,\r\n });\r\n this.logger.warn(\"Ignoring participant added for different call\", { callId: data.callId });\r\n return;\r\n }\r\n\r\n // Emit SDK event\r\n eventBus.emit(SdkEventType.PARTICIPANT_UPDATED, {\r\n participantId: data.participant.participantId,\r\n timestamp: Date.now(),\r\n });\r\n\r\n this.logger.debug(\"Participant added event processed\", {\r\n participantId: data.participant.participantId,\r\n });\r\n }\r\n}\r\n","import type { Socket } from \"socket.io-client\";\r\nimport { createLogger } from \"../../../utils/logger\";\r\nimport type { SocketHandlerOptions } from \"./base.handler\";\r\nimport { InviteHandler } from \"./invite.handler\";\r\nimport { InviteSentHandler } from \"./invite-sent.handler\";\r\nimport { InviteAcceptedHandler } from \"./invite-accepted.handler\";\r\nimport { InviteDeclinedHandler } from \"./invite-declined.handler\";\r\nimport { InviteMissedHandler } from \"./invite-missed.handler\";\r\nimport { InviteCancelledHandler } from \"./invite-cancelled.handler\";\r\nimport { SessionCreatedHandler } from \"./call-created.handler\";\r\nimport { SessionEndedHandler } from \"./call-ended.handler\";\r\nimport { SessionCancelledHandler } from \"./call-cancelled.handler\";\r\nimport { SessionMissedHandler } from \"./call-missed.handler\";\r\nimport { JoinInfoHandler } from \"./join-info.handler\";\r\nimport { ParticipantAddedHandler } from \"./participant-added.handler\";\r\n\r\nconst logger = createLogger(\"socketio:registry\");\r\n\r\n/**\r\n * Registry for Socket.IO event handlers.\r\n * Automatically registers handlers with proper typing and error handling.\r\n */\r\nexport class SocketHandlerRegistry {\r\n private handlers = new Map<string, any>();\r\n\r\n constructor(private options: SocketHandlerOptions = {}) {\r\n this.initializeHandlers();\r\n }\r\n\r\n private initializeHandlers(): void {\r\n const handlers = [\r\n // Phase 1: Core flow handlers\r\n new InviteHandler(this.options),\r\n new JoinInfoHandler(this.options),\r\n new SessionEndedHandler(this.options),\r\n new SessionCreatedHandler(this.options),\r\n\r\n // Phase 2: Invite management handlers\r\n new InviteAcceptedHandler(this.options),\r\n new InviteDeclinedHandler(this.options),\r\n new InviteCancelledHandler(this.options),\r\n new InviteSentHandler(this.options),\r\n\r\n // Phase 3: Edge case handlers\r\n new InviteMissedHandler(this.options),\r\n new SessionCancelledHandler(this.options),\r\n new SessionMissedHandler(this.options),\r\n new ParticipantAddedHandler(this.options),\r\n ];\r\n\r\n for (const handler of handlers) {\r\n this.handlers.set((handler as any).eventName, handler);\r\n }\r\n\r\n logger.info(`Registered ${handlers.length} socket event handlers`);\r\n }\r\n\r\n registerEventListeners(socket: Socket): void {\r\n for (const [eventName, handler] of this.handlers) {\r\n socket.on(eventName, (rawData: any) => {\r\n handler.handleRaw(rawData).catch((error: Error) => {\r\n logger.error(`Handler error for ${eventName}:`, error);\r\n });\r\n });\r\n }\r\n logger.debug(\"Event listeners registered on socket\");\r\n }\r\n\r\n removeEventListeners(socket: Socket): void {\r\n for (const eventName of this.handlers.keys()) {\r\n socket.off(eventName);\r\n }\r\n logger.debug(\"Event listeners removed from socket\");\r\n }\r\n\r\n destroy(): void {\r\n this.handlers.clear();\r\n logger.debug(\"Handler registry destroyed\");\r\n }\r\n\r\n /**\r\n * Get all registered event names\r\n */\r\n getRegisteredEvents(): string[] {\r\n return Array.from(this.handlers.keys());\r\n }\r\n}\r\n","import { type Socket, io } from \"socket.io-client\";\r\nimport { createLogger } from \"../../utils/logger\";\r\nimport type { AuthManager } from \"../auth.manager\";\r\nimport type { Nullable } from \"../types\";\r\nimport { SocketHandlerRegistry } from \"./handlers\";\r\nimport type { SocketHandlerOptions } from \"./handlers/base.handler\";\r\nimport type { ConnectionConfig, ConnectionState } from \"./types\";\r\n\r\nexport class SocketManager {\r\n private static instance: Nullable<SocketManager> = null;\r\n private logger = createLogger(\"socket\");\r\n\r\n private socket: Nullable<Socket> = null;\r\n private connectionState: ConnectionState = \"DISCONNECTED\";\r\n private livekit: any = null;\r\n private handlerRegistry: Nullable<SocketHandlerRegistry> = null;\r\n private authManager: Nullable<AuthManager> = null;\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): SocketManager {\r\n if (!SocketManager.instance) {\r\n SocketManager.instance = new SocketManager();\r\n }\r\n return SocketManager.instance;\r\n }\r\n\r\n async initialize(\r\n baseUrl: string,\r\n authManager: AuthManager,\r\n config: ConnectionConfig = {},\r\n livekit?: any\r\n ): Promise<void> {\r\n this.livekit = livekit;\r\n this.authManager = authManager;\r\n if (this.socket?.connected) {\r\n return;\r\n }\r\n\r\n this.updateConnectionState(\"CONNECTING\");\r\n const token = authManager.getCurrentToken();\r\n if (!token) {\r\n throw new Error(\"No authentication token available\");\r\n }\r\n\r\n try {\r\n this.socket = io(baseUrl, {\r\n auth: { token },\r\n autoConnect: false,\r\n reconnection: true,\r\n reconnectionAttempts: config.reconnectAttempts ?? 5,\r\n reconnectionDelay: config.reconnectDelay ?? 1000,\r\n reconnectionDelayMax: config.reconnectDelayMax ?? 30000,\r\n timeout: config.timeout ?? 10000,\r\n forceNew: true,\r\n path: \"/signal/socket.io\",\r\n transports: [\"websocket\"],\r\n withCredentials: false,\r\n });\r\n\r\n this.setupConnectionHandlers(authManager);\r\n this.setupEventHandlers();\r\n this.socket.connect();\r\n } catch (error) {\r\n this.updateConnectionState(\"ERROR\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupConnectionHandlers(authManager: AuthManager): void {\r\n if (!this.socket) return;\r\n\r\n this.socket.on(\"connect\", () => {\r\n this.updateConnectionState(\"CONNECTED\");\r\n this.logger.info(\"Connected to server\");\r\n });\r\n\r\n this.socket.on(\"disconnect\", (reason: string) => {\r\n this.updateConnectionState(\"DISCONNECTED\");\r\n this.logger.info(\"Disconnected\", { reason });\r\n });\r\n\r\n this.socket.on(\"connect_error\", (error: Error) => {\r\n this.updateConnectionState(\"ERROR\");\r\n this.logger.error(\"Connection error\", { error: error.message });\r\n });\r\n\r\n this.socket.io.on(\"reconnect_attempt\", () => {\r\n this.updateConnectionState(\"RECONNECTING\");\r\n const freshToken = authManager.getCurrentToken();\r\n if (freshToken && this.socket) {\r\n this.logger.debug(\"Refreshing auth token for reconnection\");\r\n this.socket.auth = { token: freshToken };\r\n }\r\n });\r\n\r\n this.socket.io.on(\"reconnect\", (attemptNumber: number) => {\r\n this.logger.info(\"Reconnected successfully\", { attemptNumber });\r\n });\r\n\r\n this.socket.io.on(\"reconnect_error\", (error: Error) => {\r\n this.logger.error(\"Reconnection error\", { error: error.message });\r\n if (this.isAuthError(error)) {\r\n this.updateConnectionState(\"FAILED\");\r\n }\r\n });\r\n\r\n this.socket.io.on(\"reconnect_failed\", () => {\r\n this.updateConnectionState(\"FAILED\");\r\n this.logger.error(\"All reconnection attempts failed\");\r\n });\r\n }\r\n\r\n private setupEventHandlers(): void {\r\n if (!this.socket) {\r\n return;\r\n }\r\n\r\n this.logger.debug(\"Setting up event handlers via registry\");\r\n\r\n console.log(\"[SOCKET_MANAGER] Setting up event handlers\", {\r\n socketId: this.socket.id,\r\n connected: this.socket.connected,\r\n });\r\n\r\n // Clean up existing handlers to prevent duplicate registrations\r\n if (this.handlerRegistry) {\r\n this.handlerRegistry.removeEventListeners(this.socket);\r\n this.handlerRegistry.destroy();\r\n }\r\n\r\n const options: SocketHandlerOptions = {\r\n livekit: this.livekit,\r\n };\r\n\r\n if (this.authManager) {\r\n options.authManager = this.authManager;\r\n }\r\n\r\n this.handlerRegistry = new SocketHandlerRegistry(options);\r\n\r\n this.handlerRegistry.registerEventListeners(this.socket);\r\n\r\n console.log(\"[SOCKET_MANAGER] Event handlers registered successfully\");\r\n }\r\n\r\n private isAuthError(error: Error): boolean {\r\n const authErrorIndicators = [\r\n \"unauthorized\",\r\n \"authentication\",\r\n \"token\",\r\n \"401\",\r\n \"403\",\r\n ];\r\n const errorMessage = error.message.toLowerCase();\r\n return authErrorIndicators.some((indicator) =>\r\n errorMessage.includes(indicator)\r\n );\r\n }\r\n\r\n private updateConnectionState(newState: ConnectionState): void {\r\n if (this.connectionState !== newState) {\r\n this.connectionState = newState;\r\n this.logger.debug(\"Connection state changed\", { newState });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.socket) {\r\n if (this.handlerRegistry) {\r\n this.handlerRegistry.removeEventListeners(this.socket);\r\n this.handlerRegistry.destroy();\r\n this.handlerRegistry = null;\r\n }\r\n this.socket.removeAllListeners();\r\n this.socket.disconnect();\r\n this.socket = null;\r\n }\r\n this.connectionState = \"DISCONNECTED\";\r\n SocketManager.instance = null;\r\n this.logger.debug(\"Destroyed and cleaned up\");\r\n }\r\n}\r\n","import type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\n\r\nexport class ApiError extends Error {\r\n\tpublic readonly url: string;\r\n\tpublic readonly status: number;\r\n\tpublic readonly statusText: string;\r\n\tpublic readonly body: unknown;\r\n\tpublic readonly request: ApiRequestOptions;\r\n\r\n\tconstructor(request: ApiRequestOptions, response: ApiResult, message: string) {\r\n\t\tsuper(message);\r\n\r\n\t\tthis.name = 'ApiError';\r\n\t\tthis.url = response.url;\r\n\t\tthis.status = response.status;\r\n\t\tthis.statusText = response.statusText;\r\n\t\tthis.body = response.body;\r\n\t\tthis.request = request;\r\n\t}\r\n}","export class CancelError extends Error {\r\n\tconstructor(message: string) {\r\n\t\tsuper(message);\r\n\t\tthis.name = 'CancelError';\r\n\t}\r\n\r\n\tpublic get isCancelled(): boolean {\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport interface OnCancel {\r\n\treadonly isResolved: boolean;\r\n\treadonly isRejected: boolean;\r\n\treadonly isCancelled: boolean;\r\n\r\n\t(cancelHandler: () => void): void;\r\n}\r\n\r\nexport class CancelablePromise<T> implements Promise<T> {\r\n\tprivate _isResolved: boolean;\r\n\tprivate _isRejected: boolean;\r\n\tprivate _isCancelled: boolean;\r\n\treadonly cancelHandlers: (() => void)[];\r\n\treadonly promise: Promise<T>;\r\n\tprivate _resolve?: (value: T | PromiseLike<T>) => void;\r\n\tprivate _reject?: (reason?: unknown) => void;\r\n\r\n\tconstructor(\r\n\t\texecutor: (\r\n\t\t\tresolve: (value: T | PromiseLike<T>) => void,\r\n\t\t\treject: (reason?: unknown) => void,\r\n\t\t\tonCancel: OnCancel\r\n\t\t) => void\r\n\t) {\r\n\t\tthis._isResolved = false;\r\n\t\tthis._isRejected = false;\r\n\t\tthis._isCancelled = false;\r\n\t\tthis.cancelHandlers = [];\r\n\t\tthis.promise = new Promise<T>((resolve, reject) => {\r\n\t\t\tthis._resolve = resolve;\r\n\t\t\tthis._reject = reject;\r\n\r\n\t\t\tconst onResolve = (value: T | PromiseLike<T>): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._isResolved = true;\r\n\t\t\t\tif (this._resolve) this._resolve(value);\r\n\t\t\t};\r\n\r\n\t\t\tconst onReject = (reason?: unknown): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._isRejected = true;\r\n\t\t\t\tif (this._reject) this._reject(reason);\r\n\t\t\t};\r\n\r\n\t\t\tconst onCancel = (cancelHandler: () => void): void => {\r\n\t\t\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.cancelHandlers.push(cancelHandler);\r\n\t\t\t};\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isResolved', {\r\n\t\t\t\tget: (): boolean => this._isResolved,\r\n\t\t\t});\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isRejected', {\r\n\t\t\t\tget: (): boolean => this._isRejected,\r\n\t\t\t});\r\n\r\n\t\t\tObject.defineProperty(onCancel, 'isCancelled', {\r\n\t\t\t\tget: (): boolean => this._isCancelled,\r\n\t\t\t});\r\n\r\n\t\t\treturn executor(onResolve, onReject, onCancel as OnCancel);\r\n\t\t});\r\n\t}\r\n\r\n\tget [Symbol.toStringTag]() {\r\n\t\treturn \"Cancellable Promise\";\r\n\t}\r\n\r\n\tpublic then<TResult1 = T, TResult2 = never>(\r\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\r\n\t\tonRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\r\n\t): Promise<TResult1 | TResult2> {\r\n\t\treturn this.promise.then(onFulfilled, onRejected);\r\n\t}\r\n\r\n\tpublic catch<TResult = never>(\r\n\t\tonRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\r\n\t): Promise<T | TResult> {\r\n\t\treturn this.promise.catch(onRejected);\r\n\t}\r\n\r\n\tpublic finally(onFinally?: (() => void) | null): Promise<T> {\r\n\t\treturn this.promise.finally(onFinally);\r\n\t}\r\n\r\n\tpublic cancel(): void {\r\n\t\tif (this._isResolved || this._isRejected || this._isCancelled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._isCancelled = true;\r\n\t\tif (this.cancelHandlers.length) {\r\n\t\t\ttry {\r\n\t\t\t\tfor (const cancelHandler of this.cancelHandlers) {\r\n\t\t\t\t\tcancelHandler();\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.warn('Cancellation threw an error', error);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.cancelHandlers.length = 0;\r\n\t\tif (this._reject) this._reject(new CancelError('Request aborted'));\r\n\t}\r\n\r\n\tpublic get isCancelled(): boolean {\r\n\t\treturn this._isCancelled;\r\n\t}\r\n}","import type { ApiRequestOptions } from './ApiRequestOptions';\r\n\r\ntype Headers = Record<string, string>;\r\ntype Middleware<T> = (value: T) => T | Promise<T>;\r\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\r\n\r\nexport class Interceptors<T> {\r\n _fns: Middleware<T>[];\r\n\r\n constructor() {\r\n this._fns = [];\r\n }\r\n\r\n eject(fn: Middleware<T>) {\r\n const index = this._fns.indexOf(fn);\r\n if (index !== -1) {\r\n this._fns = [\r\n ...this._fns.slice(0, index),\r\n ...this._fns.slice(index + 1),\r\n ];\r\n }\r\n }\r\n\r\n use(fn: Middleware<T>) {\r\n this._fns = [...this._fns, fn];\r\n }\r\n}\r\n\r\nexport type OpenAPIConfig = {\r\n\tBASE: string;\r\n\tCREDENTIALS: 'include' | 'omit' | 'same-origin';\r\n\tENCODE_PATH?: ((path: string) => string) | undefined;\r\n\tHEADERS?: Headers | Resolver<Headers> | undefined;\r\n\tPASSWORD?: string | Resolver<string> | undefined;\r\n\tTOKEN?: string | Resolver<string> | undefined;\r\n\tUSERNAME?: string | Resolver<string> | undefined;\r\n\tVERSION: string;\r\n\tWITH_CREDENTIALS: boolean;\r\n\tinterceptors: {request: Interceptors<RequestInit>;\r\n\t\tresponse: Interceptors<Response>;};\r\n};\r\n\r\nexport const OpenAPI: OpenAPIConfig = {\r\n\tBASE: '',\r\n\tCREDENTIALS: 'include',\r\n\tENCODE_PATH: undefined,\r\n\tHEADERS: undefined,\r\n\tPASSWORD: undefined,\r\n\tTOKEN: undefined,\r\n\tUSERNAME: undefined,\r\n\tVERSION: '0.0.1',\r\n\tWITH_CREDENTIALS: false,\r\n\tinterceptors: {request: new Interceptors(),response: new Interceptors(),\r\n\t},\r\n};","import { ApiError } from './ApiError';\r\nimport type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\nimport { CancelablePromise } from './CancelablePromise';\r\nimport type { OnCancel } from './CancelablePromise';\r\nimport type { OpenAPIConfig } from './OpenAPI';\r\n\r\nexport const isString = (value: unknown): value is string => {\r\n\treturn typeof value === 'string';\r\n};\r\n\r\nexport const isStringWithValue = (value: unknown): value is string => {\r\n\treturn isString(value) && value !== '';\r\n};\r\n\r\nexport const isBlob = (value: any): value is Blob => {\r\n\treturn value instanceof Blob;\r\n};\r\n\r\nexport const isFormData = (value: unknown): value is FormData => {\r\n\treturn value instanceof FormData;\r\n};\r\n\r\nexport const base64 = (str: string): string => {\r\n\ttry {\r\n\t\treturn btoa(str);\r\n\t} catch (err) {\r\n\t\t// @ts-ignore\r\n\t\treturn Buffer.from(str).toString('base64');\r\n\t}\r\n};\r\n\r\nexport const getQueryString = (params: Record<string, unknown>): string => {\r\n\tconst qs: string[] = [];\r\n\r\n\tconst append = (key: string, value: unknown) => {\r\n\t\tqs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\r\n\t};\r\n\r\n\tconst encodePair = (key: string, value: unknown) => {\r\n\t\tif (value === undefined || value === null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tvalue.forEach(v => encodePair(key, v));\r\n\t\t} else if (typeof value === 'object') {\r\n\t\t\tObject.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));\r\n\t\t} else {\r\n\t\t\tappend(key, value);\r\n\t\t}\r\n\t};\r\n\r\n\tObject.entries(params).forEach(([key, value]) => encodePair(key, value));\r\n\r\n\treturn qs.length ? `?${qs.join('&')}` : '';\r\n};\r\n\r\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\r\n\tconst encoder = config.ENCODE_PATH || encodeURI;\r\n\r\n\tconst path = options.url\r\n\t\t.replace('{api-version}', config.VERSION)\r\n\t\t.replace(/{(.*?)}/g, (substring: string, group: string) => {\r\n\t\t\tif (options.path?.hasOwnProperty(group)) {\r\n\t\t\t\treturn encoder(String(options.path[group]));\r\n\t\t\t}\r\n\t\t\treturn substring;\r\n\t\t});\r\n\r\n\tconst url = config.BASE + path;\r\n\treturn options.query ? url + getQueryString(options.query) : url;\r\n};\r\n\r\nexport const getFormData = (options: ApiRequestOptions): FormData | undefined => {\r\n\tif (options.formData) {\r\n\t\tconst formData = new FormData();\r\n\r\n\t\tconst process = (key: string, value: unknown) => {\r\n\t\t\tif (isString(value) || isBlob(value)) {\r\n\t\t\t\tformData.append(key, value);\r\n\t\t\t} else {\r\n\t\t\t\tformData.append(key, JSON.stringify(value));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tObject.entries(options.formData)\r\n\t\t\t.filter(([, value]) => value !== undefined && value !== null)\r\n\t\t\t.forEach(([key, value]) => {\r\n\t\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\t\tvalue.forEach(v => process(key, v));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tprocess(key, value);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\treturn formData;\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\ntype Resolver<T> = (options: ApiRequestOptions) => Promise<T>;\r\n\r\nexport const resolve = async <T>(options: ApiRequestOptions, resolver?: T | Resolver<T>): Promise<T | undefined> => {\r\n\tif (typeof resolver === 'function') {\r\n\t\treturn (resolver as Resolver<T>)(options);\r\n\t}\r\n\treturn resolver;\r\n};\r\n\r\nexport const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise<Headers> => {\r\n\tconst [token, username, password, additionalHeaders] = await Promise.all([\r\n\t\tresolve(options, config.TOKEN),\r\n\t\tresolve(options, config.USERNAME),\r\n\t\tresolve(options, config.PASSWORD),\r\n\t\tresolve(options, config.HEADERS),\r\n\t]);\r\n\r\n\tconst headers = Object.entries({\r\n\t\tAccept: 'application/json',\r\n\t\t...additionalHeaders,\r\n\t\t...options.headers,\r\n\t})\r\n\t\t.filter(([, value]) => value !== undefined && value !== null)\r\n\t\t.reduce((headers, [key, value]) => ({\r\n\t\t\t...headers,\r\n\t\t\t[key]: String(value),\r\n\t\t}), {} as Record<string, string>);\r\n\r\n\tif (isStringWithValue(token)) {\r\n\t\theaders['Authorization'] = `Bearer ${token}`;\r\n\t}\r\n\r\n\tif (isStringWithValue(username) && isStringWithValue(password)) {\r\n\t\tconst credentials = base64(`${username}:${password}`);\r\n\t\theaders['Authorization'] = `Basic ${credentials}`;\r\n\t}\r\n\r\n\tif (options.body !== undefined) {\r\n\t\tif (options.mediaType) {\r\n\t\t\theaders['Content-Type'] = options.mediaType;\r\n\t\t} else if (isBlob(options.body)) {\r\n\t\t\theaders['Content-Type'] = options.body.type || 'application/octet-stream';\r\n\t\t} else if (isString(options.body)) {\r\n\t\t\theaders['Content-Type'] = 'text/plain';\r\n\t\t} else if (!isFormData(options.body)) {\r\n\t\t\theaders['Content-Type'] = 'application/json';\r\n\t\t}\r\n\t}\r\n\r\n\treturn new Headers(headers);\r\n};\r\n\r\nexport const getRequestBody = (options: ApiRequestOptions): unknown => {\r\n\tif (options.body !== undefined) {\r\n\t\tif (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) {\r\n\t\t\treturn JSON.stringify(options.body)\r\n\t\t} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {\r\n\t\t\treturn options.body;\r\n\t\t} else {\r\n\t\t\treturn JSON.stringify(options.body);\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const sendRequest = async (\r\n\tconfig: OpenAPIConfig,\r\n\toptions: ApiRequestOptions,\r\n\turl: string,\r\n\tbody: any,\r\n\tformData: FormData | undefined,\r\n\theaders: Headers,\r\n\tonCancel: OnCancel\r\n): Promise<Response> => {\r\n\tconst controller = new AbortController();\r\n\r\n\tlet request: RequestInit = {\r\n\t\theaders,\r\n\t\tbody: body ?? formData,\r\n\t\tmethod: options.method,\r\n\t\tsignal: controller.signal,\r\n\t};\r\n\r\n\tif (config.WITH_CREDENTIALS) {\r\n\t\trequest.credentials = config.CREDENTIALS;\r\n\t}\r\n\r\n\tfor (const fn of config.interceptors.request._fns) {\r\n\t\trequest = await fn(request)\r\n\t}\r\n\r\n\tonCancel(() => controller.abort());\r\n\r\n\treturn await fetch(url, request);\r\n};\r\n\r\nexport const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {\r\n\tif (responseHeader) {\r\n\t\tconst content = response.headers.get(responseHeader);\r\n\t\tif (isString(content)) {\r\n\t\t\treturn content;\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const getResponseBody = async (response: Response): Promise<unknown> => {\r\n\tif (response.status !== 204) {\r\n\t\ttry {\r\n\t\t\tconst contentType = response.headers.get('Content-Type');\r\n\t\t\tif (contentType) {\r\n\t\t\t\tconst binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/'];\r\n\t\t\t\tif (contentType.includes('application/json') || contentType.includes('+json')) {\r\n\t\t\t\t\treturn await response.json();\r\n\t\t\t\t} else if (binaryTypes.some(type => contentType.includes(type))) {\r\n\t\t\t\t\treturn await response.blob();\r\n\t\t\t\t} else if (contentType.includes('multipart/form-data')) {\r\n\t\t\t\t\treturn await response.formData();\r\n\t\t\t\t} else if (contentType.includes('text/')) {\r\n\t\t\t\t\treturn await response.text();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(error);\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n};\r\n\r\nexport const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {\r\n\tconst errors: Record<number, string> = {\r\n\t\t400: 'Bad Request',\r\n\t\t401: 'Unauthorized',\r\n\t\t402: 'Payment Required',\r\n\t\t403: 'Forbidden',\r\n\t\t404: 'Not Found',\r\n\t\t405: 'Method Not Allowed',\r\n\t\t406: 'Not Acceptable',\r\n\t\t407: 'Proxy Authentication Required',\r\n\t\t408: 'Request Timeout',\r\n\t\t409: 'Conflict',\r\n\t\t410: 'Gone',\r\n\t\t411: 'Length Required',\r\n\t\t412: 'Precondition Failed',\r\n\t\t413: 'Payload Too Large',\r\n\t\t414: 'URI Too Long',\r\n\t\t415: 'Unsupported Media Type',\r\n\t\t416: 'Range Not Satisfiable',\r\n\t\t417: 'Expectation Failed',\r\n\t\t418: 'Im a teapot',\r\n\t\t421: 'Misdirected Request',\r\n\t\t422: 'Unprocessable Content',\r\n\t\t423: 'Locked',\r\n\t\t424: 'Failed Dependency',\r\n\t\t425: 'Too Early',\r\n\t\t426: 'Upgrade Required',\r\n\t\t428: 'Precondition Required',\r\n\t\t429: 'Too Many Requests',\r\n\t\t431: 'Request Header Fields Too Large',\r\n\t\t451: 'Unavailable For Legal Reasons',\r\n\t\t500: 'Internal Server Error',\r\n\t\t501: 'Not Implemented',\r\n\t\t502: 'Bad Gateway',\r\n\t\t503: 'Service Unavailable',\r\n\t\t504: 'Gateway Timeout',\r\n\t\t505: 'HTTP Version Not Supported',\r\n\t\t506: 'Variant Also Negotiates',\r\n\t\t507: 'Insufficient Storage',\r\n\t\t508: 'Loop Detected',\r\n\t\t510: 'Not Extended',\r\n\t\t511: 'Network Authentication Required',\r\n\t\t...options.errors,\r\n\t}\r\n\r\n\tconst error = errors[result.status];\r\n\tif (error) {\r\n\t\tthrow new ApiError(options, result, error);\r\n\t}\r\n\r\n\tif (!result.ok) {\r\n\t\tconst errorStatus = result.status ?? 'unknown';\r\n\t\tconst errorStatusText = result.statusText ?? 'unknown';\r\n\t\tconst errorBody = (() => {\r\n\t\t\ttry {\r\n\t\t\t\treturn JSON.stringify(result.body, null, 2);\r\n\t\t\t} catch (e) {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t})();\r\n\r\n\t\tthrow new ApiError(options, result,\r\n\t\t\t`Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * Request method\r\n * @param config The OpenAPI configuration object\r\n * @param options The request options from the service\r\n * @returns CancelablePromise<T>\r\n * @throws ApiError\r\n */\r\nexport const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {\r\n\treturn new CancelablePromise(async (resolve, reject, onCancel) => {\r\n\t\ttry {\r\n\t\t\tconst url = getUrl(config, options);\r\n\t\t\tconst formData = getFormData(options);\r\n\t\t\tconst body = getRequestBody(options);\r\n\t\t\tconst headers = await getHeaders(config, options);\r\n\r\n\t\t\tif (!onCancel.isCancelled) {\r\n\t\t\t\tlet response = await sendRequest(config, options, url, body, formData, headers, onCancel);\r\n\r\n\t\t\t\tfor (const fn of config.interceptors.response._fns) {\r\n\t\t\t\t\tresponse = await fn(response)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst responseBody = await getResponseBody(response);\r\n\t\t\t\tconst responseHeader = getResponseHeader(response, options.responseHeader);\r\n\r\n\t\t\t\tconst result: ApiResult = {\r\n\t\t\t\t\turl,\r\n\t\t\t\t\tok: response.ok,\r\n\t\t\t\t\tstatus: response.status,\r\n\t\t\t\t\tstatusText: response.statusText,\r\n\t\t\t\t\tbody: responseHeader ?? responseBody,\r\n\t\t\t\t};\r\n\r\n\t\t\t\tcatchErrorCodes(options, result);\r\n\r\n\t\t\t\tresolve(result.body);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\treject(error);\r\n\t\t}\r\n\t});\r\n};","import type { CancelablePromise } from './core/CancelablePromise';\r\nimport { OpenAPI } from './core/OpenAPI';\r\nimport { request as __request } from './core/request';\r\nimport type { HealthData, CallsData } from './models';\r\n\r\nexport class HealthService {\r\n\r\n\t/**\r\n\t * @returns any Service is healthy\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getHealth(): CancelablePromise<HealthData['responses']['GetHealth']> {\r\n\t\t\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/health',\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Service is healthy\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static getSignalHealth(): CancelablePromise<HealthData['responses']['GetSignalHealth']> {\r\n\t\t\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\turl: '/signal/health',\r\n\t\t});\r\n\t}\r\n\r\n}\r\n\r\nexport class CallsService {\r\n\r\n\t/**\r\n\t * @returns any Invites sent successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsInvite(data: CallsData['payloads']['PostSignalCallsInvite']): CancelablePromise<CallsData['responses']['PostSignalCallsInvite']> {\r\n\t\tconst {\r\n \r\n appId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/invite',\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have permission to invite`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call accepted successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdAccept(data: CallsData['payloads']['PostSignalCallsByCallIdAccept']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdAccept']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/accept',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User is not a participant`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be accepted in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call declined successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdDecline(data: CallsData['payloads']['PostSignalCallsByCallIdDecline']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdDecline']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/decline',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User is not a participant`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be declined in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call cancelled successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdCancel(data: CallsData['payloads']['PostSignalCallsByCallIdCancel']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdCancel']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/cancel',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have permission to cancel`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be cancelled in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Transfer initiated successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdTransfer(data: CallsData['payloads']['PostSignalCallsByCallIdTransfer']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdTransfer']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/transfer',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have permission to transfer`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Call cannot be transferred in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Participant kicked successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdKick(data: CallsData['payloads']['PostSignalCallsByCallIdKick']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdKick']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/kick',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have permission to kick`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Participant cannot be kicked in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Participant muted successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdMute(data: CallsData['payloads']['PostSignalCallsByCallIdMute']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdMute']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId,\r\nrequestBody\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/mute',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\tbody: requestBody,\r\n\t\t\tmediaType: 'application/json',\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `User does not have permission to mute`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t\t409: `Participant cannot be muted in current state`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Call ended successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdEnd(data: CallsData['payloads']['PostSignalCallsByCallIdEnd']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdEnd']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/end',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t403: `Only host can end call`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @returns any Left call successfully\r\n\t * @throws ApiError\r\n\t */\r\n\tpublic static postSignalCallsByCallIdLeave(data: CallsData['payloads']['PostSignalCallsByCallIdLeave']): CancelablePromise<CallsData['responses']['PostSignalCallsByCallIdLeave']> {\r\n\t\tconst {\r\n \r\n callId,\r\nappId\r\n } = data;\r\n\t\treturn __request(OpenAPI, {\r\n\t\t\tmethod: 'POST',\r\n\t\t\turl: '/signal/calls/{callId}/leave',\r\n\t\t\tpath: {\r\n\t\t\t\tcallId\r\n\t\t\t},\r\n\t\t\tquery: {\r\n\t\t\t\tappId\r\n\t\t\t},\r\n\t\t\terrors: {\r\n\t\t\t\t400: `Invalid request`,\r\n\t\t\t\t401: `Authentication required`,\r\n\t\t\t\t404: `Call not found`,\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n}","import { OpenAPI } from \"../../generated/api\";\r\nimport { createLogger } from \"../../utils/logger\";\r\nimport type { ApiConfig } from \"./types\";\r\n\r\nconst logger = createLogger(\"api-config\");\r\n\r\nexport class OpenApiConfigService {\r\n private static instance: OpenApiConfigService;\r\n private configured = false;\r\n\r\n private constructor() {\r\n // Add request interceptor to log authorization headers\r\n OpenAPI.interceptors.request.use((request) => {\r\n // Request headers can be Headers object or plain object\r\n const headers = request.headers as Headers | Record<string, string>;\r\n let authHeader: string | null = null;\r\n\r\n if (headers instanceof Headers) {\r\n authHeader = headers.get(\"Authorization\") || null;\r\n } else if (headers && typeof headers === \"object\") {\r\n authHeader = (headers as Record<string, string>)[\"Authorization\"] || null;\r\n }\r\n\r\n if (authHeader) {\r\n logger.debug(\"API Request with Authorization header\", {\r\n hasAuth: true,\r\n authPrefix: authHeader.substring(0, 20) + \"...\"\r\n });\r\n } else {\r\n logger.warn(\"API Request WITHOUT Authorization header\", {\r\n hasAuth: false\r\n });\r\n }\r\n\r\n return request;\r\n });\r\n }\r\n\r\n static getInstance(): OpenApiConfigService {\r\n if (!OpenApiConfigService.instance) {\r\n OpenApiConfigService.instance = new OpenApiConfigService();\r\n }\r\n return OpenApiConfigService.instance;\r\n }\r\n\r\n configure(config: ApiConfig): void {\r\n OpenAPI.BASE = config.baseUrl;\r\n\r\n // Handle token - OpenAPI expects string | Resolver<string>\r\n // Resolver<string> = (options: ApiRequestOptions) => Promise<string>\r\n if (typeof config.token === \"function\") {\r\n const tokenFn = config.token; // Capture the function reference\r\n OpenAPI.TOKEN = async (_options) => {\r\n const result = tokenFn();\r\n const token = typeof result === \"string\" ? result : await result;\r\n\r\n if (!token) {\r\n logger.warn(\"Token provider returned empty token\");\r\n } else {\r\n logger.debug(\"Token resolved successfully\", {\r\n tokenPrefix: token.substring(0, 10) + \"...\"\r\n });\r\n }\r\n\r\n return token;\r\n };\r\n } else {\r\n OpenAPI.TOKEN = config.token;\r\n }\r\n\r\n OpenAPI.CREDENTIALS = config.credentials ?? \"include\";\r\n OpenAPI.WITH_CREDENTIALS = config.withCredentials ?? false;\r\n\r\n if (config.headers) {\r\n OpenAPI.HEADERS = config.headers;\r\n }\r\n\r\n this.configured = true;\r\n logger.info(\"API configuration completed\", {\r\n baseUrl: config.baseUrl,\r\n hasToken: !!config.token\r\n });\r\n }\r\n\r\n isConfigured(): boolean {\r\n return this.configured;\r\n }\r\n\r\n setToken(token: string): void {\r\n OpenAPI.TOKEN = token;\r\n }\r\n}\r\n\r\nexport const apiConfig = OpenApiConfigService.getInstance();\r\n\r\nexport { OpenAPI };\r\n\r\n// Re-export ApiConfig type\r\nexport type { ApiConfig } from \"./types\";\r\n","import { CallsService } from \"../generated/api\";\r\nimport type { CallsData } from \"../generated/api/models\";\r\nimport { apiConfig } from \"../core/signal/api.config\";\r\nimport { createLogger } from \"../utils/logger\";\r\n\r\nconst logger = createLogger(\"calls-service\");\r\n\r\nexport interface CallsServiceConfig {\r\n appId: string;\r\n}\r\n\r\nexport interface InitiateCallParams {\r\n invitees: string[];\r\n mode?: \"AUDIO\" | \"VIDEO\";\r\n callId?: string;\r\n}\r\n\r\nexport function createCallsService(config: CallsServiceConfig) {\r\n const { appId } = config;\r\n\r\n // Helper to ensure API is configured before making requests\r\n const ensureApiConfigured = () => {\r\n if (!apiConfig.isConfigured()) {\r\n logger.error(\"API not configured before making call service request\");\r\n throw new Error(\r\n \"API configuration missing. Ensure the SDK is properly initialized.\"\r\n );\r\n }\r\n };\r\n\r\n async function initiate(\r\n params: InitiateCallParams\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsInvite\"]> {\r\n ensureApiConfigured();\r\n const requestBody: NonNullable<\r\n CallsData[\"payloads\"][\"PostSignalCallsInvite\"][\"requestBody\"]\r\n > = {\r\n mode: params.mode || \"AUDIO\",\r\n participants: params.invitees.map((userId) => ({ userId })),\r\n };\r\n if (params.callId) {\r\n requestBody.callId = params.callId;\r\n }\r\n return CallsService.postSignalCallsInvite({\r\n appId,\r\n requestBody,\r\n });\r\n }\r\n\r\n async function accept(\r\n callId: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdAccept\"]> {\r\n ensureApiConfigured();\r\n return CallsService.postSignalCallsByCallIdAccept({\r\n callId,\r\n appId,\r\n });\r\n }\r\n\r\n async function decline(\r\n callId: string,\r\n reason?: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdDecline\"]> {\r\n ensureApiConfigured();\r\n const payload: CallsData[\"payloads\"][\"PostSignalCallsByCallIdDecline\"] = {\r\n callId,\r\n appId,\r\n };\r\n if (reason) {\r\n payload.requestBody = { reason };\r\n }\r\n return CallsService.postSignalCallsByCallIdDecline(payload);\r\n }\r\n\r\n async function cancel(\r\n callId: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdCancel\"]> {\r\n ensureApiConfigured();\r\n return CallsService.postSignalCallsByCallIdCancel({\r\n callId,\r\n appId,\r\n });\r\n }\r\n\r\n async function leave(\r\n callId: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdLeave\"]> {\r\n ensureApiConfigured();\r\n return CallsService.postSignalCallsByCallIdLeave({\r\n callId,\r\n appId,\r\n });\r\n }\r\n\r\n async function end(\r\n callId: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdEnd\"]> {\r\n ensureApiConfigured();\r\n return CallsService.postSignalCallsByCallIdEnd({\r\n callId,\r\n appId,\r\n });\r\n }\r\n\r\n async function transfer(\r\n callId: string,\r\n targetParticipantId: string,\r\n reason?: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdTransfer\"]> {\r\n ensureApiConfigured();\r\n const requestBody: NonNullable<\r\n CallsData[\"payloads\"][\"PostSignalCallsByCallIdTransfer\"][\"requestBody\"]\r\n > = {\r\n targetParticipantId,\r\n };\r\n if (reason) {\r\n requestBody.reason = reason;\r\n }\r\n return CallsService.postSignalCallsByCallIdTransfer({\r\n callId,\r\n appId,\r\n requestBody,\r\n });\r\n }\r\n\r\n async function kick(\r\n callId: string,\r\n participantId: string,\r\n reason?: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdKick\"]> {\r\n ensureApiConfigured();\r\n const requestBody: NonNullable<\r\n CallsData[\"payloads\"][\"PostSignalCallsByCallIdKick\"][\"requestBody\"]\r\n > = {\r\n participantId,\r\n };\r\n if (reason) {\r\n requestBody.reason = reason;\r\n }\r\n return CallsService.postSignalCallsByCallIdKick({\r\n callId,\r\n appId,\r\n requestBody,\r\n });\r\n }\r\n\r\n async function mute(\r\n callId: string,\r\n participantId: string\r\n ): Promise<CallsData[\"responses\"][\"PostSignalCallsByCallIdMute\"]> {\r\n ensureApiConfigured();\r\n return CallsService.postSignalCallsByCallIdMute({\r\n callId,\r\n appId,\r\n requestBody: {\r\n participantId,\r\n },\r\n });\r\n }\r\n\r\n return {\r\n initiate,\r\n accept,\r\n decline,\r\n cancel,\r\n leave,\r\n end,\r\n transfer,\r\n kick,\r\n mute,\r\n };\r\n}\r\n\r\nexport type CallsServiceInstance = ReturnType<typeof createCallsService>;\r\n","import { AuthManager, SocketManager } from \"../core\";\r\nimport { type ApiConfig, apiConfig } from \"../core/signal\";\r\nimport { rtcStore } from \"../state/store\";\r\nimport { type LogLevel, setGlobalLoggerOptions } from \"../utils/logger\";\r\nimport { type CallsServiceInstance, createCallsService } from \"./calls.service\";\r\n\r\nexport interface SdkBuildOptions {\r\n appId: string;\r\n signalHost: string;\r\n authProvider: () => string | null;\r\n\r\n // Logging configuration\r\n logLevel?: LogLevel;\r\n enableDebug?: boolean;\r\n\r\n // Custom log callback\r\n log?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface RtcSdk {\r\n store: typeof rtcStore;\r\n auth: AuthManager;\r\n socket: SocketManager;\r\n calls: CallsServiceInstance;\r\n cleanup: () => void;\r\n\r\n configureApi: (config: ApiConfig) => void;\r\n}\r\n\r\nexport function buildSdk(opts: SdkBuildOptions): RtcSdk {\r\n // Configure global logging system\r\n const loggerOptions: any = {};\r\n if (opts.logLevel !== undefined) {\r\n loggerOptions.level = opts.logLevel;\r\n }\r\n if (opts.enableDebug !== undefined) {\r\n loggerOptions.enableDebug = opts.enableDebug;\r\n }\r\n if (opts.log !== undefined) {\r\n loggerOptions.customLogger = opts.log;\r\n }\r\n setGlobalLoggerOptions(loggerOptions);\r\n\r\n // Initialize core managers\r\n const auth = new AuthManager(opts.authProvider);\r\n const socket = SocketManager.getInstance();\r\n const callsService = createCallsService({ appId: opts.appId });\r\n\r\n // Configure API immediately with the signal host and auth provider\r\n // This ensures API is ready before any requests are made\r\n apiConfig.configure({\r\n baseUrl: opts.signalHost,\r\n token: async () => {\r\n const token = auth.getCurrentToken();\r\n return token || \"\";\r\n },\r\n });\r\n\r\n // Socket now handles events directly - no event bridge needed\r\n\r\n const cleanup = () => {\r\n socket.destroy();\r\n rtcStore.getState().reset();\r\n };\r\n\r\n return {\r\n store: rtcStore,\r\n auth,\r\n socket,\r\n calls: callsService,\r\n cleanup,\r\n\r\n // API configuration - can be called again to override if needed\r\n configureApi: (config: ApiConfig) => {\r\n apiConfig.configure(config);\r\n },\r\n };\r\n}\r\n","import React, { createContext, useContext, useEffect, useMemo } from \"react\";\r\nimport type { Nullable } from \"../core\";\r\nimport { type RtcSdk, type SdkBuildOptions, buildSdk } from \"../services\";\r\nimport { rtcStore } from \"../state/store\";\r\n\r\nexport type RtcOptions = SdkBuildOptions;\r\nexport type { RtcSdk };\r\n\r\nconst RtcContext = createContext<Nullable<RtcSdk>>(null);\r\n\r\nexport function RtcProvider({\r\n options,\r\n children,\r\n}: {\r\n options: RtcOptions;\r\n children: React.ReactNode;\r\n}) {\r\n const sdk = useMemo(() => buildSdk(options), [options]);\r\n\r\n useEffect(() => {\r\n // API is already configured in buildSdk, so we can directly initialize the socket\r\n // Initialize socket connection with livekit service\r\n sdk.socket\r\n .initialize(\r\n options.signalHost,\r\n sdk.auth,\r\n {\r\n reconnectAttempts: 5,\r\n reconnectDelay: 1000,\r\n },\r\n undefined\r\n )\r\n .catch((error) => {\r\n options.log?.(\"error\", \"Failed to initialize socket connection\", error);\r\n\r\n rtcStore.getState().addError({\r\n code: \"SOCKET_INIT_ERROR\",\r\n message: \"Failed to initialize socket connection\",\r\n timestamp: Date.now(),\r\n context: error,\r\n });\r\n });\r\n\r\n return () => {\r\n sdk.cleanup();\r\n };\r\n }, [sdk, options]);\r\n\r\n return React.createElement(RtcContext.Provider, { value: sdk }, children);\r\n}\r\n\r\nexport const useSdk = (): RtcSdk => {\r\n const ctx = useContext(RtcContext);\r\n if (!ctx) {\r\n throw new Error(\"useSdk must be used within RtcProvider\");\r\n }\r\n return ctx;\r\n};\r\n","import { useRtcStore } from \"../state/store\";\r\n\r\nexport interface CallState {\r\n id: string | null;\r\n status: \"pending\" | \"active\" | \"ended\" | null;\r\n mode: \"AUDIO\" | \"VIDEO\" | null;\r\n roomName: string | null;\r\n}\r\n\r\nexport function useCallState(): CallState {\r\n const session = useRtcStore((state) => state.session);\r\n\r\n if (!session) {\r\n return {\r\n id: null,\r\n status: null,\r\n mode: null,\r\n roomName: null,\r\n };\r\n }\r\n\r\n return {\r\n id: session.id,\r\n status: session.status,\r\n mode: session.mode,\r\n roomName: session.livekitInfo?.roomName || null,\r\n };\r\n}\r\n","import { useRtcStore } from \"../state/store\";\r\n\r\n/**\r\n * Get the current session ID.\r\n * Returns null when no active session.\r\n */\r\nexport function useSessionId(): string | null {\r\n return useRtcStore((state) => state.session?.id ?? null);\r\n}\r\n","import { useRtcStore } from \"../state/store\";\r\nimport type { IncomingInvite } from \"../state/types\";\r\n\r\nexport function useIncomingInvite(): IncomingInvite | null {\r\n return useRtcStore((state) => state.incomingInvite);\r\n}\r\n","import { useSdk } from \"../provider/RtcProvider\";\r\nimport { useSessionId } from \"./useSessionId\";\r\nimport { useIncomingInvite } from \"./useIncomingInvite\";\r\n\r\nexport function useCallActions() {\r\n const sdk = useSdk();\r\n const sessionId = useSessionId();\r\n const incomingInvite = useIncomingInvite();\r\n\r\n return {\r\n initiate: (participants: string[], type: \"AUDIO\" | \"VIDEO\") => {\r\n return sdk.calls.initiate({ invitees: participants, mode: type });\r\n },\r\n invite: (participants: string[]) => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to invite participants to\");\r\n }\r\n\r\n const session = sdk.store.getState().session;\r\n const mode = session?.mode || \"VIDEO\";\r\n\r\n return sdk.calls.initiate({\r\n invitees: participants,\r\n mode,\r\n callId: sessionId,\r\n });\r\n },\r\n accept: () => {\r\n if (!incomingInvite) {\r\n throw new Error(\"No incoming invite to accept\");\r\n }\r\n\r\n return sdk.calls.accept(incomingInvite.callId);\r\n },\r\n decline: (reason?: string) => {\r\n if (!incomingInvite) {\r\n throw new Error(\"No incoming invite to decline\");\r\n }\r\n\r\n return sdk.calls.decline(incomingInvite.callId, reason);\r\n },\r\n cancel: () => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to cancel\");\r\n }\r\n\r\n return sdk.calls.cancel(sessionId);\r\n },\r\n leave: () => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to leave\");\r\n }\r\n\r\n return sdk.calls.leave(sessionId);\r\n },\r\n end: () => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to end\");\r\n }\r\n\r\n return sdk.calls.end(sessionId);\r\n },\r\n transfer: (targetParticipantId: string, reason?: string) => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to transfer\");\r\n }\r\n\r\n return sdk.calls.transfer(sessionId, targetParticipantId, reason);\r\n },\r\n kick: (participantId: string, reason?: string) => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to kick participant from\");\r\n }\r\n\r\n return sdk.calls.kick(sessionId, participantId, reason);\r\n },\r\n mute: (participantId: string) => {\r\n if (!sessionId) {\r\n throw new Error(\"No active session to mute participant in\");\r\n }\r\n\r\n return sdk.calls.mute(sessionId, participantId);\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { eventBus } from \"../core/events\";\r\nimport type { EventHandler, SdkEvent, SdkEventType } from \"../core/events\";\r\n\r\nexport function useEvent<T = any>(\r\n eventType: string | SdkEventType,\r\n callback?: EventHandler<T> | null\r\n): SdkEvent<T> | undefined {\r\n const [lastEvent, setLastEvent] = useState<SdkEvent<T> | undefined>(\r\n undefined\r\n );\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n const handler: EventHandler<T> = (event: SdkEvent<T>) => {\r\n setLastEvent(event);\r\n if (callbackRef.current) {\r\n callbackRef.current(event);\r\n }\r\n };\r\n\r\n const subscription = eventBus.on(eventType, handler);\r\n\r\n return () => {\r\n subscription.unsubscribe();\r\n };\r\n }, [eventType]);\r\n\r\n return lastEvent;\r\n}\r\n","import { useRtcStore } from \"../state/store\";\r\nimport type { OutgoingInvite } from \"../state/types\";\r\n\r\nexport function useOutgoingInvites(): Record<string, OutgoingInvite> {\r\n return useRtcStore((state) => state.outgoingInvites);\r\n}\r\n","import { useRtcStore } from \"../state/store\";\r\n\r\nexport function useInviteAccepted(): boolean {\r\n return useRtcStore((state) => {\r\n return Object.values(state.outgoingInvites).some(\r\n (invite) => invite.status === \"accepted\"\r\n );\r\n });\r\n}\r\n","import { useRtcStore } from \"../state/store\";\r\n\r\nexport function useCallInitiated(): boolean {\r\n return useRtcStore((state) => state.initiated);\r\n}\r\n","/**\r\n * Get the duration of the current session in seconds.\r\n * Returns 0 for now (placeholder implementation).\r\n */\r\nexport function useSessionDuration(): number {\r\n return 0;\r\n}\r\n","import { useState, useEffect } from \"react\";\r\nimport {Room, type RoomOptions} from \"livekit-client\";\r\nimport { useRtcStore } from \"../state/store\";\r\n\r\nconst defaultRoomOptions = {\r\n adaptiveStream: true,\r\n dynacast: true,\r\n};\r\n\r\nexport function useRoom(options?: RoomOptions): Room | null {\r\n const [room] = useState(() => new Room(options || defaultRoomOptions));\r\n const livekitInfo = useRtcStore((state) => state.session?.livekitInfo);\r\n\r\n useEffect(() => {\r\n if (!livekitInfo) {\r\n return;\r\n }\r\n\r\n room.connect(livekitInfo.url, livekitInfo.token);\r\n return () => {\r\n room.disconnect();\r\n };\r\n }, [livekitInfo, room]);\r\n\r\n if (!livekitInfo) {\r\n return null;\r\n }\r\n\r\n return room;\r\n}\r\n","import { useParticipantInfo as useLiveKitParticipantInfo, useParticipants } from \"@livekit/components-react\";\r\nimport type { Participant as LiveKitParticipant } from \"livekit-client\";\r\nimport { useRoom } from \"./useRoom\";\r\nimport type { ParticipantMetadata } from \"../state/types\";\r\n\r\nexport function useParticipantMetadata(\r\n participantOrIdentity?: string | LiveKitParticipant\r\n): ParticipantMetadata | null {\r\n const room = useRoom();\r\n const participants = useParticipants(room ? { room } : {});\r\n let resolvedParticipant: LiveKitParticipant | undefined;\r\n\r\n if (typeof participantOrIdentity === \"string\") {\r\n resolvedParticipant = participants.find(\r\n (p) => p.identity === participantOrIdentity\r\n );\r\n } else if (participantOrIdentity) {\r\n resolvedParticipant = participantOrIdentity;\r\n }\r\n\r\n const livekitInfo = useLiveKitParticipantInfo(\r\n resolvedParticipant ? { participant: resolvedParticipant } : {}\r\n );\r\n\r\n if (!livekitInfo.metadata) {\r\n return null;\r\n }\r\n\r\n try {\r\n const metadata = JSON.parse(livekitInfo.metadata) as ParticipantMetadata;\r\n if (!metadata.userId || !metadata.role) {\r\n console.warn(\"Invalid participant metadata: missing required fields\", metadata);\r\n return null;\r\n }\r\n\r\n return {\r\n userId: metadata.userId,\r\n role: metadata.role,\r\n firstName: metadata.firstName || \"\",\r\n lastName: metadata.lastName || \"\",\r\n username: metadata.username || \"\",\r\n email: metadata.email || \"\",\r\n profilePhoto: metadata.profilePhoto || \"\",\r\n };\r\n } catch (error) {\r\n console.error(\"Failed to parse participant metadata:\", error);\r\n return null;\r\n }\r\n}\r\n"]}