@sanseng/livekit-ws-sdk 0.1.11 → 0.1.13
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.
- package/dist/index.cjs.js +8316 -9
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.esm.js +8301 -9
- package/dist/index.esm.js.map +1 -0
- package/dist/index.full.umd.js +35491 -46
- package/dist/index.umd.js +8420 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/constants/errorCode.ts","../src/utils/SDKError.ts","../src/utils/Disposable.ts","../src/utils/Logger.ts","../src/events/EventBus.ts","../src/state/SessionState.ts","../src/constants/defaults.ts","../src/client/SDKContext.ts","../src/state/ConnectionSnapshot.ts","../src/state/baseStateMachine.ts","../src/state/SDKConnectionFSM.ts","../src/client/ConnectionLifecycleCoordinator.ts","../src/video/VideoSource.ts","../src/video/strategies/RawRenderStrategy.ts","../src/video/strategies/RawRenderStrategyFactory.ts","../src/video/renderer/CanvasRenderer.ts","../src/video/renderer/VideoElementRenderer.ts","../src/video/strategies/ProcessedRenderStrategy.ts","../src/video/strategies/ProcessedRenderStrategyFactory.ts","../src/video/strategies/VideoRenderStrategyFactoryMapper.ts","../src/video/VideoPipeline.ts","../src/video/processors/VideoProcessor.ts","../src/video/processors/GreenScreenProcessor.ts","../src/video/VideoController.ts","../src/audio/strategies/NoOpAudioStrategy.ts","../src/audio/AudioPipeline.ts","../src/audio/OutputAudioPipeline.ts","../src/audio/protocol/AudioHeaderPacker.ts","../src/audio/AudioFrameSender.ts","../src/audio/AudioSource.ts","../src/audio/sources/AudioResamplerWorklet.ts","../src/audio/sources/WebRTCAudioSource.ts","../src/audio/sources/WebRTCAudioSourceFactory.ts","../src/audio/AudioController.ts","../src/video/camera/CameraSource.ts","../src/video/camera/ScreenshotScheduler.ts","../src/video/camera/ScreenshotEncoder.ts","../src/video/camera/protocol/ImageHeaderPacker.ts","../src/video/camera/ImageFrameSender.ts","../src/video/camera/CameraController.ts","../src/state/ConversationState.ts","../src/conversation/state/ConversationStateMachine.ts","../src/conversation/ConversationSession.ts","../src/conversation/MessageAssembler.ts","../src/conversation/services/ConversationIdService.ts","../src/conversation/ConversationManager.ts","../src/conversation/ConversationController.ts","../src/rtc/TrackRegistry.ts","../src/rtc/handlers/VideoTrackHandler.ts","../src/rtc/handlers/AudioTrackHandler.ts","../src/rtc/LiveKitEventAdapter.ts","../src/rtc/LiveKitService.ts","../src/transport/WSDispatcher.ts","../src/transport/ConversationTransport.ts","../src/events/publicEvents.ts","../src/http/HttpService.ts","../src/utils/index.ts","../src/http/httpController.ts","../src/client/SDKClient.ts","../src/client/createClient.ts","../src/debug/LocalVideoDebugSource.ts","../src/debug/VideoPipelineRunner.ts","../src/debug/StandaloneVideoDebugger.ts"],"sourcesContent":["/**\n * Error codes\n * @author sansen\n */\nexport enum ErrorCode {\n SDK_AUTH_TOKEN_FAILED = 'SDK_AUTH_TOKEN_FAILED',\n SDK_GET_LIVEKIT_CONFIG_FAILED = 'SDK_GET_LIVEKIT_CONFIG_FAILED',\n SDK_RECONNECT_FAILED = 'SDK_RECONNECT_FAILED',\n SDK_DISCONNECT_FAILED = 'SDK_DISCONNECT_FAILED',\n SDK_NOT_CONNECTED = 'SDK_NOT_CONNECTED',\n SDK_CONNECT_FAILED = 'SDK_CONNECT_FAILED',\n\n SDK_SWITCH_VIDEO_FAILED = 'SDK_SWITCH_VIDEO_FAILED',\n\n // fallback error code\n SDK_ERROR = 'SDK_ERROR',\n\n SDK_PRECONNECT_FAILED = 'SDK_PRECONNECT_FAILED',\n SDK_INTERRUPT_CONVERSATION_FAILED = 'SDK_INTERRUPT_CONVERSATION_FAILED',\n SDK_INITIALIZATION_FAILED = 'SDK_INITIALIZATION_FAILED',\n SDK_INVALID_STATE_TRANSITION = 'SDK_INVALID_STATE_TRANSITION',\n NO_AVATARNAME = 'NO_AVATARNAME',\n\n AUDIO_CAPTURE_START_FAILED = 'AUDIO_CAPTURE_START_FAILED',\n AUDIO_CAPTURE_FAILED = 'AUDIO_CAPTURE_FAILED',\n AUDIO_INVALID_SAMPLE_RATE = 'AUDIO_INVALID_SAMPLE_RATE',\n AUDIO_INVALID_CHANNEL = 'AUDIO_INVALID_CHANNEL',\n AUDIO_INVALID_HEADER_LENGTH = 'AUDIO_INVALID_HEADER_LENGTH',\n AUDIO_INVALID_TYPE = 'AUDIO_INVALID_TYPE',\n AUDIO_INVALID_RESERVED = 'AUDIO_INVALID_RESERVED',\n AUDIO_CONTROLLER_NOT_AVAILABLE = 'AUDIO_CONTROLLER_NOT_AVAILABLE',\n CAMERA_CONTROLLER_NOT_AVAILABLE = 'CAMERA_CONTROLLER_NOT_AVAILABLE',\n\n WS_CONNECT_FAILED = 'WS_CONNECT_FAILED',\n WS_TEXT_SEND_FAILED = 'WS_TEXT_SEND_FAILED',\n WS_PARSE_ERROR = 'WS_PARSE_ERROR',\n WS_NOT_CONNECTED = 'WS_NOT_CONNECTED',\n WS_CONNECT_ERROR = 'WS_CONNECT_ERROR',\n\n LIVEKIT_CONNECT_FAILED = 'LIVEKIT_CONNECT_FAILED',\n\n CONVERSATION_CONTROLLER_NOT_AVAILABLE = 'CONVERSATION_CONTROLLER_NOT_AVAILABLE',\n STATE_MACHINE_INVALID_STATE_TRANSITION = 'STATE_MACHINE_INVALID_STATE_TRANSITION',\n OBJECT_DISPOSED = 'OBJECT_DISPOSED',\n HTTP_CONTROLLER_NOT_AVAILABLE = 'HTTP_CONTROLLER_NOT_AVAILABLE',\n}\n","import { ErrorCode } from '@/constants/errorCode';\n\n/**\n * SDK Custom Error Class\n * All SDK internal errors should be converted to SDKError instances\n *\n * @author sansen\n * @class SDKError\n * @extends {Error}\n */\nexport class SDKError extends Error {\n /**\n * Error code for categorizing and identifying error types\n *\n * @type {string}\n * @author sansen\n */\n public readonly code: string;\n\n /**\n * Original error that caused this SDKError (if any)\n *\n * @type {unknown}\n * @author sansen\n */\n public readonly cause?: unknown;\n\n /**\n * Creates an SDKError instance\n *\n * @param {string} message - Error description message\n * @param {string} [code='SDK_ERROR'] - Error code for categorization\n * @param {unknown} [cause] - Original error that caused this SDKError\n * @author sansen\n */\n constructor(message: string, code: string = 'SDK_ERROR', cause?: unknown) {\n super(message);\n this.name = 'SDKError';\n this.code = code;\n this.cause = cause;\n\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, SDKError.prototype);\n }\n\n /**\n * Creates an SDKError from any error type\n *\n * @param {unknown} error - Original error to convert\n * @param {string} [code] - Optional error code, defaults to 'SDK_ERROR'\n * @returns {SDKError} SDKError instance\n * @author sansen\n */\n static fromError(error: unknown, code?: string): SDKError {\n if (error instanceof SDKError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new SDKError(error.message, code || ErrorCode.SDK_ERROR, error);\n }\n\n if (typeof error === 'string') {\n return new SDKError(error, code || ErrorCode.SDK_ERROR);\n }\n\n return new SDKError('Unknown error', code || ErrorCode.SDK_ERROR, error);\n }\n}\n","import { ErrorCode } from '@/constants/errorCode';\nimport { SDKError } from './SDKError';\n\n/**\n * Disposable Resource Interface\n * Classes implementing this interface must provide resource cleanup logic\n *\n * @author sansen\n * @interface IDisposable\n */\nexport interface IDisposable {\n /**\n * Releases all resources held by the object\n *\n * @author sansen\n */\n dispose(): void;\n}\n\n/**\n * Abstract base class for disposable resources\n * Provides standardized disposal pattern with safety checks\n *\n * @author sansen\n * @abstract\n * @class Disposable\n * @implements {IDisposable}\n */\nexport abstract class Disposable implements IDisposable {\n private _disposed: boolean = false;\n\n /**\n * Checks if the object has been disposed\n *\n * @type {boolean}\n * @protected\n * @author sansen\n */\n protected get isDisposed(): boolean {\n return this._disposed;\n }\n\n /**\n * Releases all resources held by the object\n * Subclasses should override onDispose method to implement specific cleanup logic\n *\n * @author sansen\n */\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this.onDispose();\n this._disposed = true;\n }\n\n /**\n * Abstract method for subclasses to implement specific resource cleanup logic\n *\n * @abstract\n * @protected\n * @author sansen\n */\n protected abstract onDispose(): void;\n\n /**\n * Ensures the object has not been disposed, throws error if already disposed\n *\n * @protected\n * @throws {SDKError} If object has been disposed\n * @author sansen\n */\n protected ensureNotDisposed(): void {\n if (this._disposed) {\n throw new SDKError('Object has been disposed', ErrorCode.OBJECT_DISPOSED);\n }\n }\n}\n","/**\n * Log Level Enumeration\n *\n * @author sansen\n * @enum {LogLevel}\n */\nexport enum LogLevel {\n /**\n * Debug level for detailed diagnostic information\n *\n * @author sansen\n */\n DEBUG = 0,\n\n /**\n * Information level for general operational events\n *\n * @author sansen\n */\n INFO = 1,\n\n /**\n * Warning level for potentially harmful situations\n *\n * @author sansen\n */\n WARN = 2,\n\n /**\n * Error level for error events that might still allow the application to continue\n *\n * @author sansen\n */\n ERROR = 3,\n\n /**\n * No logging (disabled)\n *\n * @author sansen\n */\n NONE = 4,\n}\n\n/**\n * Logger Utility\n * Provides configurable logging with different severity levels\n *\n * @author sansen\n * @class Logger\n */\nexport class Logger {\n private static _level: LogLevel = LogLevel.ERROR;\n private static _prefix: string = '[SDK]';\n\n /**\n * Sets the current log level\n *\n * @param {LogLevel} level - Log level to set\n * @author sansen\n */\n static setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n /**\n * Sets the log prefix\n *\n * @param {string} prefix - Prefix to prepend to all log messages\n * @author sansen\n */\n static setPrefix(prefix: string): void {\n this._prefix = prefix;\n }\n\n /**\n * Logs debug-level messages for detailed diagnostic information\n *\n * @param {string} message - Log message\n * @param {...unknown[]} args - Additional arguments to log\n * @author sansen\n */\n static debug(message: string, ...args: unknown[]): void {\n if (this._level <= LogLevel.DEBUG) {\n console.debug(`${this._prefix} [DEBUG]`, message, ...args);\n }\n }\n\n /**\n * Logs info-level messages for general operational events\n *\n * @param {string} message - Log message\n * @param {...unknown[]} args - Additional arguments to log\n * @author sansen\n */\n static info(message: string, ...args: unknown[]): void {\n if (this._level <= LogLevel.INFO) {\n console.info(`${this._prefix} [INFO]`, message, ...args);\n }\n }\n\n /**\n * Logs warning-level messages for potentially harmful situations\n *\n * @param {string} message - Log message\n * @param {...unknown[]} args - Additional arguments to log\n * @author sansen\n */\n static warn(message: string, ...args: unknown[]): void {\n if (this._level <= LogLevel.WARN) {\n console.warn(`${this._prefix} [WARN]`, message, ...args);\n }\n }\n\n /**\n * Logs error-level messages for error events\n *\n * @param {string} message - Log message\n * @param {...unknown[]} args - Additional arguments to log\n * @author sansen\n */\n static error(message: string, ...args: unknown[]): void {\n if (this._level <= LogLevel.ERROR) {\n console.error(`${this._prefix} [ERROR]`, message, ...args);\n }\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKEvents } from './events.d';\n\n/**\n * Event listener function type\n *\n * @template T - Event data type\n * @author sansen\n */\ntype EventListener<T = unknown> = (data: T) => void;\n\n/**\n * Event Bus\n * Implements observer pattern for decoupled communication between modules\n *\n * @author sansen\n * @class EventBus\n * @extends {Disposable}\n */\nexport class EventBus extends Disposable {\n private _listeners: Map<keyof SDKEvents, Set<EventListener>> = new Map();\n\n /**\n * Subscribes to an event\n *\n * @template K - Event key type\n * @param {K} event - Event name\n * @param {EventListener<SDKEvents[K]>} listener - Event listener function\n * @returns {() => void} Unsubscribe function\n * @author sansen\n */\n public on<K extends keyof SDKEvents>(event: K, listener: EventListener<SDKEvents[K]>): () => void {\n this.ensureNotDisposed();\n\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n\n const listeners = this._listeners.get(event)!;\n listeners.add(listener as EventListener);\n\n Logger.debug(`Event listener added for: ${String(event)}`);\n\n // Return unsubscribe function\n return () => {\n listeners.delete(listener as EventListener);\n Logger.debug(`Event listener removed for: ${String(event)}`);\n };\n }\n\n /**\n * Subscribes to an event for one-time execution\n *\n * @template K - Event key type\n * @param {K} event - Event name\n * @param {EventListener<SDKEvents[K]>} listener - Event listener function\n * @returns {() => void} Unsubscribe function\n * @author sansen\n */\n public once<K extends keyof SDKEvents>(event: K, listener: EventListener<SDKEvents[K]>): () => void {\n this.ensureNotDisposed();\n\n const wrappedListener = (data: SDKEvents[K]) => {\n listener(data);\n this.off(event, wrappedListener);\n };\n\n return this.on(event, wrappedListener);\n }\n\n /**\n * Unsubscribes from an event\n *\n * @template K - Event key type\n * @param {K} event - Event name\n * @param {EventListener<SDKEvents[K]>} listener - Event listener function to remove\n * @author sansen\n */\n public off<K extends keyof SDKEvents>(event: K, listener: EventListener<SDKEvents[K]>): void {\n this.ensureNotDisposed();\n\n const listeners = this._listeners.get(event);\n if (listeners) {\n listeners.delete(listener as EventListener);\n }\n }\n\n /**\n * Emits an event to all registered listeners\n *\n * @template K - Event key type\n * @param {K} event - Event name\n * @param {SDKEvents[K]} data - Event data\n * @author sansen\n */\n public emit<K extends keyof SDKEvents>(event: K, data: SDKEvents[K]): void {\n this.ensureNotDisposed();\n\n const listeners = this._listeners.get(event);\n if (listeners && listeners.size > 0) {\n Logger.debug(`Emitting event: ${String(event)}`, data);\n listeners.forEach((listener) => {\n try {\n listener(data);\n } catch (error) {\n Logger.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n }\n }\n\n /**\n * Removes all event listeners\n *\n * @author sansen\n */\n public removeAllListeners(): void {\n this._listeners.clear();\n Logger.debug('All event listeners removed');\n }\n\n /**\n * Gets the count of listeners for a specific event\n *\n * @template K - Event key type\n * @param {K} event - Event name\n * @returns {number} Number of listeners for the event\n * @author sansen\n */\n public listenerCount<K extends keyof SDKEvents>(event: K): number {\n const listeners = this._listeners.get(event);\n return listeners ? listeners.size : 0;\n }\n\n /**\n * Cleanup method called when the event bus is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.removeAllListeners();\n }\n}\n","/**\n * SDK Client Session Status Enumeration\n * Used for legacy sessionState.status; lifecycle truth is SDKConnectionFSM (SDKConnectionState).\n *\n * @author sansen\n * @enum {SessionStatus}\n */\nexport enum SessionStatus {\n /**\n * Idle state (not connected to server)\n *\n * @author sansen\n */\n IDLE = 'idle',\n\n /**\n * Currently establishing connection\n *\n * @author sansen\n */\n CONNECTING = 'connecting',\n\n /**\n * Successfully connected to server\n *\n * @author sansen\n */\n CONNECTED = 'connected',\n\n /**\n * Partially connected (e.g. only RTC or only WS)\n *\n * @author sansen\n */\n PARTIAL = 'partial',\n\n /**\n * Disconnected state\n *\n * @author sansen\n */\n DISCONNECTED = 'disconnected',\n\n /**\n * Connection lost, attempting to reconnect (auto or manual)\n *\n * @author sansen\n */\n RECONNECTING = 'reconnecting',\n\n /**\n * Disconnect in progress\n *\n * @author sansen\n */\n DISCONNECTING = 'disconnecting',\n\n /**\n * Connection error occurred\n *\n * @author sansen\n */\n ERROR = 'error',\n\n /**\n * Session has been disposed\n *\n * @author sansen\n */\n DISPOSED = 'disposed',\n}\n\n/**\n * Maps SDKConnectionState (FSM) to legacy SessionStatus for sessionState sync.\n *\n * @param fsmState - Current FSM state\n * @returns Corresponding SessionStatus\n * @internal\n */\nexport function connectionStateToSessionStatus(fsmState: string): SessionStatus {\n switch (fsmState) {\n case 'idle':\n return SessionStatus.IDLE;\n case 'connecting':\n return SessionStatus.CONNECTING;\n case 'connected':\n return SessionStatus.CONNECTED;\n case 'partial':\n return SessionStatus.PARTIAL;\n case 'disconnecting':\n return SessionStatus.DISCONNECTING;\n case 'disconnected':\n case 'error':\n return SessionStatus.DISCONNECTED;\n case 'reconnecting:auto':\n case 'reconnecting:manual':\n return SessionStatus.RECONNECTING;\n case 'disposed':\n return SessionStatus.DISPOSED;\n default:\n return SessionStatus.DISCONNECTED;\n }\n}\n\n/**\n * SDK Client Session State Management\n * Pure data container without business logic.\n * status/state are synced from SDKConnectionFSM by ConnectionLifecycleCoordinator.\n *\n * @author sansen\n * @class SessionState\n */\nexport class SessionState {\n /**\n * Current session status (synced from FSM for legacy compatibility)\n *\n * @type {SessionStatus}\n * @default SessionStatus.DISCONNECTED\n * @author sansen\n */\n public status: SessionStatus = SessionStatus.DISCONNECTED;\n public state: SessionStatus = SessionStatus.DISCONNECTED;\n\n /**\n * Indicates if currently connected to server (both rtc and ws when fully connected)\n *\n * @type {boolean}\n * @default false\n * @author sansen\n */\n public isConnected: boolean = false;\n\n /**\n * Resets all session state properties to default values\n *\n * @author sansen\n */\n public reset(): void {\n this.status = SessionStatus.DISCONNECTED;\n this.state = SessionStatus.DISCONNECTED;\n this.isConnected = false;\n }\n}\n","/**\n * SDK Default Configuration Constants\n *\n * @author sansen\n */\n\n/**\n * Default reconnection attempt count\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_RECONNECT_ATTEMPTS = 3;\n\n/**\n * Default loose track timeout in milliseconds\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_LOOSE_TRACK_TIMEOUT = 5000;\n\n/**\n * Default milliseconds per second\n *\n * @constant {number}\n * @default\n */\nexport const MILLISECONDS_PER_SECOND = 1000;\n/**\n * Default reconnection delay in milliseconds\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_RECONNECT_DELAY = 10;\n\n/**\n * Default WebSocket connection timeout in milliseconds\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_WS_TIMEOUT = 10000;\n\n/**\n * Default WebSocket ping interval in milliseconds\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_WS_PING_INTERVAL = 3000;\n\n/**\n * Default WebSocket pong timeout in milliseconds\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_WS_PONG_TIMEOUT = 30000;\n\n/**\n * Default audio sample rate (input)\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_AUDIO_SAMPLE_RATE = 24000;\n\n/**\n * Default audio bit depth (input)\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_AUDIO_BIT_DEPTH = 16;\n\n/**\n * Default audio channel count\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_AUDIO_CHANNELS = 1;\n\n/**\n * Default audio buffer size\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_AUDIO_BUFFER_SIZE = 4096;\n\n/**\n * Default HTTP request success code\n *\n * @constant {number}\n * @default\n */\nexport const DEFAULT_HTTP_CODE_SUCCESS = 0;\n\n/**\n * Default HTTP base URL\n *\n * @constant {string}\n * @default\n */\nexport const DEFAULT_HTTP_BASE_URL = 'https://api.newportai.com/s2/aigc/api/vih_dispatcher';\n\n/**\n * Default LiveKit server URL\n *\n * @constant {string}\n * @default\n */\nexport const DEFAULT_LIVEKIT_URL = 'wss://api.newportai.com/s2/livekit-lisbon';\n\n/**\n * Default WebSocket URL prefix\n *\n * @constant {string}\n * @default\n */\nexport const DEFAULT_WS_URL_PREFIX = 'wss://api.newportai.com/s2/aigc/api/ws_dispatch/render/v1/stream';\n\n/**\n * Default preconnect cache duration in milliseconds\n * Cached preConnect results are valid for this duration\n * @constant {number}\n * @default\n */\nexport const PRECONNECT_CACHE_DURATION_MS = 60000;\n\n/**\n * Video unavailable reason\n *\n * @constant {string}\n * @default\n */\nexport enum VIDEO_UNAVAILABLE_REASON {\n NO_VIDEO_TRACK = 'NO_VIDEO_TRACK', // never had video track\n TRACK_MUTED = 'TRACK_MUTED', // has video track, but all are disabled\n TRACK_ENDED = 'TRACK_ENDED', // track ended / readyState !== live\n}\n\n/** JPEG quality 0–1 */\nexport const JPEG_QUALITY = 0.7;\n\n/** Default interval between screenshots in ms */\nexport const DEFAULT_INTERVAL_MS = 2000;\n","import { EventBus } from '@/events/EventBus';\nimport { SessionState } from '@/state/SessionState';\nimport { Logger } from '@/utils/Logger';\nimport type { ClientOptions } from '@/types/ClientOptions.d';\nimport { SDKError } from '@/utils/SDKError';\nimport { DEFAULT_LIVEKIT_URL } from '@/constants/defaults';\nimport { VideoOptions } from '@/types/VideoOptions';\n\n/**\n * SDK Context\n * Contains all shared states and event bus\n *\n * @author sansen\n * @class SDKContext\n */\nexport class SDKContext {\n /**\n * Event bus for SDK-wide communication\n *\n * @type {EventBus}\n * @memberof SDKContext\n */\n public readonly eventBus: EventBus;\n\n /**\n * Session state management\n *\n * @type {SessionState}\n * @memberof SDKContext\n */\n public readonly sessionState: SessionState;\n\n /**\n * Client configuration options\n *\n * @type {ClientOptions}\n * @memberof SDKContext\n */\n public readonly options: ClientOptions;\n\n private _livekitUrl: string;\n private _token: string;\n private _roomId: string | undefined;\n private _wsUrl: string;\n private _httpToken: string | undefined;\n\n /**\n * Creates an SDK context instance\n *\n * @param {ClientOptions} options - Client configuration options\n * @author sansen\n */\n constructor(options: ClientOptions) {\n this.options = options;\n\n this._livekitUrl = '';\n this._token = '';\n this._wsUrl = '';\n this.eventBus = new EventBus();\n this.sessionState = new SessionState();\n\n // Set log level based on debug mode\n if (options.debug) {\n Logger.setLevel(0); // DEBUG level\n }\n\n Logger.info('SDK Context initialized');\n }\n\n /**\n * Sets LiveKit configuration parameters\n *\n * @param {string} livekitUrl - LiveKit server URL\n * @param {string} token - Authentication token\n * @param {string} roomId - Room identifier\n * @author sansen\n */\n public setLivekitConfig(livekitUrl: string, token: string, roomId: string) {\n this._livekitUrl = livekitUrl || DEFAULT_LIVEKIT_URL;\n this._token = token;\n this._roomId = roomId;\n }\n\n public setAuthToken(token: string): void {\n this._httpToken = token;\n }\n\n public get authToken(): string | undefined {\n return this._httpToken;\n }\n\n /**\n * Emits an error event and creates SDKError instance\n *\n * @param {unknown} error - Original error\n * @param {string} code - Error code\n * @returns {SDKError} Created SDKError instance\n * @author sansen\n */\n public emitError(error: unknown, code: string): SDKError {\n const sdkError = SDKError.fromError(error, code);\n this.eventBus.emit('inner:sdk:error', { error: sdkError });\n return sdkError;\n }\n\n /**\n * Sets the video options for the SDK context\n * @param options Video options\n * @author sansen\n */\n public setVideoOptions(options: VideoOptions): void {\n this.options.video = Object.assign({}, options, this.options.video || {});\n }\n\n /**\n * Sets WebSocket URL\n *\n * @param {string} wsUrl - WebSocket server URL\n * @author sansen\n */\n public setWsUrl(wsUrl: string) {\n this._wsUrl = wsUrl;\n }\n\n /**\n * Gets WebSocket URL\n *\n * @type {string}\n * @author sansen\n */\n get wsUrl() {\n return this._wsUrl;\n }\n\n /**\n * Gets LiveKit server URL\n *\n * @type {string}\n * @author sansen\n */\n get livekitUrl() {\n return this._livekitUrl;\n }\n\n /**\n * Gets authentication token\n *\n * @type {string}\n * @author sansen\n */\n get token() {\n return this._token;\n }\n\n /**\n * Gets room identifier\n *\n * @type {string|undefined}\n * @author sansen\n */\n get roomId() {\n return this._roomId;\n }\n\n /**\n * Gets LiveKit configuration\n *\n * @returns {Object} LiveKit configuration object\n * @author sansen\n */\n public getLivekitConfig() {\n return {\n livekitUrl: this._livekitUrl,\n token: this._token,\n };\n }\n\n /**\n * Disposes all resources and cleans up states\n *\n * @author sansen\n */\n public dispose(): void {\n this.eventBus.dispose();\n this.sessionState.reset();\n Logger.info('SDK Context disposed');\n }\n}\n","/**\n * SDK connection state (lifecycle FSM state).\n * Single source of truth for SDK lifecycle; used in connection snapshot overall state.\n *\n * @author sansen\n */\nexport type SDKConnectionState =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'partial'\n | 'reconnecting:auto'\n | 'reconnecting:manual'\n | 'disconnecting'\n | 'disconnected'\n | 'disposed'\n | 'error';\n\n/**\n * Read-only connection snapshot.\n * Derived from aggregated internal facts (rtc:* / ws:* events), not from LiveKit Room or Track objects.\n * Used for user-driven reconnect UX: available synchronously when user triggers manual reconnect.\n *\n * @remarks\n * - ws.connected: whether WebSocket (conversation) is currently connected.\n * - rtc.connected: whether RTC (LiveKit) is currently connected.\n * - rtc.hasVideoTrack: whether at least one video track is available (from rtc:video:available / rtc:video:unavailable).\n * - overall.state: current SDK lifecycle state from SDKConnectionFSM.\n *\n * @author sansen\n */\nexport interface ConnectionSnapshot {\n readonly ws: {\n /** True when WebSocket connection is open. */\n readonly connected: boolean;\n };\n readonly rtc: {\n /** True when LiveKit room is connected. */\n readonly connected: boolean;\n /** True when at least one video track is available (subscribed and usable). */\n readonly hasVideoTrack: boolean;\n };\n readonly overall: {\n /** Current lifecycle state from SDKConnectionFSM. */\n readonly state: SDKConnectionState;\n };\n}\n\n/**\n * Mutable internal shape used by ConnectionLifecycleCoordinator to build the snapshot.\n * Not exposed to callers; they receive a frozen ConnectionSnapshot.\n *\n * @internal\n */\nexport interface ConnectionSnapshotMutable {\n ws: { connected: boolean };\n rtc: { connected: boolean; hasVideoTrack: boolean };\n overall: { state: SDKConnectionState };\n}\n\n/**\n * Creates an initial (disconnected) mutable snapshot.\n *\n * @param initialState - Initial overall state (e.g. 'idle')\n * @returns Mutable snapshot\n * @internal\n */\nexport function createInitialSnapshot(initialState: SDKConnectionState): ConnectionSnapshotMutable {\n return {\n ws: { connected: false },\n rtc: { connected: false, hasVideoTrack: false },\n overall: { state: initialState },\n };\n}\n\n/**\n * Returns a read-only frozen copy of the current snapshot for external exposure.\n *\n * @param mutable - Current mutable snapshot\n * @returns Read-only ConnectionSnapshot\n */\nexport function freezeSnapshot(mutable: ConnectionSnapshotMutable): ConnectionSnapshot {\n return Object.freeze({\n ws: Object.freeze({ ...mutable.ws }),\n rtc: Object.freeze({ ...mutable.rtc }),\n overall: Object.freeze({ ...mutable.overall }),\n });\n}\n","import { SDKError } from '@/utils/SDKError';\nimport { IStateMachine } from './IStateMachine';\nimport { ErrorCode } from '@/constants/errorCode';\n\nexport interface StateTransition<S> {\n from: S;\n to: S[];\n}\n\n/**\n * Base State Machine\n * A base class for state machines that provides common functionality for managing state transitions and validation.\n *\n * @author sansen\n * @template S - State type\n * @abstract Base State Machine class\n * @class BaseStateMachine\n * @method transitionTo - Transition to a new state.\n * @method canTransition - Check if a state transition is valid.\n * @method getCurrentState - Get the current state.\n */\nexport abstract class BaseStateMachine<S> implements IStateMachine<S> {\n protected abstract _currentState: S;\n protected abstract get transitionTable(): readonly StateTransition<S>[];\n private _transitionMap: Map<S, Set<S>> | null = null;\n\n private get transitionMap(): Map<S, Set<S>> {\n if (!this._transitionMap) {\n const map = new Map<S, Set<S>>();\n for (const transition of this.transitionTable) {\n map.set(transition.from, new Set(transition.to));\n }\n this._transitionMap = map;\n }\n return this._transitionMap;\n }\n\n public getCurrentState(): S {\n return this._currentState;\n }\n\n public transitionTo(newState: S, payload?: { error?: SDKError }): void {\n const fromState = this._currentState;\n\n if (!this.canTransition(fromState, newState)) {\n const allowedStates = this.transitionMap.get(fromState);\n const allowedStatesList = allowedStates ? Array.from(allowedStates).join(', ') : 'none';\n\n throw (\n payload?.error ??\n new SDKError(\n `Invalid state transition: cannot transition from \"${fromState}\" to \"${newState}\". ` +\n `Current state: \"${fromState}\". Allowed transitions: [${allowedStatesList}]`,\n ErrorCode.STATE_MACHINE_INVALID_STATE_TRANSITION\n )\n );\n }\n\n this._currentState = newState;\n }\n\n public canTransition(fromState: S, toState: S): boolean {\n if (fromState === toState) return false;\n const allowed = this.transitionMap.get(fromState);\n return allowed?.has(toState) ?? false;\n }\n\n reset(): void {\n throw new Error('Method not implemented.');\n }\n}\n","import type { SDKConnectionState } from '@/state/ConnectionSnapshot';\nimport { BaseStateMachine, type StateTransition } from '@/state/baseStateMachine';\n\n/**\n * SDK Connection FSM\n * Single source of truth for SDK lifecycle state.\n * States: idle, connecting, connected, partial, reconnecting:auto, reconnecting:manual, disconnecting, disconnected, disposed, error.\n *\n * @author sansen\n */\nexport class SDKConnectionFSM extends BaseStateMachine<SDKConnectionState> {\n protected _currentState: SDKConnectionState = 'idle';\n\n protected readonly transitionTable: readonly StateTransition<SDKConnectionState>[] = [\n { from: 'idle', to: ['connecting', 'disposed'] },\n { from: 'connecting', to: ['connected', 'partial', 'error', 'idle', 'disposed'] },\n { from: 'connected', to: ['disconnecting', 'partial', 'reconnecting:auto', 'reconnecting:manual', 'error', 'disposed'] },\n { from: 'partial', to: ['connected', 'disconnecting', 'reconnecting:auto', 'reconnecting:manual', 'error', 'disposed'] },\n { from: 'reconnecting:auto', to: ['connected', 'partial', 'error', 'idle', 'disposed'] },\n { from: 'reconnecting:manual', to: ['connected', 'partial', 'error', 'idle', 'disposed'] },\n { from: 'disconnecting', to: ['disconnected', 'error', 'disposed'] },\n { from: 'disconnected', to: ['reconnecting:manual', 'reconnecting:auto', 'idle', 'disposed'] },\n { from: 'error', to: ['reconnecting:manual', 'reconnecting:auto', 'idle', 'disposed'] },\n { from: 'disposed', to: [] },\n ] as const;\n\n public reset(): void {\n this._currentState = 'idle';\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { ConnectionSnapshot, ConnectionSnapshotMutable, SDKConnectionState } from '@/state/ConnectionSnapshot';\nimport { createInitialSnapshot, freezeSnapshot } from '@/state/ConnectionSnapshot';\nimport { SDKConnectionFSM } from '@/state/SDKConnectionFSM';\nimport { connectionStateToSessionStatus } from '@/state/SessionState';\n\n/**\n * Central coordinator for SDK connection lifecycle.\n * - Subscribes to internal fact events (rtc:*, ws:*).\n * - Updates connection snapshot from those facts (no direct Room/Track dependency).\n * - Drives SDKConnectionFSM and syncs FSM state to sessionState.\n * - Emits connected/disconnected (with source) so PublicEventEmitter can derive sdk:connected/sdk:disconnected.\n *\n * @author sansen\n */\nexport class ConnectionLifecycleCoordinator extends Disposable {\n private readonly _context: SDKContext;\n private readonly _fsm: SDKConnectionFSM;\n private readonly _snapshot: ConnectionSnapshotMutable;\n private _unsubscribes: Array<() => void> = [];\n\n constructor(context: SDKContext) {\n super();\n this._context = context;\n this._fsm = new SDKConnectionFSM();\n this._snapshot = createInitialSnapshot('idle');\n }\n\n /**\n * Subscribe to internal fact events and drive snapshot + FSM.\n * Call once after construction (e.g. from SDKClient when context is ready).\n *\n * @remarks\n * rtc and transport must NOT emit sdk:connected/sdk:disconnected; this coordinator\n * emits connected/disconnected with source for backward compatibility with PublicEventEmitter.\n */\n public start(): void {\n this.ensureNotDisposed();\n\n const bus = this._context.eventBus;\n\n const offRtcConnected = bus.on('inner:rtc:connected', () => {\n this._snapshot.rtc.connected = true;\n this._context.eventBus.emit('inner:sdk:connected', { source: 'livekit' });\n this._onFactsChanged();\n });\n\n const offRtcDisconnected = bus.on('inner:rtc:disconnected', (data: { reason?: string }) => {\n this._snapshot.rtc.connected = false;\n this._snapshot.rtc.hasVideoTrack = false; // video is tied to rtc connection\n this._context.eventBus.emit('inner:sdk:disconnected', { source: 'livekit', reason: data?.reason });\n this._onFactsChanged();\n });\n\n const offRtcVideoAvailable = bus.on('inner:rtc:video:available', () => {\n this._snapshot.rtc.hasVideoTrack = true;\n });\n\n const offRtcVideoUnavailable = bus.on('inner:rtc:video:unavailable', () => {\n this._snapshot.rtc.hasVideoTrack = false;\n });\n\n const offWsConnected = bus.on('inner:ws:connected', () => {\n this._snapshot.ws.connected = true;\n this._context.eventBus.emit('inner:sdk:connected', { source: 'ws' });\n this._onFactsChanged();\n });\n\n const offWsDisconnected = bus.on('inner:ws:disconnected', (data: { reason?: string }) => {\n this._snapshot.ws.connected = false;\n this._context.eventBus.emit('inner:sdk:disconnected', { source: 'ws', reason: data?.reason });\n this._onFactsChanged();\n });\n\n this._unsubscribes = [\n offRtcConnected,\n offRtcDisconnected,\n offRtcVideoAvailable,\n offRtcVideoUnavailable,\n offWsConnected,\n offWsDisconnected,\n ];\n }\n\n /**\n * Transition to connecting (call when SDK connect() starts).\n */\n public startConnecting(): void {\n this._transitionTo('connecting');\n }\n\n /**\n * Transition to disconnecting (call when SDK disconnect() starts).\n */\n public startDisconnecting(): void {\n this._transitionTo('disconnecting');\n }\n\n /**\n * Transition to disconnected (call after disconnect tear-down is complete).\n */\n public completeDisconnecting(): void {\n this._snapshot.ws.connected = false;\n this._snapshot.rtc.connected = false;\n this._snapshot.rtc.hasVideoTrack = false;\n this._transitionTo('disconnected');\n }\n\n /**\n * Capture current connection snapshot and transition to reconnecting:manual.\n * Call at the moment user triggers manual reconnect; snapshot is accurate at that time.\n *\n * @returns Read-only snapshot captured before transitioning to reconnecting:manual\n */\n public captureSnapshotAndStartReconnectingManual(): ConnectionSnapshot {\n const snapshot = this.getSnapshot();\n this._transitionTo('reconnecting:manual');\n return snapshot;\n }\n\n /**\n * Transition to idle (e.g. connect failed).\n */\n public transitionToIdle(): void {\n this._snapshot.ws.connected = false;\n this._snapshot.rtc.connected = false;\n this._snapshot.rtc.hasVideoTrack = false;\n this._transitionTo('idle');\n }\n\n /**\n * Transition to disposed (call when SDK is disposed).\n */\n public transitionToDisposed(): void {\n this._transitionTo('disposed');\n }\n\n /**\n * Current read-only connection snapshot.\n */\n public getSnapshot(): ConnectionSnapshot {\n return freezeSnapshot(this._snapshot);\n }\n\n /**\n * Current FSM state (single source of truth for lifecycle).\n */\n public getState(): SDKConnectionState {\n return this._fsm.getCurrentState();\n }\n\n /**\n * Whether FSM is in a state that allows manual reconnect (e.g. connected, partial, disconnected, error).\n */\n public canStartReconnectingManual(): boolean {\n const s = this._fsm.getCurrentState();\n return s === 'connected' || s === 'partial' || s === 'disconnected' || s === 'error';\n }\n\n private _onFactsChanged(): void {\n const state = this._fsm.getCurrentState();\n\n if (state === 'connecting' || state === 'reconnecting:auto' || state === 'reconnecting:manual') {\n const both = this._snapshot.rtc.connected && this._snapshot.ws.connected;\n const one = this._snapshot.rtc.connected || this._snapshot.ws.connected;\n if (both) {\n this._transitionTo('connected');\n return;\n }\n if (one) {\n this._transitionTo('partial');\n return;\n }\n }\n\n if (state === 'connected' || state === 'partial') {\n const both = this._snapshot.rtc.connected && this._snapshot.ws.connected;\n const one = this._snapshot.rtc.connected || this._snapshot.ws.connected;\n if (!one) {\n this._transitionTo('disconnected');\n return;\n }\n if (!both) {\n this._transitionTo('partial');\n return;\n }\n if (both && state === 'partial') {\n this._transitionTo('connected');\n return;\n }\n }\n }\n\n private _transitionTo(newState: SDKConnectionState): void {\n if (!this._fsm.canTransition(this._fsm.getCurrentState(), newState)) {\n return;\n }\n this._fsm.transitionTo(newState);\n this._snapshot.overall.state = this._fsm.getCurrentState();\n this._syncSessionState();\n }\n\n private _syncSessionState(): void {\n const state = this._fsm.getCurrentState();\n this._context.sessionState.status = connectionStateToSessionStatus(state);\n this._context.sessionState.state = this._context.sessionState.status;\n this._context.sessionState.isConnected = state === 'connected';\n }\n\n protected onDispose(): void {\n this._unsubscribes.forEach((off) => off());\n this._unsubscribes = [];\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\n\n/**\n * Video Source\n * Abstracts LiveKit video tracks, provides unified video source interface\n * Manages a persistent, hidden video element bound to MediaStream\n *\n * @author sansen\n * @class VideoSource\n * @extends {Disposable}\n */\nexport class VideoSource extends Disposable {\n private _trackId: string | null = null;\n private _participantId: string | null = null;\n private _track: MediaStreamTrack | null = null;\n private _videoElement: HTMLVideoElement;\n private _stream: MediaStream | null = null;\n\n /**\n * Gets the current track identifier\n *\n * @type {string|null}\n * @author sansen\n */\n public get trackId(): string | null {\n return this._trackId;\n }\n\n /**\n * Gets the current participant identifier\n *\n * @type {string|null}\n * @author sansen\n */\n public get participantId(): string | null {\n return this._participantId;\n }\n\n /**\n * Gets the underlying media stream track\n *\n * @type {MediaStreamTrack|null}\n * @author sansen\n */\n public get track(): MediaStreamTrack | null {\n return this._track;\n }\n\n /**\n * Creates a video source instance\n * Initializes a persistent, hidden video element for MediaStream binding\n *\n * @author sansen\n */\n constructor() {\n super();\n // Create internal video element (hidden, persistent)\n this._videoElement = document.createElement('video');\n this._videoElement.autoplay = true;\n this._videoElement.playsInline = true;\n this._videoElement.muted = true;\n this._videoElement.crossOrigin = 'anonymous';\n // Keep video element hidden (not in DOM by default)\n this._videoElement.style.display = 'none';\n Logger.info('Video Source initialized with internal video element');\n }\n\n /**\n * Gets the internal video element\n * Used by renderers and processors for VideoFrame capture\n *\n * @returns {HTMLVideoElement} Internal video element\n * @author sansen\n */\n public getInternalElement(): HTMLVideoElement {\n return this._videoElement;\n }\n\n /**\n * Sets a video track for processing\n * Binds the track to the internal video element via MediaStream\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public setTrack(track: MediaStreamTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n\n if (this._track) {\n this._track.stop();\n }\n\n this._track = track;\n this._trackId = trackId;\n this._participantId = participantId;\n\n // Create or update MediaStream for the video element\n if (!this._stream) {\n this._stream = new MediaStream();\n // this._videoElement.srcObject = this._stream;\n }\n\n // Remove previous tracks from the stream\n const existingTracks = this._stream.getTracks();\n for (const t of existingTracks) {\n if (t !== track) {\n try {\n this._stream.removeTrack(t);\n } catch (e) {\n Logger.warn('Failed to remove track from stream', e);\n // ignore\n }\n }\n }\n\n // Add new track to stream if not already present\n if (!this._stream.getTracks().includes(track)) {\n try {\n this._stream.addTrack(track);\n } catch (e) {\n Logger.error('Failed to add track to media stream:', e);\n }\n }\n\n // Ensure playback continues\n // this._videoElement.play().catch((error) => {\n // Logger.error('Error playing video:', error);\n // });\n\n Logger.info(`Video track ready`);\n }\n\n /**\n * Clears the current video track and releases resources\n *\n * @author sansen\n */\n public clearTrack(): void {\n if (this._stream) {\n const tracks = this._stream.getTracks();\n for (const t of tracks) {\n try {\n this._stream.removeTrack(t);\n } catch (e) {\n Logger.warn('Failed to remove track from stream', e);\n }\n }\n }\n\n if (this._track) {\n this._track.stop();\n this._track = null;\n }\n this._trackId = null;\n this._participantId = null;\n Logger.info('Video track cleared');\n }\n\n /**\n * Checks if a valid video track is currently available\n *\n * @type {boolean}\n * @author sansen\n */\n public get hasTrack(): boolean {\n return this._track !== null && this._track.readyState === 'live';\n }\n\n /**\n * Cleanup method called when the source is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.clearTrack();\n\n if (this._videoElement) {\n // this._videoElement.srcObject = null;\n // Remove from DOM if it was attached\n if (this._videoElement.parentElement) {\n this._videoElement.parentElement.removeChild(this._videoElement);\n }\n }\n\n if (this._stream) {\n this._stream.getTracks().forEach((track) => track.stop());\n this._stream = null;\n }\n\n Logger.info('Video Source disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { IVideoRenderStrategy } from './IVideoRenderStrategy';\nimport type { IVideoRenderer, IVideoProcessor } from '@/video/video.d';\n\n/**\n * Raw Video Render Strategy\n * Direct rendering without any processing\n *\n * @author sansen\n * @class RawRenderStrategy\n * @extends {Disposable}\n * @implements {IVideoRenderStrategy}\n */\nexport class RawRenderStrategy extends Disposable implements IVideoRenderStrategy {\n private _renderer: IVideoRenderer | null = null;\n\n /**\n * Gets the video renderer instance\n *\n * @returns {IVideoRenderer | null} Video renderer or null if not set\n * @author sansen\n */\n public getRenderer(): IVideoRenderer | null {\n return this._renderer;\n }\n\n /**\n * Sets the video renderer instance\n *\n * @param {IVideoRenderer | null} renderer - Video renderer to use\n * @author sansen\n */\n public setRenderer(renderer: IVideoRenderer | null): void {\n if (this._renderer) {\n this._renderer.dispose();\n }\n this._renderer = renderer;\n Logger.debug('Raw render strategy renderer set');\n }\n\n /**\n * Gets the video processor (raw mode doesn't use processors)\n *\n * @returns {null} Always returns null for raw mode\n * @author sansen\n */\n public getProcessors(): IVideoProcessor[] {\n return [];\n }\n\n /**\n * Sets the video processor (raw mode doesn't support processors)\n *\n * @param {.IVideoProcessor | null} [processor] - Video processor (ignored)\n * @author sansen\n */\n public setProcessors(_processors?: IVideoProcessor[]): void {\n Logger.warn('Raw render strategy does not support processors');\n }\n\n /**\n * Attaches renderer elements to the container\n * Raw mode: appends video element to container\n *\n * @param {HTMLElement} container - Container element to attach to\n * @author sansen\n */\n public attachToContainer(container: HTMLElement): void {\n if (!this._renderer) {\n Logger.warn('No renderer available to attach to container');\n return;\n }\n\n // In raw mode, attach video element to container\n if ('getElement' in this._renderer && typeof (this._renderer as any).getElement === 'function') {\n const videoElement = (this._renderer as any).getElement();\n if (videoElement instanceof HTMLVideoElement) {\n // Remove from current parent if exists\n if (videoElement.parentElement && videoElement.parentElement !== container) {\n videoElement.parentElement.removeChild(videoElement);\n }\n // Append to container if not already attached\n if (videoElement.parentElement !== container) {\n container.appendChild(videoElement);\n // Make video visible in raw mode\n videoElement.style.display = '';\n Logger.debug('Video element attached to container in raw mode');\n }\n }\n }\n }\n\n /**\n * Cleanup method called when the strategy is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer = null;\n }\n Logger.info('Raw Render Strategy disposed');\n }\n}\n","import { RawRenderStrategy } from './RawRenderStrategy';\nimport type { IVideoRenderStrategyFactory } from './IVideoRenderStrategyFactory';\nimport type { IVideoRenderStrategy } from './IVideoRenderStrategy';\n\n/**\n * Raw Render Strategy Factory\n * Creates instances of RawRenderStrategy for direct video rendering\n *\n * @author sansen\n * @class RawRenderStrategyFactory\n * @implements {IVideoRenderStrategyFactory}\n */\nexport class RawRenderStrategyFactory implements IVideoRenderStrategyFactory {\n /**\n * Creates a raw render strategy instance\n *\n * @returns {IVideoRenderStrategy} Raw render strategy instance\n * @author sansen\n */\n public create(): IVideoRenderStrategy {\n return new RawRenderStrategy();\n }\n}\n","import { RenderFitMode } from '@/types/VideoOptions';\nimport { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { IVideoRenderer } from '@/video/video.d';\n\n/**\n * Canvas Renderer\n * Renders video frames to HTMLCanvasElement\n * Supports direct drawing from video element (for green screen processing)\n *\n * @author sansen\n * @class CanvasRenderer\n * @extends {Disposable}\n * @implements {IVideoRenderer}\n */\nexport class CanvasRenderer extends Disposable implements IVideoRenderer {\n private _canvas: HTMLCanvasElement | null = null;\n private _ctx: CanvasRenderingContext2D | null = null;\n private _videoElement: HTMLVideoElement | null = null;\n private _parentElement: HTMLElement | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n private _animationFrameId: number | null = null;\n private _isRendering: boolean = false;\n\n /**\n * Creates a canvas renderer instance\n *\n * @param {HTMLCanvasElement} [canvas] - Canvas element (optional, auto-created if not provided)\n * @param {HTMLVideoElement} [videoElement] - Video element (for drawing from video to canvas)\n * @throws {Error} If neither canvas nor videoElement provided\n * @author sansen\n */\n constructor(canvas?: HTMLCanvasElement, videoElement?: HTMLVideoElement) {\n super();\n\n if (canvas) {\n // Use externally provided canvas\n this._canvas = canvas;\n this._ctx = canvas.getContext('2d');\n if (!this._ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n } else if (videoElement) {\n // Create canvas from video element\n this._videoElement = videoElement;\n this._createCanvasFromVideo();\n } else {\n throw new Error('CanvasRenderer requires either canvas or videoElement');\n }\n\n Logger.info('Canvas Renderer created');\n }\n\n /**\n * Creates canvas from video element for overlay rendering\n *\n * @private\n * @author sansen\n */\n private _createCanvasFromVideo(): void {\n if (!this._videoElement) {\n return;\n }\n\n // Get video's parent element\n this._parentElement = this._videoElement.parentElement;\n if (!this._parentElement) {\n throw new Error('Video element must have a parent element');\n }\n\n // Ensure parent element has position: relative\n const parentStyle = window.getComputedStyle(this._parentElement);\n if (parentStyle.position === 'static') {\n this._parentElement.style.position = 'relative';\n }\n\n // Create canvas\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n if (!this._ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n\n // Set canvas styling (overlay on top of video)\n this._canvas.style.position = 'absolute';\n this._canvas.style.top = '0';\n this._canvas.style.left = '0';\n this._canvas.style.width = '100%';\n this._canvas.style.height = '100%';\n this._canvas.style.pointerEvents = 'none'; // Don't intercept mouse events\n // Insert canvas into parent element\n this._parentElement.appendChild(this._canvas);\n\n // Synchronize canvas dimensions to video display dimensions\n this._syncCanvasSize();\n\n // Listen for video dimension changes\n this._setupResizeObserver();\n }\n\n /**\n * Synchronizes canvas dimensions to video display dimensions\n * Maintains video original aspect ratio, consistent with video element behavior\n *\n * @private\n * @author sansen\n */\n private _syncCanvasSize(): void {\n if (!this._canvas || !this._videoElement || !this._ctx) {\n return;\n }\n\n // Get video's original pixel dimensions (for processing)\n const videoWidth = this._videoElement.videoWidth;\n const videoHeight = this._videoElement.videoHeight;\n\n // Get video's display dimensions (CSS dimensions, computed by browser based on object-fit)\n const displayWidth = this._videoElement.clientWidth;\n const displayHeight = this._videoElement.clientHeight;\n\n if (videoWidth > 0 && videoHeight > 0 && displayWidth > 0 && displayHeight > 0) {\n // Calculate aspect ratios\n const videoAspect = videoWidth / videoHeight;\n const containerAspect = displayWidth / displayHeight;\n\n // Calculate actual display dimensions (maintaining aspect ratio, consistent with video element)\n // Video element defaults to object-fit: contain, we need to simulate same behavior\n let renderWidth: number;\n let renderHeight: number;\n\n if (videoAspect > containerAspect) {\n // Video is wider, fit to container width\n renderWidth = displayWidth;\n renderHeight = displayWidth / videoAspect;\n } else {\n // Video is taller, fit to container height\n renderWidth = displayHeight * videoAspect;\n renderHeight = displayHeight;\n }\n\n // Set canvas CSS dimensions (maintain aspect ratio, consistent with video element)\n this._canvas.style.width = `${renderWidth}px`;\n this._canvas.style.height = `${renderHeight}px`;\n\n // Center display (if container larger than render dimensions, simulate video element's object-fit: contain behavior)\n const offsetX = (displayWidth - renderWidth) / 2;\n const offsetY = (displayHeight - renderHeight) / 2;\n this._canvas.style.left = `${offsetX}px`;\n this._canvas.style.top = `${offsetY}px`;\n\n // Set canvas actual pixel dimensions (use video original dimensions for processing quality)\n // Browser automatically scales canvas content to match CSS dimensions, maintaining aspect ratio\n // This ensures processing at original resolution, auto-scaling for display, consistent with video element behavior\n this._canvas.width = videoWidth;\n this._canvas.height = videoHeight;\n }\n }\n\n /**\n * Sets up ResizeObserver to monitor video dimension changes\n *\n * @private\n * @author sansen\n */\n private _setupResizeObserver(): void {\n if (!this._videoElement || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this._resizeObserver = new ResizeObserver(() => {\n this._syncCanvasSize();\n });\n\n this._resizeObserver.observe(this._videoElement);\n }\n\n /**\n * Starts continuous drawing from video element to canvas\n *\n * @author sansen\n */\n public startRenderingFromVideo(): void {\n if (this._isRendering || !this._videoElement || !this._canvas || !this._ctx) {\n return;\n }\n\n this._isRendering = true;\n this._renderLoop();\n }\n\n /**\n * Stops drawing from video element\n *\n * @author sansen\n */\n public stopRenderingFromVideo(): void {\n this._isRendering = false;\n if (this._animationFrameId !== null) {\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = null;\n }\n }\n\n /**\n * Rendering loop (draws from video element to canvas)\n *\n * @private\n * @author sansen\n */\n private _renderLoop = (): void => {\n if (!this._isRendering || !this._videoElement || !this._canvas || !this._ctx) {\n return;\n }\n\n try {\n // Synchronize canvas dimensions\n this._syncCanvasSize();\n\n // Draw from video element to canvas (using video original dimensions, maintaining aspect ratio)\n // Canvas pixel dimensions already set to video original dimensions, draw directly\n this._ctx.drawImage(this._videoElement, 0, 0, this._canvas.width, this._canvas.height);\n } catch (error) {\n Logger.error('Error rendering from video to canvas:', error);\n }\n\n // Continue to next frame\n this._animationFrameId = requestAnimationFrame(this._renderLoop);\n };\n\n /**\n * Sets the video fit mode\n * @param mode - Video fit mode\n * @author sansen\n */\n public setFitMode(mode: RenderFitMode): void {\n if (this._canvas) {\n this._canvas.style.width = '100%';\n this._canvas.style.height = '100%';\n this._canvas.style.objectFit = mode;\n }\n }\n /**\n * Renders a video frame to canvas\n *\n * @param {VideoFrame} frame - Video frame to render\n * @author sansen\n */\n public render(frame: VideoFrame): void {\n this.ensureNotDisposed();\n\n if (!this._ctx || !this._canvas) {\n return;\n }\n\n try {\n const frameWidth = frame.displayWidth;\n const frameHeight = frame.displayHeight;\n\n // If canvas created from video element, need to synchronize dimensions\n if (this._videoElement) {\n this._syncCanvasSize();\n } else {\n // Externally provided canvas, set dimensions directly\n if (this._canvas.width !== frameWidth || this._canvas.height !== frameHeight) {\n this._canvas.width = frameWidth;\n this._canvas.height = frameHeight;\n }\n }\n\n // 关键修改点:如果是视频元素,获取其原始宽高\n const sourceWidth = frame instanceof VideoFrame ? frame.displayWidth : (frame as HTMLVideoElement).videoWidth;\n const sourceHeight = frame instanceof VideoFrame ? frame.displayHeight : (frame as HTMLVideoElement).videoHeight;\n\n if (sourceWidth > 0 && sourceHeight > 0) {\n if (this._canvas.width !== sourceWidth || this._canvas.height !== sourceHeight) {\n this._canvas.width = sourceWidth;\n this._canvas.height = sourceHeight;\n }\n }\n\n // Clear canvas before drawing to ensure transparent background (not black)\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n // Draw video frame (using original dimensions, maintaining aspect ratio)\n this._ctx.drawImage(frame, 0, 0, this._canvas.width, this._canvas.height);\n } catch (error) {\n Logger.error('Error rendering video frame to canvas:', error);\n }\n }\n\n /**\n * Gets the canvas element\n *\n * @returns {HTMLCanvasElement | null} Canvas element or null\n * @author sansen\n */\n public getCanvas(): HTMLCanvasElement | null {\n return this._canvas;\n }\n\n /**\n * Gets the canvas rendering context\n *\n * @returns {CanvasRenderingContext2D | null} Canvas context or null\n * @author sansen\n */\n public getContext(): CanvasRenderingContext2D | null {\n return this._ctx;\n }\n\n /**\n * Cleanup method called when the renderer is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n // Stop rendering loop\n this.stopRenderingFromVideo();\n\n // Clean up ResizeObserver\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = null;\n }\n\n // Remove canvas (if auto-created)\n if (this._canvas && this._parentElement && this._canvas.parentElement === this._parentElement) {\n this._parentElement.removeChild(this._canvas);\n }\n\n this._canvas = null;\n this._ctx = null;\n this._videoElement = null;\n this._parentElement = null;\n Logger.info('Canvas Renderer disposed');\n }\n}\n","import { RenderFitMode } from '@/types/VideoOptions';\nimport { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { IVideoRenderer } from '@/video/video.d';\n\n/**\n * Video Element Renderer\n * Directly renders video tracks to HTMLVideoElement (direct playback mode)\n *\n * @author sansen\n * @class VideoElementRenderer\n * @extends {Disposable}\n * @implements {IVideoRenderer}\n */\nexport class VideoElementRenderer extends Disposable implements IVideoRenderer {\n private _element: HTMLVideoElement | null = null;\n private _stream: MediaStream | null = null;\n private _track: MediaStreamTrack | null = null;\n\n /**\n * Creates a video element renderer instance\n *\n * @param {HTMLVideoElement} element - Video element for rendering\n * @author sansen\n */\n constructor(element: HTMLVideoElement) {\n super();\n this._element = element;\n Logger.info('Video Element Renderer created');\n }\n\n /**\n * Sets video track for direct playback\n *\n * @param {MediaStreamTrack} track - Media stream track to render\n * @author sansen\n */\n public setTrack(track: MediaStreamTrack): void {\n this.ensureNotDisposed();\n // Do not stop or pause existing playback here. Maintain a single video element and reuse its MediaStream\n this._track = track;\n\n if (!this._element) {\n Logger.warn('No video element available to set track');\n return;\n }\n\n // If no existing stream, create one and attach to element\n if (!this._stream) {\n this._stream = new MediaStream();\n this._element.srcObject = this._stream;\n }\n\n // Remove previous tracks from the media stream (without calling stop())\n const existingTracks = this._stream.getTracks();\n for (const t of existingTracks) {\n if (t !== track) {\n try {\n this._stream.removeTrack(t);\n } catch (e) {\n console.error(e);\n // ignore\n }\n }\n }\n\n // Add new track to existing stream if not already present\n if (!this._stream.getTracks().includes(track)) {\n try {\n this._stream.addTrack(track);\n } catch (e) {\n Logger.error('Failed to add track to media stream:', e);\n }\n }\n\n // Ensure playback continues (do not pause/replace video element)\n this._element.play().catch((error) => {\n Logger.error('Error playing video:', error);\n });\n\n Logger.debug('Video track set to element (stream reused)');\n }\n\n /**\n * Sets video element opacity (for green screen processing compatibility)\n *\n * @param {number} opacity - Opacity value (0-1)\n * @author sansen\n */\n public setOpacity(opacity: number): void {\n if (this._element) {\n this._element.style.opacity = String(opacity);\n }\n }\n\n /**\n * Gets the video element\n *\n * @returns {HTMLVideoElement | null} Video element or null\n * @author sansen\n */\n public getElement(): HTMLVideoElement | null {\n return this._element;\n }\n\n /**\n * Sets the video fit mode\n * @param mode - Video fit mode\n * @author sansen\n */\n public setFitMode(mode: RenderFitMode): void {\n if (this._element) {\n this._element.style.width = '100%';\n this._element.style.height = '100%';\n this._element.style.objectFit = mode;\n }\n }\n /**\n * Renders a video frame (no-op in direct playback mode, kept for interface compatibility)\n *\n * @param {VideoFrame} frame - Video frame to render\n * @author sansen\n */\n public render(_frame: VideoFrame): void {\n // Direct playback mode doesn't require manual frame rendering\n // MediaStreamTrack automatically renders to video element\n Logger.debug('Render called in direct mode (no-op)');\n }\n\n /**\n * Cleanup method called when the renderer is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n if (this._element) {\n this._element.srcObject = null;\n }\n\n if (this._stream) {\n this._stream.getTracks().forEach((track) => track.stop());\n this._stream = null;\n }\n\n if (this._track) {\n this._track.stop();\n this._track = null;\n }\n\n Logger.info('Video Element Renderer disposed');\n }\n\n /**\n * Clears tracks from internal MediaStream without stopping the video element\n */\n public clearTrack(): void {\n if (this._stream) {\n const tracks = this._stream.getTracks();\n for (const t of tracks) {\n try {\n this._stream.removeTrack(t);\n } catch (e) {\n console.error(e);\n // ignore\n }\n }\n }\n this._track = null;\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { CanvasRenderer } from '@/video/renderer/CanvasRenderer';\nimport { VideoElementRenderer } from '@/video/renderer/VideoElementRenderer';\n\nimport type { IVideoRenderStrategy } from './IVideoRenderStrategy';\nimport type { IVideoRenderer } from '@/video/video.d';\nimport type { IVideoProcessor } from '@/video/video.d';\n\n/**\n * Processed Video Render Strategy\n * Supports multiple video processing stages (e.g., green screen, filters) before rendering.\n * Even without processors, it renders the video source to a Canvas layer.\n *\n * @author sansen\n * @class ProcessedRenderStrategy\n * @extends {Disposable}\n * @implements {IVideoRenderStrategy}\n */\nexport class ProcessedRenderStrategy extends Disposable implements IVideoRenderStrategy {\n private _renderer: IVideoRenderer | null = null;\n private _processors: IVideoProcessor[] = [];\n private _videoElementRenderer: VideoElementRenderer | null = null;\n private _canvasRenderer: CanvasRenderer | null = null;\n private _videoFrameCallbackId: number | null = null;\n private _animationFrameId: number | null = null;\n private _isProcessing: boolean = false;\n\n /**\n * Gets the current video renderer\n *\n * @returns {IVideoRenderer | null} Video renderer or null if not set\n */\n public getRenderer(): IVideoRenderer | null {\n return this._renderer;\n }\n\n /**\n * Sets the video renderer\n *\n * @param {IVideoRenderer | null} renderer - Video renderer to use\n */\n public setRenderer(renderer: IVideoRenderer | null): void {\n if (this._renderer) {\n this._renderer.dispose();\n }\n this._renderer = renderer;\n\n if (renderer instanceof VideoElementRenderer) {\n this._videoElementRenderer = renderer;\n\n if (!this._canvasRenderer) {\n const videoElement = this._videoElementRenderer.getElement();\n if (videoElement) {\n try {\n if (videoElement.parentElement) {\n this._canvasRenderer = new CanvasRenderer(undefined, videoElement);\n this._renderer = this._canvasRenderer;\n Logger.debug('Canvas renderer created in setRenderer (processed mode)');\n }\n } catch (error) {\n Logger.warn('Failed to create CanvasRenderer in setRenderer, will retry in attachToContainer:', error);\n }\n }\n }\n\n this._setupProcessingPipeline();\n } else {\n this._videoElementRenderer = null;\n this._stopProcessingPipeline();\n }\n\n Logger.debug('Processed render strategy renderer set');\n }\n\n /**\n * Adds a processor to the pipeline at a specific index\n *\n * @param {IVideoProcessor} processor - Processor to add\n * @param {number} [index] - Optional index to insert at, otherwise adds to end\n */\n public addProcessor(processor: IVideoProcessor, index?: number): void {\n if (index !== undefined && index >= 0 && index < this._processors.length) {\n this._processors.splice(index, 0, processor);\n } else {\n this._processors.push(processor);\n }\n this._setupProcessingPipeline();\n }\n\n /**\n * Gets the video processors\n *\n * @returns {IVideoProcessor[]} Video processors\n */\n public getProcessors(): IVideoProcessor[] {\n return this._processors;\n }\n\n /**\n * Clears existing processors and sets video processors\n *\n * @param {IVideoProcessor[]} processors - Video processors to use\n */\n public setProcessors(processors: IVideoProcessor[]): void {\n this._processors.forEach((p) => p.dispose());\n this._processors = processors;\n this._setupProcessingPipeline();\n Logger.debug('Processed render strategy processor set');\n }\n\n /**\n * Attaches renderer elements to the container\n *\n * @param {HTMLElement} container - Container element to attach to\n */\n public attachToContainer(container: HTMLElement): void {\n if (this._canvasRenderer) {\n const canvas = this._canvasRenderer.getCanvas();\n if (canvas) {\n if (canvas.parentElement && canvas.parentElement !== container) {\n canvas.parentElement.removeChild(canvas);\n }\n if (canvas.parentElement !== container) {\n container.appendChild(canvas);\n Logger.debug('Canvas element attached to container in processed mode');\n }\n }\n\n if (this._videoElementRenderer) {\n const videoElement = this._videoElementRenderer.getElement();\n if (videoElement) {\n if (videoElement.parentElement) {\n videoElement.parentElement.removeChild(videoElement);\n }\n videoElement.style.display = 'none';\n }\n }\n } else if (this._videoElementRenderer) {\n const videoElement = this._videoElementRenderer.getElement();\n if (videoElement) {\n const wasInDOM = videoElement.parentElement !== null;\n if (!wasInDOM) {\n container.appendChild(videoElement);\n }\n\n try {\n this._canvasRenderer = new CanvasRenderer(undefined, videoElement);\n this._renderer = this._canvasRenderer;\n\n if (!wasInDOM && videoElement.parentElement === container) {\n (container as HTMLElement).removeChild(videoElement);\n }\n videoElement.style.display = 'none';\n\n const canvas = this._canvasRenderer.getCanvas();\n if (canvas && canvas.parentElement !== container) {\n container.appendChild(canvas);\n }\n\n this._startProcessingLoop();\n Logger.debug('Canvas created and attached to container in processed mode');\n } catch (error) {\n Logger.error('Failed to create CanvasRenderer in attachToContainer:', error);\n if (!wasInDOM && videoElement.parentElement === container) {\n (container as HTMLElement).removeChild(videoElement);\n }\n if (videoElement.parentElement !== container) {\n container.appendChild(videoElement);\n videoElement.style.display = '';\n }\n }\n }\n }\n }\n\n /**\n * Sets up the processing pipeline\n *\n * @private\n */\n private _setupProcessingPipeline(): void {\n if (!this._videoElementRenderer) {\n return;\n }\n\n const videoElement = this._videoElementRenderer.getElement();\n if (!videoElement) {\n Logger.warn('Video element not available for processing');\n return;\n }\n\n if (videoElement.parentElement) {\n videoElement.parentElement.removeChild(videoElement);\n }\n videoElement.style.display = 'none';\n\n if (videoElement.readyState < 2) {\n const onLoadedMetadata = () => {\n this._setupProcessingPipeline();\n videoElement.removeEventListener('loadedmetadata', onLoadedMetadata);\n };\n videoElement.addEventListener('loadedmetadata', onLoadedMetadata);\n return;\n }\n\n if (this._canvasRenderer) {\n this._startProcessingLoop();\n Logger.info('Processing pipeline setup completed');\n }\n }\n\n /**\n * Stops processing pipeline\n *\n * @private\n */\n private _stopProcessingPipeline(): void {\n this._stopProcessingLoop();\n\n if (this._canvasRenderer) {\n this._canvasRenderer.dispose();\n this._canvasRenderer = null;\n }\n\n if (this._videoElementRenderer) {\n this._renderer = this._videoElementRenderer;\n }\n }\n\n /**\n * Starts processing loop\n *\n * @private\n */\n private _startProcessingLoop(): void {\n if (this._isProcessing || !this._videoElementRenderer || !this._canvasRenderer) {\n return;\n }\n\n const videoElement = this._videoElementRenderer.getElement();\n if (!videoElement) return;\n\n this._isProcessing = true;\n\n if ('requestVideoFrameCallback' in HTMLVideoElement.prototype) {\n this._processVideoFrame();\n } else {\n this._processVideoFrameFallback();\n }\n }\n\n /**\n * Stops processing loop\n *\n * @private\n */\n private _stopProcessingLoop(): void {\n this._isProcessing = false;\n\n // Context: Stop the rVFC loop\n const videoElement = this._videoElementRenderer?.getElement();\n if (this._videoFrameCallbackId !== null && videoElement && 'cancelVideoFrameCallback' in videoElement) {\n (videoElement as any).cancelVideoFrameCallback(this._videoFrameCallbackId);\n this._videoFrameCallbackId = null;\n }\n\n // Context: Stop the rAF loop\n if (this._animationFrameId !== null) {\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = null;\n }\n }\n\n /**\n * Processes video frames using requestVideoFrameCallback\n *\n * @private\n */\n private _processVideoFrame = (): void => {\n if (!this._isProcessing || !this._videoElementRenderer || !this._canvasRenderer) {\n return;\n }\n\n const videoElement = this._videoElementRenderer.getElement();\n if (!videoElement || videoElement.readyState < 2) {\n if (this._isProcessing && videoElement) {\n this._videoFrameCallbackId = videoElement.requestVideoFrameCallback(this._processVideoFrame);\n }\n return;\n }\n\n try {\n let currentFrame: VideoFrame | ImageData = new VideoFrame(videoElement, {\n timestamp: performance.now() * 1000,\n });\n\n // Pipeline: Each processor receives the output of the previous one\n for (const processor of this._processors) {\n const result = processor.process(currentFrame as any);\n // If a processor returns a NEW frame/data, close the old one to free GPU/CPU memory\n if (result && result !== currentFrame) {\n if (currentFrame instanceof VideoFrame) currentFrame.close();\n currentFrame = result;\n }\n }\n\n // Final Stage: Render whatever the final state of currentFrame is\n if (currentFrame instanceof ImageData) {\n this._renderImageData(currentFrame);\n } else {\n this._canvasRenderer.render(currentFrame);\n }\n\n // Cleanup final frame if it's a VideoFrame\n if (currentFrame instanceof VideoFrame) {\n currentFrame.close();\n }\n } catch (error) {\n Logger.error('Error processing video frame:', error);\n }\n\n if (this._isProcessing && videoElement) {\n this._videoFrameCallbackId = videoElement.requestVideoFrameCallback(this._processVideoFrame);\n }\n };\n\n /**\n * Renders ImageData to the canvas renderer\n *\n * @private\n */\n private _renderImageData(imageData: ImageData): void {\n if (!this._canvasRenderer) return;\n const ctx = this._canvasRenderer.getContext();\n const canvas = this._canvasRenderer.getCanvas();\n if (ctx && canvas) {\n if (canvas.width !== imageData.width || canvas.height !== imageData.height) {\n canvas.width = imageData.width;\n canvas.height = imageData.height;\n }\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.putImageData(imageData, 0, 0);\n }\n }\n\n /**\n * Processes video frames (fallback: using requestAnimationFrame)\n *\n * @private\n */\n private _processVideoFrameFallback = (): void => {\n if (!this._isProcessing || !this._canvasRenderer || !this._videoElementRenderer) return;\n\n const videoElement = this._videoElementRenderer.getElement();\n if (!videoElement || videoElement.readyState < 2 || videoElement.paused) {\n const ctx = this._canvasRenderer.getContext();\n const canvas = this._canvasRenderer.getCanvas();\n if (ctx && canvas) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n this._animationFrameId = requestAnimationFrame(this._processVideoFrameFallback);\n return;\n }\n\n const vWidth = videoElement.videoWidth;\n const vHeight = videoElement.videoHeight;\n const renderCanvas = this._canvasRenderer.getCanvas();\n\n if (vWidth > 0 && renderCanvas && (renderCanvas.width !== vWidth || renderCanvas.height !== vHeight)) {\n renderCanvas.width = vWidth;\n renderCanvas.height = vHeight;\n }\n\n let currentFrame: VideoFrame | ImageData = new VideoFrame(videoElement);\n\n try {\n for (const processor of this._processors) {\n const processed = processor.process(currentFrame as any);\n if (processed && processed !== currentFrame) {\n if (currentFrame instanceof VideoFrame) currentFrame.close();\n currentFrame = processed;\n }\n }\n\n if (currentFrame instanceof ImageData) {\n this._renderImageData(currentFrame);\n } else {\n this._canvasRenderer.render(currentFrame);\n }\n } finally {\n if (currentFrame instanceof VideoFrame) {\n currentFrame.close();\n }\n }\n if (this._isProcessing) {\n this._animationFrameId = requestAnimationFrame(this._processVideoFrameFallback);\n }\n };\n\n /**\n * Cleanup method\n *\n * @protected\n */\n protected onDispose(): void {\n this._stopProcessingPipeline();\n\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer = null;\n }\n this._processors.forEach((p) => p.dispose());\n this._processors = [];\n this._videoElementRenderer = null;\n this._canvasRenderer = null;\n Logger.info('Processed Render Strategy disposed');\n }\n}\n","import { ProcessedRenderStrategy } from './ProcessedRenderStrategy';\nimport type { IVideoRenderStrategyFactory } from './IVideoRenderStrategyFactory';\nimport type { IVideoRenderStrategy } from './IVideoRenderStrategy';\n\n/**\n * Processed Render Strategy Factory\n * Creates instances of ProcessedRenderStrategy for video processing and rendering\n *\n * @author sansen\n * @class ProcessedRenderStrategyFactory\n * @implements {IVideoRenderStrategyFactory}\n */\nexport class ProcessedRenderStrategyFactory implements IVideoRenderStrategyFactory {\n /**\n * Creates a processed render strategy instance\n *\n * @returns {IVideoRenderStrategy} Processed render strategy instance\n * @author sansen\n */\n public create(): IVideoRenderStrategy {\n return new ProcessedRenderStrategy();\n }\n}\n","import { RawRenderStrategyFactory } from './RawRenderStrategyFactory';\nimport { ProcessedRenderStrategyFactory } from './ProcessedRenderStrategyFactory';\nimport type { IVideoRenderStrategyFactory } from './IVideoRenderStrategyFactory';\n\n/**\n * Video Render Strategy Factory Mapper\n * Maps rendering modes to corresponding strategy factories\n * Encapsulates mode-to-strategy mapping logic\n *\n * @author sansen\n * @class VideoRenderStrategyFactoryMapper\n */\nexport class VideoRenderStrategyFactoryMapper {\n /**\n * Gets strategy factory based on rendering mode\n *\n * @param {'raw' | 'processed'} mode - Rendering mode\n * @returns {IVideoRenderStrategyFactory} Strategy factory instance\n * @author sansen\n */\n public static getFactory(mode: 'raw' | 'processed'): IVideoRenderStrategyFactory {\n return mode === 'processed' ? new ProcessedRenderStrategyFactory() : new RawRenderStrategyFactory();\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\n\nimport { VideoSource } from './VideoSource';\nimport { VideoRenderStrategyFactoryMapper } from './strategies/VideoRenderStrategyFactoryMapper';\nimport { VideoElementRenderer } from './renderer/VideoElementRenderer';\nimport type { RenderFitMode, VideoOptions } from '@/types/VideoOptions.d';\nimport type { IVideoRenderStrategy } from './strategies/IVideoRenderStrategy';\nimport type { IVideoRenderStrategyFactory } from './strategies/IVideoRenderStrategyFactory';\nimport type { IVideoProcessor, IVideoRenderer } from './video.d';\n\n/**\n * Video Processing Pipeline\n * Uses strategy pattern to support different rendering modes\n * Fully delegates to render strategies, contains no conditional logic for rendering modes\n *\n * @author sansen\n * @class VideoPipeline\n * @extends {Disposable}\n */\nexport class VideoPipeline extends Disposable {\n private readonly _source: VideoSource;\n private _strategy: IVideoRenderStrategy;\n private _strategyFactory: IVideoRenderStrategyFactory;\n private _videoElementRenderer: VideoElementRenderer | null = null;\n private _containerElement: HTMLElement | null = null;\n\n /**\n * Creates a video processing pipeline instance\n *\n * @param {VideoSource} source - Video source for the pipeline\n * @param {VideoOptions} [options] - Video configuration options\n * @author sansen\n */\n constructor(source: VideoSource, options?: VideoOptions) {\n super();\n this._source = source;\n\n // Use mapper to get strategy factory (delegate mode selection logic)\n const mode = options?.renderMode || 'raw';\n this._containerElement = options?.containerElement || null;\n this._strategyFactory = VideoRenderStrategyFactoryMapper.getFactory(mode);\n\n // Create strategy instance\n this._strategy = this._strategyFactory.create();\n\n // Initialize VideoElementRenderer using VideoSource's internal element\n const videoElement = this._source.getInternalElement();\n const renderer = new VideoElementRenderer(videoElement);\n this._videoElementRenderer = renderer;\n this._strategy.setRenderer(renderer);\n\n // If container element provided, attach renderer elements via strategy\n if (this._containerElement) {\n this._strategy.attachToContainer(this._containerElement);\n Logger.info('Renderer elements attached to container via strategy');\n }\n\n Logger.info('Video Pipeline created');\n }\n\n /**\n * Sets the rendering mode\n *\n * @param {'raw' | 'processed'} mode - Rendering mode to set\n * @author sansen\n */\n public setRenderMode(mode: 'raw' | 'processed'): void {\n this.ensureNotDisposed();\n\n // Use mapper to get strategy factory (delegate mode selection logic)\n const newFactory = VideoRenderStrategyFactoryMapper.getFactory(mode);\n\n // If factory type is the same, no need to switch\n if (this._strategyFactory.constructor === newFactory.constructor) {\n return;\n }\n\n // Save current renderer and processor\n const currentRenderer = this._strategy.getRenderer();\n const currentProcessors = this._strategy.getProcessors();\n\n // Dispose old strategy\n this._strategy.dispose();\n\n // Create new strategy\n this._strategyFactory = newFactory;\n this._strategy = this._strategyFactory.create();\n\n // Restore renderer and processor (strategy decides whether to accept processor)\n if (currentRenderer) {\n this._strategy.setRenderer(currentRenderer);\n }\n\n if (currentProcessors.length > 0) {\n this._strategy.setProcessors(currentProcessors);\n }\n\n // Re-attach to container if container exists\n if (this._containerElement) {\n this._strategy.attachToContainer(this._containerElement);\n }\n\n Logger.info(`Video render mode changed to: ${mode}`);\n }\n\n /**\n * Set render fit mode\n * @param mode Render fit mode\n * @author sansen\n */\n public setRenderFitMode(mode: RenderFitMode): void {\n this.ensureNotDisposed();\n const currentRenderer = this._strategy.getRenderer();\n currentRenderer?.setFitMode(mode);\n Logger.info(`Video render fit mode changed to: ${mode}`);\n }\n\n /**\n * Sets the video processor\n *\n * @param {IVideoProcessor | null} processor - Video processor to set\n * @author sansen\n */\n public setProcessor(processor: IVideoProcessor | null): void {\n this.ensureNotDisposed();\n this._strategy.setProcessors(processor ? [processor] : []);\n }\n\n /**\n * Sets the video renderer\n *\n * @param {IVideoRenderer | null} renderer - Video renderer to set\n * @author sansen\n */\n public setRenderer(renderer: IVideoRenderer | null): void {\n this.ensureNotDisposed();\n this._strategy.setRenderer(renderer);\n }\n\n /**\n * Gets the current strategy instance\n *\n * @type {IVideoRenderStrategy}\n * @author sansen\n */\n public get strategy(): IVideoRenderStrategy {\n return this._strategy;\n }\n\n /**\n * Gets the internal video element renderer (if created from container element)\n *\n * @type {VideoElementRenderer | null}\n * @author sansen\n */\n public get videoElementRenderer(): VideoElementRenderer | null {\n return this._videoElementRenderer;\n }\n\n /**\n * Cleanup method called when the pipeline is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this._strategy.dispose();\n\n if (this._videoElementRenderer) {\n const element = this._videoElementRenderer.getElement();\n if (element && element.parentElement) {\n element.parentElement.removeChild(element);\n }\n this._videoElementRenderer.dispose();\n this._videoElementRenderer = null;\n }\n\n Logger.info('Video Pipeline disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport type { IVideoProcessor } from '@/video/video.d';\n\n/**\n * Video Processor Base Class\n * Provides abstract foundation for video processing implementations\n *\n * @author sansen\n * @abstract\n * @class VideoProcessor\n * @extends {Disposable}\n * @implements {IVideoProcessor}\n */\nexport abstract class VideoProcessor extends Disposable implements IVideoProcessor {\n /**\n * Processes an input video frame\n *\n * @abstract\n * @param {VideoFrame} frame - Input video frame to process\n * @returns {VideoFrame | null} Processed video frame or null if no processing occurred\n * @author sansen\n */\n public abstract process(frame: VideoFrame): VideoFrame | null;\n\n /**\n * Cleanup method called when the processor is disposed\n * Subclasses can override this method for additional cleanup\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n // Subclasses can override this method for additional cleanup\n }\n}\n","import { VideoProcessor } from './VideoProcessor';\nimport { Logger } from '@/utils/Logger';\nimport type { GreenScreenOptions } from '@/types/VideoOptions.d';\n\nexport class GreenScreenProcessor extends VideoProcessor {\n private _options: GreenScreenOptions;\n private _canvas: HTMLCanvasElement;\n private _gl: WebGLRenderingContext;\n private _program: WebGLProgram | null = null;\n private _texture: WebGLTexture | null = null;\n private _lastProcessedTimestamp: number | null = null;\n\n constructor(options: GreenScreenOptions) {\n super();\n this._options = options;\n this._canvas = document.createElement('canvas');\n const gl = this._canvas.getContext('webgl', {\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n if (!gl) throw new Error('WebGL not supported');\n this._gl = gl;\n this._initGL();\n Logger.info('WebGL Green Screen Processor initialized');\n }\n\n private _initGL() {\n const gl = this._gl;\n const vs = `\n attribute vec2 aPosition;\n attribute vec2 aTexCoord;\n varying vec2 vTexCoord;\n void main() {\n gl_Position = vec4(aPosition, 0, 1);\n vTexCoord = aTexCoord;\n }`;\n\n const fs = `\n precision mediump float;\n varying vec2 vTexCoord;\n uniform sampler2D uSampler;\n uniform vec3 uChromaKey; // greenScreen target color: RGB\n uniform float uSimilarity; // greenScreen similarity\n uniform float uSmoothness; // greenScreen smoothness\n uniform float uSpill; // greenScreen despill strength\n\n // convert RGB to YCbCr space, separate luminance and chrominance\n vec3 rgbToYcbcr(vec3 rgb) {\n float y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n float cb = 0.564 * (rgb.b - y) + 0.5;\n float cr = 0.713 * (rgb.r - y) + 0.5;\n return vec3(y, cb, cr);\n }\n\n void main() {\n vec4 color = texture2D(uSampler, vTexCoord);\n vec3 rgb = color.rgb;\n \n vec3 ycbcr = rgbToYcbcr(rgb);\n vec3 targetYcbcr = rgbToYcbcr(uChromaKey);\n \n // 核心改进:只计算 Cb 和 Cr 的欧式距离,忽略亮度 Y\n // 这能确保深色褶皱(Y低)因为 Cb/Cr 不变而不被扣除\n float dist = distance(ycbcr.yz, targetYcbcr.yz);\n \n // 使用 smoothstep 生成丝滑边缘\n float alpha = smoothstep(uSimilarity, uSimilarity + uSmoothness, dist);\n alpha = pow(alpha, 1.2);\n\n // 增强型 Despill (去溢出)\n float maxRB = max(rgb.r, rgb.b);\n if (rgb.g > maxRB) {\n float edgeFactor = 1.0 - alpha; // 边缘像素更强去绿\n float diff = (rgb.g - maxRB) * uSpill * edgeFactor;\n rgb.g -= diff;\n rgb.rb += diff * 0.15;\n }\n\n // rgb = mix(vec3(dot(rgb, vec3(0.333))), rgb, alpha);\n float luma = dot(rgb, vec3(0.299, 0.587, 0.114));\n rgb = mix(vec3(luma), rgb, alpha);\n\n gl_FragColor = vec4(rgb, alpha * color.a);\n }\n `; // 此处填入上方的 GLSL 代码\n\n this._program = this._createProgram(vs, fs);\n this._texture = gl.createTexture();\n\n // 初始化顶点数据\n const vertices = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, 1, 1, 1, 0]);\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n const pos = gl.getAttribLocation(this._program!, 'aPosition');\n const tex = gl.getAttribLocation(this._program!, 'aTexCoord');\n gl.enableVertexAttribArray(pos);\n gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(tex);\n gl.vertexAttribPointer(tex, 2, gl.FLOAT, false, 16, 8);\n }\n\n public process(frame: VideoFrame): VideoFrame | null {\n if (!this._options.enabled) return frame;\n\n const { displayWidth: w, displayHeight: h, timestamp } = frame;\n if (this._canvas.width !== w || this._canvas.height !== h) {\n this._canvas.width = w;\n this._canvas.height = h;\n this._gl.viewport(0, 0, w, h);\n }\n\n const gl = this._gl;\n gl.useProgram(this._program!);\n\n // 上传纹理\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this._texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame as any);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\n // 设置 Uniforms\n const key = this._options.chromaKey || [0, 255, 0];\n gl.uniform3f(gl.getUniformLocation(this._program!, 'uChromaKey'), key[0] / 255, key[1] / 255, key[2] / 255);\n gl.uniform1f(gl.getUniformLocation(this._program!, 'uSimilarity'), this._options.similarity ?? 0.3);\n gl.uniform1f(gl.getUniformLocation(this._program!, 'uSmoothness'), this._options.smoothness ?? 0.25);\n gl.uniform1f(gl.getUniformLocation(this._program!, 'uSpill'), this._options.despillStrength ?? 1.15);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n const newFrame = new VideoFrame(this._canvas, { timestamp, duration: frame.duration ?? undefined });\n frame.close();\n return newFrame;\n }\n\n private _createProgram(vsSource: string, fsSource: string): WebGLProgram | null {\n const gl = this._gl;\n const loadShader = (type: number, source: string) => {\n const s = gl.createShader(type)!;\n gl.shaderSource(s, source);\n gl.compileShader(s);\n return s;\n };\n const program = gl.createProgram()!;\n gl.attachShader(program, loadShader(gl.VERTEX_SHADER, vsSource));\n gl.attachShader(program, loadShader(gl.FRAGMENT_SHADER, fsSource));\n gl.linkProgram(program);\n return program;\n }\n\n protected onDispose(): void {\n const gl = this._gl;\n if (this._texture) gl.deleteTexture(this._texture);\n if (this._program) gl.deleteProgram(this._program);\n Logger.info('WebGL Green Screen Processor disposed');\n }\n\n // 保持空方法以兼容原始接口\n public updateOptions(options: Partial<GreenScreenOptions>): void {\n this._options = { ...this._options, ...options };\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { VideoSource } from './VideoSource';\nimport { VideoPipeline } from './VideoPipeline';\nimport { GreenScreenProcessor } from './processors/GreenScreenProcessor';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { GreenScreenOptions, RenderFitMode, VideoOptions } from '@/types/VideoOptions.d';\n\n/**\n * Video Controller\n * Manages video subscription, processing, and rendering\n *\n * @author sansen\n * @class VideoController\n * @extends {Disposable}\n */\nexport class VideoController extends Disposable {\n private readonly _context: SDKContext;\n private readonly _source: VideoSource;\n private readonly _pipeline: VideoPipeline;\n\n /**\n * Creates a video controller instance\n *\n * @param {SDKContext} context - SDK context for state management and event emission\n * @param {VideoOptions} [options] - Video configuration options\n * @author sansen\n */\n constructor(context: SDKContext, options?: VideoOptions) {\n super();\n this._context = context;\n this._source = new VideoSource();\n this._pipeline = new VideoPipeline(this._source, options);\n\n // If green screen processing configured, create and set up processor\n if (options?.renderMode === 'processed' && options?.greenScreen?.enabled) {\n // Create green screen processor\n const greenScreenProcessor = new GreenScreenProcessor(options.greenScreen as GreenScreenOptions);\n this._pipeline.setProcessor(greenScreenProcessor);\n Logger.info('Green screen processor enabled');\n }\n this._pipeline.setRenderFitMode(options?.fitMode || 'contain');\n Logger.info('Video Controller created');\n }\n\n /**\n * Sets video track for processing and rendering\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public setTrack(track: MediaStreamTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n // VideoSource now handles MediaStream binding to internal video element\n this._source.setTrack(track, trackId, participantId);\n }\n\n /**\n * Removes video track from processing and rendering\n *\n * @param {string} trackId - Track identifier to remove\n * @author sansen\n */\n public removeTrack(trackId: string): void {\n this.ensureNotDisposed();\n if (this._source.trackId === trackId) {\n // VideoSource now handles MediaStream cleanup\n this._source.clearTrack();\n }\n }\n\n /**\n * Sets video rendering mode\n *\n * @param {'raw' | 'processed'} mode - Rendering mode to set\n * @author sansen\n */\n protected setRenderMode(mode: 'raw' | 'processed'): void {\n this.ensureNotDisposed();\n this._pipeline.setRenderMode(mode);\n this._context.eventBus.emit('inner:video:render:mode:changed', { mode });\n }\n\n /**\n * Set render fit mode\n * @param mode Render fit mode\n * @author sansen\n */\n public setRenderFitMode(mode: RenderFitMode): void {\n this.ensureNotDisposed();\n this._pipeline.setRenderFitMode(mode);\n }\n\n /**\n * Get video source\n * @returns Video source\n * @author sansen\n */\n public getSource(): VideoSource {\n this.ensureNotDisposed();\n return this._source;\n }\n\n /**\n * Cleanup method called when the controller is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this._source.dispose();\n this._pipeline.dispose();\n Logger.info('Video Controller disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport type { IAudioProcessingStrategy } from './IAudioProcessingStrategy';\n\n/**\n * No-Operation Audio Processing Strategy\n * Directly returns input data without any processing\n *\n * @author sansen\n * @class NoOpAudioStrategy\n * @extends {Disposable}\n * @implements {IAudioProcessingStrategy}\n */\nexport class NoOpAudioStrategy extends Disposable implements IAudioProcessingStrategy {\n /**\n * Processes audio data (no-operation implementation)\n *\n * @param {Float32Array} audioData - Input audio data buffer\n * @param {number} _sampleRate - Audio sample rate in Hz\n * @returns {Float32Array} Processed audio data (returns input unchanged)\n * @author sansen\n */\n public process(audioData: Float32Array, _sampleRate: number): Float32Array {\n this.ensureNotDisposed();\n return audioData;\n }\n\n /**\n * Cleanup method called when the strategy is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n // No-op strategy doesn't require resource cleanup\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { NoOpAudioStrategy } from './strategies/NoOpAudioStrategy';\nimport type { AudioOptions } from '@/types/AudioOptions.d';\nimport type { IAudioProcessor } from './audio.d';\nimport type { IAudioProcessingStrategy } from './strategies/IAudioProcessingStrategy';\n\n/**\n * Input audio pipeline\n * Captures audio frames from the microphone, processes them, and outputs raw PCM audio data\n * Supports composable audio processors and processing strategies\n * @author sansen\n */\nexport class InputAudioPipeline extends Disposable {\n private readonly _processors: IAudioProcessor[] = [];\n private _processingStrategy: IAudioProcessingStrategy;\n private _onProcessedAudio?: (data: Float32Array, sampleRate: number) => void;\n\n /**\n * Callback for processed audio data\n */\n public set onProcessedAudio(callback: ((data: Float32Array, sampleRate: number) => void) | undefined) {\n this._onProcessedAudio = callback;\n }\n\n /**\n * Create an InputAudioPipeline\n * @param _options Audio configuration options\n */\n constructor(_options?: AudioOptions) {\n super();\n // 默认使用无操作策略(直接输出原始 PCM 数据)\n this._processingStrategy = new NoOpAudioStrategy();\n Logger.info('Input Audio Pipeline created');\n }\n\n /**\n * Set the processing strategy\n * @param strategy Audio processing strategy\n */\n public setProcessingStrategy(strategy: IAudioProcessingStrategy): void {\n this.ensureNotDisposed();\n\n if (this._processingStrategy) {\n this._processingStrategy.dispose();\n }\n\n this._processingStrategy = strategy;\n Logger.debug('Audio processing strategy set');\n }\n\n /**\n * Get the current processing strategy\n */\n public get processingStrategy(): IAudioProcessingStrategy {\n return this._processingStrategy;\n }\n\n /**\n * Add an audio processor\n * @param processor Audio processor\n */\n public addProcessor(processor: IAudioProcessor): void {\n this.ensureNotDisposed();\n this._processors.push(processor);\n Logger.debug(`Audio processor added. Total: ${this._processors.length}`);\n }\n\n /**\n * Remove an audio processor\n * @param processor Audio processor\n */\n public removeProcessor(processor: IAudioProcessor): void {\n this.ensureNotDisposed();\n const index = this._processors.indexOf(processor);\n if (index >= 0) {\n this._processors.splice(index, 1);\n Logger.debug(`Audio processor removed. Total: ${this._processors.length}`);\n }\n }\n\n /**\n * Process audio data\n * Receives raw PCM audio frames from the microphone, processes them, and outputs the result\n * @param audioData Raw PCM audio data (Float32Array, range -1.0 to 1.0)\n * @param sampleRate Sample rate (Hz)\n */\n public process(audioData: Float32Array, sampleRate: number): void {\n this.ensureNotDisposed();\n\n let processedData = audioData;\n\n // First run through the processing strategy (defaults to no-op which outputs raw PCM)\n try {\n processedData = this._processingStrategy.process(processedData, sampleRate);\n } catch (error) {\n Logger.error('Error in audio processing strategy:', error);\n // 策略出错时使用原始数据继续\n }\n\n // Then pass through all processors in order\n for (const processor of this._processors) {\n try {\n processedData = processor.process(processedData, sampleRate);\n } catch (error) {\n Logger.error('Error in audio processor:', error);\n // 处理器出错时跳过该处理器\n continue;\n }\n }\n\n // Trigger the processed callback with the resulting PCM audio frame\n if (this._onProcessedAudio) {\n this._onProcessedAudio(processedData, sampleRate);\n }\n }\n\n protected onDispose(): void {\n // Clean up processing strategy\n if (this._processingStrategy) {\n try {\n this._processingStrategy.dispose();\n } catch (error) {\n Logger.error('Error disposing audio processing strategy:', error);\n }\n }\n\n // Clean up all processors\n this._processors.forEach((processor) => {\n try {\n processor.dispose();\n } catch (error) {\n Logger.error('Error disposing audio processor:', error);\n }\n });\n this._processors.length = 0;\n this._onProcessedAudio = undefined;\n Logger.info('Input Audio Pipeline disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { SDKError } from '@/utils/SDKError';\n\n/**\n * Output audio pipeline\n * Plays audio tracks internally using an HTMLAudioElement\n * @author sansen\n */\nexport class OutputAudioPipeline extends Disposable {\n private _audioElement: HTMLAudioElement | null = null;\n private _stream: MediaStream | null = null;\n private _track: MediaStreamTrack | null = null;\n private _volume: number = 1.0;\n private _isMuted: boolean = false;\n\n /**\n * Create an OutputAudioPipeline\n * @author sansen\n */\n constructor() {\n super();\n // Create internal audio element (not exposed externally)\n this._audioElement = document.createElement('audio');\n this._audioElement.autoplay = true;\n this._audioElement.volume = this._volume;\n this._audioElement.muted = this._isMuted;\n Logger.info('Output Audio Pipeline created');\n }\n\n /**\n * Get audio element\n * @returns Audio element\n * @author sansen\n */\n public getAudioElement(): HTMLAudioElement {\n if (!this._audioElement) {\n throw new SDKError('Audio element not found');\n }\n return this._audioElement;\n }\n\n /**\n * Set the audio track\n * @param track Media track\n * @author sansen\n */\n public setTrack(track: MediaStreamTrack): void {\n this.ensureNotDisposed();\n\n // Clear previous track\n if (this._track && this._track !== track) {\n this._track.stop();\n }\n\n this._track = track;\n\n // Create MediaStream and assign to the audio element\n if (this._audioElement) {\n // If a stream already exists, remove it first\n if (this._stream) {\n this._stream.getTracks().forEach((t) => t.stop());\n this._stream = null;\n }\n\n // Create new MediaStream\n this._stream = new MediaStream([track]);\n // this._audioElement.srcObject = this._stream;\n\n // Restore volume and mute state\n this._audioElement.volume = this._volume;\n this._audioElement.muted = this._isMuted;\n\n Logger.debug('Audio track set to output pipeline');\n }\n }\n\n /**\n * Remove the audio track\n */\n public removeTrack(): void {\n this.ensureNotDisposed();\n\n if (this._stream) {\n this._stream.getTracks().forEach((track) => track.stop());\n this._stream = null;\n }\n\n if (this._track) {\n this._track.stop();\n this._track = null;\n }\n\n Logger.debug('Audio track removed from output pipeline');\n }\n\n /**\n * Set volume\n * @param volume Volume value (0.0 - 1.0)\n */\n public setVolume(volume: number): void {\n this.ensureNotDisposed();\n this._volume = Math.max(0, Math.min(1, volume));\n\n if (this._audioElement) {\n this._audioElement.volume = this._volume;\n }\n\n Logger.debug(`Audio output volume set to: ${this._volume}`);\n }\n\n /**\n * Get volume\n * @author sansen\n */\n public getVolume(): number {\n return this._volume;\n }\n\n /**\n * Mute output\n */\n public mute(): void {\n this.ensureNotDisposed();\n this._isMuted = true;\n\n if (this._audioElement) {\n this._audioElement.muted = true;\n }\n\n Logger.debug('Audio output muted');\n }\n\n /**\n * Unmute output\n */\n public unmute(): void {\n this.ensureNotDisposed();\n this._isMuted = false;\n\n if (this._audioElement) {\n this._audioElement.muted = false;\n }\n\n Logger.debug('Audio output unmuted');\n }\n\n /**\n * Check whether muted\n */\n public isMuted(): boolean {\n return this._isMuted;\n }\n\n protected onDispose(): void {\n this.removeTrack();\n\n if (this._audioElement) {\n this._audioElement = null;\n }\n\n Logger.info('Output Audio Pipeline disposed');\n }\n}\n","import { SDKError } from '@/utils/SDKError';\nimport type { AudioHeaderMetadata } from './AudioHeaderMetadata.d';\nimport { ErrorCode } from '@/constants/errorCode';\n\n/**\n * Audio Protocol Header Packer\n * Packages audio frame metadata into a precise 9-byte binary header\n *\n * @author sansen\n */\n\n/**\n * Protocol version (fixed value)\n *\n * @constant {number}\n * @default\n */\nconst PROTOCOL_DATA_TYPE = 0b01; // 2 bits, fixed to 01\n\n/**\n * Reserved field value (must be 0)\n *\n * @constant {number}\n * @default\n */\nconst RESERVED_VALUE = 0b000000; // 6 bits, must be 0\n\n/**\n * Sample rate encoding mapping\n *\n * @constant {Object}\n */\nconst SAMPLE_RATE_ENCODING: Record<0 | 1 | 2, number> = {\n 0: 0b00, // 16 kHz\n 1: 0b01, // 24 kHz\n 2: 0b10, // 48 kHz\n};\n\n/**\n * Clamps sequence number to valid range\n *\n * @param {number} value - Raw sequence number\n * @returns {number} Clamped sequence number (0-4095)\n * @author sansen\n */\nfunction clampSequenceNumber(value: number): number {\n if (value < 0) return 0;\n if (value > 4095) return 4095;\n return Math.floor(value);\n}\n\n/**\n * Clamps timestamp to valid range with wrap-around\n *\n * @param {number} value - Raw timestamp in milliseconds\n * @returns {number} Clamped timestamp (0-1048575)\n * @author sansen\n */\nfunction clampTimestamp(value: number): number {\n if (value < 0) return 0;\n // 20 bits max value: 0xFFFFF = 1048575\n const maxValue = 0xfffff;\n if (value > maxValue) return value & maxValue; // Wrap around using bitwise AND\n return Math.floor(value);\n}\n\n/**\n * Clamps frame size to valid range\n *\n * @param {number} value - Raw frame size in samples\n * @returns {number} Clamped frame size (0-4095)\n * @author sansen\n */\nfunction clampFrameSize(value: number): number {\n if (value < 0) return 0;\n if (value > 4095) return 4095;\n return Math.floor(value);\n}\n\n/**\n * Clamps payload length to valid range\n *\n * @param {number} value - Raw payload length in bytes\n * @returns {number} Clamped payload length (0-65535)\n * @author sansen\n */\nfunction clampPayloadLength(value: number): number {\n if (value < 0) return 0;\n // payload length expanded to 16 bits\n if (value > 0xffff) return 0xffff;\n return Math.floor(value);\n}\n\n/**\n * Validates sample rate encoding value\n *\n * @param {0|1|2} sampleRate - Sample rate encoding to validate\n * @throws {SDKError} If sample rate is invalid\n * @author sansen\n */\nfunction validateSampleRate(sampleRate: 0 | 1 | 2): void {\n if (sampleRate !== 0 && sampleRate !== 1 && sampleRate !== 2) {\n throw new SDKError(\n `Invalid sample rate encoding: ${sampleRate}. Must be 0 (16kHz), 1 (24kHz), or 2 (48kHz)`,\n ErrorCode.AUDIO_INVALID_SAMPLE_RATE\n );\n }\n}\n\n/**\n * Packs audio protocol header metadata into binary format\n *\n * Header layout (9 bytes, 72 bits):\n * Byte0: [V(2)][C(1)][K(1)][S_HIGH(4)]\n * Byte1: [S_LOW(8)]\n * Byte2: [T_HIGH(8)]\n * Byte3: [T_MID(8)]\n * Byte4: [T_LOW(4)][SR(2)][F_HIGH(2)]\n * Byte5: [F_MID(8)]\n * Byte6: [F_LOW(2)][R(6)]\n * Byte7: [L_HIGH(8)] <- payload length high 8 bits\n * Byte8: [L_LOW(8)] <- payload length low 8 bits\n *\n * Field descriptions:\n * - T: Type (2 bits), fixed to 01, means audio frame\n * - C: Channel (1 bit), 0=mono, 1=stereo\n * - K: KeyFrame (1 bit), 1=first frame, 0=others\n * - S: Sequence Number (12 bits), range 0-4095\n * - T: Timestamp (20 bits), milliseconds\n * - SR: Sample Rate (2 bits), 00=16kHz, 01=24kHz, 10=48kHz\n * - F: Frame Size (12 bits), range 0-4095 (samples)\n * - R: Reserved (6 bits), must be 0\n * - L: Payload Length (16 bits), range 0-65535 (bytes)\n *\n * @param {AudioHeaderMetadata} metadata - Audio header metadata\n * @returns {Uint8Array} 9-byte header buffer\n * @throws {SDKError} If metadata is invalid\n * @author sansen\n */\nexport function packAudioHeader(metadata: AudioHeaderMetadata): Uint8Array {\n // Validate sample rate\n validateSampleRate(metadata.sampleRate);\n\n // Clamp and validate values\n const sequenceNumber = clampSequenceNumber(metadata.sequenceNumber);\n const timestamp = clampTimestamp(metadata.timestamp);\n const frameSize = clampFrameSize(metadata.frameSize);\n const payloadLength = clampPayloadLength(metadata.payloadLength);\n\n // Validate channel value\n if (metadata.channel !== 0 && metadata.channel !== 1) {\n throw new SDKError(`Invalid channel value: ${metadata.channel}. Must be 0 (mono) or 1 (stereo)`, ErrorCode.AUDIO_INVALID_CHANNEL);\n }\n\n // Create 9-byte buffer\n const header = new Uint8Array(9);\n\n // Byte0: [V(2)][C(1)][K(1)][S_HIGH(4)]\n // V: bits 7-6 (2 bits), fixed to 01\n // C: bit 5 (1 bit)\n // K: bit 4 (1 bit)\n // S_HIGH: bits 3-0 (4 bits, high 4 bits of sequence number)\n let byte0 = PROTOCOL_DATA_TYPE << 6; // V: bits 7-6\n byte0 |= metadata.channel << 5; // C: bit 5\n byte0 |= (metadata.keyFrame ? 1 : 0) << 4; // K: bit 4\n byte0 |= (sequenceNumber >> 8) & 0x0f; // S_HIGH: bits 3-0 (high 4 bits of 12-bit sequence)\n header[0] = byte0;\n\n // Byte1: [S_LOW(8)]\n // S_LOW: bits 7-0 (low 8 bits of sequence number)\n header[1] = sequenceNumber & 0xff;\n\n // Byte2: [T_HIGH(8)]\n // T_HIGH: high 8 bits of 20-bit timestamp\n header[2] = (timestamp >> 12) & 0xff;\n\n // Byte3: [T_MID(8)]\n // T_MID: mid 8 bits of 20-bit timestamp\n header[3] = (timestamp >> 4) & 0xff;\n\n // Byte4: [T_LOW(4)][SR(2)][F_HIGH(2)]\n // T_LOW: bits 7-4 (low 4 bits of timestamp)\n // SR: bits 3-2 (sample rate encoding)\n // F_HIGH: bits 1-0 (high 2 bits of 12-bit frame size)\n const sampleRateEncoding = SAMPLE_RATE_ENCODING[metadata.sampleRate];\n let byte4 = (timestamp & 0x0f) << 4; // T_LOW: bits 7-4\n byte4 |= sampleRateEncoding << 2; // SR: bits 3-2\n byte4 |= (frameSize >> 10) & 0x03; // F_HIGH: bits 1-0 (high 2 bits of 12-bit frame size)\n header[4] = byte4;\n\n // Byte5: [F_MID(8)]\n // F_MID: mid 8 bits of 12-bit frame size\n header[5] = (frameSize >> 2) & 0xff;\n\n // Byte6: [F_LOW(2)][R(6)]\n // F_LOW: bits 7-6 (low 2 bits of 12-bit frame size)\n // R: bits 5-0 (reserved, must be 0)\n let byte6 = (frameSize & 0x03) << 6; // F_LOW: bits 7-6\n byte6 |= RESERVED_VALUE & 0x3f; // R: bits 5-0 (6 bits)\n header[6] = byte6;\n\n // Byte7: payload length high 8 bits\n header[7] = (payloadLength >> 8) & 0xff;\n\n // Byte8: payload length low 8 bits\n header[8] = payloadLength & 0xff;\n\n return header;\n}\n\n/**\n * Unpacks audio protocol header from binary format (for testing and debugging)\n *\n * @param {Uint8Array} header - 9-byte header buffer\n * @returns {AudioHeaderMetadata} Unpacked audio header metadata\n * @throws {SDKError} If header is invalid\n * @author sansen\n */\nexport function unpackAudioHeader(header: Uint8Array): AudioHeaderMetadata {\n if (header.length !== 9) {\n throw new SDKError(`Invalid header length: ${header.length}. Expected 9 bytes`, ErrorCode.AUDIO_INVALID_HEADER_LENGTH);\n }\n\n // Byte0: [V(2)][C(1)][K(1)][S_HIGH(4)]\n const dataType = (header[0] >> 6) & 0x03;\n if (dataType !== PROTOCOL_DATA_TYPE) {\n throw new SDKError(`Invalid protocol type: ${dataType}. Expected ${PROTOCOL_DATA_TYPE}`, ErrorCode.AUDIO_INVALID_TYPE);\n }\n\n const channel = ((header[0] >> 5) & 0x01) as 0 | 1;\n const keyFrame = ((header[0] >> 4) & 0x01) === 1;\n const sequenceNumberHigh = header[0] & 0x0f;\n\n // Byte1: [S_LOW(8)]\n const sequenceNumberLow = header[1];\n const sequenceNumber = (sequenceNumberHigh << 8) | sequenceNumberLow;\n\n // Byte2: [T_HIGH(8)]\n const timestampHigh = header[2];\n\n // Byte3: [T_MID(8)]\n const timestampMid = header[3];\n\n // Byte4: [T_LOW(4)][SR(2)][F_HIGH(2)]\n const timestampLow = (header[4] >> 4) & 0x0f;\n const timestamp = (timestampHigh << 12) | (timestampMid << 4) | timestampLow;\n\n const sampleRateEncoding = (header[4] >> 2) & 0x03;\n let sampleRate: 0 | 1 | 2;\n if (sampleRateEncoding === 0b00) sampleRate = 0;\n else if (sampleRateEncoding === 0b01) sampleRate = 1;\n else if (sampleRateEncoding === 0b10) sampleRate = 2;\n else {\n throw new SDKError(`Invalid sample rate encoding: ${sampleRateEncoding}`, ErrorCode.AUDIO_INVALID_SAMPLE_RATE);\n }\n\n const frameSizeHigh = header[4] & 0x03;\n\n // Byte5: [F_MID(8)]\n const frameSizeMid = header[5];\n\n // Byte6: [F_LOW(2)][R(6)]\n const frameSizeLow = (header[6] >> 6) & 0x03;\n const frameSize = (frameSizeHigh << 10) | (frameSizeMid << 2) | frameSizeLow;\n\n const reserved = header[6] & 0x3f;\n if (reserved !== RESERVED_VALUE) {\n throw new SDKError(`Invalid reserved field: ${reserved}. Expected ${RESERVED_VALUE}`, ErrorCode.AUDIO_INVALID_RESERVED);\n }\n\n // Byte7-8: payload length 16 bits\n const payloadLength = (header[7] << 8) | header[8];\n\n return {\n channel,\n keyFrame,\n sequenceNumber,\n timestamp,\n sampleRate,\n frameSize,\n payloadLength,\n };\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { packAudioHeader, type AudioHeaderMetadata } from './protocol';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { AudioOptions } from '@/types/AudioOptions.d';\nimport type { IWebSocketSender } from '@/types/Common';\n\n/**\n * WebSocket sender adapter (for ConversationTransport)\n */\nclass ConversationTransportAdapter implements IWebSocketSender {\n constructor(private readonly transport: { sendBinary(data: ArrayBuffer | Uint8Array): void; isConnected: boolean }) { }\n\n public sendBinary(data: ArrayBuffer | Uint8Array): void {\n this.transport.sendBinary(data);\n }\n\n public isConnected(): boolean {\n return this.transport.isConnected;\n }\n}\n\n/**\n * Audio frame sender\n * Listens to the audio capture pipeline, packs, and sends audio frames to WebSocket\n * @author sansen\n */\nexport class AudioFrameSender extends Disposable {\n private readonly _context: SDKContext;\n private readonly _options: AudioOptions | undefined;\n private _wsSender: IWebSocketSender | null = null;\n private _sequenceNumber: number = 0;\n private _isKeyFrame: boolean = true;\n private _audioStartTime: number = 0;\n private _isSending: boolean = false;\n private _audioFrameListener: ((event: { data: Float32Array; sampleRate: number }) => void) | null = null;\n\n // Audio buffer\n private _audioBuffer: Float32Array[] = [];\n private _bufferedSampleCount: number = 0;\n private _targetSampleRate: number = 24000;\n private _bitDepth: number = 16;\n private _minSamplesToSend: number = 0; // sampleRate / 10\n\n /**\n * Create an AudioFrameSender\n * @param context SDK context\n * @param options Audio configuration options\n */\n constructor(context: SDKContext, options?: AudioOptions) {\n super();\n this._context = context;\n this._options = options;\n\n // Read target sample rate and bit depth from options\n const inputOptions = options?.input;\n this._targetSampleRate = inputOptions?.sampleRate || 24000;\n this._bitDepth = inputOptions?.bitDepth || 16;\n this._minSamplesToSend = Math.floor(this._targetSampleRate / 10); // 至少 100ms\n\n Logger.info(\n `Audio Frame Sender created: sampleRate=${this._targetSampleRate}Hz, bitDepth=${this._bitDepth}bit, minSamples=${this._minSamplesToSend}`\n );\n }\n\n /**\n * Set the WebSocket sender\n * @param sender WebSocket sender\n */\n public setWebSocketSender(sender: IWebSocketSender): void {\n this._wsSender = sender;\n }\n\n /**\n * Set ConversationTransport (convenience helper)\n * @param transport ConversationTransport instance\n */\n public setConversationTransport(transport: { sendBinary(data: ArrayBuffer | Uint8Array): void; isConnected: boolean }): void {\n this._wsSender = new ConversationTransportAdapter(transport);\n }\n\n /**\n * 开始发送音频帧\n */\n public start(): void {\n this.ensureNotDisposed();\n\n if (this._isSending) {\n Logger.warn('Audio frame sending already started');\n return;\n }\n\n // Reset sequence number and keyframe flag\n this._sequenceNumber = 0;\n this._isKeyFrame = true;\n this._audioStartTime = Date.now();\n\n // Listen to audio frame events (for WebSocket sending and event emission)\n this._audioFrameListener = (event: { data: Float32Array; sampleRate: number }) => {\n this._handleAudioFrame(event.data, event.sampleRate);\n };\n\n this._context.eventBus.on('inner:audio:frame:received', this._audioFrameListener);\n this._isSending = true;\n Logger.info('Audio frame sending started');\n }\n\n /**\n * Stop sending audio frames\n * Flush and send all buffered audio data\n */\n public stop(): void {\n this.ensureNotDisposed();\n\n if (!this._isSending) {\n return;\n }\n\n // Flush and send all buffered audio data\n this._flushBuffer();\n\n // 移除事件监听\n if (this._audioFrameListener) {\n this._context.eventBus.off('inner:audio:frame:received', this._audioFrameListener);\n this._audioFrameListener = null;\n }\n\n this._isSending = false;\n Logger.info('Audio frame sending stopped');\n }\n\n /**\n * Handle an audio frame\n * @param audioData PCM audio data (Float32Array, range -1.0 to 1.0)\n * @param sampleRate Sample rate (Hz)\n */\n private _handleAudioFrame(audioData: Float32Array, sampleRate: number): void {\n if (!this._isSending) {\n return;\n }\n\n try {\n // Validate sample rate matches target\n if (Math.abs(sampleRate - this._targetSampleRate) > 1) {\n Logger.warn(`Sample rate mismatch: expected ${this._targetSampleRate}Hz, got ${sampleRate}Hz`);\n }\n\n // Buffer the audio data\n this._audioBuffer.push(new Float32Array(audioData));\n this._bufferedSampleCount += audioData.length;\n\n // Only send when accumulated sample count >= sampleRate/10 (at least 100ms)\n if (this._bufferedSampleCount >= this._minSamplesToSend) {\n this._flushBuffer();\n }\n } catch (error) {\n Logger.error('Error handling audio frame:', error);\n // 不抛出错误,继续处理下一帧(fire-and-forget)\n }\n }\n\n /**\n * Flush buffer and send all buffered audio data\n */\n private _flushBuffer(): void {\n if (this._audioBuffer.length === 0 || this._bufferedSampleCount === 0) {\n return;\n }\n\n try {\n // Merge all buffered audio data\n const totalSamples = this._bufferedSampleCount;\n const mergedData = new Float32Array(totalSamples);\n let offset = 0;\n for (const buffer of this._audioBuffer) {\n mergedData.set(buffer, offset);\n offset += buffer.length;\n }\n\n // Clear the buffer\n this._audioBuffer = [];\n this._bufferedSampleCount = 0;\n\n // Convert to PCM\n const pcmData = this._convertToPCM(mergedData, this._bitDepth);\n const bytesPerSample = Math.ceil(this._bitDepth / 8);\n const payloadLength = pcmData.length * bytesPerSample;\n\n // Determine sample rate encoding\n const sampleRateEncoding = this._getSampleRateEncoding(this._targetSampleRate);\n\n // Compute timestamp (milliseconds since audio capture started)\n const timestamp = Math.floor(Date.now() - this._audioStartTime);\n\n // Build header metadata\n const headerMetadata: AudioHeaderMetadata = {\n channel: (this._options?.input?.channels || 1) === 1 ? 0 : 1, // 0=mono, 1=stereo\n keyFrame: this._isKeyFrame ? true : false,\n sequenceNumber: this._sequenceNumber,\n timestamp,\n sampleRate: sampleRateEncoding,\n frameSize: mergedData.length, // 样本数\n payloadLength,\n };\n\n // Convert PCM data to Uint8Array (little-endian)\n const payload = this._pcmToUint8Array(pcmData, this._bitDepth);\n\n // Emit raw audio payload event (non-blocking, does not affect WebSocket send)\n setTimeout(() => {\n try {\n this._context.eventBus.emit('inner:audio:payload:send', {\n payload,\n sampleRate: this._targetSampleRate,\n channels: this._options?.input?.channels || 1,\n sequenceNumber: headerMetadata.sequenceNumber,\n timestamp: headerMetadata.timestamp,\n keyFrame: headerMetadata.keyFrame,\n frameSize: headerMetadata.frameSize,\n });\n } catch (error) {\n Logger.error('Error emitting inner:audio:payload:send event:', error);\n }\n }, 0);\n\n // WebSocket send (only when connected; fire-and-forget, non-blocking)\n if (this._wsSender && this._wsSender.isConnected()) {\n try {\n // Pack the header\n const header = packAudioHeader(headerMetadata);\n\n // Combine header and payload\n const frame = new Uint8Array(header.length + payload.length);\n frame.set(header, 0);\n frame.set(payload, header.length);\n\n // Send binary frame (fire-and-forget, non-blocking)\n this._wsSender.sendBinary(frame);\n Logger.debug(\n `Audio frame sent via WS: seq=${headerMetadata.sequenceNumber}, samples=${mergedData.length}, size=${frame.length} bytes`\n );\n } catch (error) {\n Logger.error('Error sending audio frame via WebSocket:', error);\n }\n }\n\n // Update state\n this._isKeyFrame = false;\n this._sequenceNumber = (this._sequenceNumber + 1) % 4096; // 回绕到 0-4095\n } catch (error) {\n Logger.error('Error flushing audio buffer:', error);\n }\n }\n\n /**\n * Convert Float32Array to PCM data (supports different bit depths)\n * @param floatData Float32Array (range -1.0 to 1.0)\n * @param bitDepth Bit depth (16 or 32)\n * @returns Int16Array (16-bit) or Int32Array (32-bit)\n */\n private _convertToPCM(floatData: Float32Array, bitDepth: number): Int16Array | Int32Array {\n if (bitDepth === 16) {\n const pcmData = new Int16Array(floatData.length);\n for (let i = 0; i < floatData.length; i++) {\n const sample = Math.max(-1, Math.min(1, floatData[i]));\n pcmData[i] = sample < 0 ? sample * 0x8000 : sample * 0x7fff;\n }\n return pcmData;\n } else if (bitDepth === 32) {\n const pcmData = new Int32Array(floatData.length);\n for (let i = 0; i < floatData.length; i++) {\n const sample = Math.max(-1, Math.min(1, floatData[i]));\n pcmData[i] = sample * 0x7fffffff;\n }\n return pcmData;\n } else {\n // 默认使用 16-bit\n Logger.warn(`Unsupported bit depth: ${bitDepth}, using 16-bit`);\n return this._convertToPCM(floatData, 16);\n }\n }\n\n /**\n * Convert PCM data to Uint8Array (little-endian)\n * @param pcmData Int16Array or Int32Array\n * @param bitDepth Bit depth\n * @returns Uint8Array\n */\n private _pcmToUint8Array(pcmData: Int16Array | Int32Array, bitDepth: number): Uint8Array {\n const bytesPerSample = Math.ceil(bitDepth / 8);\n const uint8Data = new Uint8Array(pcmData.length * bytesPerSample);\n const view = new DataView(uint8Data.buffer);\n\n for (let i = 0; i < pcmData.length; i++) {\n if (bitDepth === 16) {\n view.setInt16(i * 2, (pcmData as Int16Array)[i], true); // little-endian\n } else if (bitDepth === 32) {\n view.setInt32(i * 4, (pcmData as Int32Array)[i], true); // little-endian\n }\n }\n\n return uint8Data;\n }\n\n /**\n * Get sample rate encoding\n * @param sampleRate Sample rate (Hz)\n * @returns Encoding (0=16kHz, 1=24kHz, 2=48kHz)\n */\n private _getSampleRateEncoding(sampleRate: number): 0 | 1 | 2 {\n if (sampleRate === 16000) return 0;\n if (sampleRate === 24000) return 1;\n if (sampleRate === 48000) return 2;\n // Default to 24kHz\n Logger.warn(`Unsupported sample rate: ${sampleRate}, defaulting to 48kHz`);\n return 1;\n }\n\n protected onDispose(): void {\n this.stop();\n Logger.info('Audio Frame Sender disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { IAudioSource } from './audio.d';\n\n/**\n * Audio Source Base Class\n * Abstract interface for audio capture\n *\n * @author sansen\n * @abstract\n * @class AudioSource\n * @extends {Disposable}\n * @implements {IAudioSource}\n */\nexport abstract class AudioSource extends Disposable implements IAudioSource {\n /**\n * Audio data callback\n *\n * @type {Function}\n * @param {Float32Array} data - Audio data buffer\n * @param {number} sampleRate - Audio sample rate in Hz\n * @author sansen\n */\n public onAudioData?: (data: Float32Array, sampleRate: number) => void;\n\n /**\n * Starts audio capture\n *\n * @abstract\n * @returns {Promise<void>} Promise that resolves when audio capture is started\n * @author sansen\n */\n public abstract start(): Promise<void>;\n\n /**\n * Stops audio capture\n *\n * @abstract\n * @author sansen\n */\n public abstract stop(): void;\n\n /**\n * Triggers audio data callback\n *\n * @protected\n * @param {Float32Array} data - Audio data buffer\n * @param {number} sampleRate - Audio sample rate in Hz\n * @author sansen\n */\n protected emitAudioData(data: Float32Array, sampleRate: number): void {\n if (this.onAudioData) {\n try {\n this.onAudioData(data, sampleRate);\n } catch (error) {\n Logger.error('Error in audio data callback:', error);\n }\n }\n }\n}\n","/**\n * AudioWorklet processor code\n * Used for resampling and PCM conversion\n * @author sansen\n */\nconst workletCode = `\nclass AudioResamplerProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n this.targetSampleRate = options.processorOptions?.targetSampleRate || 24000;\n this.bitDepth = options.processorOptions?.bitDepth || 16;\n this.channels = options.processorOptions?.channels || 1;\n \n // Resampling related\n // sampleRate is a global in AudioWorkletProcessor representing the AudioContext's sample rate\n this.resampleRatio = this.targetSampleRate / sampleRate;\n \n // Timestamp tracking\n this.frameCount = 0;\n }\n\n process(inputs, outputs, parameters) {\n const input = inputs[0];\n if (!input || input.length === 0 || !input[0] || input[0].length === 0) {\n return true;\n }\n\n const inputData = input[0]; // mono input\n const inputLength = inputData.length;\n \n // Linear resampling\n const outputLength = Math.floor(inputLength * this.resampleRatio);\n const resampledData = new Float32Array(outputLength);\n \n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i / this.resampleRatio;\n const srcIndexFloor = Math.floor(srcIndex);\n const srcIndexCeil = Math.min(srcIndexFloor + 1, inputLength - 1);\n const fraction = srcIndex - srcIndexFloor;\n \n // Linear interpolation\n resampledData[i] = inputData[srcIndexFloor] * (1 - fraction) + inputData[srcIndexCeil] * fraction;\n }\n \n // Post the resampled data\n this.port.postMessage({\n type: 'audioData',\n data: resampledData,\n sampleRate: this.targetSampleRate,\n bitDepth: this.bitDepth,\n frameCount: this.frameCount,\n });\n \n this.frameCount += outputLength;\n \n return true;\n }\n}\n\nregisterProcessor('audio-resampler', AudioResamplerProcessor);\n`;\n\n/**\n * Get the URL of the AudioWorklet processor\n * @author sansen\n */\nexport function getAudioResamplerWorkletURL(): string {\n const blob = new Blob([workletCode], { type: 'text/javascript' });\n return URL.createObjectURL(blob);\n}\n","import { AudioSource } from '@/audio/AudioSource';\nimport { SDKError } from '@/utils/SDKError';\nimport { Logger } from '@/utils/Logger';\nimport { DEFAULT_AUDIO_SAMPLE_RATE, DEFAULT_AUDIO_BIT_DEPTH } from '@/constants/defaults';\nimport { getAudioResamplerWorkletURL } from './AudioResamplerWorklet';\nimport type { AudioOptions } from '@/types/AudioOptions.d';\nimport { ErrorCode } from '@/constants/errorCode';\n\n/**\n * WebRTC Audio Source\n * Uses getUserMedia + AudioWorklet for audio capture with resampling support\n *\n * @author sansen\n * @class WebRTCAudioSource\n * @extends {AudioSource}\n */\nexport class WebRTCAudioSource extends AudioSource {\n private _stream: MediaStream | null = null;\n private _audioContext: AudioContext | null = null;\n private _sourceNode: MediaStreamAudioSourceNode | null = null;\n private _workletNode: AudioWorkletNode | null = null;\n private _targetSampleRate: number = DEFAULT_AUDIO_SAMPLE_RATE;\n private _bitDepth: number = DEFAULT_AUDIO_BIT_DEPTH;\n private _channels: number = 1;\n\n /**\n * Creates a WebRTC audio source instance\n *\n * @param {AudioOptions} [options] - Audio configuration options\n * @author sansen\n */\n constructor(private readonly options?: AudioOptions) {\n super();\n\n // Support new configuration format (input\n const inputOptions = options?.input;\n this._targetSampleRate = inputOptions?.sampleRate || DEFAULT_AUDIO_SAMPLE_RATE;\n // bitDepth only exists in new configuration format\n this._bitDepth = inputOptions?.bitDepth || DEFAULT_AUDIO_BIT_DEPTH;\n this._channels = inputOptions?.channels || 1;\n }\n\n /**\n * Starts audio capture\n *\n * @returns {Promise<void>} Promise that resolves when audio capture is started\n * @throws {SDKError} If audio capture fails\n * @author sansen\n */\n public async start(): Promise<void> {\n this.ensureNotDisposed();\n\n try {\n // Get user media stream (using system default sample rate)\n const inputOptions = this.options?.input;\n const constraints: MediaStreamConstraints = {\n audio: inputOptions?.constraints || {\n channelCount: this._channels,\n },\n };\n\n this._stream = await navigator.mediaDevices.getUserMedia(constraints);\n const audioTrack = this._stream.getAudioTracks()[0];\n const settings = audioTrack.getSettings();\n const inputSampleRate = settings.sampleRate || 44100; // System default sample rate\n\n // Create AudioContext (using actual system sample rate)\n this._audioContext = new AudioContext({\n sampleRate: inputSampleRate,\n });\n\n // Load AudioWorklet processor\n const workletURL = getAudioResamplerWorkletURL();\n await this._audioContext.audioWorklet.addModule(workletURL);\n\n // Create audio source node\n this._sourceNode = this._audioContext.createMediaStreamSource(this._stream);\n\n // Create AudioWorklet node (for resampling and conversion)\n this._workletNode = new AudioWorkletNode(this._audioContext, 'audio-resampler', {\n processorOptions: {\n targetSampleRate: this._targetSampleRate,\n bitDepth: this._bitDepth,\n channels: this._channels,\n },\n numberOfInputs: 1,\n numberOfOutputs: 0, // No output to speakers needed\n });\n\n // Listen for Worklet messages\n this._workletNode.port.onmessage = (event) => {\n const { type, data, sampleRate } = event.data;\n if (type === 'audioData' && data) {\n // Trigger callback using target sample rate\n this.emitAudioData(data, sampleRate);\n }\n };\n\n // Connect audio nodes\n this._sourceNode.connect(this._workletNode);\n\n Logger.info(`Audio capture started: input=${inputSampleRate}Hz -> output=${this._targetSampleRate}Hz, ${this._bitDepth}bit`);\n } catch (error) {\n throw SDKError.fromError(error, ErrorCode.AUDIO_CAPTURE_FAILED);\n }\n }\n\n /**\n * Stops audio capture and cleans up resources\n *\n * @author sansen\n */\n public stop(): void {\n if (this._stream) {\n this._stream.getTracks().forEach((track) => track.stop());\n this._stream = null;\n }\n\n if (this._workletNode) {\n this._workletNode.port.onmessage = null;\n this._workletNode.disconnect();\n this._workletNode = null;\n }\n\n if (this._sourceNode) {\n this._sourceNode.disconnect();\n this._sourceNode = null;\n }\n\n if (this._audioContext) {\n this._audioContext.close();\n this._audioContext = null;\n }\n\n Logger.info('Audio capture stopped');\n }\n\n /**\n * Cleanup method called when the source is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.stop();\n }\n}\n","import { WebRTCAudioSource } from './WebRTCAudioSource';\nimport type { IAudioSourceFactory } from './IAudioSourceFactory';\nimport type { AudioOptions } from '@/types/AudioOptions.d';\nimport type { AudioSource } from '@/audio/AudioSource';\n\n/**\n * WebRTC Audio Source Factory\n * Creates WebRTCAudioSource instances\n *\n * @author sansen\n * @class WebRTCAudioSourceFactory\n * @implements {IAudioSourceFactory}\n */\nexport class WebRTCAudioSourceFactory implements IAudioSourceFactory {\n /**\n * Creates a WebRTCAudioSource instance\n *\n * @param {AudioOptions} [options] - Audio configuration options\n * @returns {AudioSource} WebRTCAudioSource instance\n * @author sansen\n */\n public create(options?: AudioOptions): AudioSource {\n return new WebRTCAudioSource(options);\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { InputAudioPipeline } from './AudioPipeline';\nimport { OutputAudioPipeline } from './OutputAudioPipeline';\nimport { AudioFrameSender } from './AudioFrameSender';\nimport { WebRTCAudioSourceFactory } from './sources/WebRTCAudioSourceFactory';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { AudioOptions } from '@/types/AudioOptions.d';\nimport type { AudioSource } from './AudioSource';\nimport type { IAudioSourceFactory } from './sources/IAudioSourceFactory';\nimport type { IWebSocketSender } from '@/types/Common';\nimport { ErrorCode } from '@/constants/errorCode';\nimport type { IAudioController } from './audio.d';\n\n/**\n * Audio controller\n * Manages audio input capture/processing and audio output playback\n * @author sansen\n */\nexport class AudioController extends Disposable implements IAudioController {\n private readonly _context: SDKContext;\n private readonly _inputPipeline: InputAudioPipeline;\n private readonly _outputPipeline: OutputAudioPipeline;\n private readonly _frameSender: AudioFrameSender;\n private readonly _sourceFactory: IAudioSourceFactory;\n private _source: AudioSource | null = null;\n private _isCapturing: boolean = false;\n private _currentOutputTrackId: string | null = null;\n\n /**\n * Create an AudioController\n * @param context SDK context\n * @param options Audio configuration options\n * @param sourceFactory Audio source factory (optional, defaults to WebRTCAudioSourceFactory)\n */\n constructor(context: SDKContext, options?: AudioOptions, sourceFactory?: IAudioSourceFactory) {\n super();\n this._context = context;\n this._inputPipeline = new InputAudioPipeline(options);\n this._outputPipeline = new OutputAudioPipeline();\n this._frameSender = new AudioFrameSender(context, options);\n this._sourceFactory = sourceFactory || new WebRTCAudioSourceFactory();\n\n // Set input pipeline output callback (preserve existing behavior)\n this._inputPipeline.onProcessedAudio = (data, sampleRate) => {\n this._context.eventBus.emit('inner:audio:frame:received', { data, sampleRate });\n };\n\n Logger.info('Audio Controller created');\n }\n\n /**\n * Set the WebSocket sender (used to send audio frames)\n * @param sender WebSocket sender\n */\n public setWebSocketSender(sender: IWebSocketSender): void {\n this._frameSender.setWebSocketSender(sender);\n }\n\n /**\n * Start audio capture\n */\n public async startCapture(): Promise<void> {\n this.ensureNotDisposed();\n\n if (this._isCapturing) {\n Logger.warn('Audio capture already started');\n return;\n }\n\n try {\n if (!this._source) {\n this._source = this._sourceFactory.create(this._context.options.audio);\n this._source.onAudioData = (data, sampleRate) => {\n this._inputPipeline.process(data, sampleRate);\n };\n }\n\n await this._source.start();\n this._isCapturing = true;\n\n // Start sending audio frames\n this._frameSender.start();\n\n this._context.eventBus.emit('inner:audio:input:started', undefined);\n Logger.info('Audio capture started');\n } catch (error) {\n throw this._context.emitError(error, ErrorCode.AUDIO_CAPTURE_START_FAILED);\n }\n }\n\n /**\n * Stop audio capture\n */\n public stopCapture(): void {\n this.ensureNotDisposed();\n\n if (!this._isCapturing) {\n return;\n }\n\n if (this._source) {\n this._source.stop();\n }\n\n // Stop sending audio frames\n this._frameSender.stop();\n\n this._isCapturing = false;\n this._context.eventBus.emit('inner:audio:input:stopped', undefined);\n Logger.info('Audio capture stopped');\n }\n\n /**\n * Check whether audio is being captured\n */\n public get isCapturing(): boolean {\n return this._isCapturing;\n }\n\n /**\n * Set audio output track\n * @param track Media track\n * @param trackId Track ID\n * @param participantId Participant ID\n */\n public setOutputTrack(track: MediaStreamTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n this._outputPipeline.setTrack(track);\n this._currentOutputTrackId = trackId;\n this._context.eventBus.emit('inner:audio:track:added', { trackId, participantId });\n Logger.info(`Audio output track ready`);\n }\n\n /**\n * Remove audio output track\n * @param trackId Track ID\n */\n public removeOutputTrack(trackId: string): void {\n this.ensureNotDisposed();\n if (this._currentOutputTrackId === trackId) {\n this._outputPipeline.removeTrack();\n this._currentOutputTrackId = null;\n this._context.eventBus.emit('inner:audio:track:removed', { trackId });\n Logger.info(`Audio output track removed`);\n }\n }\n\n /**\n * Set volume (synchronized between audio and video control)\n * @param volume Volume value (0.0 - 1.0)\n */\n public setVolume(volume: number): void {\n this.ensureNotDisposed();\n this._outputPipeline.setVolume(volume);\n this._context.eventBus.emit('inner:audio:volume:changed', { volume });\n Logger.debug(`Audio volume set to: ${volume}`);\n }\n\n /**\n * Get volume\n */\n public getVolume(): number {\n return this._outputPipeline.getVolume();\n }\n\n /**\n * Mute (synchronized between audio and video control)\n */\n public mute(): void {\n this.ensureNotDisposed();\n this._outputPipeline.mute();\n this._context.eventBus.emit('inner:audio:muted', undefined);\n Logger.debug('Audio muted');\n }\n\n /**\n * Unmute (synchronized between audio and video control)\n */\n public unmute(): void {\n this.ensureNotDisposed();\n this._outputPipeline.unmute();\n this._context.eventBus.emit('inner:audio:unmuted', undefined);\n Logger.debug('Audio unmuted');\n }\n\n /**\n * Get audio element\n * @returns Audio element\n * @author sansen\n */\n public getOutputElement(): HTMLAudioElement {\n return this._outputPipeline.getAudioElement();\n }\n\n /**\n * Check whether muted\n */\n public isMuted(): boolean {\n return this._outputPipeline.isMuted();\n }\n\n protected onDispose(): void {\n this.stopCapture();\n if (this._source) {\n this._source.dispose();\n this._source = null;\n }\n this._inputPipeline.dispose();\n this._outputPipeline.dispose();\n this._frameSender.dispose();\n Logger.info('Audio Controller disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { SDKError } from '@/utils/SDKError';\nimport { ErrorCode } from '@/constants/errorCode';\n\n/**\n * Camera Source\n * Wraps getUserMedia video stream with a hidden HTMLVideoElement\n * and provides start/stop and accessors.\n *\n * @author sansen\n */\nexport class CameraSource extends Disposable {\n private _stream: MediaStream | null = null;\n private _videoElement: HTMLVideoElement | null = null;\n\n /**\n * Start camera capture using getUserMedia({ video: true })\n *\n * @returns Promise<void>\n */\n public async start(): Promise<void> {\n this.ensureNotDisposed();\n\n if (this._stream) {\n Logger.warn('Camera capture already started');\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n this._stream = stream;\n\n if (!this._videoElement) {\n const video = document.createElement('video');\n video.autoplay = true;\n video.muted = true;\n video.playsInline = true;\n // Hide the element visually and from hit-testing\n video.style.position = 'fixed';\n video.style.opacity = '0';\n video.style.pointerEvents = 'none';\n video.style.width = '0';\n video.style.height = '0';\n video.style.zIndex = '-1';\n\n if (typeof document !== 'undefined' && document.body) {\n document.body.appendChild(video);\n }\n\n this._videoElement = video;\n }\n\n this._videoElement.srcObject = this._stream;\n // Fire and forget; errors are logged but do not reject start()\n this._videoElement.play().catch((error) => {\n Logger.error('Failed to start camera video playback', error);\n });\n } catch (error) {\n throw SDKError.fromError(error, ErrorCode.SDK_ERROR);\n }\n }\n\n /**\n * Stop camera capture and release tracks\n */\n public stop(): void {\n if (this._stream) {\n this._stream.getTracks().forEach((track) => track.stop());\n this._stream = null;\n }\n\n if (this._videoElement) {\n this._videoElement.srcObject = null;\n const parent = this._videoElement.parentNode;\n if (parent) {\n parent.removeChild(this._videoElement);\n }\n this._videoElement = null;\n }\n\n Logger.info('Camera capture stopped');\n }\n\n /**\n * Get underlying MediaStream\n *\n * @returns MediaStream | null\n */\n public getStream(): MediaStream | null {\n this.ensureNotDisposed();\n return this._stream;\n }\n\n /**\n * Get the internal video element used for capture (for use by scheduler/canvas).\n *\n * @returns HTMLVideoElement | null\n */\n public getVideoElement(): HTMLVideoElement | null {\n this.ensureNotDisposed();\n return this._videoElement;\n }\n\n /**\n * Get the first video track from the stream\n *\n * @returns MediaStreamTrack | null\n */\n public getTrack(): MediaStreamTrack | null {\n this.ensureNotDisposed();\n if (!this._stream) {\n return null;\n }\n const tracks = this._stream.getVideoTracks();\n return tracks.length > 0 ? tracks[0] : null;\n }\n\n /**\n * Cleanup resources when disposed\n *\n * @protected\n */\n protected onDispose(): void {\n this.stop();\n }\n}\n","import { JPEG_QUALITY } from '@/constants/defaults';\nimport { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { ImageFormat } from './protocol';\nimport { SDKContext } from '@/client/SDKContext';\n\n/** Output frame size */\nconst FRAME_WIDTH = 640;\nconst FRAME_HEIGHT = 640;\n\n/**\n * Schedules periodic screenshots from a video element into JPEG blobs.\n * Reuses a single offscreen canvas at 640x360.\n *\n * @author sansen\n */\nexport class ScreenshotScheduler extends Disposable {\n private _videoElement: HTMLVideoElement | null = null;\n // private _intervalMs: number;\n // private _timerId: ReturnType<typeof setInterval> | null = null;\n // canvas may be an OffscreenCanvas when supported\n private _canvas: HTMLCanvasElement | OffscreenCanvas | null = null;\n private _onFrame: (blob: Blob, width: number, height: number, format: ImageFormat, quality: number) => void;\n private _context: SDKContext;\n private _handleServerCommand: ({ code, command }: { code: number; command: string }) => void;\n\n /**\n * @param videoElement Source video element to capture from\n * @param onFrame Callback invoked with JPEG Blob on each tick\n * @param intervalMs Interval between screenshots in ms (default 2000)\n */\n constructor(\n videoElement: HTMLVideoElement | null,\n onFrame: (blob: Blob, width: number, height: number, format: ImageFormat, quality: number) => void,\n // intervalMs: number = DEFAULT_INTERVAL_MS\n context: SDKContext\n ) {\n super();\n this._videoElement = videoElement;\n this._onFrame = onFrame;\n this._context = context;\n this._handleServerCommand = this._onServerCommand.bind(this);\n // this._intervalMs = intervalMs;\n }\n\n /**\n * Set or update the video element to capture from\n *\n * @param videoElement Source video element (null to clear)\n */\n public setVideoElement(videoElement: HTMLVideoElement | null): void {\n this._videoElement = videoElement;\n }\n\n /**\n * Start periodic screenshots\n */\n public start(): void {\n this.ensureNotDisposed();\n // if (this._timerId !== null) {\n // Logger.warn('ScreenshotScheduler already started');\n // return;\n // }\n\n // prefer OffscreenCanvas for performance if available\n if (!this._canvas) {\n if (typeof OffscreenCanvas !== 'undefined') {\n // width/height will be adjusted on each capture to preserve aspect\n this._canvas = new OffscreenCanvas(FRAME_WIDTH, FRAME_HEIGHT) as unknown as HTMLCanvasElement;\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = FRAME_WIDTH;\n this._canvas.height = FRAME_HEIGHT;\n }\n }\n this._context.eventBus.on('inner:conversation:server:command', this._handleServerCommand);\n // this._timerId = setInterval(() => {\n // this._captureFrame();\n // }, this._intervalMs);\n }\n\n private _onServerCommand({ code }: { code: number; command: string }): void {\n if (code === 500) {\n this._captureFrame();\n }\n }\n /**\n * Stop periodic screenshots\n */\n public stop(): void {\n this._context.eventBus.off('inner:conversation:server:command', this._handleServerCommand);\n // if (this._timerId !== null) {\n // clearInterval(this._timerId);\n // this._timerId = null;\n // }\n }\n\n /**\n * Capture a frame from the video element\n */\n private _captureFrame(): void {\n const video = this._videoElement;\n const canvas = this._canvas;\n\n if (!video || !canvas) return;\n\n if (video.readyState < 2 || video.videoWidth === 0 || video.videoHeight === 0) {\n return;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const srcW = video.videoWidth;\n const srcH = video.videoHeight;\n\n const targetW = FRAME_WIDTH;\n const targetH = (FRAME_WIDTH * srcH) / srcW;\n\n if (canvas.width !== targetW) {\n canvas.width = targetW;\n }\n if (canvas.height !== targetH) {\n canvas.height = targetH;\n }\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(video, 0, 0, srcW, srcH, 0, 0, targetW, targetH);\n\n // Use OffscreenCanvas.convertToBlob if available, otherwise HTMLCanvasElement.toBlob\n if (\n typeof OffscreenCanvas !== 'undefined' &&\n canvas instanceof OffscreenCanvas &&\n typeof (canvas as any).convertToBlob === 'function'\n ) {\n (canvas as OffscreenCanvas)\n .convertToBlob({ type: 'image/jpeg', quality: JPEG_QUALITY })\n .then((blob: Blob | null) => {\n if (!blob) return;\n try {\n this._onFrame(blob, targetW, targetH, 0, JPEG_QUALITY);\n } catch (error) {\n Logger.error('ScreenshotScheduler onFrame callback error', error);\n }\n })\n .catch((err: any) => {\n Logger.error('ScreenshotScheduler convertToBlob error', err);\n });\n } else if (canvas instanceof HTMLCanvasElement) {\n canvas.toBlob(\n (blob) => {\n if (!blob) return;\n\n try {\n this._onFrame(blob, targetW, targetH, 0, JPEG_QUALITY);\n } catch (error) {\n Logger.error('ScreenshotScheduler onFrame callback error', error);\n }\n },\n 'image/jpeg',\n JPEG_QUALITY\n );\n }\n }\n\n protected onDispose(): void {\n this.stop();\n this._canvas = null;\n this._videoElement = null;\n }\n}\n","import type { ImageFormat } from './protocol/ImageHeaderMetadata.d';\n\n/**\n * Result of encoding a screenshot Blob to raw bytes + metadata\n */\nexport interface ScreenshotEncodedResult {\n data: Uint8Array;\n width: number;\n height: number;\n format: ImageFormat;\n quality: number;\n}\n\n/**\n * Options passed when encoding a screenshot Blob\n */\nexport interface ScreenshotEncodeOptions {\n width: number;\n height: number;\n format: ImageFormat;\n quality: number;\n}\n\n/**\n * Encode a screenshot Blob to Uint8Array and attach metadata.\n * Reads raw bytes via ArrayBuffer; does not use base64.\n *\n * @param blob Image Blob (e.g. from canvas.toBlob)\n * @param options width, height, format, quality\n * @returns Promise with { data, width, height, format, quality }\n */\nexport async function encodeScreenshot(blob: Blob, options: ScreenshotEncodeOptions): Promise<ScreenshotEncodedResult> {\n const buffer = await blob.arrayBuffer();\n const data = new Uint8Array(buffer);\n return {\n data,\n width: options.width,\n height: options.height,\n format: options.format,\n quality: options.quality,\n };\n}\n","import type { ImageHeaderMetadata, ImageFormat } from './ImageHeaderMetadata.d';\n\n/** Header size in bytes */\nconst HEADER_SIZE = 12;\n\n/** T: 2 bits fixed 10 */\nconst T_VALUE = 0b10;\n/** V: 2 bits fixed 00 */\nconst V_VALUE = 0b00;\n\n/** Valid format range (0–4) */\nconst FORMAT_MIN = 0;\nconst FORMAT_MAX = 4;\n\n/** 16-bit max */\nconst U16_MAX = 0xffff;\n/** 32-bit max */\nconst U32_MAX = 0xffffffff;\n\n/**\n * Clamp value to 8-bit unsigned\n */\nfunction clampU8(value: number): number {\n const n = Math.floor(value);\n if (n < 0) return 0;\n if (n > 0xff) return 0xff;\n return n;\n}\n\n/**\n * Clamp value to 16-bit unsigned\n */\nfunction clampU16(value: number): number {\n const n = Math.floor(value);\n if (n < 0) return 0;\n if (n > U16_MAX) return U16_MAX;\n return n;\n}\n\n/**\n * Clamp value to 32-bit unsigned\n */\nfunction clampU32(value: number): number {\n const n = Math.floor(value);\n if (n < 0) return 0;\n if (n > U32_MAX) return U32_MAX;\n return n;\n}\n\n/**\n * Clamp format to 0–4 (F: 4 bits)\n */\nfunction clampFormat(value: number): ImageFormat {\n const n = Math.floor(value);\n if (n < FORMAT_MIN) return FORMAT_MIN as ImageFormat;\n if (n > FORMAT_MAX) return FORMAT_MAX as ImageFormat;\n return n as ImageFormat;\n}\n\n/**\n * Pack image header metadata into a 12-byte big-endian buffer.\n * Byte 0: T(2) | V(2) | F(4). Bytes 1–11: Q, ID, W, H, L.\n *\n * @param meta Header fields (format, quality, id, width, height, payloadLength)\n * @returns Uint8Array of length 12\n */\nexport function packImageHeader(meta: ImageHeaderMetadata): Uint8Array {\n const buffer = new ArrayBuffer(HEADER_SIZE);\n const view = new DataView(buffer);\n\n const f = clampFormat(meta.format) & 0x0f;\n const byte0 = (T_VALUE << 6) | (V_VALUE << 4) | f;\n view.setUint8(0, byte0);\n view.setUint8(1, clampU8(meta.quality));\n view.setUint16(2, clampU16(meta.id), false);\n view.setUint16(4, clampU16(meta.width), false);\n view.setUint16(6, clampU16(meta.height), false);\n view.setUint32(8, clampU32(meta.payloadLength), false);\n\n return new Uint8Array(buffer);\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { packImageHeader } from './protocol/ImageHeaderPacker';\nimport type { ImageFormat } from './protocol/ImageHeaderMetadata.d';\nimport type { IWebSocketSender } from '@/types/Common';\n\n/** 16-bit id max, wrap at 65536 */\nconst IMAGE_ID_MAX = 65535;\n\n/**\n * Metadata for a single image frame (id and payloadLength are set by sender)\n */\nexport interface ImageFrameMetadata {\n width: number;\n height: number;\n format: ImageFormat;\n quality: number;\n}\n\n/**\n * Sends image frames over WebSocket with 12-byte header + payload.\n * Maintains imageId (0–65535 wrap); drops frames when not connected.\n *\n * @author sansen\n */\nexport class ImageFrameSender extends Disposable {\n private _wsSender: IWebSocketSender | null = null;\n private _imageId: number = 0;\n\n /**\n * Set the WebSocket sender (injected from transport)\n *\n * @param sender IWebSocketSender instance\n */\n public setWebSocketSender(sender: IWebSocketSender): void {\n this._wsSender = sender;\n }\n\n /**\n * Send one image frame: 12-byte header + payload. If not connected, frame is dropped.\n *\n * @param imageData Raw image bytes (e.g. JPEG)\n * @param metadata width, height, format, quality (id is assigned internally)\n */\n public send(imageData: Uint8Array, metadata: ImageFrameMetadata): void {\n this.ensureNotDisposed();\n if (!this._wsSender || !this._wsSender.isConnected()) {\n return;\n }\n const payloadLength = imageData.byteLength;\n const header = packImageHeader({\n format: metadata.format,\n quality: metadata.quality,\n id: this._nextId(),\n width: metadata.width,\n height: metadata.height,\n payloadLength,\n });\n const frame = new Uint8Array(header.byteLength + payloadLength);\n frame.set(header, 0);\n frame.set(imageData, header.byteLength);\n this._wsSender.sendBinary(frame);\n }\n\n private _nextId(): number {\n const id = this._imageId;\n this._imageId = this._imageId >= IMAGE_ID_MAX ? 0 : this._imageId + 1;\n return id;\n }\n\n protected onDispose(): void {\n this._wsSender = null;\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKContext } from '@/client/SDKContext';\nimport { CameraSource } from './CameraSource';\nimport { ScreenshotScheduler } from './ScreenshotScheduler';\nimport { encodeScreenshot } from './ScreenshotEncoder';\nimport { ImageFrameSender } from './ImageFrameSender';\nimport type { IWebSocketSender } from '@/types/Common';\nimport { JPEG_QUALITY } from '@/constants/defaults';\nimport { ImageFormat } from './protocol/ImageHeaderMetadata';\n\n/**\n * Camera controller: aggregates source, scheduler, encoder, and frame sender.\n * startCamera → start source, then scheduler; scheduler → encode → sender.send.\n * Emits inner:camera:started / inner:camera:stopped.\n *\n * @author sansen\n */\nexport class CameraController extends Disposable {\n private readonly _context: SDKContext;\n private readonly _source: CameraSource;\n private readonly _scheduler: ScreenshotScheduler;\n private readonly _sender: ImageFrameSender;\n private _isRunning: boolean = false;\n\n constructor(context: SDKContext) {\n super();\n this._context = context;\n this._source = new CameraSource();\n this._sender = new ImageFrameSender();\n\n const onFrame = (blob: Blob, width: number, height: number, format: ImageFormat, quality: number = JPEG_QUALITY): void => {\n encodeScreenshot(blob, {\n width,\n height,\n format,\n quality,\n }).then((encoded) => {\n this._sender.send(encoded.data, {\n width: encoded.width,\n height: encoded.height,\n format: encoded.format,\n quality: encoded.quality,\n });\n });\n };\n\n this._scheduler = new ScreenshotScheduler(null, onFrame, context);\n }\n\n /**\n * Start camera capture and periodic screenshot sending\n */\n public async startCamera(): Promise<void> {\n this.ensureNotDisposed();\n if (this._isRunning) {\n Logger.warn('Camera already running');\n return;\n }\n await this._source.start();\n const videoEl = this._source.getVideoElement();\n this._scheduler.setVideoElement(videoEl);\n this._scheduler.start();\n this._isRunning = true;\n this._context.eventBus.emit('inner:camera:started', undefined);\n Logger.info('Camera started');\n }\n\n /**\n * Stop camera capture and screenshot sending\n */\n public stopCamera(): void {\n this.ensureNotDisposed();\n if (!this._isRunning) return;\n this._scheduler.stop();\n this._source.stop();\n this._isRunning = false;\n this._context.eventBus.emit('inner:camera:stopped', undefined);\n Logger.info('Camera stopped');\n }\n\n /**\n * Whether camera is currently running\n */\n public isCameraRunning(): boolean {\n return this._isRunning;\n }\n\n /**\n * Get the current camera MediaStream (null if not running)\n */\n public getStream(): MediaStream | null {\n this.ensureNotDisposed();\n return this._source.getStream();\n }\n\n /**\n * Get the current camera video track (null if not running)\n */\n public getTrack(): MediaStreamTrack | null {\n this.ensureNotDisposed();\n return this._source.getTrack();\n }\n\n /**\n * Attach the camera stream to a video element for preview\n *\n * @param videoElement Element to show the stream\n */\n public attachTo(videoElement: HTMLVideoElement): void {\n this.ensureNotDisposed();\n const stream = this._source.getStream();\n if (!stream) return;\n videoElement.srcObject = stream;\n videoElement.play().catch((err) => Logger.error('attachTo play failed', err));\n }\n\n /**\n * Set WebSocket sender for image frame upload\n *\n * @param sender IWebSocketSender instance\n */\n public setWebSocketSender(sender: IWebSocketSender): void {\n this._sender.setWebSocketSender(sender);\n }\n\n protected onDispose(): void {\n this.stopCamera();\n this._source.dispose();\n this._scheduler.dispose();\n this._sender.dispose();\n }\n}\n","/**\n * Conversation State Enumeration\n *\n * @author sansen\n * @enum {ConversationStateType}\n */\nexport enum ConversationStateType {\n /**\n * No active conversation\n *\n * @author sansen\n */\n IDLE = 'idle',\n\n /**\n * Waiting for server response\n *\n * @author sansen\n */\n WAITING = 'waiting',\n\n /**\n * Receiving streaming answer chunks\n *\n * @author sansen\n */\n STREAMING = 'streaming',\n\n /**\n * Answer stream completed\n *\n * @author sansen\n */\n COMPLETED = 'completed',\n\n /**\n * Conversation error occurred\n *\n * @author sansen\n */\n ERROR = 'error',\n}\n\n/**\n * Conversation State Management\n * Pure data container without business logic\n *\n * @author sansen\n * @class ConversationState\n */\nexport class ConversationState {\n /**\n * Current conversation state\n *\n * @type {ConversationStateType}\n * @default ConversationStateType.IDLE\n * @author sansen\n */\n public state: ConversationStateType = ConversationStateType.IDLE;\n\n /**\n * Resets all conversation state properties to default values\n *\n * @author sansen\n */\n public reset(): void {\n this.state = ConversationStateType.IDLE;\n }\n}\n","import { ConversationStateType } from '@/state/ConversationState';\nimport { BaseStateMachine, StateTransition } from '@/state/baseStateMachine';\n\n/**\n * Conversation state machine\n * Manages allowed state transitions for conversation sessions\n * Ensures transitions are valid according to a defined table\n * @author sansen\n */\nexport class ConversationStateMachine extends BaseStateMachine<ConversationStateType> {\n protected _currentState: ConversationStateType = ConversationStateType.IDLE;\n\n /**\n * State transition table\n * Explicitly defines all allowed state transitions\n */\n protected readonly transitionTable: readonly StateTransition<ConversationStateType>[] = [\n { from: ConversationStateType.IDLE, to: [ConversationStateType.WAITING, ConversationStateType.ERROR] },\n { from: ConversationStateType.WAITING, to: [ConversationStateType.STREAMING, ConversationStateType.ERROR] },\n { from: ConversationStateType.STREAMING, to: [ConversationStateType.COMPLETED, ConversationStateType.ERROR] },\n { from: ConversationStateType.COMPLETED, to: [ConversationStateType.IDLE, ConversationStateType.WAITING, ConversationStateType.ERROR] },\n { from: ConversationStateType.ERROR, to: [ConversationStateType.IDLE] },\n ] as const;\n\n /**\n * Reset to the initial state\n * The reset operation does not validate transitions; it directly sets the initial state\n * @author sansen\n */\n public reset(): void {\n this._currentState = ConversationStateType.IDLE;\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { ConversationStateType } from '@/state/ConversationState';\nimport { ConversationStateMachine } from './state/ConversationStateMachine';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { Question } from './models/Question';\nimport type { Answer } from './models/Answer';\n\n/**\n * Conversation session\n * Manages state and messages for a single conversation session\n * @author sansen\n */\nexport class ConversationSession extends Disposable {\n private _sessionId: string;\n private readonly _stateMachine: ConversationStateMachine;\n private _currentQuestion: Question | null = null;\n private _currentAnswer: Answer | null = null;\n\n /**\n * Create a ConversationSession\n * @param sessionId Session ID\n * @param _context SDK context (not used)\n * @author sansen\n */\n constructor(sessionId: string, _context: SDKContext) {\n super();\n this._sessionId = sessionId;\n this._stateMachine = new ConversationStateMachine();\n Logger.info(`Conversation session created: ${sessionId}`);\n }\n\n /**\n * Get the session ID\n * @author sansen\n */\n public get sessionId(): string {\n return this._sessionId;\n }\n\n /**\n * Get current session state\n * @author sansen\n */\n public get state(): ConversationStateType {\n return this._stateMachine.getCurrentState();\n }\n\n /**\n * Set the current question (internal — called by handleEvent)\n * @param question Question object\n * @author sansen\n */\n private _setQuestion(question: Question): void {\n this._currentQuestion = question;\n // State transition is handled by the FSM\n this._stateMachine.transitionTo(ConversationStateType.WAITING);\n // Sync context (state already validated by the FSM)\n this._syncContextState();\n }\n\n /**\n * Get the current question\n * @author sansen\n */\n public get currentQuestion(): Question | null {\n return this._currentQuestion;\n }\n\n /**\n * Start receiving an answer (internal — called by handleEvent)\n * @param questionId Question ID\n * @author sansen\n */\n private _startAnswer(questionId: string): void {\n this._currentAnswer = {\n questionId,\n text: '',\n isComplete: false,\n timestamp: Date.now(),\n };\n // State transition is handled by the FSM\n this._stateMachine.transitionTo(ConversationStateType.STREAMING);\n // Sync context (state already validated by the FSM)\n this._syncContextState();\n }\n\n /**\n * Append an answer chunk (internal — called by handleEvent)\n * @param chunk Answer fragment\n * @author sansen\n */\n private _appendAnswerChunk(chunk: string): void {\n if (this._currentAnswer) {\n this._currentAnswer.text += chunk;\n }\n }\n\n /**\n * Complete the answer (internal — called by handleEvent)\n * @author sansen\n */\n private _completeAnswer(): void {\n if (this._currentAnswer) {\n this._currentAnswer.isComplete = true;\n this._currentAnswer.completedAt = Date.now();\n }\n // State transition is handled by the FSM\n this._stateMachine.transitionTo(ConversationStateType.COMPLETED);\n // Sync context (state already validated by the FSM)\n this._syncContextState();\n }\n\n /**\n * Get the current answer\n * @author sansen\n */\n public get currentAnswer(): Answer | null {\n return this._currentAnswer;\n }\n\n /**\n * Set an error state (internal — called by handleEvent)\n * @param _error Error message\n * @author sansen\n */\n private _setError(_error: string): void {\n // State transition is handled by the FSM\n this._stateMachine.transitionTo(ConversationStateType.ERROR);\n // Sync context (state already validated by the FSM)\n this._syncContextState();\n }\n\n /**\n * Sync context state from the FSM (read-only, do not assign directly)\n * @author sansen\n */\n private _syncContextState(): void {\n // this._context.conversationState.state = this._stateMachine.getCurrentState();\n }\n\n /**\n * Unified event entry: all external events should be passed through this method\n * Internal modifications are then driven by the state machine\n * This is the single source of truth for state changes; all transitions are validated by the FSM\n * Includes defenses for invalid sequencing: events in error states are rejected to avoid corruption\n * @author sansen\n */\n public handleEvent(event: { type: 'QUESTION' | 'ANSWER_START' | 'ANSWER_CHUNK' | 'ANSWER_COMPLETE' | 'ERROR'; payload?: any }): void {\n const currentState = this._stateMachine.getCurrentState();\n\n switch (event.type) {\n case 'QUESTION':\n // QUESTION events should only be triggered from IDLE or COMPLETED states (defend against invalid sequencing)\n if (currentState !== ConversationStateType.IDLE && currentState !== ConversationStateType.COMPLETED) {\n Logger.warn(`Ignoring QUESTION event in invalid state: ${currentState}`);\n return;\n }\n this._setQuestion(event.payload as Question);\n break;\n case 'ANSWER_START':\n // ANSWER_START should only be triggered from the WAITING state (defend against invalid sequencing)\n if (currentState !== ConversationStateType.WAITING) {\n Logger.warn(`Ignoring ANSWER_START event in invalid state: ${currentState}. Expected: WAITING`);\n return;\n }\n // The FSM will validate the transition from WAITING to STREAMING\n this._startAnswer(event.payload as string);\n break;\n case 'ANSWER_CHUNK':\n // ANSWER_CHUNK should only be processed while in the STREAMING state (defend against invalid sequencing)\n if (currentState !== ConversationStateType.STREAMING) {\n Logger.warn(`Ignoring ANSWER_CHUNK event in invalid state: ${currentState}. Expected: STREAMING`);\n return;\n }\n // Appending fragments does not involve state transitions\n this._appendAnswerChunk((event.payload && event.payload.chunk) || '');\n // If marked complete, trigger the completion flow\n if (event.payload && event.payload.isComplete) {\n this._completeAnswer();\n }\n break;\n case 'ANSWER_COMPLETE':\n // ANSWER_COMPLETE should only be triggered from STREAMING state (defend against invalid sequencing)\n if (currentState !== ConversationStateType.STREAMING) {\n Logger.warn(`Ignoring ANSWER_COMPLETE event in invalid state: ${currentState}. Expected: STREAMING`);\n return;\n }\n // The FSM will validate the transition from STREAMING to COMPLETED\n this._completeAnswer();\n break;\n case 'ERROR':\n // ERROR events can be triggered from any state (error recovery mechanism)\n // FSM will validate the transition into the error state\n this._setError(event.payload as string);\n break;\n default:\n // noop for unknown events\n Logger.warn(`Unknown event type: ${(event as any).type}`);\n break;\n }\n }\n\n /**\n * Reset the session\n * @author sansen\n */\n public reset(): void {\n this._stateMachine.reset();\n this._currentQuestion = null;\n this._currentAnswer = null;\n }\n\n protected onDispose(): void {\n this.reset();\n Logger.info(`Conversation session disposed: ${this._sessionId}`);\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\n/**\n * Message assembler\n * Used to assemble streamed answer fragments into complete messages\n * @author sansen\n */\nexport class MessageAssembler extends Disposable {\n private _buffers: Map<string, string> = new Map();\n\n /**\n * Append a message chunk\n * @param questionId Question ID\n * @param chunk Message fragment to append\n * @returns The currently accumulated full message\n * @author sansen\n */\n public appendChunk(questionId: string, chunk: string): string {\n this.ensureNotDisposed();\n\n const current = this._buffers.get(questionId) || '';\n const updated = current + chunk;\n this._buffers.set(questionId, updated);\n\n Logger.debug(`Message chunk appended for question ${questionId}, length: ${updated.length}`);\n return updated;\n }\n\n /**\n * Get the complete message for a question\n * @param questionId Question ID\n * @returns The full message or null if none\n * @author sansen\n */\n public getMessage(questionId: string): string | null {\n return this._buffers.get(questionId) || null;\n }\n\n /**\n * Complete message assembly and return the full message\n * @param questionId Question ID\n * @returns The assembled full message\n * @author sansen\n */\n public complete(questionId: string): string {\n const message = this.getMessage(questionId) || '';\n this._buffers.delete(questionId);\n Logger.debug(`Message assembly completed for question ${questionId}, length: ${message.length}`);\n return message;\n }\n\n /**\n * Clear the message buffer for a specific question\n * @param questionId Question ID\n * @author sansen\n */\n public clear(questionId: string): void {\n this._buffers.delete(questionId);\n }\n\n protected onDispose(): void {\n this._buffers.clear();\n Logger.info('Message Assembler disposed');\n }\n}\n","/**\n * Conversation ID generation service\n * Responsible for creating session IDs and question IDs (UIDs)\n * @author sansen\n */\nexport class ConversationIdService {\n /**\n * Generate a session ID\n * @returns session ID string\n * @author sansen\n */\n public generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Generate a short question ID (UID)\n * Produces a short UID (e.g. \"uykN\")\n * @returns UID string\n * @author sansen\n */\n public generateQuestionId(): string {\n // generate a 4-character random string (e.g. \"uykN\")\n return Math.random().toString(36).substring(2, 6);\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { ConversationSession } from './ConversationSession';\nimport { MessageAssembler } from './MessageAssembler';\nimport { ConversationIdService } from './services/ConversationIdService';\nimport { ConversationStateType } from '@/state/ConversationState';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { ConversationOptions } from '@/types/ConversationOptions.d';\nimport type { ConversationTransport } from '@/transport/ConversationTransport';\nimport { ClientTextMetadata } from '@/transport/protocol';\n\n/**\n * Conversation manager\n * Manages conversation sessions and state machines\n * @author sansen\n */\nexport class ConversationManager extends Disposable {\n private readonly _context: SDKContext;\n private readonly _assembler: MessageAssembler;\n // private readonly _router: InputRouter;\n private readonly _idService: ConversationIdService;\n private _transport: ConversationTransport | null = null;\n private _sessions: Map<string, ConversationSession> = new Map();\n /**\n * Create a ConversationManager\n * @param context SDK context\n * @param options Conversation configuration options\n * @author sansen\n */\n constructor(context: SDKContext, _options?: ConversationOptions) {\n super();\n this._context = context;\n this._assembler = new MessageAssembler();\n // this._router = new InputRouter();\n this._idService = new ConversationIdService();\n\n // Set input router callbacks\n // this._router.onTextInput = (text) => {\n // this.handleTextInput(text);\n // };\n\n Logger.info('Conversation Manager created');\n }\n\n /**\n * Set the transport service (used to send questions)\n * @param transport Conversation transport service\n * @author sansen\n */\n public setTransport(transport: ConversationTransport): void {\n this._transport = transport;\n }\n\n /**\n * Get the input router\n * @author sansen\n */\n // public get inputRouter(): InputRouter {\n // return this._router;\n // }\n\n /**\n * Send a question (text)\n * @param text The question text\n * @param metadata Client text metadata (defaults shown)\n * - `speed`: speech speed (default 100)\n * - `mood`: emotion (default 0)\n * - `vol`: volume (default 50)\n * @returns Message UID string\n * @author sansen\n */\n public async sendQuestion(text: string, metadata: ClientTextMetadata = { speed: 100, mood: 0, vol: 50 }): Promise<string> {\n this.ensureNotDisposed();\n\n // Generate a UID (uses questionId generation logic)\n const uid = this._idService.generateQuestionId();\n const question = {\n id: uid,\n text,\n timestamp: Date.now(),\n inputMode: 'text' as const,\n };\n\n // Create a separate session for each Q&A (use questionId as the key)\n const sessionId = this._idService.generateSessionId();\n const session = new ConversationSession(sessionId, this._context);\n // Handle the question via the unified event entry (Session drives its FSM and updates context internally)\n session.handleEvent({ type: 'QUESTION', payload: question });\n // Associate the session with the question id so subsequent fragments route to the session by uid\n this._sessions.set(uid, session);\n\n // Send the question via transport\n if (this._transport) {\n try {\n // code 200 indicates Q&A message type (default; extensible later)\n this._transport.sendText(uid, text, 200, metadata);\n } catch (error) {\n Logger.error('Error sending question via transport:', error);\n // Handle the error via the event entry (FSM will validate state transitions internally)\n session.handleEvent({ type: 'ERROR', payload: 'Failed to send question' });\n this._context.eventBus.emit('inner:sdk:error', { error: error instanceof Error ? error : new Error(String(error)) });\n throw error;\n }\n } else {\n Logger.warn('Transport not set, question not sent');\n }\n\n // Emit events (after state update)\n this._context.eventBus.emit('inner:conversation:question:sent', { questionId: uid, text });\n this._context.eventBus.emit('inner:conversation:answer:waiting', { questionId: uid });\n Logger.info(`Question sent: ${uid}`);\n\n return uid;\n }\n\n /**\n * Handle server-side pong message\n * @author sansen\n */\n public handleServerPong(): void {\n this.ensureNotDisposed();\n // Manager no longer sets its own timer; notify Transport to manage heartbeat state\n if (this._transport) {\n this._transport.handlePongReceived();\n }\n }\n\n /**\n * Will disconnect (prepare for disconnect)\n * @author sansen\n */\n public willDisconnect(): void {\n this.ensureNotDisposed();\n this._transport?.willDisconnect();\n }\n\n /**\n * Handle text input\n * @param text Text content\n * @author sansen\n */\n private handleTextInput(text: string): void {\n this.sendQuestion(text).catch((error) => {\n Logger.error('Error sending question:', error);\n });\n }\n\n /**\n * Handle an answer chunk\n * @param uid Message UID\n * @param chunk Answer fragment\n * @param isComplete Whether the answer is complete\n * @author sansen\n */\n public handleAnswerChunk(uid: string, chunk: string, isComplete: boolean): void {\n this.ensureNotDisposed();\n\n const session = this._sessions.get(uid);\n if (!session) {\n Logger.warn(`No active session for answer chunk: ${uid}`);\n return;\n }\n\n // Get current state (used only to decide whether to send ANSWER_START event)\n const currentState = session.state;\n\n if (currentState === ConversationStateType.WAITING) {\n session.handleEvent({ type: 'ANSWER_START', payload: uid });\n }\n\n if (isComplete) {\n // Completed — trigger completion flow and clean up the session\n session.handleEvent({ type: 'ANSWER_COMPLETE' });\n const finalAnswer = this._assembler.complete(uid);\n this._context.eventBus.emit('inner:conversation:answer:completed', { questionId: uid, fullAnswer: finalAnswer });\n\n // Clean up session resources\n try {\n session.dispose();\n } catch (e) {\n Logger.error('Error disposing session:', e);\n }\n this._sessions.delete(uid);\n } else {\n // Append chunk (handled via event entry point; does not involve state transition)\n session.handleEvent({ type: 'ANSWER_CHUNK', payload: { uid, chunk, isComplete } });\n this._assembler.appendChunk(uid, chunk);\n\n // Emit factual event (no state decision involved)\n this._context.eventBus.emit('inner:conversation:answer:chunk', { questionId: uid, chunk, isComplete });\n }\n }\n\n /**\n * Handle a server-initiated message\n * @param uid Question ID\n * @param message Message text\n * @param type Message type\n * @author sansen\n */\n public handleServerInitiatedMessage(uid: string, message: string): void {\n this.ensureNotDisposed();\n this._context.eventBus.emit('inner:conversation:server:message', { questionId: uid, message, type: 'text' });\n }\n\n /**\n * Handle ASR text reception\n * @param uid Question ID\n * @param text Recognized text\n * @author sansen\n */\n public handleAsrTextReceived(uid: string, text: string): void {\n this.ensureNotDisposed();\n // Create a new session or use the current one\n // Create a separate session for each ASR reception (use uid as the key)\n const sessionId = this._idService.generateSessionId();\n const session = new ConversationSession(sessionId, this._context);\n session.handleEvent({ type: 'QUESTION', payload: { id: uid, text, timestamp: Date.now(), inputMode: 'voice' as const } });\n this._sessions.set(uid, session);\n this._context.eventBus.emit('inner:conversation:asr:received', { questionId: uid, text });\n }\n\n /**\n * Handle a server command\n * @param command Command text\n * @author sansen\n */\n public handleServerCommand(code: number, command: string): void {\n this.ensureNotDisposed();\n this._context.eventBus.emit('inner:conversation:server:command', { code, command });\n }\n\n protected onDispose(): void {\n // Dispose all remaining sessions\n for (const s of this._sessions.values()) {\n try {\n s.dispose();\n } catch (e) {\n Logger.error('Error disposing session:', e);\n }\n }\n this._sessions.clear();\n this._assembler.dispose();\n // this._router.dispose();\n Logger.info('Conversation Manager disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { ConversationManager } from './ConversationManager';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { ConversationOptions } from '@/types/ConversationOptions.d';\nimport type { IConversationManager } from '@/transport/WSDispatcher';\nimport type { ConversationTransport } from '@/transport/ConversationTransport';\nimport { ClientTextMetadata } from '@/transport/protocol';\n\n/**\n * Conversation controller\n * Provides a unified interface for conversation features\n * @author sansen\n */\nexport class ConversationController extends Disposable {\n private readonly _manager: ConversationManager;\n\n /**\n * Create a ConversationController\n * @param context SDK context\n * @param options Conversation configuration options\n * @author sansen\n */\n constructor(context: SDKContext, options?: ConversationOptions) {\n super();\n this._manager = new ConversationManager(context, options);\n Logger.info('Conversation Controller created');\n }\n\n /**\n * Get the input router\n * @author sansen\n */\n // public get inputRouter() {\n // return this._manager.inputRouter;\n // }\n\n /**\n * Get the conversation manager (for integration with transport layer)\n * @author sansen\n */\n public get manager(): IConversationManager {\n return this._manager;\n }\n\n /**\n * Set the transport service (used for sending questions/messages)\n * @param transport Conversation transport service\n * @author sansen\n */\n public setTransport(transport: ConversationTransport): void {\n this._manager.setTransport(transport);\n }\n\n /**\n * Send a question/message\n * @param text The question text\n * @param metadata Optional client text metadata\n * - `speed`: speech speed (default 100)\n * - `mood`: emotion value (default 0)\n * - `vol`: volume (default 50)\n * @returns Message UID string\n * @author sansen\n */\n public async sendQuestion(text: string, metadata?: ClientTextMetadata): Promise<string> {\n this.ensureNotDisposed();\n return this._manager.sendQuestion(text, metadata);\n }\n\n protected onDispose(): void {\n this._manager.dispose();\n Logger.info('Conversation Controller disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { VIDEO_UNAVAILABLE_REASON } from '@/constants/defaults';\nimport { RemoteTrack } from 'livekit-client';\n\nexport interface VideoAvailability {\n available: boolean;\n reason?: VIDEO_UNAVAILABLE_REASON;\n}\n\n/**\n * Track Registry\n * Manages all subscribed media tracks with participant mapping\n *\n * @author sansen\n * @class TrackRegistry\n * @extends {Disposable}\n */\nexport class TrackRegistry extends Disposable {\n private _tracks: Map<string, RemoteTrack> = new Map();\n private _participants: Map<string, Set<string>> = new Map();\n\n /**\n * Registers a media track with participant association\n *\n * @param {string} trackId - Unique track identifier\n * @param {MediaStreamTrack} track - Media stream track to register\n * @param {string} participantId - Participant identifier who owns the track\n * @author sansen\n */\n public register(trackId: string, track: RemoteTrack, participantId: string): void {\n this.ensureNotDisposed();\n\n this._tracks.set(trackId, track);\n\n if (!this._participants.has(participantId)) {\n this._participants.set(participantId, new Set());\n }\n this._participants.get(participantId)!.add(trackId);\n track.on('ended', () => {\n Logger.debug(`Track ended: ${trackId}`);\n this.unregister(trackId);\n });\n Logger.debug(`Track registered: ${trackId} from participant ${participantId}`);\n }\n\n /**\n * Unregisters a media track and cleans up resources\n *\n * @param {string} trackId - Track identifier to unregister\n * @author sansen\n */\n public unregister(trackId: string): void {\n const track = this._tracks.get(trackId);\n if (track) {\n track.stop();\n this._tracks.delete(trackId);\n\n // Remove from participant mapping\n for (const [participantId, trackIds] of this._participants.entries()) {\n if (trackIds.has(trackId)) {\n trackIds.delete(trackId);\n if (trackIds.size === 0) {\n this._participants.delete(participantId);\n }\n break;\n }\n }\n\n Logger.debug(`Track unregistered: ${trackId}`);\n }\n }\n\n /**\n * Retrieves a registered media track by its ID\n *\n * @param {string} trackId - Track identifier to retrieve\n * @returns {MediaStreamTrack | null} Registered track or null if not found\n * @author sansen\n */\n public getTrack(trackId: string): RemoteTrack | null {\n return this._tracks.get(trackId) || null;\n }\n\n /**\n * Gets all track IDs associated with a participant\n *\n * @param {string} participantId - Participant identifier\n * @returns {string[]} Array of track IDs belonging to the participant\n * @author sansen\n */\n public getParticipantTracks(participantId: string): string[] {\n const trackIds = this._participants.get(participantId);\n return trackIds ? Array.from(trackIds) : [];\n }\n\n /**\n * Gets all registered track IDs\n *\n * @returns {string[]} Array of all registered track IDs\n * @author sansen\n */\n public getAllTrackIds(): string[] {\n return Array.from(this._tracks.keys());\n }\n\n /**\n * Checks if a video track is available\n *\n * @returns {VideoAvailability} Video availability status\n * @author sansen\n */\n public getVideoAvailability(): VideoAvailability {\n let hasVideoTrack = false;\n let hasLiveTrack = false;\n let hasEnabledTrack = false;\n\n for (const track of this._tracks.values()) {\n const mediaTrack = track.mediaStreamTrack;\n if (mediaTrack.kind !== 'video') continue;\n\n hasVideoTrack = true;\n\n if (mediaTrack.readyState === 'live') {\n hasLiveTrack = true;\n }\n\n if (mediaTrack.enabled) {\n hasEnabledTrack = true;\n }\n\n if (mediaTrack.readyState === 'live' && mediaTrack.enabled) {\n return { available: true };\n }\n }\n\n // -- unavailable reasons check --\n\n // 1. no video track available (never had video track)\n if (!hasVideoTrack) {\n return {\n available: false,\n reason: VIDEO_UNAVAILABLE_REASON.NO_VIDEO_TRACK,\n };\n }\n // 2. track not live (stop / network disconnected / unsubscribe)\n if (!hasLiveTrack) {\n return {\n available: false,\n reason: VIDEO_UNAVAILABLE_REASON.TRACK_ENDED,\n };\n }\n // 3. track not enabled (publisher turn off camera / SDK mute)\n if (!hasEnabledTrack) {\n return {\n available: false,\n reason: VIDEO_UNAVAILABLE_REASON.TRACK_MUTED,\n };\n }\n\n // theoretically should not reach here, fallback to no video track\n return {\n available: false,\n reason: VIDEO_UNAVAILABLE_REASON.NO_VIDEO_TRACK,\n };\n }\n\n /**\n * Clears all registered tracks and releases resources\n *\n * @author sansen\n */\n public clear(): void {\n for (const track of this._tracks.values()) {\n track.stop();\n }\n this._tracks.clear();\n this._participants.clear();\n Logger.info('All tracks cleared');\n }\n\n /**\n * Cleanup method called when the registry is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.clear();\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { TrackRegistry } from '@/rtc/TrackRegistry';\nimport type { ITrackHandler } from './ITrackHandler';\nimport { DEFAULT_LOOSE_TRACK_TIMEOUT } from '@/constants/defaults';\nimport { RemoteTrack, Room } from 'livekit-client';\nimport type { IVideoController } from '@/video/video.d';\n\n/**\n * Video Track Handler\n * Handles subscription and unsubscription events for video tracks\n *\n * @author sansen\n * @class VideoTrackHandler\n * @extends {Disposable}\n * @implements {ITrackHandler}\n */\nexport class VideoTrackHandler extends Disposable implements ITrackHandler {\n private readonly _context: SDKContext;\n private readonly _trackRegistry: TrackRegistry;\n private _videoController: IVideoController | null = null;\n private _loosTrackTimer: null | number;\n private _room: Room | null = null;\n /**\n * Creates a video track handler instance\n *\n * @param {SDKContext} context - SDK context for event emission\n * @param {TrackRegistry} trackRegistry - Track registry for managing track lifecycle\n * @author sansen\n */\n constructor(context: SDKContext, trackRegistry: TrackRegistry) {\n super();\n this._context = context;\n this._trackRegistry = trackRegistry;\n this._loosTrackTimer = null;\n Logger.info('Video Track Handler created');\n }\n\n /**\n * Sets the LiveKit room instance\n * @param room - LiveKit room instance\n * @author sansen\n */\n public setRoom(room: Room): void {\n this._room = room;\n }\n\n /**\n * Sets the video controller (for connecting tracks to video rendering)\n *\n * @param {IVideoController} controller - Video controller instance\n * @author sansen\n */\n public setVideoController(controller: IVideoController): void {\n this._videoController = controller;\n }\n\n /**\n * Handles track subscription events\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public handleTrackSubscribed(track: RemoteTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n if (this._loosTrackTimer) {\n clearTimeout(this._loosTrackTimer);\n }\n // Register track\n this._trackRegistry.register(trackId, track, participantId);\n\n // If video controller is set, directly set track to controller (for rendering)\n if (this._videoController) {\n // this._videoController.setTrack(track.mediaStreamTrack, trackId, participantId);\n track.attach(this._videoController.getSource().getInternalElement());\n }\n track.on('videoPlaybackStarted', () => {\n Logger.info('inner:rtc:video:available');\n this._context.eventBus.emit('inner:rtc:video:available', undefined);\n });\n this._context.eventBus.emit('inner:video:track:added', { trackId, participantId });\n Logger.debug(`Video track subscribed: ${trackId}`);\n }\n\n /**\n * Handles track unsubscription events\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public handleTrackUnsubscribed(track: RemoteTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n\n // If video controller is set, remove track from controller\n if (this._videoController) {\n // this._videoController.removeTrack(trackId);\n track.detach(this._videoController.getSource().getInternalElement());\n }\n track.removeAllListeners();\n this._context.eventBus.emit('inner:video:track:removed', { trackId, participantId });\n if (this._loosTrackTimer) {\n clearTimeout(this._loosTrackTimer);\n }\n this._loosTrackTimer = setTimeout(() => {\n this._context.eventBus.emit('inner:rtc:video:unavailable', undefined);\n }, DEFAULT_LOOSE_TRACK_TIMEOUT) as unknown as number;\n this._trackRegistry.unregister(trackId);\n Logger.debug(`Video track unsubscribed: ${trackId}`);\n }\n\n /**\n * Checks if this handler supports the given track type\n *\n * @param {MediaStreamTrack} track - Media stream track to check\n * @returns {boolean} True if handler supports video tracks\n * @author sansen\n */\n public supports(track: RemoteTrack): boolean {\n return track.mediaStreamTrack.kind === 'video';\n }\n\n /**\n * Cleanup method called when the handler is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n if (this._loosTrackTimer) {\n clearTimeout(this._loosTrackTimer);\n this._loosTrackTimer = null;\n }\n Logger.info('Video Track Handler disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { TrackRegistry } from '@/rtc/TrackRegistry';\nimport type { ITrackHandler } from './ITrackHandler';\nimport type { IAudioController } from '@/audio/audio.d';\nimport { RemoteTrack, Room } from 'livekit-client';\n\n/**\n * Audio Track Handler\n * Handles subscription and unsubscription events for audio tracks\n *\n * @author sansen\n * @class AudioTrackHandler\n * @extends {Disposable}\n * @implements {ITrackHandler}\n */\nexport class AudioTrackHandler extends Disposable implements ITrackHandler {\n private readonly _context: SDKContext;\n private readonly _trackRegistry: TrackRegistry;\n private _audioController: IAudioController | null = null;\n private _room: Room | null = null;\n\n /**\n * Creates an audio track handler instance\n *\n * @param {SDKContext} context - SDK context for event emission\n * @param {TrackRegistry} trackRegistry - Track registry for managing track lifecycle\n * @author sansen\n */\n constructor(context: SDKContext, trackRegistry: TrackRegistry) {\n super();\n this._context = context;\n this._trackRegistry = trackRegistry;\n Logger.info('Audio Track Handler created');\n }\n\n /**\n * Sets the LiveKit room instance\n * @param room - LiveKit room instance\n * @author sansen\n */\n public setRoom(room: Room): void {\n this._room = room;\n }\n\n /**\n * Sets the audio controller (for connecting tracks to audio output)\n *\n * @param {IAudioController} controller - Audio controller instance\n * @author sansen\n */\n public setAudioController(controller: IAudioController): void {\n this._audioController = controller;\n }\n\n /**\n * Handles track subscription events\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public handleTrackSubscribed(track: RemoteTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n\n // Register track\n this._trackRegistry.register(trackId, track, participantId);\n\n // If audio controller is set, directly set track to controller (for playback)\n if (this._audioController) {\n // this._audioController.setOutputTrack(track.mediaStreamTrack, trackId, participantId);\n track.attach(this._audioController.getOutputElement());\n } else {\n // If no controller, only emit event (fact event, no state decisions)\n this._context.eventBus.emit('inner:audio:track:added', { trackId, participantId });\n }\n Logger.debug(`Audio track subscribed: ${trackId}`);\n }\n\n /**\n * Handles track unsubscription events\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} _participantId - Participant identifier\n * @author sansen\n */\n public handleTrackUnsubscribed(track: RemoteTrack, trackId: string, _participantId: string): void {\n this.ensureNotDisposed();\n\n // If audio controller is set, remove track from controller\n if (this._audioController) {\n this._audioController.removeOutputTrack(trackId);\n track.detach(this._audioController.getOutputElement());\n } else {\n // If no controller, only emit event (fact event, no state decisions)\n this._context.eventBus.emit('inner:audio:track:removed', { trackId });\n }\n this._trackRegistry.unregister(trackId);\n Logger.debug(`Audio track unsubscribed: ${trackId}`);\n }\n\n /**\n * Checks if this handler supports the given track type\n *\n * @param {MediaStreamTrack} track - Media stream track to check\n * @returns {boolean} True if handler supports audio tracks\n * @author sansen\n */\n public supports(track: RemoteTrack): boolean {\n return track.mediaStreamTrack.kind === 'audio';\n }\n\n /**\n * Cleanup method called when the handler is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n Logger.info('Audio Track Handler disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { VideoTrackHandler } from './handlers/VideoTrackHandler';\nimport { AudioTrackHandler } from './handlers/AudioTrackHandler';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { TrackRegistry } from './TrackRegistry';\nimport type { ITrackHandler } from './handlers/ITrackHandler';\nimport { RemoteTrack, Room } from 'livekit-client';\nimport { IAudioController } from '@/audio/audio';\nimport { IVideoController } from '@/video/video';\n\n/**\n * LiveKit Event Adapter\n * Converts LiveKit events to SDK internal events\n * Uses strategy pattern to handle different types of media tracks\n *\n * @author sansen\n * @class LiveKitEventAdapter\n * @extends {Disposable}\n */\nexport class LiveKitEventAdapter extends Disposable {\n private readonly _context: SDKContext;\n private readonly _trackRegistry: TrackRegistry;\n private readonly _handlers: (AudioTrackHandler | VideoTrackHandler)[];\n private _room: Room | null = null;\n\n /**\n * Creates a LiveKit event adapter instance\n *\n * @param {SDKContext} context - SDK context for event propagation\n * @param {TrackRegistry} trackRegistry - Track registry for managing track lifecycle\n * @author sansen\n */\n constructor(context: SDKContext, trackRegistry: TrackRegistry) {\n super();\n this._context = context;\n this._trackRegistry = trackRegistry;\n // Initialize track handlers\n this._handlers = [new VideoTrackHandler(context, trackRegistry), new AudioTrackHandler(context, trackRegistry)];\n\n Logger.info('LiveKit Event Adapter created');\n }\n\n /**\n * Sets the LiveKit room instance\n * @param room - LiveKit room instance\n * @author sansen\n */\n public setRoom(room: Room): void {\n this._room = room;\n this._handlers.forEach((handler) => {\n handler.setRoom(room);\n });\n console.log('LiveKit room set:', this._room);\n }\n\n /**\n * Sets the video controller (for connecting tracks to video rendering)\n *\n * @param {IVideoController} controller - Video controller instance\n * @author sansen\n */\n public setVideoController(controller: IVideoController): void {\n const videoHandler = this._handlers.find((h) => h instanceof VideoTrackHandler) as VideoTrackHandler | undefined;\n if (videoHandler) {\n videoHandler.setVideoController(controller);\n }\n }\n\n /**\n * Sets the audio controller (for connecting tracks to audio playback)\n *\n * @param {IAudioController} controller - Audio controller instance\n * @author sansen\n */\n public setAudioController(controller: IAudioController): void {\n const audioHandler = this._handlers.find((h) => h instanceof AudioTrackHandler) as AudioTrackHandler | undefined;\n if (audioHandler) {\n audioHandler.setAudioController(controller);\n }\n }\n\n /**\n * Handles track subscription events from LiveKit\n *\n * @param {MediaStreamTrack} track - Media stream track\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public handleTrackSubscribed(track: RemoteTrack, trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n\n const handler = this._findHandler(track);\n if (handler) {\n handler.handleTrackSubscribed(track, trackId, participantId);\n } else {\n // Use strategy pattern for lookup, don't directly use track.kind\n Logger.warn(`No handler found for track, trackId: ${trackId}`);\n }\n }\n\n /**\n * Handles track unsubscription events from LiveKit\n *\n * @param {string} trackId - Track identifier\n * @param {string} participantId - Participant identifier\n * @author sansen\n */\n public handleTrackUnsubscribed(trackId: string, participantId: string): void {\n this.ensureNotDisposed();\n\n const track = this._trackRegistry.getTrack(trackId);\n if (track) {\n const handler = this._findHandler(track);\n if (handler) {\n handler.handleTrackUnsubscribed(track, trackId, participantId);\n } else {\n // If no handler found, at least unregister the track\n this._trackRegistry.unregister(trackId);\n Logger.warn(`No handler found for track, trackId: ${trackId}`);\n }\n }\n }\n\n /**\n * Finds a handler that supports the specified track type\n *\n * @param {MediaStreamTrack} track - Media stream track to find handler for\n * @returns {ITrackHandler|null} Matching handler or null if not found\n * @author sansen\n */\n private _findHandler(track: RemoteTrack): ITrackHandler | null {\n return this._handlers.find((handler) => handler.supports(track)) || null;\n }\n\n /**\n * Cleanup method called when the adapter is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n // Clean up all handlers\n this._handlers.forEach((handler) => {\n try {\n handler.dispose();\n } catch (error) {\n Logger.error('Error disposing track handler:', error);\n }\n });\n this._handlers.length = 0;\n Logger.info('LiveKit Event Adapter disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { SDKError } from '@/utils/SDKError';\nimport { Logger } from '@/utils/Logger';\nimport { TrackRegistry } from './TrackRegistry';\nimport { LiveKitEventAdapter } from './LiveKitEventAdapter';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { ILiveKitAdapter } from './ILiveKitAdapter';\nimport { DEFAULT_RECONNECT_ATTEMPTS, DEFAULT_RECONNECT_DELAY, MILLISECONDS_PER_SECOND } from '@/constants/defaults';\nimport { ErrorCode } from '@/constants/errorCode';\nimport {\n ConnectionState,\n DisconnectReason,\n Participant,\n ParticipantEvent,\n ReconnectContext,\n RemoteParticipant,\n RemoteTrack,\n RemoteTrackPublication,\n Room,\n RoomEvent,\n TrackPublication,\n} from 'livekit-client';\n\n/**\n * LiveKit Room Handle (internal type, does not expose LiveKit types)\n * Encapsulates LiveKit Room instance to hide implementation details\n *\n * @author sansen\n * @interface LiveKitRoomHandle\n */\ninterface LiveKitRoomHandle {\n /**\n * Disconnects from the LiveKit room\n *\n * @returns {Promise<void>} Promise that resolves when disconnected\n */\n disconnect(): Promise<void>;\n /**\n * Checks if currently connected to a room\n *\n * @returns {boolean} True if connected\n */\n isConnected(): boolean;\n /**\n * Registers an event listener\n *\n * @param {string} event - Event name\n * @param {(...args: unknown[]) => void} callback - Event callback\n */\n on(event: string, callback: (...args: unknown[]) => void): void;\n /**\n * Removes an event listener\n *\n * @param {string} event - Event name\n * @param {(...args: unknown[]) => void} callback - Event callback\n */\n off(event: string, callback: (...args: unknown[]) => void): void;\n}\n\n/**\n * LiveKit Service\n * Encapsulates LiveKit client for receiving downstream media only\n * Implements ILiveKitAdapter interface to hide LiveKit-specific implementation details\n *\n * @author sansen\n * @class LiveKitService\n * @extends {Disposable}\n * @implements {ILiveKitAdapter}\n */\nexport class LiveKitService extends Disposable implements ILiveKitAdapter {\n private readonly _context: SDKContext;\n private readonly _trackRegistry: TrackRegistry;\n private readonly _eventAdapter: LiveKitEventAdapter;\n private _room: LiveKitRoomHandle | null = null;\n private readonly _maxAttempts: number;\n private readonly _maxDelay: number;\n\n /**\n * Creates a LiveKit service instance\n *\n * @param {SDKContext} context - SDK context for event propagation and error handling\n * @author sansen\n */\n constructor(context: SDKContext) {\n super();\n this._context = context;\n this._trackRegistry = new TrackRegistry();\n this._eventAdapter = new LiveKitEventAdapter(context, this._trackRegistry);\n this._maxAttempts = context.options.reconnect?.maxAttempts || DEFAULT_RECONNECT_ATTEMPTS;\n this._maxDelay = (context.options.reconnect?.delay ?? DEFAULT_RECONNECT_DELAY) * MILLISECONDS_PER_SECOND;\n Logger.info('LiveKit Service created');\n }\n\n /**\n * Connects to a LiveKit room\n *\n * @param {string} url - LiveKit server URL\n * @param {string} token - Access token for authentication\n * @param {string} roomName - Name of the room to join\n * @param {string} [participantName] - Optional participant display name\n * @returns {Promise<void>} Promise that resolves when connection is established\n * @throws {SDKError} If connection fails\n * @author sansen\n */\n public async connect(url: string, token: string, roomName: string, _participantName?: string): Promise<void> {\n this.ensureNotDisposed();\n\n if (this._room && this._room.isConnected()) {\n Logger.warn('Already connected to LiveKit room');\n return;\n }\n\n try {\n // Dynamic import of livekit-client to prevent type leakage to other modules\n // const { Room, RoomEvent, ConnectionState } = await import('livekit-client');\n\n Logger.info(`Connecting to LiveKit room: ${roomName} at ${url}`);\n\n const room = new Room({\n reconnectPolicy: {\n nextRetryDelayInMs: (context: ReconnectContext) => {\n if (context.elapsedMs < this._maxDelay) {\n return Math.min(MILLISECONDS_PER_SECOND * Math.pow(2, context.retryCount), this._maxDelay);\n } else {\n return null;\n }\n },\n },\n });\n\n room.prepareConnection(url, token);\n // Set up event listeners to convert LiveKit events to SDK internal events\n room.on(RoomEvent.TrackSubscribed, (track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n this._handleTrackSubscribed(track, publication, participant);\n });\n\n room.on(RoomEvent.TrackUnsubscribed, (track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n this._handleTrackUnsubscribed(track, publication, participant);\n });\n\n room.on(RoomEvent.TrackMuted, (publication: TrackPublication, participant: Participant) => {\n this._handleTrackMuted(publication, participant);\n });\n\n room.on(RoomEvent.TrackUnmuted, (publication: TrackPublication, participant: Participant) => {\n this._handleTrackUnmuted(publication, participant);\n });\n\n room.on(RoomEvent.Connected, () => {\n Logger.info('Connected to LiveKit room');\n this._context.eventBus.emit('inner:rtc:connected', undefined);\n });\n\n room.on(RoomEvent.Disconnected, (reason?: DisconnectReason) => {\n if (reason) {\n Logger.info(`LiveKit room disconnected: ${reason}`);\n } else {\n Logger.info('LiveKit room disconnected');\n }\n if (reason !== DisconnectReason.CLIENT_INITIATED) {\n this._context.eventBus.emit('inner:rtc:disconnected', { reason: reason ? String(reason) : undefined });\n }\n this._room = null;\n });\n\n Logger.info('Connecting to LiveKit room...');\n // Connect to room (subscribe only, do not publish)\n await room.connect(url, token, {\n autoSubscribe: true,\n maxRetries: this._context.options.reconnect?.maxAttempts || DEFAULT_RECONNECT_ATTEMPTS,\n });\n this._eventAdapter.setRoom(room);\n this._room = room as unknown as LiveKitRoomHandle;\n } catch (error) {\n throw SDKError.fromError(error, ErrorCode.LIVEKIT_CONNECT_FAILED);\n }\n }\n\n /**\n * Handles track subscription events (internal method, encapsulates LiveKit types)\n *\n * @param {unknown} track - LiveKit track object\n * @param {unknown} publication - LiveKit publication object\n * @param {unknown} participant - LiveKit participant object\n * @author sansen\n */\n private _handleTrackSubscribed(track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant): void {\n try {\n // Use type assertions to access LiveKit internal properties (only in Adapter layer)\n // Get MediaStreamTrack (LiveKit Track may wrap MediaStreamTrack)\n const mediaTrack = track.mediaStreamTrack;\n if (!mediaTrack) {\n Logger.warn('Track does not have MediaStreamTrack');\n return;\n }\n if (track.kind === 'audio') {\n (participant as Participant).on(ParticipantEvent.IsSpeakingChanged, (isSpeaking: boolean) => {\n console.log(`轨道 说话状态:`, isSpeaking);\n });\n }\n\n const trackId = publication.trackSid;\n const participantId = participant.identity;\n\n // Process through event adapter (using strategy pattern)\n this._eventAdapter.handleTrackSubscribed(track, trackId, participantId);\n\n // Internal fact event for connection snapshot: video availability (no Room/Track dependency at consumer)\n } catch (error) {\n Logger.error('Error handling track subscribed:', error);\n }\n }\n\n /**\n * Handles track unsubscription events (internal method, encapsulates LiveKit types)\n *\n * @param {unknown} _track - LiveKit track object\n * @param {unknown} publication - LiveKit publication object\n * @param {unknown} participant - LiveKit participant object\n * @author sansen\n */\n private _handleTrackUnsubscribed(_track: unknown, publication: unknown, participant: unknown): void {\n try {\n const lkPublication = publication as { trackSid: string };\n const lkParticipant = participant as { identity: string };\n\n const trackId = lkPublication.trackSid;\n const participantId = lkParticipant.identity;\n\n // Emit video unavailable before unregister so snapshot can be derived from facts\n const existingTrack = this._trackRegistry.getTrack(trackId);\n if (existingTrack?.kind === 'video') {\n this._context.eventBus.emit('inner:rtc:video:unavailable', undefined);\n }\n\n // Process through event adapter (using strategy pattern)\n this._eventAdapter.handleTrackUnsubscribed(trackId, participantId);\n } catch (error) {\n Logger.error('Error handling track unsubscribed:', error);\n }\n }\n\n private _handleTrackMuted(publication: TrackPublication, _participant: Participant): void {\n try {\n const lkPublication = publication as { trackSid: string; kind: string };\n if (lkPublication.kind === 'video') {\n this._context.eventBus.emit('inner:rtc:video:unavailable', undefined);\n }\n } catch (error) {\n Logger.error('Error handling track muted:', error);\n }\n }\n\n private _handleTrackUnmuted(publication: TrackPublication, _participant: Participant): void {\n try {\n const lkPublication = publication as { trackSid: string; kind: string };\n if (lkPublication.kind === 'video') {\n this._context.eventBus.emit('inner:rtc:video:available', undefined);\n }\n } catch (error) {\n Logger.error('Error handling track unmuted:', error);\n }\n }\n /**\n * Disconnects from the LiveKit room\n *\n * @returns {Promise<void>} Promise that resolves when disconnected\n * @author sansen\n */\n public async disconnect(): Promise<void> {\n if (this._room) {\n try {\n await this._room.disconnect();\n this._room = null;\n this._context.eventBus.emit('inner:rtc:disconnected', { reason: 'Disconnected from LiveKit room' });\n Logger.info('Disconnected from LiveKit room');\n } catch (error) {\n Logger.error('Error disconnecting from LiveKit room:', error);\n this._room = null;\n }\n }\n }\n\n /**\n * Checks if currently connected to a LiveKit room\n *\n * @returns {boolean} True if connected, false otherwise\n * @author sansen\n */\n public isConnected(): boolean {\n if (this._room) {\n return (this._room as any).state === ConnectionState.Connected;\n } else {\n return false;\n }\n }\n\n /**\n * Gets the track registry for managing media tracks\n *\n * @returns {TrackRegistry} Track registry instance\n * @author sansen\n */\n public getTrackRegistry(): TrackRegistry {\n return this._trackRegistry;\n }\n\n /**\n * Gets the track registry (maintained for backward compatibility)\n *\n * @deprecated Use getTrackRegistry() instead\n * @returns {TrackRegistry} Track registry instance\n * @author sansen\n */\n public get trackRegistry(): TrackRegistry {\n return this._trackRegistry;\n }\n\n /**\n * Gets the event adapter (for connecting VideoController)\n *\n * @internal\n * @returns {LiveKitEventAdapter} Event adapter instance\n * @author sansen\n */\n public getEventAdapter(): LiveKitEventAdapter {\n return this._eventAdapter;\n }\n\n /**\n * Cleanup method called when the service is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.disconnect();\n this._trackRegistry.dispose();\n this._eventAdapter.dispose();\n Logger.info('LiveKit Service disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { WSMessage, WSServerMessage, ServerTextMessage } from './protocol.d';\n\n/**\n * Conversation Manager Interface (for dependency injection to avoid circular dependencies)\n * Defines interface for handling streaming answers and server messages\n *\n * @author sansen\n * @interface IConversationManager\n */\nexport interface IConversationManager {\n /**\n * Handles server pong response for heartbeat mechanism\n *\n * @author sansen\n */\n handleServerPong(): void;\n\n /**\n * Handles server will-disconnect notification\n *\n * @author sansen\n */\n willDisconnect(): void;\n\n /**\n * Handles answer chunks from streaming response\n *\n * @param {string} uid - Message unique identifier\n * @param {string} chunk - Answer text chunk\n * @param {boolean} isComplete - Indicates if this is the final chunk\n * @author sansen\n */\n handleAnswerChunk(uid: string, chunk: string, isComplete: boolean): void;\n\n /**\n * Handles server-initiated messages (questions or prompts)\n *\n * @param {string} uid - Message unique identifier\n * @param {string} message - Server-initiated message content\n * @author sansen\n */\n handleServerInitiatedMessage(uid: string, message: string): void;\n\n /**\n * Handles ASR (Automatic Speech Recognition) text received from server\n *\n * @param {string} uid - Question identifier\n * @param {string} text - Recognized speech text\n * @author sansen\n */\n handleAsrTextReceived(uid: string, text: string): void;\n\n /**\n * Handles server commands\n * @param command Command text\n * @author sansen\n */\n handleServerCommand(code: number, command: string): void;\n}\n\n/**\n * WebSocket Message Dispatcher\n * Routes received messages to appropriate handlers based on message type and code\n *\n * @author sansen\n * @class WSDispatcher\n * @extends {Disposable}\n */\nexport class WSDispatcher extends Disposable {\n private readonly _context: SDKContext;\n private _conversationManager: IConversationManager | null = null;\n\n /**\n * Creates a WebSocket message dispatcher instance\n *\n * @param {SDKContext} context - SDK context for event propagation\n * @author sansen\n */\n constructor(context: SDKContext) {\n super();\n this._context = context;\n Logger.info('WebSocket Dispatcher created');\n }\n\n /**\n * Sets the conversation manager for handling streaming answers\n *\n * @param {IConversationManager} manager - Conversation manager instance\n * @author sansen\n */\n public setConversationManager(manager: IConversationManager): void {\n this._conversationManager = manager;\n Logger.debug('Conversation manager set in dispatcher');\n }\n\n /**\n * Dispatches incoming WebSocket messages to appropriate handlers\n *\n * @param {WSMessage | WSServerMessage | ServerTextMessage} message - Message object to dispatch\n * @author sansen\n */\n public dispatch(message: WSMessage | WSServerMessage | ServerTextMessage): void {\n this.ensureNotDisposed();\n\n try {\n // Handle new protocol format\n if (message.type === 'ws') {\n this._handleWSServerMessage(message as WSServerMessage);\n return;\n }\n\n if (message.type === 'text') {\n this._handleServerTextMessage(message as ServerTextMessage);\n return;\n }\n } catch (error) {\n Logger.error('Error dispatching message:', error);\n }\n }\n\n /**\n * Handles WebSocket control messages from server\n *\n * @param {WSServerMessage} message - WebSocket server control message\n * @author sansen\n */\n private _handleWSServerMessage(message: WSServerMessage): void {\n if (message.code === 101) {\n // Ping-pong response\n this._conversationManager?.handleServerPong();\n Logger.debug('Received pingpong response');\n } else if (message.code === 102) {\n // Will-disconnect notification\n Logger.warn('Server will disconnect');\n this._conversationManager?.willDisconnect();\n }\n }\n\n /**\n * Handles text messages from server\n *\n * @param {ServerTextMessage} message - Server text message\n * @author sansen\n */\n private _handleServerTextMessage(message: ServerTextMessage): void {\n if (!this._conversationManager) {\n Logger.warn('Conversation manager not set, text message ignored');\n return;\n }\n\n const { uid, payload, code } = message;\n\n if (code === 200) {\n // Virtual agent normal answer\n // Payload is segmented or complete text, treated as incomplete chunk\n this._conversationManager.handleAnswerChunk(uid, payload, false);\n Logger.debug(`Answer received (code 200) for uid: ${uid}`);\n } else if (code === 201) {\n // Server indicates completion of current uid related questions\n // Can be used to concatenate segmented text\n this._conversationManager.handleAnswerChunk(uid, '', true);\n Logger.debug(`Answer completed (code 201) for uid: ${uid}`);\n } else if (code === 300) {\n // ASR audio-to-text conversion, to be displayed on client side\n this._conversationManager.handleAsrTextReceived(uid, payload);\n Logger.debug(`ASR text chunk received (code 300) for uid: ${uid}`);\n } else if (code === 400) {\n // Server-initiated questions or prompts\n this._conversationManager.handleServerInitiatedMessage(uid, payload);\n Logger.debug(`Server initiated message received (code 300) for uid: ${uid}`);\n } else if (code === 500) {\n this._conversationManager.handleServerCommand(code, payload);\n Logger.debug(`Server command received (code 500) for uid: ${uid}`);\n }\n }\n\n /**\n * Cleanup method called when the dispatcher is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n Logger.info('WebSocket Dispatcher disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { SDKError } from '@/utils/SDKError';\nimport { Logger } from '@/utils/Logger';\nimport { WSDispatcher, type IConversationManager } from './WSDispatcher';\nimport type { SDKContext } from '@/client/SDKContext';\nimport type { ClientTextMessage, ClientTextMetadata, PingMessage, WillDisconnectMessage } from './protocol.d';\nimport {\n DEFAULT_RECONNECT_ATTEMPTS,\n DEFAULT_RECONNECT_DELAY,\n DEFAULT_WS_PING_INTERVAL,\n DEFAULT_WS_PONG_TIMEOUT,\n MILLISECONDS_PER_SECOND,\n} from '@/constants/defaults';\nimport { ErrorCode } from '@/constants/errorCode';\n\n/**\n * Conversation Transport Service\n * Minimal implementation: supports text input and streaming responses only\n *\n * @author sansen\n * @class ConversationTransport\n * @extends {Disposable}\n */\nexport class ConversationTransport extends Disposable {\n private readonly _context: SDKContext;\n private _ws: WebSocket | null = null;\n private _dispatcher: WSDispatcher | null = null;\n private _isConnecting: boolean = false;\n\n private _activeTimers: Set<number> = new Set();\n private _retryCount: number = 0;\n private _maxRetries: number = DEFAULT_RECONNECT_ATTEMPTS; // Configurable via constructor\n private _pingTimer: number | undefined = undefined;\n private _pongTimer: number | undefined = undefined;\n private _isExplicitDisconnect: boolean = false; // Differentiate between explicit and abnormal disconnection\n private _maxDelay: number;\n\n /**\n * Creates a conversation transport service instance\n *\n * @param {SDKContext} context - SDK context for state management and error handling\n * @param {string} url - WebSocket server URL\n * @author sansen\n */\n constructor(context: SDKContext) {\n super();\n this._context = context;\n this._maxRetries = context.options.reconnect?.maxAttempts ?? DEFAULT_RECONNECT_ATTEMPTS;\n this._maxDelay = (context.options.reconnect?.delay ?? DEFAULT_RECONNECT_DELAY) * MILLISECONDS_PER_SECOND;\n this._dispatcher = new WSDispatcher(context);\n }\n\n /**\n * Sets the conversation manager (for handling streaming answers)\n *\n * @param {IConversationManager} manager - Conversation manager instance\n * @author sansen\n */\n public setConversationManager(manager: IConversationManager): void {\n if (this._dispatcher) {\n this._dispatcher.setConversationManager(manager);\n }\n }\n\n /**\n * Connects to WebSocket server\n *\n * @returns {Promise<void>} Promise that resolves when connection is established\n * @author sansen\n */\n public async connect(): Promise<void> {\n this.ensureNotDisposed();\n this._stopHeartbeat();\n if (this._isConnecting || this.isConnected || this._ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n this._isConnecting = true;\n this._isExplicitDisconnect = false; // Reset explicit disconnect flag when starting connection\n\n try {\n this._ws = new WebSocket(this._context.wsUrl);\n\n return new Promise<void>((resolve, reject) => {\n this._ws!.onopen = () => {\n this._isConnecting = false;\n this._retryCount = 0; // Reset retry count on successful connection\n\n // 1. Send first ping immediately after connection establishment\n this.sendPing();\n\n // Internal fact event only; coordinator updates sessionState and emits connected\n this._context.eventBus.emit('inner:ws:connected', undefined);\n Logger.info('Conversation transport connected');\n resolve();\n };\n\n this._ws!.onerror = (error) => {\n this._isConnecting = false;\n Logger.error('Conversation transport error:', error);\n this._context.eventBus.emit('inner:sdk:error', {\n error: new SDKError('WebSocket connection error', ErrorCode.WS_CONNECT_ERROR, error),\n });\n reject(new SDKError('WebSocket connection error', ErrorCode.WS_CONNECT_ERROR, error));\n };\n\n this._ws!.onclose = (e: CloseEvent) => {\n const code = e.code;\n const reason = e.reason ? e.reason : e.wasClean ? 'Clean close' : 'Closed by remote';\n this._handleDisconnect(code, reason);\n };\n\n this._ws!.onmessage = (event) => {\n this._handleMessage(event.data);\n };\n });\n } catch (error) {\n this._isConnecting = false;\n throw this._context.emitError(error, ErrorCode.WS_CONNECT_FAILED);\n }\n }\n\n /**\n * Disconnects from WebSocket server\n *\n * @author sansen\n */\n public disconnect(): void {\n this._isExplicitDisconnect = true; // 5. Mark as explicit disconnect to prevent reconnection\n this._stopHeartbeat();\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n\n // Internal fact event only; coordinator updates sessionState and emits disconnected\n this._context.eventBus.emit('inner:ws:disconnected', { reason: 'Client disconnect' });\n Logger.info('Conversation transport disconnected');\n }\n\n // Optimized reconnection logic\n private _handleDisconnect(code?: number, reason?: string): void {\n this._stopHeartbeat();\n this._isConnecting = false;\n\n // Expanded list of codes that should NOT trigger reconnection in production.\n // 1000: Normal Closure\n // 1001: Going Away\n // 1002: Protocol error\n // 1003: Unsupported Data\n // 1007: Invalid payload data\n // 1008: Policy Violation\n const nonRetryCodes = new Set([1000, 1001, 1002, 1003, 1007, 1008]);\n\n if (code !== undefined && nonRetryCodes.has(code)) {\n // Treat as final/explicit-like disconnect: do not attempt reconnects.\n this._isExplicitDisconnect = true;\n const detailed = `WebSocket closed (code ${code}): ${reason ?? ''}`;\n this._context.eventBus.emit('inner:ws:disconnected', { reason: detailed });\n Logger.info(`Conversation transport closed with non-retry code ${code}: ${reason ?? ''}`);\n return;\n }\n\n if (!this._isExplicitDisconnect && this._retryCount < this._maxRetries) {\n this._retryCount++;\n\n // Exponential backoff: 1s, 2s, 4s, 8s, max this._maxDelay\n const delay = Math.min(MILLISECONDS_PER_SECOND * Math.pow(2, this._retryCount - 1), this._maxDelay);\n\n Logger.warn(`Connection lost. Retry ${this._retryCount} in ${delay}ms`);\n\n const timer = setTimeout(() => {\n if (!this._isExplicitDisconnect && !this.isDisposed) {\n this.connect().catch(() => {\n //\n });\n }\n }, delay);\n\n // Record this timer for cleanup during disposal\n this._registerTimer(timer);\n } else {\n this._context.eventBus.emit('inner:ws:disconnected', { reason: 'Closed' });\n }\n }\n\n /**\n * Registers a timer for unified management and cleanup\n *\n * @param {any} timerId - Timer identifier\n * @returns {any} Timer identifier\n * @author sansen\n */\n private _registerTimer(timerId: any): any {\n this._activeTimers.add(timerId);\n return timerId;\n }\n\n /**\n * Cleans up a specific timer\n *\n * @param {any} timerId - Timer identifier to clear\n * @author sansen\n */\n private _clearTimer(timerId: any): void {\n if (timerId) {\n clearTimeout(timerId);\n this._activeTimers.delete(timerId);\n }\n }\n\n /**\n * Sends ping message and checks for response within 30 seconds\n *\n * @author sansen\n */\n public sendPing(): void {\n if (!this.isConnected) return;\n\n const message: PingMessage = { type: 'ws', code: 101, payload: 'ping' };\n this._ws?.send(JSON.stringify(message));\n\n // 3. Start 30-second timeout check\n clearTimeout(this._pongTimer);\n this._pongTimer = setTimeout(() => {\n Logger.error(`Pong timeout (${DEFAULT_WS_PONG_TIMEOUT / MILLISECONDS_PER_SECOND}s). Reconnecting...`);\n this._ws?.close(); // Trigger onclose logic\n }, DEFAULT_WS_PONG_TIMEOUT) as unknown as number;\n }\n\n /**\n * Handles received pong response (called by WSDispatcher)\n *\n * @author sansen\n */\n public handlePongReceived(): void {\n clearTimeout(this._pongTimer); // Clear timeout logic\n\n // 4. Send next ping 3 seconds after receiving pong\n this._clearTimer(this._pingTimer);\n this._pingTimer = setTimeout(() => {\n this.sendPing();\n }, DEFAULT_WS_PING_INTERVAL) as unknown as number;\n }\n\n /**\n * Sends will-disconnect notification before closing connection\n *\n * @author sansen\n */\n public willDisconnect(): void {\n this.ensureNotDisposed();\n if (this._ws && this._ws.readyState === WebSocket.OPEN) {\n const message: WillDisconnectMessage = {\n type: 'ws',\n code: 102,\n payload: 'will disconnect',\n };\n const data = JSON.stringify(message);\n this._ws.send(data);\n this._isExplicitDisconnect = true;\n this._ws.close();\n this._ws = null;\n this._context.eventBus.emit('inner:ws:disconnected', { reason: \"Client responsive to server's disconnect message.\" });\n }\n }\n\n /**\n * Sends text message to server\n *\n * @param {string} uid - Message unique identifier\n * @param {string} payload - Message content/text\n * @param {number} [code=200] - Question-answer type code (default 200)\n * @param {ClientTextMetadata} metadata - Text message metadata\n * @throws {SDKError} If WebSocket is not connected\n * @author sansen\n */\n public sendText(uid: string, payload: string, code: number = 200, metadata: ClientTextMetadata): void {\n this.ensureNotDisposed();\n\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n throw new SDKError('WebSocket is not connected', ErrorCode.WS_NOT_CONNECTED);\n }\n\n try {\n const message: ClientTextMessage = {\n type: 'text',\n code,\n uid,\n metadata,\n payload,\n };\n\n const data = JSON.stringify(message);\n this._ws.send(data);\n Logger.debug('Text message sent via transport:', uid);\n } catch (error) {\n throw this._context.emitError(error, ErrorCode.WS_TEXT_SEND_FAILED);\n }\n }\n\n /**\n * Handles received WebSocket messages\n *\n * @param {string} data - Received message data\n * @author sansen\n */\n private _handleMessage(data: string): void {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const message = JSON.parse(data);\n Logger.debug('Message received:', message.type);\n\n // Route to dispatcher\n if (this._dispatcher) {\n this._dispatcher.dispatch(message);\n } else {\n Logger.warn('Dispatcher not set, message ignored');\n }\n } catch (error) {\n Logger.error('Error parsing message:', error);\n this._context.emitError(error, ErrorCode.WS_PARSE_ERROR);\n }\n }\n\n /**\n * Sends binary data (for audio frames)\n * Uses fire-and-forget pattern: does not throw errors, only logs failures\n *\n * @param {ArrayBuffer | Uint8Array} data - Binary data to send\n * @author sansen\n */\n public sendBinary(data: ArrayBuffer | Uint8Array): void {\n this.ensureNotDisposed();\n\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n // Fire-and-forget: don't throw error, silently drop data\n Logger.debug('WebSocket not connected, binary data dropped');\n return;\n }\n\n try {\n // Send binary data (non-blocking)\n this._ws.send(data);\n Logger.debug('Binary data sent via transport');\n } catch (error) {\n // Fire-and-forget: don't throw error, only log\n Logger.error('Error sending binary data:', error);\n }\n }\n\n /**\n * Checks if WebSocket is currently connected\n *\n * @type {boolean}\n * @author sansen\n */\n public get isConnected(): boolean {\n return this._ws?.readyState === WebSocket.OPEN;\n }\n\n private _stopHeartbeat(): void {\n this._clearTimer(this._pingTimer);\n this._clearTimer(this._pongTimer);\n }\n\n /**\n * Cleanup method called when the transport is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this._stopHeartbeat();\n this.disconnect();\n if (this._dispatcher) {\n this._dispatcher.dispose();\n this._dispatcher = null;\n }\n Logger.info('Conversation transport disposed');\n }\n}\n","import type { PublicSDKEvents } from './events.d';\nimport type { EventBus } from './EventBus';\n\n// Public API exposed to consumers\nexport interface PublicEmitterAPI {\n on<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): () => void;\n off<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): void;\n once<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): () => void;\n}\n\n/**\n * Generic event listener function type\n *\n * @author sansen\n */\ntype Listener = (data: unknown) => void;\n\n/**\n * Whitelist of allowed events for public consumers (determined by audit report)\n *\n * @constant {Array<keyof PublicSDKEvents>}\n * @author sansen\n */\nexport const ALLOWED_EVENTS: (keyof PublicSDKEvents)[] = [\n 'sdk:connected',\n 'sdk:disconnected',\n 'sdk:error',\n\n // media\n 'media:video:available',\n 'media:video:unavailable',\n 'media:video:trackAdded',\n 'media:video:trackRemoved',\n\n 'media:audio:trackAdded',\n 'media:audio:trackRemoved',\n\n 'media:audio:captureStarted',\n 'media:audio:captureStopped',\n\n 'media:camera:started',\n 'media:camera:stopped',\n\n 'media:audio:volumeChanged',\n 'media:audio:muted',\n 'media:audio:unmuted',\n // conversation\n 'conversation:question:sent',\n 'conversation:answer:waiting',\n 'conversation:server:message',\n 'conversation:asr:received',\n 'conversation:answer:chunk',\n 'conversation:answer:completed',\n];\n\n/**\n * Regular expression for validating event name format\n * Allows 2 or 3 segments (namespace:domain[:action])\n *\n * @constant {RegExp}\n * @author sansen\n */\nconst NAME_RE = /^[a-z]+:[a-zA-z]+(:[a-zA-Z]+)?$/;\n\n/**\n * Public Event Emitter\n * - Does not depend on Node.js, lightweight implementation\n * - Only exposes on/off/once methods to public consumers\n * - Automatically listens to internal `EventBus` and forwards allowed internal events\n * after mapping and sanitization to external subscribers\n *\n * @author sansen\n * @class PublicEventEmitter\n */\nexport class PublicEventEmitter {\n private listeners: Map<string, Set<Listener>> = new Map();\n private forwardedVideoTrackIds: Set<string> = new Set(); // For deduplication\n private wsConnected: boolean = false;\n private livekitConnected: boolean = false;\n private httpConnected: boolean = false;\n private lastConnectedPayloadJson?: string;\n\n // Internal to public event mapping and sanitizer\n private readonly internalMap: Record<string, { public: string; sanitizer?: (d: any) => any }> = {\n // connection\n // connected: { public: 'sdk:connected', sanitizer: (d: any) => ({ livekit: d?.livekit, ws: d?.ws, all: d?.all }) },\n // disconnected: { public: 'sdk:disconnected', sanitizer: (d: any) => ({ reason: d?.reason }) },\n 'inner:sdk:error': { public: 'sdk:error', sanitizer: (d: any) => ({ message: d?.error?.message, code: d?.error?.code }) },\n\n // media\n 'inner:rtc:video:available': { public: 'media:video:available' },\n 'inner:rtc:video:unavailable': { public: 'media:video:unavailable' },\n 'inner:video:track:added': { public: 'media:video:trackAdded' },\n 'inner:video:track:removed': { public: 'media:video:trackRemoved' },\n 'inner:audio:track:added': { public: 'media:audio:trackAdded' },\n 'inner:audio:track:removed': { public: 'media:audio:trackRemoved' },\n\n 'inner:audio:input:started': { public: 'media:audio:captureStarted' },\n 'inner:audio:input:stopped': { public: 'media:audio:captureStopped' },\n\n 'inner:camera:started': { public: 'media:camera:started' },\n 'inner:camera:stopped': { public: 'media:camera:stopped' },\n\n 'inner:audio:volume:changed': { public: 'media:audio:volumeChanged', sanitizer: (_d: any) => ({ volume: _d?.volume }) },\n 'inner:audio:muted': { public: 'media:audio:muted' },\n 'inner:audio:unmuted': { public: 'media:audio:unmuted' },\n\n // conversation\n 'inner:conversation:question:sent': {\n public: 'conversation:question:sent',\n sanitizer: (d: any) => ({ questionId: d?.questionId, text: String(d?.text || '') }),\n },\n 'inner:conversation:answer:waiting': { public: 'conversation:answer:waiting', sanitizer: (d: any) => ({ questionId: d?.questionId }) },\n 'inner:conversation:server:message': {\n public: 'conversation:server:message',\n sanitizer: (d: any) => ({ questionId: d?.questionId, message: String(d?.message || ''), type: String(d?.type || '') }),\n },\n 'inner:conversation:asr:received': {\n public: 'conversation:asr:received',\n sanitizer: (d: any) => ({ questionId: d?.questionId, text: String(d?.text || '') }),\n },\n 'inner:conversation:answer:chunk': {\n public: 'conversation:answer:chunk',\n sanitizer: (d: any) => ({ questionId: d?.questionId, chunk: String(d?.chunk || '') }),\n },\n 'inner:conversation:answer:completed': {\n public: 'conversation:answer:completed',\n sanitizer: (d: any) => ({ questionId: d?.questionId, fullAnswer: String(d?.fullAnswer || '') }),\n },\n };\n\n /**\n * Creates a public event emitter instance\n *\n * @param {EventBus} inner - Internal event bus to listen to\n * @author sansen\n */\n constructor(private readonly inner: EventBus) {\n // Subscribe to internal bus for event forwarding\n Object.keys(this.internalMap).forEach((internalName) => {\n // Internal event keys are present in SDKEvents union at runtime\n this.inner.on(internalName as any, (data: any) => this.handleInternalEvent(internalName, data));\n });\n // Listen to LiveKit connection events (internal event names 'livekit:connected' / 'livekit:disconnected')\n // Direct subscription, not mapped to internalMap\n this.inner.on('inner:sdk:connected' as any, (data) => this.handleConnected(data, true));\n this.inner.on('inner:sdk:disconnected' as any, (data) => this.handleConnected(data, false));\n // Handle cases where public event names are directly emitted on internal bus (e.g., 'sdk:error')\n ALLOWED_EVENTS.forEach((publicName) => {\n this.inner.on(publicName as any, (data: any) => this.handlePublicEvent(publicName, data));\n });\n }\n\n /**\n * Returns the public API object for external consumers\n *\n * @returns {PublicEmitterAPI} Public event emitter API\n * @author sansen\n */\n publicAPI(): PublicEmitterAPI {\n return {\n on: this.on.bind(this),\n off: this.off.bind(this),\n once: this.once.bind(this),\n };\n }\n\n /**\n * Subscribes to a public event\n *\n * @template K - Event key type\n * @param {K} event - Event name to subscribe to\n * @param {(data: PublicSDKEvents[K]) => void} listener - Event listener function\n * @returns {() => void} Unsubscribe function\n * @author sansen\n */\n public on<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): () => void {\n const name = String(event);\n this.assertAllowed(name);\n if (!this.listeners.has(name)) this.listeners.set(name, new Set());\n this.listeners.get(name)!.add(listener as Listener);\n return () => this.off(event, listener as any);\n }\n\n /**\n * Subscribes to a public event for one-time execution\n *\n * @template K - Event key type\n * @param {K} event - Event name to subscribe to\n * @param {(data: PublicSDKEvents[K]) => void} listener - Event listener function\n * @returns {() => void} Unsubscribe function\n * @author sansen\n */\n public once<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): () => void {\n const name = String(event);\n this.assertAllowed(name);\n const wrapped = (data: any) => {\n try {\n listener(data);\n } finally {\n this.off(event, wrapped as any);\n }\n };\n return this.on(event, wrapped as any);\n }\n\n /**\n * Unsubscribes from a public event\n *\n * @template K - Event key type\n * @param {K} event - Event name to unsubscribe from\n * @param {(data: PublicSDKEvents[K]) => void} listener - Event listener function to remove\n * @author sansen\n */\n public off<K extends keyof PublicSDKEvents>(event: K, listener: (data: PublicSDKEvents[K]) => void): void {\n const name = String(event);\n this.assertAllowed(name);\n const s = this.listeners.get(name);\n if (s) {\n s.delete(listener as Listener);\n if (s.size === 0) this.listeners.delete(name);\n }\n }\n\n /**\n * Handles internal events for forwarding to public subscribers (private)\n *\n * @param {string} internalName - Internal event name\n * @param {any} data - Internal event data\n * @author sansen\n */\n private handleInternalEvent(internalName: string, data: any) {\n const mapping = this.internalMap[internalName];\n if (!mapping) return; // Ignore unmapped internal events\n\n const publicName = mapping.public;\n if (ALLOWED_EVENTS.indexOf(publicName as keyof PublicSDKEvents) === -1) return; // Not in whitelist\n\n // Deduplication: For videoTrackAdded, check trackId\n if (publicName === 'media:video:trackAdded') {\n const trackId = data?.trackId || data?.id;\n if (typeof trackId === 'string') {\n if (this.forwardedVideoTrackIds.has(trackId)) return; // Already forwarded, ignore duplicate\n this.forwardedVideoTrackIds.add(trackId);\n }\n }\n\n // Sanitize data\n const clean = mapping.sanitizer ? mapping.sanitizer(data) : data;\n\n // Name format validation\n if (!NAME_RE.test(publicName)) return;\n\n // Dispatch to registered listeners\n const s = this.listeners.get(publicName);\n if (!s || s.size === 0) return;\n s.forEach((l) => {\n try {\n l(clean);\n } catch (err) {\n // Swallow listener errors\n\n console.error('PublicEventEmitter listener error', err);\n }\n });\n }\n\n /**\n * Handles cases where internal bus directly emits public event names\n *\n * @param {string} publicName - Public event name\n * @param {any} data - Event data\n * @author sansen\n */\n private handlePublicEvent(publicName: string, data: any) {\n if (ALLOWED_EVENTS.indexOf(publicName as keyof PublicSDKEvents) === -1) return;\n\n // Find possible sanitizer (reverse lookup through internalMap)\n const mappingEntry = Object.values(this.internalMap).find((m) => m.public === publicName);\n const clean = mappingEntry && mappingEntry.sanitizer ? mappingEntry.sanitizer(data) : data;\n\n // Deduplication for video track events\n if (publicName === 'media:video:trackAdded') {\n const trackId = data?.trackId || data?.id;\n if (typeof trackId === 'string') {\n if (this.forwardedVideoTrackIds.has(trackId)) return;\n this.forwardedVideoTrackIds.add(trackId);\n }\n }\n\n // Dispatch to listeners\n const s = this.listeners.get(publicName);\n if (!s || s.size === 0) return;\n s.forEach((l) => {\n try {\n l(clean);\n } catch (err) {\n console.error('PublicEventEmitter listener error', err);\n }\n });\n }\n\n /**\n * Handles connection status changes\n *\n * @param {{ source: 'livekit' | 'ws' }} data - Connection event data\n * @param {boolean} connected - Connection status\n * @author sansen\n */\n private handleConnected(data: { source: 'livekit' | 'ws' }, connected: boolean) {\n if (data.source === 'livekit') {\n this.livekitConnected = connected;\n } else if (data.source === 'ws') {\n this.wsConnected = connected;\n } else if (data.source === 'http') {\n this.httpConnected = connected;\n }\n this.maybeEmitSdkConnected(connected ? 'connected' : 'disconnected');\n }\n\n /**\n * Emits SDK connected event if connection status changed\n *\n * @author sansen\n */\n private maybeEmitSdkConnected(eventType: 'connected' | 'disconnected') {\n const isConnectEvent = eventType === 'connected';\n\n const livekitStatus = isConnectEvent ? !!this.livekitConnected : !this.livekitConnected;\n const wsStatus = isConnectEvent ? !!this.wsConnected : !this.wsConnected;\n const httpStatus = isConnectEvent ? !!this.httpConnected : !this.httpConnected;\n\n const payload = {\n livekit: livekitStatus,\n ws: wsStatus,\n http: httpStatus,\n // only when livekit, ws, http are all true, all is true\n all: livekitStatus && wsStatus && httpStatus,\n };\n\n const json = JSON.stringify(payload);\n // avoid duplicate sending of the same status\n if (this.lastConnectedPayloadJson === json) return;\n this.lastConnectedPayloadJson = json;\n\n this.inner.emit(`sdk:${eventType}`, payload);\n }\n\n /**\n * Validates if an event name is allowed for public consumption\n *\n * @param {string} name - Event name to validate\n * @throws {Error} If event is not allowed or has invalid format\n * @author sansen\n */\n private assertAllowed(name: string) {\n if (ALLOWED_EVENTS.indexOf(name as keyof PublicSDKEvents) === -1) {\n throw new Error(`Event \"${name}\" is not allowed for public consumers`);\n }\n if (!NAME_RE.test(name)) {\n throw new Error(`Event name \"${name}\" does not follow namespace:domain[:action] naming`);\n }\n }\n}\n\nexport default PublicEventEmitter;\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport type { SDKContext } from '@/client/SDKContext';\n\n/**\n * HTTP Request Configuration\n *\n * @author sansen\n * @interface HttpRequestConfig\n */\nexport interface HttpRequestConfig {\n /**\n * Request URL (relative to baseURL)\n *\n * @type {string}\n */\n url: string;\n /**\n * HTTP request method\n *\n * @type {'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'}\n */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n /**\n * Request headers\n *\n * @type {Record<string, string>}\n */\n headers?: Record<string, string>;\n /**\n * Request body (JSON object or string)\n *\n * @type {unknown}\n */\n data?: unknown;\n /**\n * Query parameters (URL query string)\n *\n * @type {Record<string, string | number | boolean>}\n */\n params?: Record<string, string | number | boolean>;\n /**\n * Request ID (for correlating requests and responses)\n *\n * @type {string}\n */\n requestId?: string;\n /**\n * Request timeout in milliseconds\n *\n * @type {number}\n */\n timeout?: number;\n}\n\n/**\n * HTTP Response Data\n *\n * @template T - Response data type\n * @author sansen\n * @interface HttpResponse\n */\nexport interface HttpResponse<T = unknown> {\n /**\n * Request ID\n *\n * @type {string}\n */\n requestId: string;\n /**\n * HTTP status code\n *\n * @type {number}\n */\n status: number;\n /**\n * Response headers\n *\n * @type {Record<string, string>}\n */\n headers: Record<string, string>;\n /**\n * Response data\n *\n * @type {T}\n */\n data: T;\n /**\n * Original request configuration\n *\n * @type {HttpRequestConfig}\n */\n config: HttpRequestConfig;\n}\n\n/**\n * HTTP Error Response\n *\n * @author sansen\n * @interface HttpErrorResponse\n */\nexport interface HttpErrorResponse {\n /**\n * Request ID\n *\n * @type {string}\n */\n requestId: string;\n /**\n * HTTP status code (if available)\n *\n * @type {number|undefined}\n */\n status?: number;\n /**\n * Error message\n *\n * @type {string}\n */\n message: string;\n /**\n * Error details\n *\n * @type {unknown}\n */\n error?: unknown;\n /**\n * Original request configuration\n *\n * @type {HttpRequestConfig}\n */\n config: HttpRequestConfig;\n}\n\n/**\n * HTTP Service\n * Manages all HTTP API requests with unified configuration and error handling\n *\n * @author sansen\n * @class HttpService\n * @extends {Disposable}\n */\nexport class HttpService extends Disposable {\n private readonly _context: SDKContext;\n private readonly _baseURL: string;\n private readonly _defaultHeaders: Record<string, string>;\n private _requestCounter: number = 0;\n\n /**\n * Creates an HTTP service instance\n *\n * @param {SDKContext} context - SDK context for state management\n * @param {string} [baseURL] - Base URL for all requests\n * @param {Record<string, string>} [headers] - Default request headers\n * @author sansen\n */\n constructor(context: SDKContext, baseURL?: string, headers?: Record<string, string>) {\n super();\n this._context = context;\n this._baseURL = baseURL || '';\n this._defaultHeaders = headers || {};\n Logger.info(`HTTP Service created with baseURL: ${this._baseURL || 'none'}`);\n }\n\n /**\n * Sets authentication token for subsequent requests\n *\n * @param {string} token - Authentication token (JWT/Bearer)\n * @author sansen\n */\n public setAuthToken(token: string) {\n this._defaultHeaders['Authorization'] = `Bearer ${token}`;\n }\n\n /**\n * Executes an HTTP request (returns Promise for chainable operations)\n *\n * @template T - Response data type\n * @param {HttpRequestConfig} config - Request configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public request<T = unknown>(config: HttpRequestConfig): Promise<HttpResponse<T>> {\n this.ensureNotDisposed();\n\n // Generate request ID\n const requestId = config.requestId || `req_${Date.now()}_${++this._requestCounter}`;\n\n // Build complete URL\n const url = this._buildURL(config.url, config.params);\n\n // Merge headers\n const headers = this._mergeHeaders(config.headers);\n\n // Build request configuration\n const fetchConfig: RequestInit = {\n method: config.method || 'GET',\n headers,\n };\n\n // Add request body\n if (config.data !== undefined && (config.method || 'GET') !== 'GET') {\n if (typeof config.data === 'string') {\n fetchConfig.body = config.data;\n } else {\n fetchConfig.body = JSON.stringify(config.data);\n if (!headers['Content-Type'] && !headers['content-type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n }\n\n // Set timeout\n const timeout = config.timeout || 30000; // Default 30 seconds\n const controller = new AbortController();\n fetchConfig.signal = controller.signal;\n\n return new Promise<HttpResponse<T>>((resolve, reject) => {\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n fetch(url, fetchConfig)\n .then(async (response) => {\n clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n let data: T;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n data = await response.json();\n } else {\n data = (await response.text()) as unknown as T;\n }\n\n const httpResponse: HttpResponse<T> = {\n requestId,\n status: response.status,\n headers: responseHeaders,\n data,\n config,\n };\n Logger.debug(`HTTP request succeeded: ${config.method} ${url} [${requestId}]`);\n resolve(httpResponse);\n })\n .catch((error) => {\n clearTimeout(timeoutId);\n\n const isAbort = error && error.name === 'AbortError';\n const errorResponse: HttpErrorResponse = {\n requestId,\n status: (error && (error.status as number)) || undefined,\n message: isAbort ? 'Request aborted (timeout)' : (error && error.message) || 'HTTP request failed',\n error,\n config,\n };\n\n Logger.error(`HTTP request failed: ${config.method} ${url} [${requestId}]`, error);\n reject(errorResponse);\n });\n });\n }\n\n /**\n * Executes a GET request\n *\n * @template T - Response data type\n * @param {string} url - Request URL\n * @param {Record<string, string | number | boolean>} [params] - Query parameters\n * @param {Omit<HttpRequestConfig, 'url' | 'method' | 'params'>} [config] - Additional configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public get<T = unknown>(\n url: string,\n params?: Record<string, string | number | boolean>,\n config?: Omit<HttpRequestConfig, 'url' | 'method' | 'params'>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({\n ...config,\n url,\n method: 'GET',\n params,\n });\n }\n\n /**\n * Executes a POST request\n *\n * @template T - Response data type\n * @param {string} url - Request URL\n * @param {unknown} [data] - Request body data\n * @param {Omit<HttpRequestConfig, 'url' | 'method' | 'data'>} [config] - Additional configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public post<T = unknown>(\n url: string,\n data?: unknown,\n config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({\n ...config,\n url,\n method: 'POST',\n data,\n });\n }\n\n /**\n * Executes a PUT request\n *\n * @template T - Response data type\n * @param {string} url - Request URL\n * @param {unknown} [data] - Request body data\n * @param {Omit<HttpRequestConfig, 'url' | 'method' | 'data'>} [config] - Additional configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public put<T = unknown>(\n url: string,\n data?: unknown,\n config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({\n ...config,\n url,\n method: 'PUT',\n data,\n });\n }\n\n /**\n * Executes a DELETE request\n *\n * @template T - Response data type\n * @param {string} url - Request URL\n * @param {Omit<HttpRequestConfig, 'url' | 'method'>} [config] - Additional configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public delete<T = unknown>(url: string, config?: Omit<HttpRequestConfig, 'url' | 'method'>): Promise<HttpResponse<T>> {\n return this.request<T>({\n ...config,\n url,\n method: 'DELETE',\n });\n }\n\n /**\n * Executes a PATCH request\n *\n * @template T - Response data type\n * @param {string} url - Request URL\n * @param {unknown} [data] - Request body data\n * @param {Omit<HttpRequestConfig, 'url' | 'method' | 'data'>} [config] - Additional configuration\n * @returns {Promise<HttpResponse<T>>} Promise resolving to HTTP response\n * @author sansen\n */\n public patch<T = unknown>(\n url: string,\n data?: unknown,\n config?: Omit<HttpRequestConfig, 'url' | 'method' | 'data'>\n ): Promise<HttpResponse<T>> {\n return this.request<T>({\n ...config,\n url,\n method: 'PATCH',\n data,\n });\n }\n\n /**\n * Builds complete URL from relative URL and query parameters\n *\n * @param {string} url - Relative or absolute URL\n * @param {Record<string, string | number | boolean>} [params] - Query parameters\n * @returns {string} Complete URL with query parameters\n * @author sansen\n */\n private _buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n // If absolute URL, use directly\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return this._appendParams(url, params);\n }\n\n // Concatenate baseURL\n let fullURL = this._baseURL;\n if (fullURL && !fullURL.endsWith('/') && !url.startsWith('/')) {\n fullURL += '/';\n } else if (fullURL && fullURL.endsWith('/') && url.startsWith('/')) {\n fullURL = fullURL.slice(0, -1);\n }\n fullURL += url;\n\n return this._appendParams(fullURL, params);\n }\n\n /**\n * Appends query parameters to URL\n *\n * @param {string} url - Base URL\n * @param {Record<string, string | number | boolean>} [params] - Query parameters\n * @returns {string} URL with query string\n * @author sansen\n */\n private _appendParams(url: string, params?: Record<string, string | number | boolean>): string {\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n searchParams.append(key, String(value));\n }\n\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${searchParams.toString()}`;\n }\n\n /**\n * Merges default headers with custom headers\n *\n * @param {Record<string, string>} [customHeaders] - Custom headers\n * @returns {Record<string, string>} Merged headers object\n * @author sansen\n */\n private _mergeHeaders(customHeaders?: Record<string, string>): Record<string, string> {\n const headers: Record<string, string> = { ...this._defaultHeaders };\n if (customHeaders) {\n Object.assign(headers, customHeaders);\n }\n return headers;\n }\n\n /**\n * Cleanup method called when the service is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n Logger.info('HTTP Service disposed');\n }\n}\n","/**\n * Formats a URL with a specific protocol prefix if it doesn't already start with that protocol.\n * @param url The URL to format\n * @param protocol The protocol to use (default is 'https')\n * @returns The formatted URL\n * @author sansen\n */\nexport function fmtProtocol(url: string, protocol: string = 'https') {\n if (url.startsWith(protocol)) {\n return url;\n } else {\n return `${protocol}://${url}`;\n }\n}\n","import { SDKContext } from '@/client/SDKContext';\nimport { DEFAULT_HTTP_BASE_URL, DEFAULT_HTTP_CODE_SUCCESS, DEFAULT_WS_URL_PREFIX } from '@/constants/defaults';\nimport { Disposable } from '@/utils/Disposable';\nimport { HttpResponse, HttpService } from './HttpService';\nimport { ErrorCode } from '@/constants/errorCode';\nimport { fmtProtocol } from '@/utils';\nimport { SDKError } from '@/utils/SDKError';\n\n/**\n * HTTP Controller\n * Manages HTTP requests for SDK operations including authentication, configuration, and conversation control\n *\n * @author sansen\n * @class HttpController\n * @extends {Disposable}\n */\nexport class HttpController extends Disposable {\n private readonly _httpService: HttpService;\n private _context: SDKContext;\n\n /**\n * Creates an HTTP controller instance\n *\n * @param {SDKContext} context - SDK context for state management and error handling\n * @param {string} [baseURL] - Optional custom base URL for HTTP requests\n * @author sansen\n */\n constructor(context: SDKContext, baseURL?: string) {\n super();\n this._context = context;\n this._httpService = new HttpService(context, baseURL || DEFAULT_HTTP_BASE_URL);\n }\n\n /**\n * Retrieves authentication token from server\n *\n * @returns {Promise<void>} Promise that resolves when authentication token is obtained\n * @throws {SDKError} If authentication token retrieval fails\n * @author sansen\n */\n public getAuthToken(): Promise<void> {\n this.ensureNotDisposed();\n if (this._context.authToken) {\n this._httpService?.setAuthToken(this._context.authToken);\n return Promise.resolve();\n } else {\n throw this._context.emitError('Auth token not found', ErrorCode.SDK_AUTH_TOKEN_FAILED);\n }\n }\n\n /**\n * Retrieves LiveKit configuration from server\n *\n * @returns {Promise<boolean|undefined>} Promise that resolves with true if configuration is successfully retrieved\n * @throws {SDKError} If LiveKit configuration retrieval fails\n * @author sansen\n */\n public getLivekitConfig(): Promise<boolean> | undefined {\n this.ensureNotDisposed();\n return this._httpService\n ?.request({\n url: '/stream/v1/start',\n method: 'POST',\n data: {\n avatarName: this._context.options.avatarName,\n voice: this._context.options.avatarVoice || '',\n },\n })\n .then((res: HttpResponse<any>) => {\n if (res.data.code === DEFAULT_HTTP_CODE_SUCCESS) {\n const resData = res.data.data;\n this._context.setLivekitConfig(fmtProtocol(resData.livekitUrl, 'wss'), resData.roomToken, resData.roomId);\n this._context.setWsUrl(\n `${this._context.options.wsUrlPrefix || DEFAULT_WS_URL_PREFIX}/${resData.roomId}/${this._context.options.avatarName}`\n );\n this._context.setVideoOptions({\n renderMode: resData.greenScreen.enabled ? 'processed' : 'raw',\n greenScreen: resData.greenScreen || {},\n });\n this._context.eventBus.emit('inner:sdk:connected', { source: 'http' });\n return true;\n } else {\n throw new SDKError(res.data.msg, ErrorCode.SDK_GET_LIVEKIT_CONFIG_FAILED);\n }\n })\n .catch((err) => {\n this._context.eventBus.emit('inner:sdk:error', { error: new SDKError(err.message, ErrorCode.SDK_GET_LIVEKIT_CONFIG_FAILED) });\n throw SDKError.fromError(err, ErrorCode.SDK_GET_LIVEKIT_CONFIG_FAILED);\n });\n }\n /**\n * Switches video content (avatar actions)\n *\n * @param {{ onceActions?: string[]; loopActions?: string[] }} options - Video switching options\n * @param {string[]} [options.onceActions] - One-time avatar actions\n * @param {string[]} [options.loopActions] - Looping avatar actions\n * @returns {Promise<string>} Promise that resolves with 'success' on success, or error message on failure\n * @author sansen\n */\n public switchVideo({ onceActions, loopActions }: { onceActions?: string[]; loopActions?: string[] }): Promise<boolean> {\n this.ensureNotDisposed();\n return this._httpService\n ?.request({\n url: '/avatar/v1/switch-video',\n method: 'POST',\n data: {\n roomId: this._context.roomId,\n onceActions,\n loopActions,\n },\n })\n .then((res: HttpResponse<any>) => {\n if (res.data.code === DEFAULT_HTTP_CODE_SUCCESS) {\n return true;\n } else {\n throw this._context.emitError(res.data.message, ErrorCode.SDK_SWITCH_VIDEO_FAILED);\n }\n });\n }\n\n /**\n * Interrupts ongoing conversation\n *\n * @returns {Promise<string>} Promise that resolves with 'success' on success, or error message on failure\n * @author sansen\n */\n public interruptConversation(): Promise<boolean> {\n this.ensureNotDisposed();\n return this._httpService\n ?.request({\n url: '/stream/v1/interrupt',\n method: 'POST',\n data: {\n roomId: this._context.roomId,\n },\n })\n .then((res: HttpResponse<any>) => {\n if (res.data.code === DEFAULT_HTTP_CODE_SUCCESS) {\n return true;\n } else {\n throw this._context.emitError(res.data.message, ErrorCode.SDK_INTERRUPT_CONVERSATION_FAILED);\n }\n })\n .finally(() => {\n this._context.eventBus.emit('inner:sdk:disconnected', { source: 'http' });\n });\n }\n\n /**\n * Stops and disconnects conversation session\n *\n * @returns {Promise<string>} Promise that resolves with 'success' on success, or error message on failure\n * @author sansen\n */\n public disconnectConversation(): Promise<boolean> {\n this.ensureNotDisposed();\n return this._httpService\n ?.request({\n url: '/stream/v1/stop',\n method: 'POST',\n data: {\n roomId: this._context.roomId,\n },\n })\n .then((res: HttpResponse<any>) => {\n if (res.data.code === DEFAULT_HTTP_CODE_SUCCESS) {\n return true;\n } else {\n return false;\n }\n })\n .finally(() => {\n this._context.eventBus.emit('inner:sdk:disconnected', { source: 'http' });\n });\n }\n\n /**\n * Cleanup method called when the controller is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this._httpService.dispose();\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { SDKError } from '@/utils/SDKError';\nimport { Logger } from '@/utils/Logger';\nimport { SDKContext } from '@/client/SDKContext';\nimport { ConnectionLifecycleCoordinator } from '@/client/ConnectionLifecycleCoordinator';\nimport { type ConnectionSnapshot, createInitialSnapshot, freezeSnapshot } from '@/state/ConnectionSnapshot';\nimport { VideoController } from '@/video/VideoController';\nimport { AudioController } from '@/audio/AudioController';\nimport { CameraController } from '@/video/camera/CameraController';\nimport { ConversationController } from '@/conversation/ConversationController';\nimport { LiveKitService } from '@/rtc/LiveKitService';\nimport { ConversationTransport } from '@/transport/ConversationTransport';\nimport type { ClientOptions } from '@/types/ClientOptions.d';\nimport PublicEventEmitter, { PublicEmitterAPI } from '@/events/publicEvents';\nimport { HttpController } from '@/http/httpController';\nimport { ErrorCode } from '@/constants/errorCode';\nimport { PRECONNECT_CACHE_DURATION_MS } from '@/constants/defaults';\nimport { RenderFitMode } from '@/types/VideoOptions';\n\n/**\n * SDK client\n * Provides a unified API surface.\n * Orchestrates the lifecycles of all subsystems.\n * @author sansen\n */\nexport class SDKClient extends Disposable {\n /**\n * SDK context\n * @author sansen\n */\n protected readonly _context: SDKContext;\n private _publicEventAPI?: PublicEmitterAPI;\n private _publicEmitter?: PublicEventEmitter;\n\n /**\n * Video controller\n * @author sansen\n */\n private _videoController: VideoController | null = null;\n\n /**\n * Audio controller\n * @author sansen\n */\n private _audioController: AudioController | null = null;\n\n /**\n * Conversation controller\n * @author sansen\n */\n private _conversationController: ConversationController | null = null;\n\n /**\n * Camera controller (local camera capture + screenshot send)\n * @author sansen\n */\n private _cameraController: CameraController | null = null;\n\n /**\n * LiveKit service\n * @author sansen\n */\n private _liveKitService: LiveKitService | null = null;\n\n /**\n * Conversation transport service\n * @author sansen\n */\n private _conversationTransport: ConversationTransport | null = null;\n\n /**\n * Central coordinator for connection lifecycle (snapshot + FSM).\n * Created in connect(); drives sessionState from rtc/ws fact events.\n * @author sansen\n */\n private _connectionCoordinator: ConnectionLifecycleCoordinator | null = null;\n\n /**\n * HTTP controller\n * @author sansen\n */\n private _httpController: HttpController | null = null;\n\n private _preConnectPromise: Promise<boolean> | null = null;\n /** Timestamp (ms) of last successful preConnect */\n private _lastPreConnectSuccessAt: number | null = null;\n\n /**\n * Create SDK client\n * @param options Client configuration options\n * @author sansen\n */\n constructor(options: ClientOptions) {\n super();\n this._context = new SDKContext(options);\n Logger.info('SDK Client created');\n }\n\n /**\n * Get public event bus API\n * @author sansen\n */\n public get events(): PublicEmitterAPI {\n this.ensureNotDisposed();\n if (!this._publicEventAPI) {\n this._publicEmitter = new PublicEventEmitter(this._context.eventBus);\n this._publicEventAPI = this._publicEmitter.publicAPI();\n }\n return this._publicEventAPI;\n }\n\n /**\n * Push actions to the server\n * @param onceActions One-time actions\n * @param loopActions Repeating/loop actions\n * @returns Promise<boolean> resolves to true on success, or false on failure\n * @author sansen\n */\n public pushActions({ onceActions, loopActions }: { onceActions?: string[]; loopActions?: string[] }): Promise<boolean> | undefined {\n this.ensureNotDisposed();\n this._ensureConnected();\n return this._httpController?.switchVideo({ onceActions, loopActions });\n }\n\n /**\n * Interrupt the current conversation connection\n * @returns Promise<boolean> resolves to true on success, or false on failure\n * @author sansen\n */\n public interruptConnection(): Promise<boolean> | undefined {\n this.ensureNotDisposed();\n this._ensureConnected();\n return this._httpController?.interruptConversation();\n }\n\n /**\n * Send a text question/message\n * @param text The question text to send\n * @returns Promise<string> resolves with the message UID\n * @author sansen\n */\n public sendTextQuestion(text: string): Promise<string> {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (this._conversationController) {\n return this._conversationController.sendQuestion(text);\n }\n throw new SDKError('Conversation controller is not available', ErrorCode.CONVERSATION_CONTROLLER_NOT_AVAILABLE);\n }\n\n /**\n * Set render fit mode\n * @param mode Render fit mode\n * @author sansen\n */\n public setRenderFitMode(mode: RenderFitMode): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (this._videoController) {\n this._videoController.setRenderFitMode(mode);\n }\n }\n\n /**\n * Start audio capture\n * Begins microphone capture and starts sending audio frames over WebSocket\n * @returns Promise<void>\n * @throws SDKError if the SDK is not initialized or capture fails to start\n * @author sansen\n */\n public async startAudioCapture(): Promise<void> {\n this.ensureNotDisposed();\n this._ensureConnected();\n\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n\n await this._audioController.startCapture();\n }\n\n /**\n * Stop audio capture\n * Stops microphone capture and stops sending audio frames over WebSocket\n * @throws SDKError if the SDK is not initialized\n * @author sansen\n */\n public async stopAudioCapture(): Promise<void> {\n this.ensureNotDisposed();\n this._ensureConnected();\n\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n\n await this._audioController.stopCapture();\n }\n\n /**\n * Sets the audio volume level\n * @param volume Volume value (0.0 - 1.0)\n * @author sansen\n */\n public setVolume(volume: number): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n this._audioController.setVolume(volume);\n }\n\n /**\n * Get audio volume\n * Gets the current audio volume level\n * @returns Volume value (0.0 - 1.0)\n * @author sansen\n */\n public getVolume(): number {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n return this._audioController?.getVolume() || 1.0;\n }\n\n /**\n * Mute audio\n * Mutes the audio output\n * @author sansen\n */\n mute(): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n this._audioController.mute();\n }\n\n /**\n * Unmute audio\n * Unmutes the audio output\n * @author sansen\n */\n unmute(): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n this._audioController.unmute();\n }\n\n /**\n * Check whether audio is muted\n * @returns boolean true if muted, false otherwise\n * @author sansen\n */\n public get isMuted(): boolean {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._audioController) {\n throw new SDKError('Audio controller is not available', ErrorCode.AUDIO_CONTROLLER_NOT_AVAILABLE);\n }\n return this._audioController.isMuted();\n }\n\n /**\n * Check if audio is currently being captured\n * @returns boolean true if capturing, false otherwise\n * @throws SDKError if the SDK is not initialized\n * @author sansen\n */\n public get isAudioCapturing(): boolean {\n this.ensureNotDisposed();\n this._ensureConnected();\n\n if (!this._audioController) {\n return false;\n }\n\n return this._audioController.isCapturing;\n }\n\n /**\n * Set authentication token\n * @param token Authentication token\n * @author sansen\n */\n public setAuthToken(token: string): void {\n this.ensureNotDisposed();\n this._context.setAuthToken(token);\n if (this._httpController) {\n this._httpController.getAuthToken();\n }\n }\n\n /**\n * Start camera capture and periodic screenshot sending over WebSocket\n * @returns Promise<void>\n * @throws SDKError if not connected or camera controller unavailable\n * @author sansen\n */\n public async startCamera(): Promise<void> {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._cameraController) {\n throw new SDKError('Camera controller is not available', ErrorCode.CAMERA_CONTROLLER_NOT_AVAILABLE);\n }\n await this._cameraController.startCamera();\n }\n\n /**\n * Stop camera capture and screenshot sending\n * @author sansen\n */\n public stopCamera(): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (this._cameraController) {\n this._cameraController.stopCamera();\n }\n }\n\n /**\n * Get the local camera MediaStream (null if camera not running)\n * @returns MediaStream | null\n * @author sansen\n */\n public getCameraStream(): MediaStream | null {\n this.ensureNotDisposed();\n this._ensureConnected();\n return this._cameraController?.getStream() ?? null;\n }\n\n /**\n * Get the local camera video track (null if camera not running)\n * @returns MediaStreamTrack | null\n * @author sansen\n */\n public getCameraTrack(): MediaStreamTrack | null {\n this.ensureNotDisposed();\n this._ensureConnected();\n return this._cameraController?.getTrack() ?? null;\n }\n\n /**\n * Attach the local camera stream to a video element for preview\n * @param videoElement HTML video element to show the stream\n * @author sansen\n */\n public attachCameraTo(videoElement: HTMLVideoElement): void {\n this.ensureNotDisposed();\n this._ensureConnected();\n if (!this._cameraController) {\n throw new SDKError('Camera controller is not available', ErrorCode.CAMERA_CONTROLLER_NOT_AVAILABLE);\n }\n this._cameraController.attachTo(videoElement);\n }\n\n /**\n * Pre-connect to remote services\n * Performs pre-connection steps: fetches auth token and LiveKit configuration\n * @returns Promise<boolean> resolves to true on success\n * @author sansen\n */\n public async preConnect(): Promise<boolean> {\n this.ensureNotDisposed();\n // Step 1: If a pre-connect is already in progress, return the existing Promise\n if (this._preConnectPromise) {\n return this._preConnectPromise;\n }\n\n // Step 2: If we have a recent successful preConnect, return cached success\n const now = Date.now();\n if (this._lastPreConnectSuccessAt !== null && now - this._lastPreConnectSuccessAt < PRECONNECT_CACHE_DURATION_MS) {\n return Promise.resolve(true);\n }\n\n // Step 3: Otherwise perform preConnect and cache on success\n this._preConnectPromise = (async () => {\n try {\n Logger.info('Creating HTTP controller...');\n this._httpController = this._httpController ?? new HttpController(this._context, this._context.options.http?.baseURL);\n Logger.info('Setting auth token...');\n await this._httpController.getAuthToken();\n Logger.info('Getting livekit config...');\n const success = !!(await this._httpController?.getLivekitConfig());\n if (!success) throw new Error('Config missing');\n // update last success timestamp\n this._lastPreConnectSuccessAt = Date.now();\n return true;\n } catch (error) {\n throw this._context.emitError(error, ErrorCode.SDK_PRECONNECT_FAILED);\n } finally {\n // Clear processing marker so future calls can retry or use cache\n this._preConnectPromise = null;\n }\n })();\n\n return this._preConnectPromise;\n }\n\n /**\n * Connect to the server\n * Initializes controllers and establishes required connections\n * @returns Promise<void>\n * @author sansen\n */\n public async connect(): Promise<void> {\n this.ensureNotDisposed();\n\n if (this._connectionCoordinator && this._context.sessionState.isConnected) {\n Logger.warn('SDK already initialized');\n return;\n }\n\n // Regardless of whether `preConnect` was called externally, call it here and await.\n // If the caller already invoked it, they will get the cached promise and await its result.\n try {\n const preConnectPathSuccess = await this.preConnect();\n if (!preConnectPathSuccess) {\n throw new SDKError('PreConnect failed without explicit error', ErrorCode.SDK_CONNECT_FAILED);\n }\n } catch (error) {\n // Catch preConnect errors and rethrow to stop further connect logic\n throw this._context.emitError(error, ErrorCode.SDK_CONNECT_FAILED);\n }\n try {\n Logger.info('Initializing SDK...');\n this._connectionCoordinator = new ConnectionLifecycleCoordinator(this._context);\n this._connectionCoordinator.start();\n this._connectionCoordinator.startConnecting();\n\n // 1. Create controllers\n this._videoController = new VideoController(this._context, this._context.options.video);\n this._audioController = new AudioController(this._context, this._context.options.audio);\n this._cameraController = new CameraController(this._context);\n this._conversationController = new ConversationController(this._context);\n\n // 2. Create services\n this._liveKitService = new LiveKitService(this._context);\n this._conversationTransport = new ConversationTransport(this._context);\n\n // 3. Connect LiveKitEventAdapter to VideoController and AudioController (ensure tracks render/play correctly)\n if (this._liveKitService && this._videoController && this._audioController) {\n const eventAdapter = this._liveKitService.getEventAdapter();\n if (eventAdapter) {\n if (typeof eventAdapter.setVideoController === 'function') {\n eventAdapter.setVideoController(this._videoController);\n }\n if (typeof eventAdapter.setAudioController === 'function') {\n eventAdapter.setAudioController(this._audioController);\n }\n }\n }\n\n // 4. Connect AudioController and CameraController to ConversationTransport (for sending frames)\n if (this._conversationTransport) {\n const wsSender = {\n sendBinary: (data: ArrayBuffer | Uint8Array) => {\n this._conversationTransport!.sendBinary(data);\n },\n isConnected: () => this._conversationTransport!.isConnected,\n };\n if (this._audioController) {\n this._audioController.setWebSocketSender(wsSender);\n }\n if (this._cameraController) {\n this._cameraController.setWebSocketSender(wsSender);\n }\n }\n\n // 5. Connect ConversationTransport to ConversationManager\n if (this._conversationTransport && this._conversationController) {\n this._conversationTransport.setConversationManager(this._conversationController.manager);\n this._conversationController.setTransport(this._conversationTransport);\n }\n\n // 7. Connect LiveKit\n await this._liveKitService.connect(this._context.livekitUrl, this._context.token, this._context.options.avatarName);\n\n // 8. Connect conversation transport service\n if (this._conversationTransport) {\n await this._conversationTransport.connect();\n }\n\n // Coordinator has already transitioned to connected via rtc:connected / ws:connected\n Logger.info('SDK initialized and connected');\n } catch (error) {\n if (this._connectionCoordinator) {\n this._connectionCoordinator.transitionToIdle();\n }\n await this._cleanup();\n throw this._context.emitError(error, ErrorCode.SDK_INITIALIZATION_FAILED);\n }\n }\n\n /**\n * Disconnect\n * Tears down active connections but retains controller instances to allow reconnect\n * @author sansen\n */\n public async disconnect(): Promise<void> {\n this.ensureNotDisposed();\n\n if (\n !this._connectionCoordinator ||\n this._connectionCoordinator.getState() === 'idle' ||\n this._connectionCoordinator.getState() === 'disposed'\n ) {\n return;\n }\n\n Logger.info('Disconnecting SDK...');\n this._connectionCoordinator.startDisconnecting();\n\n try {\n // Disconnect conversation transport service\n if (this._conversationTransport) {\n this._conversationTransport.disconnect();\n }\n\n // Disconnect LiveKit\n if (this._liveKitService) {\n await this._liveKitService.disconnect();\n }\n\n // Stop audio capture\n if (this._audioController) {\n this._audioController.stopCapture();\n }\n\n // Stop camera\n if (this._cameraController) {\n this._cameraController.stopCamera();\n }\n\n if (this._httpController) {\n await this._httpController.disconnectConversation();\n }\n this._preConnectPromise = null;\n this._connectionCoordinator.completeDisconnecting();\n Logger.info('SDK disconnected');\n } catch (error) {\n Logger.error('Error during disconnect:', error);\n throw this._context.emitError(error, ErrorCode.SDK_DISCONNECT_FAILED);\n }\n }\n\n /**\n * Manual reconnect.\n * Captures current connection snapshot (for user-driven reconnect UX), transitions to reconnecting:manual, then re-establishes connections.\n *\n * @returns Promise<ConnectionSnapshot> Snapshot captured at the moment reconnect was triggered (before transition).\n * @author sansen\n */\n public async reconnect(): Promise<ConnectionSnapshot> {\n this.ensureNotDisposed();\n const coordinator = this._connectionCoordinator;\n\n if (!coordinator?.canStartReconnectingManual()) {\n const snapshot = coordinator ? coordinator.getSnapshot() : this.connectionSnapshot;\n Logger.warn('SDK reconnect not allowed in current state, returning current snapshot');\n return snapshot;\n }\n\n // Capture snapshot before transitioning so caller has accurate state for UX decisions\n const snapshotAtTrigger = coordinator.captureSnapshotAndStartReconnectingManual();\n\n try {\n if (this._audioController) {\n this._audioController.stopCapture();\n }\n\n // Scenario: LiveKit connected but no video stream (from snapshot, no Room/Track dependency)\n if (snapshotAtTrigger.rtc.connected && !snapshotAtTrigger.rtc.hasVideoTrack) {\n await this._liveKitService?.disconnect();\n await this._conversationTransport?.disconnect();\n }\n\n if (this._conversationTransport && !this._conversationTransport.isConnected) {\n const preConnectPathSuccess = await this.preConnect();\n if (!preConnectPathSuccess) {\n throw new SDKError('PreConnect failed without explicit error', ErrorCode.SDK_CONNECT_FAILED);\n }\n await this._conversationTransport.connect();\n }\n\n if (this._liveKitService && !this._liveKitService.isConnected()) {\n await this._liveKitService.connect(this._context.livekitUrl, this._context.token, this._context.options.avatarName);\n }\n return snapshotAtTrigger;\n } catch (error) {\n Logger.error('Error during reconnect:', error);\n throw this._context.emitError(error, ErrorCode.SDK_RECONNECT_FAILED);\n }\n }\n\n /**\n * Current connection snapshot (ws/rtc/overall state).\n * Derived from internal facts; available synchronously for user-driven reconnect UX.\n *\n * @returns Read-only ConnectionSnapshot\n * @author sansen\n */\n public get connectionSnapshot(): ConnectionSnapshot {\n this.ensureNotDisposed();\n if (this._connectionCoordinator) {\n return this._connectionCoordinator.getSnapshot();\n }\n return freezeSnapshot(createInitialSnapshot('idle'));\n }\n\n /**\n * Cleanup all resources (internal)\n * @author sansen\n */\n private async _cleanup(): Promise<void> {\n if (this._conversationTransport) {\n this._conversationTransport.disconnect();\n }\n\n if (this._liveKitService) {\n try {\n await this._liveKitService.disconnect();\n } catch (error) {\n Logger.error('Error disconnecting LiveKit:', error);\n }\n }\n\n if (this._audioController) {\n this._audioController.stopCapture();\n }\n\n if (this._cameraController) {\n this._cameraController.stopCamera();\n }\n }\n\n /**\n * Check whether the SDK is connected (both rtc and ws; synced by ConnectionLifecycleCoordinator).\n * @author sansen\n */\n public get isConnected(): boolean {\n this.ensureNotDisposed();\n return this._context.sessionState.isConnected;\n }\n\n /**\n * Ensure the SDK is connected\n * @throws SDKError if the SDK is not connected\n * @author sansen\n */\n private _ensureConnected(): void {\n if (!this._context.sessionState.isConnected) {\n throw new SDKError('SDK is not connected. Call connect() first.', ErrorCode.SDK_NOT_CONNECTED);\n }\n }\n\n /**\n * Release resources\n * @author sansen\n */\n protected onDispose(): void {\n // Disconnect\n this.disconnect().catch((error) => {\n Logger.error('Error during disconnect in dispose:', error);\n });\n\n // Dispose all controllers\n if (this._videoController) {\n this._videoController.dispose();\n this._videoController = null;\n }\n\n if (this._audioController) {\n this._audioController.dispose();\n this._audioController = null;\n }\n\n if (this._cameraController) {\n this._cameraController.dispose();\n this._cameraController = null;\n }\n\n if (this._conversationController) {\n this._conversationController.dispose();\n this._conversationController = null;\n }\n\n // Dispose services\n if (this._liveKitService) {\n this._liveKitService.dispose();\n this._liveKitService = null;\n }\n\n if (this._conversationTransport) {\n this._conversationTransport.dispose();\n this._conversationTransport = null;\n }\n\n if (this._httpController) {\n this._httpController.dispose();\n this._httpController = null;\n }\n\n if (this._connectionCoordinator) {\n this._connectionCoordinator.transitionToDisposed();\n this._connectionCoordinator.dispose();\n this._connectionCoordinator = null;\n }\n\n this._context.dispose();\n\n Logger.info('SDK Client disposed');\n }\n}\n","import { SDKClient } from './SDKClient';\nimport { SDKError } from '@/utils/SDKError';\nimport { Logger } from '@/utils/Logger';\nimport type { ClientOptions } from '@/types/ClientOptions.d';\nimport { ErrorCode } from '@/constants/errorCode';\n\n/**\n * Create an SDK client instance\n * @param options Client configuration options\n * @returns SDK client instance\n * @throws SDKError if the configuration is invalid\n * @author sansen\n */\nexport function createClient(options: ClientOptions): SDKClient {\n if (!options.avatarName) {\n throw new SDKError('avatarName is required', ErrorCode.NO_AVATARNAME);\n }\n\n Logger.info('Creating SDK client with options:', {\n avatarName: options.avatarName,\n });\n\n return new SDKClient(options);\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\n\n/**\n * Local Video Debug Source\n * Loads a local video via HTMLVideoElement and provides VideoFrame capture utilities\n * Operates independently of LiveKit and uses only browser native APIs\n *\n * @author sansen\n * @class LocalVideoDebugSource\n * @extends {Disposable}\n */\nexport class LocalVideoDebugSource extends Disposable {\n private _videoElement: HTMLVideoElement | null = null;\n private _videoUrl: string | null = null;\n private _isPlaying: boolean = false;\n private _frameCallbackId: number | null = null;\n\n /**\n * Creates a local video debug source instance\n *\n * @param {string} videoUrl - Video file URL (can be local file path or remote URL)\n * @param {HTMLVideoElement} [videoElement] - Optional HTMLVideoElement (will be created if not provided)\n * @author sansen\n */\n constructor(videoUrl: string, videoElement?: HTMLVideoElement) {\n super();\n this._videoUrl = videoUrl;\n\n if (videoElement) {\n this._videoElement = videoElement;\n } else {\n // Create a hidden video element for decoding\n this._videoElement = document.createElement('video');\n this._videoElement.style.opacity = '0';\n this._videoElement.muted = true; // Mute to avoid audio playback\n this._videoElement.playsInline = true;\n this._videoElement.loop = true;\n document.querySelector('#video-container')?.appendChild(this._videoElement);\n }\n\n Logger.info('Local Video Debug Source created');\n }\n\n /**\n * Gets the underlying video element\n *\n * @type {HTMLVideoElement|null}\n * @author sansen\n */\n public get videoElement(): HTMLVideoElement | null {\n return this._videoElement;\n }\n\n /**\n * Loads the video resource\n *\n * @returns {Promise<void>} Promise that resolves when video is loaded\n * @author sansen\n */\n public async load(): Promise<void> {\n if (!this._videoElement) {\n throw new Error('Video element or URL not set');\n }\n\n return new Promise((resolve, reject) => {\n const video = this._videoElement!;\n\n const onLoadedMetadata = () => {\n video.removeEventListener('loadedmetadata', onLoadedMetadata);\n video.removeEventListener('error', onError);\n Logger.info(`Video loaded: ${video.videoWidth}x${video.videoHeight}`);\n resolve();\n };\n\n const onError = (error: Event) => {\n video.removeEventListener('loadedmetadata', onLoadedMetadata);\n video.removeEventListener('error', onError);\n reject(new Error(`Failed to load video: ${error}`));\n };\n\n video.addEventListener('loadedmetadata', onLoadedMetadata);\n video.addEventListener('error', onError);\n video.src = this._videoUrl || '';\n video.load();\n });\n }\n\n /**\n * Starts video playback\n *\n * @returns {Promise<void>} Promise that resolves when playback starts\n * @author sansen\n */\n public async play(): Promise<void> {\n if (!this._videoElement) {\n throw new Error('Video element not set');\n }\n\n if (this._isPlaying) {\n return;\n }\n\n try {\n await this._videoElement.play();\n this._videoElement.style.opacity = '0';\n this._videoElement.setAttribute('loop', 'true');\n this._isPlaying = true;\n Logger.info('Video playback started');\n } catch (error) {\n Logger.error('Failed to play video:', error);\n throw error;\n }\n }\n\n /**\n * Pauses video playback\n *\n * @author sansen\n */\n public pause(): void {\n if (this._videoElement && this._isPlaying) {\n this._videoElement.pause();\n this._isPlaying = false;\n Logger.info('Video playback paused');\n }\n }\n\n /**\n * Stops video playback and resets to start\n *\n * @author sansen\n */\n public stop(): void {\n if (this._videoElement) {\n this._videoElement.pause();\n this._videoElement.currentTime = 0;\n this._isPlaying = false;\n Logger.info('Video playback stopped');\n }\n }\n\n /**\n * Checks whether the video is currently playing\n *\n * @type {boolean}\n * @author sansen\n */\n public get isPlaying(): boolean {\n return this._isPlaying && this._videoElement !== null && !this._videoElement.paused;\n }\n\n /**\n * Gets video width in pixels\n *\n * @type {number}\n * @author sansen\n */\n public get videoWidth(): number {\n return this._videoElement?.videoWidth || 0;\n }\n\n /**\n * Gets video height in pixels\n *\n * @type {number}\n * @author sansen\n */\n public get videoHeight(): number {\n return this._videoElement?.videoHeight || 0;\n }\n\n /**\n * Creates a VideoFrame from the current video frame\n * Uses requestVideoFrameCallback when available, otherwise falls back to drawImage + createImageBitmap\n *\n * @returns {Promise<VideoFrame|null>} Promise resolving to VideoFrame or null if capture fails\n * @author sansen\n */\n public async captureFrame(): Promise<VideoFrame | null> {\n if (!this._videoElement || this._videoElement.readyState < 2) {\n return null;\n }\n\n try {\n // Method 1: Construct VideoFrame directly (if supported by the browser)\n if ('VideoFrame' in window && typeof (window as any).VideoFrame === 'function') {\n try {\n const frame = new VideoFrame(this._videoElement, {\n timestamp: this._videoElement.currentTime * 1000000, // Convert to microseconds\n });\n return frame;\n } catch (e) {\n Logger.error('', e);\n // If direct construction fails, fall back to method 2\n }\n }\n\n // Method 2: Use createImageBitmap (wider browser support)\n const imageBitmap = await createImageBitmap(this._videoElement);\n const frame = new VideoFrame(imageBitmap, {\n timestamp: this._videoElement.currentTime * 1000000,\n });\n imageBitmap.close(); // Clean up resources\n return frame;\n } catch (error) {\n Logger.error('Failed to capture video frame:', error);\n return null;\n }\n }\n\n /**\n * Registers a video frame callback\n * Uses requestVideoFrameCallback when supported or falls back to requestAnimationFrame\n *\n * @param {(frame: VideoFrame) => void} callback - Frame callback function\n * @author sansen\n */\n public onFrame(callback: (frame: VideoFrame) => void): void {\n if (!this._videoElement) {\n return;\n }\n\n // Stop any previous callback\n this.offFrame();\n\n const video = this._videoElement;\n\n // Method 1: Use requestVideoFrameCallback (Chrome 94+, Edge 94+)\n if ('requestVideoFrameCallback' in video) {\n const handleFrame = (_now: number, _metadata: VideoFrameCallbackMetadata) => {\n if (!this._isPlaying || !this._videoElement) {\n return;\n }\n\n // Create a VideoFrame from the video element\n this.captureFrame()\n .then((frame) => {\n if (frame) {\n callback(frame);\n frame.close(); // Clean up resources\n }\n\n // Continue to the next frame\n if (this._isPlaying && this._videoElement) {\n this._frameCallbackId = (video as any).requestVideoFrameCallback(handleFrame);\n }\n })\n .catch((error) => {\n Logger.error('Error in frame callback:', error);\n });\n };\n\n this._frameCallbackId = (video as any).requestVideoFrameCallback(handleFrame);\n } else {\n // Method 2: Fall back to requestAnimationFrame\n const handleFrame = () => {\n if (!this._isPlaying || !this._videoElement) {\n return;\n }\n\n this.captureFrame()\n .then((frame) => {\n if (frame) {\n callback(frame);\n frame.close(); // Clean up resources\n }\n\n // Continue to the next frame\n if (this._isPlaying && this._videoElement) {\n this._frameCallbackId = requestAnimationFrame(handleFrame);\n }\n })\n .catch((error) => {\n Logger.error('Error in frame callback:', error);\n });\n };\n\n this._frameCallbackId = requestAnimationFrame(handleFrame);\n }\n }\n\n /**\n * Cancels the video frame callback\n *\n * @author sansen\n */\n public offFrame(): void {\n if (this._frameCallbackId !== null) {\n if (this._videoElement && 'cancelVideoFrameCallback' in this._videoElement) {\n (this._videoElement as any).cancelVideoFrameCallback(this._frameCallbackId);\n } else {\n cancelAnimationFrame(this._frameCallbackId);\n }\n this._frameCallbackId = null;\n }\n }\n\n /**\n * Cleanup method called when the source is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.stop();\n this.offFrame();\n\n // If the video element was created by this instance, remove it from DOM\n if (this._videoElement && this._videoElement.parentElement === document.body) {\n document.body.removeChild(this._videoElement);\n }\n\n this._videoElement = null;\n this._videoUrl = null;\n Logger.info('Local Video Debug Source disposed');\n }\n}\n\n/**\n * VideoFrameCallbackMetadata type definition (used by requestVideoFrameCallback)\n *\n * @interface VideoFrameCallbackMetadata\n */\ninterface VideoFrameCallbackMetadata {\n expectedDisplayTime: number;\n width: number;\n height: number;\n mediaTime: number;\n presentedFrames: number;\n processingDuration?: number;\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { VideoSource } from '@/video/VideoSource';\nimport { VideoPipeline } from '@/video/VideoPipeline';\nimport { CanvasRenderer } from '@/video/renderer/CanvasRenderer';\nimport type { VideoOptions } from '@/types/VideoOptions.d';\nimport type { IVideoProcessor } from '@/video/video.d';\n\n/**\n * Video Pipeline Runner\n * Runs the video processing pipeline independently of a LiveKit connection\n * Accepts VideoFrame input, processes frames via processors, and outputs to a Canvas\n *\n * @author sansen\n * @class VideoPipelineRunner\n * @extends {Disposable}\n */\nexport class VideoPipelineRunner extends Disposable {\n private readonly _pipeline: VideoPipeline;\n private readonly _source: VideoSource;\n private _outputCanvas: HTMLCanvasElement | null = null;\n private _outputRenderer: CanvasRenderer | null = null;\n\n /**\n * Creates a video pipeline runner instance\n *\n * @param {VideoOptions} [options] - Video configuration options (including green screen settings)\n * @param {HTMLVideoElement} [videoElement] - Optional video element for rendering context\n * @param {HTMLCanvasElement} [outputCanvas] - Output canvas element (optional, will be created if not provided)\n * @author sansen\n */\n constructor(options?: VideoOptions, videoElement?: HTMLVideoElement, outputCanvas?: HTMLCanvasElement) {\n super();\n\n // Create a virtual VideoSource (does not depend on a real MediaStreamTrack)\n this._source = new VideoSource();\n\n // Create VideoPipeline (using processed mode to support processors)\n const pipelineOptions: VideoOptions = {\n ...options,\n renderMode: 'processed', // force 'processed' mode to support processors\n };\n this._pipeline = new VideoPipeline(this._source, pipelineOptions);\n\n // Create a CanvasRenderer and set it on the pipeline\n this._outputRenderer = new CanvasRenderer(outputCanvas, videoElement);\n this._pipeline.setRenderer(this._outputRenderer);\n this._outputCanvas = this._outputRenderer.getCanvas();\n Logger.info('Video Pipeline Runner created');\n }\n\n /**\n * Gets the output canvas element\n *\n * @type {HTMLCanvasElement|null}\n * @author sansen\n */\n public get outputCanvas(): HTMLCanvasElement | null {\n return this._outputCanvas;\n }\n\n /**\n * Gets the current video processor\n *\n * @type {IVideoProcessor|null}\n * @author sansen\n */\n public get processor(): IVideoProcessor | null {\n return this._pipeline.strategy.getProcessors()[0] || null;\n }\n\n /**\n * Sets a new video processor\n *\n * @param {IVideoProcessor|null} processor - Video processor (e.g., GreenScreenProcessor)\n * @author sansen\n */\n public setProcessor(processor: IVideoProcessor | null): void {\n this._pipeline.setProcessor(processor);\n Logger.info('Processor set on pipeline');\n }\n\n /**\n * Processes a single video frame\n * Processes the VideoFrame with the configured processor and renders to the output Canvas\n *\n * @param {VideoFrame} frame - Input video frame\n * @returns {Promise<void>} Promise that resolves when frame processing is complete\n * @author sansen\n */\n public async processFrame(frame: VideoFrame): Promise<void> {\n this.ensureNotDisposed();\n\n if (!this._outputRenderer) {\n Logger.error('Output renderer not available');\n frame.close();\n return;\n }\n\n try {\n // Get the processor\n const processor = this._pipeline.strategy.getProcessors()[0] || null;\n\n let processedFrame: VideoFrame | null = null;\n\n if (processor) {\n // If a processor exists, process the frame first\n try {\n processedFrame = processor.process(frame);\n } catch (error) {\n Logger.error('Error processing frame:', error);\n // Use original frame if processing fails\n processedFrame = frame;\n }\n\n // If processor returns null, processing result is in processor's internal Canvas\n // Need to get ImageData from processor and render it\n if (processedFrame === null && 'getImageData' in processor) {\n const imageData = (processor as any).getImageData();\n if (imageData && this._outputCanvas && this._outputRenderer.getContext()) {\n const ctx = this._outputRenderer.getContext();\n if (ctx) {\n // Ensure canvas dimensions match\n if (this._outputCanvas.width !== imageData.width || this._outputCanvas.height !== imageData.height) {\n this._outputCanvas.width = imageData.width;\n this._outputCanvas.height = imageData.height;\n }\n // Draw processed ImageData\n ctx.putImageData(imageData, 0, 0);\n }\n }\n // Close original frame\n frame.close();\n return;\n }\n\n // If processor returns a new frame, use it; otherwise use original frame\n if (processedFrame && processedFrame !== frame) {\n // Render using processed frame\n this._outputRenderer.render(processedFrame);\n frame.close(); // Close original frame\n } else if (processedFrame === frame) {\n // Processor returned original frame (unprocessed), render directly\n this._outputRenderer.render(frame);\n } else {\n // processedFrame is null case handled above via getImageData\n // Should not reach here, but close frame for safety\n frame.close();\n }\n } else {\n // No processor configured — render the raw frame directly\n this._outputRenderer.render(frame);\n }\n } catch (error) {\n Logger.error('Error in processFrame:', error);\n frame.close(); // Ensure the frame is closed\n }\n }\n\n /**\n * Updates the output canvas dimensions\n *\n * @param {number} width - Width in pixels\n * @param {number} height - Height in pixels\n * @author sansen\n */\n public setOutputSize(width: number, height: number): void {\n if (this._outputCanvas) {\n this._outputCanvas.width = width;\n this._outputCanvas.height = height;\n Logger.info(`Output canvas size set to ${width}x${height}`);\n }\n }\n\n /**\n * Cleanup method called when the pipeline runner is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n // Clean up pipeline\n this._pipeline.dispose();\n\n // Clean up renderer\n if (this._outputRenderer) {\n this._outputRenderer.dispose();\n this._outputRenderer = null;\n }\n\n // If canvas was created by us, remove it from DOM\n if (this._outputCanvas && this._outputCanvas.parentElement === document.body) {\n document.body.removeChild(this._outputCanvas);\n }\n\n this._outputCanvas = null;\n Logger.info('Video Pipeline Runner disposed');\n }\n}\n","import { Disposable } from '@/utils/Disposable';\nimport { Logger } from '@/utils/Logger';\nimport { LocalVideoDebugSource } from './LocalVideoDebugSource';\nimport { VideoPipelineRunner } from './VideoPipelineRunner';\nimport { GreenScreenProcessor } from '@/video/processors/GreenScreenProcessor';\nimport type { VideoOptions } from '@/types/VideoOptions.d';\nimport type { GreenScreenOptions } from '@/types/VideoOptions.d';\n\n/**\n * Standalone Video Debugger\n * Completely independent from LiveKit, uses local video files for green screen processing debugging\n *\n * Features:\n * - Load local video files\n * - Extract video frames\n * - Process through green screen processor\n * - Output to Canvas (preserving transparent background)\n *\n * Usage example:\n * ```typescript\n * const debugger = new StandaloneVideoDebugger('/path/to/video.mp4', canvas);\n * await debugger.start();\n * // Video will automatically play and process\n * ```\n *\n * @author sansen\n * @class StandaloneVideoDebugger\n * @extends {Disposable}\n */\nexport class StandaloneVideoDebugger extends Disposable {\n private _videoSource: LocalVideoDebugSource;\n private readonly _pipelineRunner: VideoPipelineRunner;\n private _isRunning: boolean = false;\n private _options: VideoOptions;\n\n /**\n * Creates a standalone video debugger instance\n *\n * @param {string} videoUrl - Video file URL (can be local file path or remote URL)\n * @param {HTMLVideoElement} [videoElement] - Optional video element to use for playback\n * @param {HTMLCanvasElement} [outputCanvas] - Output canvas element (optional, will be created if not provided)\n * @param {VideoOptions} [options] - Video configuration options (including green screen settings)\n * @author sansen\n */\n constructor(videoUrl: string, videoElement?: HTMLVideoElement, outputCanvas?: HTMLCanvasElement, options?: VideoOptions) {\n super();\n\n // Create local video source (use provided videoElement if available, otherwise create internally)\n this._videoSource = new LocalVideoDebugSource(videoUrl, videoElement);\n\n // Merge options, ensure green screen processing is enabled\n this._options = {\n renderMode: 'processed',\n containerElement: videoElement as HTMLElement,\n ...options,\n };\n\n // Create processing pipeline runner\n this._pipelineRunner = new VideoPipelineRunner(this._options, videoElement, outputCanvas);\n\n // If green screen is configured, create and set up processor\n if (this._options.greenScreen?.enabled) {\n const greenScreenProcessor = new GreenScreenProcessor(this._options.greenScreen);\n this._pipelineRunner.setProcessor(greenScreenProcessor);\n Logger.info('Green screen processor enabled in debugger');\n }\n\n Logger.info('Standalone Video Debugger created');\n }\n\n /**\n * Switches video source seamlessly\n *\n * @param {string} videoUrl - New video URL\n * @param {HTMLVideoElement} [videoElement] - Optional video element to use\n * @returns {Promise<void>} Promise that resolves when source is switched\n * @author sansen\n */\n public async switchSource(videoUrl: string, videoElement?: HTMLVideoElement): Promise<void> {\n this.ensureNotDisposed();\n\n const oldSource = this._videoSource;\n const wasRunning = this._isRunning;\n\n // Create and preload new source\n const newSource = new LocalVideoDebugSource(videoUrl, videoElement);\n try {\n await newSource.load();\n\n // If currently running, start new source playback and register frame callback\n if (wasRunning) {\n await newSource.play();\n }\n\n // Register frame callback\n newSource.onFrame((frame) => {\n this._pipelineRunner.processFrame(frame).catch((error) => {\n Logger.error('Error processing frame:', error);\n });\n });\n\n // Switch reference\n this._videoSource = newSource;\n\n // If previously running, stop and cleanup old source (after new source is ready)\n try {\n oldSource.offFrame();\n oldSource.stop();\n oldSource.dispose();\n } catch (e) {\n console.warn('Error disposing old video source during switch:', e);\n // Ignore cleanup errors\n }\n\n // If new source is ready and output dimensions are unknown, update output dimensions\n const width = this._videoSource.videoWidth;\n const height = this._videoSource.videoHeight;\n if (width > 0 && height > 0) {\n this._pipelineRunner.setOutputSize(width, height);\n }\n } catch (error) {\n // If new source initialization fails, keep old source unchanged\n Logger.error('Failed to switch video source:', error);\n try {\n newSource.dispose();\n } catch (e) {\n console.warn('Error disposing new video source after failed switch:', e);\n // ignore\n }\n throw error;\n }\n }\n\n /**\n * Gets the output canvas element\n *\n * @type {HTMLCanvasElement|null}\n * @author sansen\n */\n public get outputCanvas(): HTMLCanvasElement | null {\n return this._pipelineRunner.outputCanvas;\n }\n\n /**\n * Gets the video source instance\n *\n * @type {LocalVideoDebugSource}\n * @author sansen\n */\n public get videoSource(): LocalVideoDebugSource {\n return this._videoSource;\n }\n\n /**\n * Gets the current video processor\n *\n * @type {import('../video/video.d').IVideoProcessor|null}\n * @author sansen\n */\n public get processor(): import('../video/video.d').IVideoProcessor | null {\n return this._pipelineRunner.processor;\n }\n\n /**\n * Sets a new video processor\n *\n * @param {import('../video/video.d').IVideoProcessor|null} processor - Video processor to use\n * @author sansen\n */\n public setProcessor(processor: import('../video/video.d').IVideoProcessor | null): void {\n this._pipelineRunner.setProcessor(processor);\n }\n\n /**\n * Updates green screen configuration options\n *\n * @param {Partial<GreenScreenOptions>} greenScreenOptions - Green screen configuration options\n * @author sansen\n */\n public updateGreenScreenOptions(greenScreenOptions: Partial<GreenScreenOptions>): void {\n const processor = this._pipelineRunner.processor;\n if (processor && 'updateOptions' in processor && typeof processor.updateOptions === 'function') {\n (processor as any).updateOptions(greenScreenOptions);\n Logger.info('Green screen options updated');\n } else {\n // If processor doesn't exist or isn't GreenScreenProcessor, create a new one\n const currentOptions = this._options.greenScreen || { enabled: false };\n const newOptions: GreenScreenOptions = {\n ...currentOptions,\n ...greenScreenOptions,\n enabled: greenScreenOptions.enabled !== undefined ? greenScreenOptions.enabled : currentOptions.enabled,\n };\n\n const greenScreenProcessor = new GreenScreenProcessor(newOptions);\n this._pipelineRunner.setProcessor(greenScreenProcessor);\n this._options.greenScreen = newOptions;\n Logger.info('Green screen processor recreated with new options');\n }\n }\n\n /**\n * Initializes and loads the video\n *\n * @returns {Promise<void>} Promise that resolves when initialization is complete\n * @author sansen\n */\n public async initialize(): Promise<void> {\n this.ensureNotDisposed();\n\n try {\n // Load video\n await this._videoSource.load();\n\n // Set output canvas dimensions to match video dimensions\n const width = this._videoSource.videoWidth;\n const height = this._videoSource.videoHeight;\n if (width > 0 && height > 0) {\n this._pipelineRunner.setOutputSize(width, height);\n }\n\n Logger.info('Video debugger initialized');\n } catch (error) {\n Logger.error('Failed to initialize video debugger:', error);\n throw error;\n }\n }\n\n /**\n * Starts debugging (loads video and begins processing)\n *\n * @returns {Promise<void>} Promise that resolves when debugging is started\n * @author sansen\n */\n public async start(): Promise<void> {\n this.ensureNotDisposed();\n\n if (this._isRunning) {\n Logger.warn('Debugger is already running');\n return;\n }\n\n try {\n // Initialize if not already initialized\n if (this._videoSource.videoWidth === 0) {\n await this.initialize();\n }\n\n // Start video playback\n await this._videoSource.play();\n\n // Register frame callback\n this._videoSource.onFrame((frame) => {\n // Process frame and render to canvas\n this._pipelineRunner.processFrame(frame).catch((error) => {\n Logger.error('Error processing frame:', error);\n });\n });\n\n this._isRunning = true;\n Logger.info('Video debugger started');\n } catch (error) {\n Logger.error('Failed to start video debugger:', error);\n throw error;\n }\n }\n\n /**\n * Stops debugging\n *\n * @author sansen\n */\n public stop(): void {\n if (!this._isRunning) {\n return;\n }\n\n // Stop video playback\n this._videoSource.stop();\n\n // Remove frame callback\n this._videoSource.offFrame();\n\n this._isRunning = false;\n Logger.info('Video debugger stopped');\n }\n\n /**\n * Pauses debugging\n *\n * @author sansen\n */\n public pause(): void {\n if (this._isRunning) {\n this._videoSource.pause();\n Logger.info('Video debugger paused');\n }\n }\n\n /**\n * Resumes debugging\n *\n * @returns {Promise<void>} Promise that resolves when debugging is resumed\n * @author sansen\n */\n public async resume(): Promise<void> {\n if (this._isRunning) {\n await this._videoSource.play();\n Logger.info('Video debugger resumed');\n }\n }\n\n /**\n * Checks if debugger is currently running\n *\n * @type {boolean}\n * @author sansen\n */\n public get isRunning(): boolean {\n return this._isRunning;\n }\n\n /**\n * Cleanup method called when the debugger is disposed\n *\n * @protected\n * @author sansen\n */\n protected onDispose(): void {\n this.stop();\n this._videoSource.dispose();\n this._pipelineRunner.dispose();\n Logger.info('Standalone Video Debugger disposed');\n }\n}\n"],"names":[],"mappings":"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"}
|