@vivix-ai/ivi-frontend-sdk 0.3.3 → 0.3.4

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/logger.ts","../src/runtime/runtime-dispatcher.ts","../src/runtime/handlers/session-event-handler.ts","../src/runtime/handlers/stage-event-handler.ts","../src/runtime/handlers/track-event-handler.ts","../src/runtime/handlers/source-event-handler.ts","../src/runtime/handlers/stream-event-handler.ts","../src/runtime/handlers/conversation-event-handler.ts","../src/runtime/managers/session-manager.ts","../src/runtime/managers/stage-manager.ts","../src/runtime/managers/track-manager.ts","../src/runtime/managers/source-manager.ts","../src/runtime/managers/stream-manager.ts","../src/runtime/managers/conversation-manager.ts","../src/runtime/managers/trtc-source-manager.ts","../src/runtime/livekit-types.ts","../src/runtime/managers/livekit-source-manager.ts","../src/runtime/runtime-coordinator.ts","../src/sdk.ts","../src/react/stage-view-context.ts","../src/react/use-runtime-state.ts","../src/react/ivi-stage-view.tsx","../src/react/ivi-volume-control.tsx","../src/react/use-ivi-subtitles.ts","../src/react/ivi-subtitle-overlay.tsx","../src/react/use-ivi-stage-view.ts","../src/react/ivi-trtc-player.tsx","../src/react/ivi-livekit-player.tsx","../src/react/ivi-flv-video.tsx","../src/react/ivi-hls-video.tsx","../src/react/internal/track-slot-media.tsx","../src/react/internal/use-multi-preload-sources.ts","../src/react/ivi-track-slot.tsx","../src/react/use-managed-ivi-runtime.ts"],"names":["snapshotMap","session","TAG","enforceContainMedia","ReceiveConversationItemAddedEvent","ReceiveConversationItemDoneEvent","ReceiveResponseCreatedEvent","useEffect","useState","jsx","useMemo","useRef","jsxs","useCallback","IviClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeLogCallback } from \"./types\";\n\n/**\n * 日志前缀:`[IVI-EVT]` 标记\"收到事件\"。\n * 调试时可通过该前缀快速过滤事件流。\n */\nconst EVENT_LOG_PREFIX = \"[IVI-EVT]\";\n\n/**\n * 日志前缀:`[IVI-STATE]` 标记\"runtime 内部状态发生变化\"。\n * 调试时可通过该前缀快速过滤状态变更。\n */\nconst STATE_LOG_PREFIX = \"[IVI-STATE]\";\n\nlet activeLogCallback: IviRuntimeLogCallback | undefined;\n\nexport function runWithIviRuntimeLogCallback<T>(\n onLog: IviRuntimeLogCallback | undefined,\n fn: () => T\n): T {\n const previous = activeLogCallback;\n activeLogCallback = onLog;\n try {\n return fn();\n } finally {\n activeLogCallback = previous;\n }\n}\n\n/**\n * 打印\"收到事件\"日志,附带事件完整 payload。\n */\nexport function logIviEventReceived(event: ParsedIviEvent): void {\n const message = `${EVENT_LOG_PREFIX} ${event.type}`;\n activeLogCallback?.({\n level: \"info\",\n tag: EVENT_LOG_PREFIX,\n message,\n args: [message, event.raw],\n data: event.raw\n });\n}\n\n/**\n * 打印\"实例状态变更\"日志。\n *\n * @param entity 被变更的实体类别(例如 \"source\"、\"track\"、\"stream\"、\"stage\"、\"session\"、\"conversation\")\n * @param key 实体主键;对于单例(如 session/stage)可传 null\n * @param eventType 引发变更的事件类型\n * @param before 变更前实例快照(不存在时传 undefined)\n * @param after 变更后实例快照(被删除时传 undefined)\n */\nexport function logIviStateChange(\n entity: string,\n key: string | null,\n eventType: string,\n before: unknown,\n after: unknown\n): void {\n if (!didChange(before, after)) {\n return;\n }\n const label = key === null ? entity : `${entity}[${key}]`;\n const message = `${STATE_LOG_PREFIX} ${label} <- ${eventType}`;\n const data = {\n before,\n after\n };\n activeLogCallback?.({\n level: \"info\",\n tag: STATE_LOG_PREFIX,\n message,\n args: [message, data],\n data\n });\n}\n\nfunction didChange(before: unknown, after: unknown): boolean {\n if (before === after) return false;\n if (before === undefined || after === undefined) return true;\n try {\n return JSON.stringify(before) !== JSON.stringify(after);\n } catch {\n return true;\n }\n}\n","import type { IviClient, ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeConnectionListener, IviRuntimeLogCallback } from \"./types\";\nimport { logIviEventReceived, runWithIviRuntimeLogCallback } from \"./logger\";\n\nexport interface IviRuntimeEventHandler {\n handle(event: ParsedIviEvent): void;\n}\n\nexport interface IviRuntimeDispatcherCallbacks {\n sessionHandler: IviRuntimeEventHandler;\n stageHandler: IviRuntimeEventHandler;\n trackHandler: IviRuntimeEventHandler;\n sourceHandler: IviRuntimeEventHandler;\n streamHandler: IviRuntimeEventHandler;\n conversationHandler: IviRuntimeEventHandler;\n onConnectionChange: IviRuntimeConnectionListener;\n onEvent?: (event: ParsedIviEvent) => void;\n onLog?: IviRuntimeLogCallback;\n}\n\nexport class IviRuntimeDispatcher {\n private readonly client: IviClient;\n private readonly callbacks: IviRuntimeDispatcherCallbacks;\n private unsubscribeEvent: (() => void) | null = null;\n private unsubscribeConnection: (() => void) | null = null;\n\n public constructor(client: IviClient, callbacks: IviRuntimeDispatcherCallbacks) {\n this.client = client;\n this.callbacks = callbacks;\n }\n\n public start(): void {\n if (this.unsubscribeEvent || this.unsubscribeConnection) {\n return;\n }\n\n this.unsubscribeEvent = this.client.onEvent((event) => {\n this.dispatchEvent(event);\n });\n\n this.unsubscribeConnection = this.client.onConnectionChange((connected) => {\n this.callbacks.onConnectionChange(connected);\n });\n }\n\n public stop(): void {\n this.unsubscribeEvent?.();\n this.unsubscribeEvent = null;\n this.unsubscribeConnection?.();\n this.unsubscribeConnection = null;\n }\n\n private dispatchEvent(event: ParsedIviEvent): void {\n runWithIviRuntimeLogCallback(this.callbacks.onLog, () => {\n logIviEventReceived(event);\n if (event.type === \"session.created\" || event.type === \"session.ended\") {\n this.callbacks.sessionHandler.handle(event);\n } else if (event.type.startsWith(\"session.stage.\")) {\n this.callbacks.stageHandler.handle(event);\n } else if (event.type.startsWith(\"session.track.\") || event.type.startsWith(\"session.tracks.\")) {\n this.callbacks.trackHandler.handle(event);\n } else if (event.type.startsWith(\"session.source.\") || event.type.startsWith(\"session.sources.\")) {\n this.callbacks.sourceHandler.handle(event);\n } else if (event.type.startsWith(\"session.stream.\") || event.type.startsWith(\"session.streams.\")) {\n this.callbacks.streamHandler.handle(event);\n } else if (event.type.startsWith(\"conversation.\") || event.type.startsWith(\"response.\")) {\n this.callbacks.conversationHandler.handle(event);\n }\n });\n\n this.callbacks.onEvent?.(event);\n }\n}\n","import { ReceiveSessionCreatedEvent, ReceiveSessionEndedEvent, type ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { SessionManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface SessionEventHandlerCallbacks {\n onSessionCreated(event: ReceiveSessionCreatedEvent): void;\n onSessionEnded(event: ReceiveSessionEndedEvent): void;\n}\n\nexport class SessionEventHandler {\n private readonly sessionManager: SessionManager;\n private readonly callbacks: SessionEventHandlerCallbacks;\n\n public constructor(sessionManager: SessionManager, callbacks: SessionEventHandlerCallbacks) {\n this.sessionManager = sessionManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): void {\n if (event instanceof ReceiveSessionCreatedEvent) {\n const before = this.sessionManager.getSession();\n this.sessionManager.setSession(event.session);\n logIviStateChange(\"session\", null, event.type, before, this.sessionManager.getSession());\n this.callbacks.onSessionCreated(event);\n return;\n }\n if (event instanceof ReceiveSessionEndedEvent) {\n this.callbacks.onSessionEnded(event);\n }\n }\n}\n","import {\n ReceiveSessionStageGetResponseEvent,\n ReceiveSessionStageUpdatedEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { StageManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface StageEventHandlerCallbacks {\n onStageChanged(result: {\n fromStageGetResponse: boolean;\n }): void;\n}\n\nexport interface StageHandleResult {\n handled: boolean;\n fromStageGetResponse: boolean;\n}\n\nexport class StageEventHandler {\n private readonly stageManager: StageManager;\n private readonly callbacks: StageEventHandlerCallbacks;\n\n public constructor(stageManager: StageManager, callbacks: StageEventHandlerCallbacks) {\n this.stageManager = stageManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): StageHandleResult {\n if (\n !(event instanceof ReceiveSessionStageGetResponseEvent) &&\n !(event instanceof ReceiveSessionStageUpdatedEvent)\n ) {\n return {\n handled: false,\n fromStageGetResponse: false\n };\n }\n const before = this.stageManager.getStage();\n this.stageManager.setStage(event.stage);\n logIviStateChange(\"stage\", null, event.type, before, this.stageManager.getStage());\n const result = {\n handled: true,\n fromStageGetResponse: event instanceof ReceiveSessionStageGetResponseEvent\n };\n this.callbacks.onStageChanged({\n fromStageGetResponse: result.fromStageGetResponse\n });\n return result;\n }\n}\n","import {\n ReceiveSessionTrackCuedEvent,\n ReceiveSessionTrackCreatedEvent,\n ReceiveSessionTrackDeletedEvent,\n ReceiveSessionTrackNextSetEvent,\n ReceiveSessionTrackTookEvent,\n ReceiveSessionTracksListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { TrackManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface TrackEventHandlerCallbacks {\n onTracksChanged(result: {\n listRefreshed: boolean;\n }): void;\n}\n\nexport interface TrackHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class TrackEventHandler {\n private readonly trackManager: TrackManager;\n private readonly callbacks: TrackEventHandlerCallbacks;\n\n public constructor(trackManager: TrackManager, callbacks: TrackEventHandlerCallbacks) {\n this.trackManager = trackManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): TrackHandleResult {\n if (event instanceof ReceiveSessionTrackCreatedEvent) {\n const trackId = event.track.track_id;\n const before = this.trackManager.getAll().get(trackId);\n this.trackManager.upsert(event.track);\n logIviStateChange(\"track\", trackId, event.type, before, this.trackManager.getAll().get(trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackDeletedEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.remove(event.trackId);\n logIviStateChange(\"track\", event.trackId, event.type, before, undefined);\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackTookEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n if (before?.active_source_id === event.sourceId) {\n return { handled: true, listRefreshed: false };\n }\n this.trackManager.applyTrackTook(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackCuedEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.applyTrackCued(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackNextSetEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.applyTrackNextSet(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTracksListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.trackManager.getAll());\n this.trackManager.replaceAll(event.tracks);\n logIviStateChange(\"tracks(list)\", null, event.type, beforeSnapshot, snapshotMap(this.trackManager.getAll()));\n this.callbacks.onTracksChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n ReceiveSessionSourceClearPreloadEvent,\n ReceiveSessionSourceCreatedEvent,\n ReceiveSessionSourceDeletedEvent,\n ReceiveSessionSourceFailedEvent,\n ReceiveSessionSourcePlaybackCompletedEvent,\n ReceiveSessionSourcePreloadEvent,\n ReceiveSessionSourceReadyEvent,\n ReceiveSessionSourcesListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { SourceManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface SourceEventHandlerCallbacks {\n onSourcesChanged(result: {\n listRefreshed: boolean;\n }): void;\n}\n\nexport interface SourceHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class SourceEventHandler {\n private readonly sourceManager: SourceManager;\n private readonly callbacks: SourceEventHandlerCallbacks;\n\n public constructor(sourceManager: SourceManager, callbacks: SourceEventHandlerCallbacks) {\n this.sourceManager = sourceManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): SourceHandleResult {\n if (event instanceof ReceiveSessionSourceCreatedEvent) {\n const sourceId = event.source.source_id;\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.upsertCreated(event.source);\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceReadyEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.markReady({\n sourceId: event.sourceId,\n kind: event.kind,\n assetType: event.assetType,\n playback: event.playback,\n width: event.width,\n height: event.height,\n durationMs: event.durationMs,\n hasAudio: event.hasAudio\n });\n logIviStateChange(\"source\", event.sourceId, event.type, before, this.sourceManager.get(event.sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceFailedEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.markFailed(event.sourceId, event.error);\n logIviStateChange(\"source\", event.sourceId, event.type, before, this.sourceManager.get(event.sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceDeletedEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.remove(event.sourceId);\n logIviStateChange(\"source\", event.sourceId, event.type, before, undefined);\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourcePreloadEvent) {\n for (const source of event.sources) {\n const sourceId = source.source_id;\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.upsertCreated(source);\n this.sourceManager.applyPreload(sourceId, {\n autoclearAfterPlay: event.autoclearAfterPlay ?? true\n });\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n }\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceClearPreloadEvent) {\n for (const sourceId of event.sourceIds ?? []) {\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.clearPreload(sourceId);\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n }\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourcesListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.sourceManager.getAll());\n this.sourceManager.replaceAll(event.sources);\n logIviStateChange(\"sources(list)\", null, event.type, beforeSnapshot, snapshotMap(this.sourceManager.getAll()));\n this.callbacks.onSourcesChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n if (event instanceof ReceiveSessionSourcePlaybackCompletedEvent) {\n return { handled: true, listRefreshed: false };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n ReceiveSessionStreamCreatedEvent,\n ReceiveSessionStreamStartedEvent,\n ReceiveSessionStreamEndedEvent,\n ReceiveSessionStreamFailedEvent,\n ReceiveSessionStreamDeletedEvent,\n ReceiveSessionStreamsListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { StreamManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface StreamEventHandlerCallbacks {\n onStreamsChanged(result: { listRefreshed: boolean }): void;\n}\n\nexport interface StreamHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class StreamEventHandler {\n private readonly streamManager: StreamManager;\n private readonly callbacks: StreamEventHandlerCallbacks;\n\n public constructor(streamManager: StreamManager, callbacks: StreamEventHandlerCallbacks) {\n this.streamManager = streamManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): StreamHandleResult {\n if (event instanceof ReceiveSessionStreamCreatedEvent) {\n const streamId = event.stream.stream_id;\n const before = this.streamManager.getAll().get(streamId);\n this.streamManager.upsertCreated(event.stream);\n logIviStateChange(\"stream\", streamId, event.type, before, this.streamManager.getAll().get(streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamStartedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markStarted(event.streamId, event.trackId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamEndedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markEnded(event.streamId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamFailedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markFailed(event.streamId, event.error);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamDeletedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.remove(event.streamId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, undefined);\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamsListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.streamManager.getAll());\n this.streamManager.replaceAll(event.streams);\n logIviStateChange(\"streams(list)\", null, event.type, beforeSnapshot, snapshotMap(this.streamManager.getAll()));\n this.callbacks.onStreamsChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n type IviConversationItem,\n ReceiveConversationItemAddedEvent,\n ReceiveConversationItemDoneEvent,\n ReceiveConversationListResponseEvent,\n ReceiveResponseCreatedEvent,\n ReceiveResponseDoneEvent,\n ReceiveResponseOutputAudioTranscriptDeltaEvent,\n ReceiveResponseOutputAudioTranscriptDoneEvent,\n ReceiveResponseOutputTextDeltaEvent,\n ReceiveResponseOutputTextDoneEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviConversationItemWithId } from \"../sdk-types\";\nimport type { ConversationManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface ConversationEventHandlerCallbacks {\n onConversationsChanged(): void;\n}\n\nexport interface ConversationHandleResult {\n handled: boolean;\n}\n\nexport class ConversationEventHandler {\n private readonly conversationManager: ConversationManager;\n private readonly callbacks: ConversationEventHandlerCallbacks;\n\n public constructor(conversationManager: ConversationManager, callbacks: ConversationEventHandlerCallbacks) {\n this.conversationManager = conversationManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): ConversationHandleResult {\n if (event instanceof ReceiveConversationListResponseEvent) {\n const before = snapshotMap(this.conversationManager.getAllMap());\n this.conversationManager.replaceAll(event.items.filter(hasConversationItemId));\n logIviStateChange(\n \"conversations(list)\",\n null,\n event.type,\n before,\n snapshotMap(this.conversationManager.getAllMap())\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveConversationItemAddedEvent) {\n if (!hasConversationItemId(event.item)) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.item.id);\n this.conversationManager.upsertAdded(event.item);\n logIviStateChange(\n \"conversationItem\",\n event.item.id,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.item.id)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveConversationItemDoneEvent) {\n if (!hasConversationItemId(event.item)) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.item.id);\n this.conversationManager.markDone(event.item);\n logIviStateChange(\n \"conversationItem\",\n event.item.id,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.item.id)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputTextDeltaEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTextDelta(event.itemId, event.delta);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputTextDoneEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTextDone(event.itemId, event.text);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputAudioTranscriptDeltaEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTranscriptDelta(event.itemId, event.delta);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputAudioTranscriptDoneEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTranscriptDone(event.itemId, event.transcript);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseDoneEvent) {\n if (event.response.id) {\n const itemId = `item_${event.response.id}`;\n const before = this.conversationManager.getAllMap().get(itemId);\n this.conversationManager.markModelItemStatusFromResponse(event.response.id, event.response.status);\n logIviStateChange(\n \"conversationItem\",\n itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(itemId)\n );\n this.callbacks.onConversationsChanged();\n }\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseCreatedEvent) {\n return { handled: true };\n }\n\n return { handled: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n\nfunction hasConversationItemId(item: IviConversationItem): item is IviConversationItemWithId {\n return typeof item.id === \"string\" && item.id.length > 0;\n}\n","import type { IviRealtimeSessionConfig } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class SessionManager {\n private session: IviRealtimeSessionConfig | null = null;\n\n public setSession(session: IviRealtimeSessionConfig): void {\n this.session = session;\n }\n\n public getSession(): IviRealtimeSessionConfig | null {\n return this.session;\n }\n\n public reset(): void {\n this.session = null;\n }\n}\n","import type { IviStageComposition } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class StageManager {\n private stage: IviStageComposition | null = null;\n\n public setStage(stage: IviStageComposition): void {\n this.stage = stage;\n }\n\n public getStage(): IviStageComposition | null {\n return this.stage;\n }\n\n public reset(): void {\n this.stage = null;\n }\n}\n","import type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class TrackManager {\n private tracks = new Map<string, IviTrack>();\n\n private patchTrack(trackId: string, patch: Partial<IviTrack>): void {\n const next = new Map(this.tracks);\n const current = next.get(trackId) ?? { track_id: trackId };\n next.set(trackId, {\n ...current,\n ...patch\n });\n this.tracks = next;\n }\n\n public upsert(track: IviTrack): void {\n const next = new Map(this.tracks);\n next.set(track.track_id, track);\n this.tracks = next;\n }\n\n public remove(trackId: string): void {\n const next = new Map(this.tracks);\n next.delete(trackId);\n this.tracks = next;\n }\n\n public replaceAll(tracks: IviTrack[]): void {\n const next = new Map<string, IviTrack>();\n tracks.forEach((track) => next.set(track.track_id, track));\n this.tracks = next;\n }\n\n public applyTrackTook(trackId: string, sourceId?: string): void {\n const current = this.tracks.get(trackId);\n const resolvedSourceId = sourceId ?? current?.next_source_id ?? null;\n if (!resolvedSourceId) {\n return;\n }\n this.patchTrack(trackId, {\n active_source_id: resolvedSourceId,\n next_source_id: undefined\n });\n }\n\n public applyTrackCued(trackId: string, sourceId: string): void {\n this.patchTrack(trackId, {\n active_source_id: sourceId,\n next_source_id: undefined\n });\n }\n\n public applyTrackNextSet(trackId: string, sourceId: string): void {\n this.patchTrack(trackId, {\n next_source_id: sourceId\n });\n }\n\n public findTrackIdByActiveSource(sourceId: string): string | null {\n for (const [trackId, track] of this.tracks) {\n if (track.active_source_id === sourceId) return trackId;\n }\n return null;\n }\n\n public has(trackId: string): boolean {\n return this.tracks.has(trackId);\n }\n\n public getAll(): Map<string, IviTrack> {\n return this.tracks;\n }\n\n public reset(): void {\n this.tracks = new Map();\n }\n}\n","import type {\n IviSourceAsset,\n IviTrack,\n ReceiveSessionSourceFailedPayload,\n ReceiveSessionSourceReadyPayload\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeSource, IviRuntimeSourcePreloadState } from \"../types\";\n\ntype IviListedSource = IviSourceAsset & {\n playback?: ReceiveSessionSourceReadyPayload[\"playback\"];\n};\n\nexport class SourceManager {\n private sources = new Map<string, IviRuntimeSource>();\n /**\n * 记录本次运行期间曾经被某个 track 的 active/next 槽引用过的 source id 集合。\n * 用于 autoclearAfterPlay 判定:只有曾经\"上过 track\"的 source,在其离开 track 时才需要清理预加载。\n */\n private sourcesEverReferencedByTrack = new Set<string>();\n\n public upsertCreated(source: IviSourceAsset): void {\n const previous = this.sources.get(source.source_id);\n const next = new Map(this.sources);\n next.set(source.source_id, {\n source,\n status: previous?.status === \"ready\" ? \"ready\" : \"created\",\n playback: previous?.playback,\n width: previous?.width,\n height: previous?.height,\n durationMs: previous?.durationMs,\n hasAudio: previous?.hasAudio,\n error: previous?.status === \"failed\" ? previous.error : undefined,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public markReady(payload: {\n sourceId: ReceiveSessionSourceReadyPayload[\"source_id\"];\n kind: ReceiveSessionSourceReadyPayload[\"kind\"];\n assetType: ReceiveSessionSourceReadyPayload[\"asset_type\"];\n playback: ReceiveSessionSourceReadyPayload[\"playback\"];\n width: ReceiveSessionSourceReadyPayload[\"width\"];\n height: ReceiveSessionSourceReadyPayload[\"height\"];\n durationMs: ReceiveSessionSourceReadyPayload[\"duration_ms\"];\n hasAudio: ReceiveSessionSourceReadyPayload[\"has_audio\"];\n }): void {\n const previous = this.sources.get(payload.sourceId);\n const next = new Map(this.sources);\n next.set(payload.sourceId, {\n source: previous?.source ?? this.buildReadyFallbackSource(payload.sourceId, payload.kind, payload.assetType),\n status: \"ready\",\n playback: payload.playback,\n width: payload.width,\n height: payload.height,\n durationMs: payload.durationMs,\n hasAudio: payload.hasAudio,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public markFailed(sourceId: string, error: ReceiveSessionSourceFailedPayload[\"error\"]): void {\n const previous = this.sources.get(sourceId);\n const next = new Map(this.sources);\n next.set(sourceId, {\n source:\n previous?.source ??\n ({\n source_id: sourceId,\n kind: \"stream\",\n url: \"\"\n } as IviSourceAsset),\n status: \"failed\",\n playback: previous?.playback,\n width: previous?.width,\n height: previous?.height,\n durationMs: previous?.durationMs,\n hasAudio: previous?.hasAudio,\n error,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public remove(sourceId: string): void {\n const next = new Map(this.sources);\n next.delete(sourceId);\n this.sources = next;\n this.sourcesEverReferencedByTrack.delete(sourceId);\n }\n\n public replaceAll(sources: IviListedSource[]): void {\n const next = new Map<string, IviRuntimeSource>();\n sources.forEach((source) => {\n const previous = this.sources.get(source.source_id);\n next.set(source.source_id, {\n source,\n status: source.playback ? \"ready\" : \"created\",\n playback: source.playback,\n preload: previous?.preload\n });\n });\n this.sources = next;\n }\n\n /**\n * 应用一次显式预加载。若 source 目前尚未注册,会建立一个占位实例,\n * 待后续 `session.source.created` / `ready` 事件补齐字段。\n */\n public applyPreload(sourceId: string, state: IviRuntimeSourcePreloadState): void {\n const previous = this.sources.get(sourceId);\n const next = new Map(this.sources);\n if (previous) {\n next.set(sourceId, {\n ...previous,\n preload: state\n });\n } else {\n next.set(sourceId, {\n source: {\n source_id: sourceId,\n kind: \"stream\",\n url: \"\"\n } as IviSourceAsset,\n status: \"created\",\n preload: state\n });\n }\n this.sources = next;\n }\n\n /**\n * 清除指定 source 的预加载标记。\n */\n public clearPreload(sourceId: string): void {\n const previous = this.sources.get(sourceId);\n if (!previous || !previous.preload) return;\n const next = new Map(this.sources);\n next.set(sourceId, {\n ...previous,\n preload: undefined\n });\n this.sources = next;\n }\n\n /**\n * 根据当前 tracks 状态同步 source 运行态:\n * 1) 将 track 的 active/next 引用的 source 由 `created` 提升为 `ready`(保留既有行为)。\n * 2) 对当前不再被任何 track 引用、且 `preload.autoclearAfterPlay === true`、\n * 且历史上曾经被 track 引用过的 source,自动清除其预加载标记。\n */\n public syncWithTracks(tracks: Map<string, IviTrack>): void {\n const currentlyReferencedIds = new Set<string>();\n tracks.forEach((track) => {\n if (track.active_source_id) {\n currentlyReferencedIds.add(track.active_source_id);\n }\n if (track.next_source_id) {\n currentlyReferencedIds.add(track.next_source_id);\n }\n });\n\n const next = new Map(this.sources);\n let changed = false;\n\n currentlyReferencedIds.forEach((sourceId) => {\n if (!this.sourcesEverReferencedByTrack.has(sourceId)) {\n this.sourcesEverReferencedByTrack.add(sourceId);\n }\n const existing = next.get(sourceId);\n if (!existing) return;\n if (existing.status === \"created\") {\n next.set(sourceId, {\n ...existing,\n status: \"ready\"\n });\n changed = true;\n }\n });\n\n next.forEach((source, sourceId) => {\n if (!source.preload || !source.preload.autoclearAfterPlay) return;\n if (currentlyReferencedIds.has(sourceId)) return;\n if (!this.sourcesEverReferencedByTrack.has(sourceId)) return;\n next.set(sourceId, {\n ...source,\n preload: undefined\n });\n changed = true;\n });\n\n if (changed) {\n this.sources = next;\n }\n }\n\n public has(sourceId: string): boolean {\n return this.sources.has(sourceId);\n }\n\n public get(sourceId: string): IviRuntimeSource | undefined {\n return this.sources.get(sourceId);\n }\n\n public getAll(): Map<string, IviRuntimeSource> {\n return this.sources;\n }\n\n public reset(): void {\n this.sources = new Map();\n this.sourcesEverReferencedByTrack = new Set();\n }\n\n private buildReadyFallbackSource(\n sourceId: string,\n kind: ReceiveSessionSourceReadyPayload[\"kind\"],\n assetType: ReceiveSessionSourceReadyPayload[\"asset_type\"]\n ): IviSourceAsset {\n return {\n source_id: sourceId,\n kind,\n asset_type: assetType\n };\n }\n}\n","import type { IviStream } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeStream } from \"../types\";\n\nexport class StreamManager {\n private streams = new Map<string, IviRuntimeStream>();\n\n public upsertCreated(stream: IviStream): void {\n const next = new Map(this.streams);\n next.set(stream.stream_id, {\n stream,\n status: stream.status\n });\n this.streams = next;\n }\n\n public markStarted(streamId: string, trackId?: string): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"active\",\n stream: { ...previous.stream, status: \"active\" },\n trackId\n });\n this.streams = next;\n }\n\n public markEnded(streamId: string): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"ended\",\n stream: { ...previous.stream, status: \"ended\" }\n });\n this.streams = next;\n }\n\n public markFailed(streamId: string, error: unknown): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"failed\",\n stream: { ...previous.stream, status: \"failed\" },\n error\n });\n this.streams = next;\n }\n\n public remove(streamId: string): void {\n const next = new Map(this.streams);\n next.delete(streamId);\n this.streams = next;\n }\n\n public replaceAll(streams: IviStream[]): void {\n const next = new Map<string, IviRuntimeStream>();\n streams.forEach((stream) => {\n const previous = this.streams.get(stream.stream_id);\n next.set(stream.stream_id, {\n stream,\n status: stream.status,\n trackId: previous?.trackId\n });\n });\n this.streams = next;\n }\n\n public has(streamId: string): boolean {\n return this.streams.has(streamId);\n }\n\n public getAll(): Map<string, IviRuntimeStream> {\n return this.streams;\n }\n\n public reset(): void {\n this.streams = new Map();\n }\n}\n","import type { IviConversationItem, IviConversationItemContent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviConversationItemWithId, IviRealtimeResponseStatus } from \"../sdk-types\";\nimport type { IviRuntimeConversationItem, IviRuntimeConversationStatus } from \"../types\";\n\nexport class ConversationManager {\n private items = new Map<string, IviRuntimeConversationItem>();\n private order: string[] = [];\n\n public replaceAll(items: IviConversationItemWithId[]): void {\n const nextItems = new Map<string, IviRuntimeConversationItem>();\n const nextOrder: string[] = [];\n items.forEach((item) => {\n const runtimeItem = this.buildRuntimeItem(item, item.status === \"in_progress\" ? \"added\" : \"done\");\n nextItems.set(runtimeItem.id, runtimeItem);\n nextOrder.push(runtimeItem.id);\n });\n this.items = nextItems;\n this.order = nextOrder;\n }\n\n public upsertAdded(item: IviConversationItemWithId): void {\n const previous = this.items.get(item.id);\n const next = new Map(this.items);\n const mergedItem = this.mergeConversationItem(previous?.item, item);\n const mergedText = this.extractText(mergedItem.content);\n const mergedTranscript = this.extractTranscript(mergedItem.content);\n const runtimeItem = this.buildRuntimeItem(\n mergedItem,\n \"added\",\n mergedText || previous?.text || \"\",\n mergedTranscript || previous?.transcript || \"\"\n );\n next.set(item.id, runtimeItem);\n this.items = next;\n this.ensureOrder(item.id);\n }\n\n public markDone(item: IviConversationItemWithId): void {\n const previous = this.items.get(item.id);\n const next = new Map(this.items);\n const mergedItem = this.mergeConversationItem(previous?.item, item);\n const mergedText = this.extractText(mergedItem.content);\n const mergedTranscript = this.extractTranscript(mergedItem.content);\n const runtimeItem = this.buildRuntimeItem(\n mergedItem,\n \"done\",\n mergedText || previous?.text || \"\",\n mergedTranscript || previous?.transcript || \"\"\n );\n if (runtimeItem.role === \"model\" && previous && previous.status !== \"in_progress\") {\n runtimeItem.status = previous.status;\n runtimeItem.item = {\n ...runtimeItem.item,\n status: previous.status\n };\n }\n next.set(item.id, runtimeItem);\n this.items = next;\n this.ensureOrder(item.id);\n }\n\n public applyTextDelta(itemId: string, delta: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: `${existing.text}${delta}`,\n transcript: existing.transcript,\n content: this.upsertContentText(existing.content, `${existing.text}${delta}`)\n });\n }\n\n public applyTextDone(itemId: string, text: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text,\n transcript: existing.transcript,\n content: this.upsertContentText(existing.content, text)\n });\n }\n\n public applyTranscriptDelta(itemId: string, delta: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: existing.text,\n transcript: `${existing.transcript}${delta}`,\n content: this.upsertContentTranscript(existing.content, `${existing.transcript}${delta}`)\n });\n }\n\n public applyTranscriptDone(itemId: string, transcript: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: existing.text,\n transcript,\n content: this.upsertContentTranscript(existing.content, transcript)\n });\n }\n\n public markModelItemStatusFromResponse(responseId: string, status: IviRealtimeResponseStatus | undefined): void {\n const itemId = `item_${responseId}`;\n const existing = this.items.get(itemId);\n if (!existing || existing.role !== \"model\") {\n return;\n }\n const nextStatus = this.mapResponseStatusToConversationStatus(status);\n const next = new Map(this.items);\n next.set(itemId, {\n ...existing,\n lifecycle: \"done\",\n status: nextStatus,\n item: {\n ...existing.item,\n status: nextStatus\n }\n });\n this.items = next;\n }\n\n public getAllMap(): Map<string, IviRuntimeConversationItem> {\n return this.items;\n }\n\n public getOrderedList(): IviRuntimeConversationItem[] {\n return this.order\n .map((id) => this.items.get(id))\n .filter((item): item is IviRuntimeConversationItem => !!item);\n }\n\n public reset(): void {\n this.items = new Map();\n this.order = [];\n }\n\n private applyContentUpdate(\n itemId: string,\n update: {\n text: string;\n transcript: string;\n content: IviConversationItemContent[];\n }\n ): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n const next = new Map(this.items);\n next.set(itemId, {\n ...existing,\n text: update.text,\n transcript: update.transcript,\n content: update.content,\n item: {\n ...existing.item,\n content: update.content\n }\n });\n this.items = next;\n }\n\n private ensureOrder(itemId: string): void {\n if (this.order.includes(itemId)) {\n return;\n }\n this.order = [...this.order, itemId];\n }\n\n private buildRuntimeItem(\n item: IviConversationItemWithId,\n lifecycle: \"added\" | \"done\",\n text = this.extractText(item.content),\n transcript = this.extractTranscript(item.content)\n ): IviRuntimeConversationItem {\n const role = item.role ?? \"user\";\n return {\n id: item.id,\n role,\n lifecycle,\n status: this.normalizeConversationStatus(role, item.status),\n item,\n text,\n transcript,\n content: item.content ?? []\n };\n }\n\n private normalizeConversationStatus(\n role: IviConversationItem[\"role\"],\n status: IviConversationItem[\"status\"]\n ): IviRuntimeConversationStatus {\n if (role === \"model\") {\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"incomplete\") {\n return \"incomplete\";\n }\n return \"in_progress\";\n }\n if (status === undefined) {\n return \"completed\";\n }\n return status === \"in_progress\" ? \"in_progress\" : \"completed\";\n }\n\n private mapResponseStatusToConversationStatus(\n status: IviRealtimeResponseStatus | undefined\n ): IviRuntimeConversationStatus {\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"in_progress\") {\n return \"in_progress\";\n }\n return \"incomplete\";\n }\n\n private mergeConversationItem(\n previous: IviConversationItem | undefined,\n next: IviConversationItemWithId\n ): IviConversationItemWithId {\n return {\n ...previous,\n ...next,\n content: next.content ?? previous?.content ?? []\n };\n }\n\n private extractText(content: IviConversationItemContent[] | undefined): string {\n return content?.find((item) => item.type === \"text\")?.text ?? \"\";\n }\n\n private extractTranscript(content: IviConversationItemContent[] | undefined): string {\n return content?.find((item) => item.type === \"audio\")?.transcript ?? \"\";\n }\n\n private upsertContentText(content: IviConversationItemContent[], text: string): IviConversationItemContent[] {\n const next = [...content];\n const textIndex = next.findIndex((item) => item.type === \"text\");\n if (textIndex >= 0) {\n next[textIndex] = {\n ...next[textIndex],\n type: \"text\",\n text\n };\n return next;\n }\n return [\n ...next,\n {\n type: \"text\",\n text\n }\n ];\n }\n\n private upsertContentTranscript(\n content: IviConversationItemContent[],\n transcript: string\n ): IviConversationItemContent[] {\n const next = [...content];\n const audioIndex = next.findIndex((item) => item.type === \"audio\");\n if (audioIndex >= 0) {\n next[audioIndex] = {\n ...next[audioIndex],\n type: \"audio\",\n transcript\n };\n return next;\n }\n return [\n ...next,\n {\n type: \"audio\",\n transcript\n }\n ];\n }\n}\n","import type { IviSourcePlaybackTrtc } from \"../sdk-types\";\nimport type {\n IviRuntimeLogCallback,\n IviRuntimeLogLevel,\n IviRuntimeSource,\n IviRuntimeTrtcAIDenoiserOptions,\n IviRuntimeTrtcEvent,\n IviRuntimeTrtcEventListener,\n IviRuntimeTrtcEventType\n} from \"../types\";\n\ntype TRTCConstructor = typeof import(\"trtc-sdk-v5\").default;\ntype TRTCInstance = InstanceType<TRTCConstructor>;\ntype TRTCDenoiserMode = import(\"trtc-sdk-v5\").DenoiserMode;\ntype TRTCStreamType = import(\"trtc-sdk-v5\").TRTCStreamType;\n\nconst TAG = \"[IVI-TRTC]\";\nconst DEFAULT_DENOISER_OPTIONS: Required<Pick<IviRuntimeTrtcAIDenoiserOptions, \"enabled\" | \"mode\">> = {\n enabled: true,\n mode: \"normal\"\n};\n\nexport type TrtcSourceConnectionStatus = \"idle\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface TrtcSourceSnapshot {\n status: TrtcSourceConnectionStatus;\n error?: string;\n}\n\ninterface TrtcViewBinding {\n container: HTMLElement;\n muted: boolean;\n startedVideoKeys: Set<string>;\n startingVideoKeys: Set<string>;\n}\n\ninterface TrtcSourceSession {\n sourceId: string;\n trtc: IviSourcePlaybackTrtc;\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions;\n TRTC: TRTCConstructor | null;\n client: TRTCInstance | null;\n connectPromise: Promise<void> | null;\n views: Map<string, TrtcViewBinding>;\n remoteVideoStreams: Set<string>;\n remoteAudioUsers: Set<string>;\n status: TrtcSourceConnectionStatus;\n error?: string;\n hasEverReceivedRemoteVideo: boolean;\n remoteVideoWaiters: Array<(available: boolean) => void>;\n onRemoteVideoAvailable?: (event: { userId: string; streamType: TRTCStreamType }) => void;\n onRemoteVideoUnavailable?: (event: { userId: string; streamType: TRTCStreamType }) => void;\n onRemoteAudioAvailable?: (event: { userId: string }) => void;\n onRemoteAudioUnavailable?: (event: { userId: string }) => void;\n}\n\ntype TrtcSourceListener = (snapshot: TrtcSourceSnapshot) => void;\n\nexport class TrtcSourceManager {\n private readonly sessions = new Map<string, TrtcSourceSession>();\n private readonly listeners = new Map<string, Set<TrtcSourceListener>>();\n\n public constructor(\n private readonly onLog?: IviRuntimeLogCallback,\n private readonly onTrtcEvent?: IviRuntimeTrtcEventListener,\n private readonly aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ) {}\n\n /**\n * 将 runtime 当前 sources 与 TRTC 会话池对齐:\n * - 对 ready + trtc 的 source 进行 upsert(必要时建立连接)\n * - 清理已不在 runtime 中的会话(释放资源)\n */\n public syncRuntimeSources(sources: Map<string, IviRuntimeSource>): void {\n const existingIds = new Set(sources.keys());\n sources.forEach((source, sourceId) => {\n if (!isRuntimeTrtcSource(source)) {\n return;\n }\n this.upsertSource(sourceId, source.playback.trtc);\n });\n this.sessions.forEach((_session, sourceId) => {\n if (!existingIds.has(sourceId)) {\n this.removeSource(sourceId);\n }\n });\n }\n\n /**\n * 按 sourceId 注册/更新 TRTC 配置。\n * 若配置发生变化,会先销毁旧会话再按新参数重建连接。\n */\n public upsertSource(\n sourceId: string,\n trtc: IviSourcePlaybackTrtc,\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ): void {\n const existing = this.sessions.get(sourceId);\n if (!existing) {\n this.log(\"info\", `新建会话 source=${sourceId} room=${getTrtcString(trtc, \"room_id\")} user=${getTrtcString(trtc, \"user_id\")}`);\n const session = this.createSession(sourceId, trtc, aiDenoiser);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n return;\n }\n if (isSameTrtcConfig(existing.trtc, trtc) && isSameAIDenoiserOptions(existing.aiDenoiser, aiDenoiser)) {\n return;\n }\n this.log(\"info\", `配置变更,重建会话 source=${sourceId} room=${getTrtcString(trtc, \"room_id\")}`);\n void this.disposeSession(existing);\n const session = this.createSession(sourceId, trtc, aiDenoiser);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n }\n\n /**\n * 删除指定 source 的 TRTC 会话并释放连接资源。\n * 该操作通常由 source.deleted 或会话重置触发。\n */\n public removeSource(sourceId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n this.log(\"info\", `移除会话 source=${sourceId}`);\n this.sessions.delete(sourceId);\n void this.disposeSession(session);\n this.emitSnapshot(sourceId, {\n status: \"idle\"\n });\n this.listeners.delete(sourceId);\n }\n\n public reset(): void {\n this.log(\"info\", `重置全部会话 count=${this.sessions.size}`);\n const sessions = Array.from(this.sessions.values());\n this.sessions.clear();\n sessions.forEach((session) => {\n void this.disposeSession(session);\n });\n this.listeners.clear();\n }\n\n public subscribe(sourceId: string, listener: TrtcSourceListener): () => void {\n const set = this.listeners.get(sourceId) ?? new Set<TrtcSourceListener>();\n set.add(listener);\n this.listeners.set(sourceId, set);\n listener(this.getSnapshot(sourceId));\n return () => {\n const target = this.listeners.get(sourceId);\n if (!target) {\n return;\n }\n target.delete(listener);\n if (target.size === 0) {\n this.listeners.delete(sourceId);\n }\n };\n }\n\n public getSnapshot(sourceId: string): TrtcSourceSnapshot {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return {\n status: \"idle\"\n };\n }\n return {\n status: session.status,\n error: session.error\n };\n }\n\n /**\n * 检查指定 source 的 TRTC 会话是否曾收到过 REMOTE_VIDEO_AVAILABLE 事件。\n */\n public hasRemoteVideoAvailable(sourceId: string): boolean {\n const session = this.sessions.get(sourceId);\n return session?.hasEverReceivedRemoteVideo ?? false;\n }\n\n /**\n * 等待指定 source 的 TRTC 会话首次收到 REMOTE_VIDEO_AVAILABLE。\n * - 若已收到过,立即返回 true。\n * - 若会话被销毁或超时,返回 false。\n */\n public waitForRemoteVideoAvailable(sourceId: string, timeoutMs = 30000): Promise<boolean> {\n const session = this.sessions.get(sourceId);\n if (!session) return Promise.resolve(false);\n if (session.hasEverReceivedRemoteVideo) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = session.remoteVideoWaiters.indexOf(waiter);\n if (idx >= 0) session.remoteVideoWaiters.splice(idx, 1);\n resolve(false);\n }, timeoutMs);\n\n const waiter = (available: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(available);\n };\n session.remoteVideoWaiters.push(waiter);\n });\n }\n\n /**\n * 将一个渲染容器绑定到 source 会话:\n * - 确保连接已建立\n * - 回放历史已知远端视频轨道到该容器\n * - 应用全局音频策略(根据所有 view 的 muted 汇总)\n */\n public async attachView(\n sourceId: string,\n viewId: string,\n container: HTMLElement,\n muted: boolean\n ): Promise<void> {\n const session = this.sessions.get(sourceId);\n if (!session) {\n throw new Error(`TRTC source session not found: ${sourceId}`);\n }\n session.views.set(viewId, {\n container,\n muted,\n startedVideoKeys: new Set(),\n startingVideoKeys: new Set()\n });\n await this.ensureConnected(session);\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n await this.renderKnownRemoteVideosToView(session, binding);\n await this.applyAudioPolicy(session);\n }\n\n public detachView(sourceId: string, viewId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n session.views.delete(viewId);\n void this.applyAudioPolicy(session);\n }\n\n public updateViewMuted(sourceId: string, viewId: string, muted: boolean): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n binding.muted = muted;\n void this.applyAudioPolicy(session);\n }\n\n private createSession(\n sourceId: string,\n trtc: IviSourcePlaybackTrtc,\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ): TrtcSourceSession {\n return {\n sourceId,\n trtc,\n aiDenoiser,\n TRTC: null,\n client: null,\n connectPromise: null,\n views: new Map(),\n remoteVideoStreams: new Set(),\n remoteAudioUsers: new Set(),\n status: \"idle\",\n hasEverReceivedRemoteVideo: false,\n remoteVideoWaiters: []\n };\n }\n\n /**\n * 懒连接入口:同一会话只允许一次并发 connectPromise。\n * 建连后统一注册远端音视频事件,并持续向所有已绑定 view 分发渲染。\n */\n private async ensureConnected(session: TrtcSourceSession): Promise<void> {\n if (session.client && session.TRTC) {\n return;\n }\n if (session.connectPromise) {\n await session.connectPromise;\n return;\n }\n session.status = \"connecting\";\n session.error = undefined;\n this.emitSnapshot(session.sourceId, {\n status: session.status\n });\n session.connectPromise = (async () => {\n const m = await import(\"trtc-sdk-v5\");\n const TRTC = (m.default ?? m) as TRTCConstructor;\n const roomId = getTrtcString(session.trtc, \"room_id\");\n const userId = getTrtcString(session.trtc, \"user_id\");\n const userSig = getTrtcString(session.trtc, \"user_sig\");\n const sdkAppId = Number(getTrtcString(session.trtc, \"app_id\"));\n if (!Number.isFinite(sdkAppId)) {\n throw new Error(\"TRTC app_id 必须是数字字符串。\");\n }\n const isStringRoomId = shouldUseStringRoomId(roomId);\n const client = TRTC.create();\n\n const onRemoteVideoAvailable = (event: { userId: string; streamType: TRTCStreamType }): void => {\n this.log(\"info\", `远端视频可用 source=${session.sourceId} userId=${event.userId} streamType=${event.streamType}`);\n const remoteVideoKey = buildRemoteVideoKey(event.userId, String(event.streamType));\n session.remoteVideoStreams.add(remoteVideoKey);\n if (!session.hasEverReceivedRemoteVideo) {\n session.hasEverReceivedRemoteVideo = true;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(true);\n }\n session.remoteVideoWaiters.length = 0;\n }\n session.views.forEach((binding) => {\n void this.startRemoteVideoForBinding(client, event.userId, event.streamType, binding, remoteVideoKey);\n });\n this.emitTrtcEvent(session.sourceId, \"remote_video_available\", TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, event);\n };\n const onRemoteVideoUnavailable = (event: { userId: string; streamType: TRTCStreamType }): void => {\n this.log(\"info\", `远端视频不可用 source=${session.sourceId} userId=${event.userId} streamType=${event.streamType}`);\n const remoteVideoKey = buildRemoteVideoKey(event.userId, String(event.streamType));\n session.remoteVideoStreams.delete(remoteVideoKey);\n session.views.forEach((binding) => {\n binding.startedVideoKeys.delete(remoteVideoKey);\n binding.startingVideoKeys.delete(remoteVideoKey);\n });\n void client.stopRemoteVideo({\n userId: event.userId,\n streamType: event.streamType\n }).catch(() => undefined);\n this.emitTrtcEvent(session.sourceId, \"remote_video_unavailable\", TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, event);\n };\n const onRemoteAudioAvailable = (event: { userId: string }): void => {\n this.log(\"info\", `远端音频可用 source=${session.sourceId} userId=${event.userId}`);\n session.remoteAudioUsers.add(event.userId);\n void this.applyAudioPolicy(session);\n this.emitTrtcEvent(session.sourceId, \"remote_audio_available\", TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, event);\n };\n const onRemoteAudioUnavailable = (event: { userId: string }): void => {\n this.log(\"info\", `远端音频不可用 source=${session.sourceId} userId=${event.userId}`);\n session.remoteAudioUsers.delete(event.userId);\n void this.applyAudioPolicy(session);\n this.emitTrtcEvent(session.sourceId, \"remote_audio_unavailable\", TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, event);\n };\n\n session.onRemoteVideoAvailable = onRemoteVideoAvailable;\n session.onRemoteVideoUnavailable = onRemoteVideoUnavailable;\n session.onRemoteAudioAvailable = onRemoteAudioAvailable;\n session.onRemoteAudioUnavailable = onRemoteAudioUnavailable;\n\n client.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, onRemoteVideoAvailable);\n client.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, onRemoteVideoUnavailable);\n client.on(TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, onRemoteAudioAvailable);\n client.on(TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, onRemoteAudioUnavailable);\n\n this.log(\"info\", `正在进房 source=${session.sourceId} room=${roomId} sdkAppId=${sdkAppId} userId=${userId}`);\n await client.enterRoom({\n sdkAppId,\n userId,\n userSig,\n scene: TRTC.TYPE.SCENE_LIVE,\n role: TRTC.TYPE.ROLE_AUDIENCE,\n autoReceiveAudio: true,\n ...(isStringRoomId ? { strRoomId: roomId } : { roomId: Number(roomId) })\n });\n\n session.TRTC = TRTC;\n session.client = client;\n session.status = \"connected\";\n session.error = undefined;\n this.log(\"info\", `进房成功 source=${session.sourceId} room=${roomId}`);\n await this.applyAIDenoiserPolicy(session, client, sdkAppId, userId, userSig);\n this.emitSnapshot(session.sourceId, {\n status: session.status\n });\n await this.applyAudioPolicy(session);\n })().catch((error) => {\n session.status = \"error\";\n session.error = error instanceof Error ? error.message : String(error);\n this.log(\"error\", `连接失败 source=${session.sourceId} error=${session.error}`);\n this.emitSnapshot(session.sourceId, {\n status: session.status,\n error: session.error\n });\n throw error;\n }).finally(() => {\n session.connectPromise = null;\n });\n await session.connectPromise;\n }\n\n private async renderKnownRemoteVideosToView(\n session: TrtcSourceSession,\n binding: TrtcViewBinding\n ): Promise<void> {\n const client = session.client;\n if (!client) {\n return;\n }\n for (const key of session.remoteVideoStreams) {\n const parsed = parseRemoteVideoKey(key);\n if (!parsed) {\n continue;\n }\n await this.startRemoteVideoForBinding(\n client,\n parsed.userId,\n parsed.streamType as TRTCStreamType,\n binding,\n key\n );\n }\n }\n\n private async startRemoteVideoForBinding(\n client: TRTCInstance,\n userId: string,\n streamType: TRTCStreamType,\n binding: TrtcViewBinding,\n remoteVideoKey: string\n ): Promise<void> {\n if (binding.startedVideoKeys.has(remoteVideoKey) || binding.startingVideoKeys.has(remoteVideoKey)) {\n return;\n }\n binding.startingVideoKeys.add(remoteVideoKey);\n try {\n await client.startRemoteVideo({\n userId,\n streamType,\n view: binding.container,\n option: { fillMode: \"contain\" }\n });\n binding.startedVideoKeys.add(remoteVideoKey);\n enforceContainMedia(binding.container);\n } catch (error) {\n if (\n error instanceof Error &&\n /already started|OPERATION_ABORT/i.test(error.message)\n ) {\n binding.startedVideoKeys.add(remoteVideoKey);\n return;\n }\n this.log(\"warn\", `远端视频渲染失败 userId=${userId} streamType=${streamType}`, error);\n } finally {\n binding.startingVideoKeys.delete(remoteVideoKey);\n }\n }\n\n /**\n * 统一音频策略:\n * - 所有 view 都 muted -> 全局静音\n * - 至少一个 view 需出声 -> 对可用远端用户解除静音\n */\n private async applyAudioPolicy(session: TrtcSourceSession): Promise<void> {\n const client = session.client;\n if (!client) {\n return;\n }\n const hasUnmutedView = Array.from(session.views.values()).some((view) => !view.muted);\n if (!hasUnmutedView) {\n await client.muteRemoteAudio(\"*\", true);\n return;\n }\n const activeUsers = Array.from(session.remoteAudioUsers);\n if (activeUsers.length === 0) {\n await client.muteRemoteAudio(\"*\", false);\n return;\n }\n for (const userId of activeUsers) {\n await client.muteRemoteAudio(userId, false);\n }\n }\n\n private async applyAIDenoiserPolicy(\n session: TrtcSourceSession,\n client: TRTCInstance,\n sdkAppId: number,\n userId: string,\n userSig: string\n ): Promise<void> {\n const options = resolveAIDenoiserOptions(session.aiDenoiser ?? this.aiDenoiser);\n if (!options.enabled) {\n this.log(\"info\", `TRTC AIDenoiser 已关闭 source=${session.sourceId}`);\n return;\n }\n try {\n await client.startPlugin(\"AIDenoiser\", {\n sdkAppId,\n userId,\n userSig,\n mode: getAIDenoiserModeValue(options.mode),\n ...(options.assetsPath ? { assetsPath: options.assetsPath } : {})\n });\n this.log(\"info\", `TRTC AIDenoiser 已开启 source=${session.sourceId} mode=${options.mode}`);\n } catch (error) {\n this.log(\"warn\", `TRTC AIDenoiser 开启失败 source=${session.sourceId}`, error);\n }\n }\n\n /**\n * 销毁单个 source 会话:\n * 解绑事件、停止远端视频、退出房间并销毁客户端。\n */\n private async disposeSession(session: TrtcSourceSession): Promise<void> {\n const TRTC = session.TRTC;\n const client = session.client;\n session.connectPromise = null;\n session.views.clear();\n session.remoteAudioUsers.clear();\n session.remoteVideoStreams.clear();\n session.status = \"idle\";\n session.error = undefined;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(false);\n }\n session.remoteVideoWaiters.length = 0;\n session.hasEverReceivedRemoteVideo = false;\n if (!client) {\n return;\n }\n this.log(\"info\", `销毁会话 source=${session.sourceId}`);\n try {\n if (TRTC && session.onRemoteVideoAvailable && session.onRemoteVideoUnavailable) {\n client.off(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, session.onRemoteVideoAvailable);\n client.off(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, session.onRemoteVideoUnavailable);\n }\n if (TRTC && session.onRemoteAudioAvailable && session.onRemoteAudioUnavailable) {\n client.off(TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, session.onRemoteAudioAvailable);\n client.off(TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, session.onRemoteAudioUnavailable);\n }\n await client.stopRemoteVideo({ userId: \"*\" });\n await client.exitRoom();\n this.log(\"info\", `退房完成 source=${session.sourceId}`);\n client.destroy();\n } catch (err) {\n this.log(\"warn\", `退房/销毁异常 source=${session.sourceId}`, err);\n try {\n client.destroy();\n } catch {\n // ignore\n }\n } finally {\n session.TRTC = null;\n session.client = null;\n }\n }\n\n private emitSnapshot(sourceId: string, snapshot: TrtcSourceSnapshot): void {\n const targetListeners = this.listeners.get(sourceId);\n if (!targetListeners) {\n return;\n }\n targetListeners.forEach((listener) => listener(snapshot));\n }\n\n private log(level: IviRuntimeLogLevel, message: string, ...extra: unknown[]): void {\n const args = [TAG, message, ...extra];\n this.onLog?.({\n level,\n tag: TAG,\n message: `${TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n }\n\n private emitTrtcEvent(\n sourceId: string,\n type: IviRuntimeTrtcEventType,\n rawType: unknown,\n payload: { userId?: string; streamType?: unknown }\n ): void {\n const event: IviRuntimeTrtcEvent = {\n sourceId,\n type,\n rawType: String(rawType),\n payload,\n userId: payload.userId,\n streamType: payload.streamType\n };\n this.onTrtcEvent?.(event);\n }\n}\n\nfunction isRuntimeTrtcSource(\n source: IviRuntimeSource\n): source is IviRuntimeSource & { playback: { type: \"trtc\"; trtc: IviSourcePlaybackTrtc } } {\n return (\n source.status === \"ready\" &&\n source.playback?.type === \"trtc\" &&\n typeof source.playback.trtc === \"object\" &&\n source.playback.trtc !== null\n );\n}\n\nfunction isSameTrtcConfig(a: IviSourcePlaybackTrtc, b: IviSourcePlaybackTrtc): boolean {\n return a.app_id === b.app_id && a.user_id === b.user_id && a.user_sig === b.user_sig && a.room_id === b.room_id;\n}\n\nfunction isSameAIDenoiserOptions(\n a: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined,\n b: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined\n): boolean {\n const left = resolveAIDenoiserOptions(a);\n const right = resolveAIDenoiserOptions(b);\n return (\n left.enabled === right.enabled &&\n left.mode === right.mode &&\n left.assetsPath === right.assetsPath\n );\n}\n\nfunction shouldUseStringRoomId(roomId: string): boolean {\n if (!/^\\d+$/.test(roomId)) {\n return true;\n }\n const roomNumber = Number(roomId);\n return !Number.isInteger(roomNumber) || roomNumber < 1 || roomNumber > 4294967294;\n}\n\nfunction getTrtcString(trtc: IviSourcePlaybackTrtc, key: keyof IviSourcePlaybackTrtc): string {\n const value = trtc[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction resolveAIDenoiserOptions(\n options: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined\n): Required<Pick<IviRuntimeTrtcAIDenoiserOptions, \"enabled\" | \"mode\">> & Pick<IviRuntimeTrtcAIDenoiserOptions, \"assetsPath\"> {\n if (options === false) {\n return {\n ...DEFAULT_DENOISER_OPTIONS,\n enabled: false\n };\n }\n if (options === true || options === undefined) {\n return DEFAULT_DENOISER_OPTIONS;\n }\n return {\n ...DEFAULT_DENOISER_OPTIONS,\n ...options,\n enabled: options.enabled ?? DEFAULT_DENOISER_OPTIONS.enabled,\n mode: options.mode ?? DEFAULT_DENOISER_OPTIONS.mode\n };\n}\n\nfunction getAIDenoiserModeValue(mode: IviRuntimeTrtcAIDenoiserOptions[\"mode\"]): TRTCDenoiserMode {\n return (mode === \"far_field_reduction\" ? 1 : 0) as TRTCDenoiserMode;\n}\n\nfunction buildRemoteVideoKey(userId: string, streamType: string): string {\n return `${userId}::${streamType}`;\n}\n\nfunction parseRemoteVideoKey(key: string): { userId: string; streamType: string } | null {\n const separatorIndex = key.indexOf(\"::\");\n if (separatorIndex < 0) {\n return null;\n }\n return {\n userId: key.slice(0, separatorIndex),\n streamType: key.slice(separatorIndex + 2)\n };\n}\n\nfunction enforceContainMedia(container: HTMLElement): void {\n const playerNodes = container.querySelectorAll(\"[id^='player_'], [id^='video_'], [id^='audio_']\");\n playerNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n node.style.setProperty(\"width\", \"100%\", \"important\");\n node.style.setProperty(\"height\", \"100%\", \"important\");\n node.style.setProperty(\"max-width\", \"100%\", \"important\");\n node.style.setProperty(\"max-height\", \"100%\", \"important\");\n });\n\n const mediaElements = container.querySelectorAll(\"video, canvas\");\n mediaElements.forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n element.style.setProperty(\"width\", \"100%\", \"important\");\n element.style.setProperty(\"height\", \"100%\", \"important\");\n element.style.setProperty(\"max-width\", \"100%\", \"important\");\n element.style.setProperty(\"max-height\", \"100%\", \"important\");\n element.style.setProperty(\"object-fit\", \"contain\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n });\n}\n","import type { LiveKitBrowserTransportConfig } from \"@vivix-ai/ivi-sdk-ts/transports/livekit-browser\";\nimport type { IviSourcePlayback } from \"./sdk-types\";\nimport type { IviRuntimeSource } from \"./types\";\n\n/**\n * LiveKit 拉流所需的会话凭证。连接字段复用 `@vivix-ai/ivi-sdk-ts` LiveKit transport 的上游类型。\n */\nexport type IviSourcePlaybackLivekit = {\n ws_url: LiveKitBrowserTransportConfig[\"url\"];\n token: LiveKitBrowserTransportConfig[\"token\"];\n room?: string;\n identity?: string;\n};\n\n/**\n * LiveKit 形态的 playback 实体(运行态用)。\n */\nexport type IviSourcePlaybackLivekitDescriptor = IviSourcePlayback & {\n type: \"livekit\";\n livekit: IviSourcePlaybackLivekit;\n};\n\n/**\n * 判定一个 playback 是否携带合法的 LiveKit 配置。\n * 兼容上游类型尚未感知 `livekit` 分支的情况,因此使用结构化检查。\n */\nexport function isLivekitSourcePlayback(\n playback: IviSourcePlayback | undefined | null\n): playback is IviSourcePlaybackLivekitDescriptor {\n if (!playback) return false;\n const candidate = playback as { type?: string; livekit?: unknown };\n if (candidate.type !== \"livekit\" || typeof candidate.livekit !== \"object\" || candidate.livekit === null) {\n return false;\n }\n const livekit = candidate.livekit as { ws_url?: unknown; token?: unknown };\n return typeof livekit.ws_url === \"string\" && typeof livekit.token === \"string\";\n}\n\n/**\n * Runtime 层守卫:source 已 ready 且 playback 是 livekit。\n */\nexport function isReadyLivekitRuntimeSource(\n source: IviRuntimeSource | undefined | null\n): source is IviRuntimeSource & { playback: IviSourcePlaybackLivekitDescriptor } {\n if (!source || source.status !== \"ready\") return false;\n return isLivekitSourcePlayback(source.playback);\n}\n\n/**\n * 浅比较两份 livekit 配置;用于 SourceManager 决定是否需要重建 Room 连接。\n */\nexport function isSameLivekitConfig(a: IviSourcePlaybackLivekit, b: IviSourcePlaybackLivekit): boolean {\n return a.ws_url === b.ws_url && a.token === b.token && a.room === b.room && a.identity === b.identity;\n}\n\nexport function describeLivekitRoom(livekit: IviSourcePlaybackLivekit): string {\n return livekit.room ?? livekit.identity ?? \"unknown\";\n}\n","import type { IviRuntimeLogCallback, IviRuntimeLogLevel, IviRuntimeSource } from \"../types\";\nimport {\n describeLivekitRoom,\n isReadyLivekitRuntimeSource,\n isSameLivekitConfig,\n type IviSourcePlaybackLivekit\n} from \"../livekit-types\";\n\ntype LivekitModule = typeof import(\"livekit-client\");\ntype LivekitRoom = InstanceType<LivekitModule[\"Room\"]>;\ntype LivekitRemoteTrack = InstanceType<LivekitModule[\"RemoteTrack\"]>;\ntype LivekitRemoteParticipant = InstanceType<LivekitModule[\"RemoteParticipant\"]>;\n\nconst TAG = \"[IVI-LIVEKIT]\";\n\nexport type LivekitSourceConnectionStatus = \"idle\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface LivekitSourceSnapshot {\n status: LivekitSourceConnectionStatus;\n error?: string;\n}\n\ninterface LivekitViewBinding {\n container: HTMLElement;\n muted: boolean;\n /** 该 view 上为每条远端 track attach 出的媒体元素。 */\n attachedElements: Map<string, HTMLMediaElement>;\n}\n\ninterface LivekitTrackEntry {\n track: LivekitRemoteTrack;\n participantIdentity: string;\n kind: \"video\" | \"audio\";\n}\n\ninterface LivekitSourceSession {\n sourceId: string;\n livekit: IviSourcePlaybackLivekit;\n livekitModule: LivekitModule | null;\n room: LivekitRoom | null;\n connectPromise: Promise<void> | null;\n views: Map<string, LivekitViewBinding>;\n /** 当前已订阅的远端 track,按 trackSid 索引。 */\n remoteTracks: Map<string, LivekitTrackEntry>;\n status: LivekitSourceConnectionStatus;\n error?: string;\n hasEverReceivedRemoteVideo: boolean;\n remoteVideoWaiters: Array<(available: boolean) => void>;\n /** Room 事件解绑函数集合,断连/销毁时统一调用。 */\n detachRoomListeners: () => void;\n}\n\ntype LivekitSourceListener = (snapshot: LivekitSourceSnapshot) => void;\n\n/**\n * LiveKit 拉流会话池:\n * - 每个 `sourceId` 对应一个 LiveKit `Room` 实例,懒连接、单飞建连;\n * - 远端 track 订阅后按 view 分发到各自容器;\n * - 接口形状刻意贴近 `TrtcSourceManager`,便于 runtime 协调器与 React 组件镜像复用。\n */\nexport class LivekitSourceManager {\n private readonly sessions = new Map<string, LivekitSourceSession>();\n private readonly listeners = new Map<string, Set<LivekitSourceListener>>();\n\n public constructor(private readonly onLog?: IviRuntimeLogCallback) {}\n\n /**\n * 与 runtime 当前 sources 对齐:\n * - 对 ready + livekit 的 source 进行 upsert(必要时建立连接);\n * - 清理已不在 runtime 中的会话(释放资源)。\n */\n public syncRuntimeSources(sources: Map<string, IviRuntimeSource>): void {\n const existingIds = new Set(sources.keys());\n sources.forEach((source, sourceId) => {\n if (!isReadyLivekitRuntimeSource(source)) {\n return;\n }\n this.upsertSource(sourceId, source.playback.livekit);\n });\n this.sessions.forEach((_session, sourceId) => {\n if (!existingIds.has(sourceId)) {\n this.removeSource(sourceId);\n }\n });\n }\n\n /**\n * 按 sourceId 注册/更新 LiveKit 配置。\n * 若 ws_url / token / room / identity 任一发生变化,会先销毁旧会话再按新参数重建连接。\n */\n public upsertSource(sourceId: string, livekit: IviSourcePlaybackLivekit): void {\n const existing = this.sessions.get(sourceId);\n if (!existing) {\n this.log(\"info\", `新建会话 source=${sourceId} room=${describeLivekitRoom(livekit)}`);\n const session = this.createSession(sourceId, livekit);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n return;\n }\n if (isSameLivekitConfig(existing.livekit, livekit)) {\n return;\n }\n this.log(\"info\", `配置变更,重建会话 source=${sourceId} room=${describeLivekitRoom(livekit)}`);\n void this.disposeSession(existing);\n const session = this.createSession(sourceId, livekit);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n }\n\n /**\n * 删除指定 source 的 LiveKit 会话并释放连接资源。\n */\n public removeSource(sourceId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n this.log(\"info\", `移除会话 source=${sourceId}`);\n this.sessions.delete(sourceId);\n void this.disposeSession(session);\n this.emitSnapshot(sourceId, { status: \"idle\" });\n this.listeners.delete(sourceId);\n }\n\n public reset(): void {\n this.log(\"info\", `重置全部会话 count=${this.sessions.size}`);\n const sessions = Array.from(this.sessions.values());\n this.sessions.clear();\n sessions.forEach((session) => {\n void this.disposeSession(session);\n });\n this.listeners.clear();\n }\n\n public subscribe(sourceId: string, listener: LivekitSourceListener): () => void {\n const set = this.listeners.get(sourceId) ?? new Set<LivekitSourceListener>();\n set.add(listener);\n this.listeners.set(sourceId, set);\n listener(this.getSnapshot(sourceId));\n return () => {\n const target = this.listeners.get(sourceId);\n if (!target) {\n return;\n }\n target.delete(listener);\n if (target.size === 0) {\n this.listeners.delete(sourceId);\n }\n };\n }\n\n public getSnapshot(sourceId: string): LivekitSourceSnapshot {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return { status: \"idle\" };\n }\n return { status: session.status, error: session.error };\n }\n\n public hasRemoteVideoAvailable(sourceId: string): boolean {\n const session = this.sessions.get(sourceId);\n return session?.hasEverReceivedRemoteVideo ?? false;\n }\n\n /**\n * 等待指定 source 的 LiveKit 会话首次拿到远端视频 track。\n * - 若已收到过,立即返回 true;\n * - 若会话被销毁或超时,返回 false。\n */\n public waitForRemoteVideoAvailable(sourceId: string, timeoutMs = 30000): Promise<boolean> {\n const session = this.sessions.get(sourceId);\n if (!session) return Promise.resolve(false);\n if (session.hasEverReceivedRemoteVideo) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = session.remoteVideoWaiters.indexOf(waiter);\n if (idx >= 0) session.remoteVideoWaiters.splice(idx, 1);\n resolve(false);\n }, timeoutMs);\n\n const waiter = (available: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(available);\n };\n session.remoteVideoWaiters.push(waiter);\n });\n }\n\n /**\n * 把一个渲染容器绑定到 source 会话:\n * - 确保已连接;\n * - 把已订阅的远端 video/audio 回放到该容器;\n * - 应用初始 muted 策略。\n */\n public async attachView(\n sourceId: string,\n viewId: string,\n container: HTMLElement,\n muted: boolean\n ): Promise<void> {\n const session = this.sessions.get(sourceId);\n if (!session) {\n throw new Error(`LiveKit source session not found: ${sourceId}`);\n }\n session.views.set(viewId, {\n container,\n muted,\n attachedElements: new Map()\n });\n await this.ensureConnected(session);\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n this.attachKnownTracksToView(session, binding);\n this.applyMutedToBinding(binding);\n }\n\n public detachView(sourceId: string, viewId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n this.detachAllElementsFromView(session, binding);\n session.views.delete(viewId);\n }\n\n public updateViewMuted(sourceId: string, viewId: string, muted: boolean): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n binding.muted = muted;\n this.applyMutedToBinding(binding);\n }\n\n private createSession(sourceId: string, livekit: IviSourcePlaybackLivekit): LivekitSourceSession {\n return {\n sourceId,\n livekit,\n livekitModule: null,\n room: null,\n connectPromise: null,\n views: new Map(),\n remoteTracks: new Map(),\n status: \"idle\",\n hasEverReceivedRemoteVideo: false,\n remoteVideoWaiters: [],\n detachRoomListeners: () => undefined\n };\n }\n\n /**\n * 懒连接:单飞模式下复用同一个 connectPromise;建连后注册远端事件并把已订阅 track 推给 view。\n */\n private async ensureConnected(session: LivekitSourceSession): Promise<void> {\n if (session.room && session.livekitModule) {\n return;\n }\n if (session.connectPromise) {\n await session.connectPromise;\n return;\n }\n session.status = \"connecting\";\n session.error = undefined;\n this.emitSnapshot(session.sourceId, { status: session.status });\n session.connectPromise = (async () => {\n const livekitModule = await import(\"livekit-client\");\n const RoomCtor = livekitModule.Room;\n const RoomEvent = livekitModule.RoomEvent;\n const TrackKind = livekitModule.Track.Kind;\n const room = new RoomCtor({\n adaptiveStream: true,\n dynacast: true\n });\n\n const onTrackSubscribed = (\n track: LivekitRemoteTrack,\n _publication: unknown,\n participant: LivekitRemoteParticipant\n ): void => {\n const kind: \"video\" | \"audio\" | null =\n track.kind === TrackKind.Video\n ? \"video\"\n : track.kind === TrackKind.Audio\n ? \"audio\"\n : null;\n if (!kind) return;\n const trackKey = buildRemoteTrackKey(participant.identity, track.sid ?? track.kind);\n this.log(\n \"info\",\n `订阅远端 track source=${session.sourceId} participant=${participant.identity} kind=${kind} sid=${track.sid ?? \"?\"}`\n );\n session.remoteTracks.set(trackKey, {\n track,\n participantIdentity: participant.identity,\n kind\n });\n if (kind === \"video\" && !session.hasEverReceivedRemoteVideo) {\n session.hasEverReceivedRemoteVideo = true;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(true);\n }\n session.remoteVideoWaiters.length = 0;\n }\n session.views.forEach((binding) => {\n this.attachTrackToView(track, kind, trackKey, binding);\n });\n };\n\n const onTrackUnsubscribed = (\n track: LivekitRemoteTrack,\n _publication: unknown,\n participant: LivekitRemoteParticipant\n ): void => {\n const trackKey = buildRemoteTrackKey(participant.identity, track.sid ?? track.kind);\n this.log(\n \"info\",\n `远端 track 取消订阅 source=${session.sourceId} participant=${participant.identity} sid=${track.sid ?? \"?\"}`\n );\n session.remoteTracks.delete(trackKey);\n session.views.forEach((binding) => {\n this.detachTrackFromBinding(track, trackKey, binding);\n });\n };\n\n const onDisconnected = (): void => {\n this.log(\"warn\", `Room 断开 source=${session.sourceId}`);\n };\n\n room.on(RoomEvent.TrackSubscribed, onTrackSubscribed);\n room.on(RoomEvent.TrackUnsubscribed, onTrackUnsubscribed);\n room.on(RoomEvent.Disconnected, onDisconnected);\n session.detachRoomListeners = (): void => {\n room.off(RoomEvent.TrackSubscribed, onTrackSubscribed);\n room.off(RoomEvent.TrackUnsubscribed, onTrackUnsubscribed);\n room.off(RoomEvent.Disconnected, onDisconnected);\n };\n\n this.log(\n \"info\",\n `正在进房 source=${session.sourceId} room=${describeLivekitRoom(session.livekit)} ws=${session.livekit.ws_url}`\n );\n await room.connect(session.livekit.ws_url, session.livekit.token);\n\n session.room = room;\n session.livekitModule = livekitModule;\n session.status = \"connected\";\n session.error = undefined;\n this.log(\"info\", `进房成功 source=${session.sourceId} room=${describeLivekitRoom(session.livekit)}`);\n this.emitSnapshot(session.sourceId, { status: session.status });\n })()\n .catch((error) => {\n session.status = \"error\";\n session.error = error instanceof Error ? error.message : String(error);\n this.log(\"error\", `连接失败 source=${session.sourceId} error=${session.error}`);\n this.emitSnapshot(session.sourceId, {\n status: session.status,\n error: session.error\n });\n throw error;\n })\n .finally(() => {\n session.connectPromise = null;\n });\n await session.connectPromise;\n }\n\n private attachKnownTracksToView(\n session: LivekitSourceSession,\n binding: LivekitViewBinding\n ): void {\n session.remoteTracks.forEach((entry, trackKey) => {\n this.attachTrackToView(entry.track, entry.kind, trackKey, binding);\n });\n }\n\n private attachTrackToView(\n track: LivekitRemoteTrack,\n kind: \"video\" | \"audio\",\n trackKey: string,\n binding: LivekitViewBinding\n ): void {\n if (binding.attachedElements.has(trackKey)) {\n return;\n }\n let element: HTMLMediaElement;\n try {\n element = track.attach();\n } catch (error) {\n this.log(\"warn\", `attach track 失败 trackKey=${trackKey}`, error);\n return;\n }\n binding.attachedElements.set(trackKey, element);\n if (kind === \"video\") {\n enforceContainMedia(element);\n } else {\n element.style.display = \"none\";\n }\n binding.container.appendChild(element);\n this.applyMutedToElement(element, binding.muted);\n }\n\n private detachTrackFromBinding(\n track: LivekitRemoteTrack,\n trackKey: string,\n binding: LivekitViewBinding\n ): void {\n const element = binding.attachedElements.get(trackKey);\n if (!element) return;\n try {\n track.detach(element);\n } catch {\n // ignore\n }\n if (element.parentElement === binding.container) {\n binding.container.removeChild(element);\n }\n binding.attachedElements.delete(trackKey);\n }\n\n private detachAllElementsFromView(\n session: LivekitSourceSession,\n binding: LivekitViewBinding\n ): void {\n binding.attachedElements.forEach((element, trackKey) => {\n const entry = session.remoteTracks.get(trackKey);\n if (entry) {\n try {\n entry.track.detach(element);\n } catch {\n // ignore\n }\n }\n if (element.parentElement === binding.container) {\n binding.container.removeChild(element);\n }\n });\n binding.attachedElements.clear();\n }\n\n private applyMutedToBinding(binding: LivekitViewBinding): void {\n binding.attachedElements.forEach((element) => {\n this.applyMutedToElement(element, binding.muted);\n });\n }\n\n private applyMutedToElement(element: HTMLMediaElement, muted: boolean): void {\n element.muted = muted;\n if (muted) {\n element.volume = 0;\n }\n }\n\n private async disposeSession(session: LivekitSourceSession): Promise<void> {\n session.connectPromise = null;\n session.views.forEach((binding) => {\n this.detachAllElementsFromView(session, binding);\n });\n session.views.clear();\n session.remoteTracks.clear();\n for (const waiter of session.remoteVideoWaiters) {\n waiter(false);\n }\n session.remoteVideoWaiters.length = 0;\n session.hasEverReceivedRemoteVideo = false;\n session.status = \"idle\";\n session.error = undefined;\n\n const room = session.room;\n session.detachRoomListeners();\n session.detachRoomListeners = () => undefined;\n session.room = null;\n session.livekitModule = null;\n if (!room) {\n return;\n }\n this.log(\"info\", `销毁会话 source=${session.sourceId}`);\n try {\n await room.disconnect();\n this.log(\"info\", `离开房间完成 source=${session.sourceId}`);\n } catch (err) {\n this.log(\"warn\", `离开房间异常 source=${session.sourceId}`, err);\n }\n }\n\n private emitSnapshot(sourceId: string, snapshot: LivekitSourceSnapshot): void {\n const targetListeners = this.listeners.get(sourceId);\n if (!targetListeners) {\n return;\n }\n targetListeners.forEach((listener) => listener(snapshot));\n }\n\n private log(level: IviRuntimeLogLevel, message: string, ...extra: unknown[]): void {\n const args = [TAG, message, ...extra];\n this.onLog?.({\n level,\n tag: TAG,\n message: `${TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n }\n}\n\nfunction buildRemoteTrackKey(identity: string, trackId: string): string {\n return `${identity}::${trackId}`;\n}\n\nfunction enforceContainMedia(element: HTMLMediaElement): void {\n element.style.setProperty(\"width\", \"100%\", \"important\");\n element.style.setProperty(\"height\", \"100%\", \"important\");\n element.style.setProperty(\"max-width\", \"100%\", \"important\");\n element.style.setProperty(\"max-height\", \"100%\", \"important\");\n element.style.setProperty(\"object-fit\", \"contain\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n}\n","import {\n ReceiveConversationItemAddedEvent,\n ReceiveConversationItemDoneEvent,\n ReceiveSessionCreatedEvent,\n ReceiveSessionEndedEvent,\n ReceiveResponseCreatedEvent,\n type IviClient,\n type IviStageComposition,\n type SendSessionTrackTakePayload\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport { IviRuntimeDispatcher } from \"./runtime-dispatcher\";\nimport {\n ConversationEventHandler,\n SessionEventHandler,\n SourceEventHandler,\n StageEventHandler,\n StreamEventHandler,\n TrackEventHandler\n} from \"./handlers\";\nimport {\n ConversationManager,\n LivekitSourceManager,\n SourceManager,\n SessionManager,\n StageManager,\n StreamManager,\n TrackManager,\n TrtcSourceManager\n} from \"./managers\";\nimport { isLivekitSourcePlayback } from \"./livekit-types\";\nimport type {\n IviRuntimeEventListener,\n IviRuntimeCoordinatorConfig,\n IviRuntimeLogEntry,\n IviRuntimeSource,\n IviRuntimeState,\n IviRuntimeTrtcEvent,\n IviRuntimeTrtcEventListener,\n IviRuntimeUserTextToResponseCallbacks,\n IviRuntimeUserTextToResponseOptions,\n IviRuntimeUserTextToResponseResult\n} from \"./types\";\n\ninterface PendingUserTextToResponseFlow {\n itemId: string;\n streamId?: string;\n response?: IviRuntimeUserTextToResponseOptions[\"response\"];\n responseInput: NonNullable<IviRuntimeUserTextToResponseOptions[\"responseInput\"]>;\n callbacks?: IviRuntimeUserTextToResponseCallbacks;\n addedEvent?: ReceiveConversationItemAddedEvent;\n doneEvent?: ReceiveConversationItemDoneEvent;\n responseRequested: boolean;\n resolve: (result: IviRuntimeUserTextToResponseResult) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * 协调者负责 runtime 生命周期、状态机和跨域补偿,不参与事件类型分发。\n *\n * 状态转移过程:\n * 1) 初始态\n * - 实例创建后默认状态为 `idle`。\n *\n * 2) 启动阶段\n * - 调用 `start()` 后立即进入 `connecting`,并启动 dispatcher 与底层 WebSocket 连接。\n * - 若连接失败,会执行 `stop()`,最终进入 `stopped`。\n *\n * 3) 会话建立后\n * - 收到 `session.created` 后:\n * - `syncStageOnSessionCreated !== false`(默认)时进入 `syncing`,并主动请求 `session.stage.get`。\n * - `syncStageOnSessionCreated === false` 时直接进入 `running`。\n *\n * 4) 同步完成\n * - 在 `syncing` 状态下收到由 `session.stage.get.response` 触发的 stage 变更后,切换为 `running`。\n * - 若 stage 引用了本地缺失的 track/source,会触发 `session.tracks.list` / `session.sources.list` 补偿拉取;\n * 拉取完成后进行一致性校验,缺失仍存在则抛错。\n *\n * 5) 运行中断开\n * - 非 `idle` 状态下连接断开(`onConnectionChange(false)`)会重置运行态并进入 `stopped`。\n *\n * 6) 服务端结束会话\n * - 收到 `session.ended` 时与连接断开类似:清空 managers、拒绝未完成的用户文本链路,并进入 `stopped`(不主动调用底层 `disconnect`,由连接自然关闭或业务方 `stop()`)。\n * - 常见实现下 WebSocket 会先处理完已到达的文本消息再触发 `close`,故 `session.ended` 通常先于断连回调;若已进入 `stopped`,紧随的断连不会再次 reset,避免重复状态通知。\n * - 若因网络等原因未收到 `session.ended` 仅断连,仍会通过 `onConnectionChange(false)` 进入 `stopped`,但 `config.onSessionEnded` 不会触发(需依赖 `onEvent` / 状态订阅区分)。\n *\n * 7) 主动停止\n * - 调用 `stop()` 会停止 dispatcher、断开连接、清空运行态,并进入 `stopped`。\n *\n * 说明:\n * - 当前实现中 `stopped` 为终止态语义;再次调用 `start()` 可重新进入新一轮生命周期(若连接已断需先保证 client 可再次 connect)。\n */\nexport class IviRuntimeCoordinator {\n private readonly client: IviClient;\n private readonly config: IviRuntimeCoordinatorConfig;\n private readonly dispatcher: IviRuntimeDispatcher;\n private readonly sessionManager = new SessionManager();\n private readonly stageManager = new StageManager();\n private readonly trackManager = new TrackManager();\n private readonly sourceManager = new SourceManager();\n private readonly streamManager = new StreamManager();\n private readonly trtcSourceManager: TrtcSourceManager;\n private readonly livekitSourceManager: LivekitSourceManager;\n private readonly conversationManager = new ConversationManager();\n private readonly sessionHandler: SessionEventHandler;\n private readonly stageHandler: StageEventHandler;\n private readonly trackHandler: TrackEventHandler;\n private readonly sourceHandler: SourceEventHandler;\n private readonly streamHandler: StreamEventHandler;\n private readonly conversationHandler: ConversationEventHandler;\n private readonly stateListeners = new Set<(state: IviRuntimeState) => void>();\n private readonly eventListeners = new Set<IviRuntimeEventListener>();\n private readonly trtcEventListeners = new Set<IviRuntimeTrtcEventListener>();\n private readonly pendingUserTextToResponseFlows = new Map<string, PendingUserTextToResponseFlow>();\n private userTextFlowCounter = 0;\n private waitingTracksListValidation = false;\n private waitingSourcesListValidation = false;\n private state: IviRuntimeState = {\n status: \"idle\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n };\n\n /**\n * @param client 底层实时客户端,负责实际事件收发。\n * @param config 协调行为配置(例如会话建立后的同步策略)。\n */\n public constructor(client: IviClient, config?: IviRuntimeCoordinatorConfig) {\n this.client = client;\n this.config = {\n syncStageOnSessionCreated: true,\n ...config\n };\n this.trtcSourceManager = new TrtcSourceManager(\n this.config.onLog,\n (event) => this.emitTrtcEvent(event),\n this.config.trtcAIDenoiser\n );\n this.livekitSourceManager = new LivekitSourceManager(this.config.onLog);\n this.sessionHandler = new SessionEventHandler(this.sessionManager, {\n onSessionCreated: (event) => this.onSessionCreated(event),\n onSessionEnded: (event) => this.onSessionEnded(event)\n });\n this.stageHandler = new StageEventHandler(this.stageManager, {\n onStageChanged: ({ fromStageGetResponse }) => this.onStageChanged(fromStageGetResponse)\n });\n this.trackHandler = new TrackEventHandler(this.trackManager, {\n onTracksChanged: ({ listRefreshed }) => this.onTracksChanged(listRefreshed)\n });\n this.sourceHandler = new SourceEventHandler(this.sourceManager, {\n onSourcesChanged: ({ listRefreshed }) => this.onSourcesChanged(listRefreshed)\n });\n this.streamHandler = new StreamEventHandler(this.streamManager, {\n onStreamsChanged: () => this.onStreamsChanged()\n });\n this.conversationHandler = new ConversationEventHandler(this.conversationManager, {\n onConversationsChanged: () => this.onConversationsChanged()\n });\n this.dispatcher = new IviRuntimeDispatcher(client, {\n sessionHandler: this.sessionHandler,\n stageHandler: this.stageHandler,\n trackHandler: this.trackHandler,\n sourceHandler: this.sourceHandler,\n streamHandler: this.streamHandler,\n conversationHandler: this.conversationHandler,\n onConnectionChange: (connected) => this.onConnectionChange(connected),\n onEvent: (event) => this.emitEvent(event),\n onLog: this.config.onLog\n });\n }\n\n /**\n * 启动协调器并建立实时连接。\n * 启动后状态会从 idle/stopped 进入 connecting,连接成功后由事件驱动进入后续状态。\n */\n public async start(): Promise<void> {\n this.setState({\n ...this.state,\n status: \"connecting\"\n });\n this.dispatcher.start();\n try {\n await this.client.connect();\n } catch (error) {\n this.stop();\n throw error;\n }\n }\n\n /**\n * 停止协调器并断开实时连接,同时重置运行态数据为 stopped。\n */\n public stop(): void {\n this.dispatcher.stop();\n this.client.disconnect();\n this.resetStoppedState();\n }\n\n public getState(): IviRuntimeState {\n return this.state;\n }\n\n public onStateChange(listener: (state: IviRuntimeState) => void): () => void {\n this.stateListeners.add(listener);\n return () => {\n this.stateListeners.delete(listener);\n };\n }\n\n public onEvent(listener: IviRuntimeEventListener): () => void {\n this.eventListeners.add(listener);\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n public onTrtcEvent(listener: IviRuntimeTrtcEventListener): () => void {\n this.trtcEventListeners.add(listener);\n return () => {\n this.trtcEventListeners.delete(listener);\n };\n }\n\n public emitLog(entry: IviRuntimeLogEntry): void {\n this.config.onLog?.(entry);\n }\n\n /**\n * 编排一次\"用户文本输入 -> 触发模型回复\"链路。\n *\n * 流程:\n * 1) 发送 conversation.item.create(可指定 itemId);\n * 2) 等待 conversation.item.added + conversation.item.done;\n * 3) 发送 response.create(默认不携带 input,使用 IVI 内部上下文;可选显式绑定 item_reference);\n * 4) 等待 response.created 并结束。\n */\n public sendUserTextAndTriggerResponse(\n options: IviRuntimeUserTextToResponseOptions\n ): Promise<IviRuntimeUserTextToResponseResult> {\n const normalizedStreamId = options.streamId?.trim() || undefined;\n const normalizedText = options.text.trim();\n if (!normalizedText) {\n throw new Error(\"text must be a non-empty string.\");\n }\n const normalizedItemId =\n typeof options.itemId === \"string\" && options.itemId.trim().length > 0\n ? options.itemId.trim()\n : undefined;\n if (normalizedItemId && this.pendingUserTextToResponseFlows.has(normalizedItemId)) {\n throw new Error(`Conversation item flow already exists for itemId: ${normalizedItemId}`);\n }\n if (normalizedStreamId && this.hasPendingResponseFlow(normalizedStreamId)) {\n throw new Error(`Response flow already pending for streamId: ${normalizedStreamId}`);\n }\n\n const itemId = normalizedItemId ?? this.buildUserTextItemId();\n return new Promise<IviRuntimeUserTextToResponseResult>((resolve, reject) => {\n this.pendingUserTextToResponseFlows.set(itemId, {\n itemId,\n streamId: normalizedStreamId,\n response: options.response,\n responseInput: options.responseInput ?? \"context\",\n callbacks: options.callbacks,\n responseRequested: false,\n resolve,\n reject\n });\n this.client.sendUserText(normalizedText, itemId).catch((error) => {\n this.pendingUserTextToResponseFlows.delete(itemId);\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n }\n\n /**\n * 上报某个 source 在指定 track 上播放完成。\n *\n * - 若 next 槽位为空,只发送 complete。\n * - 若 next 槽位已有 source,立即将 next 提升为 active,并发送 complete 与 take。\n * - 当前为普通视频/m3u8 且 next 为 TRTC source 时,等待 TRTC 远端视频可用后再切换并发送 complete/take。\n */\n public sendSessionSourcePlaybackCompleted(sourceId: string, trackId?: string): void {\n const resolvedTrackId = trackId ?? this.trackManager.findTrackIdByActiveSource(sourceId);\n if (!resolvedTrackId) {\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n return;\n }\n\n const track = this.trackManager.getAll().get(resolvedTrackId);\n if (!track) {\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n return;\n }\n\n if (track.next_source_id) {\n const currentSource = this.sourceManager.get(sourceId);\n const nextSource = this.sourceManager.get(track.next_source_id);\n if (isVideoPlaybackSource(currentSource) && isTrtcPlaybackSource(nextSource)) {\n void this.deferredTrtcTakeCompleteAndTake(resolvedTrackId, track.next_source_id, sourceId, trackId);\n return;\n }\n if (isVideoPlaybackSource(currentSource) && isLivekitPlaybackSource(nextSource)) {\n void this.deferredLivekitTakeCompleteAndTake(resolvedTrackId, track.next_source_id, sourceId, trackId);\n return;\n }\n\n this.applyLocalTrackTake(resolvedTrackId);\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n this.sendSessionTrackTake(resolvedTrackId);\n return;\n }\n\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n }\n\n public getTrtcSourceManager(): TrtcSourceManager {\n return this.trtcSourceManager;\n }\n\n public getLivekitSourceManager(): LivekitSourceManager {\n return this.livekitSourceManager;\n }\n\n private onConnectionChange(connected: boolean): void {\n if (connected || this.state.status === \"idle\") {\n return;\n }\n if (this.state.status === \"stopped\") {\n return;\n }\n this.resetStoppedState();\n }\n\n private validateStageTracks(stage: IviStageComposition | null, hasTrack: (trackId: string) => boolean): boolean {\n const missingTrackIds = this.getMissingTrackIds(stage, hasTrack);\n if (missingTrackIds.length === 0) {\n return false;\n }\n this.waitingTracksListValidation = true;\n return true;\n }\n\n private validateTracksListRefreshed(stage: IviStageComposition | null, hasTrack: (trackId: string) => boolean): void {\n if (!this.waitingTracksListValidation) {\n return;\n }\n this.waitingTracksListValidation = false;\n const missingTrackIds = this.getMissingTrackIds(stage, hasTrack);\n if (missingTrackIds.length > 0) {\n throw new Error(\n `Runtime track sync failed: missing tracks after session.tracks.list.response: ${missingTrackIds.join(\", \")}`\n );\n }\n }\n\n public reset(): void {\n this.waitingTracksListValidation = false;\n this.waitingSourcesListValidation = false;\n }\n\n private onSessionCreated(event: ReceiveSessionCreatedEvent): void {\n this.stageManager.reset();\n this.trackManager.reset();\n this.sourceManager.reset();\n this.streamManager.reset();\n this.trtcSourceManager.reset();\n this.livekitSourceManager.reset();\n this.conversationManager.reset();\n this.reset();\n\n const nextStatus = this.config.syncStageOnSessionCreated !== false ? \"syncing\" : \"running\";\n this.setState({\n status: nextStatus,\n session: event.session,\n stage: this.stageManager.getStage(),\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll(),\n streams: this.streamManager.getAll(),\n conversationItems: this.conversationManager.getAllMap(),\n conversations: this.conversationManager.getOrderedList()\n });\n\n if (this.config.syncStageOnSessionCreated !== false) {\n this.client.sendSessionStageGet();\n }\n }\n\n private onSessionEnded(event: ReceiveSessionEndedEvent): void {\n this.resetStoppedState();\n this.config.onSessionEnded?.(event);\n }\n\n private onStageChanged(fromStageGetResponse: boolean): void {\n const nextStatus = fromStageGetResponse && this.state.status === \"syncing\" ? \"running\" : this.state.status;\n const nextStage = this.stageManager.getStage();\n this.setState({\n ...this.state,\n status: nextStatus,\n stage: nextStage\n });\n\n const shouldFetchTracks = this.validateStageTracks(nextStage, (trackId) => this.trackManager.has(trackId));\n if (shouldFetchTracks) {\n this.client.sendSessionTracksList();\n return;\n }\n this.ensureSourcesSyncedForTracks();\n }\n\n private onTracksChanged(listRefreshed: boolean): void {\n const nextStage = this.stageManager.getStage();\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll()\n });\n if (listRefreshed) {\n this.validateTracksListRefreshed(nextStage, (trackId) => this.trackManager.has(trackId));\n }\n this.ensureSourcesSyncedForTracks();\n }\n\n private applyLocalTrackTake(trackId: string): void {\n this.trackManager.applyTrackTook(trackId);\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll()\n });\n }\n\n private async deferredTrtcTakeCompleteAndTake(\n trackId: string,\n nextSourceId: string,\n completedSourceId: string,\n completedTrackIdArg?: string\n ): Promise<void> {\n const remoteVideoAvailable = await this.trtcSourceManager.waitForRemoteVideoAvailable(nextSourceId);\n if (!remoteVideoAvailable) return;\n\n if (this.state.status !== \"running\") return;\n\n const currentTrack = this.trackManager.getAll().get(trackId);\n if (!currentTrack || currentTrack.next_source_id !== nextSourceId) {\n return;\n }\n\n this.applyLocalTrackTake(trackId);\n this.client.sendSessionSourcePlaybackCompleted(completedSourceId, completedTrackIdArg);\n this.sendSessionTrackTake(trackId);\n }\n\n private async deferredLivekitTakeCompleteAndTake(\n trackId: string,\n nextSourceId: string,\n completedSourceId: string,\n completedTrackIdArg?: string\n ): Promise<void> {\n const remoteVideoAvailable = await this.livekitSourceManager.waitForRemoteVideoAvailable(nextSourceId);\n if (!remoteVideoAvailable) return;\n\n if (this.state.status !== \"running\") return;\n\n const currentTrack = this.trackManager.getAll().get(trackId);\n if (!currentTrack || currentTrack.next_source_id !== nextSourceId) {\n return;\n }\n\n this.applyLocalTrackTake(trackId);\n this.client.sendSessionSourcePlaybackCompleted(completedSourceId, completedTrackIdArg);\n this.sendSessionTrackTake(trackId);\n }\n\n private sendSessionTrackTake(trackId: string): void {\n const message: SendSessionTrackTakePayload = {\n type: \"session.track.take\",\n track_id: trackId\n };\n void this.client.send(message);\n }\n\n private onSourcesChanged(listRefreshed: boolean): void {\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n sources: this.sourceManager.getAll()\n });\n if (listRefreshed) {\n this.validateSourcesListRefreshed((sourceId) => this.sourceManager.has(sourceId));\n }\n }\n\n private onStreamsChanged(): void {\n this.setState({\n ...this.state,\n streams: this.streamManager.getAll()\n });\n }\n\n private onConversationsChanged(): void {\n this.setState({\n ...this.state,\n conversationItems: this.conversationManager.getAllMap(),\n conversations: this.conversationManager.getOrderedList()\n });\n }\n\n private setState(nextState: IviRuntimeState): void {\n if (\n this.state.status === nextState.status &&\n this.state.session === nextState.session &&\n this.state.stage === nextState.stage &&\n this.state.tracks === nextState.tracks &&\n this.state.sources === nextState.sources &&\n this.state.streams === nextState.streams &&\n this.state.conversationItems === nextState.conversationItems &&\n this.state.conversations === nextState.conversations\n ) {\n return;\n }\n this.state = nextState;\n this.stateListeners.forEach((listener) => listener(this.state));\n }\n\n private emitEvent(event: Parameters<IviRuntimeEventListener>[0]): void {\n this.progressUserTextToResponseFlows(event);\n this.eventListeners.forEach((listener) => listener(event, this.state));\n }\n\n private emitTrtcEvent(event: IviRuntimeTrtcEvent): void {\n this.config.onTrtcEvent?.(event);\n this.trtcEventListeners.forEach((listener) => listener(event));\n }\n\n private resetStoppedState(): void {\n this.rejectPendingUserTextToResponseFlows(\n new Error(\"Runtime stopped before user text to response flow completed.\")\n );\n this.sessionManager.reset();\n this.stageManager.reset();\n this.trackManager.reset();\n this.sourceManager.reset();\n this.streamManager.reset();\n this.trtcSourceManager.reset();\n this.livekitSourceManager.reset();\n this.conversationManager.reset();\n this.reset();\n this.setState({\n status: \"stopped\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n });\n }\n\n private ensureSourcesSyncedForTracks(): void {\n const missingSourceIds = this.getMissingSourceIds((sourceId) => this.sourceManager.has(sourceId));\n if (missingSourceIds.length === 0) {\n return;\n }\n this.waitingSourcesListValidation = true;\n this.client.sendSessionSourcesList();\n }\n\n private validateSourcesListRefreshed(hasSource: (sourceId: string) => boolean): void {\n if (!this.waitingSourcesListValidation) {\n return;\n }\n this.waitingSourcesListValidation = false;\n const missingSourceIds = this.getMissingSourceIds(hasSource);\n if (missingSourceIds.length > 0) {\n throw new Error(\n `Runtime source sync failed: missing sources after session.sources.list.response: ${missingSourceIds.join(\", \")}`\n );\n }\n }\n\n private getMissingTrackIds(\n stage: IviStageComposition | null,\n hasTrack: (trackId: string) => boolean\n ): string[] {\n if (!stage) {\n return [];\n }\n const missing = new Set<string>();\n (stage.composition ?? []).forEach((item) => {\n if (!hasTrack(item.track_id)) {\n missing.add(item.track_id);\n }\n });\n return Array.from(missing);\n }\n\n private getMissingSourceIds(hasSource: (sourceId: string) => boolean): string[] {\n const missing = new Set<string>();\n this.trackManager.getAll().forEach((track) => {\n if (track.active_source_id && !hasSource(track.active_source_id)) {\n missing.add(track.active_source_id);\n }\n if (track.next_source_id && !hasSource(track.next_source_id)) {\n missing.add(track.next_source_id);\n }\n });\n return Array.from(missing);\n }\n\n private hasPendingResponseFlow(streamId: string): boolean {\n for (const flow of this.pendingUserTextToResponseFlows.values()) {\n if (flow.streamId === streamId) {\n return true;\n }\n }\n return false;\n }\n\n private rejectPendingUserTextToResponseFlows(error: Error): void {\n this.pendingUserTextToResponseFlows.forEach((flow) => {\n flow.reject(error);\n });\n this.pendingUserTextToResponseFlows.clear();\n }\n\n private progressUserTextToResponseFlows(event: Parameters<IviRuntimeEventListener>[0]): void {\n if (event instanceof ReceiveConversationItemAddedEvent) {\n if (!event.item.id) {\n return;\n }\n const flow = this.pendingUserTextToResponseFlows.get(event.item.id);\n if (!flow) {\n return;\n }\n flow.addedEvent = event;\n flow.callbacks?.onConversationItemAdded?.(event);\n this.tryTriggerResponseCreate(flow);\n return;\n }\n\n if (event instanceof ReceiveConversationItemDoneEvent) {\n if (!event.item.id) {\n return;\n }\n const flow = this.pendingUserTextToResponseFlows.get(event.item.id);\n if (!flow) {\n return;\n }\n flow.doneEvent = event;\n flow.callbacks?.onConversationItemDone?.(event);\n this.tryTriggerResponseCreate(flow);\n return;\n }\n\n if (!(event instanceof ReceiveResponseCreatedEvent)) {\n return;\n }\n const matchedFlow = Array.from(this.pendingUserTextToResponseFlows.values()).find(\n (flow) => flow.responseRequested && flow.streamId === event.streamId\n );\n if (!matchedFlow) {\n return;\n }\n matchedFlow.callbacks?.onResponseCreated?.(event);\n matchedFlow.resolve({\n itemId: matchedFlow.itemId,\n streamId: matchedFlow.streamId,\n responseCreatedEvent: event\n });\n this.pendingUserTextToResponseFlows.delete(matchedFlow.itemId);\n }\n\n private tryTriggerResponseCreate(flow: PendingUserTextToResponseFlow): void {\n if (flow.responseRequested || !flow.addedEvent || !flow.doneEvent) {\n return;\n }\n flow.callbacks?.onConversationItemReady?.({\n itemId: flow.itemId,\n addedEvent: flow.addedEvent,\n doneEvent: flow.doneEvent\n });\n if (flow.responseInput === \"item_reference\") {\n this.client.sendResponseCreateByItemId(flow.itemId, flow.streamId, flow.response);\n } else {\n this.client.sendResponseCreate(flow.streamId, flow.response);\n }\n flow.responseRequested = true;\n }\n\n private buildUserTextItemId(): string {\n this.userTextFlowCounter += 1;\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const randomSuffix = Math.random().toString(36).slice(2, 8);\n return `client.conversation.item.user.text.${timestamp}.${this.userTextFlowCounter}.${randomSuffix}`;\n }\n\n}\n\nfunction isVideoPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || source.status !== \"ready\" || !source.playback) return false;\n if (source.playback.type === \"trtc\") return false;\n if (isLivekitSourcePlayback(source.playback)) return false;\n if (source.source.asset_type === \"image\") return false;\n return source.playback.type === \"url\" && Boolean(source.playback.url);\n}\n\nfunction isTrtcPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || !source.playback) return false;\n return source.playback.type === \"trtc\" && Boolean(source.playback.trtc);\n}\n\nfunction isLivekitPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || !source.playback) return false;\n return isLivekitSourcePlayback(source.playback);\n}\n\n","import { IviClient } from \"@vivix-ai/ivi-sdk-ts\";\nimport { IviRuntimeCoordinator } from \"./runtime/runtime-coordinator\";\nimport type { IviClientConfig } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeCoordinatorConfig } from \"./runtime/types\";\n\nexport type IviFrontendClientConfig = IviClientConfig;\n\nexport class IviFrontendSdk {\n public createClient(config: IviFrontendClientConfig): IviClient {\n return new IviClient(config);\n }\n\n public createRuntimeCoordinator(\n clientConfig: IviFrontendClientConfig,\n runtimeConfig?: IviRuntimeCoordinatorConfig\n ): IviRuntimeCoordinator {\n const client = this.createClient(clientConfig);\n return new IviRuntimeCoordinator(client, runtimeConfig);\n }\n}\n","import { createContext } from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeState } from \"../runtime/types\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeSource } from \"../runtime/types\";\n\nexport interface IviStageSlotBinding {\n slot: string;\n trackId: string;\n track?: IviTrack;\n sourceId: string | null;\n source?: IviRuntimeSource;\n}\n\nexport interface IviStageViewContextValue {\n runtime: IviRuntimeCoordinator | null;\n state: IviRuntimeState;\n slotTrackMap: Map<string, string>;\n slotBindings: IviStageSlotBinding[];\n}\n\nexport const IviStageViewContext = createContext<IviStageViewContextValue | null>(null);\n","import { useEffect, useState } from \"react\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeState } from \"../runtime/types\";\n\nexport const EMPTY_RUNTIME_STATE: IviRuntimeState = {\n status: \"idle\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n};\n\nexport function useRuntimeState(runtime: IviRuntimeCoordinator | null): IviRuntimeState {\n const [state, setState] = useState<IviRuntimeState>(() => runtime?.getState() ?? EMPTY_RUNTIME_STATE);\n\n useEffect(() => {\n if (!runtime) {\n setState(EMPTY_RUNTIME_STATE);\n return;\n }\n setState(runtime.getState());\n return runtime.onStateChange((next) => {\n setState(next);\n });\n }, [runtime]);\n\n return state;\n}\n","import {\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeState } from \"../runtime/types\";\nimport { IviStageViewContext } from \"./stage-view-context\";\nimport type { IviStageSlotBinding } from \"./stage-view-context\";\nimport { useRuntimeState } from \"./use-runtime-state\";\nimport type { ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\n\ntype IVIStageViewRenderChildren = (context: {\n runtime: IviRuntimeCoordinator | null;\n slotTrackMap: Map<string, string>;\n slotBindings: IviStageSlotBinding[];\n}) => ReactNode;\n\nexport interface IVIStageViewProps {\n children?: ReactNode | IVIStageViewRenderChildren;\n className?: string;\n style?: CSSProperties;\n runtime: IviRuntimeCoordinator | null;\n onBindingsChange?: (bindings: IviStageSlotBinding[]) => void;\n onRuntimeEvent?: (event: ParsedIviEvent) => void;\n}\n\n/**\n * 顶层舞台容器:负责把 runtime state 注入到内部 TrackSlot。\n */\nexport function IVIStageView(props: IVIStageViewProps): ReactElement {\n const {\n children,\n className,\n style,\n runtime,\n onBindingsChange,\n onRuntimeEvent\n } = props;\n const state = useRuntimeState(runtime);\n\n const slotTrackMap = useMemo(() => {\n return buildSlotTrackMapFromState(state);\n }, [state.stage]);\n\n const slotBindings = useMemo<IviStageSlotBinding[]>(() => {\n return buildSlotBindingsFromState(state);\n }, [state.stage, state.tracks, state.sources]);\n\n useEffect(() => {\n onBindingsChange?.(slotBindings);\n }, [slotBindings, onBindingsChange]);\n\n useEffect(() => {\n if (!runtime || !onRuntimeEvent) {\n return;\n }\n return runtime.onEvent((event) => {\n onRuntimeEvent(event);\n });\n }, [runtime, onRuntimeEvent]);\n\n const contextValue = useMemo(\n () => ({\n runtime,\n state,\n slotTrackMap,\n slotBindings\n }),\n [runtime, state, slotTrackMap, slotBindings]\n );\n\n const resolvedChildren =\n typeof children === \"function\"\n ? children({\n runtime,\n slotTrackMap,\n slotBindings\n })\n : children;\n\n const rootStyle: CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n ...(style ?? {})\n };\n return (\n <div className={className} style={rootStyle}>\n <IviStageViewContext.Provider value={contextValue}>{resolvedChildren}</IviStageViewContext.Provider>\n </div>\n );\n}\n\nfunction buildSlotTrackMapFromState(state: IviRuntimeState): Map<string, string> {\n const map = new Map<string, string>();\n (state.stage?.composition ?? []).forEach((item) => {\n map.set(item.slot, item.track_id);\n });\n return map;\n}\n\nfunction buildSlotBindingsFromState(state: IviRuntimeState): IviStageSlotBinding[] {\n const bindings: IviStageSlotBinding[] = [];\n (state.stage?.composition ?? []).forEach((item) => {\n const track = state.tracks.get(item.track_id);\n const sourceId = track?.active_source_id ?? null;\n const source = sourceId ? state.sources.get(sourceId) : undefined;\n bindings.push({\n slot: item.slot,\n trackId: item.track_id,\n track,\n sourceId,\n source\n });\n });\n return bindings;\n}\n\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode\n} from \"react\";\n\n// ---- 音量记忆 ----\n\nconst VOLUME_STORAGE_KEY = \"ivi-volume-preferences\";\nconst DEFAULT_VOLUME = 80;\n\nexport type IviMediaVolumeType = \"trtc\" | \"video\" | \"hls\" | \"livekit\";\n\ninterface VolumePreferences {\n trtc: number;\n video: number;\n hls: number;\n livekit: number;\n}\n\nfunction clampVolume(v: number): number {\n return Math.max(0, Math.min(100, Math.round(v)));\n}\n\nfunction loadVolumePreferences(): VolumePreferences {\n try {\n const raw = localStorage.getItem(VOLUME_STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Partial<VolumePreferences>;\n return {\n trtc: clampVolume(parsed.trtc ?? DEFAULT_VOLUME),\n video: clampVolume(parsed.video ?? DEFAULT_VOLUME),\n hls: clampVolume(parsed.hls ?? DEFAULT_VOLUME),\n livekit: clampVolume(parsed.livekit ?? DEFAULT_VOLUME)\n };\n }\n } catch {\n /* noop */\n }\n return {\n trtc: DEFAULT_VOLUME,\n video: DEFAULT_VOLUME,\n hls: DEFAULT_VOLUME,\n livekit: DEFAULT_VOLUME\n };\n}\n\nfunction saveVolumePreferences(prefs: VolumePreferences): void {\n try {\n localStorage.setItem(VOLUME_STORAGE_KEY, JSON.stringify(prefs));\n } catch {\n /* noop */\n }\n}\n\n/**\n * 按媒体类型记忆音量偏好(0-100),自动持久化到 localStorage。\n * mediaType 为 null 时返回默认值且不做持久化。\n */\nexport function useVolumeMemory(\n mediaType: IviMediaVolumeType | null\n): [number, (v: number) => void] {\n const [prefs, setPrefs] = useState(loadVolumePreferences);\n\n const setVolume = useCallback(\n (v: number) => {\n if (!mediaType) return;\n setPrefs((prev) => {\n const next = { ...prev, [mediaType]: clampVolume(v) };\n saveVolumePreferences(next);\n return next;\n });\n },\n [mediaType]\n );\n\n return [mediaType ? prefs[mediaType] : DEFAULT_VOLUME, setVolume];\n}\n\n// ---- 默认喇叭图标 ----\n\nfunction DefaultSpeakerIcon({ volume, color }: { volume: number; color: string }): ReactNode {\n if (volume === 0) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M22 9l-6 6M16 9l6 6\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n if (volume < 50) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M15.54 8.46a5 5 0 010 7.07\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M15.54 8.46a5 5 0 010 7.07\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <path\n d=\"M19.07 4.93a10 10 0 010 14.14\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ---- 自定义滑条 ----\n\nfunction VolumeSlider({\n value,\n onChange,\n trackBg,\n fillColor,\n thumbColor\n}: {\n value: number;\n onChange: (v: number) => void;\n trackBg: string;\n fillColor: string;\n thumbColor: string;\n}): ReactNode {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const calcValue = useCallback(\n (clientX: number) => {\n const el = trackRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n onChange(Math.round(ratio * 100));\n },\n [onChange]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n calcValue(e.clientX);\n },\n [calcValue]\n );\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.buttons === 0) return;\n calcValue(e.clientX);\n },\n [calcValue]\n );\n\n const pct = `${value}%`;\n\n return (\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n style={{\n position: \"relative\",\n flex: 1,\n height: 4,\n minWidth: 60,\n borderRadius: 2,\n backgroundColor: trackBg,\n cursor: \"pointer\",\n touchAction: \"none\"\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n height: \"100%\",\n width: pct,\n borderRadius: 2,\n backgroundColor: fillColor,\n pointerEvents: \"none\"\n }}\n />\n <div\n style={{\n position: \"absolute\",\n left: pct,\n top: \"50%\",\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n backgroundColor: thumbColor,\n transform: \"translate(-50%, -50%)\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.3)\",\n pointerEvents: \"none\"\n }}\n />\n </div>\n );\n}\n\n// ---- 音量控制组件 ----\n\nexport interface IVIVolumeControlColors {\n /** 容器背景色,默认 rgba(0, 0, 0, 0.55) */\n background?: string;\n /** 前景色(图标、文字、滑块填充),默认 #fff */\n foreground?: string;\n /** 滑轨底色,默认 rgba(255, 255, 255, 0.25) */\n trackBackground?: string;\n /** 滑轨已填充部分颜色,默认同 foreground */\n trackFill?: string;\n}\n\nexport interface IVIVolumeControlProps {\n /** 当前音量 0-100 */\n volume: number;\n /** 音量变化回调 */\n onVolumeChange: (volume: number) => void;\n /** 自定义喇叭图标渲染,接收当前音量以决定显示状态 */\n renderSpeakerIcon?: (volume: number) => ReactNode;\n /** 颜色配置 */\n colors?: IVIVolumeControlColors;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: CSSProperties;\n}\n\n/**\n * 胶囊形音量调节控件:喇叭图标 + 滑条 + 百分比数字。\n * 点击喇叭切换静音/恢复,拖动滑条调节音量。\n */\nexport function IVIVolumeControl(props: IVIVolumeControlProps): ReactNode {\n const { volume, onVolumeChange, renderSpeakerIcon, colors, className, style } = props;\n\n const bg = colors?.background ?? \"rgba(0, 0, 0, 0.55)\";\n const fg = colors?.foreground ?? \"#fff\";\n const trackBg = colors?.trackBackground ?? \"rgba(255, 255, 255, 0.25)\";\n const trackFill = colors?.trackFill ?? fg;\n\n const prevVolumeRef = useRef(volume > 0 ? volume : DEFAULT_VOLUME);\n if (volume > 0) {\n prevVolumeRef.current = volume;\n }\n\n const toggleMute = useCallback(() => {\n onVolumeChange(volume > 0 ? 0 : prevVolumeRef.current);\n }, [volume, onVolumeChange]);\n\n return (\n <div\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 999,\n backgroundColor: bg,\n color: fg,\n userSelect: \"none\",\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n lineHeight: 1,\n ...style\n }}\n >\n <div\n onClick={toggleMute}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") toggleMute();\n }}\n style={{ cursor: \"pointer\", display: \"flex\", alignItems: \"center\", flexShrink: 0 }}\n >\n {renderSpeakerIcon ? (\n renderSpeakerIcon(volume)\n ) : (\n <DefaultSpeakerIcon volume={volume} color={fg} />\n )}\n </div>\n <VolumeSlider\n value={volume}\n onChange={onVolumeChange}\n trackBg={trackBg}\n fillColor={trackFill}\n thumbColor={fg}\n />\n <span\n style={{\n minWidth: 28,\n textAlign: \"right\",\n fontSize: 11,\n opacity: 0.9,\n flexShrink: 0,\n fontVariantNumeric: \"tabular-nums\"\n }}\n >\n {volume}%\n </span>\n </div>\n );\n}\n\n// ---- TrackSlot 集成辅助 ----\n\n/**\n * 将音量设置同步到容器内 active 槽位的所有 video/audio 元素。\n * 内部使用 MutationObserver 以应对 TRTC 等异步创建的媒体元素。\n */\nexport function useApplyVolumeToSlot(\n containerRef: React.RefObject<HTMLElement | null>,\n volume: number,\n enabled: boolean,\n activeSourceId?: string | null\n): void {\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !enabled) return;\n\n const normalizedVolume = clampVolume(volume) / 100;\n\n const apply = (): void => {\n const activeSlot = container.querySelector('[data-ivi-slot-role=\"active\"]');\n if (!activeSlot) return;\n activeSlot\n .querySelectorAll<HTMLVideoElement | HTMLAudioElement>(\"video, audio\")\n .forEach((el) => {\n el.volume = normalizedVolume;\n });\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(container, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [containerRef, volume, enabled, activeSourceId]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeConversationItem } from \"../runtime/types\";\n\nexport type IviSubtitleRole = IviRuntimeConversationItem[\"role\"];\n\nexport interface IviSubtitleItem {\n id: string;\n role: IviSubtitleRole;\n lifecycle: IviRuntimeConversationItem[\"lifecycle\"];\n status: IviRuntimeConversationItem[\"status\"];\n text: string;\n transcript: string;\n displayText: string;\n content: IviRuntimeConversationItem[\"content\"];\n item: IviRuntimeConversationItem[\"item\"];\n /** 首次进入字幕队列的时间戳。 */\n timestamp: number;\n /** 最近一次字幕内容或状态更新的时间戳。 */\n updatedAt: number;\n}\n\nexport interface IviUseSubtitlesOptions {\n /** 要收集的发言人角色,默认 [\"user\"]。传单个字符串或数组均可。 */\n roles?: IviSubtitleRole | IviSubtitleRole[];\n /** 最多保留的字幕条数,超过后自动清理最旧条目,默认 2。 */\n maxItems?: number;\n}\n\n/**\n * 监听 runtime 中的 conversation/response 事件,并维护当前应展示的字幕队列。\n */\nexport function useIviSubtitles(\n runtime: IviRuntimeCoordinator | null,\n options: IviUseSubtitlesOptions = {}\n): IviSubtitleItem[] {\n const roles = options.roles ?? \"user\";\n const maxItems = normalizeMaxItems(options.maxItems);\n const roleKey = Array.isArray(roles) ? roles.join(\"\\u0000\") : roles;\n const roleSet = useMemo(\n () => new Set<IviSubtitleRole>(roleKey.split(\"\\u0000\") as IviSubtitleRole[]),\n [roleKey]\n );\n const [subtitles, setSubtitles] = useState<IviSubtitleItem[]>([]);\n const seenIdsRef = useRef(new Set<string>());\n const initializedRef = useRef(false);\n\n useEffect(() => {\n seenIdsRef.current = new Set();\n initializedRef.current = false;\n setSubtitles([]);\n\n if (!runtime) {\n return;\n }\n\n const syncConversations = (conversations: IviRuntimeConversationItem[]): void => {\n const now = Date.now();\n const seenIds = seenIdsRef.current;\n\n if (!initializedRef.current) {\n initializedRef.current = true;\n for (const item of conversations) {\n if (item.lifecycle === \"done\" || !getDisplayText(item) || !roleSet.has(item.role)) {\n seenIds.add(item.id);\n }\n }\n }\n\n setSubtitles((previous) => {\n const conversationMap = new Map(conversations.map((item) => [item.id, item]));\n const nextById = new Map<string, IviSubtitleItem>();\n\n for (const previousItem of previous) {\n const conversation = conversationMap.get(previousItem.id);\n if (!conversation || !roleSet.has(conversation.role) || !getDisplayText(conversation)) {\n continue;\n }\n nextById.set(\n previousItem.id,\n buildSubtitleItem(\n conversation,\n previousItem.timestamp,\n hasSubtitleChanged(previousItem, conversation) ? now : previousItem.updatedAt\n )\n );\n }\n\n for (const conversation of conversations) {\n if (!roleSet.has(conversation.role) || !getDisplayText(conversation)) {\n continue;\n }\n if (seenIds.has(conversation.id)) {\n continue;\n }\n seenIds.add(conversation.id);\n nextById.set(conversation.id, buildSubtitleItem(conversation, now, now));\n }\n\n const next = Array.from(nextById.values());\n if (maxItems === 0) {\n return [];\n }\n return next.length > maxItems ? next.slice(next.length - maxItems) : next;\n });\n };\n\n syncConversations(runtime.getState().conversations);\n\n return runtime.onEvent((event, state) => {\n if (event.type === \"session.ended\") {\n seenIdsRef.current = new Set();\n initializedRef.current = false;\n setSubtitles([]);\n return;\n }\n if (!isSubtitleRelatedEvent(event.type)) {\n return;\n }\n syncConversations(state.conversations);\n });\n }, [runtime, roleSet, maxItems]);\n\n return subtitles;\n}\n\nfunction normalizeMaxItems(maxItems: number | undefined): number {\n if (maxItems === undefined) {\n return 2;\n }\n if (!Number.isFinite(maxItems)) {\n return 2;\n }\n return Math.max(0, Math.floor(maxItems));\n}\n\nfunction getDisplayText(item: IviRuntimeConversationItem): string {\n return item.text || item.transcript;\n}\n\nfunction buildSubtitleItem(\n item: IviRuntimeConversationItem,\n timestamp: number,\n updatedAt: number\n): IviSubtitleItem {\n return {\n id: item.id,\n role: item.role,\n lifecycle: item.lifecycle,\n status: item.status,\n text: item.text,\n transcript: item.transcript,\n displayText: getDisplayText(item),\n content: item.content,\n item: item.item,\n timestamp,\n updatedAt\n };\n}\n\nfunction hasSubtitleChanged(previous: IviSubtitleItem, next: IviRuntimeConversationItem): boolean {\n return (\n previous.text !== next.text ||\n previous.transcript !== next.transcript ||\n previous.lifecycle !== next.lifecycle ||\n previous.status !== next.status ||\n previous.role !== next.role\n );\n}\n\nfunction isSubtitleRelatedEvent(type: string): boolean {\n return type.startsWith(\"conversation.\") || type.startsWith(\"response.\");\n}\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport {\n useIviSubtitles,\n type IviUseSubtitlesOptions\n} from \"./use-ivi-subtitles\";\n\n// ---- 字幕浮层组件 ----\n\nexport interface IVISubtitleOverlayStyle {\n /** 字体,默认 system-ui */\n fontFamily?: string;\n /** 字体大小,默认 14px */\n fontSize?: number | string;\n /** 字体颜色,默认 #fff */\n color?: string;\n /** 胶囊背景色,默认 rgba(0, 0, 0, 0.6) */\n background?: string;\n}\n\nexport interface IVISubtitleOverlayProps {\n /** 字幕来源 runtime。 */\n runtime: IviRuntimeCoordinator | null;\n /** 要显示的发言人角色,默认 [\"user\"]。传单个字符串或数组均可。 */\n roles?: IviUseSubtitlesOptions[\"roles\"];\n /** 最多保留的字幕条数,默认 2。 */\n maxItems?: number;\n /** @deprecated Use `maxItems` instead. */\n maxVisible?: number;\n /** 样式配置 */\n subtitleStyle?: IVISubtitleOverlayStyle;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: CSSProperties;\n}\n\nconst BREATHE_KEYFRAMES = `@keyframes ivi-subtitle-breathe{0%,100%{opacity:1}50%{opacity:.55}}`;\n\n/**\n * 字幕浮层:基于 useIviSubtitles 的预制 UI,胶囊形半透明黑底白字。\n * added 阶段背景呼吸闪动;字幕保留与裁剪由 hook 的 maxItems 控制。\n */\nexport function IVISubtitleOverlay(props: IVISubtitleOverlayProps): ReactNode {\n const {\n runtime,\n roles = \"user\",\n maxItems,\n maxVisible,\n subtitleStyle,\n className,\n style\n } = props;\n const entries = useIviSubtitles(runtime, {\n roles,\n maxItems: maxItems ?? maxVisible\n });\n\n if (entries.length === 0) return null;\n\n const fontFamily = subtitleStyle?.fontFamily ?? \"system-ui, -apple-system, sans-serif\";\n const fontSize = subtitleStyle?.fontSize ?? 14;\n const color = subtitleStyle?.color ?? \"#fff\";\n const bg = subtitleStyle?.background ?? \"rgba(0, 0, 0, 0.6)\";\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 6,\n pointerEvents: \"none\",\n ...style\n }}\n >\n <style>{BREATHE_KEYFRAMES}</style>\n {entries.map((entry) => (\n <div\n key={entry.id}\n style={{\n display: \"inline-block\",\n padding: \"5px 16px\",\n borderRadius: 999,\n backgroundColor: bg,\n color,\n fontSize,\n fontFamily,\n lineHeight: 1.5,\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n animation:\n entry.lifecycle === \"added\"\n ? \"ivi-subtitle-breathe 1.5s ease-in-out infinite\"\n : undefined\n }}\n >\n {entry.displayText}\n </div>\n ))}\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { IviStageViewContext } from \"./stage-view-context\";\nimport type { IviStageViewContextValue } from \"./stage-view-context\";\n\nexport function useIviStageView(): IviStageViewContextValue {\n const context = useContext(IviStageViewContext);\n if (!context) {\n throw new Error(\"useIviStageView must be used inside IVIStageView.\");\n }\n return context;\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { IviSourcePlaybackTrtc } from \"../runtime/sdk-types\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeTrtcAIDenoiserOptions } from \"../runtime/types\";\nimport { TrtcSourceManager } from \"../runtime/managers/trtc-source-manager\";\n\nexport interface IVITrtcPlayerProps {\n trtc: IviSourcePlaybackTrtc;\n sourceId?: string;\n runtime?: IviRuntimeCoordinator | null;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n muted?: boolean;\n /**\n * 独立使用 IVITrtcPlayer(未传 runtime)时的 TRTC AIDenoiser 降噪配置。\n * 默认开启;传 false 可关闭。\n */\n trtcAIDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions;\n}\n\nconst standaloneTrtcSourceManager = new TrtcSourceManager();\n\n/**\n * 默认 TRTC 播放器:挂载即加入房间并拉流,连接由 TrtcSourceManager 统一复用。\n * muted 变化仅更新音频策略,不触发重连。\n */\nexport function IVITrtcPlayer(props: IVITrtcPlayerProps): ReactNode {\n const {\n trtc,\n sourceId,\n runtime,\n className,\n style,\n loadingFallback = null,\n errorFallback = null,\n muted = false,\n trtcAIDenoiser\n } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewIdRef = useRef(`trtc-view-${Math.random().toString(36).slice(2, 10)}`);\n const manager = runtime?.getTrtcSourceManager() ?? standaloneTrtcSourceManager;\n const resolvedSourceId = useMemo(\n () => sourceId ?? `adhoc:${trtc.app_id}:${trtc.user_id}:${trtc.room_id}`,\n [sourceId, trtc.app_id, trtc.room_id, trtc.user_id]\n );\n const shouldManageSourceLifecycle = !runtime || !sourceId;\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n\n // 连接生命周期:挂载即加入房间并 startRemoteVideo(初始按当前 muted 值静音)。\n // muted 不在依赖中——变化时仅由下方独立 effect 更新音频策略,避免 detach/reattach 导致重复拉流。\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n let disposed = false;\n if (shouldManageSourceLifecycle) {\n manager.upsertSource(resolvedSourceId, trtc, trtcAIDenoiser);\n }\n const unsubscribe = manager.subscribe(resolvedSourceId, (snapshot) => {\n if (disposed) {\n return;\n }\n setLoading(snapshot.status === \"idle\" || snapshot.status === \"connecting\");\n setError(snapshot.status === \"error\" ? snapshot.error ?? \"TRTC 拉流失败\" : null);\n });\n\n void manager\n .attachView(resolvedSourceId, viewIdRef.current, container, mutedRef.current)\n .catch((caughtError) => {\n if (disposed) {\n return;\n }\n setError(caughtError instanceof Error ? caughtError.message : \"TRTC 拉流失败\");\n setLoading(false);\n });\n\n return () => {\n disposed = true;\n unsubscribe();\n manager.detachView(resolvedSourceId, viewIdRef.current);\n if (shouldManageSourceLifecycle) {\n manager.removeSource(resolvedSourceId);\n }\n };\n }, [\n manager,\n resolvedSourceId,\n shouldManageSourceLifecycle,\n trtc.app_id,\n trtc.room_id,\n trtc.user_id,\n trtc.user_sig,\n trtcAIDenoiser\n ]);\n\n // 音频策略独立于连接生命周期,muted 变化时仅调整远端音频静音状态。\n useEffect(() => {\n manager.updateViewMuted(resolvedSourceId, viewIdRef.current, muted);\n }, [manager, muted, resolvedSourceId]);\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n backgroundColor: \"#000\",\n position: \"relative\",\n ...style\n }}\n >\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\n {loading ? loadingFallback : null}\n {error ? (errorFallback ?? <div>{error}</div>) : null}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport { LivekitSourceManager } from \"../runtime/managers/livekit-source-manager\";\nimport { describeLivekitRoom, type IviSourcePlaybackLivekit } from \"../runtime/livekit-types\";\n\nexport interface IVILivekitPlayerProps {\n livekit: IviSourcePlaybackLivekit;\n sourceId?: string;\n runtime?: IviRuntimeCoordinator | null;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n muted?: boolean;\n}\n\nconst standaloneLivekitSourceManager = new LivekitSourceManager();\n\n/**\n * 默认 LiveKit 播放器:挂载即加入房间并拉流,连接由 LivekitSourceManager 统一复用。\n * muted 变化仅更新音频静音策略,不触发重连。\n */\nexport function IVILivekitPlayer(props: IVILivekitPlayerProps): ReactNode {\n const {\n livekit,\n sourceId,\n runtime,\n className,\n style,\n loadingFallback = null,\n errorFallback = null,\n muted = false\n } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewIdRef = useRef(`livekit-view-${Math.random().toString(36).slice(2, 10)}`);\n const manager = runtime?.getLivekitSourceManager() ?? standaloneLivekitSourceManager;\n const resolvedSourceId = useMemo(\n () => sourceId ?? `adhoc:${livekit.ws_url}:${describeLivekitRoom(livekit)}:${livekit.token}`,\n [sourceId, livekit]\n );\n const shouldManageSourceLifecycle = !runtime || !sourceId;\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n\n // 连接生命周期:挂载即加入房间并 attach view(初始按当前 muted 值静音)。\n // muted 不在依赖中——变化时仅由下方独立 effect 更新静音策略,避免 detach/reattach 导致重复拉流。\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n let disposed = false;\n if (shouldManageSourceLifecycle) {\n manager.upsertSource(resolvedSourceId, livekit);\n }\n const unsubscribe = manager.subscribe(resolvedSourceId, (snapshot) => {\n if (disposed) {\n return;\n }\n setLoading(snapshot.status === \"idle\" || snapshot.status === \"connecting\");\n setError(snapshot.status === \"error\" ? snapshot.error ?? \"LiveKit 拉流失败\" : null);\n });\n\n void manager\n .attachView(resolvedSourceId, viewIdRef.current, container, mutedRef.current)\n .catch((caughtError) => {\n if (disposed) {\n return;\n }\n setError(caughtError instanceof Error ? caughtError.message : \"LiveKit 拉流失败\");\n setLoading(false);\n });\n\n return () => {\n disposed = true;\n unsubscribe();\n manager.detachView(resolvedSourceId, viewIdRef.current);\n if (shouldManageSourceLifecycle) {\n manager.removeSource(resolvedSourceId);\n }\n };\n }, [\n manager,\n resolvedSourceId,\n shouldManageSourceLifecycle,\n livekit.ws_url,\n livekit.token,\n livekit.room,\n livekit.identity\n ]);\n\n // 静音策略独立于连接生命周期,muted 变化时仅调整远端音频静音状态。\n useEffect(() => {\n manager.updateViewMuted(resolvedSourceId, viewIdRef.current, muted);\n }, [manager, muted, resolvedSourceId]);\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n backgroundColor: \"#000\",\n position: \"relative\",\n ...style\n }}\n >\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\n {loading ? loadingFallback : null}\n {error ? (errorFallback ?? <div>{error}</div>) : null}\n </div>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n type CSSProperties,\n type ReactNode,\n type SyntheticEvent,\n type VideoHTMLAttributes\n} from \"react\";\n\nexport interface IVIFlvVideoProps {\n url: string;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n style?: CSSProperties;\n /** 是否为直播流,默认 true */\n isLive?: boolean;\n /** 为 true 时暂停播放(用于 standby 槽位预加载) */\n paused?: boolean;\n}\n\ninterface XgplayerLike {\n play(): Promise<void> | void;\n pause(): void;\n destroy(): void;\n on(event: string, callback: (...args: unknown[]) => void): void;\n off(event: string, callback: (...args: unknown[]) => void): void;\n muted: boolean;\n volume: number;\n}\n\ntype XgplayerCtor = new (options: Record<string, unknown>) => XgplayerLike;\n\ntype XgplayerModules = {\n Player: XgplayerCtor;\n FlvPlugin: unknown;\n};\n\nlet loadModulesPromise: Promise<XgplayerModules> | null = null;\n\nasync function loadXgplayerModules(): Promise<XgplayerModules> {\n if (!loadModulesPromise) {\n loadModulesPromise = (async () => {\n try {\n await import(\"xgplayer/dist/index.min.css\");\n } catch (err) {\n console.warn(\"[IVIFlvVideo] 加载 xgplayer 样式失败,播放器控件可能显示异常\", err);\n }\n\n const [playerMod, flvMod] = await Promise.all([import(\"xgplayer\"), import(\"xgplayer-flv\")]);\n\n const playerModule = playerMod as { default?: XgplayerCtor; Player?: XgplayerCtor };\n const flvModule = flvMod as { default?: unknown; FlvPlugin?: unknown };\n\n const Player = (playerModule.default ?? playerModule.Player) as XgplayerCtor | undefined;\n const FlvPlugin = flvModule.default ?? flvModule.FlvPlugin;\n\n if (!Player || !FlvPlugin) {\n throw new Error(\"xgplayer 或 xgplayer-flv 模块导出无效\");\n }\n\n return { Player, FlvPlugin };\n })().catch((err) => {\n loadModulesPromise = null;\n throw err;\n });\n }\n return loadModulesPromise;\n}\n\nexport function IVIFlvVideo(props: IVIFlvVideoProps): ReactNode {\n const { url, videoProps, style, isLive = true, paused = false } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const playerRef = useRef<XgplayerLike | null>(null);\n const pausedRef = useRef(paused);\n const videoPropsRef = useRef(videoProps);\n videoPropsRef.current = videoProps;\n const reactId = useId();\n const containerId = `ivi-flv-${reactId.replace(/:/g, \"\")}`;\n\n useEffect(() => {\n pausedRef.current = paused;\n const player = playerRef.current;\n if (!player) return;\n if (paused) {\n player.pause();\n } else {\n Promise.resolve(player.play()).catch((err) => {\n console.warn(\n \"[IVIFlvVideo] paused→active 切换时 play() 被浏览器拒绝(多半受自动播放策略限制)\",\n err\n );\n });\n }\n }, [paused]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let disposed = false;\n let endedHandler: (() => void) | null = null;\n let errorHandler: ((...args: unknown[]) => void) | null = null;\n\n const setup = async (): Promise<void> => {\n try {\n const { Player, FlvPlugin } = await loadXgplayerModules();\n if (disposed || !containerRef.current) return;\n\n playerRef.current?.destroy();\n playerRef.current = null;\n container.innerHTML = \"\";\n\n const shouldAutoplay = !pausedRef.current;\n const currentVideoProps = videoPropsRef.current;\n const muted = Boolean(currentVideoProps?.muted);\n\n const player = new Player({\n id: containerId,\n el: containerRef.current,\n url,\n plugins: [FlvPlugin],\n isLive,\n autoplay: shouldAutoplay,\n autoplayMuted: muted,\n muted,\n controls: currentVideoProps?.controls ?? true,\n width: \"100%\",\n height: \"100%\",\n fluid: true,\n videoFillMode: \"contain\",\n flv: {\n retryCount: Number.MAX_SAFE_INTEGER,\n retryDelay: 500,\n loadTimeout: 10_000\n }\n });\n\n playerRef.current = player;\n\n errorHandler = (...args: unknown[]) => {\n console.warn(\"[IVIFlvVideo] 播放器 error 事件\", { url, args });\n };\n player.on(\"error\", errorHandler);\n\n const onEnded = currentVideoProps?.onEnded;\n if (onEnded) {\n endedHandler = () => {\n videoPropsRef.current?.onEnded?.({} as SyntheticEvent<HTMLVideoElement, Event>);\n };\n player.on(\"ended\", endedHandler);\n }\n\n if (!pausedRef.current) {\n Promise.resolve(player.play()).catch((err) => {\n console.warn(\"[IVIFlvVideo] 初始 play() 被浏览器拒绝\", err);\n });\n }\n } catch (err) {\n console.warn(\"[IVIFlvVideo] 初始化 xgplayer-flv 失败\", err);\n }\n };\n\n void setup();\n\n return () => {\n disposed = true;\n const player = playerRef.current;\n if (player) {\n if (endedHandler) player.off(\"ended\", endedHandler);\n if (errorHandler) player.off(\"error\", errorHandler);\n player.destroy();\n }\n playerRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = \"\";\n }\n };\n }, [url, isLive, containerId]);\n\n return <div id={containerId} ref={containerRef} style={{ width: \"100%\", height: \"100%\", ...style }} />;\n}\n\nexport function isFlvUrl(url: string): boolean {\n return /\\.flv(?:$|[?#])/i.test(url);\n}\n","import { useEffect, useRef, type CSSProperties, type ReactNode, type VideoHTMLAttributes } from \"react\";\nimport type { IviRuntimeLogCallback, IviRuntimeLogLevel } from \"../runtime/types\";\n\nexport interface IVIHlsVideoProps {\n url: string;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n style?: CSSProperties;\n aggressivePreload?: boolean;\n /** 为 true 时暂停播放(用于 standby 槽位预加载只缓冲不播放) */\n paused?: boolean;\n /** HLS 内部链路日志回调;未传入时不输出日志。 */\n onLog?: IviRuntimeLogCallback;\n}\n\ninterface HlsErrorData {\n fatal?: boolean;\n type?: string;\n details?: string;\n}\n\ninterface HlsLike {\n loadSource(sourceUrl: string): void;\n attachMedia(media: HTMLMediaElement): void;\n on(eventName: string, listener: (eventName: string, data?: HlsErrorData) => void): void;\n startLoad(startPosition?: number): void;\n recoverMediaError(): void;\n destroy(): void;\n}\n\ninterface HlsCtorLike {\n isSupported(): boolean;\n new(config?: Record<string, unknown>): HlsLike;\n Events?: Record<string, string>;\n ErrorTypes?: Record<string, string>;\n ErrorDetails?: Record<string, string>;\n}\n\nconst RETRY_DELAY_MS = 500;\n// hls.js 的 maxNumRetry 参与有限运算,用 MAX_SAFE_INTEGER 近似表达“无限重试”。\nconst UNLIMITED_RETRIES = Number.MAX_SAFE_INTEGER;\nconst HLS_LOG_TAG = \"[IVI-HLS]\";\n\ntype HlsRetryConfig = {\n maxNumRetry: number;\n retryDelayMs: number;\n maxRetryDelayMs: number;\n backoff: \"linear\" | \"exponential\";\n shouldRetry: (\n retryConfig: unknown,\n retryCount: number,\n isTimeout: boolean,\n loaderResponse: unknown,\n retry: boolean\n ) => boolean;\n};\n\ntype HlsLoadPolicy = {\n default: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryConfig;\n errorRetry: HlsRetryConfig;\n };\n};\n\nfunction makeRetryConfig(label: string, kind: \"timeout\" | \"error\", onLog?: IviRuntimeLogCallback): HlsRetryConfig {\n return {\n maxNumRetry: UNLIMITED_RETRIES,\n retryDelayMs: RETRY_DELAY_MS,\n maxRetryDelayMs: RETRY_DELAY_MS,\n backoff: \"linear\",\n shouldRetry: (_config, retryCount, isTimeout) => {\n const reason = kind === \"timeout\" || isTimeout ? \"加载超时\" : \"加载失败\";\n emitHlsLog(\n onLog,\n \"warn\",\n `${label} ${reason},${RETRY_DELAY_MS}ms 后进行第 ${retryCount + 1} 次重试(无上限)`\n );\n return true;\n }\n };\n}\n\nfunction makeLoadPolicy(label: string, onLog?: IviRuntimeLogCallback): HlsLoadPolicy {\n return {\n default: {\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeRetryConfig(label, \"timeout\", onLog),\n errorRetry: makeRetryConfig(label, \"error\", onLog)\n }\n };\n}\n\nexport function IVIHlsVideo(props: IVIHlsVideoProps): ReactNode {\n const { url, videoProps, style, aggressivePreload = false, paused = false, onLog } = props;\n const videoRef = useRef<HTMLVideoElement | null>(null);\n // 用 ref 同步 paused 最新值,保证错误恢复回调里读取到的是最新的预加载状态,\n // 避免 standby 槽位的视频在 HLS 恢复时被误播。\n const pausedRef = useRef<boolean>(paused);\n\n // 预加载暂停/恢复:standby 槽位只缓冲不播放,切为 active 时自动 play。\n useEffect(() => {\n pausedRef.current = paused;\n const video = videoRef.current;\n if (!video) return;\n if (paused) {\n video.pause();\n } else {\n video.play().catch((err) => {\n emitHlsLog(\n onLog,\n \"warn\",\n \"paused→active 切换时 play() 被浏览器拒绝(多半受自动播放策略限制)\",\n err\n );\n });\n }\n }, [onLog, paused]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) {\n return;\n }\n\n let disposed = false;\n let hlsInstance: HlsLike | null = null;\n let fullReloadTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearFullReloadTimer = (): void => {\n if (fullReloadTimer) {\n clearTimeout(fullReloadTimer);\n fullReloadTimer = null;\n }\n };\n\n // 无论走 hls.js 还是原生 HLS 降级,<video> 自身的错误/停滞都要上报。\n const onVideoError = (): void => {\n const el = videoRef.current;\n const mediaErr = el?.error;\n emitHlsLog(onLog, \"warn\", \"<video> 元素报错\", {\n code: mediaErr?.code,\n message: mediaErr?.message,\n currentSrc: el?.currentSrc,\n networkState: el?.networkState,\n readyState: el?.readyState\n });\n };\n const onVideoStalled = (): void => {\n emitHlsLog(onLog, \"warn\", \"<video> stalled(缓冲停滞)\", {\n currentTime: videoRef.current?.currentTime,\n readyState: videoRef.current?.readyState\n });\n };\n video.addEventListener(\"error\", onVideoError);\n video.addEventListener(\"stalled\", onVideoStalled);\n\n // 错误恢复后显式 play(),但必须先尊重 paused(预加载 standby 槽位)——\n // 预加载时 pausedRef.current === true,此时绝不播放,只静默缓冲。\n const resumePlayback = (): void => {\n if (disposed) return;\n if (pausedRef.current) return;\n const el = videoRef.current;\n if (!el) return;\n el.play().catch((err) => {\n emitHlsLog(\n onLog,\n \"warn\",\n \"恢复后 play() 被浏览器拒绝(可能受自动播放策略限制)\",\n err\n );\n });\n };\n\n // 当内置重试已经用尽 / 无法处理(例如 manifest 解析失败)时的兜底:\n // 以 RETRY_DELAY_MS 为间隔无限重试 loadSource → attachMedia → startLoad。\n const scheduleFullReload = (reason: string): void => {\n if (disposed || fullReloadTimer) return;\n emitHlsLog(onLog, \"warn\", `${reason},${RETRY_DELAY_MS}ms 后重新拉取源(无限重试)`);\n fullReloadTimer = setTimeout(() => {\n fullReloadTimer = null;\n if (disposed || !hlsInstance || !videoRef.current) return;\n try {\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(videoRef.current);\n hlsInstance.startLoad();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"重新拉取源抛出异常,继续重试\", err);\n scheduleFullReload(\"重新拉取源异常\");\n }\n }, RETRY_DELAY_MS);\n };\n\n const setup = async (): Promise<void> => {\n try {\n const module = await import(\"hls.js\");\n if (disposed || !videoRef.current) {\n return;\n }\n const hlsModule = module as {\n default?: HlsCtorLike;\n Events?: Record<string, string>;\n ErrorTypes?: Record<string, string>;\n ErrorDetails?: Record<string, string>;\n };\n const Hls = (hlsModule.default ?? module) as HlsCtorLike;\n const events = hlsModule.Events ?? Hls.Events ?? {};\n const errorTypes = hlsModule.ErrorTypes ?? Hls.ErrorTypes ?? {};\n\n if (!Hls.isSupported()) {\n emitHlsLog(\n onLog,\n \"warn\",\n \"当前环境不支持 hls.js,降级到原生 HLS(失败将由 <video> error 事件上报)\",\n { url }\n );\n videoRef.current.src = url;\n return;\n }\n\n const bufferPreset = aggressivePreload\n ? {\n maxBufferLength: 180,\n maxMaxBufferLength: 240,\n backBufferLength: 120\n }\n : {\n maxBufferLength: 30,\n maxMaxBufferLength: 60,\n backBufferLength: 30\n };\n\n const instance = new Hls({\n enableWorker: true,\n lowLatencyMode: false,\n ...bufferPreset,\n capLevelToPlayerSize: true,\n // 以下三项是核心:列表与分片的拉取全部使用 hls.js 内置重试,\n // 无上限次数、间隔上限 0.5s、每次重试通过 shouldRetry 打印警告。\n manifestLoadPolicy: makeLoadPolicy(\"manifest 主列表\", onLog),\n playlistLoadPolicy: makeLoadPolicy(\"level 子码率列表\", onLog),\n fragLoadPolicy: makeLoadPolicy(\"fragment 媒体分片\", onLog)\n });\n hlsInstance = instance;\n\n const errorEvent = events.ERROR ?? \"hlsError\";\n const networkErrorType = errorTypes.NETWORK_ERROR ?? \"networkError\";\n const mediaErrorType = errorTypes.MEDIA_ERROR ?? \"mediaError\";\n\n instance.on(errorEvent, (_eventName, data) => {\n if (!data) {\n emitHlsLog(onLog, \"warn\", \"HLS ERROR 事件 data 为空\");\n return;\n }\n\n if (!data.fatal) {\n // Loader 层的非致命错误(NETWORK_ERROR)已经在 shouldRetry 回调里打印过,\n // 这里只补打印其他模块(buffer/media/key 等不经过 LoadPolicy)的非致命错误,\n // 避免同一次网络抖动被打印两次。\n if (data.type !== networkErrorType) {\n emitHlsLog(onLog, \"warn\", \"HLS 非致命错误(不走内置重试)\", data.type, data.details);\n }\n return;\n }\n\n switch (data.type) {\n case networkErrorType:\n emitHlsLog(onLog, \"warn\", \"HLS 致命网络错误,调用 startLoad() 重启拉流\", data.details);\n try {\n hlsInstance?.startLoad();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"startLoad() 异常,走兜底重载\", err);\n scheduleFullReload(\"startLoad 异常\");\n }\n break;\n\n case mediaErrorType:\n emitHlsLog(onLog, \"warn\", \"HLS 致命媒体错误,调用 recoverMediaError() 恢复\", data.details);\n try {\n hlsInstance?.recoverMediaError();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"recoverMediaError() 异常,走兜底重载\", err);\n scheduleFullReload(\"recoverMediaError 异常\");\n }\n break;\n\n default:\n // 其他致命错误(如 manifest 解析失败)内置重试无法覆盖,\n // 按 0.5s 间隔无限重试 loadSource + attachMedia + startLoad。\n emitHlsLog(onLog, \"warn\", \"HLS 其他致命错误,准备重新拉取源\", data.type, data.details);\n scheduleFullReload(\"其他致命错误\");\n break;\n }\n });\n\n instance.loadSource(url);\n instance.attachMedia(videoRef.current);\n } catch (err) {\n emitHlsLog(\n onLog,\n \"warn\",\n \"动态加载 hls.js 失败,降级到原生 HLS(失败将由 <video> error 事件上报)\",\n err\n );\n if (disposed || !videoRef.current) return;\n videoRef.current.src = url;\n }\n };\n\n void setup();\n\n return () => {\n disposed = true;\n clearFullReloadTimer();\n video.removeEventListener(\"error\", onVideoError);\n video.removeEventListener(\"stalled\", onVideoStalled);\n hlsInstance?.destroy();\n hlsInstance = null;\n };\n }, [url, aggressivePreload, onLog]);\n\n return (\n <video\n ref={videoRef}\n {...videoProps}\n autoPlay={paused ? false : (videoProps?.autoPlay ?? true)}\n playsInline={videoProps?.playsInline ?? true}\n controls={videoProps?.controls ?? true}\n style={style}\n />\n );\n}\n\nexport function isM3u8Url(url: string): boolean {\n return /\\.m3u8(?:$|[?#])/i.test(url);\n}\n\nfunction emitHlsLog(\n onLog: IviRuntimeLogCallback | undefined,\n level: IviRuntimeLogLevel,\n message: string,\n ...extra: unknown[]\n): void {\n const args = [HLS_LOG_TAG, message, ...extra];\n onLog?.({\n level,\n tag: HLS_LOG_TAG,\n message: `${HLS_LOG_TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n}\n","import {\n useEffect,\n useRef,\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type SyntheticEvent,\n type VideoHTMLAttributes\n} from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviSourcePlayback, IviSourcePlaybackTrtc } from \"../../runtime/sdk-types\";\nimport type { IviRuntimeLogCallback, IviRuntimeSource } from \"../../runtime/types\";\nimport type { IviRuntimeCoordinator } from \"../../runtime/runtime-coordinator\";\nimport { isLivekitSourcePlayback } from \"../../runtime/livekit-types\";\nimport { IVITrtcPlayer, type IVITrtcPlayerProps } from \"../ivi-trtc-player\";\nimport { IVILivekitPlayer, type IVILivekitPlayerProps } from \"../ivi-livekit-player\";\nimport { IVIFlvVideo, isFlvUrl } from \"../ivi-flv-video\";\nimport { IVIHlsVideo, isM3u8Url } from \"../ivi-hls-video\";\nimport type { IviMediaVolumeType } from \"../ivi-volume-control\";\nimport type {\n IviTrackSlotRenderContext,\n IVITrackSlotProps\n} from \"../ivi-track-slot\";\n\nexport type IviReadyRuntimeSource = IviRuntimeSource & {\n playback: NonNullable<IviRuntimeSource[\"playback\"]>;\n};\n\nexport function toReadyRuntimeSource(source: IviRuntimeSource | undefined): IviReadyRuntimeSource | null {\n if (!source || source.status !== \"ready\" || !source.playback) {\n return null;\n }\n return source as IviReadyRuntimeSource;\n}\n\nexport function supportsSubtitleOverlay(source: IviReadyRuntimeSource | null): boolean {\n if (!source) return false;\n if (source.source.asset_type === \"image\") return false;\n return (\n source.source.kind === \"stream\" ||\n source.source.kind === \"generation_stream\" ||\n source.source.kind === \"generated_clip\" ||\n source.source.kind === \"static\"\n );\n}\n\nexport function detectMediaVolumeType(source: IviReadyRuntimeSource | null): IviMediaVolumeType | null {\n if (!source) return null;\n if (getPlaybackType(source.playback) === \"trtc\") return \"trtc\";\n if (isLivekitSourcePlayback(source.playback)) return \"livekit\";\n if (source.source.asset_type === \"image\") return null;\n const url = getPlaybackUrl(source.playback);\n if (!url) return null;\n return isM3u8Url(url) ? \"hls\" : \"video\";\n}\n\ninterface TrackSlotMediaContentProps {\n slot?: string;\n track: IviTrack;\n source: IviReadyRuntimeSource;\n slotSourceId: string;\n isActive: boolean;\n runtime: IviRuntimeCoordinator | null;\n renderTrtc?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderLivekit?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderMedia?: (context: IviTrackSlotRenderContext) => ReactNode;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n trtcPlayerProps?: Omit<IVITrtcPlayerProps, \"trtc\" | \"sourceId\" | \"runtime\">;\n livekitPlayerProps?: Omit<IVILivekitPlayerProps, \"livekit\" | \"sourceId\" | \"runtime\">;\n adaptToSourceSize: boolean;\n fitStrategy: IVITrackSlotProps[\"fitStrategy\"];\n onLog?: IviRuntimeLogCallback;\n}\n\nexport function TrackSlotMediaContent(props: TrackSlotMediaContentProps): ReactNode {\n const {\n slot,\n track,\n source,\n slotSourceId,\n isActive,\n runtime,\n renderTrtc,\n renderLivekit,\n renderMedia,\n imageProps,\n videoProps,\n trtcPlayerProps,\n livekitPlayerProps,\n adaptToSourceSize,\n fitStrategy,\n onLog\n } = props;\n const renderContext: IviTrackSlotRenderContext = {\n slot: slot ?? \"\",\n track,\n source,\n isPreloading: !isActive\n };\n const mediaStyle = buildAdaptiveMediaStyle(adaptToSourceSize, fitStrategy);\n const shouldMute = !isActive;\n\n if (renderMedia) return renderMedia(renderContext);\n\n if (getPlaybackType(source.playback) === \"trtc\") {\n const trtc = getTrtcPlayback(source.playback);\n if (!trtc) return null;\n if (renderTrtc) return renderTrtc(renderContext);\n const trtcMuted = shouldMute || Boolean(trtcPlayerProps?.muted);\n return (\n <IVITrtcPlayer\n trtc={trtc}\n sourceId={source.source.source_id}\n runtime={runtime}\n {...trtcPlayerProps}\n muted={trtcMuted}\n loadingFallback={isActive ? trtcPlayerProps?.loadingFallback : null}\n errorFallback={isActive ? trtcPlayerProps?.errorFallback : null}\n style={{ ...mediaStyle, ...(trtcPlayerProps?.style ?? {}) }}\n />\n );\n }\n\n if (isLivekitSourcePlayback(source.playback)) {\n if (renderLivekit) return renderLivekit(renderContext);\n const livekitMuted = shouldMute || Boolean(livekitPlayerProps?.muted);\n return (\n <IVILivekitPlayer\n livekit={source.playback.livekit}\n sourceId={source.source.source_id}\n runtime={runtime}\n {...livekitPlayerProps}\n muted={livekitMuted}\n loadingFallback={isActive ? livekitPlayerProps?.loadingFallback : null}\n errorFallback={isActive ? livekitPlayerProps?.errorFallback : null}\n style={{ ...mediaStyle, ...(livekitPlayerProps?.style ?? {}) }}\n />\n );\n }\n\n if (source.source.asset_type === \"image\") {\n const imageUrl = getPlaybackUrl(source.playback);\n if (!imageUrl) return null;\n return (\n <img\n src={imageUrl}\n alt=\"\"\n {...imageProps}\n style={{ ...mediaStyle, ...(imageProps?.style ?? {}) }}\n />\n );\n }\n\n const playbackUrl = getPlaybackUrl(source.playback);\n if (!playbackUrl) return null;\n\n const videoStyle = { ...mediaStyle, ...(videoProps?.style ?? {}) };\n const mergedVideoProps = {\n ...videoProps,\n muted: shouldMute || Boolean(videoProps?.muted),\n onEnded: isActive\n ? createAutoTakeOnEndedHandler(\n runtime,\n slotSourceId,\n track.track_id,\n videoProps?.onEnded\n )\n : undefined\n };\n\n const shouldPause = !isActive;\n if (isM3u8Url(playbackUrl)) {\n return (\n <IVIHlsVideo\n url={playbackUrl}\n videoProps={mergedVideoProps}\n style={videoStyle}\n paused={shouldPause}\n />\n );\n }\n if (isFlvUrl(playbackUrl)) {\n return (\n <IVIFlvVideo\n url={playbackUrl}\n videoProps={{\n ...mergedVideoProps,\n controls: isActive ? (videoProps?.controls ?? true) : false\n }}\n style={videoStyle}\n paused={shouldPause}\n />\n );\n }\n return (\n <SlotVideo\n src={playbackUrl}\n paused={shouldPause}\n videoProps={{\n ...mergedVideoProps,\n autoPlay: videoProps?.autoPlay ?? true,\n playsInline: videoProps?.playsInline ?? true,\n controls: isActive ? (videoProps?.controls ?? true) : false\n }}\n style={videoStyle}\n />\n );\n}\n\nfunction buildAdaptiveMediaStyle(\n adaptToSourceSize: boolean,\n fitStrategy: IVITrackSlotProps[\"fitStrategy\"]\n): CSSProperties {\n const objectFitStyle: CSSProperties =\n fitStrategy === \"auto\"\n ? {}\n : {\n objectFit: fitStrategy ?? \"contain\"\n };\n if (!adaptToSourceSize) {\n return objectFitStyle;\n }\n return {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n ...objectFitStyle\n };\n}\n\nfunction getPlaybackType(playback: IviSourcePlayback): string | undefined {\n const type = playback.type;\n return typeof type === \"string\" ? type : undefined;\n}\n\nexport function getPlaybackUrl(playback: IviSourcePlayback): string | undefined {\n const url = playback.url;\n return typeof url === \"string\" ? url : undefined;\n}\n\nfunction getTrtcPlayback(playback: IviSourcePlayback): IviSourcePlaybackTrtc | null {\n const trtc = playback.trtc;\n if (typeof trtc !== \"object\" || trtc === null) {\n return null;\n }\n return trtc as IviSourcePlaybackTrtc;\n}\n\nfunction createAutoTakeOnEndedHandler(\n runtime: IviRuntimeCoordinator | null,\n sourceId: string,\n trackId: string,\n userOnEnded?: VideoHTMLAttributes<HTMLVideoElement>[\"onEnded\"]\n): (event: SyntheticEvent<HTMLVideoElement, Event>) => void {\n return (event) => {\n runtime?.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n userOnEnded?.(event);\n };\n}\n\nfunction SlotVideo(props: {\n src: string;\n paused: boolean;\n videoProps: VideoHTMLAttributes<HTMLVideoElement>;\n style?: CSSProperties;\n}): ReactNode {\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n if (props.paused) {\n video.pause();\n } else {\n video.play().catch(() => undefined);\n }\n }, [props.paused]);\n\n return (\n <video\n ref={videoRef}\n src={props.src}\n {...props.videoProps}\n autoPlay={props.paused ? false : (props.videoProps.autoPlay ?? true)}\n style={props.style}\n />\n );\n}\n\n","import { useMemo } from \"react\";\nimport type { IviRuntimeSource } from \"../../runtime/types\";\nimport { toReadyRuntimeSource, type IviReadyRuntimeSource } from \"./track-slot-media\";\n\nexport interface PreloadSourceEntry {\n sourceId: string;\n source: IviReadyRuntimeSource;\n isActive: boolean;\n}\n\n/**\n * 多重预加载调度:收集 Runtime 中所有需要被挂载的 Source。\n * 挂载条件:`source.preload` 已被设置(显式事件或 SDK 内部合成) 或 当前为 active source。\n * 列表保持 Map 插入顺序(即 source 创建顺序),配合 sourceId 作为 React key\n * 保证单个 Source 的 DOM 不会因其他 Source 的增删/状态变化而被重建。\n */\nexport function useMultiPreloadSources(\n sources: Map<string, IviRuntimeSource>,\n activeSourceId: string | null\n): PreloadSourceEntry[] {\n return useMemo(() => {\n const entries: PreloadSourceEntry[] = [];\n for (const [id, runtimeSource] of sources) {\n const isActive = id === activeSourceId;\n const shouldMount = Boolean(runtimeSource.preload) || isActive;\n if (!shouldMount) {\n continue;\n }\n const ready = toReadyRuntimeSource(runtimeSource);\n if (!ready) {\n continue;\n }\n entries.push({\n sourceId: id,\n source: ready,\n isActive\n });\n }\n return entries;\n }, [sources, activeSourceId]);\n}\n","import {\n useCallback,\n useRef,\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type VideoHTMLAttributes\n} from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeLogCallback, IviRuntimeLogEntry, IviRuntimeSource } from \"../runtime/types\";\nimport type { IVITrtcPlayerProps } from \"./ivi-trtc-player\";\nimport type { IVILivekitPlayerProps } from \"./ivi-livekit-player\";\nimport {\n IVIVolumeControl,\n useVolumeMemory,\n useApplyVolumeToSlot,\n type IVIVolumeControlProps\n} from \"./ivi-volume-control\";\nimport {\n IVISubtitleOverlay,\n type IVISubtitleOverlayProps\n} from \"./ivi-subtitle-overlay\";\nimport { useIviStageView } from \"./use-ivi-stage-view\";\nimport { useMultiPreloadSources } from \"./internal/use-multi-preload-sources\";\nimport {\n detectMediaVolumeType,\n supportsSubtitleOverlay,\n TrackSlotMediaContent\n} from \"./internal/track-slot-media\";\n\nexport interface IviTrackSlotRenderContext {\n slot: string;\n track: IviTrack;\n source: IviRuntimeSource;\n /** 当前正在 standby 槽位预加载(不可见、已静音) */\n isPreloading?: boolean;\n}\n\nexport interface IVITrackSlotProps {\n slot?: string;\n trackId?: string;\n className?: string;\n style?: CSSProperties;\n emptyFallback?: ReactNode;\n renderTrtc?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderLivekit?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderMedia?: (context: IviTrackSlotRenderContext) => ReactNode;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">;\n adaptToSourceSize?: boolean;\n fitStrategy?: \"contain\" | \"cover\" | \"auto\";\n trtcPlayerProps?: Omit<IVITrtcPlayerProps, \"trtc\" | \"sourceId\" | \"runtime\">;\n livekitPlayerProps?: Omit<IVILivekitPlayerProps, \"livekit\" | \"sourceId\" | \"runtime\">;\n /** 是否显示音量控制浮层(仅在播放音视频媒体时生效,图片无音量) */\n showVolumeControl?: boolean;\n /** 音量控制组件的自定义配置(图标、颜色、样式等) */\n volumeControlProps?: Omit<IVIVolumeControlProps, \"volume\" | \"onVolumeChange\">;\n /** 是否显示字幕浮层(仅在支持字幕的播放源上生效) */\n showSubtitle?: boolean;\n /** 字幕组件的自定义配置(角色、最大条数、字体、颜色等) */\n subtitleProps?: Omit<IVISubtitleOverlayProps, \"runtime\">;\n /** TrackSlot 内部媒体链路日志回调;未传入时不输出日志。 */\n onLog?: IviRuntimeLogCallback;\n}\n\n/**\n * Track 窗口组件:基于多重预加载策略渲染所有 ready 的 Source。\n * 每个 ready 且拥有合法 playback 的 Source 都会挂载为不可见元素提前预加载,\n * active Source 通过 CSS 可见性切换显示,切换时无 DOM 重建。\n * 每个 Source 以 sourceId 为 React key,保证增删其他 Source 不影响已有预加载。\n */\nexport function IVITrackSlot(props: IVITrackSlotProps): ReactNode {\n const {\n slot,\n trackId,\n className,\n style,\n emptyFallback = null,\n renderTrtc,\n renderLivekit,\n renderMedia,\n videoProps,\n imageProps,\n adaptToSourceSize = true,\n fitStrategy = \"contain\",\n trtcPlayerProps,\n livekitPlayerProps,\n showVolumeControl,\n volumeControlProps,\n showSubtitle,\n subtitleProps,\n onLog\n } = props;\n const context = useIviStageView();\n const fallbackLogCallback = useCallback(\n (entry: IviRuntimeLogEntry) => context.runtime?.emitLog(entry),\n [context.runtime]\n );\n const mediaLogCallback = onLog ?? fallbackLogCallback;\n const containerRef = useRef<HTMLDivElement>(null);\n\n const resolvedTrackId = trackId ?? (slot ? context.slotTrackMap.get(slot) : undefined);\n const track = resolvedTrackId ? context.state.tracks.get(resolvedTrackId) : undefined;\n const activeSourceId = track?.active_source_id ?? null;\n\n const preloadEntries = useMultiPreloadSources(context.state.sources, activeSourceId);\n\n const activeEntry = preloadEntries.find(e => e.isActive) ?? null;\n const activeSource = activeEntry?.source ?? null;\n const mediaType = detectMediaVolumeType(activeSource);\n const [volume, setVolume] = useVolumeMemory(showVolumeControl ? mediaType : null);\n useApplyVolumeToSlot(containerRef, volume, !!showVolumeControl && mediaType !== null, activeSourceId);\n\n if (!resolvedTrackId || !track) {\n return (\n <div className={className} style={style}>\n {emptyFallback}\n </div>\n );\n }\n\n const slotContainerStyle: CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n ...(style ?? {})\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={slotContainerStyle}\n data-ivi-slot={slot}\n data-ivi-track-id={track.track_id}\n >\n {!activeSource && emptyFallback}\n {preloadEntries.map(entry => {\n const isActive = entry.isActive;\n return (\n <div\n key={entry.sourceId}\n style={isActive ? ACTIVE_SLOT_STYLE : STANDBY_SLOT_STYLE}\n data-ivi-source-id={entry.sourceId}\n data-ivi-slot-role={isActive ? \"active\" : \"standby\"}\n >\n <div style={SLOT_CONTENT_STYLE}>\n <TrackSlotMediaContent\n slot={slot}\n track={track}\n source={entry.source}\n slotSourceId={entry.sourceId}\n isActive={isActive}\n runtime={context.runtime}\n renderTrtc={renderTrtc}\n renderLivekit={renderLivekit}\n renderMedia={renderMedia}\n imageProps={imageProps}\n videoProps={videoProps}\n trtcPlayerProps={trtcPlayerProps}\n livekitPlayerProps={livekitPlayerProps}\n adaptToSourceSize={adaptToSourceSize}\n fitStrategy={fitStrategy}\n onLog={mediaLogCallback}\n />\n </div>\n </div>\n );\n })}\n {showSubtitle && activeSource && supportsSubtitleOverlay(activeSource) && (\n <div style={SUBTITLE_OVERLAY_STYLE}>\n <IVISubtitleOverlay\n runtime={context.runtime}\n {...subtitleProps}\n />\n </div>\n )}\n {showVolumeControl && mediaType !== null && (\n <div style={VOLUME_OVERLAY_STYLE}>\n <IVIVolumeControl\n volume={volume}\n onVolumeChange={setVolume}\n {...volumeControlProps}\n />\n </div>\n )}\n </div>\n );\n}\n\nconst PHYSICAL_SLOT_BASE: CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\"\n};\n\nconst ACTIVE_SLOT_STYLE: CSSProperties = {\n ...PHYSICAL_SLOT_BASE,\n visibility: \"visible\",\n zIndex: 1\n};\n\nconst STANDBY_SLOT_STYLE: CSSProperties = {\n ...PHYSICAL_SLOT_BASE,\n visibility: \"hidden\",\n zIndex: 0,\n pointerEvents: \"none\"\n};\n\nconst SLOT_CONTENT_STYLE: CSSProperties = {\n width: \"100%\",\n height: \"100%\"\n};\n\nconst SUBTITLE_OVERLAY_STYLE: CSSProperties = {\n position: \"absolute\",\n bottom: 48,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 10,\n maxWidth: \"90%\",\n pointerEvents: \"none\"\n};\n\nconst VOLUME_OVERLAY_STYLE: CSSProperties = {\n position: \"absolute\",\n bottom: 12,\n right: 12,\n zIndex: 10,\n pointerEvents: \"auto\"\n};\n\n","import { useEffect, useMemo } from \"react\";\nimport { IviClient } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviClientLogEntry } from \"@vivix-ai/ivi-sdk-ts/client\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeCoordinatorConfig, IviRuntimeLogEntry } from \"../runtime/types\";\nimport type { IviFrontendClientConfig } from \"../sdk\";\n\nexport type IviManagedRuntimeLogLevel = \"info\" | \"warn\" | \"error\";\nexport type IviManagedRuntimeLogSource = \"client\" | \"runtime\";\n\nexport interface IviManagedRuntimeLogEntry {\n level: IviManagedRuntimeLogLevel;\n source: IviManagedRuntimeLogSource;\n tag: string;\n message: string;\n args: unknown[];\n data?: unknown;\n clientLog?: IviClientLogEntry;\n runtimeLog?: IviRuntimeLogEntry;\n}\n\nexport type IviManagedRuntimeLogCallback = (entry: IviManagedRuntimeLogEntry) => void;\n\nexport interface IviManagedRuntimeConfig {\n clientConfig: Partial<IviFrontendClientConfig>;\n autoStart?: boolean;\n runtimeConfig?: IviRuntimeCoordinatorConfig;\n onRuntimeInitError?: (error: unknown) => void;\n /**\n * 统一收集 SDK 内部带 IVI 标记的日志。\n *\n * - IviClient 的 onLog 会被转换为 `[IVI-SEND]`、`[IVI-TRANSPORT]`、`[IVI-RECONNECT]`\n * - runtime / TRTC / LiveKit 等日志会通过 runtime onLog 回调上报,不会通过 patch console 收集\n */\n onLog?: IviManagedRuntimeLogCallback;\n}\n\nexport function useManagedIviRuntime(config: IviManagedRuntimeConfig): IviRuntimeCoordinator | null {\n const {\n clientConfig,\n autoStart = true,\n runtimeConfig,\n onRuntimeInitError,\n onLog\n } = config;\n\n const runtime = useMemo(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n if (!clientConfig.transport) {\n return null;\n }\n const mergedClientConfig: IviFrontendClientConfig = {\n ...clientConfig,\n transport: clientConfig.transport,\n onLog: (entry) => {\n onLog?.(normalizeClientLogEntry(entry));\n clientConfig.onLog?.(entry);\n }\n };\n const client = new IviClient(mergedClientConfig);\n const mergedRuntimeConfig: IviRuntimeCoordinatorConfig = {\n ...runtimeConfig,\n onLog: (entry) => {\n onLog?.(normalizeRuntimeLogEntry(entry));\n runtimeConfig?.onLog?.(entry);\n }\n };\n return new IviRuntimeCoordinator(client, mergedRuntimeConfig);\n }, [clientConfig, runtimeConfig, onLog]);\n\n useEffect(() => {\n if (!autoStart || !runtime) {\n return;\n }\n let disposed = false;\n runtime.start().catch((error) => {\n if (disposed) {\n return;\n }\n if (onRuntimeInitError) {\n onRuntimeInitError(error);\n return;\n }\n throw error;\n });\n return () => {\n disposed = true;\n runtime.stop();\n };\n }, [autoStart, runtime, onRuntimeInitError]);\n\n return runtime;\n}\n\nfunction normalizeClientLogEntry(entry: IviClientLogEntry): IviManagedRuntimeLogEntry {\n const tag = getClientLogTag(entry.category);\n return {\n level: entry.level === \"warn\" || entry.level === \"error\" ? entry.level : \"info\",\n source: \"client\",\n tag,\n message: `${tag} ${entry.message}`,\n args: entry.data === undefined ? [`${tag} ${entry.message}`] : [`${tag} ${entry.message}`, entry.data],\n data: entry.data,\n clientLog: entry\n };\n}\n\nfunction normalizeRuntimeLogEntry(entry: IviRuntimeLogEntry): IviManagedRuntimeLogEntry {\n return {\n level: entry.level,\n source: \"runtime\",\n tag: entry.tag,\n message: entry.message,\n args: entry.args,\n data: entry.data,\n runtimeLog: entry\n };\n}\n\nfunction getClientLogTag(category: IviClientLogEntry[\"category\"]): string {\n if (category === \"send\") return \"[IVI-SEND]\";\n if (category === \"transport\") return \"[IVI-TRANSPORT]\";\n if (category === \"reconnect\") return \"[IVI-RECONNECT]\";\n return \"[IVI-CLIENT]\";\n}\n"]}
1
+ {"version":3,"sources":["../src/runtime/logger.ts","../src/runtime/runtime-dispatcher.ts","../src/runtime/handlers/session-event-handler.ts","../src/runtime/handlers/stage-event-handler.ts","../src/runtime/handlers/track-event-handler.ts","../src/runtime/handlers/source-event-handler.ts","../src/runtime/handlers/stream-event-handler.ts","../src/runtime/handlers/conversation-event-handler.ts","../src/runtime/managers/session-manager.ts","../src/runtime/managers/stage-manager.ts","../src/runtime/managers/track-manager.ts","../src/runtime/managers/source-manager.ts","../src/runtime/managers/stream-manager.ts","../src/runtime/managers/conversation-manager.ts","../src/runtime/managers/trtc-source-manager.ts","../src/runtime/livekit-types.ts","../src/runtime/managers/livekit-source-manager.ts","../src/runtime/runtime-coordinator.ts","../src/sdk.ts","../src/react/stage-view-context.ts","../src/react/use-runtime-state.ts","../src/react/ivi-stage-view.tsx","../src/react/ivi-volume-control.tsx","../src/react/use-ivi-subtitles.ts","../src/react/ivi-subtitle-overlay.tsx","../src/react/use-ivi-stage-view.ts","../src/react/ivi-trtc-player.tsx","../src/react/ivi-livekit-player.tsx","../src/react/ivi-flv-video.tsx","../src/react/ivi-hls-video.tsx","../src/react/internal/track-slot-media.tsx","../src/react/internal/use-multi-preload-sources.ts","../src/react/ivi-track-slot.tsx","../src/react/use-managed-ivi-runtime.ts"],"names":["snapshotMap","TAG","session","enforceContainMedia","ReceiveConversationItemAddedEvent","ReceiveConversationItemDoneEvent","ReceiveResponseCreatedEvent","useEffect","useState","jsx","useMemo","useRef","jsxs","useCallback","IviClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeLogCallback } from \"./types\";\n\n/**\n * 日志前缀:`[IVI-EVT]` 标记\"收到事件\"。\n * 调试时可通过该前缀快速过滤事件流。\n */\nconst EVENT_LOG_PREFIX = \"[IVI-EVT]\";\n\n/**\n * 日志前缀:`[IVI-STATE]` 标记\"runtime 内部状态发生变化\"。\n * 调试时可通过该前缀快速过滤状态变更。\n */\nconst STATE_LOG_PREFIX = \"[IVI-STATE]\";\n\nlet activeLogCallback: IviRuntimeLogCallback | undefined;\n\nexport function runWithIviRuntimeLogCallback<T>(\n onLog: IviRuntimeLogCallback | undefined,\n fn: () => T\n): T {\n const previous = activeLogCallback;\n activeLogCallback = onLog;\n try {\n return fn();\n } finally {\n activeLogCallback = previous;\n }\n}\n\n/**\n * 打印\"收到事件\"日志,附带事件完整 payload。\n */\nexport function logIviEventReceived(event: ParsedIviEvent): void {\n const message = `${EVENT_LOG_PREFIX} ${event.type}`;\n activeLogCallback?.({\n level: \"info\",\n tag: EVENT_LOG_PREFIX,\n message,\n args: [message, event.raw],\n data: event.raw\n });\n}\n\n/**\n * 打印\"实例状态变更\"日志。\n *\n * @param entity 被变更的实体类别(例如 \"source\"、\"track\"、\"stream\"、\"stage\"、\"session\"、\"conversation\")\n * @param key 实体主键;对于单例(如 session/stage)可传 null\n * @param eventType 引发变更的事件类型\n * @param before 变更前实例快照(不存在时传 undefined)\n * @param after 变更后实例快照(被删除时传 undefined)\n */\nexport function logIviStateChange(\n entity: string,\n key: string | null,\n eventType: string,\n before: unknown,\n after: unknown\n): void {\n if (!didChange(before, after)) {\n return;\n }\n const label = key === null ? entity : `${entity}[${key}]`;\n const message = `${STATE_LOG_PREFIX} ${label} <- ${eventType}`;\n const data = {\n before,\n after\n };\n activeLogCallback?.({\n level: \"info\",\n tag: STATE_LOG_PREFIX,\n message,\n args: [message, data],\n data\n });\n}\n\nfunction didChange(before: unknown, after: unknown): boolean {\n if (before === after) return false;\n if (before === undefined || after === undefined) return true;\n try {\n return JSON.stringify(before) !== JSON.stringify(after);\n } catch {\n return true;\n }\n}\n","import type { IviClient, ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeConnectionListener, IviRuntimeLogCallback } from \"./types\";\nimport { logIviEventReceived, runWithIviRuntimeLogCallback } from \"./logger\";\n\nexport interface IviRuntimeEventHandler {\n handle(event: ParsedIviEvent): void;\n}\n\nexport interface IviRuntimeDispatcherCallbacks {\n sessionHandler: IviRuntimeEventHandler;\n stageHandler: IviRuntimeEventHandler;\n trackHandler: IviRuntimeEventHandler;\n sourceHandler: IviRuntimeEventHandler;\n streamHandler: IviRuntimeEventHandler;\n conversationHandler: IviRuntimeEventHandler;\n onConnectionChange: IviRuntimeConnectionListener;\n onEvent?: (event: ParsedIviEvent) => void;\n onLog?: IviRuntimeLogCallback;\n}\n\nexport class IviRuntimeDispatcher {\n private readonly client: IviClient;\n private readonly callbacks: IviRuntimeDispatcherCallbacks;\n private unsubscribeEvent: (() => void) | null = null;\n private unsubscribeConnection: (() => void) | null = null;\n\n public constructor(client: IviClient, callbacks: IviRuntimeDispatcherCallbacks) {\n this.client = client;\n this.callbacks = callbacks;\n }\n\n public start(): void {\n if (this.unsubscribeEvent || this.unsubscribeConnection) {\n return;\n }\n\n this.unsubscribeEvent = this.client.onEvent((event) => {\n this.dispatchEvent(event);\n });\n\n this.unsubscribeConnection = this.client.onConnectionChange((connected) => {\n this.callbacks.onConnectionChange(connected);\n });\n }\n\n public stop(): void {\n this.unsubscribeEvent?.();\n this.unsubscribeEvent = null;\n this.unsubscribeConnection?.();\n this.unsubscribeConnection = null;\n }\n\n private dispatchEvent(event: ParsedIviEvent): void {\n runWithIviRuntimeLogCallback(this.callbacks.onLog, () => {\n logIviEventReceived(event);\n if (event.type === \"session.created\" || event.type === \"session.ended\") {\n this.callbacks.sessionHandler.handle(event);\n } else if (event.type.startsWith(\"session.stage.\")) {\n this.callbacks.stageHandler.handle(event);\n } else if (event.type.startsWith(\"session.track.\") || event.type.startsWith(\"session.tracks.\")) {\n this.callbacks.trackHandler.handle(event);\n } else if (event.type.startsWith(\"session.source.\") || event.type.startsWith(\"session.sources.\")) {\n this.callbacks.sourceHandler.handle(event);\n } else if (event.type.startsWith(\"session.stream.\") || event.type.startsWith(\"session.streams.\")) {\n this.callbacks.streamHandler.handle(event);\n } else if (event.type.startsWith(\"conversation.\") || event.type.startsWith(\"response.\")) {\n this.callbacks.conversationHandler.handle(event);\n }\n });\n\n this.callbacks.onEvent?.(event);\n }\n}\n","import { ReceiveSessionCreatedEvent, ReceiveSessionEndedEvent, type ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { SessionManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface SessionEventHandlerCallbacks {\n onSessionCreated(event: ReceiveSessionCreatedEvent): void;\n onSessionEnded(event: ReceiveSessionEndedEvent): void;\n}\n\nexport class SessionEventHandler {\n private readonly sessionManager: SessionManager;\n private readonly callbacks: SessionEventHandlerCallbacks;\n\n public constructor(sessionManager: SessionManager, callbacks: SessionEventHandlerCallbacks) {\n this.sessionManager = sessionManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): void {\n if (event instanceof ReceiveSessionCreatedEvent) {\n const before = this.sessionManager.getSession();\n this.sessionManager.setSession(event.session);\n logIviStateChange(\"session\", null, event.type, before, this.sessionManager.getSession());\n this.callbacks.onSessionCreated(event);\n return;\n }\n if (event instanceof ReceiveSessionEndedEvent) {\n this.callbacks.onSessionEnded(event);\n }\n }\n}\n","import {\n ReceiveSessionStageGetResponseEvent,\n ReceiveSessionStageUpdatedEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { StageManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface StageEventHandlerCallbacks {\n onStageChanged(result: {\n fromStageGetResponse: boolean;\n }): void;\n}\n\nexport interface StageHandleResult {\n handled: boolean;\n fromStageGetResponse: boolean;\n}\n\nexport class StageEventHandler {\n private readonly stageManager: StageManager;\n private readonly callbacks: StageEventHandlerCallbacks;\n\n public constructor(stageManager: StageManager, callbacks: StageEventHandlerCallbacks) {\n this.stageManager = stageManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): StageHandleResult {\n if (\n !(event instanceof ReceiveSessionStageGetResponseEvent) &&\n !(event instanceof ReceiveSessionStageUpdatedEvent)\n ) {\n return {\n handled: false,\n fromStageGetResponse: false\n };\n }\n const before = this.stageManager.getStage();\n this.stageManager.setStage(event.stage);\n logIviStateChange(\"stage\", null, event.type, before, this.stageManager.getStage());\n const result = {\n handled: true,\n fromStageGetResponse: event instanceof ReceiveSessionStageGetResponseEvent\n };\n this.callbacks.onStageChanged({\n fromStageGetResponse: result.fromStageGetResponse\n });\n return result;\n }\n}\n","import {\n ReceiveSessionTrackCuedEvent,\n ReceiveSessionTrackCreatedEvent,\n ReceiveSessionTrackDeletedEvent,\n ReceiveSessionTrackNextSetEvent,\n ReceiveSessionTrackTookEvent,\n ReceiveSessionTracksListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { TrackManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface TrackEventHandlerCallbacks {\n onTracksChanged(result: {\n listRefreshed: boolean;\n }): void;\n}\n\nexport interface TrackHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class TrackEventHandler {\n private readonly trackManager: TrackManager;\n private readonly callbacks: TrackEventHandlerCallbacks;\n\n public constructor(trackManager: TrackManager, callbacks: TrackEventHandlerCallbacks) {\n this.trackManager = trackManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): TrackHandleResult {\n if (event instanceof ReceiveSessionTrackCreatedEvent) {\n const trackId = event.track.track_id;\n const before = this.trackManager.getAll().get(trackId);\n this.trackManager.upsert(event.track);\n logIviStateChange(\"track\", trackId, event.type, before, this.trackManager.getAll().get(trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackDeletedEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.remove(event.trackId);\n logIviStateChange(\"track\", event.trackId, event.type, before, undefined);\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackTookEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n if (before?.active_source_id === event.sourceId) {\n return { handled: true, listRefreshed: false };\n }\n this.trackManager.applyTrackTook(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackCuedEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.applyTrackCued(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTrackNextSetEvent) {\n const before = this.trackManager.getAll().get(event.trackId);\n this.trackManager.applyTrackNextSet(event.trackId, event.sourceId);\n logIviStateChange(\"track\", event.trackId, event.type, before, this.trackManager.getAll().get(event.trackId));\n this.callbacks.onTracksChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionTracksListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.trackManager.getAll());\n this.trackManager.replaceAll(event.tracks);\n logIviStateChange(\"tracks(list)\", null, event.type, beforeSnapshot, snapshotMap(this.trackManager.getAll()));\n this.callbacks.onTracksChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n ReceiveSessionSourceClearPreloadEvent,\n ReceiveSessionSourceCreatedEvent,\n ReceiveSessionSourceDeletedEvent,\n ReceiveSessionSourceFailedEvent,\n ReceiveSessionSourcePlaybackCompletedEvent,\n ReceiveSessionSourcePreloadEvent,\n ReceiveSessionSourceReadyEvent,\n ReceiveSessionSourcesListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { SourceManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface SourceEventHandlerCallbacks {\n onSourcesChanged(result: {\n listRefreshed: boolean;\n }): void;\n}\n\nexport interface SourceHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class SourceEventHandler {\n private readonly sourceManager: SourceManager;\n private readonly callbacks: SourceEventHandlerCallbacks;\n\n public constructor(sourceManager: SourceManager, callbacks: SourceEventHandlerCallbacks) {\n this.sourceManager = sourceManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): SourceHandleResult {\n if (event instanceof ReceiveSessionSourceCreatedEvent) {\n const sourceId = event.source.source_id;\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.upsertCreated(event.source);\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceReadyEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.markReady({\n sourceId: event.sourceId,\n kind: event.kind,\n assetType: event.assetType,\n playback: event.playback,\n width: event.width,\n height: event.height,\n durationMs: event.durationMs,\n hasAudio: event.hasAudio\n });\n logIviStateChange(\"source\", event.sourceId, event.type, before, this.sourceManager.get(event.sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceFailedEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.markFailed(event.sourceId, event.error);\n logIviStateChange(\"source\", event.sourceId, event.type, before, this.sourceManager.get(event.sourceId));\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceDeletedEvent) {\n const before = this.sourceManager.get(event.sourceId);\n this.sourceManager.remove(event.sourceId);\n logIviStateChange(\"source\", event.sourceId, event.type, before, undefined);\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourcePreloadEvent) {\n for (const source of event.sources) {\n const sourceId = source.source_id;\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.upsertCreated(source);\n this.sourceManager.applyPreload(sourceId, {\n autoclearAfterPlay: event.autoclearAfterPlay ?? true\n });\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n }\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourceClearPreloadEvent) {\n for (const sourceId of event.sourceIds ?? []) {\n const before = this.sourceManager.get(sourceId);\n this.sourceManager.clearPreload(sourceId);\n logIviStateChange(\"source\", sourceId, event.type, before, this.sourceManager.get(sourceId));\n }\n this.callbacks.onSourcesChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionSourcesListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.sourceManager.getAll());\n this.sourceManager.replaceAll(event.sources);\n logIviStateChange(\"sources(list)\", null, event.type, beforeSnapshot, snapshotMap(this.sourceManager.getAll()));\n this.callbacks.onSourcesChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n if (event instanceof ReceiveSessionSourcePlaybackCompletedEvent) {\n return { handled: true, listRefreshed: false };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n ReceiveSessionStreamCreatedEvent,\n ReceiveSessionStreamStartedEvent,\n ReceiveSessionStreamEndedEvent,\n ReceiveSessionStreamFailedEvent,\n ReceiveSessionStreamDeletedEvent,\n ReceiveSessionStreamsListResponseEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { StreamManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface StreamEventHandlerCallbacks {\n onStreamsChanged(result: { listRefreshed: boolean }): void;\n}\n\nexport interface StreamHandleResult {\n handled: boolean;\n listRefreshed: boolean;\n}\n\nexport class StreamEventHandler {\n private readonly streamManager: StreamManager;\n private readonly callbacks: StreamEventHandlerCallbacks;\n\n public constructor(streamManager: StreamManager, callbacks: StreamEventHandlerCallbacks) {\n this.streamManager = streamManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): StreamHandleResult {\n if (event instanceof ReceiveSessionStreamCreatedEvent) {\n const streamId = event.stream.stream_id;\n const before = this.streamManager.getAll().get(streamId);\n this.streamManager.upsertCreated(event.stream);\n logIviStateChange(\"stream\", streamId, event.type, before, this.streamManager.getAll().get(streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamStartedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markStarted(event.streamId, event.trackId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamEndedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markEnded(event.streamId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamFailedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.markFailed(event.streamId, event.error);\n logIviStateChange(\"stream\", event.streamId, event.type, before, this.streamManager.getAll().get(event.streamId));\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamDeletedEvent) {\n const before = this.streamManager.getAll().get(event.streamId);\n this.streamManager.remove(event.streamId);\n logIviStateChange(\"stream\", event.streamId, event.type, before, undefined);\n this.callbacks.onStreamsChanged({ listRefreshed: false });\n return { handled: true, listRefreshed: false };\n }\n\n if (event instanceof ReceiveSessionStreamsListResponseEvent) {\n const beforeSnapshot = snapshotMap(this.streamManager.getAll());\n this.streamManager.replaceAll(event.streams);\n logIviStateChange(\"streams(list)\", null, event.type, beforeSnapshot, snapshotMap(this.streamManager.getAll()));\n this.callbacks.onStreamsChanged({ listRefreshed: true });\n return { handled: true, listRefreshed: true };\n }\n\n return { handled: false, listRefreshed: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n","import {\n type IviConversationItem,\n ReceiveConversationItemAddedEvent,\n ReceiveConversationItemDoneEvent,\n ReceiveConversationListResponseEvent,\n ReceiveResponseCreatedEvent,\n ReceiveResponseDoneEvent,\n ReceiveResponseOutputAudioTranscriptDeltaEvent,\n ReceiveResponseOutputAudioTranscriptDoneEvent,\n ReceiveResponseOutputTextDeltaEvent,\n ReceiveResponseOutputTextDoneEvent,\n type ParsedIviEvent\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviConversationItemWithId } from \"../sdk-types\";\nimport type { ConversationManager } from \"../managers\";\nimport { logIviStateChange } from \"../logger\";\n\nexport interface ConversationEventHandlerCallbacks {\n onConversationsChanged(): void;\n}\n\nexport interface ConversationHandleResult {\n handled: boolean;\n}\n\nexport class ConversationEventHandler {\n private readonly conversationManager: ConversationManager;\n private readonly callbacks: ConversationEventHandlerCallbacks;\n\n public constructor(conversationManager: ConversationManager, callbacks: ConversationEventHandlerCallbacks) {\n this.conversationManager = conversationManager;\n this.callbacks = callbacks;\n }\n\n public handle(event: ParsedIviEvent): ConversationHandleResult {\n if (event instanceof ReceiveConversationListResponseEvent) {\n const before = snapshotMap(this.conversationManager.getAllMap());\n this.conversationManager.replaceAll(event.items.filter(hasConversationItemId));\n logIviStateChange(\n \"conversations(list)\",\n null,\n event.type,\n before,\n snapshotMap(this.conversationManager.getAllMap())\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveConversationItemAddedEvent) {\n if (!hasConversationItemId(event.item)) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.item.id);\n this.conversationManager.upsertAdded(event.item);\n logIviStateChange(\n \"conversationItem\",\n event.item.id,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.item.id)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveConversationItemDoneEvent) {\n if (!hasConversationItemId(event.item)) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.item.id);\n this.conversationManager.markDone(event.item);\n logIviStateChange(\n \"conversationItem\",\n event.item.id,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.item.id)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputTextDeltaEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTextDelta(event.itemId, event.delta);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputTextDoneEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTextDone(event.itemId, event.text);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputAudioTranscriptDeltaEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTranscriptDelta(event.itemId, event.delta);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseOutputAudioTranscriptDoneEvent) {\n if (!event.itemId) {\n return { handled: true };\n }\n const before = this.conversationManager.getAllMap().get(event.itemId);\n this.conversationManager.applyTranscriptDone(event.itemId, event.transcript);\n logIviStateChange(\n \"conversationItem\",\n event.itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(event.itemId)\n );\n this.callbacks.onConversationsChanged();\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseDoneEvent) {\n if (event.response.id) {\n const itemId = `item_${event.response.id}`;\n const before = this.conversationManager.getAllMap().get(itemId);\n this.conversationManager.markModelItemStatusFromResponse(event.response.id, event.response.status);\n logIviStateChange(\n \"conversationItem\",\n itemId,\n event.type,\n before,\n this.conversationManager.getAllMap().get(itemId)\n );\n this.callbacks.onConversationsChanged();\n }\n return { handled: true };\n }\n\n if (event instanceof ReceiveResponseCreatedEvent) {\n return { handled: true };\n }\n\n return { handled: false };\n }\n}\n\nfunction snapshotMap<V>(map: Map<string, V>): Record<string, V> {\n const snap: Record<string, V> = {};\n map.forEach((value, key) => {\n snap[key] = value;\n });\n return snap;\n}\n\nfunction hasConversationItemId(item: IviConversationItem): item is IviConversationItemWithId {\n return typeof item.id === \"string\" && item.id.length > 0;\n}\n","import type { IviRealtimeSessionConfig } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class SessionManager {\n private session: IviRealtimeSessionConfig | null = null;\n\n public setSession(session: IviRealtimeSessionConfig): void {\n this.session = session;\n }\n\n public getSession(): IviRealtimeSessionConfig | null {\n return this.session;\n }\n\n public reset(): void {\n this.session = null;\n }\n}\n","import type { IviStageComposition } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class StageManager {\n private stage: IviStageComposition | null = null;\n\n public setStage(stage: IviStageComposition): void {\n this.stage = stage;\n }\n\n public getStage(): IviStageComposition | null {\n return this.stage;\n }\n\n public reset(): void {\n this.stage = null;\n }\n}\n","import type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\n\nexport class TrackManager {\n private tracks = new Map<string, IviTrack>();\n\n private patchTrack(trackId: string, patch: Partial<IviTrack>): void {\n const next = new Map(this.tracks);\n const current = next.get(trackId) ?? { track_id: trackId };\n next.set(trackId, {\n ...current,\n ...patch\n });\n this.tracks = next;\n }\n\n public upsert(track: IviTrack): void {\n const next = new Map(this.tracks);\n next.set(track.track_id, track);\n this.tracks = next;\n }\n\n public remove(trackId: string): void {\n const next = new Map(this.tracks);\n next.delete(trackId);\n this.tracks = next;\n }\n\n public replaceAll(tracks: IviTrack[]): void {\n const next = new Map<string, IviTrack>();\n tracks.forEach((track) => next.set(track.track_id, track));\n this.tracks = next;\n }\n\n public applyTrackTook(trackId: string, sourceId?: string): void {\n const current = this.tracks.get(trackId);\n const resolvedSourceId = sourceId ?? current?.next_source_id ?? null;\n if (!resolvedSourceId) {\n return;\n }\n this.patchTrack(trackId, {\n active_source_id: resolvedSourceId,\n next_source_id: undefined\n });\n }\n\n public applyTrackCued(trackId: string, sourceId: string): void {\n this.patchTrack(trackId, {\n active_source_id: sourceId,\n next_source_id: undefined\n });\n }\n\n public applyTrackNextSet(trackId: string, sourceId: string): void {\n this.patchTrack(trackId, {\n next_source_id: sourceId\n });\n }\n\n public findTrackIdByActiveSource(sourceId: string): string | null {\n for (const [trackId, track] of this.tracks) {\n if (track.active_source_id === sourceId) return trackId;\n }\n return null;\n }\n\n public has(trackId: string): boolean {\n return this.tracks.has(trackId);\n }\n\n public getAll(): Map<string, IviTrack> {\n return this.tracks;\n }\n\n public reset(): void {\n this.tracks = new Map();\n }\n}\n","import type {\n IviSourceAsset,\n IviTrack,\n ReceiveSessionSourceFailedPayload,\n ReceiveSessionSourceReadyPayload\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeSource, IviRuntimeSourcePreloadState } from \"../types\";\n\ntype IviListedSource = IviSourceAsset & {\n playback?: ReceiveSessionSourceReadyPayload[\"playback\"];\n};\n\nexport class SourceManager {\n private sources = new Map<string, IviRuntimeSource>();\n /**\n * 记录本次运行期间曾经被某个 track 的 active/next 槽引用过的 source id 集合。\n * 用于 autoclearAfterPlay 判定:只有曾经\"上过 track\"的 source,在其离开 track 时才需要清理预加载。\n */\n private sourcesEverReferencedByTrack = new Set<string>();\n\n public upsertCreated(source: IviSourceAsset): void {\n const previous = this.sources.get(source.source_id);\n const next = new Map(this.sources);\n next.set(source.source_id, {\n source,\n status: previous?.status === \"ready\" ? \"ready\" : \"created\",\n playback: previous?.playback,\n width: previous?.width,\n height: previous?.height,\n durationMs: previous?.durationMs,\n hasAudio: previous?.hasAudio,\n error: previous?.status === \"failed\" ? previous.error : undefined,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public markReady(payload: {\n sourceId: ReceiveSessionSourceReadyPayload[\"source_id\"];\n kind: ReceiveSessionSourceReadyPayload[\"kind\"];\n assetType: ReceiveSessionSourceReadyPayload[\"asset_type\"];\n playback: ReceiveSessionSourceReadyPayload[\"playback\"];\n width: ReceiveSessionSourceReadyPayload[\"width\"];\n height: ReceiveSessionSourceReadyPayload[\"height\"];\n durationMs: ReceiveSessionSourceReadyPayload[\"duration_ms\"];\n hasAudio: ReceiveSessionSourceReadyPayload[\"has_audio\"];\n }): void {\n const previous = this.sources.get(payload.sourceId);\n const next = new Map(this.sources);\n next.set(payload.sourceId, {\n source: previous?.source ?? this.buildReadyFallbackSource(payload.sourceId, payload.kind, payload.assetType),\n status: \"ready\",\n playback: payload.playback,\n width: payload.width,\n height: payload.height,\n durationMs: payload.durationMs,\n hasAudio: payload.hasAudio,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public markFailed(sourceId: string, error: ReceiveSessionSourceFailedPayload[\"error\"]): void {\n const previous = this.sources.get(sourceId);\n const next = new Map(this.sources);\n next.set(sourceId, {\n source:\n previous?.source ??\n ({\n source_id: sourceId,\n kind: \"stream\",\n url: \"\"\n } as IviSourceAsset),\n status: \"failed\",\n playback: previous?.playback,\n width: previous?.width,\n height: previous?.height,\n durationMs: previous?.durationMs,\n hasAudio: previous?.hasAudio,\n error,\n preload: previous?.preload\n });\n this.sources = next;\n }\n\n public remove(sourceId: string): void {\n const next = new Map(this.sources);\n next.delete(sourceId);\n this.sources = next;\n this.sourcesEverReferencedByTrack.delete(sourceId);\n }\n\n public replaceAll(sources: IviListedSource[]): void {\n const next = new Map<string, IviRuntimeSource>();\n sources.forEach((source) => {\n const previous = this.sources.get(source.source_id);\n next.set(source.source_id, {\n source,\n status: source.playback ? \"ready\" : \"created\",\n playback: source.playback,\n preload: previous?.preload\n });\n });\n this.sources = next;\n }\n\n /**\n * 应用一次显式预加载。若 source 目前尚未注册,会建立一个占位实例,\n * 待后续 `session.source.created` / `ready` 事件补齐字段。\n */\n public applyPreload(sourceId: string, state: IviRuntimeSourcePreloadState): void {\n const previous = this.sources.get(sourceId);\n const next = new Map(this.sources);\n if (previous) {\n next.set(sourceId, {\n ...previous,\n preload: state\n });\n } else {\n next.set(sourceId, {\n source: {\n source_id: sourceId,\n kind: \"stream\",\n url: \"\"\n } as IviSourceAsset,\n status: \"created\",\n preload: state\n });\n }\n this.sources = next;\n }\n\n /**\n * 清除指定 source 的预加载标记。\n */\n public clearPreload(sourceId: string): void {\n const previous = this.sources.get(sourceId);\n if (!previous || !previous.preload) return;\n const next = new Map(this.sources);\n next.set(sourceId, {\n ...previous,\n preload: undefined\n });\n this.sources = next;\n }\n\n /**\n * 根据当前 tracks 状态同步 source 运行态:\n * 1) 将 track 的 active/next 引用的 source 由 `created` 提升为 `ready`(保留既有行为)。\n * 2) 对当前不再被任何 track 引用、且 `preload.autoclearAfterPlay === true`、\n * 且历史上曾经被 track 引用过的 source,自动清除其预加载标记。\n */\n public syncWithTracks(tracks: Map<string, IviTrack>): void {\n const currentlyReferencedIds = new Set<string>();\n tracks.forEach((track) => {\n if (track.active_source_id) {\n currentlyReferencedIds.add(track.active_source_id);\n }\n if (track.next_source_id) {\n currentlyReferencedIds.add(track.next_source_id);\n }\n });\n\n const next = new Map(this.sources);\n let changed = false;\n\n currentlyReferencedIds.forEach((sourceId) => {\n if (!this.sourcesEverReferencedByTrack.has(sourceId)) {\n this.sourcesEverReferencedByTrack.add(sourceId);\n }\n const existing = next.get(sourceId);\n if (!existing) return;\n if (existing.status === \"created\") {\n next.set(sourceId, {\n ...existing,\n status: \"ready\"\n });\n changed = true;\n }\n });\n\n next.forEach((source, sourceId) => {\n if (!source.preload || !source.preload.autoclearAfterPlay) return;\n if (currentlyReferencedIds.has(sourceId)) return;\n if (!this.sourcesEverReferencedByTrack.has(sourceId)) return;\n next.set(sourceId, {\n ...source,\n preload: undefined\n });\n changed = true;\n });\n\n if (changed) {\n this.sources = next;\n }\n }\n\n public has(sourceId: string): boolean {\n return this.sources.has(sourceId);\n }\n\n public get(sourceId: string): IviRuntimeSource | undefined {\n return this.sources.get(sourceId);\n }\n\n public getAll(): Map<string, IviRuntimeSource> {\n return this.sources;\n }\n\n public reset(): void {\n this.sources = new Map();\n this.sourcesEverReferencedByTrack = new Set();\n }\n\n private buildReadyFallbackSource(\n sourceId: string,\n kind: ReceiveSessionSourceReadyPayload[\"kind\"],\n assetType: ReceiveSessionSourceReadyPayload[\"asset_type\"]\n ): IviSourceAsset {\n return {\n source_id: sourceId,\n kind,\n asset_type: assetType\n };\n }\n}\n","import type { IviStream } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeStream } from \"../types\";\n\nexport class StreamManager {\n private streams = new Map<string, IviRuntimeStream>();\n\n public upsertCreated(stream: IviStream): void {\n const next = new Map(this.streams);\n next.set(stream.stream_id, {\n stream,\n status: stream.status\n });\n this.streams = next;\n }\n\n public markStarted(streamId: string, trackId?: string): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"active\",\n stream: { ...previous.stream, status: \"active\" },\n trackId\n });\n this.streams = next;\n }\n\n public markEnded(streamId: string): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"ended\",\n stream: { ...previous.stream, status: \"ended\" }\n });\n this.streams = next;\n }\n\n public markFailed(streamId: string, error: unknown): void {\n const previous = this.streams.get(streamId);\n if (!previous) return;\n const next = new Map(this.streams);\n next.set(streamId, {\n ...previous,\n status: \"failed\",\n stream: { ...previous.stream, status: \"failed\" },\n error\n });\n this.streams = next;\n }\n\n public remove(streamId: string): void {\n const next = new Map(this.streams);\n next.delete(streamId);\n this.streams = next;\n }\n\n public replaceAll(streams: IviStream[]): void {\n const next = new Map<string, IviRuntimeStream>();\n streams.forEach((stream) => {\n const previous = this.streams.get(stream.stream_id);\n next.set(stream.stream_id, {\n stream,\n status: stream.status,\n trackId: previous?.trackId\n });\n });\n this.streams = next;\n }\n\n public has(streamId: string): boolean {\n return this.streams.has(streamId);\n }\n\n public getAll(): Map<string, IviRuntimeStream> {\n return this.streams;\n }\n\n public reset(): void {\n this.streams = new Map();\n }\n}\n","import type { IviConversationItem, IviConversationItemContent } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviConversationItemWithId, IviRealtimeResponseStatus } from \"../sdk-types\";\nimport type { IviRuntimeConversationItem, IviRuntimeConversationStatus } from \"../types\";\n\nexport class ConversationManager {\n private items = new Map<string, IviRuntimeConversationItem>();\n private order: string[] = [];\n\n public replaceAll(items: IviConversationItemWithId[]): void {\n const nextItems = new Map<string, IviRuntimeConversationItem>();\n const nextOrder: string[] = [];\n items.forEach((item) => {\n const runtimeItem = this.buildRuntimeItem(item, item.status === \"in_progress\" ? \"added\" : \"done\");\n nextItems.set(runtimeItem.id, runtimeItem);\n nextOrder.push(runtimeItem.id);\n });\n this.items = nextItems;\n this.order = nextOrder;\n }\n\n public upsertAdded(item: IviConversationItemWithId): void {\n const previous = this.items.get(item.id);\n const next = new Map(this.items);\n const mergedItem = this.mergeConversationItem(previous?.item, item);\n const mergedText = this.extractText(mergedItem.content);\n const mergedTranscript = this.extractTranscript(mergedItem.content);\n const runtimeItem = this.buildRuntimeItem(\n mergedItem,\n \"added\",\n mergedText || previous?.text || \"\",\n mergedTranscript || previous?.transcript || \"\"\n );\n next.set(item.id, runtimeItem);\n this.items = next;\n this.ensureOrder(item.id);\n }\n\n public markDone(item: IviConversationItemWithId): void {\n const previous = this.items.get(item.id);\n const next = new Map(this.items);\n const mergedItem = this.mergeConversationItem(previous?.item, item);\n const mergedText = this.extractText(mergedItem.content);\n const mergedTranscript = this.extractTranscript(mergedItem.content);\n const runtimeItem = this.buildRuntimeItem(\n mergedItem,\n \"done\",\n mergedText || previous?.text || \"\",\n mergedTranscript || previous?.transcript || \"\"\n );\n if (runtimeItem.role === \"model\" && previous && previous.status !== \"in_progress\") {\n runtimeItem.status = previous.status;\n runtimeItem.item = {\n ...runtimeItem.item,\n status: previous.status\n };\n }\n next.set(item.id, runtimeItem);\n this.items = next;\n this.ensureOrder(item.id);\n }\n\n public applyTextDelta(itemId: string, delta: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: `${existing.text}${delta}`,\n transcript: existing.transcript,\n content: this.upsertContentText(existing.content, `${existing.text}${delta}`)\n });\n }\n\n public applyTextDone(itemId: string, text: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text,\n transcript: existing.transcript,\n content: this.upsertContentText(existing.content, text)\n });\n }\n\n public applyTranscriptDelta(itemId: string, delta: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: existing.text,\n transcript: `${existing.transcript}${delta}`,\n content: this.upsertContentTranscript(existing.content, `${existing.transcript}${delta}`)\n });\n }\n\n public applyTranscriptDone(itemId: string, transcript: string): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n this.applyContentUpdate(itemId, {\n text: existing.text,\n transcript,\n content: this.upsertContentTranscript(existing.content, transcript)\n });\n }\n\n public markModelItemStatusFromResponse(responseId: string, status: IviRealtimeResponseStatus | undefined): void {\n const itemId = `item_${responseId}`;\n const existing = this.items.get(itemId);\n if (!existing || existing.role !== \"model\") {\n return;\n }\n const nextStatus = this.mapResponseStatusToConversationStatus(status);\n const next = new Map(this.items);\n next.set(itemId, {\n ...existing,\n lifecycle: \"done\",\n status: nextStatus,\n item: {\n ...existing.item,\n status: nextStatus\n }\n });\n this.items = next;\n }\n\n public getAllMap(): Map<string, IviRuntimeConversationItem> {\n return this.items;\n }\n\n public getOrderedList(): IviRuntimeConversationItem[] {\n return this.order\n .map((id) => this.items.get(id))\n .filter((item): item is IviRuntimeConversationItem => !!item);\n }\n\n public reset(): void {\n this.items = new Map();\n this.order = [];\n }\n\n private applyContentUpdate(\n itemId: string,\n update: {\n text: string;\n transcript: string;\n content: IviConversationItemContent[];\n }\n ): void {\n const existing = this.items.get(itemId);\n if (!existing) {\n return;\n }\n const next = new Map(this.items);\n next.set(itemId, {\n ...existing,\n text: update.text,\n transcript: update.transcript,\n content: update.content,\n item: {\n ...existing.item,\n content: update.content\n }\n });\n this.items = next;\n }\n\n private ensureOrder(itemId: string): void {\n if (this.order.includes(itemId)) {\n return;\n }\n this.order = [...this.order, itemId];\n }\n\n private buildRuntimeItem(\n item: IviConversationItemWithId,\n lifecycle: \"added\" | \"done\",\n text = this.extractText(item.content),\n transcript = this.extractTranscript(item.content)\n ): IviRuntimeConversationItem {\n const role = item.role ?? \"user\";\n return {\n id: item.id,\n role,\n lifecycle,\n status: this.normalizeConversationStatus(role, item.status),\n item,\n text,\n transcript,\n content: item.content ?? []\n };\n }\n\n private normalizeConversationStatus(\n role: IviConversationItem[\"role\"],\n status: IviConversationItem[\"status\"]\n ): IviRuntimeConversationStatus {\n if (role === \"model\") {\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"incomplete\") {\n return \"incomplete\";\n }\n return \"in_progress\";\n }\n if (status === undefined) {\n return \"completed\";\n }\n return status === \"in_progress\" ? \"in_progress\" : \"completed\";\n }\n\n private mapResponseStatusToConversationStatus(\n status: IviRealtimeResponseStatus | undefined\n ): IviRuntimeConversationStatus {\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"in_progress\") {\n return \"in_progress\";\n }\n return \"incomplete\";\n }\n\n private mergeConversationItem(\n previous: IviConversationItem | undefined,\n next: IviConversationItemWithId\n ): IviConversationItemWithId {\n return {\n ...previous,\n ...next,\n content: next.content ?? previous?.content ?? []\n };\n }\n\n private extractText(content: IviConversationItemContent[] | undefined): string {\n return content?.find((item) => item.type === \"text\")?.text ?? \"\";\n }\n\n private extractTranscript(content: IviConversationItemContent[] | undefined): string {\n return content?.find((item) => item.type === \"audio\")?.transcript ?? \"\";\n }\n\n private upsertContentText(content: IviConversationItemContent[], text: string): IviConversationItemContent[] {\n const next = [...content];\n const textIndex = next.findIndex((item) => item.type === \"text\");\n if (textIndex >= 0) {\n next[textIndex] = {\n ...next[textIndex],\n type: \"text\",\n text\n };\n return next;\n }\n return [\n ...next,\n {\n type: \"text\",\n text\n }\n ];\n }\n\n private upsertContentTranscript(\n content: IviConversationItemContent[],\n transcript: string\n ): IviConversationItemContent[] {\n const next = [...content];\n const audioIndex = next.findIndex((item) => item.type === \"audio\");\n if (audioIndex >= 0) {\n next[audioIndex] = {\n ...next[audioIndex],\n type: \"audio\",\n transcript\n };\n return next;\n }\n return [\n ...next,\n {\n type: \"audio\",\n transcript\n }\n ];\n }\n}\n","import type { IviSourcePlaybackTrtc } from \"../sdk-types\";\nimport type {\n IviRuntimeLogCallback,\n IviRuntimeLogLevel,\n IviRuntimeSource,\n IviRuntimeTrtcAIDenoiserOptions,\n IviRuntimeTrtcEvent,\n IviRuntimeTrtcEventListener,\n IviRuntimeTrtcEventType\n} from \"../types\";\n\ntype TRTCConstructor = typeof import(\"trtc-sdk-v5\").default;\ntype TRTCInstance = InstanceType<TRTCConstructor>;\ntype TRTCDenoiserMode = import(\"trtc-sdk-v5\").DenoiserMode;\ntype TRTCStreamType = import(\"trtc-sdk-v5\").TRTCStreamType;\n\nconst TAG = \"[IVI-TRTC]\";\nconst DEFAULT_DENOISER_OPTIONS: Required<Pick<IviRuntimeTrtcAIDenoiserOptions, \"enabled\" | \"mode\">> = {\n enabled: true,\n mode: \"normal\"\n};\n\nexport type TrtcSourceConnectionStatus = \"idle\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface TrtcSourceSnapshot {\n status: TrtcSourceConnectionStatus;\n error?: string;\n}\n\ninterface TrtcViewBinding {\n sourceId: string;\n container: HTMLElement;\n muted: boolean;\n startedVideoKeys: Set<string>;\n startingVideoKeys: Set<string>;\n}\n\ninterface TrtcSourceSession {\n sessionKey: string;\n sourceId: string;\n sourceIds: Set<string>;\n trtc: IviSourcePlaybackTrtc;\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions;\n TRTC: TRTCConstructor | null;\n client: TRTCInstance | null;\n connectPromise: Promise<void> | null;\n views: Map<string, TrtcViewBinding>;\n remoteVideoStreams: Set<string>;\n remoteAudioUsers: Set<string>;\n status: TrtcSourceConnectionStatus;\n error?: string;\n hasEverReceivedRemoteVideo: boolean;\n remoteVideoWaiters: Array<(available: boolean) => void>;\n onRemoteVideoAvailable?: (event: { userId: string; streamType: TRTCStreamType }) => void;\n onRemoteVideoUnavailable?: (event: { userId: string; streamType: TRTCStreamType }) => void;\n onRemoteAudioAvailable?: (event: { userId: string }) => void;\n onRemoteAudioUnavailable?: (event: { userId: string }) => void;\n}\n\ntype TrtcSourceListener = (snapshot: TrtcSourceSnapshot) => void;\n\nexport class TrtcSourceManager {\n private readonly sessions = new Map<string, TrtcSourceSession>();\n private readonly sourceSessionKeys = new Map<string, string>();\n private readonly listeners = new Map<string, Set<TrtcSourceListener>>();\n\n public constructor(\n private readonly onLog?: IviRuntimeLogCallback,\n private readonly onTrtcEvent?: IviRuntimeTrtcEventListener,\n private readonly aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ) {}\n\n /**\n * 将 runtime 当前 sources 与 TRTC 会话池对齐:\n * - 对 ready + trtc 的 source 进行 upsert(必要时建立连接)\n * - 清理已不在 runtime 中的会话(释放资源)\n */\n public syncRuntimeSources(sources: Map<string, IviRuntimeSource>): void {\n const trtcSourceIds = new Set<string>();\n sources.forEach((source, sourceId) => {\n if (!isRuntimeTrtcSource(source)) {\n return;\n }\n trtcSourceIds.add(sourceId);\n this.upsertSource(sourceId, source.playback.trtc);\n });\n Array.from(this.sourceSessionKeys.keys()).forEach((sourceId) => {\n if (!trtcSourceIds.has(sourceId)) {\n this.removeSource(sourceId);\n }\n });\n }\n\n /**\n * 按 sourceId 注册/更新 TRTC 配置。\n * 若配置发生变化,会先销毁旧会话再按新参数重建连接。\n */\n public upsertSource(\n sourceId: string,\n trtc: IviSourcePlaybackTrtc,\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ): void {\n const existing = this.getSession(sourceId);\n if (existing && isSameTrtcConfig(existing.trtc, trtc) && isSameAIDenoiserOptions(existing.aiDenoiser, aiDenoiser)) {\n return;\n }\n\n if (existing) {\n this.log(\"info\", `配置变更,重建会话 source=${sourceId} room=${getTrtcString(trtc, \"room_id\")}`);\n this.unlinkSourceFromSession(sourceId, existing);\n }\n\n const sessionKey = buildTrtcSessionKey(trtc, aiDenoiser);\n const reusable = this.sessions.get(sessionKey);\n if (reusable) {\n this.log(\"info\", `复用会话 source=${sourceId} room=${getTrtcString(trtc, \"room_id\")} user=${getTrtcString(trtc, \"user_id\")}`);\n reusable.sourceIds.add(sourceId);\n this.sourceSessionKeys.set(sourceId, sessionKey);\n this.emitSnapshot(sourceId, this.snapshotFromSession(reusable));\n void this.ensureConnected(reusable);\n return;\n }\n\n this.log(\"info\", `新建会话 source=${sourceId} room=${getTrtcString(trtc, \"room_id\")} user=${getTrtcString(trtc, \"user_id\")}`);\n const session = this.createSession(sourceId, trtc, aiDenoiser);\n this.sessions.set(session.sessionKey, session);\n this.sourceSessionKeys.set(sourceId, session.sessionKey);\n void this.ensureConnected(session);\n }\n\n /**\n * 删除指定 source 的 TRTC 会话并释放连接资源。\n * 该操作通常由 source.deleted 或会话重置触发。\n */\n public removeSource(sourceId: string): void {\n const session = this.getSession(sourceId);\n if (!session) {\n return;\n }\n this.log(\"info\", `移除会话 source=${sourceId}`);\n this.unlinkSourceFromSession(sourceId, session);\n this.emitSnapshot(sourceId, {\n status: \"idle\"\n });\n this.listeners.delete(sourceId);\n }\n\n public reset(): void {\n this.log(\"info\", `重置全部会话 count=${this.sessions.size}`);\n const sessions = Array.from(this.sessions.values());\n this.sessions.clear();\n this.sourceSessionKeys.clear();\n sessions.forEach((session) => {\n void this.disposeSession(session);\n });\n this.listeners.clear();\n }\n\n public subscribe(sourceId: string, listener: TrtcSourceListener): () => void {\n const set = this.listeners.get(sourceId) ?? new Set<TrtcSourceListener>();\n set.add(listener);\n this.listeners.set(sourceId, set);\n listener(this.getSnapshot(sourceId));\n return () => {\n const target = this.listeners.get(sourceId);\n if (!target) {\n return;\n }\n target.delete(listener);\n if (target.size === 0) {\n this.listeners.delete(sourceId);\n }\n };\n }\n\n public getSnapshot(sourceId: string): TrtcSourceSnapshot {\n const session = this.getSession(sourceId);\n if (!session) {\n return {\n status: \"idle\"\n };\n }\n return {\n status: session.status,\n error: session.error\n };\n }\n\n /**\n * 检查指定 source 的 TRTC 会话是否曾收到过 REMOTE_VIDEO_AVAILABLE 事件。\n */\n public hasRemoteVideoAvailable(sourceId: string): boolean {\n const session = this.getSession(sourceId);\n return session?.hasEverReceivedRemoteVideo ?? false;\n }\n\n /**\n * 等待指定 source 的 TRTC 会话首次收到 REMOTE_VIDEO_AVAILABLE。\n * - 若已收到过,立即返回 true。\n * - 若会话被销毁或超时,返回 false。\n */\n public waitForRemoteVideoAvailable(sourceId: string, timeoutMs = 30000): Promise<boolean> {\n const session = this.getSession(sourceId);\n if (!session) return Promise.resolve(false);\n if (session.hasEverReceivedRemoteVideo) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = session.remoteVideoWaiters.indexOf(waiter);\n if (idx >= 0) session.remoteVideoWaiters.splice(idx, 1);\n resolve(false);\n }, timeoutMs);\n\n const waiter = (available: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(available);\n };\n session.remoteVideoWaiters.push(waiter);\n });\n }\n\n /**\n * 将一个渲染容器绑定到 source 会话:\n * - 确保连接已建立\n * - 回放历史已知远端视频轨道到该容器\n * - 应用全局音频策略(根据所有 view 的 muted 汇总)\n */\n public async attachView(\n sourceId: string,\n viewId: string,\n container: HTMLElement,\n muted: boolean\n ): Promise<void> {\n const session = this.getSession(sourceId);\n if (!session) {\n throw new Error(`TRTC source session not found: ${sourceId}`);\n }\n session.views.set(viewId, {\n sourceId,\n container,\n muted,\n startedVideoKeys: new Set(),\n startingVideoKeys: new Set()\n });\n await this.ensureConnected(session);\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n await this.renderKnownRemoteVideosToView(session, binding);\n await this.applyAudioPolicy(session);\n }\n\n public detachView(sourceId: string, viewId: string): void {\n const session = this.getSession(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (binding?.sourceId === sourceId) {\n session.views.delete(viewId);\n }\n void this.applyAudioPolicy(session);\n }\n\n public updateViewMuted(sourceId: string, viewId: string, muted: boolean): void {\n const session = this.getSession(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n binding.muted = muted;\n void this.applyAudioPolicy(session);\n }\n\n private unlinkSourceFromSession(sourceId: string, session: TrtcSourceSession): void {\n session.sourceIds.delete(sourceId);\n this.sourceSessionKeys.delete(sourceId);\n session.views.forEach((binding, viewId) => {\n if (binding.sourceId === sourceId) {\n session.views.delete(viewId);\n }\n });\n if (session.sourceIds.size > 0) {\n session.sourceId = session.sourceIds.values().next().value ?? session.sourceId;\n void this.applyAudioPolicy(session);\n return;\n }\n this.sessions.delete(session.sessionKey);\n void this.disposeSession(session);\n }\n\n private getSession(sourceId: string): TrtcSourceSession | undefined {\n const sessionKey = this.sourceSessionKeys.get(sourceId);\n return sessionKey ? this.sessions.get(sessionKey) : undefined;\n }\n\n private snapshotFromSession(session: TrtcSourceSession): TrtcSourceSnapshot {\n return {\n status: session.status,\n error: session.error\n };\n }\n\n private emitSessionSnapshot(session: TrtcSourceSession, snapshot: TrtcSourceSnapshot): void {\n session.sourceIds.forEach((sourceId) => this.emitSnapshot(sourceId, snapshot));\n }\n\n private emitSessionTrtcEvent(\n session: TrtcSourceSession,\n type: IviRuntimeTrtcEventType,\n rawType: unknown,\n payload: { userId?: string; streamType?: unknown }\n ): void {\n session.sourceIds.forEach((sourceId) => this.emitTrtcEvent(sourceId, type, rawType, payload));\n }\n\n private createSession(\n sourceId: string,\n trtc: IviSourcePlaybackTrtc,\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n ): TrtcSourceSession {\n return {\n sessionKey: buildTrtcSessionKey(trtc, aiDenoiser),\n sourceId,\n sourceIds: new Set([sourceId]),\n trtc,\n aiDenoiser,\n TRTC: null,\n client: null,\n connectPromise: null,\n views: new Map(),\n remoteVideoStreams: new Set(),\n remoteAudioUsers: new Set(),\n status: \"idle\",\n hasEverReceivedRemoteVideo: false,\n remoteVideoWaiters: []\n };\n }\n\n /**\n * 懒连接入口:同一会话只允许一次并发 connectPromise。\n * 建连后统一注册远端音视频事件,并持续向所有已绑定 view 分发渲染。\n */\n private async ensureConnected(session: TrtcSourceSession): Promise<void> {\n if (session.client && session.TRTC) {\n return;\n }\n if (session.connectPromise) {\n await session.connectPromise;\n return;\n }\n session.status = \"connecting\";\n session.error = undefined;\n this.emitSessionSnapshot(session, {\n status: session.status\n });\n session.connectPromise = (async () => {\n const m = await import(\"trtc-sdk-v5\");\n const TRTC = (m.default ?? m) as TRTCConstructor;\n const roomId = getTrtcString(session.trtc, \"room_id\");\n const userId = getTrtcString(session.trtc, \"user_id\");\n const userSig = getTrtcString(session.trtc, \"user_sig\");\n const sdkAppId = Number(getTrtcString(session.trtc, \"app_id\"));\n if (!Number.isFinite(sdkAppId)) {\n throw new Error(\"TRTC app_id 必须是数字字符串。\");\n }\n const isStringRoomId = shouldUseStringRoomId(roomId);\n const client = TRTC.create();\n\n const onRemoteVideoAvailable = (event: { userId: string; streamType: TRTCStreamType }): void => {\n this.log(\"info\", `远端视频可用 source=${session.sourceId} userId=${event.userId} streamType=${event.streamType}`);\n const remoteVideoKey = buildRemoteVideoKey(event.userId, String(event.streamType));\n session.remoteVideoStreams.add(remoteVideoKey);\n if (!session.hasEverReceivedRemoteVideo) {\n session.hasEverReceivedRemoteVideo = true;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(true);\n }\n session.remoteVideoWaiters.length = 0;\n }\n session.views.forEach((binding) => {\n void this.startRemoteVideoForBinding(client, event.userId, event.streamType, binding, remoteVideoKey);\n });\n this.emitSessionTrtcEvent(session, \"remote_video_available\", TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, event);\n };\n const onRemoteVideoUnavailable = (event: { userId: string; streamType: TRTCStreamType }): void => {\n this.log(\"info\", `远端视频不可用 source=${session.sourceId} userId=${event.userId} streamType=${event.streamType}`);\n const remoteVideoKey = buildRemoteVideoKey(event.userId, String(event.streamType));\n session.remoteVideoStreams.delete(remoteVideoKey);\n session.views.forEach((binding) => {\n binding.startedVideoKeys.delete(remoteVideoKey);\n binding.startingVideoKeys.delete(remoteVideoKey);\n });\n void client.stopRemoteVideo({\n userId: event.userId,\n streamType: event.streamType\n }).catch(() => undefined);\n this.emitSessionTrtcEvent(session, \"remote_video_unavailable\", TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, event);\n };\n const onRemoteAudioAvailable = (event: { userId: string }): void => {\n this.log(\"info\", `远端音频可用 source=${session.sourceId} userId=${event.userId}`);\n session.remoteAudioUsers.add(event.userId);\n void this.applyAudioPolicy(session);\n this.emitSessionTrtcEvent(session, \"remote_audio_available\", TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, event);\n };\n const onRemoteAudioUnavailable = (event: { userId: string }): void => {\n this.log(\"info\", `远端音频不可用 source=${session.sourceId} userId=${event.userId}`);\n session.remoteAudioUsers.delete(event.userId);\n void this.applyAudioPolicy(session);\n this.emitSessionTrtcEvent(session, \"remote_audio_unavailable\", TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, event);\n };\n\n session.onRemoteVideoAvailable = onRemoteVideoAvailable;\n session.onRemoteVideoUnavailable = onRemoteVideoUnavailable;\n session.onRemoteAudioAvailable = onRemoteAudioAvailable;\n session.onRemoteAudioUnavailable = onRemoteAudioUnavailable;\n\n client.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, onRemoteVideoAvailable);\n client.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, onRemoteVideoUnavailable);\n client.on(TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, onRemoteAudioAvailable);\n client.on(TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, onRemoteAudioUnavailable);\n\n this.log(\"info\", `正在进房 source=${session.sourceId} room=${roomId} sdkAppId=${sdkAppId} userId=${userId}`);\n await client.enterRoom({\n sdkAppId,\n userId,\n userSig,\n scene: TRTC.TYPE.SCENE_LIVE,\n role: TRTC.TYPE.ROLE_AUDIENCE,\n autoReceiveAudio: true,\n ...(isStringRoomId ? { strRoomId: roomId } : { roomId: Number(roomId) })\n });\n\n session.TRTC = TRTC;\n session.client = client;\n session.status = \"connected\";\n session.error = undefined;\n this.log(\"info\", `进房成功 source=${session.sourceId} room=${roomId}`);\n await this.applyAIDenoiserPolicy(session, client, sdkAppId, userId, userSig);\n this.emitSessionSnapshot(session, {\n status: session.status\n });\n await this.applyAudioPolicy(session);\n })().catch((error) => {\n session.status = \"error\";\n session.error = error instanceof Error ? error.message : String(error);\n this.log(\"error\", `连接失败 source=${session.sourceId} error=${session.error}`);\n this.emitSessionSnapshot(session, {\n status: session.status,\n error: session.error\n });\n throw error;\n }).finally(() => {\n session.connectPromise = null;\n });\n await session.connectPromise;\n }\n\n private async renderKnownRemoteVideosToView(\n session: TrtcSourceSession,\n binding: TrtcViewBinding\n ): Promise<void> {\n const client = session.client;\n if (!client) {\n return;\n }\n for (const key of session.remoteVideoStreams) {\n const parsed = parseRemoteVideoKey(key);\n if (!parsed) {\n continue;\n }\n await this.startRemoteVideoForBinding(\n client,\n parsed.userId,\n parsed.streamType as TRTCStreamType,\n binding,\n key\n );\n }\n }\n\n private async startRemoteVideoForBinding(\n client: TRTCInstance,\n userId: string,\n streamType: TRTCStreamType,\n binding: TrtcViewBinding,\n remoteVideoKey: string\n ): Promise<void> {\n if (binding.startedVideoKeys.has(remoteVideoKey) || binding.startingVideoKeys.has(remoteVideoKey)) {\n return;\n }\n binding.startingVideoKeys.add(remoteVideoKey);\n try {\n await client.startRemoteVideo({\n userId,\n streamType,\n view: binding.container,\n option: { fillMode: \"contain\" }\n });\n binding.startedVideoKeys.add(remoteVideoKey);\n enforceContainMedia(binding.container);\n } catch (error) {\n if (\n error instanceof Error &&\n /already started|OPERATION_ABORT/i.test(error.message)\n ) {\n binding.startedVideoKeys.add(remoteVideoKey);\n return;\n }\n this.log(\"warn\", `远端视频渲染失败 userId=${userId} streamType=${streamType}`, error);\n } finally {\n binding.startingVideoKeys.delete(remoteVideoKey);\n }\n }\n\n /**\n * 统一音频策略:\n * - 所有 view 都 muted -> 全局静音\n * - 至少一个 view 需出声 -> 对可用远端用户解除静音\n */\n private async applyAudioPolicy(session: TrtcSourceSession): Promise<void> {\n const client = session.client;\n if (!client) {\n return;\n }\n const hasUnmutedView = Array.from(session.views.values()).some((view) => !view.muted);\n if (!hasUnmutedView) {\n await client.muteRemoteAudio(\"*\", true);\n return;\n }\n const activeUsers = Array.from(session.remoteAudioUsers);\n if (activeUsers.length === 0) {\n await client.muteRemoteAudio(\"*\", false);\n return;\n }\n for (const userId of activeUsers) {\n await client.muteRemoteAudio(userId, false);\n }\n }\n\n private async applyAIDenoiserPolicy(\n session: TrtcSourceSession,\n client: TRTCInstance,\n sdkAppId: number,\n userId: string,\n userSig: string\n ): Promise<void> {\n const options = resolveAIDenoiserOptions(session.aiDenoiser ?? this.aiDenoiser);\n if (!options.enabled) {\n this.log(\"info\", `TRTC AIDenoiser 已关闭 source=${session.sourceId}`);\n return;\n }\n try {\n await client.startPlugin(\"AIDenoiser\", {\n sdkAppId,\n userId,\n userSig,\n mode: getAIDenoiserModeValue(options.mode),\n ...(options.assetsPath ? { assetsPath: options.assetsPath } : {})\n });\n this.log(\"info\", `TRTC AIDenoiser 已开启 source=${session.sourceId} mode=${options.mode}`);\n } catch (error) {\n this.log(\"warn\", `TRTC AIDenoiser 开启失败 source=${session.sourceId}`, error);\n }\n }\n\n /**\n * 销毁单个 source 会话:\n * 解绑事件、停止远端视频、退出房间并销毁客户端。\n */\n private async disposeSession(session: TrtcSourceSession): Promise<void> {\n const TRTC = session.TRTC;\n const client = session.client;\n session.connectPromise = null;\n session.views.clear();\n session.remoteAudioUsers.clear();\n session.remoteVideoStreams.clear();\n session.status = \"idle\";\n session.error = undefined;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(false);\n }\n session.remoteVideoWaiters.length = 0;\n session.hasEverReceivedRemoteVideo = false;\n if (!client) {\n return;\n }\n this.log(\"info\", `销毁会话 source=${session.sourceId}`);\n try {\n if (TRTC && session.onRemoteVideoAvailable && session.onRemoteVideoUnavailable) {\n client.off(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, session.onRemoteVideoAvailable);\n client.off(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, session.onRemoteVideoUnavailable);\n }\n if (TRTC && session.onRemoteAudioAvailable && session.onRemoteAudioUnavailable) {\n client.off(TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, session.onRemoteAudioAvailable);\n client.off(TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, session.onRemoteAudioUnavailable);\n }\n await client.stopRemoteVideo({ userId: \"*\" });\n await client.exitRoom();\n this.log(\"info\", `退房完成 source=${session.sourceId}`);\n client.destroy();\n } catch (err) {\n this.log(\"warn\", `退房/销毁异常 source=${session.sourceId}`, err);\n try {\n client.destroy();\n } catch {\n // ignore\n }\n } finally {\n session.TRTC = null;\n session.client = null;\n }\n }\n\n private emitSnapshot(sourceId: string, snapshot: TrtcSourceSnapshot): void {\n const targetListeners = this.listeners.get(sourceId);\n if (!targetListeners) {\n return;\n }\n targetListeners.forEach((listener) => listener(snapshot));\n }\n\n private log(level: IviRuntimeLogLevel, message: string, ...extra: unknown[]): void {\n const args = [TAG, message, ...extra];\n this.onLog?.({\n level,\n tag: TAG,\n message: `${TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n }\n\n private emitTrtcEvent(\n sourceId: string,\n type: IviRuntimeTrtcEventType,\n rawType: unknown,\n payload: { userId?: string; streamType?: unknown }\n ): void {\n const event: IviRuntimeTrtcEvent = {\n sourceId,\n type,\n rawType: String(rawType),\n payload,\n userId: payload.userId,\n streamType: payload.streamType\n };\n this.onTrtcEvent?.(event);\n }\n}\n\nfunction isRuntimeTrtcSource(\n source: IviRuntimeSource\n): source is IviRuntimeSource & { playback: { type: \"trtc\"; trtc: IviSourcePlaybackTrtc } } {\n return (\n source.status === \"ready\" &&\n source.playback?.type === \"trtc\" &&\n typeof source.playback.trtc === \"object\" &&\n source.playback.trtc !== null\n );\n}\n\nfunction isSameTrtcConfig(a: IviSourcePlaybackTrtc, b: IviSourcePlaybackTrtc): boolean {\n return a.app_id === b.app_id && a.user_id === b.user_id && a.user_sig === b.user_sig && a.room_id === b.room_id;\n}\n\nfunction buildTrtcSessionKey(\n trtc: IviSourcePlaybackTrtc,\n aiDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions\n): string {\n const denoiser = resolveAIDenoiserOptions(aiDenoiser);\n return JSON.stringify({\n appId: trtc.app_id,\n roomId: trtc.room_id,\n userId: trtc.user_id,\n userSig: trtc.user_sig,\n aiDenoiser: {\n enabled: denoiser.enabled,\n mode: denoiser.mode,\n assetsPath: denoiser.assetsPath\n }\n });\n}\n\nfunction isSameAIDenoiserOptions(\n a: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined,\n b: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined\n): boolean {\n const left = resolveAIDenoiserOptions(a);\n const right = resolveAIDenoiserOptions(b);\n return (\n left.enabled === right.enabled &&\n left.mode === right.mode &&\n left.assetsPath === right.assetsPath\n );\n}\n\nfunction shouldUseStringRoomId(roomId: string): boolean {\n if (!/^\\d+$/.test(roomId)) {\n return true;\n }\n const roomNumber = Number(roomId);\n return !Number.isInteger(roomNumber) || roomNumber < 1 || roomNumber > 4294967294;\n}\n\nfunction getTrtcString(trtc: IviSourcePlaybackTrtc, key: keyof IviSourcePlaybackTrtc): string {\n const value = trtc[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction resolveAIDenoiserOptions(\n options: boolean | IviRuntimeTrtcAIDenoiserOptions | undefined\n): Required<Pick<IviRuntimeTrtcAIDenoiserOptions, \"enabled\" | \"mode\">> & Pick<IviRuntimeTrtcAIDenoiserOptions, \"assetsPath\"> {\n if (options === false) {\n return {\n ...DEFAULT_DENOISER_OPTIONS,\n enabled: false\n };\n }\n if (options === true || options === undefined) {\n return DEFAULT_DENOISER_OPTIONS;\n }\n return {\n ...DEFAULT_DENOISER_OPTIONS,\n ...options,\n enabled: options.enabled ?? DEFAULT_DENOISER_OPTIONS.enabled,\n mode: options.mode ?? DEFAULT_DENOISER_OPTIONS.mode\n };\n}\n\nfunction getAIDenoiserModeValue(mode: IviRuntimeTrtcAIDenoiserOptions[\"mode\"]): TRTCDenoiserMode {\n return (mode === \"far_field_reduction\" ? 1 : 0) as TRTCDenoiserMode;\n}\n\nfunction buildRemoteVideoKey(userId: string, streamType: string): string {\n return `${userId}::${streamType}`;\n}\n\nfunction parseRemoteVideoKey(key: string): { userId: string; streamType: string } | null {\n const separatorIndex = key.indexOf(\"::\");\n if (separatorIndex < 0) {\n return null;\n }\n return {\n userId: key.slice(0, separatorIndex),\n streamType: key.slice(separatorIndex + 2)\n };\n}\n\nfunction enforceContainMedia(container: HTMLElement): void {\n const playerNodes = container.querySelectorAll(\"[id^='player_'], [id^='video_'], [id^='audio_']\");\n playerNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n node.style.setProperty(\"width\", \"100%\", \"important\");\n node.style.setProperty(\"height\", \"100%\", \"important\");\n node.style.setProperty(\"max-width\", \"100%\", \"important\");\n node.style.setProperty(\"max-height\", \"100%\", \"important\");\n });\n\n const mediaElements = container.querySelectorAll(\"video, canvas\");\n mediaElements.forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n element.style.setProperty(\"width\", \"100%\", \"important\");\n element.style.setProperty(\"height\", \"100%\", \"important\");\n element.style.setProperty(\"max-width\", \"100%\", \"important\");\n element.style.setProperty(\"max-height\", \"100%\", \"important\");\n element.style.setProperty(\"object-fit\", \"contain\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n });\n}\n","import type { LiveKitBrowserTransportConfig } from \"@vivix-ai/ivi-sdk-ts/transports/livekit-browser\";\nimport type { IviSourcePlayback } from \"./sdk-types\";\nimport type { IviRuntimeSource } from \"./types\";\n\n/**\n * LiveKit 拉流所需的会话凭证。连接字段复用 `@vivix-ai/ivi-sdk-ts` LiveKit transport 的上游类型。\n */\nexport type IviSourcePlaybackLivekit = {\n ws_url: LiveKitBrowserTransportConfig[\"url\"];\n token: LiveKitBrowserTransportConfig[\"token\"];\n room?: string;\n identity?: string;\n};\n\n/**\n * LiveKit 形态的 playback 实体(运行态用)。\n */\nexport type IviSourcePlaybackLivekitDescriptor = IviSourcePlayback & {\n type: \"livekit\";\n livekit: IviSourcePlaybackLivekit;\n};\n\n/**\n * 判定一个 playback 是否携带合法的 LiveKit 配置。\n * 兼容上游类型尚未感知 `livekit` 分支的情况,因此使用结构化检查。\n */\nexport function isLivekitSourcePlayback(\n playback: IviSourcePlayback | undefined | null\n): playback is IviSourcePlaybackLivekitDescriptor {\n if (!playback) return false;\n const candidate = playback as { type?: string; livekit?: unknown };\n if (candidate.type !== \"livekit\" || typeof candidate.livekit !== \"object\" || candidate.livekit === null) {\n return false;\n }\n const livekit = candidate.livekit as { ws_url?: unknown; token?: unknown };\n return typeof livekit.ws_url === \"string\" && typeof livekit.token === \"string\";\n}\n\n/**\n * Runtime 层守卫:source 已 ready 且 playback 是 livekit。\n */\nexport function isReadyLivekitRuntimeSource(\n source: IviRuntimeSource | undefined | null\n): source is IviRuntimeSource & { playback: IviSourcePlaybackLivekitDescriptor } {\n if (!source || source.status !== \"ready\") return false;\n return isLivekitSourcePlayback(source.playback);\n}\n\n/**\n * 浅比较两份 livekit 配置;用于 SourceManager 决定是否需要重建 Room 连接。\n */\nexport function isSameLivekitConfig(a: IviSourcePlaybackLivekit, b: IviSourcePlaybackLivekit): boolean {\n return a.ws_url === b.ws_url && a.token === b.token && a.room === b.room && a.identity === b.identity;\n}\n\nexport function describeLivekitRoom(livekit: IviSourcePlaybackLivekit): string {\n return livekit.room ?? livekit.identity ?? \"unknown\";\n}\n","import type { IviRuntimeLogCallback, IviRuntimeLogLevel, IviRuntimeSource } from \"../types\";\nimport {\n describeLivekitRoom,\n isReadyLivekitRuntimeSource,\n isSameLivekitConfig,\n type IviSourcePlaybackLivekit\n} from \"../livekit-types\";\n\ntype LivekitModule = typeof import(\"livekit-client\");\ntype LivekitRoom = InstanceType<LivekitModule[\"Room\"]>;\ntype LivekitRemoteTrack = InstanceType<LivekitModule[\"RemoteTrack\"]>;\ntype LivekitRemoteParticipant = InstanceType<LivekitModule[\"RemoteParticipant\"]>;\n\nconst TAG = \"[IVI-LIVEKIT]\";\n\nexport type LivekitSourceConnectionStatus = \"idle\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface LivekitSourceSnapshot {\n status: LivekitSourceConnectionStatus;\n error?: string;\n}\n\ninterface LivekitViewBinding {\n container: HTMLElement;\n muted: boolean;\n /** 该 view 上为每条远端 track attach 出的媒体元素。 */\n attachedElements: Map<string, HTMLMediaElement>;\n}\n\ninterface LivekitTrackEntry {\n track: LivekitRemoteTrack;\n participantIdentity: string;\n kind: \"video\" | \"audio\";\n}\n\ninterface LivekitSourceSession {\n sourceId: string;\n livekit: IviSourcePlaybackLivekit;\n livekitModule: LivekitModule | null;\n room: LivekitRoom | null;\n connectPromise: Promise<void> | null;\n views: Map<string, LivekitViewBinding>;\n /** 当前已订阅的远端 track,按 trackSid 索引。 */\n remoteTracks: Map<string, LivekitTrackEntry>;\n status: LivekitSourceConnectionStatus;\n error?: string;\n hasEverReceivedRemoteVideo: boolean;\n remoteVideoWaiters: Array<(available: boolean) => void>;\n /** Room 事件解绑函数集合,断连/销毁时统一调用。 */\n detachRoomListeners: () => void;\n}\n\ntype LivekitSourceListener = (snapshot: LivekitSourceSnapshot) => void;\n\n/**\n * LiveKit 拉流会话池:\n * - 每个 `sourceId` 对应一个 LiveKit `Room` 实例,懒连接、单飞建连;\n * - 远端 track 订阅后按 view 分发到各自容器;\n * - 接口形状刻意贴近 `TrtcSourceManager`,便于 runtime 协调器与 React 组件镜像复用。\n */\nexport class LivekitSourceManager {\n private readonly sessions = new Map<string, LivekitSourceSession>();\n private readonly listeners = new Map<string, Set<LivekitSourceListener>>();\n\n public constructor(private readonly onLog?: IviRuntimeLogCallback) {}\n\n /**\n * 与 runtime 当前 sources 对齐:\n * - 对 ready + livekit 的 source 进行 upsert(必要时建立连接);\n * - 清理已不在 runtime 中的会话(释放资源)。\n */\n public syncRuntimeSources(sources: Map<string, IviRuntimeSource>): void {\n const existingIds = new Set(sources.keys());\n sources.forEach((source, sourceId) => {\n if (!isReadyLivekitRuntimeSource(source)) {\n return;\n }\n this.upsertSource(sourceId, source.playback.livekit);\n });\n this.sessions.forEach((_session, sourceId) => {\n if (!existingIds.has(sourceId)) {\n this.removeSource(sourceId);\n }\n });\n }\n\n /**\n * 按 sourceId 注册/更新 LiveKit 配置。\n * 若 ws_url / token / room / identity 任一发生变化,会先销毁旧会话再按新参数重建连接。\n */\n public upsertSource(sourceId: string, livekit: IviSourcePlaybackLivekit): void {\n const existing = this.sessions.get(sourceId);\n if (!existing) {\n this.log(\"info\", `新建会话 source=${sourceId} room=${describeLivekitRoom(livekit)}`);\n const session = this.createSession(sourceId, livekit);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n return;\n }\n if (isSameLivekitConfig(existing.livekit, livekit)) {\n return;\n }\n this.log(\"info\", `配置变更,重建会话 source=${sourceId} room=${describeLivekitRoom(livekit)}`);\n void this.disposeSession(existing);\n const session = this.createSession(sourceId, livekit);\n this.sessions.set(sourceId, session);\n void this.ensureConnected(session);\n }\n\n /**\n * 删除指定 source 的 LiveKit 会话并释放连接资源。\n */\n public removeSource(sourceId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n this.log(\"info\", `移除会话 source=${sourceId}`);\n this.sessions.delete(sourceId);\n void this.disposeSession(session);\n this.emitSnapshot(sourceId, { status: \"idle\" });\n this.listeners.delete(sourceId);\n }\n\n public reset(): void {\n this.log(\"info\", `重置全部会话 count=${this.sessions.size}`);\n const sessions = Array.from(this.sessions.values());\n this.sessions.clear();\n sessions.forEach((session) => {\n void this.disposeSession(session);\n });\n this.listeners.clear();\n }\n\n public subscribe(sourceId: string, listener: LivekitSourceListener): () => void {\n const set = this.listeners.get(sourceId) ?? new Set<LivekitSourceListener>();\n set.add(listener);\n this.listeners.set(sourceId, set);\n listener(this.getSnapshot(sourceId));\n return () => {\n const target = this.listeners.get(sourceId);\n if (!target) {\n return;\n }\n target.delete(listener);\n if (target.size === 0) {\n this.listeners.delete(sourceId);\n }\n };\n }\n\n public getSnapshot(sourceId: string): LivekitSourceSnapshot {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return { status: \"idle\" };\n }\n return { status: session.status, error: session.error };\n }\n\n public hasRemoteVideoAvailable(sourceId: string): boolean {\n const session = this.sessions.get(sourceId);\n return session?.hasEverReceivedRemoteVideo ?? false;\n }\n\n /**\n * 等待指定 source 的 LiveKit 会话首次拿到远端视频 track。\n * - 若已收到过,立即返回 true;\n * - 若会话被销毁或超时,返回 false。\n */\n public waitForRemoteVideoAvailable(sourceId: string, timeoutMs = 30000): Promise<boolean> {\n const session = this.sessions.get(sourceId);\n if (!session) return Promise.resolve(false);\n if (session.hasEverReceivedRemoteVideo) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n const idx = session.remoteVideoWaiters.indexOf(waiter);\n if (idx >= 0) session.remoteVideoWaiters.splice(idx, 1);\n resolve(false);\n }, timeoutMs);\n\n const waiter = (available: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(available);\n };\n session.remoteVideoWaiters.push(waiter);\n });\n }\n\n /**\n * 把一个渲染容器绑定到 source 会话:\n * - 确保已连接;\n * - 把已订阅的远端 video/audio 回放到该容器;\n * - 应用初始 muted 策略。\n */\n public async attachView(\n sourceId: string,\n viewId: string,\n container: HTMLElement,\n muted: boolean\n ): Promise<void> {\n const session = this.sessions.get(sourceId);\n if (!session) {\n throw new Error(`LiveKit source session not found: ${sourceId}`);\n }\n session.views.set(viewId, {\n container,\n muted,\n attachedElements: new Map()\n });\n await this.ensureConnected(session);\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n this.attachKnownTracksToView(session, binding);\n this.applyMutedToBinding(binding);\n }\n\n public detachView(sourceId: string, viewId: string): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n this.detachAllElementsFromView(session, binding);\n session.views.delete(viewId);\n }\n\n public updateViewMuted(sourceId: string, viewId: string, muted: boolean): void {\n const session = this.sessions.get(sourceId);\n if (!session) {\n return;\n }\n const binding = session.views.get(viewId);\n if (!binding) {\n return;\n }\n binding.muted = muted;\n this.applyMutedToBinding(binding);\n }\n\n private createSession(sourceId: string, livekit: IviSourcePlaybackLivekit): LivekitSourceSession {\n return {\n sourceId,\n livekit,\n livekitModule: null,\n room: null,\n connectPromise: null,\n views: new Map(),\n remoteTracks: new Map(),\n status: \"idle\",\n hasEverReceivedRemoteVideo: false,\n remoteVideoWaiters: [],\n detachRoomListeners: () => undefined\n };\n }\n\n /**\n * 懒连接:单飞模式下复用同一个 connectPromise;建连后注册远端事件并把已订阅 track 推给 view。\n */\n private async ensureConnected(session: LivekitSourceSession): Promise<void> {\n if (session.room && session.livekitModule) {\n return;\n }\n if (session.connectPromise) {\n await session.connectPromise;\n return;\n }\n session.status = \"connecting\";\n session.error = undefined;\n this.emitSnapshot(session.sourceId, { status: session.status });\n session.connectPromise = (async () => {\n const livekitModule = await import(\"livekit-client\");\n const RoomCtor = livekitModule.Room;\n const RoomEvent = livekitModule.RoomEvent;\n const TrackKind = livekitModule.Track.Kind;\n const room = new RoomCtor({\n adaptiveStream: true,\n dynacast: true\n });\n\n const onTrackSubscribed = (\n track: LivekitRemoteTrack,\n _publication: unknown,\n participant: LivekitRemoteParticipant\n ): void => {\n const kind: \"video\" | \"audio\" | null =\n track.kind === TrackKind.Video\n ? \"video\"\n : track.kind === TrackKind.Audio\n ? \"audio\"\n : null;\n if (!kind) return;\n const trackKey = buildRemoteTrackKey(participant.identity, track.sid ?? track.kind);\n this.log(\n \"info\",\n `订阅远端 track source=${session.sourceId} participant=${participant.identity} kind=${kind} sid=${track.sid ?? \"?\"}`\n );\n session.remoteTracks.set(trackKey, {\n track,\n participantIdentity: participant.identity,\n kind\n });\n if (kind === \"video\" && !session.hasEverReceivedRemoteVideo) {\n session.hasEverReceivedRemoteVideo = true;\n for (const waiter of session.remoteVideoWaiters) {\n waiter(true);\n }\n session.remoteVideoWaiters.length = 0;\n }\n session.views.forEach((binding) => {\n this.attachTrackToView(track, kind, trackKey, binding);\n });\n };\n\n const onTrackUnsubscribed = (\n track: LivekitRemoteTrack,\n _publication: unknown,\n participant: LivekitRemoteParticipant\n ): void => {\n const trackKey = buildRemoteTrackKey(participant.identity, track.sid ?? track.kind);\n this.log(\n \"info\",\n `远端 track 取消订阅 source=${session.sourceId} participant=${participant.identity} sid=${track.sid ?? \"?\"}`\n );\n session.remoteTracks.delete(trackKey);\n session.views.forEach((binding) => {\n this.detachTrackFromBinding(track, trackKey, binding);\n });\n };\n\n const onDisconnected = (): void => {\n this.log(\"warn\", `Room 断开 source=${session.sourceId}`);\n };\n\n room.on(RoomEvent.TrackSubscribed, onTrackSubscribed);\n room.on(RoomEvent.TrackUnsubscribed, onTrackUnsubscribed);\n room.on(RoomEvent.Disconnected, onDisconnected);\n session.detachRoomListeners = (): void => {\n room.off(RoomEvent.TrackSubscribed, onTrackSubscribed);\n room.off(RoomEvent.TrackUnsubscribed, onTrackUnsubscribed);\n room.off(RoomEvent.Disconnected, onDisconnected);\n };\n\n this.log(\n \"info\",\n `正在进房 source=${session.sourceId} room=${describeLivekitRoom(session.livekit)} ws=${session.livekit.ws_url}`\n );\n await room.connect(session.livekit.ws_url, session.livekit.token);\n\n session.room = room;\n session.livekitModule = livekitModule;\n session.status = \"connected\";\n session.error = undefined;\n this.log(\"info\", `进房成功 source=${session.sourceId} room=${describeLivekitRoom(session.livekit)}`);\n this.emitSnapshot(session.sourceId, { status: session.status });\n })()\n .catch((error) => {\n session.status = \"error\";\n session.error = error instanceof Error ? error.message : String(error);\n this.log(\"error\", `连接失败 source=${session.sourceId} error=${session.error}`);\n this.emitSnapshot(session.sourceId, {\n status: session.status,\n error: session.error\n });\n throw error;\n })\n .finally(() => {\n session.connectPromise = null;\n });\n await session.connectPromise;\n }\n\n private attachKnownTracksToView(\n session: LivekitSourceSession,\n binding: LivekitViewBinding\n ): void {\n session.remoteTracks.forEach((entry, trackKey) => {\n this.attachTrackToView(entry.track, entry.kind, trackKey, binding);\n });\n }\n\n private attachTrackToView(\n track: LivekitRemoteTrack,\n kind: \"video\" | \"audio\",\n trackKey: string,\n binding: LivekitViewBinding\n ): void {\n if (binding.attachedElements.has(trackKey)) {\n return;\n }\n let element: HTMLMediaElement;\n try {\n element = track.attach();\n } catch (error) {\n this.log(\"warn\", `attach track 失败 trackKey=${trackKey}`, error);\n return;\n }\n binding.attachedElements.set(trackKey, element);\n if (kind === \"video\") {\n enforceContainMedia(element);\n } else {\n element.style.display = \"none\";\n }\n binding.container.appendChild(element);\n this.applyMutedToElement(element, binding.muted);\n }\n\n private detachTrackFromBinding(\n track: LivekitRemoteTrack,\n trackKey: string,\n binding: LivekitViewBinding\n ): void {\n const element = binding.attachedElements.get(trackKey);\n if (!element) return;\n try {\n track.detach(element);\n } catch {\n // ignore\n }\n if (element.parentElement === binding.container) {\n binding.container.removeChild(element);\n }\n binding.attachedElements.delete(trackKey);\n }\n\n private detachAllElementsFromView(\n session: LivekitSourceSession,\n binding: LivekitViewBinding\n ): void {\n binding.attachedElements.forEach((element, trackKey) => {\n const entry = session.remoteTracks.get(trackKey);\n if (entry) {\n try {\n entry.track.detach(element);\n } catch {\n // ignore\n }\n }\n if (element.parentElement === binding.container) {\n binding.container.removeChild(element);\n }\n });\n binding.attachedElements.clear();\n }\n\n private applyMutedToBinding(binding: LivekitViewBinding): void {\n binding.attachedElements.forEach((element) => {\n this.applyMutedToElement(element, binding.muted);\n });\n }\n\n private applyMutedToElement(element: HTMLMediaElement, muted: boolean): void {\n element.muted = muted;\n if (muted) {\n element.volume = 0;\n }\n }\n\n private async disposeSession(session: LivekitSourceSession): Promise<void> {\n session.connectPromise = null;\n session.views.forEach((binding) => {\n this.detachAllElementsFromView(session, binding);\n });\n session.views.clear();\n session.remoteTracks.clear();\n for (const waiter of session.remoteVideoWaiters) {\n waiter(false);\n }\n session.remoteVideoWaiters.length = 0;\n session.hasEverReceivedRemoteVideo = false;\n session.status = \"idle\";\n session.error = undefined;\n\n const room = session.room;\n session.detachRoomListeners();\n session.detachRoomListeners = () => undefined;\n session.room = null;\n session.livekitModule = null;\n if (!room) {\n return;\n }\n this.log(\"info\", `销毁会话 source=${session.sourceId}`);\n try {\n await room.disconnect();\n this.log(\"info\", `离开房间完成 source=${session.sourceId}`);\n } catch (err) {\n this.log(\"warn\", `离开房间异常 source=${session.sourceId}`, err);\n }\n }\n\n private emitSnapshot(sourceId: string, snapshot: LivekitSourceSnapshot): void {\n const targetListeners = this.listeners.get(sourceId);\n if (!targetListeners) {\n return;\n }\n targetListeners.forEach((listener) => listener(snapshot));\n }\n\n private log(level: IviRuntimeLogLevel, message: string, ...extra: unknown[]): void {\n const args = [TAG, message, ...extra];\n this.onLog?.({\n level,\n tag: TAG,\n message: `${TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n }\n}\n\nfunction buildRemoteTrackKey(identity: string, trackId: string): string {\n return `${identity}::${trackId}`;\n}\n\nfunction enforceContainMedia(element: HTMLMediaElement): void {\n element.style.setProperty(\"width\", \"100%\", \"important\");\n element.style.setProperty(\"height\", \"100%\", \"important\");\n element.style.setProperty(\"max-width\", \"100%\", \"important\");\n element.style.setProperty(\"max-height\", \"100%\", \"important\");\n element.style.setProperty(\"object-fit\", \"contain\", \"important\");\n element.style.setProperty(\"display\", \"block\", \"important\");\n}\n","import {\n ReceiveConversationItemAddedEvent,\n ReceiveConversationItemDoneEvent,\n ReceiveSessionCreatedEvent,\n ReceiveSessionEndedEvent,\n ReceiveResponseCreatedEvent,\n type IviClient,\n type IviStageComposition,\n type SendSessionTrackTakePayload\n} from \"@vivix-ai/ivi-sdk-ts\";\nimport { IviRuntimeDispatcher } from \"./runtime-dispatcher\";\nimport {\n ConversationEventHandler,\n SessionEventHandler,\n SourceEventHandler,\n StageEventHandler,\n StreamEventHandler,\n TrackEventHandler\n} from \"./handlers\";\nimport {\n ConversationManager,\n LivekitSourceManager,\n SourceManager,\n SessionManager,\n StageManager,\n StreamManager,\n TrackManager,\n TrtcSourceManager\n} from \"./managers\";\nimport { isLivekitSourcePlayback } from \"./livekit-types\";\nimport type {\n IviRuntimeEventListener,\n IviRuntimeCoordinatorConfig,\n IviRuntimeLogEntry,\n IviRuntimeSource,\n IviRuntimeState,\n IviRuntimeTrtcEvent,\n IviRuntimeTrtcEventListener,\n IviRuntimeUserTextToResponseCallbacks,\n IviRuntimeUserTextToResponseOptions,\n IviRuntimeUserTextToResponseResult\n} from \"./types\";\n\ninterface PendingUserTextToResponseFlow {\n itemId: string;\n streamId?: string;\n response?: IviRuntimeUserTextToResponseOptions[\"response\"];\n responseInput: NonNullable<IviRuntimeUserTextToResponseOptions[\"responseInput\"]>;\n callbacks?: IviRuntimeUserTextToResponseCallbacks;\n addedEvent?: ReceiveConversationItemAddedEvent;\n doneEvent?: ReceiveConversationItemDoneEvent;\n responseRequested: boolean;\n resolve: (result: IviRuntimeUserTextToResponseResult) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * 协调者负责 runtime 生命周期、状态机和跨域补偿,不参与事件类型分发。\n *\n * 状态转移过程:\n * 1) 初始态\n * - 实例创建后默认状态为 `idle`。\n *\n * 2) 启动阶段\n * - 调用 `start()` 后立即进入 `connecting`,并启动 dispatcher 与底层 WebSocket 连接。\n * - 若连接失败,会执行 `stop()`,最终进入 `stopped`。\n *\n * 3) 会话建立后\n * - 收到 `session.created` 后:\n * - `syncStageOnSessionCreated !== false`(默认)时进入 `syncing`,并主动请求 `session.stage.get`。\n * - `syncStageOnSessionCreated === false` 时直接进入 `running`。\n *\n * 4) 同步完成\n * - 在 `syncing` 状态下收到由 `session.stage.get.response` 触发的 stage 变更后,切换为 `running`。\n * - 若 stage 引用了本地缺失的 track/source,会触发 `session.tracks.list` / `session.sources.list` 补偿拉取;\n * 拉取完成后进行一致性校验,缺失仍存在则抛错。\n *\n * 5) 运行中断开\n * - 非 `idle` 状态下连接断开(`onConnectionChange(false)`)会重置运行态并进入 `stopped`。\n *\n * 6) 服务端结束会话\n * - 收到 `session.ended` 时与连接断开类似:清空 managers、拒绝未完成的用户文本链路,并进入 `stopped`(不主动调用底层 `disconnect`,由连接自然关闭或业务方 `stop()`)。\n * - 常见实现下 WebSocket 会先处理完已到达的文本消息再触发 `close`,故 `session.ended` 通常先于断连回调;若已进入 `stopped`,紧随的断连不会再次 reset,避免重复状态通知。\n * - 若因网络等原因未收到 `session.ended` 仅断连,仍会通过 `onConnectionChange(false)` 进入 `stopped`,但 `config.onSessionEnded` 不会触发(需依赖 `onEvent` / 状态订阅区分)。\n *\n * 7) 主动停止\n * - 调用 `stop()` 会停止 dispatcher、断开连接、清空运行态,并进入 `stopped`。\n *\n * 说明:\n * - 当前实现中 `stopped` 为终止态语义;再次调用 `start()` 可重新进入新一轮生命周期(若连接已断需先保证 client 可再次 connect)。\n */\nexport class IviRuntimeCoordinator {\n private readonly client: IviClient;\n private readonly config: IviRuntimeCoordinatorConfig;\n private readonly dispatcher: IviRuntimeDispatcher;\n private readonly sessionManager = new SessionManager();\n private readonly stageManager = new StageManager();\n private readonly trackManager = new TrackManager();\n private readonly sourceManager = new SourceManager();\n private readonly streamManager = new StreamManager();\n private readonly trtcSourceManager: TrtcSourceManager;\n private readonly livekitSourceManager: LivekitSourceManager;\n private readonly conversationManager = new ConversationManager();\n private readonly sessionHandler: SessionEventHandler;\n private readonly stageHandler: StageEventHandler;\n private readonly trackHandler: TrackEventHandler;\n private readonly sourceHandler: SourceEventHandler;\n private readonly streamHandler: StreamEventHandler;\n private readonly conversationHandler: ConversationEventHandler;\n private readonly stateListeners = new Set<(state: IviRuntimeState) => void>();\n private readonly eventListeners = new Set<IviRuntimeEventListener>();\n private readonly trtcEventListeners = new Set<IviRuntimeTrtcEventListener>();\n private readonly pendingUserTextToResponseFlows = new Map<string, PendingUserTextToResponseFlow>();\n private userTextFlowCounter = 0;\n private waitingTracksListValidation = false;\n private waitingSourcesListValidation = false;\n private state: IviRuntimeState = {\n status: \"idle\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n };\n\n /**\n * @param client 底层实时客户端,负责实际事件收发。\n * @param config 协调行为配置(例如会话建立后的同步策略)。\n */\n public constructor(client: IviClient, config?: IviRuntimeCoordinatorConfig) {\n this.client = client;\n this.config = {\n syncStageOnSessionCreated: true,\n ...config\n };\n this.trtcSourceManager = new TrtcSourceManager(\n this.config.onLog,\n (event) => this.emitTrtcEvent(event),\n this.config.trtcAIDenoiser\n );\n this.livekitSourceManager = new LivekitSourceManager(this.config.onLog);\n this.sessionHandler = new SessionEventHandler(this.sessionManager, {\n onSessionCreated: (event) => this.onSessionCreated(event),\n onSessionEnded: (event) => this.onSessionEnded(event)\n });\n this.stageHandler = new StageEventHandler(this.stageManager, {\n onStageChanged: ({ fromStageGetResponse }) => this.onStageChanged(fromStageGetResponse)\n });\n this.trackHandler = new TrackEventHandler(this.trackManager, {\n onTracksChanged: ({ listRefreshed }) => this.onTracksChanged(listRefreshed)\n });\n this.sourceHandler = new SourceEventHandler(this.sourceManager, {\n onSourcesChanged: ({ listRefreshed }) => this.onSourcesChanged(listRefreshed)\n });\n this.streamHandler = new StreamEventHandler(this.streamManager, {\n onStreamsChanged: () => this.onStreamsChanged()\n });\n this.conversationHandler = new ConversationEventHandler(this.conversationManager, {\n onConversationsChanged: () => this.onConversationsChanged()\n });\n this.dispatcher = new IviRuntimeDispatcher(client, {\n sessionHandler: this.sessionHandler,\n stageHandler: this.stageHandler,\n trackHandler: this.trackHandler,\n sourceHandler: this.sourceHandler,\n streamHandler: this.streamHandler,\n conversationHandler: this.conversationHandler,\n onConnectionChange: (connected) => this.onConnectionChange(connected),\n onEvent: (event) => this.emitEvent(event),\n onLog: this.config.onLog\n });\n }\n\n /**\n * 启动协调器并建立实时连接。\n * 启动后状态会从 idle/stopped 进入 connecting,连接成功后由事件驱动进入后续状态。\n */\n public async start(): Promise<void> {\n this.setState({\n ...this.state,\n status: \"connecting\"\n });\n this.dispatcher.start();\n try {\n await this.client.connect();\n } catch (error) {\n this.stop();\n throw error;\n }\n }\n\n /**\n * 停止协调器并断开实时连接,同时重置运行态数据为 stopped。\n */\n public stop(): void {\n this.dispatcher.stop();\n this.client.disconnect();\n this.resetStoppedState();\n }\n\n public getState(): IviRuntimeState {\n return this.state;\n }\n\n public onStateChange(listener: (state: IviRuntimeState) => void): () => void {\n this.stateListeners.add(listener);\n return () => {\n this.stateListeners.delete(listener);\n };\n }\n\n public onEvent(listener: IviRuntimeEventListener): () => void {\n this.eventListeners.add(listener);\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n public onTrtcEvent(listener: IviRuntimeTrtcEventListener): () => void {\n this.trtcEventListeners.add(listener);\n return () => {\n this.trtcEventListeners.delete(listener);\n };\n }\n\n public emitLog(entry: IviRuntimeLogEntry): void {\n this.config.onLog?.(entry);\n }\n\n /**\n * 编排一次\"用户文本输入 -> 触发模型回复\"链路。\n *\n * 流程:\n * 1) 发送 conversation.item.create(可指定 itemId);\n * 2) 等待 conversation.item.added + conversation.item.done;\n * 3) 发送 response.create(默认不携带 input,使用 IVI 内部上下文;可选显式绑定 item_reference);\n * 4) 等待 response.created 并结束。\n */\n public sendUserTextAndTriggerResponse(\n options: IviRuntimeUserTextToResponseOptions\n ): Promise<IviRuntimeUserTextToResponseResult> {\n const normalizedStreamId = options.streamId?.trim() || undefined;\n const normalizedText = options.text.trim();\n if (!normalizedText) {\n throw new Error(\"text must be a non-empty string.\");\n }\n const normalizedItemId =\n typeof options.itemId === \"string\" && options.itemId.trim().length > 0\n ? options.itemId.trim()\n : undefined;\n if (normalizedItemId && this.pendingUserTextToResponseFlows.has(normalizedItemId)) {\n throw new Error(`Conversation item flow already exists for itemId: ${normalizedItemId}`);\n }\n if (normalizedStreamId && this.hasPendingResponseFlow(normalizedStreamId)) {\n throw new Error(`Response flow already pending for streamId: ${normalizedStreamId}`);\n }\n\n const itemId = normalizedItemId ?? this.buildUserTextItemId();\n return new Promise<IviRuntimeUserTextToResponseResult>((resolve, reject) => {\n this.pendingUserTextToResponseFlows.set(itemId, {\n itemId,\n streamId: normalizedStreamId,\n response: options.response,\n responseInput: options.responseInput ?? \"context\",\n callbacks: options.callbacks,\n responseRequested: false,\n resolve,\n reject\n });\n this.client.sendUserText(normalizedText, itemId).catch((error) => {\n this.pendingUserTextToResponseFlows.delete(itemId);\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n }\n\n /**\n * 上报某个 source 在指定 track 上播放完成。\n *\n * - 若 next 槽位为空,只发送 complete。\n * - 若 next 槽位已有 source,立即将 next 提升为 active,并发送 complete 与 take。\n * - 当前为普通视频/m3u8 且 next 为 TRTC source 时,等待 TRTC 远端视频可用后再切换并发送 complete/take。\n */\n public sendSessionSourcePlaybackCompleted(sourceId: string, trackId?: string): void {\n const resolvedTrackId = trackId ?? this.trackManager.findTrackIdByActiveSource(sourceId);\n if (!resolvedTrackId) {\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n return;\n }\n\n const track = this.trackManager.getAll().get(resolvedTrackId);\n if (!track) {\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n return;\n }\n\n if (track.next_source_id) {\n const currentSource = this.sourceManager.get(sourceId);\n const nextSource = this.sourceManager.get(track.next_source_id);\n if (isVideoPlaybackSource(currentSource) && isTrtcPlaybackSource(nextSource)) {\n void this.deferredTrtcTakeCompleteAndTake(resolvedTrackId, track.next_source_id, sourceId, trackId);\n return;\n }\n if (isVideoPlaybackSource(currentSource) && isLivekitPlaybackSource(nextSource)) {\n void this.deferredLivekitTakeCompleteAndTake(resolvedTrackId, track.next_source_id, sourceId, trackId);\n return;\n }\n\n this.applyLocalTrackTake(resolvedTrackId);\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n this.sendSessionTrackTake(resolvedTrackId);\n return;\n }\n\n this.client.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n }\n\n public getTrtcSourceManager(): TrtcSourceManager {\n return this.trtcSourceManager;\n }\n\n public getLivekitSourceManager(): LivekitSourceManager {\n return this.livekitSourceManager;\n }\n\n private onConnectionChange(connected: boolean): void {\n if (connected || this.state.status === \"idle\") {\n return;\n }\n if (this.state.status === \"stopped\") {\n return;\n }\n this.resetStoppedState();\n }\n\n private validateStageTracks(stage: IviStageComposition | null, hasTrack: (trackId: string) => boolean): boolean {\n const missingTrackIds = this.getMissingTrackIds(stage, hasTrack);\n if (missingTrackIds.length === 0) {\n return false;\n }\n this.waitingTracksListValidation = true;\n return true;\n }\n\n private validateTracksListRefreshed(stage: IviStageComposition | null, hasTrack: (trackId: string) => boolean): void {\n if (!this.waitingTracksListValidation) {\n return;\n }\n this.waitingTracksListValidation = false;\n const missingTrackIds = this.getMissingTrackIds(stage, hasTrack);\n if (missingTrackIds.length > 0) {\n throw new Error(\n `Runtime track sync failed: missing tracks after session.tracks.list.response: ${missingTrackIds.join(\", \")}`\n );\n }\n }\n\n public reset(): void {\n this.waitingTracksListValidation = false;\n this.waitingSourcesListValidation = false;\n }\n\n private onSessionCreated(event: ReceiveSessionCreatedEvent): void {\n this.stageManager.reset();\n this.trackManager.reset();\n this.sourceManager.reset();\n this.streamManager.reset();\n this.trtcSourceManager.reset();\n this.livekitSourceManager.reset();\n this.conversationManager.reset();\n this.reset();\n\n const nextStatus = this.config.syncStageOnSessionCreated !== false ? \"syncing\" : \"running\";\n this.setState({\n status: nextStatus,\n session: event.session,\n stage: this.stageManager.getStage(),\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll(),\n streams: this.streamManager.getAll(),\n conversationItems: this.conversationManager.getAllMap(),\n conversations: this.conversationManager.getOrderedList()\n });\n\n if (this.config.syncStageOnSessionCreated !== false) {\n this.client.sendSessionStageGet();\n }\n }\n\n private onSessionEnded(event: ReceiveSessionEndedEvent): void {\n this.resetStoppedState();\n this.config.onSessionEnded?.(event);\n }\n\n private onStageChanged(fromStageGetResponse: boolean): void {\n const nextStatus = fromStageGetResponse && this.state.status === \"syncing\" ? \"running\" : this.state.status;\n const nextStage = this.stageManager.getStage();\n this.setState({\n ...this.state,\n status: nextStatus,\n stage: nextStage\n });\n\n const shouldFetchTracks = this.validateStageTracks(nextStage, (trackId) => this.trackManager.has(trackId));\n if (shouldFetchTracks) {\n this.client.sendSessionTracksList();\n return;\n }\n this.ensureSourcesSyncedForTracks();\n }\n\n private onTracksChanged(listRefreshed: boolean): void {\n const nextStage = this.stageManager.getStage();\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll()\n });\n if (listRefreshed) {\n this.validateTracksListRefreshed(nextStage, (trackId) => this.trackManager.has(trackId));\n }\n this.ensureSourcesSyncedForTracks();\n }\n\n private applyLocalTrackTake(trackId: string): void {\n this.trackManager.applyTrackTook(trackId);\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n tracks: this.trackManager.getAll(),\n sources: this.sourceManager.getAll()\n });\n }\n\n private async deferredTrtcTakeCompleteAndTake(\n trackId: string,\n nextSourceId: string,\n completedSourceId: string,\n completedTrackIdArg?: string\n ): Promise<void> {\n const remoteVideoAvailable = await this.trtcSourceManager.waitForRemoteVideoAvailable(nextSourceId);\n if (!remoteVideoAvailable) return;\n\n if (this.state.status !== \"running\") return;\n\n const currentTrack = this.trackManager.getAll().get(trackId);\n if (!currentTrack || currentTrack.next_source_id !== nextSourceId) {\n return;\n }\n\n this.applyLocalTrackTake(trackId);\n this.client.sendSessionSourcePlaybackCompleted(completedSourceId, completedTrackIdArg);\n this.sendSessionTrackTake(trackId);\n }\n\n private async deferredLivekitTakeCompleteAndTake(\n trackId: string,\n nextSourceId: string,\n completedSourceId: string,\n completedTrackIdArg?: string\n ): Promise<void> {\n const remoteVideoAvailable = await this.livekitSourceManager.waitForRemoteVideoAvailable(nextSourceId);\n if (!remoteVideoAvailable) return;\n\n if (this.state.status !== \"running\") return;\n\n const currentTrack = this.trackManager.getAll().get(trackId);\n if (!currentTrack || currentTrack.next_source_id !== nextSourceId) {\n return;\n }\n\n this.applyLocalTrackTake(trackId);\n this.client.sendSessionSourcePlaybackCompleted(completedSourceId, completedTrackIdArg);\n this.sendSessionTrackTake(trackId);\n }\n\n private sendSessionTrackTake(trackId: string): void {\n const message: SendSessionTrackTakePayload = {\n type: \"session.track.take\",\n track_id: trackId\n };\n void this.client.send(message);\n }\n\n private onSourcesChanged(listRefreshed: boolean): void {\n this.sourceManager.syncWithTracks(this.trackManager.getAll());\n this.trtcSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.livekitSourceManager.syncRuntimeSources(this.sourceManager.getAll());\n this.setState({\n ...this.state,\n sources: this.sourceManager.getAll()\n });\n if (listRefreshed) {\n this.validateSourcesListRefreshed((sourceId) => this.sourceManager.has(sourceId));\n }\n }\n\n private onStreamsChanged(): void {\n this.setState({\n ...this.state,\n streams: this.streamManager.getAll()\n });\n }\n\n private onConversationsChanged(): void {\n this.setState({\n ...this.state,\n conversationItems: this.conversationManager.getAllMap(),\n conversations: this.conversationManager.getOrderedList()\n });\n }\n\n private setState(nextState: IviRuntimeState): void {\n if (\n this.state.status === nextState.status &&\n this.state.session === nextState.session &&\n this.state.stage === nextState.stage &&\n this.state.tracks === nextState.tracks &&\n this.state.sources === nextState.sources &&\n this.state.streams === nextState.streams &&\n this.state.conversationItems === nextState.conversationItems &&\n this.state.conversations === nextState.conversations\n ) {\n return;\n }\n this.state = nextState;\n this.stateListeners.forEach((listener) => listener(this.state));\n }\n\n private emitEvent(event: Parameters<IviRuntimeEventListener>[0]): void {\n this.progressUserTextToResponseFlows(event);\n this.eventListeners.forEach((listener) => listener(event, this.state));\n }\n\n private emitTrtcEvent(event: IviRuntimeTrtcEvent): void {\n this.config.onTrtcEvent?.(event);\n this.trtcEventListeners.forEach((listener) => listener(event));\n }\n\n private resetStoppedState(): void {\n this.rejectPendingUserTextToResponseFlows(\n new Error(\"Runtime stopped before user text to response flow completed.\")\n );\n this.sessionManager.reset();\n this.stageManager.reset();\n this.trackManager.reset();\n this.sourceManager.reset();\n this.streamManager.reset();\n this.trtcSourceManager.reset();\n this.livekitSourceManager.reset();\n this.conversationManager.reset();\n this.reset();\n this.setState({\n status: \"stopped\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n });\n }\n\n private ensureSourcesSyncedForTracks(): void {\n const missingSourceIds = this.getMissingSourceIds((sourceId) => this.sourceManager.has(sourceId));\n if (missingSourceIds.length === 0) {\n return;\n }\n this.waitingSourcesListValidation = true;\n this.client.sendSessionSourcesList();\n }\n\n private validateSourcesListRefreshed(hasSource: (sourceId: string) => boolean): void {\n if (!this.waitingSourcesListValidation) {\n return;\n }\n this.waitingSourcesListValidation = false;\n const missingSourceIds = this.getMissingSourceIds(hasSource);\n if (missingSourceIds.length > 0) {\n throw new Error(\n `Runtime source sync failed: missing sources after session.sources.list.response: ${missingSourceIds.join(\", \")}`\n );\n }\n }\n\n private getMissingTrackIds(\n stage: IviStageComposition | null,\n hasTrack: (trackId: string) => boolean\n ): string[] {\n if (!stage) {\n return [];\n }\n const missing = new Set<string>();\n (stage.composition ?? []).forEach((item) => {\n if (!hasTrack(item.track_id)) {\n missing.add(item.track_id);\n }\n });\n return Array.from(missing);\n }\n\n private getMissingSourceIds(hasSource: (sourceId: string) => boolean): string[] {\n const missing = new Set<string>();\n this.trackManager.getAll().forEach((track) => {\n if (track.active_source_id && !hasSource(track.active_source_id)) {\n missing.add(track.active_source_id);\n }\n if (track.next_source_id && !hasSource(track.next_source_id)) {\n missing.add(track.next_source_id);\n }\n });\n return Array.from(missing);\n }\n\n private hasPendingResponseFlow(streamId: string): boolean {\n for (const flow of this.pendingUserTextToResponseFlows.values()) {\n if (flow.streamId === streamId) {\n return true;\n }\n }\n return false;\n }\n\n private rejectPendingUserTextToResponseFlows(error: Error): void {\n this.pendingUserTextToResponseFlows.forEach((flow) => {\n flow.reject(error);\n });\n this.pendingUserTextToResponseFlows.clear();\n }\n\n private progressUserTextToResponseFlows(event: Parameters<IviRuntimeEventListener>[0]): void {\n if (event instanceof ReceiveConversationItemAddedEvent) {\n if (!event.item.id) {\n return;\n }\n const flow = this.pendingUserTextToResponseFlows.get(event.item.id);\n if (!flow) {\n return;\n }\n flow.addedEvent = event;\n flow.callbacks?.onConversationItemAdded?.(event);\n this.tryTriggerResponseCreate(flow);\n return;\n }\n\n if (event instanceof ReceiveConversationItemDoneEvent) {\n if (!event.item.id) {\n return;\n }\n const flow = this.pendingUserTextToResponseFlows.get(event.item.id);\n if (!flow) {\n return;\n }\n flow.doneEvent = event;\n flow.callbacks?.onConversationItemDone?.(event);\n this.tryTriggerResponseCreate(flow);\n return;\n }\n\n if (!(event instanceof ReceiveResponseCreatedEvent)) {\n return;\n }\n const matchedFlow = Array.from(this.pendingUserTextToResponseFlows.values()).find(\n (flow) => flow.responseRequested && flow.streamId === event.streamId\n );\n if (!matchedFlow) {\n return;\n }\n matchedFlow.callbacks?.onResponseCreated?.(event);\n matchedFlow.resolve({\n itemId: matchedFlow.itemId,\n streamId: matchedFlow.streamId,\n responseCreatedEvent: event\n });\n this.pendingUserTextToResponseFlows.delete(matchedFlow.itemId);\n }\n\n private tryTriggerResponseCreate(flow: PendingUserTextToResponseFlow): void {\n if (flow.responseRequested || !flow.addedEvent || !flow.doneEvent) {\n return;\n }\n flow.callbacks?.onConversationItemReady?.({\n itemId: flow.itemId,\n addedEvent: flow.addedEvent,\n doneEvent: flow.doneEvent\n });\n if (flow.responseInput === \"item_reference\") {\n this.client.sendResponseCreateByItemId(flow.itemId, flow.streamId, flow.response);\n } else {\n this.client.sendResponseCreate(flow.streamId, flow.response);\n }\n flow.responseRequested = true;\n }\n\n private buildUserTextItemId(): string {\n this.userTextFlowCounter += 1;\n const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, \"\");\n const randomSuffix = Math.random().toString(36).slice(2, 8);\n return `client.conversation.item.user.text.${timestamp}.${this.userTextFlowCounter}.${randomSuffix}`;\n }\n\n}\n\nfunction isVideoPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || source.status !== \"ready\" || !source.playback) return false;\n if (source.playback.type === \"trtc\") return false;\n if (isLivekitSourcePlayback(source.playback)) return false;\n if (source.source.asset_type === \"image\") return false;\n return source.playback.type === \"url\" && Boolean(source.playback.url);\n}\n\nfunction isTrtcPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || !source.playback) return false;\n return source.playback.type === \"trtc\" && Boolean(source.playback.trtc);\n}\n\nfunction isLivekitPlaybackSource(source: IviRuntimeSource | undefined): boolean {\n if (!source || !source.playback) return false;\n return isLivekitSourcePlayback(source.playback);\n}\n\n","import { IviClient } from \"@vivix-ai/ivi-sdk-ts\";\nimport { IviRuntimeCoordinator } from \"./runtime/runtime-coordinator\";\nimport type { IviClientConfig } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeCoordinatorConfig } from \"./runtime/types\";\n\nexport type IviFrontendClientConfig = IviClientConfig;\n\nexport class IviFrontendSdk {\n public createClient(config: IviFrontendClientConfig): IviClient {\n return new IviClient(config);\n }\n\n public createRuntimeCoordinator(\n clientConfig: IviFrontendClientConfig,\n runtimeConfig?: IviRuntimeCoordinatorConfig\n ): IviRuntimeCoordinator {\n const client = this.createClient(clientConfig);\n return new IviRuntimeCoordinator(client, runtimeConfig);\n }\n}\n","import { createContext } from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeState } from \"../runtime/types\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeSource } from \"../runtime/types\";\n\nexport interface IviStageSlotBinding {\n slot: string;\n trackId: string;\n track?: IviTrack;\n sourceId: string | null;\n source?: IviRuntimeSource;\n}\n\nexport interface IviStageViewContextValue {\n runtime: IviRuntimeCoordinator | null;\n state: IviRuntimeState;\n slotTrackMap: Map<string, string>;\n slotBindings: IviStageSlotBinding[];\n}\n\nexport const IviStageViewContext = createContext<IviStageViewContextValue | null>(null);\n","import { useEffect, useState } from \"react\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeState } from \"../runtime/types\";\n\nexport const EMPTY_RUNTIME_STATE: IviRuntimeState = {\n status: \"idle\",\n session: null,\n stage: null,\n tracks: new Map(),\n sources: new Map(),\n streams: new Map(),\n conversationItems: new Map(),\n conversations: []\n};\n\nexport function useRuntimeState(runtime: IviRuntimeCoordinator | null): IviRuntimeState {\n const [state, setState] = useState<IviRuntimeState>(() => runtime?.getState() ?? EMPTY_RUNTIME_STATE);\n\n useEffect(() => {\n if (!runtime) {\n setState(EMPTY_RUNTIME_STATE);\n return;\n }\n setState(runtime.getState());\n return runtime.onStateChange((next) => {\n setState(next);\n });\n }, [runtime]);\n\n return state;\n}\n","import {\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeState } from \"../runtime/types\";\nimport { IviStageViewContext } from \"./stage-view-context\";\nimport type { IviStageSlotBinding } from \"./stage-view-context\";\nimport { useRuntimeState } from \"./use-runtime-state\";\nimport type { ParsedIviEvent } from \"@vivix-ai/ivi-sdk-ts\";\n\ntype IVIStageViewRenderChildren = (context: {\n runtime: IviRuntimeCoordinator | null;\n slotTrackMap: Map<string, string>;\n slotBindings: IviStageSlotBinding[];\n}) => ReactNode;\n\nexport interface IVIStageViewProps {\n children?: ReactNode | IVIStageViewRenderChildren;\n className?: string;\n style?: CSSProperties;\n runtime: IviRuntimeCoordinator | null;\n onBindingsChange?: (bindings: IviStageSlotBinding[]) => void;\n onRuntimeEvent?: (event: ParsedIviEvent) => void;\n}\n\n/**\n * 顶层舞台容器:负责把 runtime state 注入到内部 TrackSlot。\n */\nexport function IVIStageView(props: IVIStageViewProps): ReactElement {\n const {\n children,\n className,\n style,\n runtime,\n onBindingsChange,\n onRuntimeEvent\n } = props;\n const state = useRuntimeState(runtime);\n\n const slotTrackMap = useMemo(() => {\n return buildSlotTrackMapFromState(state);\n }, [state.stage]);\n\n const slotBindings = useMemo<IviStageSlotBinding[]>(() => {\n return buildSlotBindingsFromState(state);\n }, [state.stage, state.tracks, state.sources]);\n\n useEffect(() => {\n onBindingsChange?.(slotBindings);\n }, [slotBindings, onBindingsChange]);\n\n useEffect(() => {\n if (!runtime || !onRuntimeEvent) {\n return;\n }\n return runtime.onEvent((event) => {\n onRuntimeEvent(event);\n });\n }, [runtime, onRuntimeEvent]);\n\n const contextValue = useMemo(\n () => ({\n runtime,\n state,\n slotTrackMap,\n slotBindings\n }),\n [runtime, state, slotTrackMap, slotBindings]\n );\n\n const resolvedChildren =\n typeof children === \"function\"\n ? children({\n runtime,\n slotTrackMap,\n slotBindings\n })\n : children;\n\n const rootStyle: CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n ...(style ?? {})\n };\n return (\n <div className={className} style={rootStyle}>\n <IviStageViewContext.Provider value={contextValue}>{resolvedChildren}</IviStageViewContext.Provider>\n </div>\n );\n}\n\nfunction buildSlotTrackMapFromState(state: IviRuntimeState): Map<string, string> {\n const map = new Map<string, string>();\n (state.stage?.composition ?? []).forEach((item) => {\n map.set(item.slot, item.track_id);\n });\n return map;\n}\n\nfunction buildSlotBindingsFromState(state: IviRuntimeState): IviStageSlotBinding[] {\n const bindings: IviStageSlotBinding[] = [];\n (state.stage?.composition ?? []).forEach((item) => {\n const track = state.tracks.get(item.track_id);\n const sourceId = track?.active_source_id ?? null;\n const source = sourceId ? state.sources.get(sourceId) : undefined;\n bindings.push({\n slot: item.slot,\n trackId: item.track_id,\n track,\n sourceId,\n source\n });\n });\n return bindings;\n}\n\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode\n} from \"react\";\n\n// ---- 音量记忆 ----\n\nconst VOLUME_STORAGE_KEY = \"ivi-volume-preferences\";\nconst DEFAULT_VOLUME = 80;\n\nexport type IviMediaVolumeType = \"trtc\" | \"video\" | \"hls\" | \"livekit\";\n\ninterface VolumePreferences {\n trtc: number;\n video: number;\n hls: number;\n livekit: number;\n}\n\nfunction clampVolume(v: number): number {\n return Math.max(0, Math.min(100, Math.round(v)));\n}\n\nfunction loadVolumePreferences(): VolumePreferences {\n try {\n const raw = localStorage.getItem(VOLUME_STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Partial<VolumePreferences>;\n return {\n trtc: clampVolume(parsed.trtc ?? DEFAULT_VOLUME),\n video: clampVolume(parsed.video ?? DEFAULT_VOLUME),\n hls: clampVolume(parsed.hls ?? DEFAULT_VOLUME),\n livekit: clampVolume(parsed.livekit ?? DEFAULT_VOLUME)\n };\n }\n } catch {\n /* noop */\n }\n return {\n trtc: DEFAULT_VOLUME,\n video: DEFAULT_VOLUME,\n hls: DEFAULT_VOLUME,\n livekit: DEFAULT_VOLUME\n };\n}\n\nfunction saveVolumePreferences(prefs: VolumePreferences): void {\n try {\n localStorage.setItem(VOLUME_STORAGE_KEY, JSON.stringify(prefs));\n } catch {\n /* noop */\n }\n}\n\n/**\n * 按媒体类型记忆音量偏好(0-100),自动持久化到 localStorage。\n * mediaType 为 null 时返回默认值且不做持久化。\n */\nexport function useVolumeMemory(\n mediaType: IviMediaVolumeType | null\n): [number, (v: number) => void] {\n const [prefs, setPrefs] = useState(loadVolumePreferences);\n\n const setVolume = useCallback(\n (v: number) => {\n if (!mediaType) return;\n setPrefs((prev) => {\n const next = { ...prev, [mediaType]: clampVolume(v) };\n saveVolumePreferences(next);\n return next;\n });\n },\n [mediaType]\n );\n\n return [mediaType ? prefs[mediaType] : DEFAULT_VOLUME, setVolume];\n}\n\n// ---- 默认喇叭图标 ----\n\nfunction DefaultSpeakerIcon({ volume, color }: { volume: number; color: string }): ReactNode {\n if (volume === 0) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M22 9l-6 6M16 9l6 6\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n if (volume < 50) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M15.54 8.46a5 5 0 010 7.07\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11 5L6 9H2v6h4l5 4V5z\"\n fill={color}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M15.54 8.46a5 5 0 010 7.07\" stroke={color} strokeWidth=\"2\" strokeLinecap=\"round\" />\n <path\n d=\"M19.07 4.93a10 10 0 010 14.14\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ---- 自定义滑条 ----\n\nfunction VolumeSlider({\n value,\n onChange,\n trackBg,\n fillColor,\n thumbColor\n}: {\n value: number;\n onChange: (v: number) => void;\n trackBg: string;\n fillColor: string;\n thumbColor: string;\n}): ReactNode {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const calcValue = useCallback(\n (clientX: number) => {\n const el = trackRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n onChange(Math.round(ratio * 100));\n },\n [onChange]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n calcValue(e.clientX);\n },\n [calcValue]\n );\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.buttons === 0) return;\n calcValue(e.clientX);\n },\n [calcValue]\n );\n\n const pct = `${value}%`;\n\n return (\n <div\n ref={trackRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n style={{\n position: \"relative\",\n flex: 1,\n height: 4,\n minWidth: 60,\n borderRadius: 2,\n backgroundColor: trackBg,\n cursor: \"pointer\",\n touchAction: \"none\"\n }}\n >\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n height: \"100%\",\n width: pct,\n borderRadius: 2,\n backgroundColor: fillColor,\n pointerEvents: \"none\"\n }}\n />\n <div\n style={{\n position: \"absolute\",\n left: pct,\n top: \"50%\",\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n backgroundColor: thumbColor,\n transform: \"translate(-50%, -50%)\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.3)\",\n pointerEvents: \"none\"\n }}\n />\n </div>\n );\n}\n\n// ---- 音量控制组件 ----\n\nexport interface IVIVolumeControlColors {\n /** 容器背景色,默认 rgba(0, 0, 0, 0.55) */\n background?: string;\n /** 前景色(图标、文字、滑块填充),默认 #fff */\n foreground?: string;\n /** 滑轨底色,默认 rgba(255, 255, 255, 0.25) */\n trackBackground?: string;\n /** 滑轨已填充部分颜色,默认同 foreground */\n trackFill?: string;\n}\n\nexport interface IVIVolumeControlProps {\n /** 当前音量 0-100 */\n volume: number;\n /** 音量变化回调 */\n onVolumeChange: (volume: number) => void;\n /** 自定义喇叭图标渲染,接收当前音量以决定显示状态 */\n renderSpeakerIcon?: (volume: number) => ReactNode;\n /** 颜色配置 */\n colors?: IVIVolumeControlColors;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: CSSProperties;\n}\n\n/**\n * 胶囊形音量调节控件:喇叭图标 + 滑条 + 百分比数字。\n * 点击喇叭切换静音/恢复,拖动滑条调节音量。\n */\nexport function IVIVolumeControl(props: IVIVolumeControlProps): ReactNode {\n const { volume, onVolumeChange, renderSpeakerIcon, colors, className, style } = props;\n\n const bg = colors?.background ?? \"rgba(0, 0, 0, 0.55)\";\n const fg = colors?.foreground ?? \"#fff\";\n const trackBg = colors?.trackBackground ?? \"rgba(255, 255, 255, 0.25)\";\n const trackFill = colors?.trackFill ?? fg;\n\n const prevVolumeRef = useRef(volume > 0 ? volume : DEFAULT_VOLUME);\n if (volume > 0) {\n prevVolumeRef.current = volume;\n }\n\n const toggleMute = useCallback(() => {\n onVolumeChange(volume > 0 ? 0 : prevVolumeRef.current);\n }, [volume, onVolumeChange]);\n\n return (\n <div\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 999,\n backgroundColor: bg,\n color: fg,\n userSelect: \"none\",\n fontSize: 12,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n lineHeight: 1,\n ...style\n }}\n >\n <div\n onClick={toggleMute}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") toggleMute();\n }}\n style={{ cursor: \"pointer\", display: \"flex\", alignItems: \"center\", flexShrink: 0 }}\n >\n {renderSpeakerIcon ? (\n renderSpeakerIcon(volume)\n ) : (\n <DefaultSpeakerIcon volume={volume} color={fg} />\n )}\n </div>\n <VolumeSlider\n value={volume}\n onChange={onVolumeChange}\n trackBg={trackBg}\n fillColor={trackFill}\n thumbColor={fg}\n />\n <span\n style={{\n minWidth: 28,\n textAlign: \"right\",\n fontSize: 11,\n opacity: 0.9,\n flexShrink: 0,\n fontVariantNumeric: \"tabular-nums\"\n }}\n >\n {volume}%\n </span>\n </div>\n );\n}\n\n// ---- TrackSlot 集成辅助 ----\n\n/**\n * 将音量设置同步到容器内 active 槽位的所有 video/audio 元素。\n * 内部使用 MutationObserver 以应对 TRTC 等异步创建的媒体元素。\n */\nexport function useApplyVolumeToSlot(\n containerRef: React.RefObject<HTMLElement | null>,\n volume: number,\n enabled: boolean,\n activeSourceId?: string | null\n): void {\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !enabled) return;\n\n const normalizedVolume = clampVolume(volume) / 100;\n\n const apply = (): void => {\n const activeSlot = container.querySelector('[data-ivi-slot-role=\"active\"]');\n if (!activeSlot) return;\n activeSlot\n .querySelectorAll<HTMLVideoElement | HTMLAudioElement>(\"video, audio\")\n .forEach((el) => {\n el.volume = normalizedVolume;\n });\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(container, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [containerRef, volume, enabled, activeSourceId]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeConversationItem } from \"../runtime/types\";\n\nexport type IviSubtitleRole = IviRuntimeConversationItem[\"role\"];\n\nexport interface IviSubtitleItem {\n id: string;\n role: IviSubtitleRole;\n lifecycle: IviRuntimeConversationItem[\"lifecycle\"];\n status: IviRuntimeConversationItem[\"status\"];\n text: string;\n transcript: string;\n displayText: string;\n content: IviRuntimeConversationItem[\"content\"];\n item: IviRuntimeConversationItem[\"item\"];\n /** 首次进入字幕队列的时间戳。 */\n timestamp: number;\n /** 最近一次字幕内容或状态更新的时间戳。 */\n updatedAt: number;\n}\n\nexport interface IviUseSubtitlesOptions {\n /** 要收集的发言人角色,默认 [\"user\"]。传单个字符串或数组均可。 */\n roles?: IviSubtitleRole | IviSubtitleRole[];\n /** 最多保留的字幕条数,超过后自动清理最旧条目,默认 2。 */\n maxItems?: number;\n}\n\n/**\n * 监听 runtime 中的 conversation/response 事件,并维护当前应展示的字幕队列。\n */\nexport function useIviSubtitles(\n runtime: IviRuntimeCoordinator | null,\n options: IviUseSubtitlesOptions = {}\n): IviSubtitleItem[] {\n const roles = options.roles ?? \"user\";\n const maxItems = normalizeMaxItems(options.maxItems);\n const roleKey = Array.isArray(roles) ? roles.join(\"\\u0000\") : roles;\n const roleSet = useMemo(\n () => new Set<IviSubtitleRole>(roleKey.split(\"\\u0000\") as IviSubtitleRole[]),\n [roleKey]\n );\n const [subtitles, setSubtitles] = useState<IviSubtitleItem[]>([]);\n const seenIdsRef = useRef(new Set<string>());\n const initializedRef = useRef(false);\n\n useEffect(() => {\n seenIdsRef.current = new Set();\n initializedRef.current = false;\n setSubtitles([]);\n\n if (!runtime) {\n return;\n }\n\n const syncConversations = (conversations: IviRuntimeConversationItem[]): void => {\n const now = Date.now();\n const seenIds = seenIdsRef.current;\n\n if (!initializedRef.current) {\n initializedRef.current = true;\n for (const item of conversations) {\n if (item.lifecycle === \"done\" || !getDisplayText(item) || !roleSet.has(item.role)) {\n seenIds.add(item.id);\n }\n }\n }\n\n setSubtitles((previous) => {\n const conversationMap = new Map(conversations.map((item) => [item.id, item]));\n const nextById = new Map<string, IviSubtitleItem>();\n\n for (const previousItem of previous) {\n const conversation = conversationMap.get(previousItem.id);\n if (!conversation || !roleSet.has(conversation.role) || !getDisplayText(conversation)) {\n continue;\n }\n nextById.set(\n previousItem.id,\n buildSubtitleItem(\n conversation,\n previousItem.timestamp,\n hasSubtitleChanged(previousItem, conversation) ? now : previousItem.updatedAt\n )\n );\n }\n\n for (const conversation of conversations) {\n if (!roleSet.has(conversation.role) || !getDisplayText(conversation)) {\n continue;\n }\n if (seenIds.has(conversation.id)) {\n continue;\n }\n seenIds.add(conversation.id);\n nextById.set(conversation.id, buildSubtitleItem(conversation, now, now));\n }\n\n const next = Array.from(nextById.values());\n if (maxItems === 0) {\n return [];\n }\n return next.length > maxItems ? next.slice(next.length - maxItems) : next;\n });\n };\n\n syncConversations(runtime.getState().conversations);\n\n return runtime.onEvent((event, state) => {\n if (event.type === \"session.ended\") {\n seenIdsRef.current = new Set();\n initializedRef.current = false;\n setSubtitles([]);\n return;\n }\n if (!isSubtitleRelatedEvent(event.type)) {\n return;\n }\n syncConversations(state.conversations);\n });\n }, [runtime, roleSet, maxItems]);\n\n return subtitles;\n}\n\nfunction normalizeMaxItems(maxItems: number | undefined): number {\n if (maxItems === undefined) {\n return 2;\n }\n if (!Number.isFinite(maxItems)) {\n return 2;\n }\n return Math.max(0, Math.floor(maxItems));\n}\n\nfunction getDisplayText(item: IviRuntimeConversationItem): string {\n return item.text || item.transcript;\n}\n\nfunction buildSubtitleItem(\n item: IviRuntimeConversationItem,\n timestamp: number,\n updatedAt: number\n): IviSubtitleItem {\n return {\n id: item.id,\n role: item.role,\n lifecycle: item.lifecycle,\n status: item.status,\n text: item.text,\n transcript: item.transcript,\n displayText: getDisplayText(item),\n content: item.content,\n item: item.item,\n timestamp,\n updatedAt\n };\n}\n\nfunction hasSubtitleChanged(previous: IviSubtitleItem, next: IviRuntimeConversationItem): boolean {\n return (\n previous.text !== next.text ||\n previous.transcript !== next.transcript ||\n previous.lifecycle !== next.lifecycle ||\n previous.status !== next.status ||\n previous.role !== next.role\n );\n}\n\nfunction isSubtitleRelatedEvent(type: string): boolean {\n return type.startsWith(\"conversation.\") || type.startsWith(\"response.\");\n}\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport {\n useIviSubtitles,\n type IviUseSubtitlesOptions\n} from \"./use-ivi-subtitles\";\n\n// ---- 字幕浮层组件 ----\n\nexport interface IVISubtitleOverlayStyle {\n /** 字体,默认 system-ui */\n fontFamily?: string;\n /** 字体大小,默认 14px */\n fontSize?: number | string;\n /** 字体颜色,默认 #fff */\n color?: string;\n /** 胶囊背景色,默认 rgba(0, 0, 0, 0.6) */\n background?: string;\n}\n\nexport interface IVISubtitleOverlayProps {\n /** 字幕来源 runtime。 */\n runtime: IviRuntimeCoordinator | null;\n /** 要显示的发言人角色,默认 [\"user\"]。传单个字符串或数组均可。 */\n roles?: IviUseSubtitlesOptions[\"roles\"];\n /** 最多保留的字幕条数,默认 2。 */\n maxItems?: number;\n /** @deprecated Use `maxItems` instead. */\n maxVisible?: number;\n /** 样式配置 */\n subtitleStyle?: IVISubtitleOverlayStyle;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: CSSProperties;\n}\n\nconst BREATHE_KEYFRAMES = `@keyframes ivi-subtitle-breathe{0%,100%{opacity:1}50%{opacity:.55}}`;\n\n/**\n * 字幕浮层:基于 useIviSubtitles 的预制 UI,胶囊形半透明黑底白字。\n * added 阶段背景呼吸闪动;字幕保留与裁剪由 hook 的 maxItems 控制。\n */\nexport function IVISubtitleOverlay(props: IVISubtitleOverlayProps): ReactNode {\n const {\n runtime,\n roles = \"user\",\n maxItems,\n maxVisible,\n subtitleStyle,\n className,\n style\n } = props;\n const entries = useIviSubtitles(runtime, {\n roles,\n maxItems: maxItems ?? maxVisible\n });\n\n if (entries.length === 0) return null;\n\n const fontFamily = subtitleStyle?.fontFamily ?? \"system-ui, -apple-system, sans-serif\";\n const fontSize = subtitleStyle?.fontSize ?? 14;\n const color = subtitleStyle?.color ?? \"#fff\";\n const bg = subtitleStyle?.background ?? \"rgba(0, 0, 0, 0.6)\";\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 6,\n pointerEvents: \"none\",\n ...style\n }}\n >\n <style>{BREATHE_KEYFRAMES}</style>\n {entries.map((entry) => (\n <div\n key={entry.id}\n style={{\n display: \"inline-block\",\n padding: \"5px 16px\",\n borderRadius: 999,\n backgroundColor: bg,\n color,\n fontSize,\n fontFamily,\n lineHeight: 1.5,\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n animation:\n entry.lifecycle === \"added\"\n ? \"ivi-subtitle-breathe 1.5s ease-in-out infinite\"\n : undefined\n }}\n >\n {entry.displayText}\n </div>\n ))}\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { IviStageViewContext } from \"./stage-view-context\";\nimport type { IviStageViewContextValue } from \"./stage-view-context\";\n\nexport function useIviStageView(): IviStageViewContextValue {\n const context = useContext(IviStageViewContext);\n if (!context) {\n throw new Error(\"useIviStageView must be used inside IVIStageView.\");\n }\n return context;\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { IviSourcePlaybackTrtc } from \"../runtime/sdk-types\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeTrtcAIDenoiserOptions } from \"../runtime/types\";\nimport { TrtcSourceManager } from \"../runtime/managers/trtc-source-manager\";\n\nexport interface IVITrtcPlayerProps {\n trtc: IviSourcePlaybackTrtc;\n sourceId?: string;\n runtime?: IviRuntimeCoordinator | null;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n muted?: boolean;\n /**\n * 独立使用 IVITrtcPlayer(未传 runtime)时的 TRTC AIDenoiser 降噪配置。\n * 默认开启;传 false 可关闭。\n */\n trtcAIDenoiser?: boolean | IviRuntimeTrtcAIDenoiserOptions;\n}\n\nconst standaloneTrtcSourceManager = new TrtcSourceManager();\n\n/**\n * 默认 TRTC 播放器:挂载即加入房间并拉流,连接由 TrtcSourceManager 统一复用。\n * muted 变化仅更新音频策略,不触发重连。\n */\nexport function IVITrtcPlayer(props: IVITrtcPlayerProps): ReactNode {\n const {\n trtc,\n sourceId,\n runtime,\n className,\n style,\n loadingFallback = null,\n errorFallback = null,\n muted = false,\n trtcAIDenoiser\n } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewIdRef = useRef(`trtc-view-${Math.random().toString(36).slice(2, 10)}`);\n const manager = runtime?.getTrtcSourceManager() ?? standaloneTrtcSourceManager;\n const resolvedSourceId = useMemo(\n () => sourceId ?? `adhoc:${trtc.app_id}:${trtc.user_id}:${trtc.room_id}`,\n [sourceId, trtc.app_id, trtc.room_id, trtc.user_id]\n );\n const shouldManageSourceLifecycle = !runtime || !sourceId;\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n\n // 连接生命周期:挂载即加入房间并 startRemoteVideo(初始按当前 muted 值静音)。\n // muted 不在依赖中——变化时仅由下方独立 effect 更新音频策略,避免 detach/reattach 导致重复拉流。\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n let disposed = false;\n if (shouldManageSourceLifecycle) {\n manager.upsertSource(resolvedSourceId, trtc, trtcAIDenoiser);\n }\n const unsubscribe = manager.subscribe(resolvedSourceId, (snapshot) => {\n if (disposed) {\n return;\n }\n setLoading(snapshot.status === \"idle\" || snapshot.status === \"connecting\");\n setError(snapshot.status === \"error\" ? snapshot.error ?? \"TRTC 拉流失败\" : null);\n });\n\n void manager\n .attachView(resolvedSourceId, viewIdRef.current, container, mutedRef.current)\n .catch((caughtError) => {\n if (disposed) {\n return;\n }\n setError(caughtError instanceof Error ? caughtError.message : \"TRTC 拉流失败\");\n setLoading(false);\n });\n\n return () => {\n disposed = true;\n unsubscribe();\n manager.detachView(resolvedSourceId, viewIdRef.current);\n if (shouldManageSourceLifecycle) {\n manager.removeSource(resolvedSourceId);\n }\n };\n }, [\n manager,\n resolvedSourceId,\n shouldManageSourceLifecycle,\n trtc.app_id,\n trtc.room_id,\n trtc.user_id,\n trtc.user_sig,\n trtcAIDenoiser\n ]);\n\n // 音频策略独立于连接生命周期,muted 变化时仅调整远端音频静音状态。\n useEffect(() => {\n manager.updateViewMuted(resolvedSourceId, viewIdRef.current, muted);\n }, [manager, muted, resolvedSourceId]);\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n backgroundColor: \"#000\",\n position: \"relative\",\n ...style\n }}\n >\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\n {loading ? loadingFallback : null}\n {error ? (errorFallback ?? <div>{error}</div>) : null}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport type { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport { LivekitSourceManager } from \"../runtime/managers/livekit-source-manager\";\nimport { describeLivekitRoom, type IviSourcePlaybackLivekit } from \"../runtime/livekit-types\";\n\nexport interface IVILivekitPlayerProps {\n livekit: IviSourcePlaybackLivekit;\n sourceId?: string;\n runtime?: IviRuntimeCoordinator | null;\n className?: string;\n style?: CSSProperties;\n loadingFallback?: ReactNode;\n errorFallback?: ReactNode;\n muted?: boolean;\n}\n\nconst standaloneLivekitSourceManager = new LivekitSourceManager();\n\n/**\n * 默认 LiveKit 播放器:挂载即加入房间并拉流,连接由 LivekitSourceManager 统一复用。\n * muted 变化仅更新音频静音策略,不触发重连。\n */\nexport function IVILivekitPlayer(props: IVILivekitPlayerProps): ReactNode {\n const {\n livekit,\n sourceId,\n runtime,\n className,\n style,\n loadingFallback = null,\n errorFallback = null,\n muted = false\n } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewIdRef = useRef(`livekit-view-${Math.random().toString(36).slice(2, 10)}`);\n const manager = runtime?.getLivekitSourceManager() ?? standaloneLivekitSourceManager;\n const resolvedSourceId = useMemo(\n () => sourceId ?? `adhoc:${livekit.ws_url}:${describeLivekitRoom(livekit)}:${livekit.token}`,\n [sourceId, livekit]\n );\n const shouldManageSourceLifecycle = !runtime || !sourceId;\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n\n // 连接生命周期:挂载即加入房间并 attach view(初始按当前 muted 值静音)。\n // muted 不在依赖中——变化时仅由下方独立 effect 更新静音策略,避免 detach/reattach 导致重复拉流。\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n let disposed = false;\n if (shouldManageSourceLifecycle) {\n manager.upsertSource(resolvedSourceId, livekit);\n }\n const unsubscribe = manager.subscribe(resolvedSourceId, (snapshot) => {\n if (disposed) {\n return;\n }\n setLoading(snapshot.status === \"idle\" || snapshot.status === \"connecting\");\n setError(snapshot.status === \"error\" ? snapshot.error ?? \"LiveKit 拉流失败\" : null);\n });\n\n void manager\n .attachView(resolvedSourceId, viewIdRef.current, container, mutedRef.current)\n .catch((caughtError) => {\n if (disposed) {\n return;\n }\n setError(caughtError instanceof Error ? caughtError.message : \"LiveKit 拉流失败\");\n setLoading(false);\n });\n\n return () => {\n disposed = true;\n unsubscribe();\n manager.detachView(resolvedSourceId, viewIdRef.current);\n if (shouldManageSourceLifecycle) {\n manager.removeSource(resolvedSourceId);\n }\n };\n }, [\n manager,\n resolvedSourceId,\n shouldManageSourceLifecycle,\n livekit.ws_url,\n livekit.token,\n livekit.room,\n livekit.identity\n ]);\n\n // 静音策略独立于连接生命周期,muted 变化时仅调整远端音频静音状态。\n useEffect(() => {\n manager.updateViewMuted(resolvedSourceId, viewIdRef.current, muted);\n }, [manager, muted, resolvedSourceId]);\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n backgroundColor: \"#000\",\n position: \"relative\",\n ...style\n }}\n >\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\" }} />\n {loading ? loadingFallback : null}\n {error ? (errorFallback ?? <div>{error}</div>) : null}\n </div>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n type CSSProperties,\n type ReactNode,\n type SyntheticEvent,\n type VideoHTMLAttributes\n} from \"react\";\n\nexport interface IVIFlvVideoProps {\n url: string;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n style?: CSSProperties;\n /** 是否为直播流,默认 true */\n isLive?: boolean;\n /** 为 true 时暂停播放(用于 standby 槽位预加载) */\n paused?: boolean;\n}\n\ninterface XgplayerLike {\n play(): Promise<void> | void;\n pause(): void;\n destroy(): void;\n on(event: string, callback: (...args: unknown[]) => void): void;\n off(event: string, callback: (...args: unknown[]) => void): void;\n muted: boolean;\n volume: number;\n}\n\ntype XgplayerCtor = new (options: Record<string, unknown>) => XgplayerLike;\n\ntype XgplayerModules = {\n Player: XgplayerCtor;\n FlvPlugin: unknown;\n};\n\nlet loadModulesPromise: Promise<XgplayerModules> | null = null;\n\nasync function loadXgplayerModules(): Promise<XgplayerModules> {\n if (!loadModulesPromise) {\n loadModulesPromise = (async () => {\n try {\n await import(\"xgplayer/dist/index.min.css\");\n } catch (err) {\n console.warn(\"[IVIFlvVideo] 加载 xgplayer 样式失败,播放器控件可能显示异常\", err);\n }\n\n const [playerMod, flvMod] = await Promise.all([import(\"xgplayer\"), import(\"xgplayer-flv\")]);\n\n const playerModule = playerMod as { default?: XgplayerCtor; Player?: XgplayerCtor };\n const flvModule = flvMod as { default?: unknown; FlvPlugin?: unknown };\n\n const Player = (playerModule.default ?? playerModule.Player) as XgplayerCtor | undefined;\n const FlvPlugin = flvModule.default ?? flvModule.FlvPlugin;\n\n if (!Player || !FlvPlugin) {\n throw new Error(\"xgplayer 或 xgplayer-flv 模块导出无效\");\n }\n\n return { Player, FlvPlugin };\n })().catch((err) => {\n loadModulesPromise = null;\n throw err;\n });\n }\n return loadModulesPromise;\n}\n\nexport function IVIFlvVideo(props: IVIFlvVideoProps): ReactNode {\n const { url, videoProps, style, isLive = true, paused = false } = props;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const playerRef = useRef<XgplayerLike | null>(null);\n const pausedRef = useRef(paused);\n const videoPropsRef = useRef(videoProps);\n videoPropsRef.current = videoProps;\n const reactId = useId();\n const containerId = `ivi-flv-${reactId.replace(/:/g, \"\")}`;\n\n useEffect(() => {\n pausedRef.current = paused;\n const player = playerRef.current;\n if (!player) return;\n if (paused) {\n player.pause();\n } else {\n Promise.resolve(player.play()).catch((err) => {\n console.warn(\n \"[IVIFlvVideo] paused→active 切换时 play() 被浏览器拒绝(多半受自动播放策略限制)\",\n err\n );\n });\n }\n }, [paused]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let disposed = false;\n let endedHandler: (() => void) | null = null;\n let errorHandler: ((...args: unknown[]) => void) | null = null;\n\n const setup = async (): Promise<void> => {\n try {\n const { Player, FlvPlugin } = await loadXgplayerModules();\n if (disposed || !containerRef.current) return;\n\n playerRef.current?.destroy();\n playerRef.current = null;\n container.innerHTML = \"\";\n\n const shouldAutoplay = !pausedRef.current;\n const currentVideoProps = videoPropsRef.current;\n const muted = Boolean(currentVideoProps?.muted);\n\n const player = new Player({\n id: containerId,\n el: containerRef.current,\n url,\n plugins: [FlvPlugin],\n isLive,\n autoplay: shouldAutoplay,\n autoplayMuted: muted,\n muted,\n controls: currentVideoProps?.controls ?? true,\n width: \"100%\",\n height: \"100%\",\n fluid: true,\n videoFillMode: \"contain\",\n flv: {\n retryCount: Number.MAX_SAFE_INTEGER,\n retryDelay: 500,\n loadTimeout: 10_000\n }\n });\n\n playerRef.current = player;\n\n errorHandler = (...args: unknown[]) => {\n console.warn(\"[IVIFlvVideo] 播放器 error 事件\", { url, args });\n };\n player.on(\"error\", errorHandler);\n\n const onEnded = currentVideoProps?.onEnded;\n if (onEnded) {\n endedHandler = () => {\n videoPropsRef.current?.onEnded?.({} as SyntheticEvent<HTMLVideoElement, Event>);\n };\n player.on(\"ended\", endedHandler);\n }\n\n if (!pausedRef.current) {\n Promise.resolve(player.play()).catch((err) => {\n console.warn(\"[IVIFlvVideo] 初始 play() 被浏览器拒绝\", err);\n });\n }\n } catch (err) {\n console.warn(\"[IVIFlvVideo] 初始化 xgplayer-flv 失败\", err);\n }\n };\n\n void setup();\n\n return () => {\n disposed = true;\n const player = playerRef.current;\n if (player) {\n if (endedHandler) player.off(\"ended\", endedHandler);\n if (errorHandler) player.off(\"error\", errorHandler);\n player.destroy();\n }\n playerRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = \"\";\n }\n };\n }, [url, isLive, containerId]);\n\n return <div id={containerId} ref={containerRef} style={{ width: \"100%\", height: \"100%\", ...style }} />;\n}\n\nexport function isFlvUrl(url: string): boolean {\n return /\\.flv(?:$|[?#])/i.test(url);\n}\n","import { useEffect, useRef, type CSSProperties, type ReactNode, type VideoHTMLAttributes } from \"react\";\nimport type { IviRuntimeLogCallback, IviRuntimeLogLevel } from \"../runtime/types\";\n\nexport interface IVIHlsVideoProps {\n url: string;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n style?: CSSProperties;\n aggressivePreload?: boolean;\n /** 为 true 时暂停播放(用于 standby 槽位预加载只缓冲不播放) */\n paused?: boolean;\n /** HLS 内部链路日志回调;未传入时不输出日志。 */\n onLog?: IviRuntimeLogCallback;\n}\n\ninterface HlsErrorData {\n fatal?: boolean;\n type?: string;\n details?: string;\n}\n\ninterface HlsLike {\n loadSource(sourceUrl: string): void;\n attachMedia(media: HTMLMediaElement): void;\n on(eventName: string, listener: (eventName: string, data?: HlsErrorData) => void): void;\n startLoad(startPosition?: number): void;\n recoverMediaError(): void;\n destroy(): void;\n}\n\ninterface HlsCtorLike {\n isSupported(): boolean;\n new(config?: Record<string, unknown>): HlsLike;\n Events?: Record<string, string>;\n ErrorTypes?: Record<string, string>;\n ErrorDetails?: Record<string, string>;\n}\n\nconst RETRY_DELAY_MS = 500;\n// hls.js 的 maxNumRetry 参与有限运算,用 MAX_SAFE_INTEGER 近似表达“无限重试”。\nconst UNLIMITED_RETRIES = Number.MAX_SAFE_INTEGER;\nconst HLS_LOG_TAG = \"[IVI-HLS]\";\n\ntype HlsRetryConfig = {\n maxNumRetry: number;\n retryDelayMs: number;\n maxRetryDelayMs: number;\n backoff: \"linear\" | \"exponential\";\n shouldRetry: (\n retryConfig: unknown,\n retryCount: number,\n isTimeout: boolean,\n loaderResponse: unknown,\n retry: boolean\n ) => boolean;\n};\n\ntype HlsLoadPolicy = {\n default: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryConfig;\n errorRetry: HlsRetryConfig;\n };\n};\n\nfunction makeRetryConfig(label: string, kind: \"timeout\" | \"error\", onLog?: IviRuntimeLogCallback): HlsRetryConfig {\n return {\n maxNumRetry: UNLIMITED_RETRIES,\n retryDelayMs: RETRY_DELAY_MS,\n maxRetryDelayMs: RETRY_DELAY_MS,\n backoff: \"linear\",\n shouldRetry: (_config, retryCount, isTimeout) => {\n const reason = kind === \"timeout\" || isTimeout ? \"加载超时\" : \"加载失败\";\n emitHlsLog(\n onLog,\n \"warn\",\n `${label} ${reason},${RETRY_DELAY_MS}ms 后进行第 ${retryCount + 1} 次重试(无上限)`\n );\n return true;\n }\n };\n}\n\nfunction makeLoadPolicy(label: string, onLog?: IviRuntimeLogCallback): HlsLoadPolicy {\n return {\n default: {\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeRetryConfig(label, \"timeout\", onLog),\n errorRetry: makeRetryConfig(label, \"error\", onLog)\n }\n };\n}\n\nexport function IVIHlsVideo(props: IVIHlsVideoProps): ReactNode {\n const { url, videoProps, style, aggressivePreload = false, paused = false, onLog } = props;\n const videoRef = useRef<HTMLVideoElement | null>(null);\n // 用 ref 同步 paused 最新值,保证错误恢复回调里读取到的是最新的预加载状态,\n // 避免 standby 槽位的视频在 HLS 恢复时被误播。\n const pausedRef = useRef<boolean>(paused);\n\n // 预加载暂停/恢复:standby 槽位只缓冲不播放,切为 active 时自动 play。\n useEffect(() => {\n pausedRef.current = paused;\n const video = videoRef.current;\n if (!video) return;\n if (paused) {\n video.pause();\n } else {\n video.play().catch((err) => {\n emitHlsLog(\n onLog,\n \"warn\",\n \"paused→active 切换时 play() 被浏览器拒绝(多半受自动播放策略限制)\",\n err\n );\n });\n }\n }, [onLog, paused]);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) {\n return;\n }\n\n let disposed = false;\n let hlsInstance: HlsLike | null = null;\n let fullReloadTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearFullReloadTimer = (): void => {\n if (fullReloadTimer) {\n clearTimeout(fullReloadTimer);\n fullReloadTimer = null;\n }\n };\n\n // 无论走 hls.js 还是原生 HLS 降级,<video> 自身的错误/停滞都要上报。\n const onVideoError = (): void => {\n const el = videoRef.current;\n const mediaErr = el?.error;\n emitHlsLog(onLog, \"warn\", \"<video> 元素报错\", {\n code: mediaErr?.code,\n message: mediaErr?.message,\n currentSrc: el?.currentSrc,\n networkState: el?.networkState,\n readyState: el?.readyState\n });\n };\n const onVideoStalled = (): void => {\n emitHlsLog(onLog, \"warn\", \"<video> stalled(缓冲停滞)\", {\n currentTime: videoRef.current?.currentTime,\n readyState: videoRef.current?.readyState\n });\n };\n video.addEventListener(\"error\", onVideoError);\n video.addEventListener(\"stalled\", onVideoStalled);\n\n // 错误恢复后显式 play(),但必须先尊重 paused(预加载 standby 槽位)——\n // 预加载时 pausedRef.current === true,此时绝不播放,只静默缓冲。\n const resumePlayback = (): void => {\n if (disposed) return;\n if (pausedRef.current) return;\n const el = videoRef.current;\n if (!el) return;\n el.play().catch((err) => {\n emitHlsLog(\n onLog,\n \"warn\",\n \"恢复后 play() 被浏览器拒绝(可能受自动播放策略限制)\",\n err\n );\n });\n };\n\n // 当内置重试已经用尽 / 无法处理(例如 manifest 解析失败)时的兜底:\n // 以 RETRY_DELAY_MS 为间隔无限重试 loadSource → attachMedia → startLoad。\n const scheduleFullReload = (reason: string): void => {\n if (disposed || fullReloadTimer) return;\n emitHlsLog(onLog, \"warn\", `${reason},${RETRY_DELAY_MS}ms 后重新拉取源(无限重试)`);\n fullReloadTimer = setTimeout(() => {\n fullReloadTimer = null;\n if (disposed || !hlsInstance || !videoRef.current) return;\n try {\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(videoRef.current);\n hlsInstance.startLoad();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"重新拉取源抛出异常,继续重试\", err);\n scheduleFullReload(\"重新拉取源异常\");\n }\n }, RETRY_DELAY_MS);\n };\n\n const setup = async (): Promise<void> => {\n try {\n const module = await import(\"hls.js\");\n if (disposed || !videoRef.current) {\n return;\n }\n const hlsModule = module as {\n default?: HlsCtorLike;\n Events?: Record<string, string>;\n ErrorTypes?: Record<string, string>;\n ErrorDetails?: Record<string, string>;\n };\n const Hls = (hlsModule.default ?? module) as HlsCtorLike;\n const events = hlsModule.Events ?? Hls.Events ?? {};\n const errorTypes = hlsModule.ErrorTypes ?? Hls.ErrorTypes ?? {};\n\n if (!Hls.isSupported()) {\n emitHlsLog(\n onLog,\n \"warn\",\n \"当前环境不支持 hls.js,降级到原生 HLS(失败将由 <video> error 事件上报)\",\n { url }\n );\n videoRef.current.src = url;\n return;\n }\n\n const bufferPreset = aggressivePreload\n ? {\n maxBufferLength: 180,\n maxMaxBufferLength: 240,\n backBufferLength: 120\n }\n : {\n maxBufferLength: 30,\n maxMaxBufferLength: 60,\n backBufferLength: 30\n };\n\n const instance = new Hls({\n enableWorker: true,\n lowLatencyMode: false,\n ...bufferPreset,\n capLevelToPlayerSize: true,\n // 以下三项是核心:列表与分片的拉取全部使用 hls.js 内置重试,\n // 无上限次数、间隔上限 0.5s、每次重试通过 shouldRetry 打印警告。\n manifestLoadPolicy: makeLoadPolicy(\"manifest 主列表\", onLog),\n playlistLoadPolicy: makeLoadPolicy(\"level 子码率列表\", onLog),\n fragLoadPolicy: makeLoadPolicy(\"fragment 媒体分片\", onLog)\n });\n hlsInstance = instance;\n\n const errorEvent = events.ERROR ?? \"hlsError\";\n const networkErrorType = errorTypes.NETWORK_ERROR ?? \"networkError\";\n const mediaErrorType = errorTypes.MEDIA_ERROR ?? \"mediaError\";\n\n instance.on(errorEvent, (_eventName, data) => {\n if (!data) {\n emitHlsLog(onLog, \"warn\", \"HLS ERROR 事件 data 为空\");\n return;\n }\n\n if (!data.fatal) {\n // Loader 层的非致命错误(NETWORK_ERROR)已经在 shouldRetry 回调里打印过,\n // 这里只补打印其他模块(buffer/media/key 等不经过 LoadPolicy)的非致命错误,\n // 避免同一次网络抖动被打印两次。\n if (data.type !== networkErrorType) {\n emitHlsLog(onLog, \"warn\", \"HLS 非致命错误(不走内置重试)\", data.type, data.details);\n }\n return;\n }\n\n switch (data.type) {\n case networkErrorType:\n emitHlsLog(onLog, \"warn\", \"HLS 致命网络错误,调用 startLoad() 重启拉流\", data.details);\n try {\n hlsInstance?.startLoad();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"startLoad() 异常,走兜底重载\", err);\n scheduleFullReload(\"startLoad 异常\");\n }\n break;\n\n case mediaErrorType:\n emitHlsLog(onLog, \"warn\", \"HLS 致命媒体错误,调用 recoverMediaError() 恢复\", data.details);\n try {\n hlsInstance?.recoverMediaError();\n resumePlayback();\n } catch (err) {\n emitHlsLog(onLog, \"warn\", \"recoverMediaError() 异常,走兜底重载\", err);\n scheduleFullReload(\"recoverMediaError 异常\");\n }\n break;\n\n default:\n // 其他致命错误(如 manifest 解析失败)内置重试无法覆盖,\n // 按 0.5s 间隔无限重试 loadSource + attachMedia + startLoad。\n emitHlsLog(onLog, \"warn\", \"HLS 其他致命错误,准备重新拉取源\", data.type, data.details);\n scheduleFullReload(\"其他致命错误\");\n break;\n }\n });\n\n instance.loadSource(url);\n instance.attachMedia(videoRef.current);\n } catch (err) {\n emitHlsLog(\n onLog,\n \"warn\",\n \"动态加载 hls.js 失败,降级到原生 HLS(失败将由 <video> error 事件上报)\",\n err\n );\n if (disposed || !videoRef.current) return;\n videoRef.current.src = url;\n }\n };\n\n void setup();\n\n return () => {\n disposed = true;\n clearFullReloadTimer();\n video.removeEventListener(\"error\", onVideoError);\n video.removeEventListener(\"stalled\", onVideoStalled);\n hlsInstance?.destroy();\n hlsInstance = null;\n };\n }, [url, aggressivePreload, onLog]);\n\n return (\n <video\n ref={videoRef}\n {...videoProps}\n autoPlay={paused ? false : (videoProps?.autoPlay ?? true)}\n playsInline={videoProps?.playsInline ?? true}\n controls={videoProps?.controls ?? true}\n style={style}\n />\n );\n}\n\nexport function isM3u8Url(url: string): boolean {\n return /\\.m3u8(?:$|[?#])/i.test(url);\n}\n\nfunction emitHlsLog(\n onLog: IviRuntimeLogCallback | undefined,\n level: IviRuntimeLogLevel,\n message: string,\n ...extra: unknown[]\n): void {\n const args = [HLS_LOG_TAG, message, ...extra];\n onLog?.({\n level,\n tag: HLS_LOG_TAG,\n message: `${HLS_LOG_TAG} ${message}`,\n args,\n data: extra.length > 0 ? { message, extra } : { message }\n });\n}\n","import {\n useEffect,\n useRef,\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type SyntheticEvent,\n type VideoHTMLAttributes\n} from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviSourcePlayback, IviSourcePlaybackTrtc } from \"../../runtime/sdk-types\";\nimport type { IviRuntimeLogCallback, IviRuntimeSource } from \"../../runtime/types\";\nimport type { IviRuntimeCoordinator } from \"../../runtime/runtime-coordinator\";\nimport { isLivekitSourcePlayback } from \"../../runtime/livekit-types\";\nimport { IVITrtcPlayer, type IVITrtcPlayerProps } from \"../ivi-trtc-player\";\nimport { IVILivekitPlayer, type IVILivekitPlayerProps } from \"../ivi-livekit-player\";\nimport { IVIFlvVideo, isFlvUrl } from \"../ivi-flv-video\";\nimport { IVIHlsVideo, isM3u8Url } from \"../ivi-hls-video\";\nimport type { IviMediaVolumeType } from \"../ivi-volume-control\";\nimport type {\n IviTrackSlotRenderContext,\n IVITrackSlotProps\n} from \"../ivi-track-slot\";\n\nexport type IviReadyRuntimeSource = IviRuntimeSource & {\n playback: NonNullable<IviRuntimeSource[\"playback\"]>;\n};\n\nexport function toReadyRuntimeSource(source: IviRuntimeSource | undefined): IviReadyRuntimeSource | null {\n if (!source || source.status !== \"ready\" || !source.playback) {\n return null;\n }\n return source as IviReadyRuntimeSource;\n}\n\nexport function supportsSubtitleOverlay(source: IviReadyRuntimeSource | null): boolean {\n if (!source) return false;\n if (source.source.asset_type === \"image\") return false;\n return (\n source.source.kind === \"stream\" ||\n source.source.kind === \"generation_stream\" ||\n source.source.kind === \"generated_clip\" ||\n source.source.kind === \"static\"\n );\n}\n\nexport function detectMediaVolumeType(source: IviReadyRuntimeSource | null): IviMediaVolumeType | null {\n if (!source) return null;\n if (getPlaybackType(source.playback) === \"trtc\") return \"trtc\";\n if (isLivekitSourcePlayback(source.playback)) return \"livekit\";\n if (source.source.asset_type === \"image\") return null;\n const url = getPlaybackUrl(source.playback);\n if (!url) return null;\n return isM3u8Url(url) ? \"hls\" : \"video\";\n}\n\ninterface TrackSlotMediaContentProps {\n slot?: string;\n track: IviTrack;\n source: IviReadyRuntimeSource;\n slotSourceId: string;\n isActive: boolean;\n runtime: IviRuntimeCoordinator | null;\n renderTrtc?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderLivekit?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderMedia?: (context: IviTrackSlotRenderContext) => ReactNode;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n trtcPlayerProps?: Omit<IVITrtcPlayerProps, \"trtc\" | \"sourceId\" | \"runtime\">;\n livekitPlayerProps?: Omit<IVILivekitPlayerProps, \"livekit\" | \"sourceId\" | \"runtime\">;\n adaptToSourceSize: boolean;\n fitStrategy: IVITrackSlotProps[\"fitStrategy\"];\n onLog?: IviRuntimeLogCallback;\n}\n\nexport function TrackSlotMediaContent(props: TrackSlotMediaContentProps): ReactNode {\n const {\n slot,\n track,\n source,\n slotSourceId,\n isActive,\n runtime,\n renderTrtc,\n renderLivekit,\n renderMedia,\n imageProps,\n videoProps,\n trtcPlayerProps,\n livekitPlayerProps,\n adaptToSourceSize,\n fitStrategy,\n onLog\n } = props;\n const renderContext: IviTrackSlotRenderContext = {\n slot: slot ?? \"\",\n track,\n source,\n isPreloading: !isActive\n };\n const mediaStyle = buildAdaptiveMediaStyle(adaptToSourceSize, fitStrategy);\n const shouldMute = !isActive;\n\n if (renderMedia) return renderMedia(renderContext);\n\n if (getPlaybackType(source.playback) === \"trtc\") {\n const trtc = getTrtcPlayback(source.playback);\n if (!trtc) return null;\n if (renderTrtc) return renderTrtc(renderContext);\n const trtcMuted = shouldMute || Boolean(trtcPlayerProps?.muted);\n return (\n <IVITrtcPlayer\n trtc={trtc}\n sourceId={source.source.source_id}\n runtime={runtime}\n {...trtcPlayerProps}\n muted={trtcMuted}\n loadingFallback={isActive ? trtcPlayerProps?.loadingFallback : null}\n errorFallback={isActive ? trtcPlayerProps?.errorFallback : null}\n style={{ ...mediaStyle, ...(trtcPlayerProps?.style ?? {}) }}\n />\n );\n }\n\n if (isLivekitSourcePlayback(source.playback)) {\n if (renderLivekit) return renderLivekit(renderContext);\n const livekitMuted = shouldMute || Boolean(livekitPlayerProps?.muted);\n return (\n <IVILivekitPlayer\n livekit={source.playback.livekit}\n sourceId={source.source.source_id}\n runtime={runtime}\n {...livekitPlayerProps}\n muted={livekitMuted}\n loadingFallback={isActive ? livekitPlayerProps?.loadingFallback : null}\n errorFallback={isActive ? livekitPlayerProps?.errorFallback : null}\n style={{ ...mediaStyle, ...(livekitPlayerProps?.style ?? {}) }}\n />\n );\n }\n\n if (source.source.asset_type === \"image\") {\n const imageUrl = getPlaybackUrl(source.playback);\n if (!imageUrl) return null;\n return (\n <img\n src={imageUrl}\n alt=\"\"\n {...imageProps}\n style={{ ...mediaStyle, ...(imageProps?.style ?? {}) }}\n />\n );\n }\n\n const playbackUrl = getPlaybackUrl(source.playback);\n if (!playbackUrl) return null;\n\n const videoStyle = { ...mediaStyle, ...(videoProps?.style ?? {}) };\n const mergedVideoProps = {\n ...videoProps,\n muted: shouldMute || Boolean(videoProps?.muted),\n onEnded: isActive\n ? createAutoTakeOnEndedHandler(\n runtime,\n slotSourceId,\n track.track_id,\n videoProps?.onEnded\n )\n : undefined\n };\n\n const shouldPause = !isActive;\n if (isM3u8Url(playbackUrl)) {\n return (\n <IVIHlsVideo\n url={playbackUrl}\n videoProps={mergedVideoProps}\n style={videoStyle}\n paused={shouldPause}\n />\n );\n }\n if (isFlvUrl(playbackUrl)) {\n return (\n <IVIFlvVideo\n url={playbackUrl}\n videoProps={{\n ...mergedVideoProps,\n controls: isActive ? (videoProps?.controls ?? true) : false\n }}\n style={videoStyle}\n paused={shouldPause}\n />\n );\n }\n return (\n <SlotVideo\n src={playbackUrl}\n paused={shouldPause}\n videoProps={{\n ...mergedVideoProps,\n autoPlay: videoProps?.autoPlay ?? true,\n playsInline: videoProps?.playsInline ?? true,\n controls: isActive ? (videoProps?.controls ?? true) : false\n }}\n style={videoStyle}\n />\n );\n}\n\nfunction buildAdaptiveMediaStyle(\n adaptToSourceSize: boolean,\n fitStrategy: IVITrackSlotProps[\"fitStrategy\"]\n): CSSProperties {\n const objectFitStyle: CSSProperties =\n fitStrategy === \"auto\"\n ? {}\n : {\n objectFit: fitStrategy ?? \"contain\"\n };\n if (!adaptToSourceSize) {\n return objectFitStyle;\n }\n return {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n ...objectFitStyle\n };\n}\n\nfunction getPlaybackType(playback: IviSourcePlayback): string | undefined {\n const type = playback.type;\n return typeof type === \"string\" ? type : undefined;\n}\n\nexport function getPlaybackUrl(playback: IviSourcePlayback): string | undefined {\n const url = playback.url;\n return typeof url === \"string\" ? url : undefined;\n}\n\nfunction getTrtcPlayback(playback: IviSourcePlayback): IviSourcePlaybackTrtc | null {\n const trtc = playback.trtc;\n if (typeof trtc !== \"object\" || trtc === null) {\n return null;\n }\n return trtc as IviSourcePlaybackTrtc;\n}\n\nfunction createAutoTakeOnEndedHandler(\n runtime: IviRuntimeCoordinator | null,\n sourceId: string,\n trackId: string,\n userOnEnded?: VideoHTMLAttributes<HTMLVideoElement>[\"onEnded\"]\n): (event: SyntheticEvent<HTMLVideoElement, Event>) => void {\n return (event) => {\n runtime?.sendSessionSourcePlaybackCompleted(sourceId, trackId);\n userOnEnded?.(event);\n };\n}\n\nfunction SlotVideo(props: {\n src: string;\n paused: boolean;\n videoProps: VideoHTMLAttributes<HTMLVideoElement>;\n style?: CSSProperties;\n}): ReactNode {\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n if (props.paused) {\n video.pause();\n } else {\n video.play().catch(() => undefined);\n }\n }, [props.paused]);\n\n return (\n <video\n ref={videoRef}\n src={props.src}\n {...props.videoProps}\n autoPlay={props.paused ? false : (props.videoProps.autoPlay ?? true)}\n style={props.style}\n />\n );\n}\n\n","import { useMemo } from \"react\";\nimport type { IviRuntimeSource } from \"../../runtime/types\";\nimport { toReadyRuntimeSource, type IviReadyRuntimeSource } from \"./track-slot-media\";\n\nexport interface PreloadSourceEntry {\n sourceId: string;\n source: IviReadyRuntimeSource;\n isActive: boolean;\n}\n\n/**\n * 多重预加载调度:收集 Runtime 中所有需要被挂载的 Source。\n * 挂载条件:`source.preload` 已被设置(显式事件或 SDK 内部合成) 或 当前为 active source。\n * 列表保持 Map 插入顺序(即 source 创建顺序),配合 sourceId 作为 React key\n * 保证单个 Source 的 DOM 不会因其他 Source 的增删/状态变化而被重建。\n */\nexport function useMultiPreloadSources(\n sources: Map<string, IviRuntimeSource>,\n activeSourceId: string | null\n): PreloadSourceEntry[] {\n return useMemo(() => {\n const entries: PreloadSourceEntry[] = [];\n for (const [id, runtimeSource] of sources) {\n const isActive = id === activeSourceId;\n const shouldMount = Boolean(runtimeSource.preload) || isActive;\n if (!shouldMount) {\n continue;\n }\n const ready = toReadyRuntimeSource(runtimeSource);\n if (!ready) {\n continue;\n }\n entries.push({\n sourceId: id,\n source: ready,\n isActive\n });\n }\n return entries;\n }, [sources, activeSourceId]);\n}\n","import {\n useCallback,\n useRef,\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type VideoHTMLAttributes\n} from \"react\";\nimport type { IviTrack } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviRuntimeLogCallback, IviRuntimeLogEntry, IviRuntimeSource } from \"../runtime/types\";\nimport type { IVITrtcPlayerProps } from \"./ivi-trtc-player\";\nimport type { IVILivekitPlayerProps } from \"./ivi-livekit-player\";\nimport {\n IVIVolumeControl,\n useVolumeMemory,\n useApplyVolumeToSlot,\n type IVIVolumeControlProps\n} from \"./ivi-volume-control\";\nimport {\n IVISubtitleOverlay,\n type IVISubtitleOverlayProps\n} from \"./ivi-subtitle-overlay\";\nimport { useIviStageView } from \"./use-ivi-stage-view\";\nimport { useMultiPreloadSources } from \"./internal/use-multi-preload-sources\";\nimport {\n detectMediaVolumeType,\n supportsSubtitleOverlay,\n TrackSlotMediaContent\n} from \"./internal/track-slot-media\";\n\nexport interface IviTrackSlotRenderContext {\n slot: string;\n track: IviTrack;\n source: IviRuntimeSource;\n /** 当前正在 standby 槽位预加载(不可见、已静音) */\n isPreloading?: boolean;\n}\n\nexport interface IVITrackSlotProps {\n slot?: string;\n trackId?: string;\n className?: string;\n style?: CSSProperties;\n emptyFallback?: ReactNode;\n renderTrtc?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderLivekit?: (context: IviTrackSlotRenderContext) => ReactNode;\n renderMedia?: (context: IviTrackSlotRenderContext) => ReactNode;\n videoProps?: Omit<VideoHTMLAttributes<HTMLVideoElement>, \"src\">;\n imageProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">;\n adaptToSourceSize?: boolean;\n fitStrategy?: \"contain\" | \"cover\" | \"auto\";\n trtcPlayerProps?: Omit<IVITrtcPlayerProps, \"trtc\" | \"sourceId\" | \"runtime\">;\n livekitPlayerProps?: Omit<IVILivekitPlayerProps, \"livekit\" | \"sourceId\" | \"runtime\">;\n /** 是否显示音量控制浮层(仅在播放音视频媒体时生效,图片无音量) */\n showVolumeControl?: boolean;\n /** 音量控制组件的自定义配置(图标、颜色、样式等) */\n volumeControlProps?: Omit<IVIVolumeControlProps, \"volume\" | \"onVolumeChange\">;\n /** 是否显示字幕浮层(仅在支持字幕的播放源上生效) */\n showSubtitle?: boolean;\n /** 字幕组件的自定义配置(角色、最大条数、字体、颜色等) */\n subtitleProps?: Omit<IVISubtitleOverlayProps, \"runtime\">;\n /** TrackSlot 内部媒体链路日志回调;未传入时不输出日志。 */\n onLog?: IviRuntimeLogCallback;\n}\n\n/**\n * Track 窗口组件:基于多重预加载策略渲染所有 ready 的 Source。\n * 每个 ready 且拥有合法 playback 的 Source 都会挂载为不可见元素提前预加载,\n * active Source 通过 CSS 可见性切换显示,切换时无 DOM 重建。\n * 每个 Source 以 sourceId 为 React key,保证增删其他 Source 不影响已有预加载。\n */\nexport function IVITrackSlot(props: IVITrackSlotProps): ReactNode {\n const {\n slot,\n trackId,\n className,\n style,\n emptyFallback = null,\n renderTrtc,\n renderLivekit,\n renderMedia,\n videoProps,\n imageProps,\n adaptToSourceSize = true,\n fitStrategy = \"contain\",\n trtcPlayerProps,\n livekitPlayerProps,\n showVolumeControl,\n volumeControlProps,\n showSubtitle,\n subtitleProps,\n onLog\n } = props;\n const context = useIviStageView();\n const fallbackLogCallback = useCallback(\n (entry: IviRuntimeLogEntry) => context.runtime?.emitLog(entry),\n [context.runtime]\n );\n const mediaLogCallback = onLog ?? fallbackLogCallback;\n const containerRef = useRef<HTMLDivElement>(null);\n\n const resolvedTrackId = trackId ?? (slot ? context.slotTrackMap.get(slot) : undefined);\n const track = resolvedTrackId ? context.state.tracks.get(resolvedTrackId) : undefined;\n const activeSourceId = track?.active_source_id ?? null;\n\n const preloadEntries = useMultiPreloadSources(context.state.sources, activeSourceId);\n\n const activeEntry = preloadEntries.find(e => e.isActive) ?? null;\n const activeSource = activeEntry?.source ?? null;\n const mediaType = detectMediaVolumeType(activeSource);\n const [volume, setVolume] = useVolumeMemory(showVolumeControl ? mediaType : null);\n useApplyVolumeToSlot(containerRef, volume, !!showVolumeControl && mediaType !== null, activeSourceId);\n\n if (!resolvedTrackId || !track) {\n return (\n <div className={className} style={style}>\n {emptyFallback}\n </div>\n );\n }\n\n const slotContainerStyle: CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n ...(style ?? {})\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={slotContainerStyle}\n data-ivi-slot={slot}\n data-ivi-track-id={track.track_id}\n >\n {!activeSource && emptyFallback}\n {preloadEntries.map(entry => {\n const isActive = entry.isActive;\n return (\n <div\n key={entry.sourceId}\n style={isActive ? ACTIVE_SLOT_STYLE : STANDBY_SLOT_STYLE}\n data-ivi-source-id={entry.sourceId}\n data-ivi-slot-role={isActive ? \"active\" : \"standby\"}\n >\n <div style={SLOT_CONTENT_STYLE}>\n <TrackSlotMediaContent\n slot={slot}\n track={track}\n source={entry.source}\n slotSourceId={entry.sourceId}\n isActive={isActive}\n runtime={context.runtime}\n renderTrtc={renderTrtc}\n renderLivekit={renderLivekit}\n renderMedia={renderMedia}\n imageProps={imageProps}\n videoProps={videoProps}\n trtcPlayerProps={trtcPlayerProps}\n livekitPlayerProps={livekitPlayerProps}\n adaptToSourceSize={adaptToSourceSize}\n fitStrategy={fitStrategy}\n onLog={mediaLogCallback}\n />\n </div>\n </div>\n );\n })}\n {showSubtitle && activeSource && supportsSubtitleOverlay(activeSource) && (\n <div style={SUBTITLE_OVERLAY_STYLE}>\n <IVISubtitleOverlay\n runtime={context.runtime}\n {...subtitleProps}\n />\n </div>\n )}\n {showVolumeControl && mediaType !== null && (\n <div style={VOLUME_OVERLAY_STYLE}>\n <IVIVolumeControl\n volume={volume}\n onVolumeChange={setVolume}\n {...volumeControlProps}\n />\n </div>\n )}\n </div>\n );\n}\n\nconst PHYSICAL_SLOT_BASE: CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\"\n};\n\nconst ACTIVE_SLOT_STYLE: CSSProperties = {\n ...PHYSICAL_SLOT_BASE,\n visibility: \"visible\",\n zIndex: 1\n};\n\nconst STANDBY_SLOT_STYLE: CSSProperties = {\n ...PHYSICAL_SLOT_BASE,\n visibility: \"hidden\",\n zIndex: 0,\n pointerEvents: \"none\"\n};\n\nconst SLOT_CONTENT_STYLE: CSSProperties = {\n width: \"100%\",\n height: \"100%\"\n};\n\nconst SUBTITLE_OVERLAY_STYLE: CSSProperties = {\n position: \"absolute\",\n bottom: 48,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 10,\n maxWidth: \"90%\",\n pointerEvents: \"none\"\n};\n\nconst VOLUME_OVERLAY_STYLE: CSSProperties = {\n position: \"absolute\",\n bottom: 12,\n right: 12,\n zIndex: 10,\n pointerEvents: \"auto\"\n};\n\n","import { useEffect, useMemo } from \"react\";\nimport { IviClient } from \"@vivix-ai/ivi-sdk-ts\";\nimport type { IviClientLogEntry } from \"@vivix-ai/ivi-sdk-ts/client\";\nimport { IviRuntimeCoordinator } from \"../runtime/runtime-coordinator\";\nimport type { IviRuntimeCoordinatorConfig, IviRuntimeLogEntry } from \"../runtime/types\";\nimport type { IviFrontendClientConfig } from \"../sdk\";\n\nexport type IviManagedRuntimeLogLevel = \"info\" | \"warn\" | \"error\";\nexport type IviManagedRuntimeLogSource = \"client\" | \"runtime\";\n\nexport interface IviManagedRuntimeLogEntry {\n level: IviManagedRuntimeLogLevel;\n source: IviManagedRuntimeLogSource;\n tag: string;\n message: string;\n args: unknown[];\n data?: unknown;\n clientLog?: IviClientLogEntry;\n runtimeLog?: IviRuntimeLogEntry;\n}\n\nexport type IviManagedRuntimeLogCallback = (entry: IviManagedRuntimeLogEntry) => void;\n\nexport interface IviManagedRuntimeConfig {\n clientConfig: Partial<IviFrontendClientConfig>;\n autoStart?: boolean;\n runtimeConfig?: IviRuntimeCoordinatorConfig;\n onRuntimeInitError?: (error: unknown) => void;\n /**\n * 统一收集 SDK 内部带 IVI 标记的日志。\n *\n * - IviClient 的 onLog 会被转换为 `[IVI-SEND]`、`[IVI-TRANSPORT]`、`[IVI-RECONNECT]`\n * - runtime / TRTC / LiveKit 等日志会通过 runtime onLog 回调上报,不会通过 patch console 收集\n */\n onLog?: IviManagedRuntimeLogCallback;\n}\n\nexport function useManagedIviRuntime(config: IviManagedRuntimeConfig): IviRuntimeCoordinator | null {\n const {\n clientConfig,\n autoStart = true,\n runtimeConfig,\n onRuntimeInitError,\n onLog\n } = config;\n\n const runtime = useMemo(() => {\n if (typeof window === \"undefined\") {\n return null;\n }\n if (!clientConfig.transport) {\n return null;\n }\n const mergedClientConfig: IviFrontendClientConfig = {\n ...clientConfig,\n transport: clientConfig.transport,\n onLog: (entry) => {\n onLog?.(normalizeClientLogEntry(entry));\n clientConfig.onLog?.(entry);\n }\n };\n const client = new IviClient(mergedClientConfig);\n const mergedRuntimeConfig: IviRuntimeCoordinatorConfig = {\n ...runtimeConfig,\n onLog: (entry) => {\n onLog?.(normalizeRuntimeLogEntry(entry));\n runtimeConfig?.onLog?.(entry);\n }\n };\n return new IviRuntimeCoordinator(client, mergedRuntimeConfig);\n }, [clientConfig, runtimeConfig, onLog]);\n\n useEffect(() => {\n if (!autoStart || !runtime) {\n return;\n }\n let disposed = false;\n runtime.start().catch((error) => {\n if (disposed) {\n return;\n }\n if (onRuntimeInitError) {\n onRuntimeInitError(error);\n return;\n }\n throw error;\n });\n return () => {\n disposed = true;\n runtime.stop();\n };\n }, [autoStart, runtime, onRuntimeInitError]);\n\n return runtime;\n}\n\nfunction normalizeClientLogEntry(entry: IviClientLogEntry): IviManagedRuntimeLogEntry {\n const tag = getClientLogTag(entry.category);\n return {\n level: entry.level === \"warn\" || entry.level === \"error\" ? entry.level : \"info\",\n source: \"client\",\n tag,\n message: `${tag} ${entry.message}`,\n args: entry.data === undefined ? [`${tag} ${entry.message}`] : [`${tag} ${entry.message}`, entry.data],\n data: entry.data,\n clientLog: entry\n };\n}\n\nfunction normalizeRuntimeLogEntry(entry: IviRuntimeLogEntry): IviManagedRuntimeLogEntry {\n return {\n level: entry.level,\n source: \"runtime\",\n tag: entry.tag,\n message: entry.message,\n args: entry.args,\n data: entry.data,\n runtimeLog: entry\n };\n}\n\nfunction getClientLogTag(category: IviClientLogEntry[\"category\"]): string {\n if (category === \"send\") return \"[IVI-SEND]\";\n if (category === \"transport\") return \"[IVI-TRANSPORT]\";\n if (category === \"reconnect\") return \"[IVI-RECONNECT]\";\n return \"[IVI-CLIENT]\";\n}\n"]}