@xmaxai/sdk 0.1.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/drag/remote-view-host.ts","../src/shared/ref-image.ts","../src/realtime/initial-state.ts","../src/realtime/prewarm.ts","../src/realtime/session.ts","../src/realtime/create-client.ts","../src/drag/drag-video-sync.ts"],"names":["options","overlay","drawable","videoHost"],"mappings":"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","file":"chunk-74ZZWUPI.js","sourcesContent":["export type RemoteViewHost = {\n wrapper: HTMLElement\n videoHost: HTMLElement\n dragHost: HTMLElement\n}\n\nexport function createRemoteViewHost(wrapper: HTMLElement): RemoteViewHost {\n const computed = getComputedStyle(wrapper)\n if (computed.position === 'static') {\n wrapper.style.position = 'relative'\n }\n\n const videoHost = document.createElement('div')\n videoHost.dataset.XmaxRemoteVideo = 'true'\n videoHost.style.cssText =\n 'position:relative;z-index:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;'\n\n const dragHost = document.createElement('div')\n dragHost.dataset.XmaxDragSurface = 'true'\n dragHost.style.cssText =\n 'position:absolute;inset:0;z-index:20;touch-action:none;'\n\n wrapper.replaceChildren()\n wrapper.appendChild(videoHost)\n wrapper.appendChild(dragHost)\n\n return { wrapper, videoHost, dragHost }\n}\n","import type { XmaxOpenClient } from '../sdk/client'\n\nexport async function resolveRefImageUrl(\n client: XmaxOpenClient,\n input: File | string,\n): Promise<string> {\n if (input instanceof File) {\n return (await client.uploadImage(input)).url\n }\n\n const raw = input.trim()\n if (!raw) {\n return ''\n }\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw\n }\n\n const res = await fetch(raw)\n if (!res.ok) {\n throw new Error(`Failed to load ref image: ${res.status}`)\n }\n\n const blob = await res.blob()\n const mime = blob.type || 'image/png'\n const ext =\n mime === 'image/jpeg' ? 'jpg' :\n mime === 'image/webp' ? 'webp' :\n mime === 'image/gif' ? 'gif' :\n 'png'\n const file = new File([blob], `ref.${ext}`, { type: mime })\n return (await client.uploadImage(file)).url\n}\n","import type { RealtimeInitialState } from './types'\n\n/** Internal RTC start `params.model` placeholder when the host omits it. */\nexport const DEFAULT_RTC_START_MODEL = 'default'\n\nexport function resolveGenerationModel(model?: string | null): string {\n const trimmed = model?.trim()\n return trimmed || DEFAULT_RTC_START_MODEL\n}\n\nexport function resolvePromptText(prompt: RealtimeInitialState['prompt']): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nexport function resolveInitialRefImage(initialState?: RealtimeInitialState): string | undefined {\n if (!initialState) {\n return undefined\n }\n if (typeof initialState.refImage === 'string' && initialState.refImage.trim()) {\n return initialState.refImage.trim()\n }\n if (typeof initialState.image === 'string' && initialState.image.trim()) {\n return initialState.image.trim()\n }\n return undefined\n}\n\nexport function shouldAutoStartOnConnect(initialState?: RealtimeInitialState): boolean {\n return initialState?.autoStart === true\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createSDKI18n } from '../i18n'\nimport type { RealtimeModel, XmaxClientOptions } from './types'\n\nexport type PrewarmedRoomResources = {\n client: XmaxOpenClient\n rtc: RtcManager\n sessionUid: string\n}\n\n/** Holds a joined RTC room before camera input is attached — iOS enterRoom-at-launch equivalent. */\nexport class RealtimePrewarmHandle {\n readonly modelName: string\n\n private consumed = false\n private disposed = false\n\n private constructor(\n readonly client: XmaxOpenClient,\n readonly rtc: RtcManager,\n readonly sessionUid: string,\n modelName: string,\n ) {\n this.modelName = modelName\n }\n\n static async create(\n model: RealtimeModel,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimePrewarmHandle> {\n const modelName = model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n const sdkI18n = createSDKI18n({})\n const client = new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: clientOptions.onError,\n })\n\n const rtc = new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const createdSession = await client.createSession(modelName)\n const sessionUid = createdSession.sessionUid?.trim()\n if (!sessionUid) {\n throw new Error('Session uid is missing')\n }\n\n const joinInfo = client.getRtcJoinInfo(createdSession)\n await rtc.join(joinInfo)\n\n const handle = new RealtimePrewarmHandle(client, rtc, sessionUid, modelName)\n\n client.startHeartbeat(\n sessionUid,\n clientOptions.heartbeatIntervalMs ?? 10_000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void handle.cancel()\n }\n },\n () => {\n void handle.cancel()\n },\n )\n\n return handle\n }\n\n consume(expectedModelName: string): PrewarmedRoomResources | null {\n const normalized = expectedModelName.trim()\n if (this.consumed || this.disposed || !normalized || this.modelName !== normalized) {\n return null\n }\n\n this.consumed = true\n return {\n client: this.client,\n rtc: this.rtc,\n sessionUid: this.sessionUid,\n }\n }\n\n async cancel(): Promise<void> {\n if (this.consumed || this.disposed) {\n return\n }\n\n this.disposed = true\n this.client.beginTeardown()\n try {\n await this.client.closeSession(this.sessionUid)\n } catch {\n }\n try {\n await this.rtc.leave()\n } catch {\n }\n this.client.endTeardown()\n }\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { createDragTrackController, type DragTrackController } from '../drag/drag-track-controller'\nimport { createRemoteViewHost, type RemoteViewHost } from '../drag/remote-view-host'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError } from '../shared/error-utils'\nimport { resolveRefImageUrl } from '../shared/ref-image'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport {\n resolveInitialRefImage,\n resolveGenerationModel,\n resolvePromptText,\n shouldAutoStartOnConnect,\n} from './initial-state'\nimport { shouldMirrorInput } from './mirror'\nimport { resolveRtcPublishFps } from '../rtc/publish-fps'\nimport { RealtimePrewarmHandle, type PrewarmedRoomResources } from './prewarm'\nimport type {\n RealtimeConnectOptions,\n RealtimeDisconnectOptions,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nfunction resolvePromptInput(prompt?: string | RealtimePromptState): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nfunction resolveRefImagePath(refImage?: string | null): string | undefined {\n const trimmed = refImage?.trim()\n return trimmed || undefined\n}\n\nfunction getVideoTrack(stream: MediaStream): MediaStreamTrack {\n const track = stream.getVideoTracks()[0]\n if (!track) {\n throw new Error('Missing video track in MediaStream')\n }\n return track\n}\n\nfunction readVideoSize(track: MediaStreamTrack): { width: number; height: number } | null {\n const settings = track.getSettings?.()\n if (typeof settings?.width === 'number' && settings.width > 0 &&\n typeof settings?.height === 'number' && settings.height > 0) {\n return { width: settings.width, height: settings.height }\n }\n return null\n}\n\nexport class RealtimeSession implements XmaxRealtimeSession {\n private readonly client: XmaxOpenClient\n private readonly rtc: RtcManager\n private readonly reportError: (error: unknown, fallbackMessage?: string) => never\n private readonly remoteElement: HTMLElement | null\n private readonly onRemoteStream?: (stream: MediaStream) => void\n private readonly onPublishPipelineWaitChange?: (waiting: boolean) => void\n\n private sessionUid: string | null = null\n private taskUid: string | null = null\n private localVideoSize: { width: number; height: number } | null = null\n private currentPrompt = ''\n private currentGenerationModel = ''\n private currentStaticGenerate: boolean | undefined = undefined\n private disconnected = false\n private remoteViewHost: RemoteViewHost | null = null\n private dragController: DragTrackController | null = null\n private dragTrackFitMode: 'contain' | 'cover' = 'cover'\n private sessionTargetSize: [number, number] | null = null\n private sessionSizeOverride: [number, number] | undefined\n private mirroredInputStream: NativeCameraStream | null = null\n private hiddenRemoteElement: HTMLElement | null = null\n private remoteStreamNotifyTimer: ReturnType<typeof setInterval> | null = null\n private lastNotifiedRemoteStream: MediaStream | null = null\n private dragOption: boolean | undefined = undefined\n\n constructor(\n client: XmaxOpenClient,\n rtc: RtcManager,\n reportError: (error: unknown, fallbackMessage?: string) => never,\n options: Pick<RealtimeConnectOptions, 'remoteElement' | 'onRemoteStream' | 'drag'>,\n clientOptions?: Pick<XmaxClientOptions, 'onPublishPipelineWaitChange'>,\n ) {\n this.client = client\n this.rtc = rtc\n this.reportError = reportError\n this.onRemoteStream = options.onRemoteStream\n this.onPublishPipelineWaitChange = clientOptions?.onPublishPipelineWaitChange\n\n if (options.remoteElement) {\n this.remoteElement = options.remoteElement\n if (options.drag !== false) {\n this.remoteViewHost = createRemoteViewHost(this.remoteElement)\n }\n return\n }\n\n if (options.onRemoteStream) {\n const hidden = document.createElement('div')\n hidden.setAttribute('data-Xmax-remote-host', 'true')\n hidden.style.cssText =\n 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden'\n document.body.appendChild(hidden)\n this.hiddenRemoteElement = hidden\n this.remoteElement = hidden\n this.remoteViewHost = createRemoteViewHost(hidden)\n this.rtc.setOnRemotePlayerMounted(() => {\n this.scheduleNotifyRemoteStream()\n })\n return\n }\n\n this.remoteElement = null\n }\n\n private get remoteVideoContainer(): HTMLElement | null {\n return this.remoteViewHost?.videoHost ?? this.remoteElement\n }\n\n static async connect(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimeSession> {\n const sdkI18n = createSDKI18n({})\n const notifyUserError = clientOptions.onError\n const reportError = (error: unknown, fallbackMessage?: string): never => {\n throw notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }\n\n const modelName = options.model.name.trim()\n const prewarmed = options.prewarmed instanceof RealtimePrewarmHandle\n ? options.prewarmed.consume(modelName)\n : null\n\n const client = prewarmed?.client ?? new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: notifyUserError,\n })\n\n const rtc = prewarmed?.rtc ?? new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const session = new RealtimeSession(client, rtc, reportError, options, clientOptions)\n\n try {\n await session.bootstrap(stream, options, clientOptions.heartbeatIntervalMs ?? 10_000, prewarmed)\n return session\n } catch (error) {\n await session.safeDisconnect()\n throw reportError(error)\n }\n }\n\n private async bootstrap(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n heartbeatIntervalMs: number,\n prewarmed: PrewarmedRoomResources | null = null,\n ): Promise<void> {\n this.dragOption = options.drag\n\n const modelName = options.model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n if (prewarmed) {\n this.sessionUid = prewarmed.sessionUid\n } else {\n const createdSession = await this.client.createSession(modelName)\n if (!createdSession.sessionUid?.trim()) {\n throw new Error('Session uid is missing')\n }\n\n this.sessionUid = createdSession.sessionUid\n this.client.startHeartbeat(\n createdSession.sessionUid,\n heartbeatIntervalMs,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void this.safeDisconnect()\n }\n },\n () => {\n void this.safeDisconnect()\n },\n )\n\n const joinInfo = this.client.getRtcJoinInfo(createdSession)\n await this.rtc.join(joinInfo)\n }\n\n if (options.localElement) {\n this.rtc.setLocalVideoContainer(options.localElement)\n }\n\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n this.sessionSizeOverride = options.size\n\n const videoTrack = getVideoTrack(stream)\n const isFileInput = options.inputKind === 'file'\n this.dragTrackFitMode = isFileInput ? 'contain' : 'cover'\n const rawVideoSize = readVideoSize(videoTrack)\n const publishSize: [number, number] = options.size\n ?? (rawVideoSize\n ? resolveUploadVideoSize(rawVideoSize.width, rawVideoSize.height)\n : DEFAULT_SESSION_TARGET_SIZE)\n\n let publishTrack = videoTrack\n if (isFileInput) {\n if (options.size) {\n this.localVideoSize = { width: options.size[0], height: options.size[1] }\n } else if (rawVideoSize) {\n this.localVideoSize = { width: rawVideoSize.width, height: rawVideoSize.height }\n } else {\n this.localVideoSize = null\n }\n } else if (options.prebuiltCameraStream) {\n this.mirroredInputStream = options.prebuiltCameraStream\n publishTrack = options.prebuiltCameraStream.videoTrack\n this.localVideoSize = {\n width: options.prebuiltCameraStream.width,\n height: options.prebuiltCameraStream.height,\n }\n } else {\n const processedStream = await createNativeCameraStream(stream)\n this.mirroredInputStream = processedStream\n publishTrack = processedStream.videoTrack\n this.localVideoSize = { width: processedStream.width, height: processedStream.height }\n }\n\n const initialState = options.initialState\n this.currentPrompt = resolvePromptText(initialState?.prompt)\n this.currentGenerationModel = resolveGenerationModel(initialState?.model)\n this.currentStaticGenerate = initialState?.staticGenerate\n\n const publishFpsOptions = {\n mobile: options.mobile,\n highQuality: true as const,\n fps: isFileInput\n ? options.model.fps\n : resolveRtcPublishFps({ mobile: options.mobile }),\n }\n\n // Publish before ref upload so RTC outbound warms while ref image uploads.\n await this.rtc.startExternalVideoPublishing(publishTrack, publishSize, publishFpsOptions)\n\n let initialRefImageUrl: string | undefined\n const initialRefImage = resolveInitialRefImage(initialState)\n if (initialRefImage) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialRefImage)\n } else if (initialState?.image instanceof File) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialState.image)\n } else if (initialState?.image instanceof Blob) {\n const mime = initialState.image.type || 'image/png'\n const file = new File([initialState.image], 'ref-image', { type: mime })\n initialRefImageUrl = await resolveRefImageUrl(this.client, file)\n }\n\n if (options.localElement) {\n queueMicrotask(() => this.refreshLocalPreview())\n }\n\n if (shouldAutoStartOnConnect(initialState)) {\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options.size,\n refImage: initialRefImageUrl,\n staticGenerate: this.currentStaticGenerate,\n })\n }\n }\n\n async setPrompt(\n prompt: string | RealtimePromptState,\n _options?: { enhance?: boolean },\n ): Promise<void> {\n try {\n const promptText = resolvePromptInput(prompt)\n this.currentPrompt = promptText\n if (!this.taskUid) {\n await this.runStart({\n prompt: promptText || undefined,\n })\n return\n }\n await this.restart({ prompt: promptText })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async set(input: RealtimeSetInput): Promise<void> {\n try {\n let refImage: string | undefined\n if (input.image === null) {\n refImage = undefined\n } else if (input.image !== undefined) {\n refImage = await this.setRefImage(input.image as File | string)\n }\n\n const prompt = input.prompt !== undefined ? resolvePromptInput(input.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setImage(\n image: string | File | Blob,\n options?: RealtimeSetImageOptions,\n ): Promise<void> {\n try {\n const refImage = await this.setRefImage(image as File | string)\n const prompt = options?.prompt ? resolvePromptInput(options.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setRefImage(input: File | string): Promise<string> {\n try {\n const resolved = await resolveRefImageUrl(this.client, input)\n return resolved\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async restart(options?: RealtimeRestartOptions): Promise<void> {\n try {\n let resolvedRefImage: string | undefined\n if (options && 'refImage' in options) {\n const ref = options.refImage\n if (ref === null || ref === '') {\n resolvedRefImage = undefined\n } else if (typeof ref === 'string' && ref.trim()) {\n resolvedRefImage = await this.setRefImage(ref.trim())\n }\n }\n\n if (options?.prompt !== undefined) {\n this.currentPrompt = options.prompt.trim()\n }\n if (options?.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n if (options?.staticGenerate !== undefined) {\n this.currentStaticGenerate = options.staticGenerate\n }\n\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options?.size,\n refImage: resolvedRefImage,\n staticGenerate: this.currentStaticGenerate,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setMode(options?: RealtimeRestartOptions): Promise<void> {\n return this.restart(options)\n }\n\n async refreshRemoteOutput(options?: { force?: boolean }): Promise<void> {\n if (!this.remoteVideoContainer) {\n return\n }\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n await this.rtc.refreshRemoteVideoBinding(options)\n this.scheduleNotifyRemoteStream()\n }\n\n refreshLocalPreview(): void {\n this.rtc.refreshLocalVideoPreview()\n }\n\n getInputPreviewStream(): MediaStream | null {\n return this.mirroredInputStream?.previewStream ?? null\n }\n\n detachRemoteOutput(): void {\n this.rtc.setRemoteVideoContainer(null)\n }\n\n async sendTracks(tracks: Array<[number, number]>): Promise<void> {\n if (!this.rtc.snapshot.joined || !this.taskUid) {\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createTracksRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: this.taskUid,\n sessionUid: this.taskUid,\n tracks,\n }),\n )\n } catch {\n // Track sending is best-effort for live interaction.\n }\n }\n\n async stop(options?: { preserveRemoteDom?: boolean }): Promise<void> {\n this.updateDragController(false)\n\n const preserveRemoteDom = options?.preserveRemoteDom ?? false\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n if (!this.rtc.snapshot.joined) {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createStopRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n sessionUid: this.taskUid ?? undefined,\n }),\n )\n } finally {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n async disconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n if (this.disconnected) {\n return\n }\n this.disconnected = true\n await this.safeDisconnect(options)\n }\n\n getSessionUid(): string | null {\n return this.sessionUid\n }\n\n private async runStart(options: {\n prompt?: string\n model?: string\n size?: [number, number]\n refImage?: string\n staticGenerate?: boolean\n }): Promise<void> {\n if (!this.rtc.snapshot.joined) {\n return\n }\n\n const startPrompt = options.prompt?.trim() ?? this.currentPrompt\n if (options.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n if (options.staticGenerate !== undefined) {\n this.currentStaticGenerate = options.staticGenerate\n }\n\n const modelLabel = resolveGenerationModel(this.currentGenerationModel)\n\n await this.rtc.ensurePublishedInputBeforeStart()\n\n this.rtc.setRemoteVideoContainer(null)\n this.rtc.clearRemoteVideo()\n\n const size = resolveSessionTargetSize({\n localVideoSize: this.localVideoSize,\n overrideSize: options.size ?? this.sessionSizeOverride,\n })\n this.sessionTargetSize = size\n\n // console.log(`🚀 [RTC Start] Parameters:`, {\n // prompt: startPrompt,\n // refImage: options.refImage,\n // model: modelLabel,\n // size,\n // })\n\n const taskUid = createTaskUid()\n this.taskUid = taskUid\n\n this.rtc.configureSessionSei(taskUid)\n\n try {\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n const startRoomEvent = createStartRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: modelLabel,\n size,\n prompt: startPrompt,\n refImagePath: resolveRefImagePath(options.refImage),\n staticGenerate: this.currentStaticGenerate,\n })\n\n console.log('[Xmax SDK] 真实发送 start ->', startRoomEvent)\n\n await this.rtc.sendRoomEvent(startRoomEvent)\n\n await this.rtc.refreshRemoteVideoBinding({ force: true })\n this.updateDragController(true)\n this.scheduleNotifyRemoteStream()\n } catch (error) {\n this.rtc.configureSessionSei(null)\n throw error\n }\n }\n\n private isDragEnabled(): boolean {\n if (this.dragOption === false) {\n return false\n }\n if (this.dragOption === true) {\n return true\n }\n return Boolean(this.remoteElement && !this.hiddenRemoteElement)\n }\n\n private updateDragController(active: boolean): void {\n const dragHost = this.remoteViewHost?.dragHost\n if (!dragHost || !active || !this.taskUid || !this.isDragEnabled()) {\n this.dragController?.setEnabled(false)\n return\n }\n\n const targetSize = this.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\n if (!this.dragController) {\n this.dragController = createDragTrackController(dragHost, {\n targetSize,\n fitMode: this.dragTrackFitMode,\n mirrored: false,\n enabled: true,\n onTracks: (tracks) => {\n const media = this.remoteViewHost?.videoHost?.querySelector('video, canvas') as HTMLElement | null\n const mediaRect = media?.getBoundingClientRect()\n const dragRect = dragHost.getBoundingClientRect()\n console.log('[Xmax] sendTracks', {\n taskUid: this.taskUid,\n targetSize: this.sessionTargetSize,\n fitMode: this.dragTrackFitMode,\n tracks,\n dragRect: dragRect ? { w: dragRect.width, h: dragRect.height } : null,\n mediaRect: mediaRect ? { w: mediaRect.width, h: mediaRect.height, l: mediaRect.left, t: mediaRect.top } : null,\n })\n void this.sendTracks(tracks)\n },\n })\n return\n }\n\n this.dragController.setTargetSize(targetSize)\n this.dragController.setFitMode(this.dragTrackFitMode)\n this.dragController.setMirrored(false)\n this.dragController.setEnabled(true)\n }\n\n private scheduleNotifyRemoteStream(): void {\n if (!this.onRemoteStream) {\n return\n }\n\n this.clearRemoteStreamNotifyTimer()\n if (this.notifyRemoteStreamOnce()) {\n return\n }\n\n let attempts = 0\n this.remoteStreamNotifyTimer = setInterval(() => {\n attempts += 1\n if (this.notifyRemoteStreamOnce() || attempts >= 60) {\n this.clearRemoteStreamNotifyTimer()\n }\n }, 500)\n }\n\n private notifyRemoteStreamOnce(): boolean {\n const videoRoot = this.remoteVideoContainer\n if (!this.onRemoteStream || !videoRoot) {\n return false\n }\n\n const video = videoRoot instanceof HTMLVideoElement\n ? videoRoot\n : videoRoot.querySelector('video')\n\n if (!(video instanceof HTMLVideoElement) || !(video.srcObject instanceof MediaStream)) {\n return false\n }\n\n if (this.lastNotifiedRemoteStream === video.srcObject) {\n return true\n }\n\n this.lastNotifiedRemoteStream = video.srcObject\n this.onRemoteStream(video.srcObject)\n return true\n }\n\n private clearRemoteStreamNotifyTimer(): void {\n if (this.remoteStreamNotifyTimer !== null) {\n clearInterval(this.remoteStreamNotifyTimer)\n this.remoteStreamNotifyTimer = null\n }\n }\n\n private async safeDisconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n this.clearRemoteStreamNotifyTimer()\n this.lastNotifiedRemoteStream = null\n const activeSessionUid = this.sessionUid\n this.sessionUid = null\n\n this.client.beginTeardown()\n\n if (activeSessionUid) {\n try {\n await this.client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n const generationActive = !!this.taskUid && this.rtc.snapshot.joined\n try {\n if (generationActive) {\n await this.stop()\n } else {\n this.updateDragController(false)\n this.rtc.clearRemoteVideo()\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.stopVideoPublishing()\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.leave()\n }\n } catch {\n }\n\n this.client.endTeardown()\n\n this.taskUid = null\n this.currentPrompt = ''\n this.currentGenerationModel = ''\n this.currentStaticGenerate = undefined\n this.sessionTargetSize = null\n this.dragController?.destroy()\n this.dragController = null\n this.mirroredInputStream?.destroy()\n this.mirroredInputStream = null\n\n if (this.hiddenRemoteElement) {\n this.hiddenRemoteElement.remove()\n this.hiddenRemoteElement = null\n }\n }\n}\n","import { XMAX_OPEN_API_PRODUCTION_BASE_URL, XmaxOpenClient } from '../sdk/client'\nimport { RealtimeSession } from './session'\nimport { RealtimePrewarmHandle } from './prewarm'\nimport type { RealtimeConnectOptions, XmaxClient, XmaxClientOptions } from './types'\n\nfunction resolveClientOptions(options: XmaxClientOptions): Required<Pick<XmaxClientOptions, 'baseUrl'>> & XmaxClientOptions {\n return {\n ...options,\n baseUrl: options.baseUrl?.trim() || XMAX_OPEN_API_PRODUCTION_BASE_URL,\n }\n}\n\nexport function createXmaxClient(options: XmaxClientOptions): XmaxClient {\n const resolved = resolveClientOptions(options)\n const httpClient = new XmaxOpenClient({\n apiKey: resolved.apiKey,\n authToken: resolved.authToken,\n baseUrl: resolved.baseUrl,\n onError: resolved.onError,\n })\n\n return {\n files: {\n uploadImage: (file: File) => httpClient.uploadImage(file),\n uploadVideo: (file: File) => httpClient.uploadVideo(file),\n upload: (file: File) => httpClient.uploadImage(file),\n },\n realtime: {\n prewarm: (options: { model: RealtimeConnectOptions['model'] }) =>\n RealtimePrewarmHandle.create(options.model, resolved),\n connect: (stream: MediaStream, connectOptions: RealtimeConnectOptions) =>\n RealtimeSession.connect(stream, connectOptions, resolved),\n },\n }\n}\n\nexport type {\n RealtimeConnectOptions,\n RealtimeInitialState,\n RealtimeModel,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n RealtimeSetModeOptions,\n SeiGateState,\n XmaxClient,\n XmaxClientFiles,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nexport { models } from './models'\nexport { RealtimeSession } from './session'\nexport { RealtimePrewarmHandle } from './prewarm'\n","import { getFitContentRect, type ContentRect } from './map-viewport'\nimport type { RemoteViewHost } from './remote-view-host'\n\nexport const DRAG_SYNCED_ATTR = 'data-xmax-drag-synced'\n\nexport type DragVideoSyncOptions = {\n getTargetSize: () => [number, number]\n getFitMode: () => 'contain' | 'cover'\n onSync?: () => void\n}\n\nexport type RemoteDragLayout = {\n /** Drawable overlay aligned to the painted RTC media on screen. */\n overlay: ContentRect\n /** Pointer → session coordinate mapping bounds. */\n mapping: ContentRect\n /** Hit-test bounds inside the preview frame. */\n hitRect: ContentRect\n source: 'media' | 'intrinsic' | 'fit'\n}\n\nfunction toContentRect(rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>): ContentRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n}\n\nexport function isMediaInsetInContainer(\n mediaRect: Pick<DOMRect, 'width' | 'height'>,\n containerRect: Pick<DOMRect, 'width' | 'height'>,\n): boolean {\n if (!mediaRect.width || !mediaRect.height || !containerRect.width || !containerRect.height) {\n return false\n }\n const widthRatio = mediaRect.width / containerRect.width\n const heightRatio = mediaRect.height / containerRect.height\n return widthRatio < 0.98 || heightRatio < 0.98\n}\n\nexport function intersectContentRects(a: ContentRect, b: ContentRect): ContentRect {\n const left = Math.max(a.left, b.left)\n const top = Math.max(a.top, b.top)\n const right = Math.min(a.left + a.width, b.left + b.width)\n const bottom = Math.min(a.top + a.height, b.top + b.height)\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n }\n}\n\nexport function readMediaIntrinsicSize(\n media: HTMLVideoElement | HTMLCanvasElement,\n): [number, number] | null {\n const video = media as HTMLVideoElement\n if ('videoWidth' in video && video.videoWidth > 0 && video.videoHeight > 0) {\n return [video.videoWidth, video.videoHeight]\n }\n\n if (media.width > 0 && media.height > 0) {\n return [media.width, media.height]\n }\n return null\n}\n\nexport function resolveMediaObjectFit(\n media: HTMLElement,\n fallback: 'contain' | 'cover',\n): 'contain' | 'cover' | 'fill' {\n if (typeof getComputedStyle !== 'function') {\n return fallback\n }\n\n const fit = getComputedStyle(media).objectFit\n if (fit === 'contain' || fit === 'cover' || fit === 'fill') {\n return fit\n }\n return fallback\n}\n\nexport function resolveRemoteDragLayout(input: {\n wrapperRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n mediaRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n media: HTMLVideoElement | HTMLCanvasElement | null\n targetSize: [number, number]\n fitMode: 'contain' | 'cover'\n}): RemoteDragLayout | null {\n const { wrapperRect, mediaRect, media, targetSize, fitMode } = input\n if (!wrapperRect.width || !wrapperRect.height || !mediaRect.width || !mediaRect.height) {\n return null\n }\n\n const wrapper = toContentRect(wrapperRect)\n\n // Upload / RTC FIT: map linearly across the media layout box (h-full w-auto). Hit-test only\n // the visible portion inside the preview frame (wide images overflow horizontally).\n if (fitMode === 'contain') {\n const overlay = toContentRect(mediaRect)\n const hitRect = intersectContentRects(overlay, wrapper)\n const drawable = hitRect.width > 0 && hitRect.height > 0 ? hitRect : wrapper\n return { overlay: drawable, mapping: overlay, hitRect: drawable, source: 'media' }\n }\n\n if (isMediaInsetInContainer(mediaRect, wrapperRect)) {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: overlay, source: 'media' }\n }\n\n const intrinsic = media ? readMediaIntrinsicSize(media) : null\n const frameSize = intrinsic ?? targetSize\n const objectFit = media ? resolveMediaObjectFit(media, fitMode) : fitMode\n\n if (objectFit === 'fill') {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: wrapper, source: 'intrinsic' }\n }\n\n const mapping = getFitContentRect(mediaRect, frameSize, objectFit)\n const overlay = intersectContentRects(mapping, wrapper)\n const drawable = overlay.width > 0 && overlay.height > 0 ? overlay : wrapper\n return {\n overlay: drawable,\n mapping,\n hitRect: wrapper,\n source: intrinsic ? 'intrinsic' : 'fit',\n }\n}\n\nfunction resetDragHostFullBleed(dragHost: HTMLElement): void {\n dragHost.style.inset = '0'\n dragHost.style.left = ''\n dragHost.style.top = ''\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.style.width = ''\n dragHost.style.height = ''\n dragHost.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\n/** Align drag overlay to the painted RTC media region on screen. */\nexport function syncDragHostToVideo(\n host: RemoteViewHost,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const { wrapper, videoHost, dragHost } = host\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const mediaRect = media.getBoundingClientRect()\n const layout = resolveRemoteDragLayout({\n wrapperRect,\n mediaRect,\n media,\n targetSize,\n fitMode,\n })\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const { overlay } = layout\n dragHost.style.inset = 'auto'\n dragHost.style.left = `${overlay.left - wrapperRect.left}px`\n dragHost.style.top = `${overlay.top - wrapperRect.top}px`\n dragHost.style.width = `${overlay.width}px`\n dragHost.style.height = `${overlay.height}px`\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\nfunction resetDragSurfaceFullBleed(dragSurface: HTMLElement): void {\n dragSurface.style.inset = '0'\n dragSurface.style.left = ''\n dragSurface.style.top = ''\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.style.width = ''\n dragSurface.style.height = ''\n dragSurface.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\nfunction applyDragSurfaceOverlayStyles(\n dragSurface: HTMLElement,\n overlay: ContentRect,\n wrapperRect: Pick<DOMRect, 'left' | 'top'>,\n): boolean {\n const nextLeft = `${overlay.left - wrapperRect.left}px`\n const nextTop = `${overlay.top - wrapperRect.top}px`\n const nextWidth = `${overlay.width}px`\n const nextHeight = `${overlay.height}px`\n\n if (\n dragSurface.hasAttribute(DRAG_SYNCED_ATTR)\n && dragSurface.style.inset === 'auto'\n && dragSurface.style.left === nextLeft\n && dragSurface.style.top === nextTop\n && dragSurface.style.width === nextWidth\n && dragSurface.style.height === nextHeight\n ) {\n return false\n }\n\n dragSurface.style.inset = 'auto'\n dragSurface.style.left = nextLeft\n dragSurface.style.top = nextTop\n dragSurface.style.width = nextWidth\n dragSurface.style.height = nextHeight\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\n/** Align app-layer drag overlay to the painted RTC media region (xmax-open-sdk track surface). */\nexport function syncDragSurfaceToVideo(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const layout = resolveRemoteDragLayoutFromSurface(dragSurface, targetSize, fitMode)\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const { overlay } = layout\n return applyDragSurfaceOverlayStyles(dragSurface, overlay, wrapperRect)\n}\n\nexport function resolveRemoteDragLayoutFromSurface(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): RemoteDragLayout | null {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return null\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]') as HTMLElement | null\n if (!videoHost) {\n return null\n }\n\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n return null\n }\n\n return resolveRemoteDragLayout({\n wrapperRect: wrapper.getBoundingClientRect(),\n mediaRect: media.getBoundingClientRect(),\n media,\n targetSize,\n fitMode,\n })\n}\n\nexport function observeDragHostVideoSync(\n host: RemoteViewHost,\n options: DragVideoSyncOptions,\n): () => void {\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n\n const bindMediaListeners = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (!media || mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => apply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n syncDragHostToVideo(host, options.getTargetSize(), options.getFitMode())\n options.onSync?.()\n bindMediaListeners()\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => apply())\n : null\n resizeObserver?.observe(host.wrapper)\n resizeObserver?.observe(host.videoHost)\n\n const observeMedia = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n }\n }\n observeMedia()\n\n const mutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n apply()\n })\n : null\n mutationObserver?.observe(host.videoHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n\n const onWindowChange = () => apply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragHostFullBleed(host.dragHost)\n }\n}\n\n/** Keep an app-layer drag surface aligned with remote output video layout. */\nexport function observeDragSurfaceVideoSync(\n dragSurface: HTMLElement,\n options: DragVideoSyncOptions,\n): () => void {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return () => {}\n }\n\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n let rafId: number | null = null\n let observedVideoHost: Element | null = null\n\n const bindMediaListeners = (media: EventTarget) => {\n if (mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => scheduleApply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n const changed = syncDragSurfaceToVideo(dragSurface, options.getTargetSize(), options.getFitMode())\n if (changed) {\n options.onSync?.()\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n const media = videoHost?.querySelector('video, canvas')\n if (media) {\n bindMediaListeners(media)\n }\n }\n\n const scheduleApply = () => {\n if (rafId !== null) {\n return\n }\n rafId = requestAnimationFrame(() => {\n rafId = null\n apply()\n })\n }\n\n const bindVideoHostObserver = (videoHostObserver: MutationObserver | null) => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n if (!host || host === observedVideoHost || !videoHostObserver) {\n return\n }\n\n videoHostObserver.disconnect()\n observedVideoHost = host\n videoHostObserver.observe(host, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleApply())\n : null\n resizeObserver?.observe(wrapper)\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n if (videoHost) {\n resizeObserver?.observe(videoHost)\n }\n\n const observeMedia = () => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n const media = host?.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n bindMediaListeners(media)\n }\n }\n observeMedia()\n\n const videoHostMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n scheduleApply()\n })\n : null\n bindVideoHostObserver(videoHostMutationObserver)\n\n // Child-list only on wrapper — never watch dragSurface style (would loop with sync).\n const wrapperMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n bindVideoHostObserver(videoHostMutationObserver)\n observeMedia()\n scheduleApply()\n })\n : null\n wrapperMutationObserver?.observe(wrapper, {\n childList: true,\n subtree: true,\n })\n\n const onWindowChange = () => scheduleApply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n resizeObserver?.disconnect()\n wrapperMutationObserver?.disconnect()\n videoHostMutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragSurfaceFullBleed(dragSurface)\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/api-error-codes.ts","../src/i18n/en-US.ts","../src/i18n/zh-CN.ts","../src/i18n/index.ts","../src/rtc/video-frame-rate.ts","../src/rtc/publish-fps.ts","../src/shared/reference-video-size.ts","../src/rtc/capture-host.ts"],"names":["width","height"],"mappings":"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","file":"chunk-PLU2YVAS.js","sourcesContent":["import type { SDKLocale } from './index'\n\n/**\n * Open API business error codes (46xxx) mapped to user-facing messages.\n * Source: Open API v1 error code tables. Codes not listed here fall back to a\n * generic retry message (see `errors.requestRetry`).\n */\ntype LocalizedMessage = Record<SDKLocale, string>\n\n/** 46006–46010 are internal capacity/permission failures; surfaced as a single overload hint. */\nconst SYSTEM_OVERLOADED: LocalizedMessage = {\n 'zh-CN': '当前使用人数过多,请稍后再试',\n 'en-US': 'The system is currently overloaded. Please retry after some time.',\n}\n\nexport const API_ERROR_MESSAGES: Record<string, LocalizedMessage> = {\n '46001': { 'zh-CN': 'X-Api-Key 不能为空', 'en-US': 'X-Api-Key cannot be empty' },\n '46002': { 'zh-CN': '无效的用户 API Key', 'en-US': 'Invalid user API Key' },\n '46003': { 'zh-CN': 'model 不能为空', 'en-US': 'model cannot be empty' },\n '46004': { 'zh-CN': 'sessionUid 不能为空', 'en-US': 'sessionUid cannot be empty' },\n '46005': { 'zh-CN': '模型类型不存在', 'en-US': 'Model type does not exist' },\n '46006': SYSTEM_OVERLOADED,\n '46007': SYSTEM_OVERLOADED,\n '46008': SYSTEM_OVERLOADED,\n '46009': SYSTEM_OVERLOADED,\n '46010': SYSTEM_OVERLOADED,\n '46012': { 'zh-CN': '会话不存在', 'en-US': 'Session does not exist' },\n '46013': { 'zh-CN': '会话不属于当前用户', 'en-US': 'Session does not belong to the current user' },\n '46014': { 'zh-CN': '会话已关闭', 'en-US': 'Session has been closed' },\n '46015': { 'zh-CN': '会话已超时', 'en-US': 'Session has timed out' },\n '46018': { 'zh-CN': '临时 API Key 已过期', 'en-US': 'Temporary API Key has expired' },\n '46019': {\n 'zh-CN': '临时 API Key 已达到积分上限',\n 'en-US': 'Temporary API Key has reached its points limit',\n },\n '46021': {\n 'zh-CN': '临时 API Key 不允许再创建临时 API Key',\n 'en-US': 'A temporary API Key cannot create another temporary API Key',\n },\n \n}\n\n/** Resolve a business error code to a localized message, or `undefined` if unmapped. */\nexport function resolveApiErrorMessage(\n code: string | number | null | undefined,\n locale: SDKLocale,\n): string | undefined {\n if (code === null || code === undefined) return undefined\n const entry = API_ERROR_MESSAGES[String(code)]\n if (!entry) return undefined\n return entry[locale] ?? entry['en-US']\n}\n","export const enUS = {\n 'errors.apiKeyEmpty': 'apiKey cannot be empty',\n 'errors.baseUrlEmpty': 'baseUrl is required — pass XMAX_OPEN_API_PRODUCTION_BASE_URL for production',\n 'errors.modelEmpty': 'model cannot be empty',\n 'errors.invalidJson': 'Response is not valid JSON',\n 'errors.invalidPayload': 'Response payload is invalid',\n 'errors.requestFailed': 'Request failed',\n 'errors.requestRetry': 'Request failed. Please try again later.',\n 'errors.requestTimeout': 'Request timeout',\n 'errors.invalidFile': 'file must be a File',\n 'errors.invalidFileType': 'invalid file type: {type}',\n 'errors.sessionJoinInfoIncomplete': 'session does not contain complete RTC join info',\n 'errors.sessionUidMissing': 'session does not contain sessionUid',\n 'errors.refImageMissing': 'missing reference image',\n 'errors.captureStreamUnsupported': 'captureStream is not supported in this browser',\n 'errors.videoTrackMissing': 'failed to create video track from file',\n 'errors.imageTrackMissing': 'failed to create video track from image file',\n 'errors.imageLoadFailed': 'failed to load image — try again after selecting the file',\n 'errors.invalidMediaFileType': 'unsupported media file type: {type}',\n 'errors.videoPlaybackFailed': 'failed to start video playback — try again after selecting the file',\n 'errors.rtcNotJoined': 'Please join the RTC room first',\n 'errors.rtcNotJoinedForMessaging': 'Please join the RTC room before sending events',\n\n 'rtc.alreadyInRoom': 'RTC is already in the target room. Skip duplicate join.',\n 'rtc.joiningRoom': 'Joining RTC room',\n 'rtc.joinSuccess': 'RTC joinRoom succeeded',\n 'rtc.roomUsers': 'Current room users: {users}',\n 'rtc.localVideoAlreadyPublished': 'Local video is already published',\n 'rtc.localVideoPublished': 'Local video capture started and stream published',\n 'rtc.externalVideoPublished': 'External video stream published',\n 'rtc.localVideoStopped': 'Local video publishing stopped',\n 'rtc.leaveRoomError': 'Error occurred during RTC leaveRoom',\n 'rtc.engineDestroyed': 'RTC engine destroyed',\n 'rtc.roomEventSent': 'RTC event sent',\n 'rtc.remotePlayerRefreshed': 'Remote video player refreshed: {userId}',\n 'rtc.remotePlayerRefreshFailed': 'Failed to refresh remote video player',\n 'rtc.userJoined': 'User joined RTC room: {userId}',\n 'rtc.userLeft': 'User left RTC room: {userId}',\n 'rtc.connectionStateChanged': 'RTC connection state changed',\n 'rtc.userPublished': 'User published stream: {userId}',\n 'rtc.userUnpublished': 'User unpublished stream: {userId}',\n 'rtc.seiReceived': 'Remote SEI received: {userId}',\n 'rtc.error': 'RTC error: {code}',\n 'rtc.captureSizeSet': 'Local video capture size set: {width} x {height}',\n 'rtc.encoderPreferenceSet': 'Video encoder preference set to H.264',\n 'rtc.encoderPreferenceFailed': 'Failed to set video encoder preference',\n 'rtc.remoteWaitSei': 'Remote video is waiting for SEI gate: {userId}',\n 'rtc.remoteContainerNotReady': 'Remote video container is not ready. Skip binding.',\n 'rtc.remotePlayerBound': 'Remote video player bound: {userId}',\n 'rtc.remoteOutputStalled': 'Remote output stalled for 15s; attempting to recover generation',\n 'rtc.sendSeiFailed': 'Failed to send SEI. The browser or encoder config may not support it.',\n 'rtc.seiUnsupported': 'H.264 is not supported. SEI gate will be disabled and output will not be blocked.',\n 'rtc.seiGateFallback': 'SEI gate timed out — showing remote output',\n 'rtc.getCodecsFailed': 'Failed to get supported codecs. SEI gate will be disabled and output will not be blocked.',\n} as const\n","export const zhCN = {\n 'errors.apiKeyEmpty': 'apiKey 不能为空',\n 'errors.baseUrlEmpty': 'baseUrl 为必填项 — 生产环境请传入 XMAX_OPEN_API_PRODUCTION_BASE_URL',\n 'errors.modelEmpty': 'model 不能为空',\n 'errors.invalidJson': '响应不是有效的 JSON',\n 'errors.invalidPayload': '响应数据格式不正确',\n 'errors.requestFailed': '请求失败',\n 'errors.requestRetry': '请求失败,请稍后再试',\n 'errors.requestTimeout': '请求超时',\n 'errors.invalidFile': 'file 必须是 File 类型',\n 'errors.invalidFileType': '文件类型不正确:{type}',\n 'errors.sessionJoinInfoIncomplete': 'session 缺少完整的 RTC 进房信息',\n 'errors.sessionUidMissing': 'session 缺少 sessionUid',\n 'errors.refImageMissing': '缺少参考图',\n 'errors.captureStreamUnsupported': '当前浏览器不支持 captureStream',\n 'errors.videoTrackMissing': '未能从视频文件创建 video track',\n 'errors.imageTrackMissing': '未能从图片文件创建 video track',\n 'errors.imageLoadFailed': '图片无法加载,请重新选择文件后再试',\n 'errors.invalidMediaFileType': '不支持的媒体文件类型:{type}',\n 'errors.videoPlaybackFailed': '视频无法开始播放,请重新选择文件后再试',\n 'errors.rtcNotJoined': '请先成功加入 RTC 房间',\n 'errors.rtcNotJoinedForMessaging': '请先成功加入 RTC 房间后再发送事件',\n\n 'rtc.alreadyInRoom': 'RTC 已在目标房间中,跳过重复进房',\n 'rtc.joiningRoom': '准备加入 RTC 房间',\n 'rtc.joinSuccess': 'RTC joinRoom 成功',\n 'rtc.roomUsers': '当前房间用户: {users}',\n 'rtc.localVideoAlreadyPublished': '本地视频已处于发布状态',\n 'rtc.localVideoPublished': '已开启本地视频采集并发布视频流',\n 'rtc.externalVideoPublished': '已发布自定义视频流',\n 'rtc.localVideoStopped': '已停止本地视频发布',\n 'rtc.leaveRoomError': 'RTC leaveRoom 过程中出现异常',\n 'rtc.engineDestroyed': 'RTC 引擎已销毁',\n 'rtc.roomEventSent': '已发送 RTC 事件',\n 'rtc.remotePlayerRefreshed': '已刷新远端视频播放器: {userId}',\n 'rtc.remotePlayerRefreshFailed': '刷新远端视频播放器失败',\n 'rtc.userJoined': '用户加入 RTC 房间: {userId}',\n 'rtc.userLeft': '用户离开 RTC 房间: {userId}',\n 'rtc.connectionStateChanged': 'RTC 连接状态变化',\n 'rtc.userPublished': '用户发布流: {userId}',\n 'rtc.userUnpublished': '用户取消发布流: {userId}',\n 'rtc.seiReceived': '收到远端 SEI: {userId}',\n 'rtc.error': 'RTC 错误: {code}',\n 'rtc.captureSizeSet': '已设置本地视频采集尺寸: {width} x {height}',\n 'rtc.encoderPreferenceSet': '已设置视频编码偏好为 H.264',\n 'rtc.encoderPreferenceFailed': '设置视频编码偏好失败',\n 'rtc.remoteWaitSei': '远端视频等待 SEI 放行: {userId}',\n 'rtc.remoteContainerNotReady': '远端视频容器未就绪,跳过绑定',\n 'rtc.remotePlayerBound': '已绑定远端视频播放器: {userId}',\n 'rtc.remoteOutputStalled': '远端输出超过 15 秒无新帧,尝试恢复生成任务',\n 'rtc.sendSeiFailed': '发送 SEI 失败,当前浏览器或编码配置可能不支持该能力',\n 'rtc.seiUnsupported': '当前环境不支持 H.264,SEI gate 将不会生效,output 将不再被拦截',\n 'rtc.seiGateFallback': 'SEI 门控超时,已显示远端输出',\n 'rtc.getCodecsFailed': '获取浏览器编解码支持失败,SEI gate 将不会生效,output 将不再被拦截',\n} as const\n","import { enUS } from './en-US'\nimport { zhCN } from './zh-CN'\n\nexport type SDKLocale = 'en-US' | 'zh-CN'\n\nexport { API_ERROR_MESSAGES, resolveApiErrorMessage } from './api-error-codes'\n\nexport type SDKMessages = Record<string, string>\n\nexport type SDKI18n = {\n locale: SDKLocale\n t: (key: string, params?: Record<string, string | number | boolean | null | undefined>) => string\n}\n\nfunction formatTemplate(\n template: string,\n params?: Record<string, string | number | boolean | null | undefined>,\n): string {\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (_, rawKey: string) => {\n const value = params[rawKey]\n return value === null || value === undefined ? '' : String(value)\n })\n}\n\nexport function getDefaultMessages(locale: SDKLocale): SDKMessages {\n return locale === 'zh-CN' ? (zhCN as SDKMessages) : (enUS as SDKMessages)\n}\n\nexport function createSDKI18n(input?: {\n locale?: SDKLocale\n messages?: Record<string, string>\n t?: SDKI18n['t']\n}): SDKI18n {\n const locale = input?.locale ?? 'en-US'\n\n if (typeof input?.t === 'function') {\n return { locale, t: input.t }\n }\n\n const base = getDefaultMessages(locale)\n const merged: SDKMessages = { ...base, ...(input?.messages ?? {}) }\n\n return {\n locale,\n t: (key, params) => {\n const template = merged[key] ?? key\n return formatTemplate(template, params)\n },\n }\n}\n","const COMMON_VIDEO_FPS = [24, 25, 30, 48, 50, 60] as const\n\ntype VideoFrameCallbackMetadata = {\n mediaTime: number\n presentedFrames: number\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => void,\n ) => number\n}\n\nfunction median(values: number[]): number {\n if (values.length === 0) {\n return 30\n }\n const sorted = [...values].sort((a, b) => a - b)\n const mid = Math.floor(sorted.length / 2)\n if (sorted.length % 2 === 0) {\n return (sorted[mid - 1] + sorted[mid]) / 2\n }\n return sorted[mid]\n}\n\n/** Snap to broadcast fps; prefer the lower candidate when between 30 and 48 to avoid over-pacing. */\nexport function snapToCommonVideoFps(fps: number): number {\n if (!Number.isFinite(fps) || fps <= 0) {\n return 30\n }\n\n const clamped = Math.max(1, Math.min(120, fps))\n let best = 30\n let bestDiff = Infinity\n for (const candidate of COMMON_VIDEO_FPS) {\n const diff = Math.abs(clamped - candidate)\n if (diff < bestDiff || (diff === bestDiff && candidate < best)) {\n bestDiff = diff\n best = candidate\n }\n }\n return best\n}\n\n/** Prefer a common fps not greater than measured — avoids encoder/capture duplicate frames. */\nexport function snapToCommonVideoFpsConservative(fps: number): number {\n if (!Number.isFinite(fps) || fps <= 0) {\n return 30\n }\n\n const snapped = snapToCommonVideoFps(fps)\n if (snapped <= fps + 0.5) {\n return snapped\n }\n\n const lowerCandidates = COMMON_VIDEO_FPS.filter((candidate) => candidate < snapped)\n if (lowerCandidates.length > 0) {\n return lowerCandidates[lowerCandidates.length - 1]\n }\n return snapped\n}\n\nexport type EstimateVideoFrameRateOptions = {\n timeoutMs?: number\n sampleDurationMs?: number\n fallbackFps?: number\n}\n\n/**\n * Measure actual playback fps via presentedFrames over wall time (more reliable than per-frame deltas).\n */\nexport async function estimateVideoFrameRate(\n videoEl: HTMLVideoElement,\n options: EstimateVideoFrameRateOptions = {},\n): Promise<number> {\n const timeoutMs = options.timeoutMs ?? 3000\n const sampleDurationMs = options.sampleDurationMs ?? 900\n const fallbackFps = options.fallbackFps ?? 30\n\n const video = videoEl as VideoWithFrameCallback\n if (!video.requestVideoFrameCallback) {\n return fallbackFps\n }\n\n return new Promise((resolve) => {\n let settled = false\n let startWallMs = 0\n let startPresented = 0\n const deltas: number[] = []\n let lastMediaTime = -1\n\n const finish = (rawFps: number) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n resolve(snapToCommonVideoFpsConservative(rawFps))\n }\n\n const timer = setTimeout(() => {\n if (startWallMs > 0) {\n finish(fallbackFps)\n return\n }\n if (deltas.length > 0) {\n finish(median(deltas.map((delta) => 1 / delta)))\n return\n }\n finish(fallbackFps)\n }, timeoutMs)\n\n const schedule = () => {\n if (settled) {\n return\n }\n video.requestVideoFrameCallback!((now, metadata) => {\n if (lastMediaTime >= 0) {\n const delta = metadata.mediaTime - lastMediaTime\n if (delta > 0.001 && delta < 0.5) {\n deltas.push(delta)\n }\n }\n lastMediaTime = metadata.mediaTime\n\n if (startWallMs === 0) {\n startWallMs = now\n startPresented = metadata.presentedFrames\n schedule()\n return\n }\n\n const elapsedMs = now - startWallMs\n if (elapsedMs >= sampleDurationMs) {\n const frameCount = metadata.presentedFrames - startPresented\n if (frameCount > 0) {\n finish(frameCount / (elapsedMs / 1000))\n return\n }\n }\n\n schedule()\n })\n }\n\n schedule()\n })\n}\n\nexport function resolveTrackFrameRate(track: MediaStreamTrack, fallback: number): number {\n const settings = track.getSettings?.()\n if (typeof settings?.frameRate === 'number' && settings.frameRate > 0) {\n return snapToCommonVideoFpsConservative(settings.frameRate)\n }\n return snapToCommonVideoFpsConservative(fallback)\n}\n\n/** Encoder ceiling for playback-driven upload — never pace faster than the capture track. */\nexport function resolvePlaybackDrivenEncoderFps(\n track: MediaStreamTrack,\n fallback = 24,\n): number {\n return resolveTrackFrameRate(track, fallback)\n}\n","/** Max viewport width treated as mobile H5 (matches app `useIsMobile`). */\nexport const MOBILE_PUBLISH_MAX_WIDTH_PX = 768\n\nexport const RTC_PUBLISH_FPS_WEB = 30\n\nexport const RTC_PUBLISH_FPS_MOBILE = 24\n\n/** @deprecated Use {@link resolveRtcPublishFps} — web default only. */\nexport const RTC_PUBLISH_FPS = RTC_PUBLISH_FPS_WEB\n\nexport type ResolveRtcPublishFpsOptions = {\n /** When set, skips viewport detection. */\n mobile?: boolean\n /** Explicit fps override. */\n fps?: number\n /** Upload/file publish — use detail encoding and higher max bitrate. */\n highQuality?: boolean\n}\n\nexport function isMobilePublishEnvironment(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false\n }\n return window.matchMedia(`(max-width: ${MOBILE_PUBLISH_MAX_WIDTH_PX}px)`).matches\n}\n\nexport function resolveRtcPublishFps(options: ResolveRtcPublishFpsOptions = {}): number {\n if (typeof options.fps === 'number' && Number.isFinite(options.fps) && options.fps > 0) {\n return options.fps\n }\n const mobile = options.mobile ?? isMobilePublishEnvironment()\n return mobile ? RTC_PUBLISH_FPS_MOBILE : RTC_PUBLISH_FPS_WEB\n}\n\nexport function resolveRtcPublishFrameIntervalS(options?: ResolveRtcPublishFpsOptions): number {\n return 1 / resolveRtcPublishFps(options)\n}\n\n/** Web @ 30fps — use {@link resolveRtcPublishFrameIntervalS} when mobile-aware. */\nexport const RTC_PUBLISH_FRAME_INTERVAL_S = 1 / RTC_PUBLISH_FPS_WEB\n\nexport const RTC_PUBLISH_FRAME_INTERVAL_MS = 1000 / RTC_PUBLISH_FPS_WEB\n\n/** Tolerance when comparing media-time deltas (seconds). */\nexport const MEDIA_TIME_EPSILON_S = 0.001\n\n/** Media time jumped backward beyond this threshold — treat as loop/seek reset. */\nexport const MEDIA_TIME_LOOP_JUMP_S = 0.05\n","/** UI preview frames are fixed 16:9 per design; session `size` is separate (see resolveUploadVideoSize). */\nexport const PREVIEW_CONTAINER_ASPECT_RATIO = 16 / 9\n\n/** CSS `aspect-ratio` string for a session target size — keeps UI layout aligned with passed `size`. */\nexport function resolvePreviewAspectRatio(size: [number, number]): string {\n return `${size[0]} / ${size[1]}`\n}\n\n/** Default landscape session size under the 832 rule (16:9). */\nexport const DEFAULT_SESSION_TARGET_SIZE: [number, number] = [1472, 832]\n\nconst UPLOAD_VIDEO_BASE = 832\nconst UPLOAD_SIZE_ALIGN = 32\nconst MAX_LANDSCAPE_ASPECT = 16 / 9\nconst MAX_PORTRAIT_HEIGHT_RATIO = 16 / 9\n\nfunction alignToSizeMultiple(value: number): number {\n return Math.max(UPLOAD_SIZE_ALIGN, Math.round(value / UPLOAD_SIZE_ALIGN) * UPLOAD_SIZE_ALIGN)\n}\n\nfunction makeEven(value: number): number {\n const rounded = Math.max(2, Math.round(value))\n return rounded % 2 === 0 ? rounded : rounded - 1\n}\n\n/**\n * Upload publish size — keep source resolution (even dimensions for H.264).\n * Avoids canvas downscale blur; camera path still uses {@link resolveUploadVideoSize}.\n */\nexport function resolveUploadPublishSize(sourceWidth: number, sourceHeight: number): [number, number] {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return DEFAULT_SESSION_TARGET_SIZE\n }\n return [makeEven(sourceWidth), makeEven(sourceHeight)]\n}\n\n/**\n * Adaptive RTC encode/session size — mirrors iOS `rtcVideoSize(for:)`.\n * Keeps the base width and scales height for wide sources; tall sources use the full base size.\n */\nexport function resolveAdaptiveRtcVideoSize(\n sourceWidth: number,\n sourceHeight: number,\n baseSize: [number, number] = DEFAULT_SESSION_TARGET_SIZE,\n): [number, number] {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return baseSize\n }\n\n const [baseWidth, baseHeight] = baseSize\n const sourceAspectRatio = sourceHeight / sourceWidth\n const baseAspectRatio = baseHeight / baseWidth\n\n if (sourceAspectRatio >= baseAspectRatio) {\n return [baseWidth, baseHeight]\n }\n\n const adaptiveHeight = Math.max(\n UPLOAD_SIZE_ALIGN,\n Math.round(baseWidth * sourceAspectRatio),\n )\n return [baseWidth, makeEven(adaptiveHeight)]\n}\n\n/**\n * Session video size (camera + upload): scale from base edge 832, cap at 9:16 or 16:9.\n * Portrait keeps width at 832; landscape keeps height at 832; the other edge is 32-aligned.\n */\nexport function resolveUploadVideoSize(sourceWidth: number, sourceHeight: number): [number, number] {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return DEFAULT_SESSION_TARGET_SIZE\n }\n\n if (sourceWidth === sourceHeight) {\n return [UPLOAD_VIDEO_BASE, UPLOAD_VIDEO_BASE]\n }\n\n const aspect = sourceWidth / sourceHeight\n\n if (sourceHeight > sourceWidth) {\n const width = UPLOAD_VIDEO_BASE\n let height = alignToSizeMultiple(width / aspect)\n const maxHeight = alignToSizeMultiple(width * MAX_PORTRAIT_HEIGHT_RATIO)\n if (height > maxHeight) {\n height = maxHeight\n }\n return [width, height]\n }\n\n const height = UPLOAD_VIDEO_BASE\n let width = alignToSizeMultiple(height * aspect)\n const maxWidth = alignToSizeMultiple(height * MAX_LANDSCAPE_ASPECT)\n if (width > maxWidth) {\n width = maxWidth\n }\n return [width, height]\n}\n\nexport function resolveSessionTargetSize(input: {\n localVideoSize?: { width: number; height: number } | null\n overrideSize?: [number, number]\n}): [number, number] {\n if (input.overrideSize) {\n return input.overrideSize\n }\n\n if (input.localVideoSize?.width && input.localVideoSize?.height) {\n return [input.localVideoSize.width, input.localVideoSize.height]\n }\n\n return DEFAULT_SESSION_TARGET_SIZE\n}\n","/** Off-screen host for decode/canvas pipelines. Keep full size for iOS decode; move off-screen instead of near-zero opacity (Windows may stop decoding at opacity ~0). */\nlet captureHostRoot: HTMLDivElement | null = null\n\nconst CAPTURE_VIDEO_STYLE =\n 'position:fixed;left:-10000px;top:0;width:640px;height:480px;opacity:1;pointer-events:none;z-index:-1;'\n\nexport function mountCaptureVideo(videoEl: HTMLVideoElement): void {\n if (!captureHostRoot) {\n captureHostRoot = document.createElement('div')\n captureHostRoot.setAttribute('data-xmax-capture-host', 'true')\n captureHostRoot.style.cssText =\n 'position:fixed;left:0;top:0;width:0;height:0;overflow:hidden;pointer-events:none;z-index:-1;'\n document.body.appendChild(captureHostRoot)\n }\n\n videoEl.setAttribute('playsinline', 'true')\n videoEl.setAttribute('webkit-playsinline', 'true')\n videoEl.style.cssText = CAPTURE_VIDEO_STYLE\n captureHostRoot.appendChild(videoEl)\n}\n"]}
@@ -1,4 +0,0 @@
1
- export { createVideoFileStream } from './chunk-EGNRAZ5U.js';
2
- import './chunk-PLU2YVAS.js';
3
- //# sourceMappingURL=video-file-stream-UXJ6TNIB.js.map
4
- //# sourceMappingURL=video-file-stream-UXJ6TNIB.js.map