@xmaxai/sdk 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rtc/local-publish-diagnostics.ts","../../src/i18n/en-US.ts","../../src/i18n/zh-CN.ts","../../src/i18n/api-error-codes.ts","../../src/i18n/index.ts","../../src/shared/browser-toast.ts","../../src/shared/error-utils.ts","../../src/sdk/client.ts","../../src/sdk/rtc-events.ts","../../src/rtc/video-frame-rate.ts","../../src/rtc/preview-media-layout.ts","../../src/rtc/rtc-manager.ts","../../src/rtc/publish-fps.ts","../../src/shared/reference-video-size.ts","../../src/rtc/capture-crop.ts","../../src/rtc/canvas-frame-draw.ts","../../src/rtc/capture-host.ts","../../src/rtc/video-file-stream.ts","../../src/shared/camera-stream.ts","../../src/rtc/camera-stream-v2.ts","../../src/realtime/models.ts","../../src/shared/session-debug.ts","../../src/react/provider.tsx","../../src/drag/map-viewport.ts","../../src/drag/drag-track-controller.ts","../../src/react/drag-track-surface.tsx","../../src/react/view.tsx"],"names":["element","root","COS","VideoRenderMode","VideoSourceType","MediaType","StreamIndex","VERTC","RoomProfileType","waitForMediaStreamTrackFrames","frameResult","MirrorType","VideoCodecType","width","height","createContext","useMemo","useRef","useCallback","useState","useEffect","result","jsx","useContext","content","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["type VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: { mediaTime: number; presentedFrames?: number }) => void,\n ) => number\n cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport async function waitForMediaStreamTrackFrames(\n track: MediaStreamTrack,\n options: { minFrames?: number; timeoutMs?: number } = {},\n): Promise<{ ready: boolean; frameCount: number; elapsedMs: number }> {\n const minFrames = options.minFrames ?? 3\n const timeoutMs = options.timeoutMs ?? 3000\n const startedAtMs = performance.now()\n\n if (track.readyState === 'ended') {\n return { ready: false, frameCount: 0, elapsedMs: 0 }\n }\n\n return new Promise((resolve) => {\n let frameCount = 0\n let settled = false\n let rvfcHandle: number | null = null\n let rafId: number | null = null\n\n const finish = (ready: boolean) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timeoutTimer)\n const video = videoEl as VideoWithFrameCallback\n if (rvfcHandle !== null) {\n video.cancelVideoFrameCallback?.(rvfcHandle)\n }\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n }\n try {\n videoEl.pause()\n videoEl.srcObject = null\n videoEl.remove()\n } catch {\n }\n resolve({\n ready,\n frameCount,\n elapsedMs: Number((performance.now() - startedAtMs).toFixed(1)),\n })\n }\n\n const onFrame = () => {\n frameCount += 1\n if (frameCount >= minFrames) {\n finish(true)\n }\n }\n\n const videoEl = document.createElement('video')\n videoEl.muted = true\n videoEl.playsInline = true\n videoEl.autoplay = true\n videoEl.srcObject = new MediaStream([track])\n videoEl.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none'\n\n const schedule = () => {\n if (settled) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n rvfcHandle = video.requestVideoFrameCallback!(() => {\n onFrame()\n schedule()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n onFrame()\n schedule()\n })\n }\n\n const timeoutTimer = setTimeout(() => finish(frameCount >= minFrames), timeoutMs)\n\n void videoEl.play()\n .then(() => {\n if (!settled) {\n schedule()\n }\n })\n .catch(() => finish(false))\n })\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 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","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 TOAST_ROOT_ID = 'Xmax-sdk-toast-root'\nconst TOAST_DURATION_MS = 3000\nlet toastSeed = 0\nconst timeoutMap = new Map<string, number>()\nconst elementMap = new Map<string, HTMLDivElement>()\n\ntype ToastType = 'success' | 'error'\n\ntype ToastOptions = {\n key?: string\n duration?: number\n}\n\nfunction ensureToastRoot() {\n if (typeof document === 'undefined') {\n return null\n }\n\n let root = document.getElementById(TOAST_ROOT_ID)\n if (root) {\n return root\n }\n\n root = document.createElement('div')\n root.id = TOAST_ROOT_ID\n root.setAttribute('aria-live', 'polite')\n Object.assign(root.style, {\n position: 'fixed',\n left: '50%',\n top: '24px',\n transform: 'translateX(-50%)',\n zIndex: '3000',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n document.body.appendChild(root)\n return root\n}\n\nfunction createIcon(type: 'success' | 'error') {\n const icon = document.createElement('span')\n icon.setAttribute('aria-hidden', 'true')\n icon.innerHTML =\n type === 'success'\n ? '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M10 3L4.5 8.5 2 6\" stroke=\"#4ade80\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n : '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"#f87171\" stroke-width=\"1.5\"/><path d=\"M4 4l4 4M8 4L4 8\" stroke=\"#f87171\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>'\n Object.assign(icon.style, {\n display: 'inline-flex',\n width: '12px',\n height: '12px',\n flexShrink: '0',\n } satisfies Partial<CSSStyleDeclaration>)\n return icon\n}\n\nfunction clearToastTimer(id: string) {\n const timer = timeoutMap.get(id)\n if (timer) {\n window.clearTimeout(timer)\n timeoutMap.delete(id)\n }\n}\n\nfunction destroyToast(id?: string) {\n if (!id) {\n timeoutMap.forEach((timer) => window.clearTimeout(timer))\n timeoutMap.clear()\n elementMap.forEach((element) => element.remove())\n elementMap.clear()\n const root = typeof document !== 'undefined' ? document.getElementById(TOAST_ROOT_ID) : null\n root?.remove()\n return\n }\n\n clearToastTimer(id)\n const element = elementMap.get(id)\n element?.remove()\n elementMap.delete(id)\n\n const root = typeof document !== 'undefined' ? document.getElementById(TOAST_ROOT_ID) : null\n if (root && !root.childElementCount) {\n root.remove()\n }\n}\n\nfunction showToast(type: ToastType, message: string, options?: ToastOptions) {\n const root = ensureToastRoot()\n if (!root) {\n return ''\n }\n const id = options?.key || `toast-${Date.now()}-${++toastSeed}`\n clearToastTimer(id)\n elementMap.get(id)?.remove()\n\n const isMobile = typeof window !== 'undefined' && window.matchMedia('(max-width: 768px)').matches\n const textSize = isMobile ? '12px' : '14px'\n\n const toast = document.createElement('div')\n toast.setAttribute('role', 'status')\n Object.assign(toast.style, {\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n minWidth: '240px',\n padding: '16px',\n borderRadius: '12px',\n border: '1px solid rgba(255, 255, 255, 0.20)',\n background: 'rgba(0, 0, 0, 0.80)',\n boxShadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, sans-serif',\n fontSize: textSize,\n fontWeight: '400',\n lineHeight: '14px',\n } satisfies Partial<CSSStyleDeclaration>)\n\n const content = document.createElement('span')\n content.textContent = message\n Object.assign(content.style, {\n paddingRight: '0px',\n textAlign: 'center',\n color: '#ffffff',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, sans-serif',\n fontSize: textSize,\n fontWeight: '400',\n lineHeight: '14px',\n } satisfies Partial<CSSStyleDeclaration>)\n\n toast.appendChild(createIcon(type))\n toast.appendChild(content)\n root.appendChild(toast)\n elementMap.set(id, toast)\n\n const timer = window.setTimeout(() => {\n destroyToast(id)\n }, options?.duration ?? TOAST_DURATION_MS)\n timeoutMap.set(id, timer)\n\n return id\n}\n\nexport const browserToast = {\n success(message: string, options?: ToastOptions) {\n return showToast('success', message, options)\n },\n error(message: string, options?: ToastOptions) {\n return showToast('error', message, options)\n },\n destroy(id?: string) {\n destroyToast(id)\n },\n}\n","export type XmaxErrorNotifier = (message: string, error?: unknown) => void\nimport { browserToast } from './browser-toast'\n\ntype NotifiedError = Error & { __XmaxNotified?: boolean }\n\nexport function isNotifiedError(error: unknown): error is NotifiedError {\n return !!error && typeof error === 'object' && (error as NotifiedError).__XmaxNotified === true\n}\n\nexport function notifyError(\n error: unknown,\n notifier: XmaxErrorNotifier | undefined,\n fallbackMessage: string,\n): Error {\n const resolved =\n error instanceof Error\n ? (error as NotifiedError)\n : Object.assign(new Error(fallbackMessage), { cause: error }) as NotifiedError\n\n if (!resolved.__XmaxNotified) {\n resolved.__XmaxNotified = true\n const message = resolved.message || fallbackMessage\n if (notifier) {\n notifier(message, error)\n } else if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n browserToast.error(message)\n }\n }\n\n return resolved\n}\n","import COS from \"cos-js-sdk-v5\";\nimport { createSDKI18n, resolveApiErrorMessage, type SDKI18n, type SDKLocale } from \"../i18n\";\nimport { notifyError, type XmaxErrorNotifier } from \"../shared/error-utils\";\n\n/** Deployment region for the published package. */\nexport type XmaxSdkRegion = \"cn\" | \"global\";\n\n/** Region → official Open API v1 production base URL. */\nexport const XMAX_OPEN_API_BASE_URLS: Record<XmaxSdkRegion, string> = {\n // 国内 — @xmaxai/sdk\n cn: \"https://cloud.xmax.22duck.cn/open/api/v1\",\n // 海外 — @xmaxai/sdk-global\n global: \"https://api.xmax.cloud/open/api/v1\",\n};\n\n/**\n * Build-time region flag, inlined by tsup (see tsup.config.ts). Falls back to\n * `cn` for local dev / tests where the variable is not injected.\n */\nconst XMAX_SDK_BUILD_REGION: XmaxSdkRegion =\n process.env.XMAX_SDK_REGION === \"global\" ? \"global\" : \"cn\";\n\n/**\n * Official Xmax Open Platform production API base URL (Open API v1) for the\n * region this package was built for:\n * - `@xmaxai/sdk` (cn): https://cloud.xmax.22duck.cn/open/api/v1\n * - `@xmaxai/sdk-global`: https://api.xmax.cloud/open/api/v1\n */\nexport const XMAX_OPEN_API_PRODUCTION_BASE_URL =\n XMAX_OPEN_API_BASE_URLS[XMAX_SDK_BUILD_REGION];\n\nexport const ACTIVE_STATUS = \"ACTIVE\";\nconst STS_TTL_MS = 30 * 60 * 1000;\nconst STS_REFRESH_BUFFER_MS = 5 * 60 * 1000;\n\nexport interface ModelExtra {\n room_id?: string;\n bot_name?: string;\n user_id?: string;\n rtc_app_id?: string;\n room_token?: string;\n}\n\nexport interface Session {\n sessionUid: string;\n userUid?: string;\n modelTypeUid?: string;\n modelTypeName?: string;\n modelUid?: string;\n modelExtra?: ModelExtra;\n status?: string;\n lastHeartbeatTimestamp?: string;\n closeTimestamp?: string | null;\n closeReason?: string | null;\n createTimestamp?: string;\n updateTimestamp?: string;\n}\n\nexport interface StsCredentials {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken: string;\n}\n\nexport interface CosSts {\n type: string;\n bucket: string;\n region: string;\n endpoint: string;\n prefix: string;\n credentials: StsCredentials;\n}\n\nexport interface UploadImageResult {\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n}\n\nexport interface UploadVideoResult {\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n}\n\nexport interface RtcJoinInfo {\n appId: string;\n roomId: string;\n userId: string;\n token: string;\n botName?: string;\n}\n\nexport interface XmaxLogEntry {\n id: string;\n level: \"info\" | \"success\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n timestamp: string;\n}\n\nexport interface ClientOptions {\n apiKey: string;\n /** Open API base URL, e.g. {@link XMAX_OPEN_API_PRODUCTION_BASE_URL}. */\n baseUrl: string;\n authToken?: string;\n timeoutMs?: number;\n locale?: SDKLocale;\n i18n?: SDKI18n;\n onError?: XmaxErrorNotifier;\n}\n\nfunction sanitizeFileName(fileName: string): string {\n return fileName\n .trim()\n .replace(/[^\\w.\\-一-龥]/g, \"_\")\n .replace(/_+/g, \"_\");\n}\n\nfunction buildCosFileUrl(endpoint: string, bucket: string, key: string): string {\n const trimmed = endpoint.trim();\n const url = new URL(\n /^https?:\\/\\//i.test(trimmed)\n ? (trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`)\n : `https://${trimmed.replace(/^\\/+/, \"\")}${trimmed.endsWith(\"/\") ? \"\" : \"/\"}`,\n );\n if (url.hostname.startsWith(\"cos.\") && !url.hostname.startsWith(`${bucket}.`)) {\n url.hostname = `${bucket}.${url.hostname}`;\n }\n return new URL(key.replace(/^\\/+/, \"\"), url.toString()).toString();\n}\n\n/** Prefer COS putObject Location; fall back to STS endpoint or bucket/region URL. */\nfunction resolveCosUploadUrl(raw: unknown, sts: CosSts, key: string): string {\n const location = (raw as { Location?: string } | null)?.Location?.trim();\n if (location) {\n return /^https?:\\/\\//i.test(location)\n ? location\n : `https://${location.replace(/^\\/+/, \"\")}`;\n }\n\n const endpoint = sts.endpoint?.trim();\n if (endpoint) {\n return buildCosFileUrl(endpoint, sts.bucket, key);\n }\n\n return `https://${sts.bucket}.cos.${sts.region}.myqcloud.com/${key.replace(/^\\/+/, \"\")}`;\n}\n\nexport class XmaxOpenClient {\n private readonly apiKey: string;\n private readonly authToken: string | undefined;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly i18n: SDKI18n;\n private readonly onError: XmaxErrorNotifier | undefined;\n private stsCache: { value: CosSts; fetchedAt: number } | null = null;\n private heartbeatIntervalId: number | null = null;\n private suppressErrorNotification = false;\n private teardownAbortController: AbortController | null = null;\n private readonly pendingRequestControllers = new Set<AbortController>();\n\n constructor(options: ClientOptions) {\n const i18n = options.i18n ?? createSDKI18n({ locale: options.locale });\n if (!options.apiKey?.trim()) {\n throw new Error(i18n.t(\"errors.apiKeyEmpty\"));\n }\n if (!options.baseUrl?.trim()) {\n throw new Error(i18n.t(\"errors.baseUrlEmpty\"));\n }\n this.apiKey = options.apiKey;\n this.authToken = options.authToken;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.i18n = i18n;\n this.onError = options.onError;\n }\n\n private throwError(message: string, cause?: unknown): never {\n const error = new Error(message);\n if (cause !== undefined) {\n (error as Error & { cause?: unknown }).cause = cause;\n }\n if (this.suppressErrorNotification) {\n throw error;\n }\n throw notifyError(error, this.onError, message);\n }\n\n /** Stop heartbeat, abort in-flight API requests, and suppress error toasts during teardown. */\n beginTeardown(): void {\n this.suppressErrorNotification = true;\n this.stopHeartbeat();\n if (this.teardownAbortController) {\n this.teardownAbortController.abort();\n }\n this.teardownAbortController = new AbortController();\n this.pendingRequestControllers.forEach((controller) => {\n controller.abort();\n });\n this.pendingRequestControllers.clear();\n }\n\n endTeardown(): void {\n this.suppressErrorNotification = false;\n this.teardownAbortController = null;\n }\n\n private isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n this.pendingRequestControllers.add(controller);\n\n const onAbort = () => controller.abort();\n this.teardownAbortController?.signal.addEventListener(\"abort\", onAbort);\n\n const timeoutId = window.setTimeout(() => controller.abort(), this.timeoutMs);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"X-Api-Key\": this.apiKey,\n };\n\n if (this.authToken) {\n headers[\"Authorization\"] = `Bearer ${this.authToken}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: controller.signal,\n });\n\n const text = await response.text();\n let payload: unknown;\n\n try {\n payload = text ? JSON.parse(text) : null;\n } catch (parseError) {\n throw this.throwError(this.i18n.t(\"errors.invalidJson\"), parseError);\n }\n\n if (typeof payload !== \"object\" || payload === null) {\n throw this.throwError(this.i18n.t(\"errors.invalidPayload\"));\n }\n\n const p = payload as Record<string, unknown>;\n\n if (response.ok && p.success === true) {\n return p.data as T;\n }\n\n // Prefer our localized message keyed by business error code; fall back to a\n // generic retry hint for unmapped codes on these Open API endpoints.\n const mappedMessage = resolveApiErrorMessage(p.code as string | number | null | undefined, this.i18n.locale);\n const errorMessage = mappedMessage ?? this.i18n.t(\"errors.requestRetry\");\n\n throw new Error(errorMessage);\n } catch (error) {\n if (this.isAbortError(error)) {\n if (this.suppressErrorNotification) {\n throw new Error(this.i18n.t(\"errors.requestTimeout\"));\n }\n throw this.throwError(this.i18n.t(\"errors.requestTimeout\"), error);\n } else if (error instanceof Error) {\n if (this.suppressErrorNotification) {\n throw error;\n }\n throw notifyError(error, this.onError, error.message || this.i18n.t(\"errors.requestFailed\"));\n } else {\n throw this.throwError(this.i18n.t(\"errors.requestFailed\"), error);\n }\n } finally {\n this.teardownAbortController?.signal.removeEventListener(\"abort\", onAbort);\n this.pendingRequestControllers.delete(controller);\n window.clearTimeout(timeoutId);\n }\n }\n\n async createSession(model: string): Promise<Session> {\n if (!model.trim()) {\n this.throwError(this.i18n.t(\"errors.modelEmpty\"));\n }\n return this.request<Session>(\"POST\", \"/session\", { model });\n }\n\n async getSession(sessionUid: string): Promise<Session> {\n return this.request<Session>(\"GET\", `/session/${sessionUid}`);\n }\n\n async heartbeatSession(sessionUid: string): Promise<Session> {\n return this.request<Session>(\"PUT\", `/session/${sessionUid}/heartbeat`);\n }\n\n async closeSession(sessionUid: string): Promise<Session | null> {\n const previousSuppress = this.suppressErrorNotification;\n this.suppressErrorNotification = true;\n try {\n return await this.request<Session>(\"DELETE\", `/session/${sessionUid}`);\n } catch {\n return null;\n } finally {\n this.suppressErrorNotification = previousSuppress;\n }\n }\n\n async getCosSts(forceRefresh = false): Promise<CosSts> {\n const now = Date.now();\n if (\n !forceRefresh &&\n this.stsCache &&\n now - this.stsCache.fetchedAt < STS_TTL_MS - STS_REFRESH_BUFFER_MS\n ) {\n return this.stsCache.value;\n }\n\n const sts = await this.request<CosSts>(\"GET\", \"/cos/sts\");\n this.stsCache = {\n value: sts,\n fetchedAt: now,\n };\n return sts;\n }\n\n private async uploadObject(file: File, expectedTypePrefix: string): Promise<{\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n }> {\n if (!(file instanceof File)) {\n this.throwError(this.i18n.t(\"errors.invalidFile\"));\n }\n\n if (!file.type.startsWith(expectedTypePrefix)) {\n this.throwError(this.i18n.t(\"errors.invalidFileType\", { type: file.type }));\n }\n\n const sts = await this.getCosSts();\n const safeFileName = sanitizeFileName(file.name) || \"image\";\n const key = `${sts.prefix}${Date.now()}_${safeFileName}`;\n\n const cos = new COS({\n SecretId: sts.credentials.accessKeyId,\n SecretKey: sts.credentials.secretAccessKey,\n SecurityToken: sts.credentials.sessionToken,\n });\n\n const raw = await new Promise<unknown>((resolve, reject) => {\n cos.putObject(\n {\n Bucket: sts.bucket,\n Region: sts.region,\n Key: key,\n Body: file,\n ContentType: file.type,\n },\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(data);\n },\n );\n });\n\n return {\n key,\n url: resolveCosUploadUrl(raw, sts, key),\n raw,\n sts,\n };\n }\n\n async uploadImage(file: File): Promise<UploadImageResult> {\n return this.uploadObject(file, \"image/\");\n }\n\n async uploadVideo(file: File): Promise<UploadVideoResult> {\n return this.uploadObject(file, \"video/\");\n }\n\n startHeartbeat(\n sessionUid: string,\n intervalMs: number = 10000,\n onHeartbeat?: (session: Session) => void,\n onError?: (error: unknown) => void,\n ): void {\n this.stopHeartbeat();\n\n const heartbeat = async () => {\n try {\n const session = await this.heartbeatSession(sessionUid);\n onHeartbeat?.(session);\n\n if (session.status !== ACTIVE_STATUS) {\n this.stopHeartbeat();\n }\n } catch (error) {\n onError?.(error);\n this.stopHeartbeat();\n }\n };\n\n heartbeat();\n this.heartbeatIntervalId = window.setInterval(heartbeat, intervalMs);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatIntervalId !== null) {\n clearInterval(this.heartbeatIntervalId);\n this.heartbeatIntervalId = null;\n }\n }\n\n getRtcJoinInfo(session: Session): RtcJoinInfo {\n const roomId = session.modelExtra?.room_id?.trim();\n const appId = session.modelExtra?.rtc_app_id?.trim();\n const token = session.modelExtra?.room_token?.trim();\n const userId = session.modelExtra?.user_id?.trim() || session.userUid?.trim() || \"\";\n\n if (!roomId || !appId || !token || !userId) {\n this.throwError(this.i18n.t(\"errors.sessionJoinInfoIncomplete\"));\n }\n\n return {\n appId,\n roomId,\n userId,\n token,\n botName: session.modelExtra?.bot_name,\n };\n }\n}\n","export type StartRtcRoomEvent = {\n event: \"start\";\n user_id?: string;\n uid?: string;\n session_uid?: string;\n params: {\n model: string;\n size: [number, number];\n prompt: string;\n ref_image_path?: string;\n ref_image?: string;\n static_generate?: boolean;\n } & Record<string, unknown>;\n};\n\nexport type StopRtcRoomEvent = {\n event: \"stop\";\n user_id?: string;\n session_uid?: string;\n};\n\nexport type TracksRtcRoomEvent = {\n event: \"tracks\";\n user_id?: string;\n uid?: string;\n session_uid?: string;\n tracks: Array<[number, number]>;\n};\n\nexport type RtcRoomEvent =\n | StartRtcRoomEvent\n | StopRtcRoomEvent\n | TracksRtcRoomEvent;\n\n/** Generation task id sent as `uid` / `session_uid` in RTC room events. */\nexport function createTaskUid(): string {\n return `task-${Date.now()}`;\n}\n\nexport function createStartRtcRoomEvent(input: {\n userId?: string;\n uid?: string;\n sessionUid?: string;\n model: string;\n size: [number, number];\n prompt?: string;\n refImagePath?: string;\n refImage?: string;\n /** MoX instant — static image generation that follows drag tracks. */\n staticGenerate?: boolean;\n extraParams?: Record<string, unknown>;\n}): StartRtcRoomEvent {\n const resolvedPrompt = input.prompt?.trim() ?? \"\";\n const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || undefined;\n const useRefImage = !!refImagePath;\n return {\n event: \"start\",\n user_id: input.userId?.trim() || undefined,\n uid: input.uid?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n params: {\n model: input.model.trim(),\n size: input.size,\n prompt: resolvedPrompt,\n ref_image_path: useRefImage ? refImagePath : undefined,\n ref_image: useRefImage ? refImagePath : undefined,\n static_generate: input.staticGenerate === undefined ? undefined : input.staticGenerate,\n ...(input.extraParams ?? {}),\n },\n };\n}\n\nexport function createStopRtcRoomEvent(input: { userId?: string; sessionUid?: string }): StopRtcRoomEvent {\n return {\n event: \"stop\",\n user_id: input.userId?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n };\n}\n\nexport function createTracksRtcRoomEvent(input: {\n userId?: string;\n uid?: string;\n sessionUid?: string;\n tracks: Array<[number, number]>;\n}): TracksRtcRoomEvent {\n return {\n event: \"tracks\",\n user_id: input.userId?.trim() || undefined,\n uid: input.uid?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n tracks: input.tracks,\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","export const PREVIEW_UPLOAD_LAYOUT_ATTR = 'data-preview-upload-layout'\n\n/** Mobile upload output fit — `portrait` (h-full w-auto) or `landscape` (w-full h-auto). */\nexport const PREVIEW_UPLOAD_FIT_ATTR = 'data-preview-upload-fit'\n\nexport const PREVIEW_OUTPUT_LAYOUT_ATTR = 'data-preview-output-layout'\n\nexport const PREVIEW_CONTAIN_ATTR = 'data-preview-contain'\n\nexport const PREVIEW_COVER_ATTR = 'data-preview-cover'\n\nfunction hasFitPreviewLayout(container: HTMLElement): boolean {\n return (\n container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_CONTAIN_ATTR)\n || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`) !== null\n || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`) !== null\n || container.closest(`[${PREVIEW_CONTAIN_ATTR}]`) !== null\n )\n}\n\nfunction hasCoverPreviewLayout(container: HTMLElement): boolean {\n return (\n container.hasAttribute(PREVIEW_COVER_ATTR)\n || container.closest(`[${PREVIEW_COVER_ATTR}]`) !== null\n )\n}\n\nfunction resolveUploadFitMode(container: HTMLElement): 'portrait' | 'landscape' {\n const node = container.hasAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n ? container\n : container.closest(`[${PREVIEW_UPLOAD_FIT_ATTR}]`)\n const fit = node?.getAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n return fit === 'landscape' ? 'landscape' : 'portrait'\n}\n\n/** Match Playground upload overlay — portrait: h-full w-auto; landscape: w-full h-auto; centered clip. */\nexport function applyUploadPreviewMediaLayout(container: HTMLElement): void {\n if (hasCoverPreviewLayout(container)) {\n return\n }\n\n if (!hasFitPreviewLayout(container)) {\n return\n }\n\n const fitMode = resolveUploadFitMode(container)\n\n container.style.overflow = 'hidden'\n container.style.display = 'flex'\n container.style.alignItems = 'center'\n container.style.justifyContent = 'center'\n\n container.querySelectorAll('div').forEach((node) => {\n if (node === container) {\n return\n }\n const el = node as HTMLElement\n el.style.width = '100%'\n el.style.height = '100%'\n if (fitMode === 'landscape') {\n el.style.display = 'flex'\n el.style.alignItems = 'center'\n el.style.justifyContent = 'center'\n el.style.overflow = 'hidden'\n }\n })\n\n container.querySelectorAll('video, canvas').forEach((node) => {\n const el = node as HTMLElement\n el.style.display = 'block'\n el.style.objectFit = 'contain'\n el.style.objectPosition = 'center'\n el.style.position = 'relative'\n el.style.left = 'auto'\n el.style.right = 'auto'\n el.style.top = 'auto'\n el.style.bottom = 'auto'\n el.style.transform = 'none'\n\n if (fitMode === 'landscape') {\n el.style.width = '100%'\n el.style.height = '100%'\n el.style.maxWidth = 'none'\n el.style.maxHeight = 'none'\n el.style.margin = '0'\n return\n }\n\n el.style.height = '100%'\n el.style.width = 'auto'\n el.style.maxWidth = 'none'\n el.style.maxHeight = 'none'\n el.style.marginLeft = 'auto'\n el.style.marginRight = 'auto'\n el.style.marginTop = 'auto'\n el.style.marginBottom = 'auto'\n })\n}\n\nexport function observeUploadPreviewMediaLayout(container: HTMLElement): () => void {\n if (!hasFitPreviewLayout(container) && !hasCoverPreviewLayout(container)) {\n return () => {}\n }\n\n let rafId: number | null = null\n const apply = () => applyUploadPreviewMediaLayout(container)\n const scheduleApply = () => {\n if (rafId !== null) {\n return\n }\n rafId = requestAnimationFrame(() => {\n rafId = null\n apply()\n })\n }\n\n apply()\n const observer = new MutationObserver(() => scheduleApply())\n observer.observe(container, {\n childList: true,\n subtree: true,\n attributes: true,\n })\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n observer.disconnect()\n }\n}\n","import VERTC, {\n MediaType,\n type IRTCEngine,\n type LocalStreamStats,\n MirrorType,\n RoomProfileType,\n VideoCodecType,\n StreamIndex,\n VideoSourceType,\n VideoRenderMode,\n} from \"@volcengine/rtc\";\n\nimport type { RtcJoinInfo } from \"../sdk/client\";\nimport { createSDKI18n, type SDKI18n } from \"../i18n\";\nimport { resolveRtcPublishFps, type ResolveRtcPublishFpsOptions } from \"./publish-fps\";\nimport { resolvePlaybackDrivenEncoderFps } from \"./video-frame-rate\";\nimport {\n applyUploadPreviewMediaLayout,\n observeUploadPreviewMediaLayout,\n PREVIEW_OUTPUT_LAYOUT_ATTR,\n PREVIEW_UPLOAD_FIT_ATTR,\n PREVIEW_UPLOAD_LAYOUT_ATTR,\n} from \"./preview-media-layout\";\n\n/** Upload preview uses FIT (same as left overlay). Camera PiP may use HIDDEN (cover). */\nfunction resolveVideoRenderMode(container: HTMLElement): VideoRenderMode {\n if (\n container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n || container.hasAttribute(\"data-preview-contain\")\n || container.hasAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`)\n || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`)\n || container.closest(\"[data-preview-contain]\")\n || container.closest(`[${PREVIEW_UPLOAD_FIT_ATTR}]`)\n ) {\n return VideoRenderMode.RENDER_MODE_FIT;\n }\n\n if (\n container.hasAttribute(\"data-preview-cover\")\n || container.hasAttribute(\"data-upload-preview-cover\")\n || container.closest(\"[data-preview-cover]\")\n || container.closest(\"[data-upload-preview-cover]\")\n ) {\n return VideoRenderMode.RENDER_MODE_HIDDEN;\n }\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return VideoRenderMode.RENDER_MODE_FIT;\n }\n\n const isCompactPreview = rect.width <= 160;\n const isPortraitFrame = rect.height > rect.width;\n // Volcengine: FILL = non-uniform stretch; HIDDEN = proportional scale to fill (CSS cover).\n return isCompactPreview || isPortraitFrame\n ? VideoRenderMode.RENDER_MODE_HIDDEN\n : VideoRenderMode.RENDER_MODE_FIT;\n}\n\nexport interface RtcLogEntry {\n level: \"info\" | \"success\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n}\n\nexport interface RtcStateSnapshot {\n roomId: string | null;\n userId: string | null;\n appId: string | null;\n botUserId: string | null;\n joined: boolean;\n localVideoPublished: boolean;\n remoteVideoUserId: string | null;\n users: string[];\n}\n\nexport type RemoteSeiReceivedPayload = {\n sei: string;\n userId: string;\n};\n\ninterface RtcManagerOptions {\n onLog?: (entry: RtcLogEntry) => void;\n onStateChange?: (state: RtcStateSnapshot) => void;\n onSeiGateChange?: (state: {\n expectedSei: string | null;\n sei: string | null;\n userId: string | null;\n matched: boolean;\n }) => void;\n /** Fired for H.264 SEI received on a remote (non-local) stream — e.g. backend/bot output. */\n onRemoteSeiReceived?: (payload: RemoteSeiReceivedPayload) => void;\n /** Fired when remote output stops presenting new frames after playback had started. */\n onRemoteOutputStalled?: (info: { userId: string; stallMs: number }) => void;\n /** Fired after the remote player is mounted (used to forward MediaStream via onRemoteStream). */\n onRemotePlayerMounted?: () => void;\n debug?: boolean;\n i18n?: SDKI18n;\n}\n\ntype VideoSize = [number, number];\ntype RtcSessionSeiOptions = {\n repeatCount?: number;\n intervalMs?: number;\n};\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: { mediaTime: number }) => void,\n ) => number;\n cancelVideoFrameCallback?: (handle: number) => void;\n};\n\nconst REMOTE_OUTPUT_STALL_MS = 20000;\nconst REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS = 60000;\n/** Max local SEI cadence — Volcengine attaches one SEI per encoded frame; faster calls timeout. */\nconst SESSION_SEI_INTERVAL_MS = 500;\nconst DEFAULT_SEI_REPEAT_COUNT = 1;\n/** Cold publish: bootstrap already waits 3 frames — buffer before first start only. */\nexport const PUBLISH_START_MIN_FRAMES = 5;\nexport const PUBLISH_START_FRAME_TIMEOUT_MS = 800;\nexport const PUBLISH_COLD_MIN_FRAMES = 12;\nexport const PUBLISH_COLD_FRAME_TIMEOUT_MS = 1500;\n/** Minimum publish duration before first start (encoder/network warmup). */\nexport const PUBLISH_COLD_WARMUP_MS = 600;\n/** Skip cold-start ensure when publish has been active this long. */\nexport const PUBLISH_WARM_SKIP_MS = 800;\n/** Cold start: local canvas frames required before first start. */\nconst COLD_START_MIN_FRAMES = 3;\n/** Warm restart: quick sync — a few fresh frames right before start. */\nconst WARM_START_MIN_FRAMES = 1;\nconst WARM_START_FRAME_TIMEOUT_MS = 200;\n/** Brief settle after cold pipeline checks. */\nconst COLD_START_SETTLE_MS = 50;\n/** Max wait for stable outbound sentFrameRate on cold start; proceed on timeout. */\nconst COLD_START_OUTBOUND_TIMEOUT_MS = 1500;\n/** Hold start after outbound fps reaches min so encoder rate stabilizes. */\nconst COLD_START_OUTBOUND_STABLE_MS = 200;\n/** Treat outbound as ready when sentFrameRate reaches this (partial stats windows report low). */\nconst COLD_START_MIN_OUTBOUND_FPS = 5;\n/** Volcengine stats window is ~2s — used only by legacy wait helpers. */\nconst PUBLISH_READY_BUFFER_MS = 300;\nconst PUBLISH_READY_TIMEOUT_MS = 5000;\n\nexport type LocalPublishReadyResult = {\n ready: boolean;\n reason: \"sent-frame-rate\" | \"sent-bitrate\" | \"already-ready\" | \"not-published\" | \"timeout\";\n elapsedSincePublishMs: number;\n};\n\nexport class RtcManager {\n private engine: IRTCEngine | null = null;\n private leaveTask: Promise<void> | null = null;\n private readonly users = new Set<string>();\n private currentJoinInfo: RtcJoinInfo | null = null;\n private joined = false;\n private preserveRemoteDom = false;\n private localVideoPublished = false;\n private localVideoSourceType: VideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n private shouldMirrorLocalPreview = false;\n private externalVideoTrack: MediaStreamTrack | null = null;\n private remoteVideoUserId: string | null = null;\n private pendingRemoteVideoUserId: string | null = null;\n private pendingRemoteVideoMediaType: MediaType = MediaType.VIDEO;\n /** Subscribed to RTC media, but player may still be gated by SEI / container. */\n private subscribedRemoteUserId: string | null = null;\n private subscribedRemoteMediaType: MediaType = MediaType.VIDEO;\n private readonly onLog: RtcManagerOptions[\"onLog\"];\n private readonly onStateChange: RtcManagerOptions[\"onStateChange\"];\n private readonly onSeiGateChange: RtcManagerOptions[\"onSeiGateChange\"];\n private readonly onRemoteSeiReceived: RtcManagerOptions[\"onRemoteSeiReceived\"];\n private readonly onRemoteOutputStalled: RtcManagerOptions[\"onRemoteOutputStalled\"];\n private onRemotePlayerMounted: RtcManagerOptions[\"onRemotePlayerMounted\"];\n private localVideoContainer: HTMLElement | null = null;\n private remoteVideoContainer: HTMLElement | null = null;\n private expectedRemoteSei: string | null = null;\n private lastRemoteSei: string | null = null;\n private lastRemoteSeiUserId: string | null = null;\n private localSeiMessage: string | null = null;\n private localSeiRepeatCount = DEFAULT_SEI_REPEAT_COUNT;\n private seiSendInterval: ReturnType<typeof setInterval> | null = null;\n private lastSeiSentAtMs = 0;\n private hasLoggedSeiSendFailure = false;\n private seiSupport: \"unknown\" | \"supported\" | \"unsupported\" = \"unknown\";\n private hasLoggedSeiUnsupported = false;\n private readonly debug: boolean;\n private lastDebugSeiMatched: boolean | null = null;\n private lastDebugRemoteSei: string | null = null;\n private remoteFrameWatchStop: (() => void) | null = null;\n private uploadPreviewLayoutObserverStop: (() => void) | null = null;\n private remoteOutputRecoveryCooldownUntil = 0;\n private readonly i18n: SDKI18n;\n private joinedAtMs = 0;\n private publishStartedAtMs = 0;\n private lastRoomStartEventAtMs = 0;\n private localStreamStatsCount = 0;\n private firstNonZeroSentFrameRateAtMs = 0;\n private lastObservedSentFrameRate = 0;\n private publishReadyWaiters: Array<(result: LocalPublishReadyResult) => void> = [];\n private stablePublishWaiters: Array<() => void> = [];\n private publishReadyBufferTimer: ReturnType<typeof setTimeout> | null = null;\n private seiGateFallbackTimer: ReturnType<typeof setTimeout> | null = null;\n private seiMatchedDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private lastSentResolution = \"\";\n private lastReceivedResolution = \"\";\n private static readonly SEI_GATE_FALLBACK_MS = 6000;\n private static readonly SEI_MATCHED_DISPLAY_DELAY_MS = 200;\n\n constructor(options: RtcManagerOptions = {}) {\n this.onLog = options.onLog;\n this.onStateChange = options.onStateChange;\n this.onSeiGateChange = options.onSeiGateChange;\n this.onRemoteSeiReceived = options.onRemoteSeiReceived;\n this.onRemoteOutputStalled = options.onRemoteOutputStalled;\n this.debug = options.debug ?? false;\n this.i18n = options.i18n ?? createSDKI18n();\n }\n\n private emitSeiGateState(): void {\n const matched = this.isSeiMatched();\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei: this.lastRemoteSei,\n userId: this.lastRemoteSeiUserId,\n matched,\n });\n }\n\n setPreserveRemoteDom(preserve: boolean): void {\n this.preserveRemoteDom = preserve;\n }\n\n setOnRemotePlayerMounted(callback: RtcManagerOptions[\"onRemotePlayerMounted\"]): void {\n this.onRemotePlayerMounted = callback;\n }\n\n setLocalVideoContainer(container: HTMLElement | null): void {\n const previous = this.localVideoContainer;\n const changed = previous !== container;\n this.localVideoContainer = container;\n if (previous && changed) {\n previous.replaceChildren();\n }\n if (container && changed) {\n container.replaceChildren();\n }\n if (container && this.localVideoPublished && this.engine) {\n this.bindLocalVideoPlayer();\n }\n }\n\n setRemoteVideoContainer(container: HTMLElement | null): void {\n const previous = this.remoteVideoContainer;\n if (previous === container) {\n if (\n this.debug &&\n container &&\n container.childElementCount === 0 &&\n (this.remoteVideoUserId || this.pendingRemoteVideoUserId)\n ) {\n this.debugLog(\"setRemoteVideoContainer skipped but container empty\", {\n remoteVideoUserId: this.remoteVideoUserId,\n pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n });\n }\n return;\n }\n\n this.remoteVideoContainer = container;\n this.debugLog(\"setRemoteVideoContainer\", {\n hadPrevious: !!previous,\n next: !!container,\n remoteVideoUserId: this.remoteVideoUserId,\n pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n });\n if (previous) {\n previous.replaceChildren();\n }\n if (container && this.engine && this.joined && (this.remoteVideoUserId || this.pendingRemoteVideoUserId)) {\n void this.refreshRemoteVideoBinding();\n }\n }\n\n /** Display-only gate: expect bot output SEI to match task id — no local SEI send, no start blocking. */\n configureSessionSei(sessionId: string | null, _options: RtcSessionSeiOptions = {}): void {\n const normalizedSessionId = this.normalizeSei(sessionId)\n const previousExpectedRemoteSei = this.expectedRemoteSei\n\n this.stopSeiSending()\n this.clearSeiGateFallbackTimer()\n this.clearSeiMatchedDelayTimer()\n this.localSeiMessage = null\n this.expectedRemoteSei = this.seiSupport === \"unsupported\" ? null : normalizedSessionId\n this.lastRemoteSei = null\n this.lastRemoteSeiUserId = null\n this.hasLoggedSeiSendFailure = false\n\n if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId) {\n this.pendingRemoteVideoUserId = this.remoteVideoUserId\n this.remoteVideoUserId = null\n }\n\n this.emitSeiGateState()\n if (previousExpectedRemoteSei !== this.expectedRemoteSei && !this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer)\n }\n\n this.scheduleSeiGateFallback(normalizedSessionId)\n }\n\n private clearSeiGateFallbackTimer(): void {\n if (this.seiGateFallbackTimer !== null) {\n clearTimeout(this.seiGateFallbackTimer)\n this.seiGateFallbackTimer = null\n }\n }\n\n private clearSeiMatchedDelayTimer(): void {\n if (this.seiMatchedDelayTimer !== null) {\n clearTimeout(this.seiMatchedDelayTimer)\n this.seiMatchedDelayTimer = null\n }\n }\n\n /** Show output if bot SEI never arrives — UI gate only, RTC bind is not blocked. */\n private scheduleSeiGateFallback(expectedSei: string | null): void {\n this.clearSeiGateFallbackTimer()\n if (!expectedSei) {\n return\n }\n\n this.seiGateFallbackTimer = setTimeout(() => {\n this.seiGateFallbackTimer = null\n if (this.expectedRemoteSei !== expectedSei || this.isSeiMatched()) {\n return\n }\n this.log(\"warn\", this.i18n.t(\"rtc.seiGateFallback\"), { expectedSei })\n this.expectedRemoteSei = null\n this.emitSeiGateState()\n void this.refreshRemoteVideoBinding({ force: true })\n }, RtcManager.SEI_GATE_FALLBACK_MS)\n }\n\n get snapshot(): RtcStateSnapshot {\n return {\n roomId: this.currentJoinInfo?.roomId ?? null,\n userId: this.currentJoinInfo?.userId ?? null,\n appId: this.currentJoinInfo?.appId ?? null,\n botUserId: this.currentJoinInfo?.botName ?? null,\n joined: this.joined,\n localVideoPublished: this.localVideoPublished,\n remoteVideoUserId: this.remoteVideoUserId,\n users: Array.from(this.users),\n };\n }\n\n getLocalVideoSize(): { width: number; height: number } | null {\n if (!this.engine || !this.joined) {\n return null;\n }\n\n const track = this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\");\n if (!track) {\n return null;\n }\n\n const settings = track.getSettings?.();\n const width = typeof settings?.width === \"number\" ? settings.width : 0;\n const height = typeof settings?.height === \"number\" ? settings.height : 0;\n\n if (!width || !height) {\n return null;\n }\n\n return { width, height };\n }\n\n async join(joinInfo: RtcJoinInfo): Promise<void> {\n if (this.currentJoinInfo?.roomId === joinInfo.roomId && this.joined) {\n this.log(\"info\", this.i18n.t(\"rtc.alreadyInRoom\"), joinInfo);\n return;\n }\n\n await this.leave();\n this.currentJoinInfo = joinInfo;\n this.users.clear();\n this.users.add(joinInfo.userId);\n this.localVideoPublished = false;\n this.remoteVideoUserId = null;\n this.pendingRemoteVideoUserId = null;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n this.lastRemoteSei = null;\n this.lastRemoteSeiUserId = null;\n this.clearVideoContainers();\n\n const engine = VERTC.createEngine(joinInfo.appId);\n this.engine = engine;\n this.bindEngineEvents(engine);\n\n this.log(\"info\", this.i18n.t(\"rtc.joiningRoom\"), joinInfo);\n\n await engine.joinRoom(\n joinInfo.token,\n joinInfo.roomId,\n {\n userId: joinInfo.userId,\n },\n {\n isAutoPublish: false,\n isAutoSubscribeAudio: false,\n isAutoSubscribeVideo: true,\n roomProfileType: RoomProfileType.communication,\n },\n );\n\n this.joined = true;\n this.joinedAtMs = performance.now();\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.joinSuccess\"), this.snapshot);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n }\n\n async startVideoPublishing(size?: VideoSize): Promise<void> {\n if (!this.engine || !this.currentJoinInfo || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoined\"));\n }\n\n const publishStartedAtMs = performance.now();\n\n await this.applyVideoEncoderPreference(size);\n\n if (size) {\n await this.applyLocalVideoCaptureConfig(size);\n }\n\n if (this.localVideoPublished) {\n this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n return;\n }\n\n this.shouldMirrorLocalPreview = true;\n this.bindLocalVideoPlayer();\n await this.switchToInternalVideoSource();\n await this.engine.startVideoCapture();\n await this.engine.publishStream(MediaType.VIDEO);\n this.localVideoPublished = true;\n this.publishStartedAtMs = publishStartedAtMs;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastObservedSentFrameRate = 0;\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.localVideoPublished\"));\n }\n\n async startExternalVideoPublishing(\n track: MediaStreamTrack,\n encoderSize?: VideoSize,\n publishOptions?: ResolveRtcPublishFpsOptions,\n ): Promise<void> {\n if (!this.engine || !this.currentJoinInfo || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoined\"));\n }\n\n if (this.localVideoPublished) {\n this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n return;\n }\n\n const publishStartedAtMs = performance.now();\n\n const settings = track.getSettings?.();\n const width = typeof settings?.width === \"number\" && settings.width > 0 ? settings.width : undefined;\n const height = typeof settings?.height === \"number\" && settings.height > 0 ? settings.height : undefined;\n const encoderOptions = publishOptions?.highQuality !== false\n ? {\n ...publishOptions,\n highQuality: true,\n fps: publishOptions?.fps ?? resolvePlaybackDrivenEncoderFps(track),\n }\n : publishOptions;\n this.shouldMirrorLocalPreview = false;\n this.bindLocalVideoPlayer();\n await this.switchToExternalVideoSource(track);\n await this.engine.publishStream(MediaType.VIDEO);\n await this.applyVideoEncoderPreference(\n encoderSize ?? (width && height ? [width, height] : undefined),\n encoderOptions,\n );\n this.localVideoPublished = true;\n this.publishStartedAtMs = publishStartedAtMs;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastObservedSentFrameRate = 0;\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.externalVideoPublished\"));\n }\n\n async stopVideoPublishing(options?: { preserveExternalTrack?: boolean }): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n this.stopSeiSending();\n this.clearPublishReadyWaiters();\n\n if (this.localVideoPublished) {\n await this.engine.unpublishStream(MediaType.VIDEO);\n }\n\n if (this.localVideoSourceType === VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL) {\n await this.engine.stopVideoCapture();\n }\n\n if (this.externalVideoTrack) {\n if (!options?.preserveExternalTrack) {\n try {\n this.externalVideoTrack.stop();\n } catch {\n }\n }\n this.externalVideoTrack = null;\n }\n\n await this.switchToInternalVideoSource(false);\n this.clearUploadPreviewLayoutObserver();\n this.clearContainer(this.localVideoContainer);\n this.clearRemoteVideo();\n this.localVideoPublished = false;\n this.publishStartedAtMs = 0;\n this.lastSentResolution = \"\";\n this.emitState();\n this.log(\"warn\", this.i18n.t(\"rtc.localVideoStopped\"));\n }\n\n async leave(): Promise<void> {\n if (this.leaveTask) {\n await this.leaveTask;\n return;\n }\n\n const engine = this.engine;\n if (!engine) {\n return;\n }\n\n this.leaveTask = (async () => {\n try {\n if (this.localVideoPublished) {\n await this.stopVideoPublishing();\n }\n await engine.leaveRoom();\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.leaveRoomError\"), error);\n } finally {\n try {\n engine.destroy();\n } catch {\n }\n if (this.engine === engine) {\n this.engine = null;\n }\n this.currentJoinInfo = null;\n this.users.clear();\n this.joined = false;\n this.localVideoPublished = false;\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n this.shouldMirrorLocalPreview = false;\n this.externalVideoTrack = null;\n this.remoteVideoUserId = null;\n this.pendingRemoteVideoUserId = null;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n this.subscribedRemoteUserId = null;\n this.subscribedRemoteMediaType = MediaType.VIDEO;\n this.stopSeiSending();\n this.clearSeiGateFallbackTimer();\n this.clearSeiMatchedDelayTimer();\n this.stopRemoteFrameWatch();\n this.clearPublishReadyWaiters();\n this.joinedAtMs = 0;\n this.publishStartedAtMs = 0;\n this.lastRoomStartEventAtMs = 0;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastSentResolution = \"\";\n this.lastReceivedResolution = \"\";\n this.clearVideoContainers();\n this.emitState();\n this.log(\"info\", this.i18n.t(\"rtc.engineDestroyed\"));\n }\n })();\n\n try {\n await this.leaveTask;\n } finally {\n this.leaveTask = null;\n }\n }\n\n /**\n * Resolve whether to wait for input frames before start.\n * Warm pipelines (restart / long-lived publish) skip — iOS sends start while frames already flow.\n */\n resolveInputFrameWaitOptions(): { minFrames: number; timeoutMs: number; minPublishMs: number } | null {\n if (!this.localVideoPublished || this.publishStartedAtMs <= 0) {\n return {\n minFrames: PUBLISH_COLD_MIN_FRAMES,\n timeoutMs: PUBLISH_COLD_FRAME_TIMEOUT_MS,\n minPublishMs: PUBLISH_COLD_WARMUP_MS,\n };\n }\n\n const elapsedMs = performance.now() - this.publishStartedAtMs;\n if (elapsedMs >= PUBLISH_WARM_SKIP_MS) {\n return null;\n }\n\n return {\n minFrames: PUBLISH_COLD_MIN_FRAMES,\n timeoutMs: Math.max(400, PUBLISH_COLD_FRAME_TIMEOUT_MS - Math.floor(elapsedMs)),\n minPublishMs: Math.max(0, PUBLISH_COLD_WARMUP_MS - elapsedMs),\n };\n }\n\n /**\n * Wait until the published input track produces enough frames before sending start.\n * Uses actual frame delivery instead of sentFrameRate (~2s Volcengine stats window).\n */\n async waitForPublishedInputFrames(\n options: { minFrames?: number; timeoutMs?: number } = {},\n ): Promise<{ ready: boolean; frameCount: number; elapsedMs: number }> {\n const track = this.externalVideoTrack\n ?? this.engine?.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\")\n ?? null;\n\n if (!track || track.readyState === \"ended\") {\n return { ready: false, frameCount: 0, elapsedMs: 0 };\n }\n\n const { waitForMediaStreamTrackFrames } = await import(\"./local-publish-diagnostics\");\n return waitForMediaStreamTrackFrames(track, {\n minFrames: options.minFrames ?? PUBLISH_START_MIN_FRAMES,\n timeoutMs: options.timeoutMs ?? PUBLISH_START_FRAME_TIMEOUT_MS,\n });\n }\n\n /**\n * Before every start: ensure the publish track is producing frames.\n * Cold — longer warmup; warm restart — quick sync (~200ms) so backend gets steady input after start.\n */\n async ensurePublishedInputBeforeStart(): Promise<void> {\n if (!this.localVideoPublished || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const publishAgeMs = performance.now() - this.publishStartedAtMs;\n const isCold = publishAgeMs < PUBLISH_WARM_SKIP_MS;\n\n if (!isCold && this.lastObservedSentFrameRate >= 15) {\n this.debugLog(\"ensurePublishedInputBeforeStart (warm, outbound steady)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n return;\n }\n\n if (isCold) {\n const [frameResult] = await Promise.all([\n this.waitForPublishedInputFrames({\n minFrames: COLD_START_MIN_FRAMES,\n timeoutMs: PUBLISH_START_FRAME_TIMEOUT_MS,\n }),\n this.waitForMinPublishDuration(PUBLISH_COLD_WARMUP_MS),\n ]);\n\n if (COLD_START_SETTLE_MS > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, COLD_START_SETTLE_MS);\n });\n }\n\n this.debugLog(\"ensurePublishedInputBeforeStart (cold)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n frameReady: frameResult.ready,\n frameCount: frameResult.frameCount,\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n return;\n }\n\n const frameResult = await this.waitForPublishedInputFrames({\n minFrames: WARM_START_MIN_FRAMES,\n timeoutMs: WARM_START_FRAME_TIMEOUT_MS,\n });\n\n if (!frameResult.ready && this.lastObservedSentFrameRate <= 0) {\n await this.waitForLocalPublishReady({ timeoutMs: 800 });\n }\n\n this.debugLog(\"ensurePublishedInputBeforeStart (warm sync)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n frameReady: frameResult.ready,\n frameCount: frameResult.frameCount,\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n }\n\n /** @deprecated Use {@link ensurePublishedInputBeforeStart}. */\n async waitForRtcOutboundBeforeStart(options?: { timeoutMs?: number }): Promise<LocalPublishReadyResult> {\n const timeoutMs = options?.timeoutMs ?? PUBLISH_READY_TIMEOUT_MS;\n const publishAgeMs = this.publishStartedAtMs > 0\n ? performance.now() - this.publishStartedAtMs\n : 0;\n\n const localFramesPromise = publishAgeMs >= PUBLISH_WARM_SKIP_MS\n ? Promise.resolve({ ready: true, frameCount: 0, elapsedMs: 0 })\n : this.waitForPublishedInputFrames({\n minFrames: PUBLISH_START_MIN_FRAMES,\n timeoutMs: PUBLISH_START_FRAME_TIMEOUT_MS,\n });\n\n const [, rtcReady] = await Promise.all([\n localFramesPromise,\n this.waitForLocalPublishReady({ timeoutMs }),\n ]);\n\n return rtcReady;\n }\n\n /** @deprecated Use {@link waitForRtcOutboundBeforeStart}. */\n async waitForPublishedInputFramesBeforeStart(): Promise<{\n ready: boolean;\n frameCount: number;\n elapsedMs: number;\n rtcSendReady: boolean;\n rtcSendReason?: LocalPublishReadyResult[\"reason\"];\n rtcSendElapsedMs?: number;\n }> {\n const waitOptions = this.resolveInputFrameWaitOptions();\n const waitTasks: Array<Promise<unknown>> = [\n this.waitForLocalPublishReady({ timeoutMs: PUBLISH_READY_TIMEOUT_MS }),\n ];\n\n if (waitOptions) {\n waitTasks.push(\n this.waitForMinPublishDuration(waitOptions.minPublishMs),\n this.waitForPublishedInputFrames({\n minFrames: waitOptions.minFrames,\n timeoutMs: waitOptions.timeoutMs,\n }),\n );\n }\n\n const [rtcResult, ...rest] = await Promise.all(waitTasks);\n const rtcSend = rtcResult as LocalPublishReadyResult;\n const frameResult = waitOptions\n ? (rest[1] as { ready: boolean; frameCount: number; elapsedMs: number })\n : { ready: true, frameCount: 0, elapsedMs: 0 };\n\n return {\n ...frameResult,\n rtcSendReady: rtcSend.ready,\n rtcSendReason: rtcSend.reason,\n rtcSendElapsedMs: rtcSend.elapsedSincePublishMs,\n };\n }\n\n private async waitForMinPublishDuration(minMs: number): Promise<void> {\n if (minMs <= 0 || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const elapsedMs = performance.now() - this.publishStartedAtMs;\n const remainingMs = minMs - elapsedMs;\n if (remainingMs <= 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, remainingMs);\n });\n }\n\n /**\n * Subscribe to the bot output stream before start — iOS bindRemoteVideoRenderer runs pre-request.\n */\n async prepareRemoteVideoForGeneration(): Promise<void> {\n const botUserId = this.currentJoinInfo?.botName?.trim();\n if (!botUserId || !this.engine || !this.joined) {\n return;\n }\n\n this.pendingRemoteVideoUserId = botUserId;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n await this.ensureRemoteStreamSubscribed(botUserId, MediaType.VIDEO);\n }\n\n /**\n * Wait until outbound sentFrameRate reaches minFps and stays there for stableMs.\n * Avoids starting while Volcengine encoder is still ramping (causes early dropped frames).\n */\n async waitForStableLocalPublishReady(options?: {\n minFps?: number;\n timeoutMs?: number;\n stableMs?: number;\n }): Promise<LocalPublishReadyResult> {\n const minFps = options?.minFps ?? COLD_START_MIN_OUTBOUND_FPS;\n const timeoutMs = options?.timeoutMs ?? COLD_START_OUTBOUND_TIMEOUT_MS;\n const stableMs = options?.stableMs ?? COLD_START_OUTBOUND_STABLE_MS;\n const publishStartedAtMs = this.publishStartedAtMs;\n\n if (!this.localVideoPublished || publishStartedAtMs <= 0) {\n return {\n ready: false,\n reason: \"not-published\",\n elapsedSincePublishMs: 0,\n };\n }\n\n return new Promise((resolve) => {\n let settled = false;\n let stableTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finish = (result: LocalPublishReadyResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeoutTimer);\n if (stableTimer !== null) {\n clearTimeout(stableTimer);\n }\n const index = this.stablePublishWaiters.indexOf(check);\n if (index >= 0) {\n this.stablePublishWaiters.splice(index, 1);\n }\n resolve(result);\n };\n\n const check = () => {\n if (this.lastObservedSentFrameRate >= minFps) {\n if (stableTimer === null) {\n stableTimer = setTimeout(() => {\n finish({\n ready: true,\n reason: \"sent-frame-rate\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, stableMs);\n }\n return;\n }\n if (stableTimer !== null) {\n clearTimeout(stableTimer);\n stableTimer = null;\n }\n };\n\n this.stablePublishWaiters.push(check);\n check();\n\n const timeoutTimer = setTimeout(() => {\n finish({\n ready: this.lastObservedSentFrameRate > 0,\n reason: \"timeout\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, timeoutMs);\n });\n }\n\n /**\n * Wait until Volcengine reports non-zero sentFrameRate (~2s stats window).\n * Prefer this over local track frame counts before start — backend only processes from start.\n */\n async waitForLocalPublishReady(options?: { timeoutMs?: number }): Promise<LocalPublishReadyResult> {\n const timeoutMs = options?.timeoutMs ?? PUBLISH_READY_TIMEOUT_MS;\n const publishStartedAtMs = this.publishStartedAtMs;\n\n if (!this.localVideoPublished || publishStartedAtMs <= 0) {\n return {\n ready: false,\n reason: \"not-published\",\n elapsedSincePublishMs: 0,\n };\n }\n\n if (this.firstNonZeroSentFrameRateAtMs > 0) {\n return {\n ready: true,\n reason: \"already-ready\",\n elapsedSincePublishMs: Number((this.firstNonZeroSentFrameRateAtMs - publishStartedAtMs).toFixed(1)),\n };\n }\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: LocalPublishReadyResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeoutTimer);\n const index = this.publishReadyWaiters.indexOf(onReady);\n if (index >= 0) {\n this.publishReadyWaiters.splice(index, 1);\n }\n resolve(result);\n };\n\n const onReady = (result: LocalPublishReadyResult) => finish(result);\n this.publishReadyWaiters.push(onReady);\n\n const timeoutTimer = setTimeout(() => {\n finish({\n ready: false,\n reason: \"timeout\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, timeoutMs);\n });\n }\n\n async sendRoomEvent(event: unknown): Promise<void> {\n this.ensureReadyForMessaging();\n const payload = JSON.stringify(event);\n const eventName = typeof event === \"object\" && event !== null && \"event\" in event\n ? String((event as { event?: unknown }).event ?? \"unknown\")\n : \"unknown\";\n\n if (eventName === \"start\") {\n this.lastRoomStartEventAtMs = performance.now();\n }\n await this.engine?.sendRoomMessage(payload);\n this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), event);\n }\n\n clearRemoteVideo(options?: { preserveDom?: boolean }): void {\n this.stopRemoteFrameWatch();\n if (!options?.preserveDom && !this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer);\n }\n if (this.remoteVideoUserId) {\n this.pendingRemoteVideoUserId = this.remoteVideoUserId;\n this.remoteVideoUserId = null;\n this.emitState();\n }\n }\n\n async refreshRemoteVideoBinding(options?: { force?: boolean }): Promise<void> {\n const targetUserId = this.remoteVideoUserId ?? this.pendingRemoteVideoUserId;\n if (!this.engine || !targetUserId || !this.remoteVideoContainer) {\n return;\n }\n\n await this.ensureRemoteStreamSubscribed(targetUserId, this.pendingRemoteVideoMediaType);\n\n if (!this.canRenderRemoteVideo(targetUserId)) {\n this.debugLog(\"refreshRemoteVideoBinding blocked by SEI gate\", {\n targetUserId,\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n });\n return;\n }\n\n if (\n !options?.force &&\n this.remoteVideoUserId === targetUserId &&\n this.remoteVideoContainer &&\n this.remoteVideoContainer.childElementCount > 0\n ) {\n this.debugLog(\"refreshRemoteVideoBinding skipped (already mounted)\", { targetUserId });\n return;\n }\n\n try {\n await this.mountRemoteVideoPlayer(\n targetUserId,\n this.remoteVideoContainer,\n this.pendingRemoteVideoMediaType,\n options?.force,\n );\n this.remoteVideoUserId = targetUserId;\n this.pendingRemoteVideoUserId = null;\n this.emitState();\n this.startRemoteFrameWatch(targetUserId);\n this.emitRemotePlayerMounted();\n this.log(\"info\", this.i18n.t(\"rtc.remotePlayerRefreshed\", { userId: targetUserId }));\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.remotePlayerRefreshFailed\"), error);\n }\n }\n\n private bindEngineEvents(engine: IRTCEngine): void {\n engine.on(VERTC.events.onUserJoined, (event) => {\n this.users.add(event.userInfo.userId);\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.userJoined\", { userId: event.userInfo.userId }), event);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n });\n\n engine.on(VERTC.events.onUserLeave, (event) => {\n this.users.delete(event.userInfo.userId);\n if (this.remoteVideoUserId === event.userInfo.userId) {\n this.remoteVideoUserId = null;\n this.clearContainer(this.remoteVideoContainer);\n }\n if (this.pendingRemoteVideoUserId === event.userInfo.userId) {\n this.pendingRemoteVideoUserId = null;\n }\n this.emitState();\n this.log(\"warn\", this.i18n.t(\"rtc.userLeft\", { userId: event.userInfo.userId }), event);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n });\n\n engine.on(VERTC.events.onConnectionStateChanged, (event) => {\n this.log(\"info\", this.i18n.t(\"rtc.connectionStateChanged\"), event);\n });\n\n engine.on(VERTC.events.onUserPublishStream, (event) => {\n this.log(\"success\", this.i18n.t(\"rtc.userPublished\", { userId: event.userId }), event);\n if (this.supportsVideo(event.mediaType)) {\n void this.attachRemoteVideo(event.userId, event.mediaType);\n }\n });\n\n engine.on(VERTC.events.onUserUnpublishStream, (event) => {\n this.log(\"warn\", this.i18n.t(\"rtc.userUnpublished\", { userId: event.userId }), event);\n this.debugLog(\"onUserUnpublishStream\", {\n userId: event.userId,\n mediaType: event.mediaType,\n remoteVideoUserId: this.remoteVideoUserId,\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n });\n if (this.remoteVideoUserId === event.userId && this.supportsVideo(event.mediaType)) {\n this.pendingRemoteVideoUserId = event.userId;\n this.pendingRemoteVideoMediaType = event.mediaType;\n this.remoteVideoUserId = null;\n this.stopRemoteFrameWatch();\n if (!this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer);\n }\n this.emitState();\n return;\n }\n });\n\n engine.on(VERTC.events.onSEIMessageReceived, (event) => {\n const userId = event.remoteStreamKey.userId;\n const sei = this.normalizeSei(this.decodeSeiMessage(event.sei));\n\n if (sei && this.isRemoteSeiUser(userId)) {\n this.onRemoteSeiReceived?.({ sei, userId });\n }\n\n this.lastRemoteSei = sei;\n this.lastRemoteSeiUserId = userId;\n\n const matched = this.isSeiMatched();\n const seiStateChanged =\n this.lastDebugSeiMatched !== matched ||\n this.lastDebugRemoteSei !== sei;\n\n if (!this.debug || seiStateChanged) {\n this.log(\"info\", this.i18n.t(\"rtc.seiReceived\", { userId }), { userId, sei, matched });\n }\n\n if (this.debug && seiStateChanged) {\n this.debugLog(\"onSEIMessageReceived\", {\n userId,\n sei,\n matched,\n expectedRemoteSei: this.expectedRemoteSei,\n });\n this.lastDebugSeiMatched = matched;\n this.lastDebugRemoteSei = sei;\n }\n\n if (!matched) {\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei,\n userId,\n matched: false,\n });\n return;\n }\n\n // If already matched and waiting for delay, do nothing\n if (this.seiMatchedDelayTimer !== null) {\n return;\n }\n\n this.clearSeiGateFallbackTimer();\n this.stopSeiSending();\n\n this.seiMatchedDelayTimer = setTimeout(() => {\n this.seiMatchedDelayTimer = null;\n\n // Double check if it's still matched (in case expectedRemoteSei changed during delay)\n if (!this.isSeiMatched()) {\n return;\n }\n\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei,\n userId,\n matched: true,\n });\n\n if (this.remoteVideoUserId === userId) {\n return;\n }\n\n void this.attachRemoteVideo(userId, this.pendingRemoteVideoMediaType);\n }, RtcManager.SEI_MATCHED_DISPLAY_DELAY_MS);\n });\n\n engine.on(VERTC.events.onError, (event) => {\n this.log(\"error\", this.i18n.t(\"rtc.error\", { code: String(event.errorCode) }), event);\n });\n\n engine.on(VERTC.events.onPublishResult, (event) => {\n this.debugLog(\"onPublishResult\", {\n ...event,\n elapsedSincePublishMs: this.publishStartedAtMs > 0\n ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n : null,\n });\n });\n\n engine.on(VERTC.events.onLocalStreamStats, (stats) => {\n this.logLocalStreamStats(stats);\n if (stats.videoStats) {\n // Volcengine Web SDK's LocalStreamStats may not have sentResolutionWidth/Height directly\n // Use encodedFrameWidth/encodedFrameHeight as fallback, or capture settings\n const width = (stats.videoStats as any).sentResolutionWidth ?? (stats.videoStats as any).encodedFrameWidth ?? 0;\n const height = (stats.videoStats as any).sentResolutionHeight ?? (stats.videoStats as any).encodedFrameHeight ?? 0;\n const sentFrameRate = stats.videoStats.sentFrameRate ?? 0;\n\n const res = `${width}x${height}`;\n if (width > 0 && height > 0 && res !== this.lastSentResolution) {\n this.lastSentResolution = res;\n }\n }\n });\n\n engine.on(VERTC.events.onRemoteStreamStats, (stats: any) => {\n if (stats?.videoStats) {\n const { width, height, receivedFrameRate } = stats.videoStats;\n const w = width ?? 0;\n const h = height ?? 0;\n const res = `${w}x${h}`;\n if (w > 0 && h > 0 && res !== this.lastReceivedResolution) {\n this.lastReceivedResolution = res;\n }\n }\n });\n\n engine.on(VERTC.events.onLocalStatsException, (exception) => {\n this.debugLog(\"onLocalStatsException\", {\n exception,\n elapsedSincePublishMs: this.publishStartedAtMs > 0\n ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n : null,\n });\n });\n\n engine.on(VERTC.events.onTrackMute, (event) => {\n this.debugLog(\"onTrackMute\", event);\n });\n\n engine.on(VERTC.events.onTrackUnmute, (event) => {\n this.debugLog(\"onTrackUnmute\", event);\n });\n }\n\n private emitState(): void {\n this.onStateChange?.(this.snapshot);\n }\n\n private ensureReadyForMessaging(): void {\n if (!this.engine || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoinedForMessaging\"));\n }\n }\n\n private bindLocalVideoPlayer(force = false): void {\n if (!this.localVideoContainer) {\n return;\n }\n const container = this.getRequiredContainer(this.localVideoContainer, \"local\");\n if (!force && container.childElementCount > 0) {\n this.bindUploadPreviewLayout(container);\n return;\n }\n container.replaceChildren();\n this.engine?.setLocalVideoMirrorType(\n this.shouldMirrorLocalPreview\n ? MirrorType.MIRROR_TYPE_RENDER\n : MirrorType.MIRROR_TYPE_NONE,\n );\n this.engine?.setLocalVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n renderDom: container,\n renderMode: resolveVideoRenderMode(container),\n });\n this.bindUploadPreviewLayout(container);\n }\n\n private bindUploadPreviewLayout(container: HTMLElement): void {\n this.uploadPreviewLayoutObserverStop?.();\n this.uploadPreviewLayoutObserverStop = null;\n applyUploadPreviewMediaLayout(container);\n this.uploadPreviewLayoutObserverStop = observeUploadPreviewMediaLayout(container);\n }\n\n private clearUploadPreviewLayoutObserver(): void {\n this.uploadPreviewLayoutObserverStop?.();\n this.uploadPreviewLayoutObserverStop = null;\n }\n\n /** Re-bind local preview after the container becomes visible or is resized (mobile H5). */\n refreshLocalVideoPreview(options?: { force?: boolean }): void {\n if (!this.engine || !this.localVideoPublished || !this.localVideoContainer) {\n return;\n }\n this.bindLocalVideoPlayer(options?.force);\n }\n\n private async switchToExternalVideoSource(track: MediaStreamTrack): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n this.externalVideoTrack = track;\n await this.engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL);\n await this.engine.setExternalVideoTrack(StreamIndex.STREAM_INDEX_MAIN, track);\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL;\n }\n\n private async switchToInternalVideoSource(shouldSetConfig = true): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n if (this.localVideoSourceType === VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL) {\n return;\n }\n\n await this.engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL);\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n if (shouldSetConfig && this.externalVideoTrack) {\n this.externalVideoTrack = null;\n }\n }\n\n private async applyLocalVideoCaptureConfig([width, height]: VideoSize): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n await this.engine.setVideoCaptureConfig({\n width,\n height,\n });\n this.log(\"info\", this.i18n.t(\"rtc.captureSizeSet\", { width, height }));\n }\n\n private resolveEncoderMaxKbps(width: number, height: number, highQuality = true): number {\n const pixels = width * height;\n if (highQuality) {\n if (pixels >= 2_000_000) {\n return 6000;\n }\n if (pixels >= 1_000_000) {\n return 4000;\n }\n return 3000;\n }\n if (pixels >= 2_000_000) {\n return 5000;\n }\n if (pixels >= 1_000_000) {\n return 3000;\n }\n return 2000;\n }\n\n private async applyVideoEncoderPreference(\n size?: VideoSize,\n publishOptions?: ResolveRtcPublishFpsOptions,\n ): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n try {\n const width = size?.[0] ?? 1280;\n const height = size?.[1] ?? 720;\n\n if (publishOptions) {\n const fps = publishOptions.fps ?? 30;\n const maxKbps = this.resolveEncoderMaxKbps(width, height, publishOptions.highQuality);\n await this.engine.setVideoEncoderConfig({\n width,\n height,\n frameRate: fps,\n maxKbps,\n contentHint: \"detail\",\n preferCodecName: VideoCodecType.H264,\n });\n } else {\n await this.engine.setVideoEncoderConfig({\n width,\n height,\n frameRate: 24,\n maxKbps: -1,\n contentHint: \"detail\",\n // @ts-expect-error: encodePreference is supported by ByteRTC SDK but may be missing from current typings\n encodePreference: 1, \n preferCodecName: VideoCodecType.H264,\n });\n }\n\n this.log(\"info\", this.i18n.t(\"rtc.encoderPreferenceSet\"), size);\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.encoderPreferenceFailed\"), error);\n }\n }\n\n private async attachRemoteVideo(userId: string, mediaType: MediaType): Promise<void> {\n if (!this.engine || !this.currentJoinInfo) {\n return;\n }\n\n const preferredBotUserId = this.currentJoinInfo.botName?.trim() || null;\n const shouldReplaceCurrent =\n this.remoteVideoUserId === null ||\n userId === preferredBotUserId ||\n this.remoteVideoUserId !== preferredBotUserId;\n\n if (!shouldReplaceCurrent) {\n return;\n }\n\n this.pendingRemoteVideoUserId = userId;\n this.pendingRemoteVideoMediaType = mediaType;\n\n // Subscribe immediately so frames are not dropped while SEI gate / UI hide output.\n await this.ensureRemoteStreamSubscribed(userId, mediaType);\n\n if (!this.canRenderRemoteVideo(userId)) {\n this.log(\"info\", this.i18n.t(\"rtc.remoteWaitSei\", { userId }), {\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n lastRemoteSeiUserId: this.lastRemoteSeiUserId,\n });\n return;\n }\n\n const container = this.remoteVideoContainer;\n if (!container) {\n this.log(\"warn\", this.i18n.t(\"rtc.remoteContainerNotReady\"), { userId, mediaType });\n return;\n }\n await this.mountRemoteVideoPlayer(userId, container, mediaType);\n this.remoteVideoUserId = userId;\n this.pendingRemoteVideoUserId = null;\n this.emitState();\n this.startRemoteFrameWatch(userId);\n this.emitRemotePlayerMounted();\n this.log(\"success\", this.i18n.t(\"rtc.remotePlayerBound\", { userId }));\n }\n\n private async ensureRemoteStreamSubscribed(userId: string, mediaType: MediaType): Promise<void> {\n if (!this.engine) {\n return;\n }\n if (this.subscribedRemoteUserId === userId) {\n return;\n }\n\n await this.engine.subscribeStream(userId, mediaType);\n this.subscribedRemoteUserId = userId;\n this.subscribedRemoteMediaType = mediaType;\n this.debugLog(\"ensureRemoteStreamSubscribed\", { userId, mediaType });\n }\n\n private bindRemoteVideoPlayerToContainer(userId: string, container: HTMLElement): void {\n if (!this.engine) {\n return;\n }\n\n this.engine.setRemoteVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n userId,\n renderDom: container,\n renderMode: resolveVideoRenderMode(container),\n });\n this.bindUploadPreviewLayout(container);\n }\n\n private async mountRemoteVideoPlayer(\n userId: string,\n container: HTMLElement,\n mediaType: MediaType,\n force = false,\n ): Promise<void> {\n if (!this.engine) {\n return;\n }\n if (\n !force &&\n this.remoteVideoUserId === userId &&\n container === this.remoteVideoContainer &&\n container.childElementCount > 0\n ) {\n this.debugLog(\"mountRemoteVideoPlayer skipped (already mounted)\", { userId });\n return;\n }\n this.debugLog(force ? \"mountRemoteVideoPlayer (force)\" : \"mountRemoteVideoPlayer\", {\n userId,\n mediaType,\n childCountBefore: container.childElementCount,\n });\n this.stopRemoteFrameWatch();\n container.replaceChildren();\n await this.ensureRemoteStreamSubscribed(userId, mediaType);\n this.bindRemoteVideoPlayerToContainer(userId, container);\n }\n\n private startRemoteFrameWatch(userId: string): void {\n this.stopRemoteFrameWatch();\n\n let lastFrameAt = 0;\n let hadFirstFrame = false;\n let rvfcHandle: number | null = null;\n let watchedVideo: HTMLVideoElement | null = null;\n\n const onFrame = () => {\n lastFrameAt = Date.now();\n hadFirstFrame = true;\n };\n\n const bindRvfc = (video: HTMLVideoElement) => {\n if (watchedVideo === video && rvfcHandle !== null) {\n return;\n }\n if (watchedVideo && watchedVideo !== video) {\n watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n }\n watchedVideo = video;\n const rvfcVideo = video as VideoWithFrameCallback;\n if (rvfcVideo.requestVideoFrameCallback) {\n const schedule = () => {\n if (this.remoteVideoUserId !== userId) {\n return;\n }\n rvfcHandle = rvfcVideo.requestVideoFrameCallback!(() => {\n onFrame();\n schedule();\n });\n };\n schedule();\n return;\n }\n video.addEventListener(\"timeupdate\", onFrame);\n };\n\n const pollTimer = setInterval(() => {\n if (this.remoteVideoUserId !== userId || !this.remoteVideoContainer) {\n return;\n }\n\n const video = this.remoteVideoContainer.querySelector(\"video\");\n if (video) {\n bindRvfc(video);\n }\n\n if (!hadFirstFrame || lastFrameAt === 0) {\n return;\n }\n\n const stallMs = Date.now() - lastFrameAt;\n if (stallMs < REMOTE_OUTPUT_STALL_MS) {\n return;\n }\n\n if (Date.now() < this.remoteOutputRecoveryCooldownUntil) {\n return;\n }\n\n this.remoteOutputRecoveryCooldownUntil = Date.now() + REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS;\n this.debugLog(\"remote output stalled\", { userId, stallMs });\n this.log(\"warn\", this.i18n.t(\"rtc.remoteOutputStalled\"), { userId, stallMs });\n this.onRemoteOutputStalled?.({ userId, stallMs });\n\n hadFirstFrame = false;\n lastFrameAt = 0;\n }, 3000);\n\n this.remoteFrameWatchStop = () => {\n clearInterval(pollTimer);\n if (watchedVideo) {\n watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n }\n if (rvfcHandle !== null && watchedVideo) {\n const rvfcVideo = watchedVideo as VideoWithFrameCallback;\n rvfcVideo.cancelVideoFrameCallback?.(rvfcHandle);\n }\n rvfcHandle = null;\n watchedVideo = null;\n };\n }\n\n private stopRemoteFrameWatch(): void {\n this.remoteFrameWatchStop?.();\n this.remoteFrameWatchStop = null;\n }\n\n private isRemoteSeiUser(userId: string): boolean {\n const localUserId = this.currentJoinInfo?.userId?.trim();\n if (localUserId && userId === localUserId) {\n return false;\n }\n\n const botUserId = this.currentJoinInfo?.botName?.trim();\n if (botUserId) {\n return userId === botUserId;\n }\n\n return true;\n }\n \n /** Always mount remote player — SEI gate is UI-only (see deriveOutputVisibility). */\n private canRenderRemoteVideo(_userId: string): boolean {\n return true;\n }\n\n /** Whether remote SEI matches the active task (display gate). */\n private isSeiMatched(): boolean {\n if (this.seiSupport === \"unsupported\") {\n return true;\n }\n if (!this.expectedRemoteSei) {\n return true;\n }\n return this.lastRemoteSei === this.expectedRemoteSei;\n }\n\n /** Low-rate SEI until remote output SEI matches — avoids Volcengine sendSEIMessage timeouts. */\n private startContinuousSeiSending(): void {\n this.stopSeiSending();\n\n if (\n !this.localSeiMessage ||\n !this.engine ||\n !this.joined ||\n !this.localVideoPublished ||\n this.seiSupport === \"unsupported\"\n ) {\n return;\n }\n\n const tick = () => {\n if (this.isSeiMatched() && this.expectedRemoteSei) {\n this.stopSeiSending();\n return;\n }\n this.flushSeiMessage();\n };\n\n this.seiSendInterval = setInterval(tick, SESSION_SEI_INTERVAL_MS);\n }\n\n private stopSeiSending(): void {\n if (this.seiSendInterval !== null) {\n this.debugLog(\"stopSeiSending\");\n clearInterval(this.seiSendInterval);\n this.seiSendInterval = null;\n }\n this.lastSeiSentAtMs = 0;\n }\n\n private canSendLocalSeiNow(): boolean {\n if (this.firstNonZeroSentFrameRateAtMs <= 0) {\n return false;\n }\n const now = performance.now();\n return now - this.lastSeiSentAtMs >= SESSION_SEI_INTERVAL_MS - 16;\n }\n\n private flushSeiMessage(): void {\n if (\n !this.engine ||\n !this.joined ||\n !this.localVideoPublished ||\n !this.localSeiMessage ||\n this.seiSupport === \"unsupported\"\n ) {\n return;\n }\n\n if (!this.canSendLocalSeiNow()) {\n return;\n }\n\n this.lastSeiSentAtMs = performance.now();\n try {\n this.engine.sendSEIMessage(StreamIndex.STREAM_INDEX_MAIN, this.localSeiMessage, this.localSeiRepeatCount);\n } catch (error) {\n if (!this.hasLoggedSeiSendFailure) {\n this.log(\"warn\", this.i18n.t(\"rtc.sendSeiFailed\"), error);\n this.hasLoggedSeiSendFailure = true;\n }\n this.stopSeiSending();\n }\n }\n\n private ensureSeiSupport(): void {\n if (this.seiSupport !== \"unknown\") {\n return;\n }\n\n void VERTC.getSupportedCodecs()\n .then((codecs) => {\n const supported = codecs.some((c) => c.toLowerCase() === \"h264\" || c.toLowerCase() === \"h.264\");\n this.seiSupport = supported ? \"supported\" : \"unsupported\";\n\n if (this.seiSupport === \"unsupported\" && !this.hasLoggedSeiUnsupported) {\n this.hasLoggedSeiUnsupported = true;\n this.log(\"warn\", this.i18n.t(\"rtc.seiUnsupported\"), codecs);\n }\n\n if (this.seiSupport === \"unsupported\") {\n this.expectedRemoteSei = null;\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n } else if (this.localSeiMessage) {\n this.startContinuousSeiSending();\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n }\n })\n .catch((error) => {\n this.seiSupport = \"unsupported\";\n if (!this.hasLoggedSeiUnsupported) {\n this.hasLoggedSeiUnsupported = true;\n this.log(\"warn\", this.i18n.t(\"rtc.getCodecsFailed\"), error);\n }\n this.expectedRemoteSei = null;\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n });\n }\n\n private normalizeSei(value: string | null | undefined): string | null {\n const normalized = value?.trim();\n if (!normalized) {\n return null;\n }\n return normalized.startsWith(\"task-\") ? normalized.slice(\"task-\".length) : normalized;\n }\n\n private normalizeSeiRepeatCount(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return DEFAULT_SEI_REPEAT_COUNT;\n }\n return Math.max(0, Math.min(4, Math.floor(value)));\n }\n\n private decodeSeiMessage(sei: Uint8Array): string | null {\n try {\n return new TextDecoder().decode(sei);\n } catch {\n return null;\n }\n }\n private supportsVideo(mediaType: MediaType): boolean {\n return mediaType === MediaType.VIDEO || mediaType === MediaType.AUDIO_AND_VIDEO;\n }\n private clearVideoContainers(): void {\n this.stopRemoteFrameWatch();\n this.clearContainer(this.localVideoContainer);\n this.clearContainer(this.remoteVideoContainer);\n }\n\n private clearContainer(container: HTMLElement | null): void {\n container?.replaceChildren();\n }\n\n private getRequiredContainer(\n container: HTMLElement | null,\n containerType: \"local\" | \"remote\",\n ): HTMLElement {\n if (!container) {\n throw new Error(`missing ${containerType} video container`);\n }\n return container;\n }\n\n private emitRemotePlayerMounted(): void {\n this.onRemotePlayerMounted?.();\n }\n\n private log(level: RtcLogEntry[\"level\"], message: string, data?: unknown): void {\n this.onLog?.({ level, message, data });\n }\n\n private resolvePublishReadyWaiters(reason: LocalPublishReadyResult[\"reason\"]): void {\n if (this.publishReadyWaiters.length === 0 || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const result: LocalPublishReadyResult = {\n ready: true,\n reason,\n elapsedSincePublishMs: Number((performance.now() - this.publishStartedAtMs).toFixed(1)),\n };\n const waiters = this.publishReadyWaiters.splice(0);\n for (const waiter of waiters) {\n waiter(result);\n }\n }\n\n private clearPublishReadyWaiters(): void {\n if (this.publishReadyBufferTimer !== null) {\n clearTimeout(this.publishReadyBufferTimer);\n this.publishReadyBufferTimer = null;\n }\n this.publishReadyWaiters = [];\n this.stablePublishWaiters = [];\n }\n\n private notifyStablePublishWaiters(): void {\n if (this.stablePublishWaiters.length === 0) {\n return;\n }\n const waiters = this.stablePublishWaiters.slice();\n for (const waiter of waiters) {\n waiter();\n }\n }\n\n private schedulePublishReadyWhenStable(sentFrameRate: number): void {\n if (this.publishReadyWaiters.length === 0 || this.publishReadyBufferTimer !== null) {\n return;\n }\n if (sentFrameRate <= 0) {\n return;\n }\n\n this.publishReadyBufferTimer = setTimeout(() => {\n this.publishReadyBufferTimer = null;\n this.resolvePublishReadyWaiters(\"sent-frame-rate\");\n }, PUBLISH_READY_BUFFER_MS);\n }\n\n private logLocalStreamStats(stats: LocalStreamStats): void {\n if (!this.localVideoPublished) {\n return;\n }\n\n this.localStreamStatsCount += 1;\n const nowMs = performance.now();\n const sentFrameRate = stats.videoStats?.sentFrameRate ?? 0;\n\n if (sentFrameRate > 0 && this.firstNonZeroSentFrameRateAtMs === 0) {\n this.firstNonZeroSentFrameRateAtMs = nowMs;\n }\n\n this.lastObservedSentFrameRate = sentFrameRate;\n this.schedulePublishReadyWhenStable(sentFrameRate);\n this.notifyStablePublishWaiters();\n }\n\n private debugLog(message: string, data?: unknown): void {\n if (!this.debug) {\n return;\n }\n this.log(\"info\", `[debug] ${message}`, data);\n }\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","export type CropRect = {\n x: number\n y: number\n width: number\n height: number\n}\n\n/** Center-crop source to target aspect (same rule as upload video pipeline). */\nexport function computeCenterCropRect(\n sourceWidth: number,\n sourceHeight: number,\n targetAspect: number,\n): CropRect {\n const sourceAspect = sourceWidth / sourceHeight\n\n if (sourceAspect > targetAspect) {\n const height = sourceHeight\n const width = sourceHeight * targetAspect\n return {\n x: (sourceWidth - width) / 2,\n y: 0,\n width,\n height,\n }\n }\n\n const width = sourceWidth\n const height = sourceWidth / targetAspect\n return {\n x: 0,\n y: (sourceHeight - height) / 2,\n width,\n height,\n }\n}\n","import { computeCenterCropRect } from './capture-crop'\n\nexport function drawSourceCenterCrop(\n ctx: CanvasRenderingContext2D,\n source: CanvasImageSource,\n outputWidth: number,\n outputHeight: number,\n sourceWidth: number,\n sourceHeight: number,\n): void {\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n ctx.clearRect(0, 0, outputWidth, outputHeight)\n\n const crop = computeCenterCropRect(\n sourceWidth,\n sourceHeight,\n outputWidth / outputHeight,\n )\n\n ctx.drawImage(\n source,\n crop.x,\n crop.y,\n crop.width,\n crop.height,\n 0,\n 0,\n outputWidth,\n outputHeight,\n )\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","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { MEDIA_TIME_EPSILON_S, MEDIA_TIME_LOOP_JUMP_S } from './publish-fps'\nimport { resolveUploadVideoSize } from '../shared/reference-video-size'\nimport type { VideoInputHealth } from '../shared/session-debug'\nimport { drawSourceCenterCrop } from './canvas-frame-draw'\nimport { mountCaptureVideo } from './capture-host'\nimport { estimateVideoFrameRate, resolvePlaybackDrivenEncoderFps } from './video-frame-rate'\n\nconst STALL_CATCHUP_MS = 1500\n\ntype VideoFrameCallbackMetadata = {\n mediaTime: number\n presentedFrames: number\n}\n\ntype VideoWithCaptureStream = HTMLVideoElement & {\n captureStream?: (frameRate?: number) => MediaStream\n mozCaptureStream?: (frameRate?: number) => MediaStream\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => void,\n ) => number\n cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport type VideoFileStreamOptions = {\n loop?: boolean\n muted?: boolean\n playbackRate?: number\n /** @deprecated Upload video is playback-driven; fps is measured from the source file. */\n fps?: number\n /** @deprecated Mobile/web publish fps is derived from the uploaded file. */\n mobile?: boolean\n targetSize?: [number, number]\n i18n?: SDKI18n\n onHealthReport?: (health: VideoInputHealth) => void\n healthIntervalMs?: number\n /** Log each canvas draw (proxy for frames fed to RTC captureStream). */\n logPublishFrames?: boolean\n}\n\nexport type VideoFileStream = {\n url: string\n /** Same MediaStream pushed to RTC; bind to preview via srcObject for WYSIWYG. */\n previewStream: MediaStream\n /** Capture-only element; pinned off-screen. */\n videoEl: HTMLVideoElement\n videoTrack: MediaStreamTrack\n /** Measured source fps — encoder ceiling hint only. */\n fps: number\n /** Session publish dimensions (native source size by default). */\n width: number\n height: number\n /** Original media dimensions before scale. */\n sourceWidth: number\n sourceHeight: number\n destroy: () => void\n}\n\nfunction shouldSampleAtMediaTime(lastMediaTimeS: number, mediaTimeS: number): boolean {\n if (!Number.isFinite(mediaTimeS) || mediaTimeS < 0) {\n return false\n }\n if (lastMediaTimeS < 0) {\n return true\n }\n if (mediaTimeS + MEDIA_TIME_LOOP_JUMP_S < lastMediaTimeS) {\n return true\n }\n return mediaTimeS > lastMediaTimeS + MEDIA_TIME_EPSILON_S\n}\n\n/** Lightweight fingerprint — 3 pixel samples to verify frame content changes. */\nfunction sampleCanvasFingerprint(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n): string {\n const points: Array<[number, number]> = [\n [0, 0],\n [Math.max(0, (width >> 1) - 1), Math.max(0, (height >> 1) - 1)],\n [Math.max(0, width - 1), Math.max(0, height - 1)],\n ]\n\n return points\n .map(([x, y]) => {\n const data = ctx.getImageData(x, y, 1, 1).data\n return `${data[0]},${data[1]},${data[2]}`\n })\n .join('|')\n}\n\nasync function applyPublishTrackConstraints(\n track: MediaStreamTrack,\n width: number,\n height: number,\n): Promise<void> {\n if (typeof track.applyConstraints !== 'function') {\n return\n }\n\n try {\n await track.applyConstraints({\n width: { ideal: width, max: width },\n height: { ideal: height, max: height },\n })\n } catch {\n // Some browsers reject exact constraints on captureStream tracks.\n }\n}\n\nexport async function createVideoFileStream(\n fileOrUrl: File | string,\n options: VideoFileStreamOptions = {},\n): Promise<VideoFileStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const isUrl = typeof fileOrUrl === 'string'\n const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n const videoEl = document.createElement('video')\n\n videoEl.muted = options.muted ?? true\n videoEl.playsInline = true\n\n if (isUrl) {\n videoEl.crossOrigin = 'anonymous'\n }\n videoEl.src = url\n videoEl.loop = options.loop ?? true\n videoEl.autoplay = true\n\n mountCaptureVideo(videoEl)\n\n try {\n videoEl.load()\n await waitForEvent(videoEl, 'loadedmetadata')\n await waitForCanPlay(videoEl)\n } catch (error) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw error\n }\n\n if (typeof options.playbackRate === 'number') {\n videoEl.playbackRate = options.playbackRate\n }\n\n await startVideoPlayback(videoEl, i18n)\n\n const sourceWidth = videoEl.videoWidth || 0\n const sourceHeight = videoEl.videoHeight || 0\n if (!sourceWidth || !sourceHeight) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const measuredFps = typeof options.fps === 'number' && options.fps > 0\n ? options.fps\n : await estimateVideoFrameRate(videoEl)\n\n const [outputWidth, outputHeight] = options.targetSize\n ?? resolveUploadVideoSize(sourceWidth, sourceHeight)\n\n const canvas = document.createElement('canvas')\n canvas.width = outputWidth\n canvas.height = outputHeight\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n const captureStreamFn =\n (canvas as HTMLCanvasElement & { captureStream?: (frameRate?: number) => MediaStream }).captureStream\n ?? (canvas as HTMLCanvasElement & { mozCaptureStream?: (frameRate?: number) => MediaStream }).mozCaptureStream\n\n if (!captureStreamFn) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n // One canvas redraw per advanced mediaTime — captureStream emits only when canvas changes.\n const previewStream = captureStreamFn.call(canvas)\n const videoTrack = previewStream.getVideoTracks()[0]\n\n if (!videoTrack) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const publishFps = resolvePlaybackDrivenEncoderFps(videoTrack, measuredFps)\n await applyPublishTrackConstraints(videoTrack, outputWidth, outputHeight)\n\n let destroyed = false\n let lastAdvanceAt = Date.now()\n let lastDrawMediaTimeS = -1\n let videoFrameCallbackId: number | null = null\n let rafId: number | null = null\n const logPublishFrames = options.logPublishFrames ?? false\n let publishFrameIndex = 0\n let lastPublishWallMs = 0\n let lastPublishMediaTimeS = -1\n let publishFramesInWindow = 0\n let publishWindowStartMs = 0\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n drawSourceCenterCrop(\n ctx,\n videoEl,\n outputWidth,\n outputHeight,\n sourceWidth,\n sourceHeight,\n )\n }\n\n const logPublishedFrame = (mediaTimeS: number, presentedFrames?: number) => {\n if (!logPublishFrames) {\n return\n }\n\n publishFrameIndex += 1\n const wallNowMs = performance.now()\n const wallDeltaMs = lastPublishWallMs > 0 ? wallNowMs - lastPublishWallMs : 0\n const mediaDeltaS = lastPublishMediaTimeS >= 0 ? mediaTimeS - lastPublishMediaTimeS : 0\n lastPublishWallMs = wallNowMs\n lastPublishMediaTimeS = mediaTimeS\n\n publishFramesInWindow += 1\n if (publishWindowStartMs === 0) {\n publishWindowStartMs = wallNowMs\n }\n\n const fingerprint = sampleCanvasFingerprint(ctx, outputWidth, outputHeight)\n console.warn('[upload-video → publishFrame]', {\n frameIndex: publishFrameIndex,\n mediaTimeS: Number(mediaTimeS.toFixed(4)),\n mediaDeltaS: Number(mediaDeltaS.toFixed(4)),\n wallDeltaMs: Number(wallDeltaMs.toFixed(1)),\n effectiveFps: wallDeltaMs > 0 ? Number((1000 / wallDeltaMs).toFixed(1)) : null,\n presentedFrames,\n size: `${outputWidth}×${outputHeight}`,\n fingerprint,\n })\n\n const windowElapsedMs = wallNowMs - publishWindowStartMs\n if (windowElapsedMs >= 1000) {\n console.warn('[upload-video → publishFps]', {\n framesInLast1s: publishFramesInWindow,\n avgFps: Number((publishFramesInWindow / (windowElapsedMs / 1000)).toFixed(2)),\n videoCurrentTime: Number(videoEl.currentTime.toFixed(4)),\n videoPaused: videoEl.paused,\n videoReadyState: videoEl.readyState,\n })\n publishFramesInWindow = 0\n publishWindowStartMs = wallNowMs\n }\n }\n\n const onPlaybackSample = (mediaTimeS: number, presentedFrames?: number) => {\n if (destroyed || !shouldSampleAtMediaTime(lastDrawMediaTimeS, mediaTimeS)) {\n return\n }\n lastDrawMediaTimeS = mediaTimeS\n lastAdvanceAt = Date.now()\n drawFrame()\n logPublishedFrame(mediaTimeS, presentedFrames)\n }\n\n const schedulePlaybackWatch = () => {\n if (destroyed) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n videoFrameCallbackId = video.requestVideoFrameCallback!((_now, metadata) => {\n onPlaybackSample(metadata.mediaTime, metadata.presentedFrames)\n schedulePlaybackWatch()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n onPlaybackSample(videoEl.currentTime)\n schedulePlaybackWatch()\n })\n }\n\n drawFrame()\n logPublishedFrame(videoEl.currentTime)\n schedulePlaybackWatch()\n\n const ensurePlaying = () => {\n if (destroyed) {\n return\n }\n if (videoEl.ended && videoEl.loop) {\n videoEl.currentTime = 0\n lastDrawMediaTimeS = -1\n }\n if (videoEl.paused) {\n void videoEl.play().catch(() => undefined)\n }\n }\n\n const markAdvance = () => {\n lastAdvanceAt = Date.now()\n }\n\n videoEl.addEventListener('timeupdate', markAdvance)\n videoEl.addEventListener('pause', ensurePlaying)\n videoEl.addEventListener('ended', ensurePlaying)\n videoEl.addEventListener('stalled', ensurePlaying)\n videoEl.addEventListener('waiting', ensurePlaying)\n\n if (logPublishFrames) {\n const logPlaybackEvent = (eventName: string) => {\n console.warn('[upload-video → playbackEvent]', {\n event: eventName,\n currentTime: Number(videoEl.currentTime.toFixed(4)),\n readyState: videoEl.readyState,\n paused: videoEl.paused,\n })\n }\n videoEl.addEventListener('waiting', () => logPlaybackEvent('waiting'))\n videoEl.addEventListener('stalled', () => logPlaybackEvent('stalled'))\n }\n\n const healthIntervalMs = options.healthIntervalMs ?? 3000\n let healthTimer: ReturnType<typeof setInterval> | null = null\n\n if (options.onHealthReport) {\n const reportHealth = options.onHealthReport\n healthTimer = setInterval(() => {\n ensurePlaying()\n\n const now = Date.now()\n const currentTime = videoEl.currentTime\n const duration = videoEl.duration\n const nearEnd = duration > 0 && currentTime >= duration - 0.2\n const stalled = !videoEl.paused && !videoEl.ended && !nearEnd && now - lastAdvanceAt >= healthIntervalMs\n\n if (stalled && now - lastAdvanceAt >= STALL_CATCHUP_MS) {\n void videoEl.play().catch(() => undefined)\n }\n\n reportHealth({\n currentTime,\n duration,\n paused: videoEl.paused,\n ended: videoEl.ended,\n readyState: videoEl.readyState,\n trackReadyState: videoTrack.readyState,\n trackMuted: videoTrack.muted,\n stalled,\n timeSinceAdvanceMs: now - lastAdvanceAt,\n })\n }, healthIntervalMs)\n }\n\n const destroy = () => {\n destroyed = true\n videoEl.removeEventListener('timeupdate', markAdvance)\n videoEl.removeEventListener('pause', ensurePlaying)\n videoEl.removeEventListener('ended', ensurePlaying)\n videoEl.removeEventListener('stalled', ensurePlaying)\n videoEl.removeEventListener('waiting', ensurePlaying)\n\n const video = videoEl as VideoWithFrameCallback\n if (videoFrameCallbackId !== null) {\n video.cancelVideoFrameCallback?.(videoFrameCallbackId)\n videoFrameCallbackId = null\n }\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n rafId = null\n }\n\n if (healthTimer !== null) {\n clearInterval(healthTimer)\n healthTimer = null\n }\n\n try {\n videoEl.pause()\n } catch {\n }\n\n try {\n videoTrack.stop()\n } catch {\n }\n\n try {\n previewStream.getTracks().forEach((track) => {\n if (track.readyState !== 'ended') {\n track.stop()\n }\n })\n } catch {\n }\n\n try {\n videoEl.remove()\n } catch {\n }\n\n try {\n videoEl.src = ''\n videoEl.load()\n } catch {\n }\n\n if (!isUrl) URL.revokeObjectURL(url)\n }\n\n return {\n url,\n previewStream,\n videoEl,\n videoTrack,\n fps: publishFps,\n width: outputWidth,\n height: outputHeight,\n sourceWidth,\n sourceHeight,\n destroy,\n }\n}\n\nfunction waitForEvent<T extends HTMLElement>(\n el: T,\n eventName: keyof HTMLElementEventMap,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const onOk = () => {\n cleanup()\n resolve()\n }\n\n const onErr = (e: Event) => {\n cleanup()\n // If it's a media error and we can read the code, include it\n const mediaEl = el as unknown as HTMLMediaElement\n const code = mediaEl.error ? mediaEl.error.code : 'unknown'\n const message = mediaEl.error ? mediaEl.error.message : 'no message'\n const src = mediaEl.src || 'unknown src'\n reject(new Error(`failed to load video metadata: ${String(eventName)} (code: ${code}, message: ${message}, src: ${src})`))\n }\n\n const cleanup = () => {\n el.removeEventListener(eventName, onOk as EventListener)\n el.removeEventListener('error', onErr as EventListener)\n }\n\n el.addEventListener(eventName, onOk as EventListener, { once: true })\n el.addEventListener('error', onErr as EventListener, { once: true })\n })\n}\n\nfunction waitForCanPlay(videoEl: HTMLVideoElement): Promise<void> {\n if (videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n return Promise.resolve()\n }\n\n return new Promise((resolve) => {\n const onReady = () => {\n cleanup()\n resolve()\n }\n\n const cleanup = () => {\n videoEl.removeEventListener('canplay', onReady)\n videoEl.removeEventListener('loadeddata', onReady)\n }\n\n videoEl.addEventListener('canplay', onReady, { once: true })\n videoEl.addEventListener('loadeddata', onReady, { once: true })\n })\n}\n\nasync function startVideoPlayback(videoEl: HTMLVideoElement, i18n: SDKI18n): Promise<void> {\n try {\n const playResult = videoEl.play()\n if (playResult && typeof (playResult as Promise<void>).then === 'function') {\n await playResult\n }\n } catch {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n\n try {\n await waitForPlaying(videoEl)\n } catch {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n\n if (videoEl.paused || videoEl.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n}\n\nfunction waitForPlaying(videoEl: HTMLVideoElement): Promise<void> {\n if (!videoEl.paused && videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const onPlaying = () => {\n cleanup()\n resolve()\n }\n\n const onErr = () => {\n cleanup()\n reject(new Error('video playback failed'))\n }\n\n const cleanup = () => {\n videoEl.removeEventListener('playing', onPlaying)\n videoEl.removeEventListener('error', onErr)\n }\n\n videoEl.addEventListener('playing', onPlaying, { once: true })\n videoEl.addEventListener('error', onErr, { once: true })\n })\n}\n","export type CameraCaptureOptions = {\n width: number\n height: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n}\n\n/** Camera control fields from Media Capture extensions; not in default lib.dom typings. */\nexport type CameraTrackCapabilities = MediaTrackCapabilities & {\n focusMode?: string[]\n focusDistance?: { min: number; max: number; step?: number }\n zoom?: { min: number; max: number; step?: number }\n}\n\nexport type CameraTrackSettings = MediaTrackSettings & {\n focusDistance?: number\n}\n\ntype CameraTrackConstraintSet = MediaTrackConstraintSet & {\n focusMode?: string\n focusDistance?: number\n zoom?: number\n}\n\nconst CAMERA_ACCESS_ERROR_NAMES = new Set([\n 'NotFoundError',\n 'NotAllowedError',\n 'PermissionDeniedError',\n 'NotReadableError',\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError',\n 'AbortError',\n 'SecurityError',\n])\n\nexport type CameraEnvironmentIssue = 'insecure-context' | 'api-unavailable'\n\n/** Detect blockers before calling getUserMedia (HTTP hides mediaDevices in Chrome). */\nexport function getCameraEnvironmentIssue(): CameraEnvironmentIssue | null {\n if (typeof window === 'undefined') {\n return 'api-unavailable'\n }\n if (!window.isSecureContext) {\n return 'insecure-context'\n }\n if (typeof navigator?.mediaDevices?.getUserMedia !== 'function') {\n return 'api-unavailable'\n }\n return null\n}\n\nexport type CameraAccessErrorKind =\n | 'not-found'\n | 'not-allowed'\n | 'permission-denied'\n | 'in-use'\n | 'overconstrained'\n | 'unsupported'\n | 'capture-unsupported'\n | 'generic'\n\n/** True for getUserMedia failures that should prompt the user to open/allow the device camera. */\nexport function isCameraAccessError(error: unknown): boolean {\n return classifyCameraAccessError(error) !== null\n}\n\n/** Map getUserMedia / camera pipeline failures to a stable category for user-facing copy. */\nexport function classifyCameraAccessError(error: unknown): CameraAccessErrorKind | null {\n if (error instanceof DOMException) {\n switch (error.name) {\n case 'NotFoundError':\n return 'not-found'\n case 'NotAllowedError':\n return 'not-allowed'\n case 'PermissionDeniedError':\n return 'permission-denied'\n case 'NotReadableError':\n return 'in-use'\n case 'OverconstrainedError':\n case 'ConstraintNotSatisfiedError':\n return 'overconstrained'\n case 'TypeError':\n return 'generic'\n case 'AbortError':\n case 'SecurityError':\n return 'generic'\n default:\n if (CAMERA_ACCESS_ERROR_NAMES.has(error.name)) {\n return 'generic'\n }\n return null\n }\n }\n\n if (error instanceof Error) {\n if (error.message.includes('Camera is not supported')) {\n return 'unsupported'\n }\n if (error.message.includes('captureStream is not supported')) {\n return 'capture-unsupported'\n }\n if (error.message.includes('No active video track')) {\n return 'in-use'\n }\n }\n\n return null\n}\n\nfunction buildVideoConstraints(\n options: CameraCaptureOptions,\n resolution: 'min' | 'ideal',\n): MediaTrackConstraints {\n const size =\n resolution === 'min'\n ? { width: { min: options.width, ideal: options.width }, height: { min: options.height, ideal: options.height } }\n : { width: { ideal: options.width }, height: { ideal: options.height } }\n\n return {\n ...size,\n frameRate: { ideal: options.frameRate ?? 30 },\n ...(options.facingMode !== undefined ? { facingMode: options.facingMode } : {}),\n }\n}\n\nfunction isOverconstrainedCameraError(error: unknown): boolean {\n if (!(error instanceof DOMException)) {\n return false\n }\n return error.name === 'OverconstrainedError' || error.name === 'ConstraintNotSatisfiedError'\n}\n\nfunction isEnvironmentFacing(facingMode?: ConstrainDOMString): boolean {\n if (facingMode === 'environment') {\n return true\n }\n if (typeof facingMode === 'object' && facingMode !== null && 'exact' in facingMode) {\n return facingMode.exact === 'environment'\n }\n return false\n}\n\nfunction waitTwoAnimationFrames(): Promise<void> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))\n })\n}\n\n/**\n * Best-effort stabilization for rear camera AF hunting when objects move in frame.\n * - Android: lock focus after initial settle (single-shot, else manual distance).\n * - iOS / others: lock zoom to 1x when supported (Safari 17+); focus APIs are unavailable.\n */\nexport async function stabilizeCameraVideoTrack(\n track: MediaStreamTrack,\n options?: { facingMode?: ConstrainDOMString },\n): Promise<void> {\n if (!isEnvironmentFacing(options?.facingMode)) {\n return\n }\n\n const caps = track.getCapabilities?.() as CameraTrackCapabilities | undefined\n if (!caps) {\n return\n }\n\n const advanced: CameraTrackConstraintSet[] = []\n\n if (Array.isArray(caps.focusMode)) {\n if (caps.focusMode.includes('single-shot')) {\n advanced.push({ focusMode: 'single-shot' })\n } else if (caps.focusMode.includes('manual') && caps.focusDistance) {\n const settings = track.getSettings?.() as CameraTrackSettings | undefined\n const { min, max } = caps.focusDistance\n const distance =\n typeof settings?.focusDistance === 'number'\n ? settings.focusDistance\n : Math.min(max, Math.max(min, 1))\n advanced.push({ focusMode: 'manual', focusDistance: distance })\n }\n }\n\n if (caps.zoom && typeof caps.zoom.min === 'number' && typeof caps.zoom.max === 'number') {\n const zoom = 1\n if (zoom >= caps.zoom.min && zoom <= caps.zoom.max) {\n advanced.push({ zoom })\n }\n }\n\n if (advanced.length === 0) {\n return\n }\n\n try {\n await track.applyConstraints({ advanced })\n } catch {\n // Unsupported constraint combinations — ignore and keep the original stream.\n }\n}\n\nasync function openCameraStream(options: CameraCaptureOptions): Promise<MediaStream> {\n try {\n return await navigator.mediaDevices.getUserMedia({\n audio: false,\n video: buildVideoConstraints(options, 'min'),\n })\n } catch (error) {\n if (!isOverconstrainedCameraError(error)) {\n throw error\n }\n\n return navigator.mediaDevices.getUserMedia({\n audio: false,\n video: buildVideoConstraints(options, 'ideal'),\n })\n }\n}\n\n/** Prefer target resolution via min constraints; fall back to ideal-only when unsupported. */\nexport async function requestCameraMediaStream(options: CameraCaptureOptions): Promise<MediaStream> {\n const environmentIssue = getCameraEnvironmentIssue()\n if (environmentIssue === 'insecure-context') {\n throw new DOMException('Camera requires a secure context (HTTPS).', 'SecurityError')\n }\n if (environmentIssue === 'api-unavailable') {\n throw new Error('Camera is not supported in this browser.')\n }\n\n const stream = await openCameraStream(options)\n const track = stream.getVideoTracks()[0]\n\n if (track && isEnvironmentFacing(options.facingMode)) {\n await waitTwoAnimationFrames()\n await stabilizeCameraVideoTrack(track, { facingMode: options.facingMode })\n }\n\n return stream\n}","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { mountCaptureVideo } from './capture-host'\n\nexport type NativeCameraStream = {\n sourceStream: MediaStream\n previewStream: MediaStream\n videoTrack: MediaStreamTrack\n videoEl: HTMLVideoElement\n width: number\n height: number\n destroy: () => void\n}\n\nexport type OpenNativeCameraStreamOptions = {\n width?: number\n height?: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n i18n?: SDKI18n\n}\n\nexport async function openNativeCameraStream(\n options: OpenNativeCameraStreamOptions = {},\n): Promise<NativeCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n\n // Default to 16:9 720p (1280x720) for V2\n const stream = await requestCameraMediaStream({\n width: options.width ?? 1280,\n height: options.height ?? 720,\n frameRate: options.frameRate ?? 30,\n facingMode: options.facingMode ?? 'user',\n })\n\n return createNativeCameraStream(stream, { i18n })\n}\n\nexport async function createNativeCameraStream(\n sourceStream: MediaStream,\n options: { i18n?: SDKI18n } = {},\n): Promise<NativeCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const sourceTrack = sourceStream.getVideoTracks()[0]\n if (!sourceTrack) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const videoEl = document.createElement('video')\n videoEl.playsInline = true\n videoEl.muted = true\n videoEl.autoplay = true\n videoEl.srcObject = sourceStream\n mountCaptureVideo(videoEl)\n\n await new Promise<void>((resolve, reject) => {\n const onOk = () => {\n cleanup()\n resolve()\n }\n const onErr = () => {\n cleanup()\n reject(new Error(`failed to load video metadata`))\n }\n const cleanup = () => {\n videoEl.removeEventListener('loadedmetadata', onOk)\n videoEl.removeEventListener('error', onErr)\n }\n videoEl.addEventListener('loadedmetadata', onOk, { once: true })\n videoEl.addEventListener('error', onErr, { once: true })\n })\n\n const playResult = videoEl.play()\n if (playResult && typeof playResult.then === 'function') {\n await playResult\n }\n\n const width = videoEl.videoWidth || 0\n const height = videoEl.videoHeight || 0\n if (!width || !height) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const destroy = () => {\n try {\n videoEl.pause()\n } catch {}\n try {\n videoTrack.stop()\n } catch {}\n try {\n sourceStream.getTracks().forEach((track) => {\n if (track.readyState !== 'ended') {\n track.stop()\n }\n })\n } catch {}\n try {\n videoEl.srcObject = null\n videoEl.remove()\n } catch {}\n }\n\n const videoTrack = sourceTrack\n\n return {\n sourceStream,\n previewStream: sourceStream, // No canvas mirror, preview is the raw stream\n videoTrack,\n videoEl,\n width,\n height,\n destroy,\n }\n}\n","import type { RealtimeModel } from './types'\n\nconst DEFAULT_REALTIME_SIZE = {\n width: 1280,\n height: 960,\n fps: 24,\n} as const\n\nexport const models = {\n realtime(\n name: string,\n options?: {\n width?: number\n height?: number\n fps?: number\n },\n ): RealtimeModel {\n return {\n name,\n width: options?.width ?? DEFAULT_REALTIME_SIZE.width,\n height: options?.height ?? DEFAULT_REALTIME_SIZE.height,\n fps: options?.fps ?? DEFAULT_REALTIME_SIZE.fps,\n }\n },\n}\n","export type SessionDebugCategory = 'lifecycle' | 'video-input' | 'sei' | 'rtc' | 'output'\n\nexport type SessionDebugEntry = {\n scope: 'client' | 'rtc'\n level: 'info' | 'success' | 'warn' | 'error'\n message: string\n data?: unknown\n}\n\nexport type SessionDebugLogger = (\n category: SessionDebugCategory,\n level: SessionDebugEntry['level'],\n message: string,\n data?: unknown,\n) => void\n\nexport function createSessionDebugLogger(\n enabled: boolean,\n onLog?: (entry: SessionDebugEntry) => void,\n): SessionDebugLogger {\n return (category, level, message, data) => {\n if (!enabled || !onLog) {\n return\n }\n const scope: SessionDebugEntry['scope'] =\n category === 'rtc' || category === 'sei' ? 'rtc' : 'client'\n onLog({\n scope,\n level,\n message: `[${category}] ${message}`,\n data,\n })\n }\n}\n\nexport type VideoInputHealth = {\n currentTime: number\n duration: number\n paused: boolean\n ended: boolean\n readyState: number\n trackReadyState: string\n trackMuted: boolean\n stalled: boolean\n timeSinceAdvanceMs: number\n}\n\nexport type SeiGateSnapshot = {\n expectedSei: string | null\n sei: string | null\n userId: string | null\n matched: boolean\n}\n\nexport type OutputVisibilitySnapshot = {\n outputEnabled: boolean\n hasResult: boolean\n showOutputVideo: boolean\n remoteVideoUserId: string | null\n localVideoPublished: boolean\n inputSource: string\n seiMatched: boolean\n expectedSei: string | null\n lastSei: string | null\n}\n\nexport function seiGateChanged(prev: SeiGateSnapshot | null, next: SeiGateSnapshot): boolean {\n if (!prev) {\n return true\n }\n return (\n prev.matched !== next.matched ||\n prev.expectedSei !== next.expectedSei ||\n prev.sei !== next.sei ||\n prev.userId !== next.userId\n )\n}\n\nexport function outputVisibilityChanged(\n prev: OutputVisibilitySnapshot | null,\n next: OutputVisibilitySnapshot,\n): boolean {\n if (!prev) {\n return true\n }\n return (\n prev.showOutputVideo !== next.showOutputVideo ||\n prev.outputEnabled !== next.outputEnabled ||\n prev.hasResult !== next.hasResult ||\n prev.remoteVideoUserId !== next.remoteVideoUserId ||\n prev.localVideoPublished !== next.localVideoPublished ||\n prev.inputSource !== next.inputSource ||\n prev.seiMatched !== next.seiMatched\n )\n}\n\nexport function isVideoInputUnhealthy(health: VideoInputHealth): boolean {\n return health.stalled || health.paused || health.ended || health.trackReadyState === 'ended'\n}\n\nexport function videoInputHealthChanged(\n prev: VideoInputHealth | null,\n next: VideoInputHealth,\n): boolean {\n if (!prev) {\n return isVideoInputUnhealthy(next)\n }\n const prevBad = isVideoInputUnhealthy(prev)\n const nextBad = isVideoInputUnhealthy(next)\n if (prevBad !== nextBad) {\n return true\n }\n if (nextBad) {\n return (\n prev.stalled !== next.stalled ||\n prev.paused !== next.paused ||\n prev.ended !== next.ended ||\n prev.trackReadyState !== next.trackReadyState\n )\n }\n return false\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n ACTIVE_STATUS,\n type UploadImageResult,\n XmaxOpenClient,\n} from '../sdk/client'\nimport { createSDKI18n } from '../i18n'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager, type RtcStateSnapshot } from '../rtc/rtc-manager'\nimport { isMobilePublishEnvironment } from '../rtc/publish-fps'\nimport { createVideoFileStream, type VideoFileStream } from '../rtc/video-file-stream'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { models } from '../realtime/models'\nimport type { XmaxConfig, XmaxContextValue, XmaxSeiGateState } from './types'\nimport { notifyError } from '../shared/error-utils'\nimport { browserToast } from '../shared/browser-toast'\nimport { createSessionDebugLogger, outputVisibilityChanged, seiGateChanged, videoInputHealthChanged, type OutputVisibilitySnapshot, type SeiGateSnapshot, type VideoInputHealth } from '../shared/session-debug'\n\nconst XmaxContext = createContext<XmaxContextValue | null>(null)\n\nconst createDefaultRtcSnapshot = (): RtcStateSnapshot => ({\n roomId: null,\n userId: null,\n appId: null,\n botUserId: null,\n joined: false,\n localVideoPublished: false,\n remoteVideoUserId: null,\n users: [],\n})\n\nconst createDefaultSeiGateState = (): XmaxSeiGateState => ({\n expectedSei: null,\n sei: null,\n userId: null,\n matched: true,\n})\n\nexport function XmaxProvider({ config, children }: { config: XmaxConfig; children: ReactNode }) {\n const sdkI18n = useMemo(() => config.i18n ?? createSDKI18n({ locale: config.locale }), [config.i18n, config.locale])\n const debugEnabled = config.debug ?? false\n const debugLog = useMemo(\n () => createSessionDebugLogger(debugEnabled, config.onLog),\n [config.onLog, debugEnabled],\n )\n const debugLogRef = useRef(debugLog)\n debugLogRef.current = debugLog\n const debugEnabledRef = useRef(debugEnabled)\n debugEnabledRef.current = debugEnabled\n const prevSeiGateRef = useRef<SeiGateSnapshot | null>(null)\n const prevOutputVisibilityRef = useRef<OutputVisibilitySnapshot | null>(null)\n const prevVideoHealthRef = useRef<VideoInputHealth | null>(null)\n\n const resetDebugSnapshots = useCallback(() => {\n prevSeiGateRef.current = null\n prevOutputVisibilityRef.current = null\n prevVideoHealthRef.current = null\n }, [])\n const externalOnError = config.onError\n const clientRef = useRef<XmaxOpenClient | null>(null)\n const sessionUidRef = useRef<string | null>(null)\n const taskUidRef = useRef<string | null>(null)\n const lastStartPromptRef = useRef<string | undefined>(undefined)\n const lastStartModelRef = useRef<string>('')\n const lastStartRefImageRef = useRef<string | undefined>(undefined)\n const videoFileStreamRef = useRef<VideoFileStream | null>(null)\n const cameraStreamRef = useRef<NativeCameraStream | null>(null)\n const localVideoSizeRef = useRef<{ width: number; height: number } | null>(null)\n const inputSourceRef = useRef<'none' | 'camera' | 'video'>('none')\n const disconnectRef = useRef<(() => Promise<void>) | null>(null)\n const disconnectPromiseRef = useRef<Promise<void> | null>(null)\n const localContainerRef = useRef<HTMLElement | null>(null)\n const remoteContainerRef = useRef<HTMLElement | null>(null)\n const outputEnabledRef = useRef(false)\n const activeModeCodeRef = useRef<null>(null)\n const onRemoteOutputStalledRef = useRef<((info: { userId: string; stallMs: number }) => void) | null>(null)\n\n const [rtcState, setRtcState] = useState<RtcStateSnapshot>(createDefaultRtcSnapshot)\n const [inputSource, setInputSource] = useState<'none' | 'camera' | 'video'>('none')\n const [isCameraOn, setIsCameraOn] = useState(false)\n const [isRecording, setIsRecording] = useState(false)\n const [isGenerating, setIsGenerating] = useState(false)\n const [hasResult, setHasResult] = useState(false)\n const [outputEnabled, setOutputEnabled] = useState(false)\n const [activeModeCode, setActiveModeCode] = useState<null>(null)\n const [localVideoSize, setLocalVideoSize] = useState<{ width: number; height: number } | null>(null)\n const [sessionTargetSize, setSessionTargetSize] = useState<[number, number] | null>(null)\n const [seiGate, setSeiGate] = useState<XmaxSeiGateState>(createDefaultSeiGateState)\n\n inputSourceRef.current = inputSource\n localVideoSizeRef.current = localVideoSize\n outputEnabledRef.current = outputEnabled\n activeModeCodeRef.current = activeModeCode\n\n const ensureLocalVideoContainer = useCallback(() => {\n const rtc = rtcManagerRef.current\n const container = localContainerRef.current\n if (!rtc || !container) {\n return\n }\n rtc.setLocalVideoContainer(container)\n }, [])\n\n const bindRemoteContainer = useCallback(() => {\n const rtc = rtcManagerRef.current\n const container = remoteContainerRef.current\n if (!rtc || !container) {\n return\n }\n rtc.setRemoteVideoContainer(container)\n void rtc.refreshRemoteVideoBinding()\n }, [])\n\n const detachRemoteContainer = useCallback(() => {\n rtcManagerRef.current?.setRemoteVideoContainer(null)\n }, [])\n\n const notifyUserError = useCallback((message: string, error?: unknown) => {\n if (externalOnError) {\n externalOnError(message, error)\n return\n }\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n browserToast.error(message)\n }\n }, [externalOnError])\n\n const reportError = useCallback((error: unknown, fallbackMessage?: string) => {\n return notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }, [notifyUserError, sdkI18n])\n\n const rtcManagerRef = useRef<RtcManager | null>(null)\n if (!rtcManagerRef.current) {\n rtcManagerRef.current = new RtcManager({\n onStateChange: (state) => setRtcState(state),\n onSeiGateChange: (state) => {\n setSeiGate(state)\n if (debugEnabledRef.current && seiGateChanged(prevSeiGateRef.current, state)) {\n debugLogRef.current('sei', state.matched ? 'success' : 'warn', 'gate change', state)\n prevSeiGateRef.current = state\n }\n },\n onLog: (entry) => config.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteOutputStalled: (info) => onRemoteOutputStalledRef.current?.(info),\n debug: debugEnabled,\n i18n: sdkI18n,\n })\n }\n\n const getClient = useCallback(() => {\n const existing = clientRef.current\n if (existing) {\n return existing\n }\n const created = new XmaxOpenClient({\n apiKey: config.apiKey,\n authToken: config.authToken,\n baseUrl: config.baseUrl,\n locale: config.locale,\n i18n: sdkI18n,\n onError: notifyUserError,\n })\n clientRef.current = created\n return created\n }, [config.apiKey, config.authToken, config.baseUrl, config.locale, notifyUserError, sdkI18n])\n\n const ensureConnected = useCallback(async () => {\n const client = getClient()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n\n if (rtc.snapshot.joined && sessionUidRef.current) {\n return\n }\n\n const model = config.model ?? 'x2.0'\n const session = await client.createSession(model)\n if (!session.sessionUid?.trim()) {\n throw new Error(sdkI18n.t('errors.sessionUidMissing'))\n }\n sessionUidRef.current = session.sessionUid\n client.startHeartbeat(\n session.sessionUid,\n config.heartbeatIntervalMs ?? 10000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void disconnectRef.current?.()\n }\n },\n () => {\n void disconnectRef.current?.()\n },\n )\n\n const joinInfo = client.getRtcJoinInfo(session)\n await rtc.join(joinInfo)\n ensureLocalVideoContainer()\n }, [config.heartbeatIntervalMs, config.model, ensureLocalVideoContainer, getClient, sdkI18n])\n\n const connect = useCallback(async () => {\n try {\n await ensureConnected()\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, reportError])\n\n const stopPublishing = useCallback(async () => {\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n try {\n await rtc.stopVideoPublishing()\n } catch {\n }\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n setOutputEnabled(false)\n setHasResult(false)\n if (videoFileStreamRef.current) {\n videoFileStreamRef.current.destroy()\n videoFileStreamRef.current = null\n }\n if (cameraStreamRef.current) {\n cameraStreamRef.current.destroy()\n cameraStreamRef.current = null\n }\n setInputSource('none')\n setIsCameraOn(false)\n setIsRecording(false)\n setLocalVideoSize(null)\n localVideoSizeRef.current = null\n setSessionTargetSize(null)\n setSeiGate(createDefaultSeiGateState())\n resetDebugSnapshots()\n debugLogRef.current('lifecycle', 'info', 'stopPublishing', { inputSource: inputSourceRef.current })\n }, [detachRemoteContainer, resetDebugSnapshots])\n\n const stop = useCallback(async () => {\n try {\n const rtc = rtcManagerRef.current\n taskUidRef.current = null\n rtc?.configureSessionSei(null)\n setSeiGate(createDefaultSeiGateState())\n resetDebugSnapshots()\n debugLogRef.current('lifecycle', 'info', 'stop', {})\n\n if (!rtc?.snapshot.joined) {\n rtc?.clearRemoteVideo()\n detachRemoteContainer()\n setHasResult(false)\n setOutputEnabled(false)\n return\n }\n try {\n const stopEvent = createStopRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n sessionUid: sessionUidRef.current ?? undefined,\n })\n await rtc.sendRoomEvent(stopEvent)\n } finally {\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n setHasResult(false)\n setOutputEnabled(false)\n }\n } catch (error) {\n throw reportError(error)\n }\n }, [detachRemoteContainer, reportError, resetDebugSnapshots])\n\n const disconnect = useCallback(async () => {\n if (disconnectPromiseRef.current) {\n return disconnectPromiseRef.current\n }\n\n const run = async () => {\n const client = clientRef.current\n const rtc = rtcManagerRef.current\n const activeSessionUid = sessionUidRef.current\n\n client?.beginTeardown()\n\n rtc?.configureSessionSei(null)\n setSeiGate(createDefaultSeiGateState())\n taskUidRef.current = null\n resetDebugSnapshots()\n\n rtc?.clearRemoteVideo()\n\n try {\n await stop()\n } catch {\n }\n\n await stopPublishing()\n\n if (rtc) {\n try {\n rtc.configureSessionSei(null)\n await rtc.leave()\n } catch {\n }\n }\n\n if (client && activeSessionUid) {\n try {\n await client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n client?.endTeardown()\n\n sessionUidRef.current = null\n taskUidRef.current = null\n setHasResult(false)\n setOutputEnabled(false)\n setActiveModeCode(null)\n setSessionTargetSize(null)\n setIsRecording(false)\n detachRemoteContainer()\n setRtcState(createDefaultRtcSnapshot())\n setSeiGate(createDefaultSeiGateState())\n }\n\n const promise = run().finally(() => {\n if (disconnectPromiseRef.current === promise) {\n disconnectPromiseRef.current = null\n }\n })\n disconnectPromiseRef.current = promise\n return promise\n }, [detachRemoteContainer, stop, stopPublishing, resetDebugSnapshots])\n\n disconnectRef.current = disconnect\n\n useEffect(() => {\n return () => {\n void disconnectRef.current?.()\n }\n }, [])\n\n useEffect(() => {\n if (!debugEnabled) {\n return\n }\n const snapshot: OutputVisibilitySnapshot = {\n outputEnabled,\n hasResult,\n showOutputVideo: outputEnabled && (hasResult || !!rtcState.remoteVideoUserId),\n remoteVideoUserId: rtcState.remoteVideoUserId,\n localVideoPublished: rtcState.localVideoPublished,\n inputSource,\n seiMatched: seiGate.matched,\n expectedSei: seiGate.expectedSei,\n lastSei: seiGate.sei,\n }\n if (!outputVisibilityChanged(prevOutputVisibilityRef.current, snapshot)) {\n return\n }\n const level = snapshot.showOutputVideo ? 'info' : 'warn'\n debugLog('output', level, 'visibility change', snapshot)\n prevOutputVisibilityRef.current = snapshot\n }, [\n debugEnabled,\n debugLog,\n outputEnabled,\n hasResult,\n rtcState.remoteVideoUserId,\n rtcState.localVideoPublished,\n inputSource,\n seiGate.matched,\n seiGate.expectedSei,\n seiGate.sei,\n ])\n\n useEffect(() => {\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n if (!outputEnabled) {\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n return\n }\n bindRemoteContainer()\n }, [bindRemoteContainer, detachRemoteContainer, outputEnabled])\n\n const openCamera = useCallback(async (options?: { size?: [number, number] }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n await stopPublishing()\n ensureLocalVideoContainer()\n const defaultCamera = models.realtime('x2.0')\n const cameraHint: [number, number] = options?.size ?? [defaultCamera.width, defaultCamera.height]\n const precomputedSize = resolveUploadVideoSize(cameraHint[0], cameraHint[1])\n setSessionTargetSize(precomputedSize)\n const rawStream = await requestCameraMediaStream({\n width: cameraHint[0],\n height: cameraHint[1],\n frameRate: 30,\n facingMode: 'user',\n })\n const publishStream = await createNativeCameraStream(rawStream)\n cameraStreamRef.current = publishStream\n await rtc.startExternalVideoPublishing(publishStream.videoTrack, precomputedSize, {\n mobile: isMobilePublishEnvironment(),\n highQuality: true,\n })\n const sessionDims = { width: publishStream.width, height: publishStream.height }\n setLocalVideoSize(sessionDims)\n localVideoSizeRef.current = sessionDims\n setSessionTargetSize([sessionDims.width, sessionDims.height])\n setIsCameraOn(true)\n setIsRecording(true)\n setInputSource('camera')\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, ensureLocalVideoContainer, reportError, sdkI18n, stopPublishing])\n\n const closeCamera = useCallback(async () => {\n await disconnect()\n }, [disconnect])\n\n const loadVideoFile = useCallback(async (file: File, options?: { size?: [number, number] }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return null\n }\n await stopPublishing()\n ensureLocalVideoContainer()\n prevVideoHealthRef.current = null\n const stream = await createVideoFileStream(file, {\n muted: true,\n loop: true,\n mobile: isMobilePublishEnvironment(),\n targetSize: options?.size,\n i18n: sdkI18n,\n onHealthReport: debugEnabled\n ? (health) => {\n if (!videoInputHealthChanged(prevVideoHealthRef.current, health)) {\n return\n }\n prevVideoHealthRef.current = health\n const level = health.stalled || health.paused || health.ended ? 'warn' : 'info'\n debugLogRef.current('video-input', level, 'health change', health)\n }\n : undefined,\n })\n if (videoFileStreamRef.current) {\n videoFileStreamRef.current.destroy()\n }\n videoFileStreamRef.current = stream\n await rtc.startExternalVideoPublishing(stream.videoTrack, [stream.width, stream.height], {\n mobile: isMobilePublishEnvironment(),\n fps: stream.fps,\n highQuality: true,\n })\n setInputSource('video')\n setIsCameraOn(true)\n setIsRecording(true)\n debugLogRef.current('lifecycle', 'info', 'loadVideoFile', {\n width: stream.width,\n height: stream.height,\n fileName: file.name,\n })\n if (stream.width && stream.height) {\n const size = { width: stream.width, height: stream.height }\n setLocalVideoSize(size)\n localVideoSizeRef.current = size\n setSessionTargetSize([stream.width, stream.height])\n } else {\n setLocalVideoSize(null)\n localVideoSizeRef.current = null\n }\n const targetSize: [number, number] = [stream.width, stream.height]\n return {\n url: stream.url,\n width: stream.width,\n height: stream.height,\n previewStream: stream.previewStream,\n videoEl: stream.videoEl,\n targetSize,\n }\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, ensureLocalVideoContainer, reportError, sdkI18n, stopPublishing, debugEnabled])\n\n const clearInput = useCallback(async () => {\n await disconnect()\n }, [disconnect])\n\n const uploadImage = useCallback(async (file: File): Promise<UploadImageResult> => {\n try {\n const client = getClient()\n return await client.uploadImage(file)\n } catch (error) {\n throw reportError(error)\n }\n }, [getClient, reportError])\n\n const setRefImage = useCallback(async (input: File | string) => {\n try {\n if (typeof input !== 'string') {\n const result = await uploadImage(input)\n return result.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 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 const result = await uploadImage(file)\n return result.url\n } catch (error) {\n throw reportError(error)\n }\n }, [reportError, uploadImage])\n\n const start = useCallback(async (options: {\n size?: [number, number]\n prompt?: string\n model: string\n /** When set (including `null`), overrides stored ref image for this start event. */\n refImage?: string | null\n extraParams?: Record<string, unknown>\n }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined) {\n return\n }\n\n const refForEvent = options.refImage\n const resolvedPrompt = options.prompt?.trim() ?? ''\n\n setIsGenerating(true)\n rtc.clearRemoteVideo()\n rtc.setRemoteVideoContainer(null)\n setHasResult(false)\n setOutputEnabled(true)\n outputEnabledRef.current = true\n\n const size = resolveSessionTargetSize({\n localVideoSize: localVideoSizeRef.current,\n overrideSize: options.size,\n })\n setSessionTargetSize(size)\n\n const taskUid = createTaskUid()\n taskUidRef.current = taskUid\n lastStartPromptRef.current = resolvedPrompt || undefined\n lastStartModelRef.current = options.model\n lastStartRefImageRef.current = refForEvent?.trim() || undefined\n prevSeiGateRef.current = null\n rtc.configureSessionSei(taskUid)\n debugLogRef.current('lifecycle', 'info', 'start', {\n taskUid,\n size,\n inputSource: inputSourceRef.current,\n })\n const startEvent = createStartRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: options.model,\n size,\n prompt: resolvedPrompt || undefined,\n extraParams: options.extraParams,\n refImagePath: refForEvent?.trim() || undefined,\n })\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.ensurePublishedInputBeforeStart()\n await rtc.sendRoomEvent(startEvent)\n await rtc.refreshRemoteVideoBinding({ force: true })\n setHasResult(true)\n } catch (error) {\n setOutputEnabled(false)\n throw reportError(error)\n } finally {\n setIsGenerating(false)\n }\n }, [ensureConnected, reportError])\n\n const sendTracks = useCallback(async (options: { tracks: Array<[number, number]> }) => {\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined) {\n return\n }\n const activeTaskUid = taskUidRef.current\n if (!activeTaskUid) {\n return\n }\n console.log('[Xmax] sendTracks', {\n taskUid: activeTaskUid,\n targetSize: sessionTargetSize,\n tracks: options.tracks,\n })\n try {\n const event = createTracksRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: activeTaskUid,\n sessionUid: activeTaskUid,\n tracks: options.tracks,\n })\n await rtc.sendRoomEvent(event)\n } catch {\n // Track sending is best-effort for live interaction.\n }\n }, [sessionTargetSize])\n\n const recoverGeneration = useCallback(async () => {\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined || !outputEnabledRef.current) {\n return\n }\n\n try {\n debugLogRef.current('lifecycle', 'warn', 'recoverGeneration', {\n inputSource: inputSourceRef.current,\n })\n\n const taskUid = createTaskUid()\n taskUidRef.current = taskUid\n prevSeiGateRef.current = null\n\n const size = resolveSessionTargetSize({\n localVideoSize: localVideoSizeRef.current,\n })\n\n const startEvent = createStartRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: lastStartModelRef.current,\n size,\n prompt: lastStartPromptRef.current,\n refImagePath: lastStartRefImageRef.current,\n })\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.sendRoomEvent(startEvent)\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.refreshRemoteVideoBinding({ force: true })\n } catch (error) {\n reportError(error)\n }\n }, [reportError])\n\n useEffect(() => {\n onRemoteOutputStalledRef.current = (info) => {\n debugLogRef.current('lifecycle', 'warn', 'remote output stalled', info)\n }\n }, [])\n\n /** @deprecated Mode switching is handled by stop + start with new prompt/refImage. */\n const changeModel = useCallback(async () => {\n return\n }, [])\n\n const bindLocalView = useCallback((el: HTMLElement | null) => {\n localContainerRef.current = el\n rtcManagerRef.current?.setLocalVideoContainer(el)\n }, [])\n\n const bindRemoteView = useCallback((el: HTMLElement | null) => {\n remoteContainerRef.current = el\n if (!el) {\n detachRemoteContainer()\n return\n }\n if (outputEnabledRef.current) {\n bindRemoteContainer()\n }\n }, [bindRemoteContainer, detachRemoteContainer])\n\n const value: XmaxContextValue = useMemo(() => ({\n snapshot: {\n sessionUid: sessionUidRef.current,\n rtc: rtcState,\n inputSource,\n isCameraOn,\n isRecording,\n isGenerating,\n isOutputVerifying: !!seiGate.expectedSei && !seiGate.matched,\n hasResult,\n outputEnabled,\n dragEnabled: outputEnabled && isRecording,\n showOutputVideo: outputEnabled && (hasResult || !!rtcState.remoteVideoUserId),\n localVideoSize,\n sessionTargetSize,\n seiGate,\n },\n connect,\n disconnect,\n openCamera,\n closeCamera,\n loadVideoFile,\n clearInput,\n uploadImage,\n setRefImage,\n start,\n sendTracks,\n stop,\n changeModel,\n bindLocalView,\n bindRemoteView,\n }), [\n rtcState,\n inputSource,\n isCameraOn,\n isRecording,\n isGenerating,\n seiGate,\n hasResult,\n outputEnabled,\n localVideoSize,\n sessionTargetSize,\n connect,\n disconnect,\n openCamera,\n closeCamera,\n loadVideoFile,\n clearInput,\n uploadImage,\n setRefImage,\n start,\n sendTracks,\n stop,\n changeModel,\n bindLocalView,\n bindRemoteView,\n ])\n\n return (\n <XmaxContext.Provider value={value}>\n {children}\n </XmaxContext.Provider>\n )\n}\n\nexport function useXmax(): XmaxContextValue {\n const ctx = useContext(XmaxContext)\n if (!ctx) {\n throw new Error('useXmax must be used within XmaxProvider')\n }\n return ctx\n}\n","export function clamp(n: number, min: number, max: number) {\n return Math.min(Math.max(n, min), max)\n}\n\nexport type ContentRect = {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport type MapViewportOptions = {\n fitMode?: 'contain' | 'cover'\n /** Flip X when the output video is horizontally mirrored in CSS (xmax-open-sdk remote overlay). */\n mirrored?: boolean\n}\n\ntype MappingContext = {\n content: ContentRect\n /** Pointer hit-test bounds — inset media uses video rect; fill layout uses container (xmax). */\n hitRect: ContentRect\n source: 'media' | 'fit'\n}\n\n/** Visible video content box for contain/cover fit — matches xmax-open-sdk App.tsx. */\nexport function getFitContentRect(\n rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover' = 'contain',\n): ContentRect {\n const [targetWidth, targetHeight] = targetSize\n if (!targetWidth || !targetHeight || !rect.width || !rect.height) {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n }\n\n const scale =\n fitMode === 'cover'\n ? Math.max(rect.width / targetWidth, rect.height / targetHeight)\n : Math.min(rect.width / targetWidth, rect.height / targetHeight)\n const width = targetWidth * scale\n const height = targetHeight * scale\n\n return {\n left: rect.left + (rect.width - width) / 2,\n top: rect.top + (rect.height - height) / 2,\n width,\n height,\n }\n}\n\n/** @deprecated Use {@link getFitContentRect} with fitMode `contain`. */\nexport function getContentRect(\n rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>,\n targetSize: [number, number],\n): ContentRect {\n return getFitContentRect(rect, targetSize, 'contain')\n}\n\nexport function findDragMediaElement(\n dragSurface: HTMLElement,\n): HTMLVideoElement | HTMLCanvasElement | null {\n const root = dragSurface.parentElement ?? dragSurface\n if (typeof root.querySelector !== 'function') {\n return null\n }\n const videoHost = root.querySelector('[data-xmax-remote-video]') ?? root\n if (typeof videoHost.querySelector !== 'function') {\n return null\n }\n const media = videoHost.querySelector('video, canvas')\n return (media as HTMLVideoElement | HTMLCanvasElement | null) ?? null\n}\n\nfunction toContentRect(rect: DOMRect): ContentRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n}\n\nfunction isMediaInsetInContainer(mediaRect: DOMRect, containerRect: DOMRect): 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\n/**\n * Resolve drag mapping bounds.\n * - Upload / h-auto layouts: map to the actual output video element rect.\n * - Camera / cover fill: xmax container + cover math when video fills the host.\n */\nexport function resolveMappingContext(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover' = 'cover',\n): MappingContext {\n const containerRect = dragSurface.getBoundingClientRect()\n const media = findDragMediaElement(dragSurface)\n if (media) {\n const mediaRect = media.getBoundingClientRect()\n if (mediaRect.width > 0 && mediaRect.height > 0 && isMediaInsetInContainer(mediaRect, containerRect)) {\n const content = toContentRect(mediaRect)\n return { content, hitRect: content, source: 'media' }\n }\n }\n\n const content = getFitContentRect(containerRect, targetSize, fitMode)\n return {\n content,\n hitRect: toContentRect(containerRect),\n source: 'fit',\n }\n}\n\nexport function mapViewportPointToCoordinateSpace(\n e: Pick<PointerEvent, 'clientX' | 'clientY'>,\n container: HTMLElement,\n targetSize: [number, number],\n options: MapViewportOptions = {},\n): [number, number] | null {\n const fitMode = options.fitMode ?? 'cover'\n const mirrored = options.mirrored ?? false\n const [targetWidth, targetHeight] = targetSize\n\n if (!targetWidth || !targetHeight) {\n return null\n }\n\n const { content, hitRect } = resolveMappingContext(container, targetSize, fitMode)\n if (!content.width || !content.height) {\n return null\n }\n\n if (\n e.clientX < hitRect.left\n || e.clientY < hitRect.top\n || e.clientX > hitRect.left + hitRect.width\n || e.clientY > hitRect.top + hitRect.height\n ) {\n return null\n }\n\n const x = Math.round(((e.clientX - content.left) * targetWidth) / content.width)\n const y = Math.round(((e.clientY - content.top) * targetHeight) / content.height)\n const normalizedX = mirrored ? targetWidth - 1 - x : x\n\n return [\n clamp(normalizedX, 0, targetWidth - 1),\n clamp(y, 0, targetHeight - 1),\n ]\n}\n\n/** Inverse of mapViewportPointToCoordinateSpace — target coords to canvas pixels (CSS space × dpr). */\nexport function mapTargetPointToCanvas(\n point: [number, number],\n container: HTMLElement,\n targetSize: [number, number],\n dpr: number,\n options: MapViewportOptions = {},\n): [number, number] | null {\n const fitMode = options.fitMode ?? 'cover'\n const mirrored = options.mirrored ?? false\n const containerRect = container.getBoundingClientRect()\n const [targetWidth, targetHeight] = targetSize\n const { content } = resolveMappingContext(container, targetSize, fitMode)\n\n if (!targetWidth || !targetHeight || !content.width || !content.height) {\n return null\n }\n\n const displayX = mirrored ? targetWidth - 1 - point[0] : point[0]\n const originX = (content.left - containerRect.left) * dpr\n const originY = (content.top - containerRect.top) * dpr\n const contentW = content.width * dpr\n const contentH = content.height * dpr\n\n return [\n originX + (displayX / targetWidth) * contentW,\n originY + (point[1] / targetHeight) * contentH,\n ]\n}\n","import {\n mapTargetPointToCanvas,\n mapViewportPointToCoordinateSpace,\n} from './map-viewport'\n\ntype TargetPoint = [number, number]\ntype Segment = { a: TargetPoint; b: TargetPoint }\ntype ActivePointer = { pointerId: number; clientX: number; clientY: number }\n\nexport type DragTrackControllerOptions = {\n targetSize: [number, number]\n fitMode?: 'contain' | 'cover'\n mirrored?: boolean\n enabled?: boolean\n /** When idle (no active pointers), still emit `onTracks([])` on each sample tick. */\n emitEmptyTracksWhenIdle?: boolean\n onTracks: (tracks: Array<[number, number]>) => void | Promise<void>\n}\n\nfunction fadeCanvas(ctx: CanvasRenderingContext2D) {\n ctx.save()\n ctx.globalCompositeOperation = 'destination-out'\n ctx.fillStyle = 'rgba(0,0,0,0.06)'\n ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n ctx.restore()\n}\n\nfunction drawNeon(\n ctx: CanvasRenderingContext2D,\n segs: Segment[],\n container: HTMLElement,\n targetSize: [number, number],\n dpr: number,\n fitMode: 'contain' | 'cover',\n mirrored: boolean,\n) {\n if (segs.length === 0) {\n return\n }\n\n const coreW = 3.6 * dpr\n const lineW = 10 * dpr\n const glowRadius = 28 * dpr\n const color = { r: 20, g: 255, b: 80 }\n const rgba = (a: number) => `rgba(${color.r},${color.g},${color.b},${a})`\n\n const strokeSegs = (opts: {\n width: number\n shadowBlur: number\n shadowAlpha: number\n alpha: number\n composite: GlobalCompositeOperation\n }) => {\n ctx.save()\n ctx.globalCompositeOperation = opts.composite\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.lineWidth = opts.width\n ctx.strokeStyle = rgba(opts.alpha)\n ctx.shadowBlur = opts.shadowBlur\n ctx.shadowColor = rgba(opts.shadowAlpha)\n ctx.beginPath()\n for (const seg of segs) {\n const start = mapTargetPointToCanvas(seg.a, container, targetSize, dpr, { fitMode, mirrored })\n const end = mapTargetPointToCanvas(seg.b, container, targetSize, dpr, { fitMode, mirrored })\n if (!start || !end) {\n continue\n }\n ctx.moveTo(start[0], start[1])\n ctx.lineTo(end[0], end[1])\n }\n ctx.stroke()\n ctx.restore()\n }\n\n strokeSegs({\n width: lineW,\n shadowBlur: glowRadius,\n shadowAlpha: 0.9,\n alpha: 0.45,\n composite: 'lighter',\n })\n strokeSegs({\n width: lineW,\n shadowBlur: 12 * dpr,\n shadowAlpha: 0.9,\n alpha: 0.9,\n composite: 'lighter',\n })\n strokeSegs({\n width: coreW,\n shadowBlur: 6 * dpr,\n shadowAlpha: 0.8,\n alpha: 1.0,\n composite: 'source-over',\n })\n\n ctx.save()\n ctx.globalCompositeOperation = 'lighter'\n ctx.fillStyle = rgba(1.0)\n ctx.shadowBlur = 10 * dpr\n ctx.shadowColor = rgba(0.8)\n const head = segs[segs.length - 1]\n if (head) {\n const headPoint = mapTargetPointToCanvas(head.b, container, targetSize, dpr, { fitMode, mirrored })\n if (headPoint) {\n ctx.beginPath()\n ctx.arc(headPoint[0], headPoint[1], 3.2 * dpr, 0, Math.PI * 2)\n ctx.fill()\n }\n }\n ctx.restore()\n}\n\nexport class DragTrackController {\n private readonly container: HTMLElement\n private readonly canvas: HTMLCanvasElement\n private readonly onTracks: DragTrackControllerOptions['onTracks']\n private targetSize: [number, number]\n private fitMode: 'contain' | 'cover'\n private mirrored: boolean\n private enabled: boolean\n private emitEmptyTracksWhenIdle: boolean\n private readonly activePointers = new Map<number, ActivePointer>()\n private readonly lastTargetPoints = new Map<number, TargetPoint>()\n private readonly segQueue: Segment[] = []\n private sampleTimer: number | null = null\n private sampleInFlight = false\n private rafId: number | null = null\n private resizeObserver: ResizeObserver | null = null\n private readonly onWindowResize: () => void\n private readonly onPointerDown: (e: PointerEvent) => void\n private readonly onPointerMove: (e: PointerEvent) => void\n private readonly onPointerUp: (e: PointerEvent) => void\n private readonly onPointerCancel: (e: PointerEvent) => void\n\n constructor(container: HTMLElement, options: DragTrackControllerOptions) {\n this.container = container\n this.onTracks = options.onTracks\n this.targetSize = options.targetSize\n this.fitMode = options.fitMode ?? 'cover'\n this.mirrored = options.mirrored ?? false\n this.enabled = options.enabled ?? true\n this.emitEmptyTracksWhenIdle = options.emitEmptyTracksWhenIdle ?? false\n\n this.canvas = document.createElement('canvas')\n this.canvas.className = 'Xmax-drag-track-canvas'\n this.canvas.style.cssText =\n 'position:absolute;inset:0;z-index:21;width:100%;height:100%;pointer-events:none;'\n container.appendChild(this.canvas)\n\n this.onWindowResize = () => this.resizeCanvas()\n this.onPointerDown = (e) => this.handlePointerDown(e)\n this.onPointerMove = (e) => this.handlePointerMove(e)\n this.onPointerUp = (e) => this.handlePointerUp(e)\n this.onPointerCancel = (e) => this.handlePointerCancel(e)\n\n this.resizeCanvas()\n this.bindResizeObserver()\n this.bindPointerEvents()\n this.applyInteractionStyle()\n if (this.enabled && this.emitEmptyTracksWhenIdle) {\n this.startSampling()\n }\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n this.applyInteractionStyle()\n if (!enabled) {\n this.finishStroke({ stopIdleSampling: true })\n return\n }\n if (this.emitEmptyTracksWhenIdle && this.activePointers.size === 0) {\n this.startSampling()\n }\n }\n\n setEmitEmptyTracksWhenIdle(emitEmptyTracksWhenIdle: boolean): void {\n if (this.emitEmptyTracksWhenIdle === emitEmptyTracksWhenIdle) {\n return\n }\n this.emitEmptyTracksWhenIdle = emitEmptyTracksWhenIdle\n if (emitEmptyTracksWhenIdle && this.enabled && this.activePointers.size === 0) {\n this.startSampling()\n return\n }\n if (!emitEmptyTracksWhenIdle && this.activePointers.size === 0) {\n this.stopSampling()\n }\n }\n\n setTargetSize(targetSize: [number, number]): void {\n this.targetSize = targetSize\n }\n\n setFitMode(fitMode: 'contain' | 'cover'): void {\n this.fitMode = fitMode\n }\n\n setMirrored(mirrored: boolean): void {\n this.mirrored = mirrored\n }\n\n destroy(): void {\n this.finishStroke({ stopIdleSampling: true })\n this.unbindPointerEvents()\n this.unbindResizeObserver()\n this.canvas.remove()\n }\n\n private applyInteractionStyle(): void {\n this.container.style.pointerEvents = this.enabled ? 'auto' : 'none'\n this.container.style.touchAction = this.enabled ? 'none' : 'auto'\n }\n\n private bindResizeObserver(): void {\n const ResizeObserverCtor = globalThis.ResizeObserver\n if (ResizeObserverCtor) {\n this.resizeObserver = new ResizeObserverCtor(() => this.resizeCanvas())\n this.resizeObserver.observe(this.container)\n return\n }\n window.addEventListener('resize', this.onWindowResize)\n }\n\n private unbindResizeObserver(): void {\n this.resizeObserver?.disconnect()\n this.resizeObserver = null\n window.removeEventListener('resize', this.onWindowResize)\n }\n\n private bindPointerEvents(): void {\n this.container.addEventListener('pointerdown', this.onPointerDown)\n this.container.addEventListener('pointermove', this.onPointerMove)\n this.container.addEventListener('pointerup', this.onPointerUp)\n this.container.addEventListener('pointercancel', this.onPointerCancel)\n }\n\n private unbindPointerEvents(): void {\n this.container.removeEventListener('pointerdown', this.onPointerDown)\n this.container.removeEventListener('pointermove', this.onPointerMove)\n this.container.removeEventListener('pointerup', this.onPointerUp)\n this.container.removeEventListener('pointercancel', this.onPointerCancel)\n this.activePointers.clear()\n this.lastTargetPoints.clear()\n this.sampleInFlight = false\n }\n\n private clearCanvas(): void {\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n return\n }\n ctx.save()\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n ctx.restore()\n }\n\n private resizeCanvas(): void {\n const rect = this.container.getBoundingClientRect()\n const dpr = window.devicePixelRatio || 1\n const cssW = Math.max(1, Math.round(rect.width))\n const cssH = Math.max(1, Math.round(rect.height))\n const nextW = Math.max(1, Math.round(cssW * dpr))\n const nextH = Math.max(1, Math.round(cssH * dpr))\n if (this.canvas.width !== nextW || this.canvas.height !== nextH) {\n this.canvas.width = nextW\n this.canvas.height = nextH\n this.canvas.style.width = `${cssW}px`\n this.canvas.style.height = `${cssH}px`\n this.clearCanvas()\n }\n }\n\n private toTargetPoint(e: Pick<PointerEvent, 'clientX' | 'clientY'>): TargetPoint | null {\n return mapViewportPointToCoordinateSpace(e, this.container, this.targetSize, {\n fitMode: this.fitMode,\n mirrored: this.mirrored,\n })\n }\n\n private stopDrawLoop(): void {\n if (this.rafId !== null) {\n window.cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private startDrawLoop(): void {\n if (this.rafId !== null) {\n return\n }\n\n const tick = () => {\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n this.rafId = null\n return\n }\n\n const dpr = window.devicePixelRatio || 1\n fadeCanvas(ctx)\n drawNeon(ctx, this.segQueue.splice(0), this.container, this.targetSize, dpr, this.fitMode, this.mirrored)\n\n if (this.activePointers.size > 0) {\n this.rafId = window.requestAnimationFrame(tick)\n } else {\n this.rafId = null\n }\n }\n\n this.rafId = window.requestAnimationFrame(tick)\n }\n\n private stopSampling(): void {\n if (this.sampleTimer !== null) {\n window.clearInterval(this.sampleTimer)\n this.sampleTimer = null\n }\n }\n\n private collectCurrentTracks(): Array<[number, number]> {\n const tracks: Array<[number, number]> = []\n for (const pointer of Array.from(this.activePointers.values())) {\n const point = this.toTargetPoint(pointer)\n if (point) {\n tracks.push(point)\n }\n }\n return tracks\n }\n\n private flushTracks(): void {\n if (this.sampleInFlight) {\n return\n }\n\n const tracks = this.collectCurrentTracks()\n if (!tracks.length && !this.emitEmptyTracksWhenIdle) {\n return\n }\n\n this.sampleInFlight = true\n Promise.resolve(this.onTracks(tracks))\n .catch(() => {})\n .finally(() => {\n this.sampleInFlight = false\n })\n }\n\n private startSampling(): void {\n if (this.sampleTimer !== null) {\n return\n }\n this.flushTracks()\n this.sampleTimer = window.setInterval(() => {\n this.flushTracks()\n }, 30)\n }\n\n private finishStroke(options?: { stopIdleSampling?: boolean }): void {\n const stopIdleSampling = options?.stopIdleSampling ?? !this.emitEmptyTracksWhenIdle\n if (stopIdleSampling) {\n this.stopSampling()\n }\n this.stopDrawLoop()\n this.segQueue.length = 0\n this.clearCanvas()\n }\n\n private handlePointerDown(e: PointerEvent): void {\n if (!this.enabled) {\n return\n }\n try {\n this.container.setPointerCapture(e.pointerId)\n } catch {\n }\n this.resizeCanvas()\n if (this.activePointers.size === 0) {\n this.segQueue.length = 0\n this.clearCanvas()\n }\n this.activePointers.set(e.pointerId, {\n pointerId: e.pointerId,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n const targetPoint = this.toTargetPoint(e)\n if (targetPoint) {\n this.lastTargetPoints.set(e.pointerId, targetPoint)\n }\n this.startDrawLoop()\n this.startSampling()\n }\n\n private handlePointerMove(e: PointerEvent): void {\n if (!this.enabled || !this.activePointers.has(e.pointerId)) {\n return\n }\n const nextTargetPoint = this.toTargetPoint(e)\n const last = this.lastTargetPoints.get(e.pointerId)\n if (last && nextTargetPoint) {\n this.segQueue.push({ a: last, b: nextTargetPoint })\n }\n if (nextTargetPoint) {\n this.lastTargetPoints.set(e.pointerId, nextTargetPoint)\n }\n this.activePointers.set(e.pointerId, {\n pointerId: e.pointerId,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n }\n\n private handlePointerUp(e: PointerEvent): void {\n if (!this.activePointers.has(e.pointerId)) {\n return\n }\n this.activePointers.delete(e.pointerId)\n this.lastTargetPoints.delete(e.pointerId)\n try {\n this.container.releasePointerCapture(e.pointerId)\n } catch {\n }\n if (this.activePointers.size === 0) {\n this.finishStroke()\n }\n }\n\n private handlePointerCancel(e: PointerEvent): void {\n if (!this.activePointers.has(e.pointerId)) {\n return\n }\n this.activePointers.delete(e.pointerId)\n this.lastTargetPoints.delete(e.pointerId)\n if (this.activePointers.size === 0) {\n this.finishStroke()\n }\n }\n}\n\nexport function createDragTrackController(\n container: HTMLElement,\n options: DragTrackControllerOptions,\n): DragTrackController {\n return new DragTrackController(container, options)\n}\n","import { useEffect, useRef } from 'react'\nimport {\n createDragTrackController,\n type DragTrackController,\n} from '../drag/drag-track-controller'\n\nexport function DragTrackSurface({\n enabled,\n targetSize,\n onTracks,\n className,\n style,\n fitMode = 'cover',\n}: {\n enabled: boolean\n targetSize: [number, number]\n onTracks: (tracks: Array<[number, number]>) => void | Promise<void>\n className?: string\n style?: React.CSSProperties\n fitMode?: 'contain' | 'cover'\n}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const controllerRef = useRef<DragTrackController | null>(null)\n const onTracksRef = useRef(onTracks)\n onTracksRef.current = onTracks\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n\n const controller = createDragTrackController(container, {\n targetSize,\n fitMode,\n enabled,\n onTracks: (tracks) => onTracksRef.current(tracks),\n })\n controllerRef.current = controller\n\n return () => {\n controller.destroy()\n controllerRef.current = null\n }\n }, [])\n\n useEffect(() => {\n controllerRef.current?.setEnabled(enabled)\n }, [enabled])\n\n useEffect(() => {\n controllerRef.current?.setTargetSize(targetSize)\n }, [targetSize])\n\n useEffect(() => {\n controllerRef.current?.setFitMode(fitMode)\n }, [fitMode])\n\n return <div ref={containerRef} className={className} style={style} />\n}\n","import { useEffect, useRef } from 'react'\nimport { DEFAULT_SESSION_TARGET_SIZE } from '../shared/reference-video-size'\nimport { DragTrackSurface } from './drag-track-surface'\nimport { useXmax } from './provider'\n\nexport function XmaxView({\n kind,\n className,\n style,\n}: {\n kind: 'local' | 'remote'\n className?: string\n style?: React.CSSProperties\n}) {\n const ref = useRef<HTMLDivElement>(null)\n const { bindLocalView, bindRemoteView, snapshot, sendTracks } = useXmax()\n\n useEffect(() => {\n const el = ref.current\n if (!el) {\n return\n }\n if (kind === 'local') {\n bindLocalView(el)\n return () => bindLocalView(null)\n }\n bindRemoteView(el)\n return () => bindRemoteView(null)\n }, [bindLocalView, bindRemoteView, kind])\n\n if (kind === 'remote') {\n const dragTargetSize = snapshot.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\n return (\n <div className={className} style={{ position: 'relative', ...style }}>\n <div ref={ref} style={{ width: '100%', height: '100%' }} />\n <DragTrackSurface\n enabled={snapshot.dragEnabled}\n targetSize={dragTargetSize}\n fitMode=\"contain\"\n onTracks={(tracks) => {\n void sendTracks({ tracks })\n }}\n className=\"absolute inset-0 touch-none\"\n style={{ zIndex: 10 }}\n />\n </div>\n )\n }\n\n return <div ref={ref} className={className} style={style} />\n}\n"]}
1
+ {"version":3,"sources":["../../src/rtc/local-publish-diagnostics.ts","../../src/i18n/en-US.ts","../../src/i18n/zh-CN.ts","../../src/i18n/api-error-codes.ts","../../src/i18n/index.ts","../../src/shared/browser-toast.ts","../../src/shared/error-utils.ts","../../src/sdk/client.ts","../../src/sdk/rtc-events.ts","../../src/rtc/video-frame-rate.ts","../../src/rtc/preview-media-layout.ts","../../src/rtc/rtc-manager.ts","../../src/rtc/publish-fps.ts","../../src/shared/reference-video-size.ts","../../src/rtc/capture-crop.ts","../../src/rtc/canvas-frame-draw.ts","../../src/rtc/capture-host.ts","../../src/rtc/video-file-stream.ts","../../src/shared/camera-stream.ts","../../src/rtc/camera-stream-v2.ts","../../src/realtime/models.ts","../../src/shared/session-debug.ts","../../src/react/provider.tsx","../../src/drag/map-viewport.ts","../../src/drag/drag-track-controller.ts","../../src/react/drag-track-surface.tsx","../../src/react/view.tsx"],"names":["element","root","COS","VideoRenderMode","VideoSourceType","MediaType","StreamIndex","VERTC","RoomProfileType","waitForMediaStreamTrackFrames","frameResult","MirrorType","VideoCodecType","width","height","createContext","useMemo","useRef","useCallback","useState","useEffect","result","jsx","useContext","content","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["type VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: { mediaTime: number; presentedFrames?: number }) => void,\n ) => number\n cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport async function waitForMediaStreamTrackFrames(\n track: MediaStreamTrack,\n options: { minFrames?: number; timeoutMs?: number } = {},\n): Promise<{ ready: boolean; frameCount: number; elapsedMs: number }> {\n const minFrames = options.minFrames ?? 3\n const timeoutMs = options.timeoutMs ?? 3000\n const startedAtMs = performance.now()\n\n if (track.readyState === 'ended') {\n return { ready: false, frameCount: 0, elapsedMs: 0 }\n }\n\n return new Promise((resolve) => {\n let frameCount = 0\n let settled = false\n let rvfcHandle: number | null = null\n let rafId: number | null = null\n\n const finish = (ready: boolean) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timeoutTimer)\n const video = videoEl as VideoWithFrameCallback\n if (rvfcHandle !== null) {\n video.cancelVideoFrameCallback?.(rvfcHandle)\n }\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n }\n try {\n videoEl.pause()\n videoEl.srcObject = null\n videoEl.remove()\n } catch {\n }\n resolve({\n ready,\n frameCount,\n elapsedMs: Number((performance.now() - startedAtMs).toFixed(1)),\n })\n }\n\n const onFrame = () => {\n frameCount += 1\n if (frameCount >= minFrames) {\n finish(true)\n }\n }\n\n const videoEl = document.createElement('video')\n videoEl.muted = true\n videoEl.playsInline = true\n videoEl.autoplay = true\n videoEl.srcObject = new MediaStream([track])\n videoEl.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none'\n\n const schedule = () => {\n if (settled) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n rvfcHandle = video.requestVideoFrameCallback!(() => {\n onFrame()\n schedule()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n onFrame()\n schedule()\n })\n }\n\n const timeoutTimer = setTimeout(() => finish(frameCount >= minFrames), timeoutMs)\n\n void videoEl.play()\n .then(() => {\n if (!settled) {\n schedule()\n }\n })\n .catch(() => finish(false))\n })\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 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","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 TOAST_ROOT_ID = 'Xmax-sdk-toast-root'\nconst TOAST_DURATION_MS = 3000\nlet toastSeed = 0\nconst timeoutMap = new Map<string, number>()\nconst elementMap = new Map<string, HTMLDivElement>()\n\ntype ToastType = 'success' | 'error'\n\ntype ToastOptions = {\n key?: string\n duration?: number\n}\n\nfunction ensureToastRoot() {\n if (typeof document === 'undefined') {\n return null\n }\n\n let root = document.getElementById(TOAST_ROOT_ID)\n if (root) {\n return root\n }\n\n root = document.createElement('div')\n root.id = TOAST_ROOT_ID\n root.setAttribute('aria-live', 'polite')\n Object.assign(root.style, {\n position: 'fixed',\n left: '50%',\n top: '24px',\n transform: 'translateX(-50%)',\n zIndex: '3000',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n document.body.appendChild(root)\n return root\n}\n\nfunction createIcon(type: 'success' | 'error') {\n const icon = document.createElement('span')\n icon.setAttribute('aria-hidden', 'true')\n icon.innerHTML =\n type === 'success'\n ? '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M10 3L4.5 8.5 2 6\" stroke=\"#4ade80\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n : '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"#f87171\" stroke-width=\"1.5\"/><path d=\"M4 4l4 4M8 4L4 8\" stroke=\"#f87171\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>'\n Object.assign(icon.style, {\n display: 'inline-flex',\n width: '12px',\n height: '12px',\n flexShrink: '0',\n } satisfies Partial<CSSStyleDeclaration>)\n return icon\n}\n\nfunction clearToastTimer(id: string) {\n const timer = timeoutMap.get(id)\n if (timer) {\n window.clearTimeout(timer)\n timeoutMap.delete(id)\n }\n}\n\nfunction destroyToast(id?: string) {\n if (!id) {\n timeoutMap.forEach((timer) => window.clearTimeout(timer))\n timeoutMap.clear()\n elementMap.forEach((element) => element.remove())\n elementMap.clear()\n const root = typeof document !== 'undefined' ? document.getElementById(TOAST_ROOT_ID) : null\n root?.remove()\n return\n }\n\n clearToastTimer(id)\n const element = elementMap.get(id)\n element?.remove()\n elementMap.delete(id)\n\n const root = typeof document !== 'undefined' ? document.getElementById(TOAST_ROOT_ID) : null\n if (root && !root.childElementCount) {\n root.remove()\n }\n}\n\nfunction showToast(type: ToastType, message: string, options?: ToastOptions) {\n const root = ensureToastRoot()\n if (!root) {\n return ''\n }\n const id = options?.key || `toast-${Date.now()}-${++toastSeed}`\n clearToastTimer(id)\n elementMap.get(id)?.remove()\n\n const isMobile = typeof window !== 'undefined' && window.matchMedia('(max-width: 768px)').matches\n const textSize = isMobile ? '12px' : '14px'\n\n const toast = document.createElement('div')\n toast.setAttribute('role', 'status')\n Object.assign(toast.style, {\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n minWidth: '240px',\n padding: '16px',\n borderRadius: '12px',\n border: '1px solid rgba(255, 255, 255, 0.20)',\n background: 'rgba(0, 0, 0, 0.80)',\n boxShadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, sans-serif',\n fontSize: textSize,\n fontWeight: '400',\n lineHeight: '14px',\n } satisfies Partial<CSSStyleDeclaration>)\n\n const content = document.createElement('span')\n content.textContent = message\n Object.assign(content.style, {\n paddingRight: '0px',\n textAlign: 'center',\n color: '#ffffff',\n fontFamily: 'Rubik, ui-sans-serif, system-ui, sans-serif',\n fontSize: textSize,\n fontWeight: '400',\n lineHeight: '14px',\n } satisfies Partial<CSSStyleDeclaration>)\n\n toast.appendChild(createIcon(type))\n toast.appendChild(content)\n root.appendChild(toast)\n elementMap.set(id, toast)\n\n const timer = window.setTimeout(() => {\n destroyToast(id)\n }, options?.duration ?? TOAST_DURATION_MS)\n timeoutMap.set(id, timer)\n\n return id\n}\n\nexport const browserToast = {\n success(message: string, options?: ToastOptions) {\n return showToast('success', message, options)\n },\n error(message: string, options?: ToastOptions) {\n return showToast('error', message, options)\n },\n destroy(id?: string) {\n destroyToast(id)\n },\n}\n","export type XmaxErrorNotifier = (message: string, error?: unknown) => void\nimport { browserToast } from './browser-toast'\n\ntype NotifiedError = Error & { __XmaxNotified?: boolean }\n\nexport function isNotifiedError(error: unknown): error is NotifiedError {\n return !!error && typeof error === 'object' && (error as NotifiedError).__XmaxNotified === true\n}\n\nexport function notifyError(\n error: unknown,\n notifier: XmaxErrorNotifier | undefined,\n fallbackMessage: string,\n): Error {\n const resolved =\n error instanceof Error\n ? (error as NotifiedError)\n : Object.assign(new Error(fallbackMessage), { cause: error }) as NotifiedError\n\n if (!resolved.__XmaxNotified) {\n resolved.__XmaxNotified = true\n const message = resolved.message || fallbackMessage\n if (notifier) {\n notifier(message, error)\n } else if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n browserToast.error(message)\n }\n }\n\n return resolved\n}\n","import COS from \"cos-js-sdk-v5\";\nimport { createSDKI18n, resolveApiErrorMessage, type SDKI18n, type SDKLocale } from \"../i18n\";\nimport { notifyError, type XmaxErrorNotifier } from \"../shared/error-utils\";\n\n/** Deployment region for the published package. */\nexport type XmaxSdkRegion = \"cn\" | \"global\";\n\n/** Region → official Open API v1 production base URL. */\nexport const XMAX_OPEN_API_BASE_URLS: Record<XmaxSdkRegion, string> = {\n // 国内 — @xmaxai/sdk\n cn: \"https://cloud.xmax.22duck.cn/open/api/v1\",\n // 海外 — @xmaxai/sdk-global\n global: \"https://api.xmax.cloud/open/api/v1\",\n};\n\n/**\n * Build-time region flag, inlined by tsup (see tsup.config.ts). Falls back to\n * `cn` for local dev / tests where the variable is not injected.\n */\nconst XMAX_SDK_BUILD_REGION: XmaxSdkRegion =\n process.env.XMAX_SDK_REGION === \"global\" ? \"global\" : \"cn\";\n\n/**\n * Official Xmax Open Platform production API base URL (Open API v1) for the\n * region this package was built for:\n * - `@xmaxai/sdk` (cn): https://cloud.xmax.22duck.cn/open/api/v1\n * - `@xmaxai/sdk-global`: https://api.xmax.cloud/open/api/v1\n */\nexport const XMAX_OPEN_API_PRODUCTION_BASE_URL =\n XMAX_OPEN_API_BASE_URLS[XMAX_SDK_BUILD_REGION];\n\nexport const ACTIVE_STATUS = \"ACTIVE\";\nconst STS_TTL_MS = 30 * 60 * 1000;\nconst STS_REFRESH_BUFFER_MS = 5 * 60 * 1000;\n\nexport interface ModelExtra {\n room_id?: string;\n bot_name?: string;\n user_id?: string;\n rtc_app_id?: string;\n room_token?: string;\n}\n\nexport interface Session {\n sessionUid: string;\n userUid?: string;\n modelTypeUid?: string;\n modelTypeName?: string;\n modelUid?: string;\n modelExtra?: ModelExtra;\n status?: string;\n lastHeartbeatTimestamp?: string;\n closeTimestamp?: string | null;\n closeReason?: string | null;\n createTimestamp?: string;\n updateTimestamp?: string;\n}\n\nexport interface StsCredentials {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken: string;\n}\n\nexport interface CosSts {\n type: string;\n bucket: string;\n region: string;\n endpoint: string;\n prefix: string;\n credentials: StsCredentials;\n}\n\nexport interface UploadImageResult {\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n}\n\nexport interface UploadVideoResult {\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n}\n\nexport interface RtcJoinInfo {\n appId: string;\n roomId: string;\n userId: string;\n token: string;\n botName?: string;\n}\n\nexport interface XmaxLogEntry {\n id: string;\n level: \"info\" | \"success\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n timestamp: string;\n}\n\nexport interface ClientOptions {\n apiKey: string;\n /** Open API base URL, e.g. {@link XMAX_OPEN_API_PRODUCTION_BASE_URL}. */\n baseUrl: string;\n authToken?: string;\n timeoutMs?: number;\n locale?: SDKLocale;\n i18n?: SDKI18n;\n onError?: XmaxErrorNotifier;\n}\n\nfunction sanitizeFileName(fileName: string): string {\n return fileName\n .trim()\n .replace(/[^\\w.\\-一-龥]/g, \"_\")\n .replace(/_+/g, \"_\");\n}\n\nfunction buildCosFileUrl(endpoint: string, bucket: string, key: string): string {\n const trimmed = endpoint.trim();\n const url = new URL(\n /^https?:\\/\\//i.test(trimmed)\n ? (trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`)\n : `https://${trimmed.replace(/^\\/+/, \"\")}${trimmed.endsWith(\"/\") ? \"\" : \"/\"}`,\n );\n if (url.hostname.startsWith(\"cos.\") && !url.hostname.startsWith(`${bucket}.`)) {\n url.hostname = `${bucket}.${url.hostname}`;\n }\n return new URL(key.replace(/^\\/+/, \"\"), url.toString()).toString();\n}\n\n/** Prefer COS putObject Location; fall back to STS endpoint or bucket/region URL. */\nfunction resolveCosUploadUrl(raw: unknown, sts: CosSts, key: string): string {\n const location = (raw as { Location?: string } | null)?.Location?.trim();\n if (location) {\n return /^https?:\\/\\//i.test(location)\n ? location\n : `https://${location.replace(/^\\/+/, \"\")}`;\n }\n\n const endpoint = sts.endpoint?.trim();\n if (endpoint) {\n return buildCosFileUrl(endpoint, sts.bucket, key);\n }\n\n return `https://${sts.bucket}.cos.${sts.region}.myqcloud.com/${key.replace(/^\\/+/, \"\")}`;\n}\n\nexport class XmaxOpenClient {\n private readonly apiKey: string;\n private readonly authToken: string | undefined;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly i18n: SDKI18n;\n private readonly onError: XmaxErrorNotifier | undefined;\n private stsCache: { value: CosSts; fetchedAt: number } | null = null;\n private heartbeatIntervalId: number | null = null;\n private suppressErrorNotification = false;\n private teardownAbortController: AbortController | null = null;\n private readonly pendingRequestControllers = new Set<AbortController>();\n\n constructor(options: ClientOptions) {\n const i18n = options.i18n ?? createSDKI18n({ locale: options.locale });\n if (!options.apiKey?.trim()) {\n throw new Error(i18n.t(\"errors.apiKeyEmpty\"));\n }\n if (!options.baseUrl?.trim()) {\n throw new Error(i18n.t(\"errors.baseUrlEmpty\"));\n }\n this.apiKey = options.apiKey;\n this.authToken = options.authToken;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.i18n = i18n;\n this.onError = options.onError;\n }\n\n private throwError(message: string, cause?: unknown): never {\n const error = new Error(message);\n if (cause !== undefined) {\n (error as Error & { cause?: unknown }).cause = cause;\n }\n if (this.suppressErrorNotification) {\n throw error;\n }\n throw notifyError(error, this.onError, message);\n }\n\n /** Stop heartbeat, abort in-flight API requests, and suppress error toasts during teardown. */\n beginTeardown(): void {\n this.suppressErrorNotification = true;\n this.stopHeartbeat();\n if (this.teardownAbortController) {\n this.teardownAbortController.abort();\n }\n this.teardownAbortController = new AbortController();\n this.pendingRequestControllers.forEach((controller) => {\n controller.abort();\n });\n this.pendingRequestControllers.clear();\n }\n\n endTeardown(): void {\n this.suppressErrorNotification = false;\n this.teardownAbortController = null;\n }\n\n private isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const controller = new AbortController();\n this.pendingRequestControllers.add(controller);\n\n const onAbort = () => controller.abort();\n this.teardownAbortController?.signal.addEventListener(\"abort\", onAbort);\n\n const timeoutId = window.setTimeout(() => controller.abort(), this.timeoutMs);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"X-Api-Key\": this.apiKey,\n };\n\n if (this.authToken) {\n headers[\"Authorization\"] = `Bearer ${this.authToken}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: controller.signal,\n });\n\n const text = await response.text();\n let payload: unknown;\n\n try {\n payload = text ? JSON.parse(text) : null;\n } catch (parseError) {\n throw this.throwError(this.i18n.t(\"errors.invalidJson\"), parseError);\n }\n\n if (typeof payload !== \"object\" || payload === null) {\n throw this.throwError(this.i18n.t(\"errors.invalidPayload\"));\n }\n\n const p = payload as Record<string, unknown>;\n\n if (response.ok && p.success === true) {\n return p.data as T;\n }\n\n // Prefer our localized message keyed by business error code; fall back to a\n // generic retry hint for unmapped codes on these Open API endpoints.\n const mappedMessage = resolveApiErrorMessage(p.code as string | number | null | undefined, this.i18n.locale);\n const errorMessage = mappedMessage ?? this.i18n.t(\"errors.requestRetry\");\n\n throw new Error(errorMessage);\n } catch (error) {\n if (this.isAbortError(error)) {\n if (this.suppressErrorNotification) {\n throw new Error(this.i18n.t(\"errors.requestTimeout\"));\n }\n throw this.throwError(this.i18n.t(\"errors.requestTimeout\"), error);\n } else if (error instanceof Error) {\n if (this.suppressErrorNotification) {\n throw error;\n }\n throw notifyError(error, this.onError, error.message || this.i18n.t(\"errors.requestFailed\"));\n } else {\n throw this.throwError(this.i18n.t(\"errors.requestFailed\"), error);\n }\n } finally {\n this.teardownAbortController?.signal.removeEventListener(\"abort\", onAbort);\n this.pendingRequestControllers.delete(controller);\n window.clearTimeout(timeoutId);\n }\n }\n\n async createSession(model: string): Promise<Session> {\n if (!model.trim()) {\n this.throwError(this.i18n.t(\"errors.modelEmpty\"));\n }\n return this.request<Session>(\"POST\", \"/session\", { model });\n }\n\n async getSession(sessionUid: string): Promise<Session> {\n return this.request<Session>(\"GET\", `/session/${sessionUid}`);\n }\n\n async heartbeatSession(sessionUid: string): Promise<Session> {\n return this.request<Session>(\"PUT\", `/session/${sessionUid}/heartbeat`);\n }\n\n async closeSession(sessionUid: string): Promise<Session | null> {\n const previousSuppress = this.suppressErrorNotification;\n this.suppressErrorNotification = true;\n try {\n return await this.request<Session>(\"DELETE\", `/session/${sessionUid}`);\n } catch {\n return null;\n } finally {\n this.suppressErrorNotification = previousSuppress;\n }\n }\n\n async getCosSts(forceRefresh = false): Promise<CosSts> {\n const now = Date.now();\n if (\n !forceRefresh &&\n this.stsCache &&\n now - this.stsCache.fetchedAt < STS_TTL_MS - STS_REFRESH_BUFFER_MS\n ) {\n return this.stsCache.value;\n }\n\n const sts = await this.request<CosSts>(\"GET\", \"/cos/sts\");\n this.stsCache = {\n value: sts,\n fetchedAt: now,\n };\n return sts;\n }\n\n private async uploadObject(file: File, expectedTypePrefix: string): Promise<{\n key: string;\n url: string;\n raw: unknown;\n sts: CosSts;\n }> {\n if (!(file instanceof File)) {\n this.throwError(this.i18n.t(\"errors.invalidFile\"));\n }\n\n if (!file.type.startsWith(expectedTypePrefix)) {\n this.throwError(this.i18n.t(\"errors.invalidFileType\", { type: file.type }));\n }\n\n const sts = await this.getCosSts();\n const safeFileName = sanitizeFileName(file.name) || \"image\";\n const key = `${sts.prefix}${Date.now()}_${safeFileName}`;\n\n const cos = new COS({\n SecretId: sts.credentials.accessKeyId,\n SecretKey: sts.credentials.secretAccessKey,\n SecurityToken: sts.credentials.sessionToken,\n });\n\n const raw = await new Promise<unknown>((resolve, reject) => {\n cos.putObject(\n {\n Bucket: sts.bucket,\n Region: sts.region,\n Key: key,\n Body: file,\n ContentType: file.type,\n },\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(data);\n },\n );\n });\n\n return {\n key,\n url: resolveCosUploadUrl(raw, sts, key),\n raw,\n sts,\n };\n }\n\n async uploadImage(file: File): Promise<UploadImageResult> {\n return this.uploadObject(file, \"image/\");\n }\n\n async uploadVideo(file: File): Promise<UploadVideoResult> {\n return this.uploadObject(file, \"video/\");\n }\n\n startHeartbeat(\n sessionUid: string,\n intervalMs: number = 10000,\n onHeartbeat?: (session: Session) => void,\n onError?: (error: unknown) => void,\n ): void {\n this.stopHeartbeat();\n\n const heartbeat = async () => {\n try {\n const session = await this.heartbeatSession(sessionUid);\n onHeartbeat?.(session);\n\n if (session.status !== ACTIVE_STATUS) {\n this.stopHeartbeat();\n }\n } catch (error) {\n onError?.(error);\n this.stopHeartbeat();\n }\n };\n\n heartbeat();\n this.heartbeatIntervalId = window.setInterval(heartbeat, intervalMs);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatIntervalId !== null) {\n clearInterval(this.heartbeatIntervalId);\n this.heartbeatIntervalId = null;\n }\n }\n\n getRtcJoinInfo(session: Session): RtcJoinInfo {\n const roomId = session.modelExtra?.room_id?.trim();\n const appId = session.modelExtra?.rtc_app_id?.trim();\n const token = session.modelExtra?.room_token?.trim();\n const userId = session.modelExtra?.user_id?.trim() || session.userUid?.trim() || \"\";\n\n if (!roomId || !appId || !token || !userId) {\n this.throwError(this.i18n.t(\"errors.sessionJoinInfoIncomplete\"));\n }\n\n return {\n appId,\n roomId,\n userId,\n token,\n botName: session.modelExtra?.bot_name,\n };\n }\n}\n","export type StartRtcRoomEvent = {\n event: \"start\";\n user_id?: string;\n uid?: string;\n session_uid?: string;\n params: {\n model: string;\n size: [number, number];\n prompt: string;\n ref_image_path?: string;\n ref_image?: string;\n static_generate?: boolean;\n } & Record<string, unknown>;\n};\n\nexport type StopRtcRoomEvent = {\n event: \"stop\";\n user_id?: string;\n session_uid?: string;\n};\n\nexport type TracksRtcRoomEvent = {\n event: \"tracks\";\n user_id?: string;\n uid?: string;\n session_uid?: string;\n tracks: Array<[number, number]>;\n};\n\nexport type RtcRoomEvent =\n | StartRtcRoomEvent\n | StopRtcRoomEvent\n | TracksRtcRoomEvent;\n\n/** Generation task id sent as `uid` / `session_uid` in RTC room events. */\nexport function createTaskUid(): string {\n return `task-${Date.now()}`;\n}\n\nexport function createStartRtcRoomEvent(input: {\n userId?: string;\n uid?: string;\n sessionUid?: string;\n model: string;\n size: [number, number];\n prompt?: string;\n refImagePath?: string;\n refImage?: string;\n /** MoX instant — static image generation that follows drag tracks. */\n staticGenerate?: boolean;\n extraParams?: Record<string, unknown>;\n}): StartRtcRoomEvent {\n const resolvedPrompt = input.prompt?.trim() ?? \"\";\n const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || undefined;\n const useRefImage = !!refImagePath;\n return {\n event: \"start\",\n user_id: input.userId?.trim() || undefined,\n uid: input.uid?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n params: {\n model: input.model.trim(),\n size: input.size,\n prompt: resolvedPrompt,\n ref_image_path: useRefImage ? refImagePath : undefined,\n ref_image: useRefImage ? refImagePath : undefined,\n static_generate: input.staticGenerate === undefined ? undefined : input.staticGenerate,\n ...(input.extraParams ?? {}),\n },\n };\n}\n\nexport function createStopRtcRoomEvent(input: { userId?: string; sessionUid?: string }): StopRtcRoomEvent {\n return {\n event: \"stop\",\n user_id: input.userId?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n };\n}\n\nexport function createTracksRtcRoomEvent(input: {\n userId?: string;\n uid?: string;\n sessionUid?: string;\n tracks: Array<[number, number]>;\n}): TracksRtcRoomEvent {\n return {\n event: \"tracks\",\n user_id: input.userId?.trim() || undefined,\n uid: input.uid?.trim() || undefined,\n session_uid: input.sessionUid?.trim() || undefined,\n tracks: input.tracks,\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","export const PREVIEW_UPLOAD_LAYOUT_ATTR = 'data-preview-upload-layout'\n\n/** Mobile upload output fit — `portrait` (h-full w-auto) or `landscape` (w-full h-auto). */\nexport const PREVIEW_UPLOAD_FIT_ATTR = 'data-preview-upload-fit'\n\nexport const PREVIEW_OUTPUT_LAYOUT_ATTR = 'data-preview-output-layout'\n\nexport const PREVIEW_CONTAIN_ATTR = 'data-preview-contain'\n\nexport const PREVIEW_COVER_ATTR = 'data-preview-cover'\n\nfunction hasFitPreviewLayout(container: HTMLElement): boolean {\n return (\n container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_CONTAIN_ATTR)\n || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`) !== null\n || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`) !== null\n || container.closest(`[${PREVIEW_CONTAIN_ATTR}]`) !== null\n )\n}\n\nfunction hasCoverPreviewLayout(container: HTMLElement): boolean {\n return (\n container.hasAttribute(PREVIEW_COVER_ATTR)\n || container.closest(`[${PREVIEW_COVER_ATTR}]`) !== null\n )\n}\n\nfunction resolveUploadFitMode(container: HTMLElement): 'portrait' | 'landscape' {\n const node = container.hasAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n ? container\n : container.closest(`[${PREVIEW_UPLOAD_FIT_ATTR}]`)\n const fit = node?.getAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n return fit === 'landscape' ? 'landscape' : 'portrait'\n}\n\n/** Match Playground upload overlay — portrait: h-full w-auto; landscape: w-full h-auto; centered clip. */\nexport function applyUploadPreviewMediaLayout(container: HTMLElement): void {\n if (hasCoverPreviewLayout(container)) {\n return\n }\n\n if (!hasFitPreviewLayout(container)) {\n return\n }\n\n const fitMode = resolveUploadFitMode(container)\n\n container.style.overflow = 'hidden'\n container.style.display = 'flex'\n container.style.alignItems = 'center'\n container.style.justifyContent = 'center'\n\n container.querySelectorAll('div').forEach((node) => {\n if (node === container) {\n return\n }\n const el = node as HTMLElement\n el.style.width = '100%'\n el.style.height = '100%'\n if (fitMode === 'landscape') {\n el.style.display = 'flex'\n el.style.alignItems = 'center'\n el.style.justifyContent = 'center'\n el.style.overflow = 'hidden'\n }\n })\n\n container.querySelectorAll('video, canvas').forEach((node) => {\n const el = node as HTMLElement\n el.style.display = 'block'\n el.style.objectFit = 'contain'\n el.style.objectPosition = 'center'\n el.style.position = 'relative'\n el.style.left = 'auto'\n el.style.right = 'auto'\n el.style.top = 'auto'\n el.style.bottom = 'auto'\n el.style.transform = 'none'\n\n if (fitMode === 'landscape') {\n el.style.width = '100%'\n el.style.height = '100%'\n el.style.maxWidth = 'none'\n el.style.maxHeight = 'none'\n el.style.margin = '0'\n return\n }\n\n el.style.height = '100%'\n el.style.width = 'auto'\n el.style.maxWidth = 'none'\n el.style.maxHeight = 'none'\n el.style.marginLeft = 'auto'\n el.style.marginRight = 'auto'\n el.style.marginTop = 'auto'\n el.style.marginBottom = 'auto'\n })\n}\n\nexport function observeUploadPreviewMediaLayout(container: HTMLElement): () => void {\n if (!hasFitPreviewLayout(container) && !hasCoverPreviewLayout(container)) {\n return () => {}\n }\n\n let rafId: number | null = null\n const apply = () => applyUploadPreviewMediaLayout(container)\n const scheduleApply = () => {\n if (rafId !== null) {\n return\n }\n rafId = requestAnimationFrame(() => {\n rafId = null\n apply()\n })\n }\n\n apply()\n const observer = new MutationObserver(() => scheduleApply())\n observer.observe(container, {\n childList: true,\n subtree: true,\n attributes: true,\n })\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n observer.disconnect()\n }\n}\n","import VERTC, {\n MediaType,\n type IRTCEngine,\n type LocalStreamStats,\n MirrorType,\n RoomProfileType,\n VideoCodecType,\n StreamIndex,\n VideoSourceType,\n VideoRenderMode,\n} from \"@volcengine/rtc\";\n\nimport type { RtcJoinInfo } from \"../sdk/client\";\nimport { createSDKI18n, type SDKI18n } from \"../i18n\";\nimport { resolveRtcPublishFps, type ResolveRtcPublishFpsOptions } from \"./publish-fps\";\nimport { resolvePlaybackDrivenEncoderFps } from \"./video-frame-rate\";\nimport {\n applyUploadPreviewMediaLayout,\n observeUploadPreviewMediaLayout,\n PREVIEW_OUTPUT_LAYOUT_ATTR,\n PREVIEW_UPLOAD_FIT_ATTR,\n PREVIEW_UPLOAD_LAYOUT_ATTR,\n} from \"./preview-media-layout\";\n\n/** Upload preview uses FIT (same as left overlay). Camera PiP may use HIDDEN (cover). */\nfunction resolveVideoRenderMode(container: HTMLElement): VideoRenderMode {\n if (\n container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n || container.hasAttribute(\"data-preview-contain\")\n || container.hasAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`)\n || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`)\n || container.closest(\"[data-preview-contain]\")\n || container.closest(`[${PREVIEW_UPLOAD_FIT_ATTR}]`)\n ) {\n return VideoRenderMode.RENDER_MODE_FIT;\n }\n\n if (\n container.hasAttribute(\"data-preview-cover\")\n || container.hasAttribute(\"data-upload-preview-cover\")\n || container.closest(\"[data-preview-cover]\")\n || container.closest(\"[data-upload-preview-cover]\")\n ) {\n return VideoRenderMode.RENDER_MODE_HIDDEN;\n }\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return VideoRenderMode.RENDER_MODE_FIT;\n }\n\n const isCompactPreview = rect.width <= 160;\n const isPortraitFrame = rect.height > rect.width;\n // Volcengine: FILL = non-uniform stretch; HIDDEN = proportional scale to fill (CSS cover).\n return isCompactPreview || isPortraitFrame\n ? VideoRenderMode.RENDER_MODE_HIDDEN\n : VideoRenderMode.RENDER_MODE_FIT;\n}\n\nexport interface RtcLogEntry {\n level: \"info\" | \"success\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n}\n\nexport interface RtcStateSnapshot {\n roomId: string | null;\n userId: string | null;\n appId: string | null;\n botUserId: string | null;\n joined: boolean;\n localVideoPublished: boolean;\n remoteVideoUserId: string | null;\n users: string[];\n}\n\nexport type RemoteSeiReceivedPayload = {\n sei: string;\n userId: string;\n};\n\ninterface RtcManagerOptions {\n onLog?: (entry: RtcLogEntry) => void;\n onStateChange?: (state: RtcStateSnapshot) => void;\n onSeiGateChange?: (state: {\n expectedSei: string | null;\n sei: string | null;\n userId: string | null;\n matched: boolean;\n }) => void;\n /** Fired for H.264 SEI received on a remote (non-local) stream — e.g. backend/bot output. */\n onRemoteSeiReceived?: (payload: RemoteSeiReceivedPayload) => void;\n /** Fired when remote output stops presenting new frames after playback had started. */\n onRemoteOutputStalled?: (info: { userId: string; stallMs: number }) => void;\n /** Fired after the remote player is mounted (used to forward MediaStream via onRemoteStream). */\n onRemotePlayerMounted?: () => void;\n debug?: boolean;\n i18n?: SDKI18n;\n}\n\ntype VideoSize = [number, number];\ntype RtcSessionSeiOptions = {\n repeatCount?: number;\n intervalMs?: number;\n};\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: { mediaTime: number }) => void,\n ) => number;\n cancelVideoFrameCallback?: (handle: number) => void;\n};\n\nconst REMOTE_OUTPUT_STALL_MS = 20000;\nconst REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS = 60000;\n/** Max local SEI cadence — Volcengine attaches one SEI per encoded frame; faster calls timeout. */\nconst SESSION_SEI_INTERVAL_MS = 500;\nconst DEFAULT_SEI_REPEAT_COUNT = 1;\n/** Cold publish: bootstrap already waits 3 frames — buffer before first start only. */\nexport const PUBLISH_START_MIN_FRAMES = 5;\nexport const PUBLISH_START_FRAME_TIMEOUT_MS = 800;\nexport const PUBLISH_COLD_MIN_FRAMES = 12;\nexport const PUBLISH_COLD_FRAME_TIMEOUT_MS = 1500;\n/** Minimum publish duration before first start (encoder/network warmup). */\nexport const PUBLISH_COLD_WARMUP_MS = 600;\n/** Skip cold-start ensure when publish has been active this long. */\nexport const PUBLISH_WARM_SKIP_MS = 800;\n/** Cold start: local canvas frames required before first start. */\nconst COLD_START_MIN_FRAMES = 3;\n/** Warm restart: quick sync — a few fresh frames right before start. */\nconst WARM_START_MIN_FRAMES = 1;\nconst WARM_START_FRAME_TIMEOUT_MS = 200;\n/** Brief settle after cold pipeline checks. */\nconst COLD_START_SETTLE_MS = 50;\n/** Max wait for stable outbound sentFrameRate on cold start; proceed on timeout. */\nconst COLD_START_OUTBOUND_TIMEOUT_MS = 1500;\n/** Hold start after outbound fps reaches min so encoder rate stabilizes. */\nconst COLD_START_OUTBOUND_STABLE_MS = 200;\n/** Treat outbound as ready when sentFrameRate reaches this (partial stats windows report low). */\nconst COLD_START_MIN_OUTBOUND_FPS = 5;\n/** Volcengine stats window is ~2s — used only by legacy wait helpers. */\nconst PUBLISH_READY_BUFFER_MS = 300;\nconst PUBLISH_READY_TIMEOUT_MS = 5000;\n\nexport type LocalPublishReadyResult = {\n ready: boolean;\n reason: \"sent-frame-rate\" | \"sent-bitrate\" | \"already-ready\" | \"not-published\" | \"timeout\";\n elapsedSincePublishMs: number;\n};\n\nexport class RtcManager {\n private engine: IRTCEngine | null = null;\n private leaveTask: Promise<void> | null = null;\n private readonly users = new Set<string>();\n private currentJoinInfo: RtcJoinInfo | null = null;\n private joined = false;\n private preserveRemoteDom = false;\n private localVideoPublished = false;\n private localVideoSourceType: VideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n private shouldMirrorLocalPreview = false;\n private externalVideoTrack: MediaStreamTrack | null = null;\n private remoteVideoUserId: string | null = null;\n private pendingRemoteVideoUserId: string | null = null;\n private pendingRemoteVideoMediaType: MediaType = MediaType.VIDEO;\n /** Subscribed to RTC media, but player may still be gated by SEI / container. */\n private subscribedRemoteUserId: string | null = null;\n private subscribedRemoteMediaType: MediaType = MediaType.VIDEO;\n private readonly onLog: RtcManagerOptions[\"onLog\"];\n private readonly onStateChange: RtcManagerOptions[\"onStateChange\"];\n private readonly onSeiGateChange: RtcManagerOptions[\"onSeiGateChange\"];\n private readonly onRemoteSeiReceived: RtcManagerOptions[\"onRemoteSeiReceived\"];\n private readonly onRemoteOutputStalled: RtcManagerOptions[\"onRemoteOutputStalled\"];\n private onRemotePlayerMounted: RtcManagerOptions[\"onRemotePlayerMounted\"];\n private localVideoContainer: HTMLElement | null = null;\n private remoteVideoContainer: HTMLElement | null = null;\n private expectedRemoteSei: string | null = null;\n private lastRemoteSei: string | null = null;\n private lastRemoteSeiUserId: string | null = null;\n private localSeiMessage: string | null = null;\n private localSeiRepeatCount = DEFAULT_SEI_REPEAT_COUNT;\n private seiSendInterval: ReturnType<typeof setInterval> | null = null;\n private lastSeiSentAtMs = 0;\n private hasLoggedSeiSendFailure = false;\n private seiSupport: \"unknown\" | \"supported\" | \"unsupported\" = \"unknown\";\n private hasLoggedSeiUnsupported = false;\n private readonly debug: boolean;\n private lastDebugSeiMatched: boolean | null = null;\n private lastDebugRemoteSei: string | null = null;\n private remoteFrameWatchStop: (() => void) | null = null;\n private uploadPreviewLayoutObserverStop: (() => void) | null = null;\n private remoteOutputRecoveryCooldownUntil = 0;\n private readonly i18n: SDKI18n;\n private joinedAtMs = 0;\n private publishStartedAtMs = 0;\n private lastRoomStartEventAtMs = 0;\n private localStreamStatsCount = 0;\n private firstNonZeroSentFrameRateAtMs = 0;\n private lastObservedSentFrameRate = 0;\n private publishReadyWaiters: Array<(result: LocalPublishReadyResult) => void> = [];\n private stablePublishWaiters: Array<() => void> = [];\n private publishReadyBufferTimer: ReturnType<typeof setTimeout> | null = null;\n private seiGateFallbackTimer: ReturnType<typeof setTimeout> | null = null;\n private seiMatchedDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private lastSentResolution = \"\";\n private lastReceivedResolution = \"\";\n private static readonly SEI_GATE_FALLBACK_MS = 6000;\n private static readonly SEI_MATCHED_DISPLAY_DELAY_MS = 200;\n\n constructor(options: RtcManagerOptions = {}) {\n this.onLog = options.onLog;\n this.onStateChange = options.onStateChange;\n this.onSeiGateChange = options.onSeiGateChange;\n this.onRemoteSeiReceived = options.onRemoteSeiReceived;\n this.onRemoteOutputStalled = options.onRemoteOutputStalled;\n this.debug = options.debug ?? false;\n this.i18n = options.i18n ?? createSDKI18n();\n }\n\n private emitSeiGateState(): void {\n const matched = this.isSeiMatched();\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei: this.lastRemoteSei,\n userId: this.lastRemoteSeiUserId,\n matched,\n });\n }\n\n setPreserveRemoteDom(preserve: boolean): void {\n this.preserveRemoteDom = preserve;\n }\n\n setOnRemotePlayerMounted(callback: RtcManagerOptions[\"onRemotePlayerMounted\"]): void {\n this.onRemotePlayerMounted = callback;\n }\n\n setLocalVideoContainer(container: HTMLElement | null): void {\n const previous = this.localVideoContainer;\n const changed = previous !== container;\n this.localVideoContainer = container;\n if (previous && changed) {\n previous.replaceChildren();\n }\n if (container && changed) {\n container.replaceChildren();\n }\n if (container && this.localVideoPublished && this.engine) {\n this.bindLocalVideoPlayer();\n }\n }\n\n setRemoteVideoContainer(container: HTMLElement | null): void {\n const previous = this.remoteVideoContainer;\n if (previous === container) {\n if (\n this.debug &&\n container &&\n container.childElementCount === 0 &&\n (this.remoteVideoUserId || this.pendingRemoteVideoUserId)\n ) {\n this.debugLog(\"setRemoteVideoContainer skipped but container empty\", {\n remoteVideoUserId: this.remoteVideoUserId,\n pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n });\n }\n return;\n }\n\n this.remoteVideoContainer = container;\n this.debugLog(\"setRemoteVideoContainer\", {\n hadPrevious: !!previous,\n next: !!container,\n remoteVideoUserId: this.remoteVideoUserId,\n pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n });\n if (previous) {\n previous.replaceChildren();\n }\n if (container && this.engine && this.joined && (this.remoteVideoUserId || this.pendingRemoteVideoUserId)) {\n void this.refreshRemoteVideoBinding();\n }\n }\n\n /** Display-only gate: expect bot output SEI to match task id — no local SEI send, no start blocking. */\n configureSessionSei(sessionId: string | null, _options: RtcSessionSeiOptions = {}): void {\n const normalizedSessionId = this.normalizeSei(sessionId)\n const previousExpectedRemoteSei = this.expectedRemoteSei\n\n this.stopSeiSending()\n this.clearSeiGateFallbackTimer()\n this.clearSeiMatchedDelayTimer()\n this.localSeiMessage = null\n this.expectedRemoteSei = this.seiSupport === \"unsupported\" ? null : normalizedSessionId\n this.lastRemoteSei = null\n this.lastRemoteSeiUserId = null\n this.hasLoggedSeiSendFailure = false\n\n if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId) {\n this.pendingRemoteVideoUserId = this.remoteVideoUserId\n this.remoteVideoUserId = null\n }\n\n this.emitSeiGateState()\n if (previousExpectedRemoteSei !== this.expectedRemoteSei && !this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer)\n }\n\n this.scheduleSeiGateFallback(normalizedSessionId)\n }\n\n private clearSeiGateFallbackTimer(): void {\n if (this.seiGateFallbackTimer !== null) {\n clearTimeout(this.seiGateFallbackTimer)\n this.seiGateFallbackTimer = null\n }\n }\n\n private clearSeiMatchedDelayTimer(): void {\n if (this.seiMatchedDelayTimer !== null) {\n clearTimeout(this.seiMatchedDelayTimer)\n this.seiMatchedDelayTimer = null\n }\n }\n\n /** Show output if bot SEI never arrives — UI gate only, RTC bind is not blocked. */\n private scheduleSeiGateFallback(expectedSei: string | null): void {\n this.clearSeiGateFallbackTimer()\n if (!expectedSei) {\n return\n }\n\n this.seiGateFallbackTimer = setTimeout(() => {\n this.seiGateFallbackTimer = null\n if (this.expectedRemoteSei !== expectedSei || this.isSeiMatched()) {\n return\n }\n this.log(\"warn\", this.i18n.t(\"rtc.seiGateFallback\"), { expectedSei })\n this.expectedRemoteSei = null\n this.emitSeiGateState()\n void this.refreshRemoteVideoBinding({ force: true })\n }, RtcManager.SEI_GATE_FALLBACK_MS)\n }\n\n get snapshot(): RtcStateSnapshot {\n return {\n roomId: this.currentJoinInfo?.roomId ?? null,\n userId: this.currentJoinInfo?.userId ?? null,\n appId: this.currentJoinInfo?.appId ?? null,\n botUserId: this.currentJoinInfo?.botName ?? null,\n joined: this.joined,\n localVideoPublished: this.localVideoPublished,\n remoteVideoUserId: this.remoteVideoUserId,\n users: Array.from(this.users),\n };\n }\n\n getLocalVideoSize(): { width: number; height: number } | null {\n if (!this.engine || !this.joined) {\n return null;\n }\n\n const track = this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\");\n if (!track) {\n return null;\n }\n\n const settings = track.getSettings?.();\n const width = typeof settings?.width === \"number\" ? settings.width : 0;\n const height = typeof settings?.height === \"number\" ? settings.height : 0;\n\n if (!width || !height) {\n return null;\n }\n\n return { width, height };\n }\n\n async join(joinInfo: RtcJoinInfo): Promise<void> {\n if (this.currentJoinInfo?.roomId === joinInfo.roomId && this.joined) {\n this.log(\"info\", this.i18n.t(\"rtc.alreadyInRoom\"), joinInfo);\n return;\n }\n\n await this.leave();\n this.currentJoinInfo = joinInfo;\n this.users.clear();\n this.users.add(joinInfo.userId);\n this.localVideoPublished = false;\n this.remoteVideoUserId = null;\n this.pendingRemoteVideoUserId = null;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n this.lastRemoteSei = null;\n this.lastRemoteSeiUserId = null;\n this.clearVideoContainers();\n\n const engine = VERTC.createEngine(joinInfo.appId);\n this.engine = engine;\n this.bindEngineEvents(engine);\n\n this.log(\"info\", this.i18n.t(\"rtc.joiningRoom\"), joinInfo);\n\n await engine.joinRoom(\n joinInfo.token,\n joinInfo.roomId,\n {\n userId: joinInfo.userId,\n },\n {\n isAutoPublish: false,\n isAutoSubscribeAudio: false,\n isAutoSubscribeVideo: true,\n roomProfileType: RoomProfileType.communication,\n },\n );\n\n this.joined = true;\n this.joinedAtMs = performance.now();\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.joinSuccess\"), this.snapshot);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n }\n\n async startVideoPublishing(size?: VideoSize): Promise<void> {\n if (!this.engine || !this.currentJoinInfo || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoined\"));\n }\n\n const publishStartedAtMs = performance.now();\n\n await this.applyVideoEncoderPreference(size);\n\n if (size) {\n await this.applyLocalVideoCaptureConfig(size);\n }\n\n if (this.localVideoPublished) {\n this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n return;\n }\n\n this.shouldMirrorLocalPreview = true;\n this.bindLocalVideoPlayer();\n await this.switchToInternalVideoSource();\n await this.engine.startVideoCapture();\n await this.engine.publishStream(MediaType.VIDEO);\n this.localVideoPublished = true;\n this.publishStartedAtMs = publishStartedAtMs;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastObservedSentFrameRate = 0;\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.localVideoPublished\"));\n }\n\n async startExternalVideoPublishing(\n track: MediaStreamTrack,\n encoderSize?: VideoSize,\n publishOptions?: ResolveRtcPublishFpsOptions,\n ): Promise<void> {\n if (!this.engine || !this.currentJoinInfo || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoined\"));\n }\n\n if (this.localVideoPublished) {\n this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n return;\n }\n\n const publishStartedAtMs = performance.now();\n\n const settings = track.getSettings?.();\n const width = typeof settings?.width === \"number\" && settings.width > 0 ? settings.width : undefined;\n const height = typeof settings?.height === \"number\" && settings.height > 0 ? settings.height : undefined;\n const encoderOptions = publishOptions?.highQuality !== false\n ? {\n ...publishOptions,\n highQuality: true,\n fps: publishOptions?.fps ?? resolvePlaybackDrivenEncoderFps(track),\n }\n : publishOptions;\n this.shouldMirrorLocalPreview = false;\n this.bindLocalVideoPlayer();\n await this.switchToExternalVideoSource(track);\n await this.engine.publishStream(MediaType.VIDEO);\n await this.applyVideoEncoderPreference(\n encoderSize ?? (width && height ? [width, height] : undefined),\n encoderOptions,\n );\n this.localVideoPublished = true;\n this.publishStartedAtMs = publishStartedAtMs;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastObservedSentFrameRate = 0;\n this.ensureSeiSupport();\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.externalVideoPublished\"));\n }\n\n async stopVideoPublishing(options?: { preserveExternalTrack?: boolean }): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n this.stopSeiSending();\n this.clearPublishReadyWaiters();\n\n if (this.localVideoPublished) {\n await this.engine.unpublishStream(MediaType.VIDEO);\n }\n\n if (this.localVideoSourceType === VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL) {\n await this.engine.stopVideoCapture();\n }\n\n if (this.externalVideoTrack) {\n if (!options?.preserveExternalTrack) {\n try {\n this.externalVideoTrack.stop();\n } catch {\n }\n }\n this.externalVideoTrack = null;\n }\n\n await this.switchToInternalVideoSource(false);\n this.clearUploadPreviewLayoutObserver();\n this.clearContainer(this.localVideoContainer);\n this.clearRemoteVideo();\n this.localVideoPublished = false;\n this.publishStartedAtMs = 0;\n this.lastSentResolution = \"\";\n this.emitState();\n this.log(\"warn\", this.i18n.t(\"rtc.localVideoStopped\"));\n }\n\n async leave(): Promise<void> {\n if (this.leaveTask) {\n await this.leaveTask;\n return;\n }\n\n const engine = this.engine;\n if (!engine) {\n return;\n }\n\n this.leaveTask = (async () => {\n try {\n if (this.localVideoPublished) {\n await this.stopVideoPublishing();\n }\n await engine.leaveRoom();\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.leaveRoomError\"), error);\n } finally {\n try {\n engine.destroy();\n } catch {\n }\n if (this.engine === engine) {\n this.engine = null;\n }\n this.currentJoinInfo = null;\n this.users.clear();\n this.joined = false;\n this.localVideoPublished = false;\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n this.shouldMirrorLocalPreview = false;\n this.externalVideoTrack = null;\n this.remoteVideoUserId = null;\n this.pendingRemoteVideoUserId = null;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n this.subscribedRemoteUserId = null;\n this.subscribedRemoteMediaType = MediaType.VIDEO;\n this.stopSeiSending();\n this.clearSeiGateFallbackTimer();\n this.clearSeiMatchedDelayTimer();\n this.stopRemoteFrameWatch();\n this.clearPublishReadyWaiters();\n this.joinedAtMs = 0;\n this.publishStartedAtMs = 0;\n this.lastRoomStartEventAtMs = 0;\n this.localStreamStatsCount = 0;\n this.firstNonZeroSentFrameRateAtMs = 0;\n this.lastSentResolution = \"\";\n this.lastReceivedResolution = \"\";\n this.clearVideoContainers();\n this.emitState();\n this.log(\"info\", this.i18n.t(\"rtc.engineDestroyed\"));\n }\n })();\n\n try {\n await this.leaveTask;\n } finally {\n this.leaveTask = null;\n }\n }\n\n /**\n * Resolve whether to wait for input frames before start.\n * Warm pipelines (restart / long-lived publish) skip — iOS sends start while frames already flow.\n */\n resolveInputFrameWaitOptions(): { minFrames: number; timeoutMs: number; minPublishMs: number } | null {\n if (!this.localVideoPublished || this.publishStartedAtMs <= 0) {\n return {\n minFrames: PUBLISH_COLD_MIN_FRAMES,\n timeoutMs: PUBLISH_COLD_FRAME_TIMEOUT_MS,\n minPublishMs: PUBLISH_COLD_WARMUP_MS,\n };\n }\n\n const elapsedMs = performance.now() - this.publishStartedAtMs;\n if (elapsedMs >= PUBLISH_WARM_SKIP_MS) {\n return null;\n }\n\n return {\n minFrames: PUBLISH_COLD_MIN_FRAMES,\n timeoutMs: Math.max(400, PUBLISH_COLD_FRAME_TIMEOUT_MS - Math.floor(elapsedMs)),\n minPublishMs: Math.max(0, PUBLISH_COLD_WARMUP_MS - elapsedMs),\n };\n }\n\n /**\n * Wait until the published input track produces enough frames before sending start.\n * Uses actual frame delivery instead of sentFrameRate (~2s Volcengine stats window).\n */\n async waitForPublishedInputFrames(\n options: { minFrames?: number; timeoutMs?: number } = {},\n ): Promise<{ ready: boolean; frameCount: number; elapsedMs: number }> {\n const track = this.externalVideoTrack\n ?? this.engine?.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\")\n ?? null;\n\n if (!track || track.readyState === \"ended\") {\n return { ready: false, frameCount: 0, elapsedMs: 0 };\n }\n\n const { waitForMediaStreamTrackFrames } = await import(\"./local-publish-diagnostics\");\n return waitForMediaStreamTrackFrames(track, {\n minFrames: options.minFrames ?? PUBLISH_START_MIN_FRAMES,\n timeoutMs: options.timeoutMs ?? PUBLISH_START_FRAME_TIMEOUT_MS,\n });\n }\n\n /**\n * Before every start: ensure the publish track is producing frames.\n * Cold — longer warmup; warm restart — quick sync (~200ms) so backend gets steady input after start.\n */\n async ensurePublishedInputBeforeStart(): Promise<void> {\n if (!this.localVideoPublished || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const publishAgeMs = performance.now() - this.publishStartedAtMs;\n const isCold = publishAgeMs < PUBLISH_WARM_SKIP_MS;\n\n if (!isCold && this.lastObservedSentFrameRate >= 15) {\n this.debugLog(\"ensurePublishedInputBeforeStart (warm, outbound steady)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n return;\n }\n\n if (isCold) {\n const [frameResult] = await Promise.all([\n this.waitForPublishedInputFrames({\n minFrames: COLD_START_MIN_FRAMES,\n timeoutMs: PUBLISH_START_FRAME_TIMEOUT_MS,\n }),\n this.waitForMinPublishDuration(PUBLISH_COLD_WARMUP_MS),\n ]);\n\n if (COLD_START_SETTLE_MS > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, COLD_START_SETTLE_MS);\n });\n }\n\n this.debugLog(\"ensurePublishedInputBeforeStart (cold)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n frameReady: frameResult.ready,\n frameCount: frameResult.frameCount,\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n return;\n }\n\n const frameResult = await this.waitForPublishedInputFrames({\n minFrames: WARM_START_MIN_FRAMES,\n timeoutMs: WARM_START_FRAME_TIMEOUT_MS,\n });\n\n if (!frameResult.ready && this.lastObservedSentFrameRate <= 0) {\n await this.waitForLocalPublishReady({ timeoutMs: 800 });\n }\n\n this.debugLog(\"ensurePublishedInputBeforeStart (warm sync)\", {\n publishAgeMs: Number(publishAgeMs.toFixed(1)),\n frameReady: frameResult.ready,\n frameCount: frameResult.frameCount,\n sentFrameRate: this.lastObservedSentFrameRate,\n });\n }\n\n /** @deprecated Use {@link ensurePublishedInputBeforeStart}. */\n async waitForRtcOutboundBeforeStart(options?: { timeoutMs?: number }): Promise<LocalPublishReadyResult> {\n const timeoutMs = options?.timeoutMs ?? PUBLISH_READY_TIMEOUT_MS;\n const publishAgeMs = this.publishStartedAtMs > 0\n ? performance.now() - this.publishStartedAtMs\n : 0;\n\n const localFramesPromise = publishAgeMs >= PUBLISH_WARM_SKIP_MS\n ? Promise.resolve({ ready: true, frameCount: 0, elapsedMs: 0 })\n : this.waitForPublishedInputFrames({\n minFrames: PUBLISH_START_MIN_FRAMES,\n timeoutMs: PUBLISH_START_FRAME_TIMEOUT_MS,\n });\n\n const [, rtcReady] = await Promise.all([\n localFramesPromise,\n this.waitForLocalPublishReady({ timeoutMs }),\n ]);\n\n return rtcReady;\n }\n\n /** @deprecated Use {@link waitForRtcOutboundBeforeStart}. */\n async waitForPublishedInputFramesBeforeStart(): Promise<{\n ready: boolean;\n frameCount: number;\n elapsedMs: number;\n rtcSendReady: boolean;\n rtcSendReason?: LocalPublishReadyResult[\"reason\"];\n rtcSendElapsedMs?: number;\n }> {\n const waitOptions = this.resolveInputFrameWaitOptions();\n const waitTasks: Array<Promise<unknown>> = [\n this.waitForLocalPublishReady({ timeoutMs: PUBLISH_READY_TIMEOUT_MS }),\n ];\n\n if (waitOptions) {\n waitTasks.push(\n this.waitForMinPublishDuration(waitOptions.minPublishMs),\n this.waitForPublishedInputFrames({\n minFrames: waitOptions.minFrames,\n timeoutMs: waitOptions.timeoutMs,\n }),\n );\n }\n\n const [rtcResult, ...rest] = await Promise.all(waitTasks);\n const rtcSend = rtcResult as LocalPublishReadyResult;\n const frameResult = waitOptions\n ? (rest[1] as { ready: boolean; frameCount: number; elapsedMs: number })\n : { ready: true, frameCount: 0, elapsedMs: 0 };\n\n return {\n ...frameResult,\n rtcSendReady: rtcSend.ready,\n rtcSendReason: rtcSend.reason,\n rtcSendElapsedMs: rtcSend.elapsedSincePublishMs,\n };\n }\n\n private async waitForMinPublishDuration(minMs: number): Promise<void> {\n if (minMs <= 0 || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const elapsedMs = performance.now() - this.publishStartedAtMs;\n const remainingMs = minMs - elapsedMs;\n if (remainingMs <= 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, remainingMs);\n });\n }\n\n /**\n * Subscribe to the bot output stream before start — iOS bindRemoteVideoRenderer runs pre-request.\n */\n async prepareRemoteVideoForGeneration(): Promise<void> {\n const botUserId = this.currentJoinInfo?.botName?.trim();\n if (!botUserId || !this.engine || !this.joined) {\n return;\n }\n\n this.pendingRemoteVideoUserId = botUserId;\n this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n await this.ensureRemoteStreamSubscribed(botUserId, MediaType.VIDEO);\n }\n\n /**\n * Wait until outbound sentFrameRate reaches minFps and stays there for stableMs.\n * Avoids starting while Volcengine encoder is still ramping (causes early dropped frames).\n */\n async waitForStableLocalPublishReady(options?: {\n minFps?: number;\n timeoutMs?: number;\n stableMs?: number;\n }): Promise<LocalPublishReadyResult> {\n const minFps = options?.minFps ?? COLD_START_MIN_OUTBOUND_FPS;\n const timeoutMs = options?.timeoutMs ?? COLD_START_OUTBOUND_TIMEOUT_MS;\n const stableMs = options?.stableMs ?? COLD_START_OUTBOUND_STABLE_MS;\n const publishStartedAtMs = this.publishStartedAtMs;\n\n if (!this.localVideoPublished || publishStartedAtMs <= 0) {\n return {\n ready: false,\n reason: \"not-published\",\n elapsedSincePublishMs: 0,\n };\n }\n\n return new Promise((resolve) => {\n let settled = false;\n let stableTimer: ReturnType<typeof setTimeout> | null = null;\n\n const finish = (result: LocalPublishReadyResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeoutTimer);\n if (stableTimer !== null) {\n clearTimeout(stableTimer);\n }\n const index = this.stablePublishWaiters.indexOf(check);\n if (index >= 0) {\n this.stablePublishWaiters.splice(index, 1);\n }\n resolve(result);\n };\n\n const check = () => {\n if (this.lastObservedSentFrameRate >= minFps) {\n if (stableTimer === null) {\n stableTimer = setTimeout(() => {\n finish({\n ready: true,\n reason: \"sent-frame-rate\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, stableMs);\n }\n return;\n }\n if (stableTimer !== null) {\n clearTimeout(stableTimer);\n stableTimer = null;\n }\n };\n\n this.stablePublishWaiters.push(check);\n check();\n\n const timeoutTimer = setTimeout(() => {\n finish({\n ready: this.lastObservedSentFrameRate > 0,\n reason: \"timeout\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, timeoutMs);\n });\n }\n\n /**\n * Wait until Volcengine reports non-zero sentFrameRate (~2s stats window).\n * Prefer this over local track frame counts before start — backend only processes from start.\n */\n async waitForLocalPublishReady(options?: { timeoutMs?: number }): Promise<LocalPublishReadyResult> {\n const timeoutMs = options?.timeoutMs ?? PUBLISH_READY_TIMEOUT_MS;\n const publishStartedAtMs = this.publishStartedAtMs;\n\n if (!this.localVideoPublished || publishStartedAtMs <= 0) {\n return {\n ready: false,\n reason: \"not-published\",\n elapsedSincePublishMs: 0,\n };\n }\n\n if (this.firstNonZeroSentFrameRateAtMs > 0) {\n return {\n ready: true,\n reason: \"already-ready\",\n elapsedSincePublishMs: Number((this.firstNonZeroSentFrameRateAtMs - publishStartedAtMs).toFixed(1)),\n };\n }\n\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: LocalPublishReadyResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeoutTimer);\n const index = this.publishReadyWaiters.indexOf(onReady);\n if (index >= 0) {\n this.publishReadyWaiters.splice(index, 1);\n }\n resolve(result);\n };\n\n const onReady = (result: LocalPublishReadyResult) => finish(result);\n this.publishReadyWaiters.push(onReady);\n\n const timeoutTimer = setTimeout(() => {\n finish({\n ready: false,\n reason: \"timeout\",\n elapsedSincePublishMs: Number((performance.now() - publishStartedAtMs).toFixed(1)),\n });\n }, timeoutMs);\n });\n }\n\n async sendRoomEvent(event: unknown): Promise<void> {\n this.ensureReadyForMessaging();\n const payload = JSON.stringify(event);\n const eventName = typeof event === \"object\" && event !== null && \"event\" in event\n ? String((event as { event?: unknown }).event ?? \"unknown\")\n : \"unknown\";\n\n if (eventName === \"start\") {\n this.lastRoomStartEventAtMs = performance.now();\n }\n await this.engine?.sendRoomMessage(payload);\n this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), event);\n }\n\n clearRemoteVideo(options?: { preserveDom?: boolean }): void {\n this.stopRemoteFrameWatch();\n if (!options?.preserveDom && !this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer);\n }\n if (this.remoteVideoUserId) {\n this.pendingRemoteVideoUserId = this.remoteVideoUserId;\n this.remoteVideoUserId = null;\n this.emitState();\n }\n }\n\n async refreshRemoteVideoBinding(options?: { force?: boolean }): Promise<void> {\n const targetUserId = this.remoteVideoUserId ?? this.pendingRemoteVideoUserId;\n if (!this.engine || !targetUserId || !this.remoteVideoContainer) {\n return;\n }\n\n await this.ensureRemoteStreamSubscribed(targetUserId, this.pendingRemoteVideoMediaType);\n\n if (!this.canRenderRemoteVideo(targetUserId)) {\n this.debugLog(\"refreshRemoteVideoBinding blocked by SEI gate\", {\n targetUserId,\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n });\n return;\n }\n\n if (\n !options?.force &&\n this.remoteVideoUserId === targetUserId &&\n this.remoteVideoContainer &&\n this.remoteVideoContainer.childElementCount > 0\n ) {\n this.debugLog(\"refreshRemoteVideoBinding skipped (already mounted)\", { targetUserId });\n return;\n }\n\n try {\n await this.mountRemoteVideoPlayer(\n targetUserId,\n this.remoteVideoContainer,\n this.pendingRemoteVideoMediaType,\n options?.force,\n );\n this.remoteVideoUserId = targetUserId;\n this.pendingRemoteVideoUserId = null;\n this.emitState();\n this.startRemoteFrameWatch(targetUserId);\n this.emitRemotePlayerMounted();\n this.log(\"info\", this.i18n.t(\"rtc.remotePlayerRefreshed\", { userId: targetUserId }));\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.remotePlayerRefreshFailed\"), error);\n }\n }\n\n private bindEngineEvents(engine: IRTCEngine): void {\n engine.on(VERTC.events.onUserJoined, (event) => {\n this.users.add(event.userInfo.userId);\n this.emitState();\n this.log(\"success\", this.i18n.t(\"rtc.userJoined\", { userId: event.userInfo.userId }), event);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n });\n\n engine.on(VERTC.events.onUserLeave, (event) => {\n this.users.delete(event.userInfo.userId);\n if (this.remoteVideoUserId === event.userInfo.userId) {\n this.remoteVideoUserId = null;\n this.clearContainer(this.remoteVideoContainer);\n }\n if (this.pendingRemoteVideoUserId === event.userInfo.userId) {\n this.pendingRemoteVideoUserId = null;\n }\n this.emitState();\n this.log(\"warn\", this.i18n.t(\"rtc.userLeft\", { userId: event.userInfo.userId }), event);\n this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n });\n\n engine.on(VERTC.events.onConnectionStateChanged, (event) => {\n this.log(\"info\", this.i18n.t(\"rtc.connectionStateChanged\"), event);\n });\n\n engine.on(VERTC.events.onUserPublishStream, (event) => {\n this.log(\"success\", this.i18n.t(\"rtc.userPublished\", { userId: event.userId }), event);\n if (this.supportsVideo(event.mediaType)) {\n void this.attachRemoteVideo(event.userId, event.mediaType);\n }\n });\n\n engine.on(VERTC.events.onUserUnpublishStream, (event) => {\n this.log(\"warn\", this.i18n.t(\"rtc.userUnpublished\", { userId: event.userId }), event);\n this.debugLog(\"onUserUnpublishStream\", {\n userId: event.userId,\n mediaType: event.mediaType,\n remoteVideoUserId: this.remoteVideoUserId,\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n });\n if (this.remoteVideoUserId === event.userId && this.supportsVideo(event.mediaType)) {\n this.pendingRemoteVideoUserId = event.userId;\n this.pendingRemoteVideoMediaType = event.mediaType;\n this.remoteVideoUserId = null;\n this.stopRemoteFrameWatch();\n if (!this.preserveRemoteDom) {\n this.clearContainer(this.remoteVideoContainer);\n }\n this.emitState();\n return;\n }\n });\n\n engine.on(VERTC.events.onSEIMessageReceived, (event) => {\n const userId = event.remoteStreamKey.userId;\n const sei = this.normalizeSei(this.decodeSeiMessage(event.sei));\n\n if (sei && this.isRemoteSeiUser(userId)) {\n this.onRemoteSeiReceived?.({ sei, userId });\n }\n\n this.lastRemoteSei = sei;\n this.lastRemoteSeiUserId = userId;\n\n const matched = this.isSeiMatched();\n const seiStateChanged =\n this.lastDebugSeiMatched !== matched ||\n this.lastDebugRemoteSei !== sei;\n\n if (!this.debug || seiStateChanged) {\n this.log(\"info\", this.i18n.t(\"rtc.seiReceived\", { userId }), { userId, sei, matched });\n }\n\n if (this.debug && seiStateChanged) {\n this.debugLog(\"onSEIMessageReceived\", {\n userId,\n sei,\n matched,\n expectedRemoteSei: this.expectedRemoteSei,\n });\n this.lastDebugSeiMatched = matched;\n this.lastDebugRemoteSei = sei;\n }\n\n if (!matched) {\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei,\n userId,\n matched: false,\n });\n return;\n }\n\n // If already matched and waiting for delay, do nothing\n if (this.seiMatchedDelayTimer !== null) {\n return;\n }\n\n this.clearSeiGateFallbackTimer();\n this.stopSeiSending();\n\n this.seiMatchedDelayTimer = setTimeout(() => {\n this.seiMatchedDelayTimer = null;\n\n // Double check if it's still matched (in case expectedRemoteSei changed during delay)\n if (!this.isSeiMatched()) {\n return;\n }\n\n this.onSeiGateChange?.({\n expectedSei: this.expectedRemoteSei,\n sei,\n userId,\n matched: true,\n });\n\n if (this.remoteVideoUserId === userId) {\n return;\n }\n\n void this.attachRemoteVideo(userId, this.pendingRemoteVideoMediaType);\n }, RtcManager.SEI_MATCHED_DISPLAY_DELAY_MS);\n });\n\n engine.on(VERTC.events.onError, (event) => {\n this.log(\"error\", this.i18n.t(\"rtc.error\", { code: String(event.errorCode) }), event);\n });\n\n engine.on(VERTC.events.onPublishResult, (event) => {\n this.debugLog(\"onPublishResult\", {\n ...event,\n elapsedSincePublishMs: this.publishStartedAtMs > 0\n ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n : null,\n });\n });\n\n engine.on(VERTC.events.onLocalStreamStats, (stats) => {\n this.logLocalStreamStats(stats);\n if (stats.videoStats) {\n // Volcengine Web SDK's LocalStreamStats may not have sentResolutionWidth/Height directly\n // Use encodedFrameWidth/encodedFrameHeight as fallback, or capture settings\n const width = (stats.videoStats as any).sentResolutionWidth ?? (stats.videoStats as any).encodedFrameWidth ?? 0;\n const height = (stats.videoStats as any).sentResolutionHeight ?? (stats.videoStats as any).encodedFrameHeight ?? 0;\n const sentFrameRate = stats.videoStats.sentFrameRate ?? 0;\n\n const res = `${width}x${height}`;\n if (width > 0 && height > 0 && res !== this.lastSentResolution) {\n this.lastSentResolution = res;\n }\n }\n });\n\n engine.on(VERTC.events.onRemoteStreamStats, (stats: any) => {\n if (stats?.videoStats) {\n const { width, height, receivedFrameRate } = stats.videoStats;\n const w = width ?? 0;\n const h = height ?? 0;\n const res = `${w}x${h}`;\n if (w > 0 && h > 0 && res !== this.lastReceivedResolution) {\n this.lastReceivedResolution = res;\n }\n }\n });\n\n engine.on(VERTC.events.onLocalStatsException, (exception) => {\n this.debugLog(\"onLocalStatsException\", {\n exception,\n elapsedSincePublishMs: this.publishStartedAtMs > 0\n ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n : null,\n });\n });\n\n engine.on(VERTC.events.onTrackMute, (event) => {\n this.debugLog(\"onTrackMute\", event);\n });\n\n engine.on(VERTC.events.onTrackUnmute, (event) => {\n this.debugLog(\"onTrackUnmute\", event);\n });\n }\n\n private emitState(): void {\n this.onStateChange?.(this.snapshot);\n }\n\n private ensureReadyForMessaging(): void {\n if (!this.engine || !this.joined) {\n throw new Error(this.i18n.t(\"errors.rtcNotJoinedForMessaging\"));\n }\n }\n\n private bindLocalVideoPlayer(force = false): void {\n if (!this.localVideoContainer) {\n return;\n }\n const container = this.getRequiredContainer(this.localVideoContainer, \"local\");\n if (!force && container.childElementCount > 0) {\n this.bindUploadPreviewLayout(container);\n return;\n }\n container.replaceChildren();\n this.engine?.setLocalVideoMirrorType(\n this.shouldMirrorLocalPreview\n ? MirrorType.MIRROR_TYPE_RENDER\n : MirrorType.MIRROR_TYPE_NONE,\n );\n this.engine?.setLocalVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n renderDom: container,\n renderMode: resolveVideoRenderMode(container),\n });\n this.bindUploadPreviewLayout(container);\n }\n\n private bindUploadPreviewLayout(container: HTMLElement): void {\n this.uploadPreviewLayoutObserverStop?.();\n this.uploadPreviewLayoutObserverStop = null;\n applyUploadPreviewMediaLayout(container);\n this.uploadPreviewLayoutObserverStop = observeUploadPreviewMediaLayout(container);\n }\n\n private clearUploadPreviewLayoutObserver(): void {\n this.uploadPreviewLayoutObserverStop?.();\n this.uploadPreviewLayoutObserverStop = null;\n }\n\n /** Re-bind local preview after the container becomes visible or is resized (mobile H5). */\n refreshLocalVideoPreview(options?: { force?: boolean }): void {\n if (!this.engine || !this.localVideoPublished || !this.localVideoContainer) {\n return;\n }\n this.bindLocalVideoPlayer(options?.force);\n }\n\n private async switchToExternalVideoSource(track: MediaStreamTrack): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n this.externalVideoTrack = track;\n await this.engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL);\n await this.engine.setExternalVideoTrack(StreamIndex.STREAM_INDEX_MAIN, track);\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL;\n }\n\n private async switchToInternalVideoSource(shouldSetConfig = true): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n if (this.localVideoSourceType === VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL) {\n return;\n }\n\n await this.engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL);\n this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n if (shouldSetConfig && this.externalVideoTrack) {\n this.externalVideoTrack = null;\n }\n }\n\n private async applyLocalVideoCaptureConfig([width, height]: VideoSize): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n await this.engine.setVideoCaptureConfig({\n width,\n height,\n });\n this.log(\"info\", this.i18n.t(\"rtc.captureSizeSet\", { width, height }));\n }\n\n private resolveEncoderMaxKbps(width: number, height: number, highQuality = true): number {\n const pixels = width * height;\n if (highQuality) {\n if (pixels >= 2_000_000) {\n return 6000;\n }\n if (pixels >= 1_000_000) {\n return 4000;\n }\n return 3000;\n }\n if (pixels >= 2_000_000) {\n return 5000;\n }\n if (pixels >= 1_000_000) {\n return 3000;\n }\n return 2000;\n }\n\n private async applyVideoEncoderPreference(\n size?: VideoSize,\n publishOptions?: ResolveRtcPublishFpsOptions,\n ): Promise<void> {\n if (!this.engine) {\n return;\n }\n\n try {\n const width = size?.[0] ?? 1280;\n const height = size?.[1] ?? 720;\n\n if (publishOptions) {\n const fps = publishOptions.fps ?? 30;\n const maxKbps = this.resolveEncoderMaxKbps(width, height, publishOptions.highQuality);\n await this.engine.setVideoEncoderConfig({\n width,\n height,\n frameRate: fps,\n maxKbps,\n contentHint: \"detail\",\n preferCodecName: VideoCodecType.H264,\n });\n } else {\n await this.engine.setVideoEncoderConfig({\n width,\n height,\n frameRate: 24,\n maxKbps: -1,\n contentHint: \"detail\",\n // @ts-expect-error: encodePreference is supported by ByteRTC SDK but may be missing from current typings\n encodePreference: 1, \n preferCodecName: VideoCodecType.H264,\n });\n }\n\n this.log(\"info\", this.i18n.t(\"rtc.encoderPreferenceSet\"), size);\n } catch (error) {\n this.log(\"warn\", this.i18n.t(\"rtc.encoderPreferenceFailed\"), error);\n }\n }\n\n private async attachRemoteVideo(userId: string, mediaType: MediaType): Promise<void> {\n if (!this.engine || !this.currentJoinInfo) {\n return;\n }\n\n const preferredBotUserId = this.currentJoinInfo.botName?.trim() || null;\n const shouldReplaceCurrent =\n this.remoteVideoUserId === null ||\n userId === preferredBotUserId ||\n this.remoteVideoUserId !== preferredBotUserId;\n\n if (!shouldReplaceCurrent) {\n return;\n }\n\n this.pendingRemoteVideoUserId = userId;\n this.pendingRemoteVideoMediaType = mediaType;\n\n // Subscribe immediately so frames are not dropped while SEI gate / UI hide output.\n await this.ensureRemoteStreamSubscribed(userId, mediaType);\n\n if (!this.canRenderRemoteVideo(userId)) {\n this.log(\"info\", this.i18n.t(\"rtc.remoteWaitSei\", { userId }), {\n expectedRemoteSei: this.expectedRemoteSei,\n lastRemoteSei: this.lastRemoteSei,\n lastRemoteSeiUserId: this.lastRemoteSeiUserId,\n });\n return;\n }\n\n const container = this.remoteVideoContainer;\n if (!container) {\n this.log(\"warn\", this.i18n.t(\"rtc.remoteContainerNotReady\"), { userId, mediaType });\n return;\n }\n await this.mountRemoteVideoPlayer(userId, container, mediaType);\n this.remoteVideoUserId = userId;\n this.pendingRemoteVideoUserId = null;\n this.emitState();\n this.startRemoteFrameWatch(userId);\n this.emitRemotePlayerMounted();\n this.log(\"success\", this.i18n.t(\"rtc.remotePlayerBound\", { userId }));\n }\n\n private async ensureRemoteStreamSubscribed(userId: string, mediaType: MediaType): Promise<void> {\n if (!this.engine) {\n return;\n }\n if (this.subscribedRemoteUserId === userId) {\n return;\n }\n\n await this.engine.subscribeStream(userId, mediaType);\n this.subscribedRemoteUserId = userId;\n this.subscribedRemoteMediaType = mediaType;\n this.debugLog(\"ensureRemoteStreamSubscribed\", { userId, mediaType });\n }\n\n private bindRemoteVideoPlayerToContainer(userId: string, container: HTMLElement): void {\n if (!this.engine) {\n return;\n }\n\n this.engine.setRemoteVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n userId,\n renderDom: container,\n renderMode: resolveVideoRenderMode(container),\n });\n this.bindUploadPreviewLayout(container);\n }\n\n private async mountRemoteVideoPlayer(\n userId: string,\n container: HTMLElement,\n mediaType: MediaType,\n force = false,\n ): Promise<void> {\n if (!this.engine) {\n return;\n }\n if (\n !force &&\n this.remoteVideoUserId === userId &&\n container === this.remoteVideoContainer &&\n container.childElementCount > 0\n ) {\n this.debugLog(\"mountRemoteVideoPlayer skipped (already mounted)\", { userId });\n return;\n }\n this.debugLog(force ? \"mountRemoteVideoPlayer (force)\" : \"mountRemoteVideoPlayer\", {\n userId,\n mediaType,\n childCountBefore: container.childElementCount,\n });\n this.stopRemoteFrameWatch();\n container.replaceChildren();\n await this.ensureRemoteStreamSubscribed(userId, mediaType);\n this.bindRemoteVideoPlayerToContainer(userId, container);\n }\n\n private startRemoteFrameWatch(userId: string): void {\n this.stopRemoteFrameWatch();\n\n let lastFrameAt = 0;\n let hadFirstFrame = false;\n let rvfcHandle: number | null = null;\n let watchedVideo: HTMLVideoElement | null = null;\n\n const onFrame = () => {\n lastFrameAt = Date.now();\n hadFirstFrame = true;\n };\n\n const bindRvfc = (video: HTMLVideoElement) => {\n if (watchedVideo === video && rvfcHandle !== null) {\n return;\n }\n if (watchedVideo && watchedVideo !== video) {\n watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n }\n watchedVideo = video;\n const rvfcVideo = video as VideoWithFrameCallback;\n if (rvfcVideo.requestVideoFrameCallback) {\n const schedule = () => {\n if (this.remoteVideoUserId !== userId) {\n return;\n }\n rvfcHandle = rvfcVideo.requestVideoFrameCallback!(() => {\n onFrame();\n schedule();\n });\n };\n schedule();\n return;\n }\n video.addEventListener(\"timeupdate\", onFrame);\n };\n\n const pollTimer = setInterval(() => {\n if (this.remoteVideoUserId !== userId || !this.remoteVideoContainer) {\n return;\n }\n\n const video = this.remoteVideoContainer.querySelector(\"video\");\n if (video) {\n bindRvfc(video);\n }\n\n if (!hadFirstFrame || lastFrameAt === 0) {\n return;\n }\n\n const stallMs = Date.now() - lastFrameAt;\n if (stallMs < REMOTE_OUTPUT_STALL_MS) {\n return;\n }\n\n if (Date.now() < this.remoteOutputRecoveryCooldownUntil) {\n return;\n }\n\n this.remoteOutputRecoveryCooldownUntil = Date.now() + REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS;\n this.debugLog(\"remote output stalled\", { userId, stallMs });\n this.log(\"warn\", this.i18n.t(\"rtc.remoteOutputStalled\"), { userId, stallMs });\n this.onRemoteOutputStalled?.({ userId, stallMs });\n\n hadFirstFrame = false;\n lastFrameAt = 0;\n }, 3000);\n\n this.remoteFrameWatchStop = () => {\n clearInterval(pollTimer);\n if (watchedVideo) {\n watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n }\n if (rvfcHandle !== null && watchedVideo) {\n const rvfcVideo = watchedVideo as VideoWithFrameCallback;\n rvfcVideo.cancelVideoFrameCallback?.(rvfcHandle);\n }\n rvfcHandle = null;\n watchedVideo = null;\n };\n }\n\n private stopRemoteFrameWatch(): void {\n this.remoteFrameWatchStop?.();\n this.remoteFrameWatchStop = null;\n }\n\n private isRemoteSeiUser(userId: string): boolean {\n const localUserId = this.currentJoinInfo?.userId?.trim();\n if (localUserId && userId === localUserId) {\n return false;\n }\n\n const botUserId = this.currentJoinInfo?.botName?.trim();\n if (botUserId) {\n return userId === botUserId;\n }\n\n return true;\n }\n \n /** Always mount remote player — SEI gate is UI-only (see deriveOutputVisibility). */\n private canRenderRemoteVideo(_userId: string): boolean {\n return true;\n }\n\n /** Whether remote SEI matches the active task (display gate). */\n private isSeiMatched(): boolean {\n if (this.seiSupport === \"unsupported\") {\n return true;\n }\n if (!this.expectedRemoteSei) {\n return true;\n }\n return this.lastRemoteSei === this.expectedRemoteSei;\n }\n\n /** Low-rate SEI until remote output SEI matches — avoids Volcengine sendSEIMessage timeouts. */\n private startContinuousSeiSending(): void {\n this.stopSeiSending();\n\n if (\n !this.localSeiMessage ||\n !this.engine ||\n !this.joined ||\n !this.localVideoPublished ||\n this.seiSupport === \"unsupported\"\n ) {\n return;\n }\n\n const tick = () => {\n if (this.isSeiMatched() && this.expectedRemoteSei) {\n this.stopSeiSending();\n return;\n }\n this.flushSeiMessage();\n };\n\n this.seiSendInterval = setInterval(tick, SESSION_SEI_INTERVAL_MS);\n }\n\n private stopSeiSending(): void {\n if (this.seiSendInterval !== null) {\n this.debugLog(\"stopSeiSending\");\n clearInterval(this.seiSendInterval);\n this.seiSendInterval = null;\n }\n this.lastSeiSentAtMs = 0;\n }\n\n private canSendLocalSeiNow(): boolean {\n if (this.firstNonZeroSentFrameRateAtMs <= 0) {\n return false;\n }\n const now = performance.now();\n return now - this.lastSeiSentAtMs >= SESSION_SEI_INTERVAL_MS - 16;\n }\n\n private flushSeiMessage(): void {\n if (\n !this.engine ||\n !this.joined ||\n !this.localVideoPublished ||\n !this.localSeiMessage ||\n this.seiSupport === \"unsupported\"\n ) {\n return;\n }\n\n if (!this.canSendLocalSeiNow()) {\n return;\n }\n\n this.lastSeiSentAtMs = performance.now();\n try {\n this.engine.sendSEIMessage(StreamIndex.STREAM_INDEX_MAIN, this.localSeiMessage, this.localSeiRepeatCount);\n } catch (error) {\n if (!this.hasLoggedSeiSendFailure) {\n this.log(\"warn\", this.i18n.t(\"rtc.sendSeiFailed\"), error);\n this.hasLoggedSeiSendFailure = true;\n }\n this.stopSeiSending();\n }\n }\n\n private ensureSeiSupport(): void {\n if (this.seiSupport !== \"unknown\") {\n return;\n }\n\n void VERTC.getSupportedCodecs()\n .then((codecs) => {\n const supported = codecs.some((c) => c.toLowerCase() === \"h264\" || c.toLowerCase() === \"h.264\");\n this.seiSupport = supported ? \"supported\" : \"unsupported\";\n\n if (this.seiSupport === \"unsupported\" && !this.hasLoggedSeiUnsupported) {\n this.hasLoggedSeiUnsupported = true;\n this.log(\"warn\", this.i18n.t(\"rtc.seiUnsupported\"), codecs);\n }\n\n if (this.seiSupport === \"unsupported\") {\n this.expectedRemoteSei = null;\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n } else if (this.localSeiMessage) {\n this.startContinuousSeiSending();\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n }\n })\n .catch((error) => {\n this.seiSupport = \"unsupported\";\n if (!this.hasLoggedSeiUnsupported) {\n this.hasLoggedSeiUnsupported = true;\n this.log(\"warn\", this.i18n.t(\"rtc.getCodecsFailed\"), error);\n }\n this.expectedRemoteSei = null;\n this.emitSeiGateState();\n void this.refreshRemoteVideoBinding();\n });\n }\n\n private normalizeSei(value: string | null | undefined): string | null {\n const normalized = value?.trim();\n if (!normalized) {\n return null;\n }\n return normalized.startsWith(\"task-\") ? normalized.slice(\"task-\".length) : normalized;\n }\n\n private normalizeSeiRepeatCount(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return DEFAULT_SEI_REPEAT_COUNT;\n }\n return Math.max(0, Math.min(4, Math.floor(value)));\n }\n\n private decodeSeiMessage(sei: Uint8Array): string | null {\n try {\n return new TextDecoder().decode(sei);\n } catch {\n return null;\n }\n }\n private supportsVideo(mediaType: MediaType): boolean {\n return mediaType === MediaType.VIDEO || mediaType === MediaType.AUDIO_AND_VIDEO;\n }\n private clearVideoContainers(): void {\n this.stopRemoteFrameWatch();\n this.clearContainer(this.localVideoContainer);\n this.clearContainer(this.remoteVideoContainer);\n }\n\n private clearContainer(container: HTMLElement | null): void {\n container?.replaceChildren();\n }\n\n private getRequiredContainer(\n container: HTMLElement | null,\n containerType: \"local\" | \"remote\",\n ): HTMLElement {\n if (!container) {\n throw new Error(`missing ${containerType} video container`);\n }\n return container;\n }\n\n private emitRemotePlayerMounted(): void {\n this.onRemotePlayerMounted?.();\n }\n\n private log(level: RtcLogEntry[\"level\"], message: string, data?: unknown): void {\n this.onLog?.({ level, message, data });\n }\n\n private resolvePublishReadyWaiters(reason: LocalPublishReadyResult[\"reason\"]): void {\n if (this.publishReadyWaiters.length === 0 || this.publishStartedAtMs <= 0) {\n return;\n }\n\n const result: LocalPublishReadyResult = {\n ready: true,\n reason,\n elapsedSincePublishMs: Number((performance.now() - this.publishStartedAtMs).toFixed(1)),\n };\n const waiters = this.publishReadyWaiters.splice(0);\n for (const waiter of waiters) {\n waiter(result);\n }\n }\n\n private clearPublishReadyWaiters(): void {\n if (this.publishReadyBufferTimer !== null) {\n clearTimeout(this.publishReadyBufferTimer);\n this.publishReadyBufferTimer = null;\n }\n this.publishReadyWaiters = [];\n this.stablePublishWaiters = [];\n }\n\n private notifyStablePublishWaiters(): void {\n if (this.stablePublishWaiters.length === 0) {\n return;\n }\n const waiters = this.stablePublishWaiters.slice();\n for (const waiter of waiters) {\n waiter();\n }\n }\n\n private schedulePublishReadyWhenStable(sentFrameRate: number): void {\n if (this.publishReadyWaiters.length === 0 || this.publishReadyBufferTimer !== null) {\n return;\n }\n if (sentFrameRate <= 0) {\n return;\n }\n\n this.publishReadyBufferTimer = setTimeout(() => {\n this.publishReadyBufferTimer = null;\n this.resolvePublishReadyWaiters(\"sent-frame-rate\");\n }, PUBLISH_READY_BUFFER_MS);\n }\n\n private logLocalStreamStats(stats: LocalStreamStats): void {\n if (!this.localVideoPublished) {\n return;\n }\n\n this.localStreamStatsCount += 1;\n const nowMs = performance.now();\n const sentFrameRate = stats.videoStats?.sentFrameRate ?? 0;\n\n if (sentFrameRate > 0 && this.firstNonZeroSentFrameRateAtMs === 0) {\n this.firstNonZeroSentFrameRateAtMs = nowMs;\n }\n\n this.lastObservedSentFrameRate = sentFrameRate;\n this.schedulePublishReadyWhenStable(sentFrameRate);\n this.notifyStablePublishWaiters();\n }\n\n private debugLog(message: string, data?: unknown): void {\n if (!this.debug) {\n return;\n }\n this.log(\"info\", `[debug] ${message}`, data);\n }\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","export type CropRect = {\n x: number\n y: number\n width: number\n height: number\n}\n\n/** Center-crop source to target aspect (same rule as upload video pipeline). */\nexport function computeCenterCropRect(\n sourceWidth: number,\n sourceHeight: number,\n targetAspect: number,\n): CropRect {\n const sourceAspect = sourceWidth / sourceHeight\n\n if (sourceAspect > targetAspect) {\n const height = sourceHeight\n const width = sourceHeight * targetAspect\n return {\n x: (sourceWidth - width) / 2,\n y: 0,\n width,\n height,\n }\n }\n\n const width = sourceWidth\n const height = sourceWidth / targetAspect\n return {\n x: 0,\n y: (sourceHeight - height) / 2,\n width,\n height,\n }\n}\n","import { computeCenterCropRect } from './capture-crop'\n\nexport function drawSourceCenterCrop(\n ctx: CanvasRenderingContext2D,\n source: CanvasImageSource,\n outputWidth: number,\n outputHeight: number,\n sourceWidth: number,\n sourceHeight: number,\n): void {\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n ctx.clearRect(0, 0, outputWidth, outputHeight)\n\n const crop = computeCenterCropRect(\n sourceWidth,\n sourceHeight,\n outputWidth / outputHeight,\n )\n\n ctx.drawImage(\n source,\n crop.x,\n crop.y,\n crop.width,\n crop.height,\n 0,\n 0,\n outputWidth,\n outputHeight,\n )\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","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { MEDIA_TIME_EPSILON_S, MEDIA_TIME_LOOP_JUMP_S } from './publish-fps'\nimport { resolveUploadVideoSize } from '../shared/reference-video-size'\nimport type { VideoInputHealth } from '../shared/session-debug'\nimport { drawSourceCenterCrop } from './canvas-frame-draw'\nimport { mountCaptureVideo } from './capture-host'\nimport { estimateVideoFrameRate, resolvePlaybackDrivenEncoderFps } from './video-frame-rate'\n\nconst STALL_CATCHUP_MS = 1500\n\ntype VideoFrameCallbackMetadata = {\n mediaTime: number\n presentedFrames: number\n}\n\ntype VideoWithCaptureStream = HTMLVideoElement & {\n captureStream?: (frameRate?: number) => MediaStream\n mozCaptureStream?: (frameRate?: number) => MediaStream\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (\n cb: (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => void,\n ) => number\n cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport type VideoFileStreamOptions = {\n loop?: boolean\n muted?: boolean\n playbackRate?: number\n /** @deprecated Upload video is playback-driven; fps is measured from the source file. */\n fps?: number\n /** @deprecated Mobile/web publish fps is derived from the uploaded file. */\n mobile?: boolean\n targetSize?: [number, number]\n i18n?: SDKI18n\n onHealthReport?: (health: VideoInputHealth) => void\n healthIntervalMs?: number\n /** Log each canvas draw (proxy for frames fed to RTC captureStream). */\n logPublishFrames?: boolean\n}\n\nexport type VideoFileStream = {\n url: string\n /** Same MediaStream pushed to RTC; bind to preview via srcObject for WYSIWYG. */\n previewStream: MediaStream\n /** Capture-only element; pinned off-screen. */\n videoEl: HTMLVideoElement\n videoTrack: MediaStreamTrack\n /** Measured source fps — encoder ceiling hint only. */\n fps: number\n /** Session publish dimensions (native source size by default). */\n width: number\n height: number\n /** Original media dimensions before scale. */\n sourceWidth: number\n sourceHeight: number\n destroy: () => void\n}\n\nfunction shouldSampleAtMediaTime(lastMediaTimeS: number, mediaTimeS: number): boolean {\n if (!Number.isFinite(mediaTimeS) || mediaTimeS < 0) {\n return false\n }\n if (lastMediaTimeS < 0) {\n return true\n }\n if (mediaTimeS + MEDIA_TIME_LOOP_JUMP_S < lastMediaTimeS) {\n return true\n }\n return mediaTimeS > lastMediaTimeS + MEDIA_TIME_EPSILON_S\n}\n\n/** Lightweight fingerprint — 3 pixel samples to verify frame content changes. */\nfunction sampleCanvasFingerprint(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n): string {\n const points: Array<[number, number]> = [\n [0, 0],\n [Math.max(0, (width >> 1) - 1), Math.max(0, (height >> 1) - 1)],\n [Math.max(0, width - 1), Math.max(0, height - 1)],\n ]\n\n return points\n .map(([x, y]) => {\n const data = ctx.getImageData(x, y, 1, 1).data\n return `${data[0]},${data[1]},${data[2]}`\n })\n .join('|')\n}\n\nasync function applyPublishTrackConstraints(\n track: MediaStreamTrack,\n width: number,\n height: number,\n): Promise<void> {\n if (typeof track.applyConstraints !== 'function') {\n return\n }\n\n try {\n await track.applyConstraints({\n width: { ideal: width, max: width },\n height: { ideal: height, max: height },\n })\n } catch {\n // Some browsers reject exact constraints on captureStream tracks.\n }\n}\n\nexport async function createVideoFileStream(\n fileOrUrl: File | string,\n options: VideoFileStreamOptions = {},\n): Promise<VideoFileStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const isUrl = typeof fileOrUrl === 'string'\n const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n const videoEl = document.createElement('video')\n\n videoEl.muted = options.muted ?? true\n videoEl.playsInline = true\n\n if (isUrl) {\n videoEl.crossOrigin = 'anonymous'\n }\n videoEl.src = url\n videoEl.loop = options.loop ?? true\n videoEl.autoplay = true\n\n mountCaptureVideo(videoEl)\n\n try {\n videoEl.load()\n await waitForEvent(videoEl, 'loadedmetadata')\n await waitForCanPlay(videoEl)\n } catch (error) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw error\n }\n\n if (typeof options.playbackRate === 'number') {\n videoEl.playbackRate = options.playbackRate\n }\n\n await startVideoPlayback(videoEl, i18n)\n\n const sourceWidth = videoEl.videoWidth || 0\n const sourceHeight = videoEl.videoHeight || 0\n if (!sourceWidth || !sourceHeight) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const measuredFps = typeof options.fps === 'number' && options.fps > 0\n ? options.fps\n : await estimateVideoFrameRate(videoEl)\n\n const [outputWidth, outputHeight] = options.targetSize\n ?? resolveUploadVideoSize(sourceWidth, sourceHeight)\n\n const canvas = document.createElement('canvas')\n canvas.width = outputWidth\n canvas.height = outputHeight\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n const captureStreamFn =\n (canvas as HTMLCanvasElement & { captureStream?: (frameRate?: number) => MediaStream }).captureStream\n ?? (canvas as HTMLCanvasElement & { mozCaptureStream?: (frameRate?: number) => MediaStream }).mozCaptureStream\n\n if (!captureStreamFn) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n // One canvas redraw per advanced mediaTime — captureStream emits only when canvas changes.\n const previewStream = captureStreamFn.call(canvas)\n const videoTrack = previewStream.getVideoTracks()[0]\n\n if (!videoTrack) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const publishFps = resolvePlaybackDrivenEncoderFps(videoTrack, measuredFps)\n await applyPublishTrackConstraints(videoTrack, outputWidth, outputHeight)\n\n let destroyed = false\n let lastAdvanceAt = Date.now()\n let lastDrawMediaTimeS = -1\n let videoFrameCallbackId: number | null = null\n let rafId: number | null = null\n const logPublishFrames = options.logPublishFrames ?? false\n let publishFrameIndex = 0\n let lastPublishWallMs = 0\n let lastPublishMediaTimeS = -1\n let publishFramesInWindow = 0\n let publishWindowStartMs = 0\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n drawSourceCenterCrop(\n ctx,\n videoEl,\n outputWidth,\n outputHeight,\n sourceWidth,\n sourceHeight,\n )\n }\n\n const logPublishedFrame = (mediaTimeS: number, presentedFrames?: number) => {\n if (!logPublishFrames) {\n return\n }\n\n publishFrameIndex += 1\n const wallNowMs = performance.now()\n const wallDeltaMs = lastPublishWallMs > 0 ? wallNowMs - lastPublishWallMs : 0\n const mediaDeltaS = lastPublishMediaTimeS >= 0 ? mediaTimeS - lastPublishMediaTimeS : 0\n lastPublishWallMs = wallNowMs\n lastPublishMediaTimeS = mediaTimeS\n\n publishFramesInWindow += 1\n if (publishWindowStartMs === 0) {\n publishWindowStartMs = wallNowMs\n }\n\n const fingerprint = sampleCanvasFingerprint(ctx, outputWidth, outputHeight)\n console.warn('[upload-video → publishFrame]', {\n frameIndex: publishFrameIndex,\n mediaTimeS: Number(mediaTimeS.toFixed(4)),\n mediaDeltaS: Number(mediaDeltaS.toFixed(4)),\n wallDeltaMs: Number(wallDeltaMs.toFixed(1)),\n effectiveFps: wallDeltaMs > 0 ? Number((1000 / wallDeltaMs).toFixed(1)) : null,\n presentedFrames,\n size: `${outputWidth}×${outputHeight}`,\n fingerprint,\n })\n\n const windowElapsedMs = wallNowMs - publishWindowStartMs\n if (windowElapsedMs >= 1000) {\n console.warn('[upload-video → publishFps]', {\n framesInLast1s: publishFramesInWindow,\n avgFps: Number((publishFramesInWindow / (windowElapsedMs / 1000)).toFixed(2)),\n videoCurrentTime: Number(videoEl.currentTime.toFixed(4)),\n videoPaused: videoEl.paused,\n videoReadyState: videoEl.readyState,\n })\n publishFramesInWindow = 0\n publishWindowStartMs = wallNowMs\n }\n }\n\n const onPlaybackSample = (mediaTimeS: number, presentedFrames?: number) => {\n if (destroyed || !shouldSampleAtMediaTime(lastDrawMediaTimeS, mediaTimeS)) {\n return\n }\n lastDrawMediaTimeS = mediaTimeS\n lastAdvanceAt = Date.now()\n drawFrame()\n logPublishedFrame(mediaTimeS, presentedFrames)\n }\n\n const schedulePlaybackWatch = () => {\n if (destroyed) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n videoFrameCallbackId = video.requestVideoFrameCallback!((_now, metadata) => {\n onPlaybackSample(metadata.mediaTime, metadata.presentedFrames)\n schedulePlaybackWatch()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n onPlaybackSample(videoEl.currentTime)\n schedulePlaybackWatch()\n })\n }\n\n drawFrame()\n logPublishedFrame(videoEl.currentTime)\n schedulePlaybackWatch()\n\n const ensurePlaying = () => {\n if (destroyed) {\n return\n }\n if (videoEl.ended && videoEl.loop) {\n videoEl.currentTime = 0\n lastDrawMediaTimeS = -1\n }\n if (videoEl.paused) {\n void videoEl.play().catch(() => undefined)\n }\n }\n\n const markAdvance = () => {\n lastAdvanceAt = Date.now()\n }\n\n videoEl.addEventListener('timeupdate', markAdvance)\n videoEl.addEventListener('pause', ensurePlaying)\n videoEl.addEventListener('ended', ensurePlaying)\n videoEl.addEventListener('stalled', ensurePlaying)\n videoEl.addEventListener('waiting', ensurePlaying)\n\n if (logPublishFrames) {\n const logPlaybackEvent = (eventName: string) => {\n console.warn('[upload-video → playbackEvent]', {\n event: eventName,\n currentTime: Number(videoEl.currentTime.toFixed(4)),\n readyState: videoEl.readyState,\n paused: videoEl.paused,\n })\n }\n videoEl.addEventListener('waiting', () => logPlaybackEvent('waiting'))\n videoEl.addEventListener('stalled', () => logPlaybackEvent('stalled'))\n }\n\n const healthIntervalMs = options.healthIntervalMs ?? 3000\n let healthTimer: ReturnType<typeof setInterval> | null = null\n\n if (options.onHealthReport) {\n const reportHealth = options.onHealthReport\n healthTimer = setInterval(() => {\n ensurePlaying()\n\n const now = Date.now()\n const currentTime = videoEl.currentTime\n const duration = videoEl.duration\n const nearEnd = duration > 0 && currentTime >= duration - 0.2\n const stalled = !videoEl.paused && !videoEl.ended && !nearEnd && now - lastAdvanceAt >= healthIntervalMs\n\n if (stalled && now - lastAdvanceAt >= STALL_CATCHUP_MS) {\n void videoEl.play().catch(() => undefined)\n }\n\n reportHealth({\n currentTime,\n duration,\n paused: videoEl.paused,\n ended: videoEl.ended,\n readyState: videoEl.readyState,\n trackReadyState: videoTrack.readyState,\n trackMuted: videoTrack.muted,\n stalled,\n timeSinceAdvanceMs: now - lastAdvanceAt,\n })\n }, healthIntervalMs)\n }\n\n const destroy = () => {\n destroyed = true\n videoEl.removeEventListener('timeupdate', markAdvance)\n videoEl.removeEventListener('pause', ensurePlaying)\n videoEl.removeEventListener('ended', ensurePlaying)\n videoEl.removeEventListener('stalled', ensurePlaying)\n videoEl.removeEventListener('waiting', ensurePlaying)\n\n const video = videoEl as VideoWithFrameCallback\n if (videoFrameCallbackId !== null) {\n video.cancelVideoFrameCallback?.(videoFrameCallbackId)\n videoFrameCallbackId = null\n }\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n rafId = null\n }\n\n if (healthTimer !== null) {\n clearInterval(healthTimer)\n healthTimer = null\n }\n\n try {\n videoEl.pause()\n } catch {\n }\n\n try {\n videoTrack.stop()\n } catch {\n }\n\n try {\n previewStream.getTracks().forEach((track) => {\n if (track.readyState !== 'ended') {\n track.stop()\n }\n })\n } catch {\n }\n\n try {\n videoEl.remove()\n } catch {\n }\n\n try {\n videoEl.src = ''\n videoEl.load()\n } catch {\n }\n\n if (!isUrl) URL.revokeObjectURL(url)\n }\n\n return {\n url,\n previewStream,\n videoEl,\n videoTrack,\n fps: publishFps,\n width: outputWidth,\n height: outputHeight,\n sourceWidth,\n sourceHeight,\n destroy,\n }\n}\n\nfunction waitForEvent<T extends HTMLElement>(\n el: T,\n eventName: keyof HTMLElementEventMap,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const onOk = () => {\n cleanup()\n resolve()\n }\n\n const onErr = (e: Event) => {\n cleanup()\n // If it's a media error and we can read the code, include it\n const mediaEl = el as unknown as HTMLMediaElement\n const code = mediaEl.error ? mediaEl.error.code : 'unknown'\n const message = mediaEl.error ? mediaEl.error.message : 'no message'\n const src = mediaEl.src || 'unknown src'\n reject(new Error(`failed to load video metadata: ${String(eventName)} (code: ${code}, message: ${message}, src: ${src})`))\n }\n\n const cleanup = () => {\n el.removeEventListener(eventName, onOk as EventListener)\n el.removeEventListener('error', onErr as EventListener)\n }\n\n el.addEventListener(eventName, onOk as EventListener, { once: true })\n el.addEventListener('error', onErr as EventListener, { once: true })\n })\n}\n\nfunction waitForCanPlay(videoEl: HTMLVideoElement): Promise<void> {\n if (videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n return Promise.resolve()\n }\n\n return new Promise((resolve) => {\n const onReady = () => {\n cleanup()\n resolve()\n }\n\n const cleanup = () => {\n videoEl.removeEventListener('canplay', onReady)\n videoEl.removeEventListener('loadeddata', onReady)\n }\n\n videoEl.addEventListener('canplay', onReady, { once: true })\n videoEl.addEventListener('loadeddata', onReady, { once: true })\n })\n}\n\nasync function startVideoPlayback(videoEl: HTMLVideoElement, i18n: SDKI18n): Promise<void> {\n try {\n const playResult = videoEl.play()\n if (playResult && typeof (playResult as Promise<void>).then === 'function') {\n await playResult\n }\n } catch {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n\n try {\n await waitForPlaying(videoEl)\n } catch {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n\n if (videoEl.paused || videoEl.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {\n throw new Error(i18n.t('errors.videoPlaybackFailed'))\n }\n}\n\nfunction waitForPlaying(videoEl: HTMLVideoElement): Promise<void> {\n if (!videoEl.paused && videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const onPlaying = () => {\n cleanup()\n resolve()\n }\n\n const onErr = () => {\n cleanup()\n reject(new Error('video playback failed'))\n }\n\n const cleanup = () => {\n videoEl.removeEventListener('playing', onPlaying)\n videoEl.removeEventListener('error', onErr)\n }\n\n videoEl.addEventListener('playing', onPlaying, { once: true })\n videoEl.addEventListener('error', onErr, { once: true })\n })\n}\n","export type CameraCaptureOptions = {\n width: number\n height: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n}\n\n/** Camera control fields from Media Capture extensions; not in default lib.dom typings. */\nexport type CameraTrackCapabilities = MediaTrackCapabilities & {\n focusMode?: string[]\n focusDistance?: { min: number; max: number; step?: number }\n zoom?: { min: number; max: number; step?: number }\n}\n\nexport type CameraTrackSettings = MediaTrackSettings & {\n focusDistance?: number\n}\n\ntype CameraTrackConstraintSet = MediaTrackConstraintSet & {\n focusMode?: string\n focusDistance?: number\n zoom?: number\n}\n\nconst CAMERA_ACCESS_ERROR_NAMES = new Set([\n 'NotFoundError',\n 'NotAllowedError',\n 'PermissionDeniedError',\n 'NotReadableError',\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError',\n 'AbortError',\n 'SecurityError',\n])\n\nexport type CameraEnvironmentIssue = 'insecure-context' | 'api-unavailable'\n\n/** Detect blockers before calling getUserMedia (HTTP hides mediaDevices in Chrome). */\nexport function getCameraEnvironmentIssue(): CameraEnvironmentIssue | null {\n if (typeof window === 'undefined') {\n return 'api-unavailable'\n }\n if (!window.isSecureContext) {\n return 'insecure-context'\n }\n if (typeof navigator?.mediaDevices?.getUserMedia !== 'function') {\n return 'api-unavailable'\n }\n return null\n}\n\nexport type CameraAccessErrorKind =\n | 'not-found'\n | 'not-allowed'\n | 'permission-denied'\n | 'in-use'\n | 'overconstrained'\n | 'unsupported'\n | 'capture-unsupported'\n | 'generic'\n\n/** True for getUserMedia failures that should prompt the user to open/allow the device camera. */\nexport function isCameraAccessError(error: unknown): boolean {\n return classifyCameraAccessError(error) !== null\n}\n\n/** Map getUserMedia / camera pipeline failures to a stable category for user-facing copy. */\nexport function classifyCameraAccessError(error: unknown): CameraAccessErrorKind | null {\n if (error instanceof DOMException) {\n switch (error.name) {\n case 'NotFoundError':\n return 'not-found'\n case 'NotAllowedError':\n return 'not-allowed'\n case 'PermissionDeniedError':\n return 'permission-denied'\n case 'NotReadableError':\n return 'in-use'\n case 'OverconstrainedError':\n case 'ConstraintNotSatisfiedError':\n return 'overconstrained'\n case 'TypeError':\n return 'generic'\n case 'AbortError':\n case 'SecurityError':\n return 'generic'\n default:\n if (CAMERA_ACCESS_ERROR_NAMES.has(error.name)) {\n return 'generic'\n }\n return null\n }\n }\n\n if (error instanceof Error) {\n if (error.message.includes('Camera is not supported')) {\n return 'unsupported'\n }\n if (error.message.includes('captureStream is not supported')) {\n return 'capture-unsupported'\n }\n if (error.message.includes('No active video track')) {\n return 'in-use'\n }\n }\n\n return null\n}\n\nfunction buildVideoConstraints(\n options: CameraCaptureOptions,\n resolution: 'min' | 'ideal',\n): MediaTrackConstraints {\n const size =\n resolution === 'min'\n ? { width: { min: options.width, ideal: options.width }, height: { min: options.height, ideal: options.height } }\n : { width: { ideal: options.width }, height: { ideal: options.height } }\n\n return {\n ...size,\n frameRate: { ideal: options.frameRate ?? 30 },\n ...(options.facingMode !== undefined ? { facingMode: options.facingMode } : {}),\n }\n}\n\nfunction isOverconstrainedCameraError(error: unknown): boolean {\n if (!(error instanceof DOMException)) {\n return false\n }\n return error.name === 'OverconstrainedError' || error.name === 'ConstraintNotSatisfiedError'\n}\n\nfunction isEnvironmentFacing(facingMode?: ConstrainDOMString): boolean {\n if (facingMode === 'environment') {\n return true\n }\n if (typeof facingMode === 'object' && facingMode !== null && 'exact' in facingMode) {\n return facingMode.exact === 'environment'\n }\n return false\n}\n\nfunction waitTwoAnimationFrames(): Promise<void> {\n return new Promise((resolve) => {\n requestAnimationFrame(() => requestAnimationFrame(() => resolve()))\n })\n}\n\n/**\n * Best-effort stabilization for rear camera AF hunting when objects move in frame.\n * - Android: lock focus after initial settle (single-shot, else manual distance).\n * - iOS / others: lock zoom to 1x when supported (Safari 17+); focus APIs are unavailable.\n */\nexport async function stabilizeCameraVideoTrack(\n track: MediaStreamTrack,\n options?: { facingMode?: ConstrainDOMString },\n): Promise<void> {\n if (!isEnvironmentFacing(options?.facingMode)) {\n return\n }\n\n const caps = track.getCapabilities?.() as CameraTrackCapabilities | undefined\n if (!caps) {\n return\n }\n\n const advanced: CameraTrackConstraintSet[] = []\n\n if (Array.isArray(caps.focusMode)) {\n if (caps.focusMode.includes('single-shot')) {\n advanced.push({ focusMode: 'single-shot' })\n } else if (caps.focusMode.includes('manual') && caps.focusDistance) {\n const settings = track.getSettings?.() as CameraTrackSettings | undefined\n const { min, max } = caps.focusDistance\n const distance =\n typeof settings?.focusDistance === 'number'\n ? settings.focusDistance\n : Math.min(max, Math.max(min, 1))\n advanced.push({ focusMode: 'manual', focusDistance: distance })\n }\n }\n\n if (caps.zoom && typeof caps.zoom.min === 'number' && typeof caps.zoom.max === 'number') {\n const zoom = 1\n if (zoom >= caps.zoom.min && zoom <= caps.zoom.max) {\n advanced.push({ zoom })\n }\n }\n\n if (advanced.length === 0) {\n return\n }\n\n try {\n await track.applyConstraints({ advanced })\n } catch {\n // Unsupported constraint combinations — ignore and keep the original stream.\n }\n}\n\nasync function openCameraStream(options: CameraCaptureOptions): Promise<MediaStream> {\n try {\n return await navigator.mediaDevices.getUserMedia({\n audio: false,\n video: buildVideoConstraints(options, 'min'),\n })\n } catch (error) {\n if (!isOverconstrainedCameraError(error)) {\n throw error\n }\n\n return navigator.mediaDevices.getUserMedia({\n audio: false,\n video: buildVideoConstraints(options, 'ideal'),\n })\n }\n}\n\n/** Prefer target resolution via min constraints; fall back to ideal-only when unsupported. */\nexport async function requestCameraMediaStream(options: CameraCaptureOptions): Promise<MediaStream> {\n const environmentIssue = getCameraEnvironmentIssue()\n if (environmentIssue === 'insecure-context') {\n throw new DOMException('Camera requires a secure context (HTTPS).', 'SecurityError')\n }\n if (environmentIssue === 'api-unavailable') {\n throw new Error('Camera is not supported in this browser.')\n }\n\n const stream = await openCameraStream(options)\n const track = stream.getVideoTracks()[0]\n\n if (track && isEnvironmentFacing(options.facingMode)) {\n await waitTwoAnimationFrames()\n await stabilizeCameraVideoTrack(track, { facingMode: options.facingMode })\n }\n\n return stream\n}","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { mountCaptureVideo } from './capture-host'\n\nexport type NativeCameraStream = {\n sourceStream: MediaStream\n previewStream: MediaStream\n videoTrack: MediaStreamTrack\n videoEl: HTMLVideoElement\n width: number\n height: number\n destroy: () => void\n}\n\nexport type OpenNativeCameraStreamOptions = {\n width?: number\n height?: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n i18n?: SDKI18n\n}\n\nexport async function openNativeCameraStream(\n options: OpenNativeCameraStreamOptions = {},\n): Promise<NativeCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n\n // Default to 16:9 720p (1280x720) for V2\n const stream = await requestCameraMediaStream({\n width: options.width ?? 1280,\n height: options.height ?? 720,\n frameRate: options.frameRate ?? 30,\n facingMode: options.facingMode ?? 'user',\n })\n\n return createNativeCameraStream(stream, { i18n })\n}\n\nexport async function createNativeCameraStream(\n sourceStream: MediaStream,\n options: { i18n?: SDKI18n } = {},\n): Promise<NativeCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const sourceTrack = sourceStream.getVideoTracks()[0]\n if (!sourceTrack) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const videoEl = document.createElement('video')\n videoEl.playsInline = true\n videoEl.muted = true\n videoEl.autoplay = true\n videoEl.srcObject = sourceStream\n mountCaptureVideo(videoEl)\n\n await new Promise<void>((resolve, reject) => {\n const onOk = () => {\n cleanup()\n resolve()\n }\n const onErr = () => {\n cleanup()\n reject(new Error(`failed to load video metadata`))\n }\n const cleanup = () => {\n videoEl.removeEventListener('loadedmetadata', onOk)\n videoEl.removeEventListener('error', onErr)\n }\n videoEl.addEventListener('loadedmetadata', onOk, { once: true })\n videoEl.addEventListener('error', onErr, { once: true })\n })\n\n const playResult = videoEl.play()\n if (playResult && typeof playResult.then === 'function') {\n await playResult\n }\n\n const width = videoEl.videoWidth || 0\n const height = videoEl.videoHeight || 0\n if (!width || !height) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const destroy = () => {\n try {\n videoEl.pause()\n } catch {}\n try {\n videoTrack.stop()\n } catch {}\n try {\n sourceStream.getTracks().forEach((track) => {\n if (track.readyState !== 'ended') {\n track.stop()\n }\n })\n } catch {}\n try {\n videoEl.srcObject = null\n videoEl.remove()\n } catch {}\n }\n\n const videoTrack = sourceTrack\n\n return {\n sourceStream,\n previewStream: sourceStream, // No canvas mirror, preview is the raw stream\n videoTrack,\n videoEl,\n width,\n height,\n destroy,\n }\n}\n","import type { RealtimeModel } from './types'\n\nconst DEFAULT_REALTIME_SIZE = {\n width: 1280,\n height: 960,\n fps: 24,\n} as const\n\nexport const models = {\n realtime(\n name: string,\n options?: {\n width?: number\n height?: number\n fps?: number\n },\n ): RealtimeModel {\n return {\n name,\n width: options?.width ?? DEFAULT_REALTIME_SIZE.width,\n height: options?.height ?? DEFAULT_REALTIME_SIZE.height,\n fps: options?.fps ?? DEFAULT_REALTIME_SIZE.fps,\n }\n },\n}\n","export type SessionDebugCategory = 'lifecycle' | 'video-input' | 'sei' | 'rtc' | 'output'\n\nexport type SessionDebugEntry = {\n scope: 'client' | 'rtc'\n level: 'info' | 'success' | 'warn' | 'error'\n message: string\n data?: unknown\n}\n\nexport type SessionDebugLogger = (\n category: SessionDebugCategory,\n level: SessionDebugEntry['level'],\n message: string,\n data?: unknown,\n) => void\n\nexport function createSessionDebugLogger(\n enabled: boolean,\n onLog?: (entry: SessionDebugEntry) => void,\n): SessionDebugLogger {\n return (category, level, message, data) => {\n if (!enabled || !onLog) {\n return\n }\n const scope: SessionDebugEntry['scope'] =\n category === 'rtc' || category === 'sei' ? 'rtc' : 'client'\n onLog({\n scope,\n level,\n message: `[${category}] ${message}`,\n data,\n })\n }\n}\n\nexport type VideoInputHealth = {\n currentTime: number\n duration: number\n paused: boolean\n ended: boolean\n readyState: number\n trackReadyState: string\n trackMuted: boolean\n stalled: boolean\n timeSinceAdvanceMs: number\n}\n\nexport type SeiGateSnapshot = {\n expectedSei: string | null\n sei: string | null\n userId: string | null\n matched: boolean\n}\n\nexport type OutputVisibilitySnapshot = {\n outputEnabled: boolean\n hasResult: boolean\n showOutputVideo: boolean\n remoteVideoUserId: string | null\n localVideoPublished: boolean\n inputSource: string\n seiMatched: boolean\n expectedSei: string | null\n lastSei: string | null\n}\n\nexport function seiGateChanged(prev: SeiGateSnapshot | null, next: SeiGateSnapshot): boolean {\n if (!prev) {\n return true\n }\n return (\n prev.matched !== next.matched ||\n prev.expectedSei !== next.expectedSei ||\n prev.sei !== next.sei ||\n prev.userId !== next.userId\n )\n}\n\nexport function outputVisibilityChanged(\n prev: OutputVisibilitySnapshot | null,\n next: OutputVisibilitySnapshot,\n): boolean {\n if (!prev) {\n return true\n }\n return (\n prev.showOutputVideo !== next.showOutputVideo ||\n prev.outputEnabled !== next.outputEnabled ||\n prev.hasResult !== next.hasResult ||\n prev.remoteVideoUserId !== next.remoteVideoUserId ||\n prev.localVideoPublished !== next.localVideoPublished ||\n prev.inputSource !== next.inputSource ||\n prev.seiMatched !== next.seiMatched\n )\n}\n\nexport function isVideoInputUnhealthy(health: VideoInputHealth): boolean {\n return health.stalled || health.paused || health.ended || health.trackReadyState === 'ended'\n}\n\nexport function videoInputHealthChanged(\n prev: VideoInputHealth | null,\n next: VideoInputHealth,\n): boolean {\n if (!prev) {\n return isVideoInputUnhealthy(next)\n }\n const prevBad = isVideoInputUnhealthy(prev)\n const nextBad = isVideoInputUnhealthy(next)\n if (prevBad !== nextBad) {\n return true\n }\n if (nextBad) {\n return (\n prev.stalled !== next.stalled ||\n prev.paused !== next.paused ||\n prev.ended !== next.ended ||\n prev.trackReadyState !== next.trackReadyState\n )\n }\n return false\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n ACTIVE_STATUS,\n type UploadImageResult,\n XmaxOpenClient,\n} from '../sdk/client'\nimport { createSDKI18n } from '../i18n'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager, type RtcStateSnapshot } from '../rtc/rtc-manager'\nimport { isMobilePublishEnvironment } from '../rtc/publish-fps'\nimport { createVideoFileStream, type VideoFileStream } from '../rtc/video-file-stream'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { models } from '../realtime/models'\nimport type { XmaxConfig, XmaxContextValue, XmaxSeiGateState } from './types'\nimport { notifyError } from '../shared/error-utils'\nimport { browserToast } from '../shared/browser-toast'\nimport { createSessionDebugLogger, outputVisibilityChanged, seiGateChanged, videoInputHealthChanged, type OutputVisibilitySnapshot, type SeiGateSnapshot, type VideoInputHealth } from '../shared/session-debug'\n\nconst XmaxContext = createContext<XmaxContextValue | null>(null)\n\nconst createDefaultRtcSnapshot = (): RtcStateSnapshot => ({\n roomId: null,\n userId: null,\n appId: null,\n botUserId: null,\n joined: false,\n localVideoPublished: false,\n remoteVideoUserId: null,\n users: [],\n})\n\nconst createDefaultSeiGateState = (): XmaxSeiGateState => ({\n expectedSei: null,\n sei: null,\n userId: null,\n matched: true,\n})\n\nexport function XmaxProvider({ config, children }: { config: XmaxConfig; children: ReactNode }) {\n const sdkI18n = useMemo(() => config.i18n ?? createSDKI18n({ locale: config.locale }), [config.i18n, config.locale])\n const debugEnabled = config.debug ?? false\n const debugLog = useMemo(\n () => createSessionDebugLogger(debugEnabled, config.onLog),\n [config.onLog, debugEnabled],\n )\n const debugLogRef = useRef(debugLog)\n debugLogRef.current = debugLog\n const debugEnabledRef = useRef(debugEnabled)\n debugEnabledRef.current = debugEnabled\n const prevSeiGateRef = useRef<SeiGateSnapshot | null>(null)\n const prevOutputVisibilityRef = useRef<OutputVisibilitySnapshot | null>(null)\n const prevVideoHealthRef = useRef<VideoInputHealth | null>(null)\n\n const resetDebugSnapshots = useCallback(() => {\n prevSeiGateRef.current = null\n prevOutputVisibilityRef.current = null\n prevVideoHealthRef.current = null\n }, [])\n const externalOnError = config.onError\n const clientRef = useRef<XmaxOpenClient | null>(null)\n const sessionUidRef = useRef<string | null>(null)\n const taskUidRef = useRef<string | null>(null)\n const lastStartPromptRef = useRef<string | undefined>(undefined)\n const lastStartModelRef = useRef<string>('')\n const lastStartRefImageRef = useRef<string | undefined>(undefined)\n const videoFileStreamRef = useRef<VideoFileStream | null>(null)\n const cameraStreamRef = useRef<NativeCameraStream | null>(null)\n const localVideoSizeRef = useRef<{ width: number; height: number } | null>(null)\n const inputSourceRef = useRef<'none' | 'camera' | 'video'>('none')\n const disconnectRef = useRef<(() => Promise<void>) | null>(null)\n const disconnectPromiseRef = useRef<Promise<void> | null>(null)\n const localContainerRef = useRef<HTMLElement | null>(null)\n const remoteContainerRef = useRef<HTMLElement | null>(null)\n const outputEnabledRef = useRef(false)\n const activeModeCodeRef = useRef<null>(null)\n const onRemoteOutputStalledRef = useRef<((info: { userId: string; stallMs: number }) => void) | null>(null)\n\n const [rtcState, setRtcState] = useState<RtcStateSnapshot>(createDefaultRtcSnapshot)\n const [inputSource, setInputSource] = useState<'none' | 'camera' | 'video'>('none')\n const [isCameraOn, setIsCameraOn] = useState(false)\n const [isRecording, setIsRecording] = useState(false)\n const [isGenerating, setIsGenerating] = useState(false)\n const [hasResult, setHasResult] = useState(false)\n const [outputEnabled, setOutputEnabled] = useState(false)\n const [activeModeCode, setActiveModeCode] = useState<null>(null)\n const [localVideoSize, setLocalVideoSize] = useState<{ width: number; height: number } | null>(null)\n const [sessionTargetSize, setSessionTargetSize] = useState<[number, number] | null>(null)\n const [seiGate, setSeiGate] = useState<XmaxSeiGateState>(createDefaultSeiGateState)\n\n inputSourceRef.current = inputSource\n localVideoSizeRef.current = localVideoSize\n outputEnabledRef.current = outputEnabled\n activeModeCodeRef.current = activeModeCode\n\n const ensureLocalVideoContainer = useCallback(() => {\n const rtc = rtcManagerRef.current\n const container = localContainerRef.current\n if (!rtc || !container) {\n return\n }\n rtc.setLocalVideoContainer(container)\n }, [])\n\n const bindRemoteContainer = useCallback(() => {\n const rtc = rtcManagerRef.current\n const container = remoteContainerRef.current\n if (!rtc || !container) {\n return\n }\n rtc.setRemoteVideoContainer(container)\n void rtc.refreshRemoteVideoBinding()\n }, [])\n\n const detachRemoteContainer = useCallback(() => {\n rtcManagerRef.current?.setRemoteVideoContainer(null)\n }, [])\n\n const notifyUserError = useCallback((message: string, error?: unknown) => {\n if (externalOnError) {\n externalOnError(message, error)\n return\n }\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n browserToast.error(message)\n }\n }, [externalOnError])\n\n const reportError = useCallback((error: unknown, fallbackMessage?: string) => {\n return notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }, [notifyUserError, sdkI18n])\n\n const rtcManagerRef = useRef<RtcManager | null>(null)\n if (!rtcManagerRef.current) {\n rtcManagerRef.current = new RtcManager({\n onStateChange: (state) => setRtcState(state),\n onSeiGateChange: (state) => {\n setSeiGate(state)\n if (debugEnabledRef.current && seiGateChanged(prevSeiGateRef.current, state)) {\n debugLogRef.current('sei', state.matched ? 'success' : 'warn', 'gate change', state)\n prevSeiGateRef.current = state\n }\n },\n onLog: (entry) => config.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteOutputStalled: (info) => onRemoteOutputStalledRef.current?.(info),\n debug: debugEnabled,\n i18n: sdkI18n,\n })\n }\n\n const getClient = useCallback(() => {\n const existing = clientRef.current\n if (existing) {\n return existing\n }\n const created = new XmaxOpenClient({\n apiKey: config.apiKey,\n authToken: config.authToken,\n baseUrl: config.baseUrl,\n locale: config.locale,\n i18n: sdkI18n,\n onError: notifyUserError,\n })\n clientRef.current = created\n return created\n }, [config.apiKey, config.authToken, config.baseUrl, config.locale, notifyUserError, sdkI18n])\n\n const ensureConnected = useCallback(async () => {\n const client = getClient()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n\n if (rtc.snapshot.joined && sessionUidRef.current) {\n return\n }\n\n const model = config.model ?? 'x2.0'\n const session = await client.createSession(model)\n if (!session.sessionUid?.trim()) {\n throw new Error(sdkI18n.t('errors.sessionUidMissing'))\n }\n sessionUidRef.current = session.sessionUid\n client.startHeartbeat(\n session.sessionUid,\n config.heartbeatIntervalMs ?? 10000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void disconnectRef.current?.()\n }\n },\n () => {\n void disconnectRef.current?.()\n },\n )\n\n const joinInfo = client.getRtcJoinInfo(session)\n await rtc.join(joinInfo)\n ensureLocalVideoContainer()\n }, [config.heartbeatIntervalMs, config.model, ensureLocalVideoContainer, getClient, sdkI18n])\n\n const connect = useCallback(async () => {\n try {\n await ensureConnected()\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, reportError])\n\n const stopPublishing = useCallback(async () => {\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n try {\n await rtc.stopVideoPublishing()\n } catch {\n }\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n setOutputEnabled(false)\n setHasResult(false)\n if (videoFileStreamRef.current) {\n videoFileStreamRef.current.destroy()\n videoFileStreamRef.current = null\n }\n if (cameraStreamRef.current) {\n cameraStreamRef.current.destroy()\n cameraStreamRef.current = null\n }\n setInputSource('none')\n setIsCameraOn(false)\n setIsRecording(false)\n setLocalVideoSize(null)\n localVideoSizeRef.current = null\n setSessionTargetSize(null)\n setSeiGate(createDefaultSeiGateState())\n resetDebugSnapshots()\n debugLogRef.current('lifecycle', 'info', 'stopPublishing', { inputSource: inputSourceRef.current })\n }, [detachRemoteContainer, resetDebugSnapshots])\n\n const stop = useCallback(async () => {\n try {\n const rtc = rtcManagerRef.current\n taskUidRef.current = null\n rtc?.configureSessionSei(null)\n setSeiGate(createDefaultSeiGateState())\n resetDebugSnapshots()\n debugLogRef.current('lifecycle', 'info', 'stop', {})\n\n if (!rtc?.snapshot.joined) {\n rtc?.clearRemoteVideo()\n detachRemoteContainer()\n setHasResult(false)\n setOutputEnabled(false)\n return\n }\n try {\n const stopEvent = createStopRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n sessionUid: sessionUidRef.current ?? undefined,\n })\n await rtc.sendRoomEvent(stopEvent)\n } finally {\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n setHasResult(false)\n setOutputEnabled(false)\n }\n } catch (error) {\n throw reportError(error)\n }\n }, [detachRemoteContainer, reportError, resetDebugSnapshots])\n\n const disconnect = useCallback(async () => {\n if (disconnectPromiseRef.current) {\n return disconnectPromiseRef.current\n }\n\n const run = async () => {\n const client = clientRef.current\n const rtc = rtcManagerRef.current\n const activeSessionUid = sessionUidRef.current\n\n client?.beginTeardown()\n\n rtc?.configureSessionSei(null)\n setSeiGate(createDefaultSeiGateState())\n taskUidRef.current = null\n resetDebugSnapshots()\n\n rtc?.clearRemoteVideo()\n\n try {\n await stop()\n } catch {\n }\n\n await stopPublishing()\n\n if (rtc) {\n try {\n rtc.configureSessionSei(null)\n await rtc.leave()\n } catch {\n }\n }\n\n if (client && activeSessionUid) {\n try {\n await client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n client?.endTeardown()\n\n sessionUidRef.current = null\n taskUidRef.current = null\n setHasResult(false)\n setOutputEnabled(false)\n setActiveModeCode(null)\n setSessionTargetSize(null)\n setIsRecording(false)\n detachRemoteContainer()\n setRtcState(createDefaultRtcSnapshot())\n setSeiGate(createDefaultSeiGateState())\n }\n\n const promise = run().finally(() => {\n if (disconnectPromiseRef.current === promise) {\n disconnectPromiseRef.current = null\n }\n })\n disconnectPromiseRef.current = promise\n return promise\n }, [detachRemoteContainer, stop, stopPublishing, resetDebugSnapshots])\n\n disconnectRef.current = disconnect\n\n useEffect(() => {\n return () => {\n void disconnectRef.current?.()\n }\n }, [])\n\n useEffect(() => {\n if (!debugEnabled) {\n return\n }\n const snapshot: OutputVisibilitySnapshot = {\n outputEnabled,\n hasResult,\n showOutputVideo: outputEnabled && (hasResult || !!rtcState.remoteVideoUserId),\n remoteVideoUserId: rtcState.remoteVideoUserId,\n localVideoPublished: rtcState.localVideoPublished,\n inputSource,\n seiMatched: seiGate.matched,\n expectedSei: seiGate.expectedSei,\n lastSei: seiGate.sei,\n }\n if (!outputVisibilityChanged(prevOutputVisibilityRef.current, snapshot)) {\n return\n }\n const level = snapshot.showOutputVideo ? 'info' : 'warn'\n debugLog('output', level, 'visibility change', snapshot)\n prevOutputVisibilityRef.current = snapshot\n }, [\n debugEnabled,\n debugLog,\n outputEnabled,\n hasResult,\n rtcState.remoteVideoUserId,\n rtcState.localVideoPublished,\n inputSource,\n seiGate.matched,\n seiGate.expectedSei,\n seiGate.sei,\n ])\n\n useEffect(() => {\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n if (!outputEnabled) {\n rtc.clearRemoteVideo()\n detachRemoteContainer()\n return\n }\n bindRemoteContainer()\n }, [bindRemoteContainer, detachRemoteContainer, outputEnabled])\n\n const openCamera = useCallback(async (options?: { size?: [number, number] }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return\n }\n await stopPublishing()\n ensureLocalVideoContainer()\n const defaultCamera = models.realtime('x2.0')\n const cameraHint: [number, number] = options?.size ?? [defaultCamera.width, defaultCamera.height]\n const precomputedSize = resolveUploadVideoSize(cameraHint[0], cameraHint[1])\n setSessionTargetSize(precomputedSize)\n const rawStream = await requestCameraMediaStream({\n width: cameraHint[0],\n height: cameraHint[1],\n frameRate: 30,\n facingMode: 'user',\n })\n const publishStream = await createNativeCameraStream(rawStream)\n cameraStreamRef.current = publishStream\n await rtc.startExternalVideoPublishing(publishStream.videoTrack, precomputedSize, {\n mobile: isMobilePublishEnvironment(),\n highQuality: true,\n })\n const sessionDims = { width: publishStream.width, height: publishStream.height }\n setLocalVideoSize(sessionDims)\n localVideoSizeRef.current = sessionDims\n setSessionTargetSize([sessionDims.width, sessionDims.height])\n setIsCameraOn(true)\n setIsRecording(true)\n setInputSource('camera')\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, ensureLocalVideoContainer, reportError, sdkI18n, stopPublishing])\n\n const closeCamera = useCallback(async () => {\n await disconnect()\n }, [disconnect])\n\n const loadVideoFile = useCallback(async (file: File, options?: { size?: [number, number] }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc) {\n return null\n }\n await stopPublishing()\n ensureLocalVideoContainer()\n prevVideoHealthRef.current = null\n const stream = await createVideoFileStream(file, {\n muted: true,\n loop: true,\n mobile: isMobilePublishEnvironment(),\n targetSize: options?.size,\n i18n: sdkI18n,\n onHealthReport: debugEnabled\n ? (health) => {\n if (!videoInputHealthChanged(prevVideoHealthRef.current, health)) {\n return\n }\n prevVideoHealthRef.current = health\n const level = health.stalled || health.paused || health.ended ? 'warn' : 'info'\n debugLogRef.current('video-input', level, 'health change', health)\n }\n : undefined,\n })\n if (videoFileStreamRef.current) {\n videoFileStreamRef.current.destroy()\n }\n videoFileStreamRef.current = stream\n await rtc.startExternalVideoPublishing(stream.videoTrack, [stream.width, stream.height], {\n mobile: isMobilePublishEnvironment(),\n fps: stream.fps,\n highQuality: true,\n })\n setInputSource('video')\n setIsCameraOn(true)\n setIsRecording(true)\n debugLogRef.current('lifecycle', 'info', 'loadVideoFile', {\n width: stream.width,\n height: stream.height,\n fileName: file.name,\n })\n if (stream.width && stream.height) {\n const size = { width: stream.width, height: stream.height }\n setLocalVideoSize(size)\n localVideoSizeRef.current = size\n setSessionTargetSize([stream.width, stream.height])\n } else {\n setLocalVideoSize(null)\n localVideoSizeRef.current = null\n }\n const targetSize: [number, number] = [stream.width, stream.height]\n return {\n url: stream.url,\n width: stream.width,\n height: stream.height,\n previewStream: stream.previewStream,\n videoEl: stream.videoEl,\n targetSize,\n }\n } catch (error) {\n throw reportError(error)\n }\n }, [ensureConnected, ensureLocalVideoContainer, reportError, sdkI18n, stopPublishing, debugEnabled])\n\n const clearInput = useCallback(async () => {\n await disconnect()\n }, [disconnect])\n\n const uploadImage = useCallback(async (file: File): Promise<UploadImageResult> => {\n try {\n const client = getClient()\n return await client.uploadImage(file)\n } catch (error) {\n throw reportError(error)\n }\n }, [getClient, reportError])\n\n const setRefImage = useCallback(async (input: File | string) => {\n try {\n if (typeof input !== 'string') {\n const result = await uploadImage(input)\n return result.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 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 const result = await uploadImage(file)\n return result.url\n } catch (error) {\n throw reportError(error)\n }\n }, [reportError, uploadImage])\n\n const start = useCallback(async (options: {\n size?: [number, number]\n prompt?: string\n model: string\n /** When set (including `null`), overrides stored ref image for this start event. */\n refImage?: string | null\n extraParams?: Record<string, unknown>\n }) => {\n try {\n await ensureConnected()\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined) {\n return\n }\n\n const refForEvent = options.refImage\n const resolvedPrompt = options.prompt?.trim() ?? ''\n\n setIsGenerating(true)\n rtc.clearRemoteVideo()\n rtc.setRemoteVideoContainer(null)\n setHasResult(false)\n setOutputEnabled(true)\n outputEnabledRef.current = true\n\n const size = resolveSessionTargetSize({\n localVideoSize: localVideoSizeRef.current,\n overrideSize: options.size,\n })\n setSessionTargetSize(size)\n\n const taskUid = createTaskUid()\n taskUidRef.current = taskUid\n lastStartPromptRef.current = resolvedPrompt || undefined\n lastStartModelRef.current = options.model\n lastStartRefImageRef.current = refForEvent?.trim() || undefined\n prevSeiGateRef.current = null\n rtc.configureSessionSei(taskUid)\n debugLogRef.current('lifecycle', 'info', 'start', {\n taskUid,\n size,\n inputSource: inputSourceRef.current,\n })\n const startEvent = createStartRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: options.model,\n size,\n prompt: resolvedPrompt || undefined,\n extraParams: options.extraParams,\n refImagePath: refForEvent?.trim() || undefined,\n })\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.ensurePublishedInputBeforeStart()\n await rtc.sendRoomEvent(startEvent)\n await rtc.refreshRemoteVideoBinding({ force: true })\n setHasResult(true)\n } catch (error) {\n setOutputEnabled(false)\n throw reportError(error)\n } finally {\n setIsGenerating(false)\n }\n }, [ensureConnected, reportError])\n\n const sendTracks = useCallback(async (options: { tracks: Array<[number, number]> }) => {\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined) {\n return\n }\n const activeTaskUid = taskUidRef.current\n if (!activeTaskUid) {\n return\n }\n console.log('[Xmax] sendTracks', {\n taskUid: activeTaskUid,\n targetSize: sessionTargetSize,\n tracks: options.tracks,\n })\n try {\n const event = createTracksRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: activeTaskUid,\n sessionUid: activeTaskUid,\n tracks: options.tracks,\n })\n await rtc.sendRoomEvent(event)\n } catch {\n // Track sending is best-effort for live interaction.\n }\n }, [sessionTargetSize])\n\n const recoverGeneration = useCallback(async () => {\n const rtc = rtcManagerRef.current\n if (!rtc?.snapshot.joined || !outputEnabledRef.current) {\n return\n }\n\n try {\n debugLogRef.current('lifecycle', 'warn', 'recoverGeneration', {\n inputSource: inputSourceRef.current,\n })\n\n const taskUid = createTaskUid()\n taskUidRef.current = taskUid\n prevSeiGateRef.current = null\n\n const size = resolveSessionTargetSize({\n localVideoSize: localVideoSizeRef.current,\n })\n\n const startEvent = createStartRtcRoomEvent({\n userId: rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: lastStartModelRef.current,\n size,\n prompt: lastStartPromptRef.current,\n refImagePath: lastStartRefImageRef.current,\n })\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.sendRoomEvent(startEvent)\n if (remoteContainerRef.current) {\n rtc.setRemoteVideoContainer(remoteContainerRef.current)\n }\n await rtc.refreshRemoteVideoBinding({ force: true })\n } catch (error) {\n reportError(error)\n }\n }, [reportError])\n\n useEffect(() => {\n onRemoteOutputStalledRef.current = (info) => {\n debugLogRef.current('lifecycle', 'warn', 'remote output stalled', info)\n }\n }, [])\n\n /** @deprecated Mode switching is handled by stop + start with new prompt/refImage. */\n const changeModel = useCallback(async () => {\n return\n }, [])\n\n const bindLocalView = useCallback((el: HTMLElement | null) => {\n localContainerRef.current = el\n rtcManagerRef.current?.setLocalVideoContainer(el)\n }, [])\n\n const bindRemoteView = useCallback((el: HTMLElement | null) => {\n remoteContainerRef.current = el\n if (!el) {\n detachRemoteContainer()\n return\n }\n if (outputEnabledRef.current) {\n bindRemoteContainer()\n }\n }, [bindRemoteContainer, detachRemoteContainer])\n\n const value: XmaxContextValue = useMemo(() => ({\n snapshot: {\n sessionUid: sessionUidRef.current,\n rtc: rtcState,\n inputSource,\n isCameraOn,\n isRecording,\n isGenerating,\n isOutputVerifying: !!seiGate.expectedSei && !seiGate.matched,\n hasResult,\n outputEnabled,\n dragEnabled: outputEnabled && isRecording,\n showOutputVideo: outputEnabled && (hasResult || !!rtcState.remoteVideoUserId),\n localVideoSize,\n sessionTargetSize,\n seiGate,\n },\n connect,\n disconnect,\n openCamera,\n closeCamera,\n loadVideoFile,\n clearInput,\n uploadImage,\n setRefImage,\n start,\n sendTracks,\n stop,\n changeModel,\n bindLocalView,\n bindRemoteView,\n }), [\n rtcState,\n inputSource,\n isCameraOn,\n isRecording,\n isGenerating,\n seiGate,\n hasResult,\n outputEnabled,\n localVideoSize,\n sessionTargetSize,\n connect,\n disconnect,\n openCamera,\n closeCamera,\n loadVideoFile,\n clearInput,\n uploadImage,\n setRefImage,\n start,\n sendTracks,\n stop,\n changeModel,\n bindLocalView,\n bindRemoteView,\n ])\n\n return (\n <XmaxContext.Provider value={value}>\n {children}\n </XmaxContext.Provider>\n )\n}\n\nexport function useXmax(): XmaxContextValue {\n const ctx = useContext(XmaxContext)\n if (!ctx) {\n throw new Error('useXmax must be used within XmaxProvider')\n }\n return ctx\n}\n","export function clamp(n: number, min: number, max: number) {\n return Math.min(Math.max(n, min), max)\n}\n\nexport type ContentRect = {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport type MapViewportOptions = {\n fitMode?: 'contain' | 'cover'\n /** Flip X when the output video is horizontally mirrored in CSS (xmax-open-sdk remote overlay). */\n mirrored?: boolean\n}\n\ntype MappingContext = {\n content: ContentRect\n /** Pointer hit-test bounds — inset media uses video rect; fill layout uses container (xmax). */\n hitRect: ContentRect\n source: 'media' | 'fit'\n}\n\n/** Visible video content box for contain/cover fit — matches xmax-open-sdk App.tsx. */\nexport function getFitContentRect(\n rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover' = 'contain',\n): ContentRect {\n const [targetWidth, targetHeight] = targetSize\n if (!targetWidth || !targetHeight || !rect.width || !rect.height) {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n }\n\n const scale =\n fitMode === 'cover'\n ? Math.max(rect.width / targetWidth, rect.height / targetHeight)\n : Math.min(rect.width / targetWidth, rect.height / targetHeight)\n const width = targetWidth * scale\n const height = targetHeight * scale\n\n return {\n left: rect.left + (rect.width - width) / 2,\n top: rect.top + (rect.height - height) / 2,\n width,\n height,\n }\n}\n\n/** @deprecated Use {@link getFitContentRect} with fitMode `contain`. */\nexport function getContentRect(\n rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>,\n targetSize: [number, number],\n): ContentRect {\n return getFitContentRect(rect, targetSize, 'contain')\n}\n\nexport function findDragMediaElement(\n dragSurface: HTMLElement,\n): HTMLVideoElement | HTMLCanvasElement | null {\n const root = dragSurface.parentElement ?? dragSurface\n if (typeof root.querySelector !== 'function') {\n return null\n }\n const videoHost = root.querySelector('[data-xmax-remote-video]') ?? root\n if (typeof videoHost.querySelector !== 'function') {\n return null\n }\n const media = videoHost.querySelector('video, canvas')\n return (media as HTMLVideoElement | HTMLCanvasElement | null) ?? null\n}\n\nfunction toContentRect(rect: DOMRect): ContentRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n}\n\nfunction isMediaInsetInContainer(mediaRect: DOMRect, containerRect: DOMRect): 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\n/**\n * Resolve drag mapping bounds.\n * - Upload / h-auto layouts: map to the actual output video element rect.\n * - Camera / cover fill: xmax container + cover math when video fills the host.\n */\nexport function resolveMappingContext(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover' = 'cover',\n): MappingContext {\n const containerRect = dragSurface.getBoundingClientRect()\n const media = findDragMediaElement(dragSurface)\n if (media) {\n const mediaRect = media.getBoundingClientRect()\n if (mediaRect.width > 0 && mediaRect.height > 0 && isMediaInsetInContainer(mediaRect, containerRect)) {\n const content = toContentRect(mediaRect)\n return { content, hitRect: content, source: 'media' }\n }\n }\n\n const content = getFitContentRect(containerRect, targetSize, fitMode)\n return {\n content,\n hitRect: toContentRect(containerRect),\n source: 'fit',\n }\n}\n\nexport function mapViewportPointToCoordinateSpace(\n e: Pick<PointerEvent, 'clientX' | 'clientY'>,\n container: HTMLElement,\n targetSize: [number, number],\n options: MapViewportOptions = {},\n): [number, number] | null {\n const fitMode = options.fitMode ?? 'cover'\n const mirrored = options.mirrored ?? false\n const [targetWidth, targetHeight] = targetSize\n\n if (!targetWidth || !targetHeight) {\n return null\n }\n\n const { content, hitRect } = resolveMappingContext(container, targetSize, fitMode)\n if (!content.width || !content.height) {\n return null\n }\n\n if (\n e.clientX < hitRect.left\n || e.clientY < hitRect.top\n || e.clientX > hitRect.left + hitRect.width\n || e.clientY > hitRect.top + hitRect.height\n ) {\n return null\n }\n\n const x = Math.round(((e.clientX - content.left) * targetWidth) / content.width)\n const y = Math.round(((e.clientY - content.top) * targetHeight) / content.height)\n const normalizedX = mirrored ? targetWidth - 1 - x : x\n\n return [\n clamp(normalizedX, 0, targetWidth - 1),\n clamp(y, 0, targetHeight - 1),\n ]\n}\n\n/** Inverse of mapViewportPointToCoordinateSpace — target coords to canvas pixels (CSS space × dpr). */\nexport function mapTargetPointToCanvas(\n point: [number, number],\n container: HTMLElement,\n targetSize: [number, number],\n dpr: number,\n options: MapViewportOptions = {},\n): [number, number] | null {\n const fitMode = options.fitMode ?? 'cover'\n const mirrored = options.mirrored ?? false\n const containerRect = container.getBoundingClientRect()\n const [targetWidth, targetHeight] = targetSize\n const { content } = resolveMappingContext(container, targetSize, fitMode)\n\n if (!targetWidth || !targetHeight || !content.width || !content.height) {\n return null\n }\n\n const displayX = mirrored ? targetWidth - 1 - point[0] : point[0]\n const originX = (content.left - containerRect.left) * dpr\n const originY = (content.top - containerRect.top) * dpr\n const contentW = content.width * dpr\n const contentH = content.height * dpr\n\n return [\n originX + (displayX / targetWidth) * contentW,\n originY + (point[1] / targetHeight) * contentH,\n ]\n}\n","import {\n mapTargetPointToCanvas,\n mapViewportPointToCoordinateSpace,\n} from './map-viewport'\n\ntype TargetPoint = [number, number]\ntype Segment = { a: TargetPoint; b: TargetPoint }\ntype ActivePointer = { pointerId: number; clientX: number; clientY: number }\n\nexport type DragTrackControllerOptions = {\n targetSize: [number, number]\n fitMode?: 'contain' | 'cover'\n mirrored?: boolean\n enabled?: boolean\n onTracks: (tracks: Array<[number, number]>) => void | Promise<void>\n}\n\nfunction fadeCanvas(ctx: CanvasRenderingContext2D) {\n ctx.save()\n ctx.globalCompositeOperation = 'destination-out'\n ctx.fillStyle = 'rgba(0,0,0,0.06)'\n ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n ctx.restore()\n}\n\nfunction drawNeon(\n ctx: CanvasRenderingContext2D,\n segs: Segment[],\n container: HTMLElement,\n targetSize: [number, number],\n dpr: number,\n fitMode: 'contain' | 'cover',\n mirrored: boolean,\n) {\n if (segs.length === 0) {\n return\n }\n\n const coreW = 3.6 * dpr\n const lineW = 10 * dpr\n const glowRadius = 28 * dpr\n const color = { r: 20, g: 255, b: 80 }\n const rgba = (a: number) => `rgba(${color.r},${color.g},${color.b},${a})`\n\n const strokeSegs = (opts: {\n width: number\n shadowBlur: number\n shadowAlpha: number\n alpha: number\n composite: GlobalCompositeOperation\n }) => {\n ctx.save()\n ctx.globalCompositeOperation = opts.composite\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.lineWidth = opts.width\n ctx.strokeStyle = rgba(opts.alpha)\n ctx.shadowBlur = opts.shadowBlur\n ctx.shadowColor = rgba(opts.shadowAlpha)\n ctx.beginPath()\n for (const seg of segs) {\n const start = mapTargetPointToCanvas(seg.a, container, targetSize, dpr, { fitMode, mirrored })\n const end = mapTargetPointToCanvas(seg.b, container, targetSize, dpr, { fitMode, mirrored })\n if (!start || !end) {\n continue\n }\n ctx.moveTo(start[0], start[1])\n ctx.lineTo(end[0], end[1])\n }\n ctx.stroke()\n ctx.restore()\n }\n\n strokeSegs({\n width: lineW,\n shadowBlur: glowRadius,\n shadowAlpha: 0.9,\n alpha: 0.45,\n composite: 'lighter',\n })\n strokeSegs({\n width: lineW,\n shadowBlur: 12 * dpr,\n shadowAlpha: 0.9,\n alpha: 0.9,\n composite: 'lighter',\n })\n strokeSegs({\n width: coreW,\n shadowBlur: 6 * dpr,\n shadowAlpha: 0.8,\n alpha: 1.0,\n composite: 'source-over',\n })\n\n ctx.save()\n ctx.globalCompositeOperation = 'lighter'\n ctx.fillStyle = rgba(1.0)\n ctx.shadowBlur = 10 * dpr\n ctx.shadowColor = rgba(0.8)\n const head = segs[segs.length - 1]\n if (head) {\n const headPoint = mapTargetPointToCanvas(head.b, container, targetSize, dpr, { fitMode, mirrored })\n if (headPoint) {\n ctx.beginPath()\n ctx.arc(headPoint[0], headPoint[1], 3.2 * dpr, 0, Math.PI * 2)\n ctx.fill()\n }\n }\n ctx.restore()\n}\n\nexport class DragTrackController {\n private readonly container: HTMLElement\n private readonly canvas: HTMLCanvasElement\n private readonly onTracks: DragTrackControllerOptions['onTracks']\n private targetSize: [number, number]\n private fitMode: 'contain' | 'cover'\n private mirrored: boolean\n private enabled: boolean\n private readonly activePointers = new Map<number, ActivePointer>()\n private readonly lastTargetPoints = new Map<number, TargetPoint>()\n private readonly segQueue: Segment[] = []\n private sampleTimer: number | null = null\n private sampleInFlight = false\n private rafId: number | null = null\n private resizeObserver: ResizeObserver | null = null\n private readonly onWindowResize: () => void\n private readonly onPointerDown: (e: PointerEvent) => void\n private readonly onPointerMove: (e: PointerEvent) => void\n private readonly onPointerUp: (e: PointerEvent) => void\n private readonly onPointerCancel: (e: PointerEvent) => void\n\n constructor(container: HTMLElement, options: DragTrackControllerOptions) {\n this.container = container\n this.onTracks = options.onTracks\n this.targetSize = options.targetSize\n this.fitMode = options.fitMode ?? 'cover'\n this.mirrored = options.mirrored ?? false\n this.enabled = options.enabled ?? true\n\n this.canvas = document.createElement('canvas')\n this.canvas.className = 'Xmax-drag-track-canvas'\n this.canvas.style.cssText =\n 'position:absolute;inset:0;z-index:21;width:100%;height:100%;pointer-events:none;'\n container.appendChild(this.canvas)\n\n this.onWindowResize = () => this.resizeCanvas()\n this.onPointerDown = (e) => this.handlePointerDown(e)\n this.onPointerMove = (e) => this.handlePointerMove(e)\n this.onPointerUp = (e) => this.handlePointerUp(e)\n this.onPointerCancel = (e) => this.handlePointerCancel(e)\n\n this.resizeCanvas()\n this.bindResizeObserver()\n this.bindPointerEvents()\n this.applyInteractionStyle()\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n this.applyInteractionStyle()\n if (!enabled) {\n this.finishStroke()\n }\n }\n\n setTargetSize(targetSize: [number, number]): void {\n this.targetSize = targetSize\n }\n\n setFitMode(fitMode: 'contain' | 'cover'): void {\n this.fitMode = fitMode\n }\n\n setMirrored(mirrored: boolean): void {\n this.mirrored = mirrored\n }\n\n destroy(): void {\n this.finishStroke()\n this.unbindPointerEvents()\n this.unbindResizeObserver()\n this.canvas.remove()\n }\n\n private applyInteractionStyle(): void {\n this.container.style.pointerEvents = this.enabled ? 'auto' : 'none'\n this.container.style.touchAction = this.enabled ? 'none' : 'auto'\n }\n\n private bindResizeObserver(): void {\n const ResizeObserverCtor = globalThis.ResizeObserver\n if (ResizeObserverCtor) {\n this.resizeObserver = new ResizeObserverCtor(() => this.resizeCanvas())\n this.resizeObserver.observe(this.container)\n return\n }\n window.addEventListener('resize', this.onWindowResize)\n }\n\n private unbindResizeObserver(): void {\n this.resizeObserver?.disconnect()\n this.resizeObserver = null\n window.removeEventListener('resize', this.onWindowResize)\n }\n\n private bindPointerEvents(): void {\n this.container.addEventListener('pointerdown', this.onPointerDown)\n this.container.addEventListener('pointermove', this.onPointerMove)\n this.container.addEventListener('pointerup', this.onPointerUp)\n this.container.addEventListener('pointercancel', this.onPointerCancel)\n }\n\n private unbindPointerEvents(): void {\n this.container.removeEventListener('pointerdown', this.onPointerDown)\n this.container.removeEventListener('pointermove', this.onPointerMove)\n this.container.removeEventListener('pointerup', this.onPointerUp)\n this.container.removeEventListener('pointercancel', this.onPointerCancel)\n this.activePointers.clear()\n this.lastTargetPoints.clear()\n this.sampleInFlight = false\n }\n\n private clearCanvas(): void {\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n return\n }\n ctx.save()\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n ctx.restore()\n }\n\n private resizeCanvas(): void {\n const rect = this.container.getBoundingClientRect()\n const dpr = window.devicePixelRatio || 1\n const cssW = Math.max(1, Math.round(rect.width))\n const cssH = Math.max(1, Math.round(rect.height))\n const nextW = Math.max(1, Math.round(cssW * dpr))\n const nextH = Math.max(1, Math.round(cssH * dpr))\n if (this.canvas.width !== nextW || this.canvas.height !== nextH) {\n this.canvas.width = nextW\n this.canvas.height = nextH\n this.canvas.style.width = `${cssW}px`\n this.canvas.style.height = `${cssH}px`\n this.clearCanvas()\n }\n }\n\n private toTargetPoint(e: Pick<PointerEvent, 'clientX' | 'clientY'>): TargetPoint | null {\n return mapViewportPointToCoordinateSpace(e, this.container, this.targetSize, {\n fitMode: this.fitMode,\n mirrored: this.mirrored,\n })\n }\n\n private stopDrawLoop(): void {\n if (this.rafId !== null) {\n window.cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private startDrawLoop(): void {\n if (this.rafId !== null) {\n return\n }\n\n const tick = () => {\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n this.rafId = null\n return\n }\n\n const dpr = window.devicePixelRatio || 1\n fadeCanvas(ctx)\n drawNeon(ctx, this.segQueue.splice(0), this.container, this.targetSize, dpr, this.fitMode, this.mirrored)\n\n if (this.activePointers.size > 0) {\n this.rafId = window.requestAnimationFrame(tick)\n } else {\n this.rafId = null\n }\n }\n\n this.rafId = window.requestAnimationFrame(tick)\n }\n\n private stopSampling(): void {\n if (this.sampleTimer !== null) {\n window.clearInterval(this.sampleTimer)\n this.sampleTimer = null\n }\n }\n\n private collectCurrentTracks(): Array<[number, number]> {\n const tracks: Array<[number, number]> = []\n for (const pointer of Array.from(this.activePointers.values())) {\n const point = this.toTargetPoint(pointer)\n if (point) {\n tracks.push(point)\n }\n }\n return tracks\n }\n\n private flushTracks(): void {\n if (this.sampleInFlight) {\n return\n }\n\n const tracks = this.collectCurrentTracks()\n if (!tracks.length) {\n return\n }\n\n this.sampleInFlight = true\n Promise.resolve(this.onTracks(tracks))\n .catch(() => {})\n .finally(() => {\n this.sampleInFlight = false\n })\n }\n\n private startSampling(): void {\n if (this.sampleTimer !== null) {\n return\n }\n this.flushTracks()\n this.sampleTimer = window.setInterval(() => {\n this.flushTracks()\n }, 30)\n }\n\n private finishStroke(): void {\n this.stopSampling()\n this.stopDrawLoop()\n this.segQueue.length = 0\n this.clearCanvas()\n }\n\n private handlePointerDown(e: PointerEvent): void {\n if (!this.enabled) {\n return\n }\n try {\n this.container.setPointerCapture(e.pointerId)\n } catch {\n }\n this.resizeCanvas()\n if (this.activePointers.size === 0) {\n this.segQueue.length = 0\n this.clearCanvas()\n }\n this.activePointers.set(e.pointerId, {\n pointerId: e.pointerId,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n const targetPoint = this.toTargetPoint(e)\n if (targetPoint) {\n this.lastTargetPoints.set(e.pointerId, targetPoint)\n }\n this.startDrawLoop()\n this.startSampling()\n }\n\n private handlePointerMove(e: PointerEvent): void {\n if (!this.enabled || !this.activePointers.has(e.pointerId)) {\n return\n }\n const nextTargetPoint = this.toTargetPoint(e)\n const last = this.lastTargetPoints.get(e.pointerId)\n if (last && nextTargetPoint) {\n this.segQueue.push({ a: last, b: nextTargetPoint })\n }\n if (nextTargetPoint) {\n this.lastTargetPoints.set(e.pointerId, nextTargetPoint)\n }\n this.activePointers.set(e.pointerId, {\n pointerId: e.pointerId,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n }\n\n private handlePointerUp(e: PointerEvent): void {\n if (!this.activePointers.has(e.pointerId)) {\n return\n }\n this.activePointers.delete(e.pointerId)\n this.lastTargetPoints.delete(e.pointerId)\n try {\n this.container.releasePointerCapture(e.pointerId)\n } catch {\n }\n if (this.activePointers.size === 0) {\n this.finishStroke()\n }\n }\n\n private handlePointerCancel(e: PointerEvent): void {\n if (!this.activePointers.has(e.pointerId)) {\n return\n }\n this.activePointers.delete(e.pointerId)\n this.lastTargetPoints.delete(e.pointerId)\n if (this.activePointers.size === 0) {\n this.finishStroke()\n }\n }\n}\n\nexport function createDragTrackController(\n container: HTMLElement,\n options: DragTrackControllerOptions,\n): DragTrackController {\n return new DragTrackController(container, options)\n}\n","import { useEffect, useRef } from 'react'\nimport {\n createDragTrackController,\n type DragTrackController,\n} from '../drag/drag-track-controller'\n\nexport function DragTrackSurface({\n enabled,\n targetSize,\n onTracks,\n className,\n style,\n fitMode = 'cover',\n}: {\n enabled: boolean\n targetSize: [number, number]\n onTracks: (tracks: Array<[number, number]>) => void | Promise<void>\n className?: string\n style?: React.CSSProperties\n fitMode?: 'contain' | 'cover'\n}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const controllerRef = useRef<DragTrackController | null>(null)\n const onTracksRef = useRef(onTracks)\n onTracksRef.current = onTracks\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n\n const controller = createDragTrackController(container, {\n targetSize,\n fitMode,\n enabled,\n onTracks: (tracks) => onTracksRef.current(tracks),\n })\n controllerRef.current = controller\n\n return () => {\n controller.destroy()\n controllerRef.current = null\n }\n }, [])\n\n useEffect(() => {\n controllerRef.current?.setEnabled(enabled)\n }, [enabled])\n\n useEffect(() => {\n controllerRef.current?.setTargetSize(targetSize)\n }, [targetSize])\n\n useEffect(() => {\n controllerRef.current?.setFitMode(fitMode)\n }, [fitMode])\n\n return <div ref={containerRef} className={className} style={style} />\n}\n","import { useEffect, useRef } from 'react'\nimport { DEFAULT_SESSION_TARGET_SIZE } from '../shared/reference-video-size'\nimport { DragTrackSurface } from './drag-track-surface'\nimport { useXmax } from './provider'\n\nexport function XmaxView({\n kind,\n className,\n style,\n}: {\n kind: 'local' | 'remote'\n className?: string\n style?: React.CSSProperties\n}) {\n const ref = useRef<HTMLDivElement>(null)\n const { bindLocalView, bindRemoteView, snapshot, sendTracks } = useXmax()\n\n useEffect(() => {\n const el = ref.current\n if (!el) {\n return\n }\n if (kind === 'local') {\n bindLocalView(el)\n return () => bindLocalView(null)\n }\n bindRemoteView(el)\n return () => bindRemoteView(null)\n }, [bindLocalView, bindRemoteView, kind])\n\n if (kind === 'remote') {\n const dragTargetSize = snapshot.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\n return (\n <div className={className} style={{ position: 'relative', ...style }}>\n <div ref={ref} style={{ width: '100%', height: '100%' }} />\n <DragTrackSurface\n enabled={snapshot.dragEnabled}\n targetSize={dragTargetSize}\n fitMode=\"contain\"\n onTracks={(tracks) => {\n void sendTracks({ tracks })\n }}\n className=\"absolute inset-0 touch-none\"\n style={{ zIndex: 10 }}\n />\n </div>\n )\n }\n\n return <div ref={ref} className={className} style={style} />\n}\n"]}