@xmaxai/sdk 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -2
- package/README.md +9 -5
- package/dist/{chunk-V4NR6CPP.js → chunk-F567ONBH.js} +7 -184
- package/dist/chunk-F567ONBH.js.map +1 -0
- package/dist/{chunk-LCPC56BK.js → chunk-TFGYBN3Q.js} +493 -136
- package/dist/chunk-TFGYBN3Q.js.map +1 -0
- package/dist/index.cjs +30 -272
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +369 -8
- package/dist/index.d.ts +369 -8
- package/dist/index.js +1003 -9
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +9 -271
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +1 -3
- package/dist/react/index.d.ts +1 -3
- package/dist/react/index.js +6 -26
- package/dist/react/index.js.map +1 -1
- package/dist/{rtc-manager-gYDkADGw.d.ts → rtc-manager-DnQoznIg.d.cts} +2 -17
- package/dist/{rtc-manager-gYDkADGw.d.cts → rtc-manager-DnQoznIg.d.ts} +2 -17
- package/dist/video-file-stream-4TAGKL2Q.js +3 -0
- package/dist/{video-file-stream-K7GQMIJ5.js.map → video-file-stream-4TAGKL2Q.js.map} +1 -1
- package/package.json +1 -6
- package/dist/chunk-4YHBCQ2C.js +0 -432
- package/dist/chunk-4YHBCQ2C.js.map +0 -1
- package/dist/chunk-LCPC56BK.js.map +0 -1
- package/dist/chunk-V4NR6CPP.js.map +0 -1
- package/dist/chunk-VLJZ56PT.js +0 -997
- package/dist/chunk-VLJZ56PT.js.map +0 -1
- package/dist/experimental/index.cjs +0 -3897
- package/dist/experimental/index.cjs.map +0 -1
- package/dist/experimental/index.d.cts +0 -2
- package/dist/experimental/index.d.ts +0 -2
- package/dist/experimental/index.js +0 -5
- package/dist/experimental/index.js.map +0 -1
- package/dist/index-Cw8C8LbO.d.ts +0 -367
- package/dist/index-Dg1ElHAj.d.cts +0 -367
- package/dist/video-file-stream-K7GQMIJ5.js +0 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rtc/image-file-stream.ts","../src/rtc/mirror-camera-stream.ts"],"names":["createVideoFileStream"],"mappings":"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","file":"index.js","sourcesContent":["import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { resolveUploadVideoSize } from '../shared/reference-video-size'\nimport type { VideoFileStream, VideoFileStreamOptions } from './video-file-stream'\nimport { drawSourceCenterCrop } from './canvas-frame-draw'\n\nimport { resolveRtcPublishFps } from './publish-fps'\n\nexport type ImageFileStreamOptions = VideoFileStreamOptions\n\nfunction loadImageElement(url: string, crossOrigin: boolean): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n if (crossOrigin) {\n image.crossOrigin = 'anonymous'\n }\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error('failed to load image'))\n image.src = url\n })\n}\n\nexport async function createImageFileStream(\n fileOrUrl: File | string,\n options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const isUrl = typeof fileOrUrl === 'string'\n const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n\n let imageEl: HTMLImageElement\n try {\n imageEl = await loadImageElement(url, isUrl)\n } catch {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageLoadFailed'))\n }\n\n const sourceWidth = imageEl.naturalWidth || imageEl.width || 0\n const sourceHeight = imageEl.naturalHeight || imageEl.height || 0\n if (!sourceWidth || !sourceHeight) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageTrackMissing'))\n }\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 fps = resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps })\n const frameIntervalMs = Math.max(1, Math.round(1000 / fps))\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 const previewStream = captureStreamFn.call(canvas, fps)\n const videoTrack = previewStream.getVideoTracks()[0]\n\n if (!videoTrack) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageTrackMissing'))\n }\n\n let intervalId: ReturnType<typeof setInterval> | null = null\n let destroyed = false\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n drawSourceCenterCrop(\n ctx,\n imageEl,\n outputWidth,\n outputHeight,\n sourceWidth,\n sourceHeight,\n )\n }\n\n drawFrame()\n intervalId = setInterval(drawFrame, frameIntervalMs)\n\n const videoEl = document.createElement('video')\n videoEl.muted = true\n videoEl.playsInline = true\n\n const destroy = () => {\n destroyed = true\n\n if (intervalId !== null) {\n clearInterval(intervalId)\n intervalId = null\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 imageEl.src = ''\n } catch {\n }\n\n try {\n videoEl.remove()\n } catch {\n }\n\n if (!isUrl) URL.revokeObjectURL(url)\n }\n\n return {\n url,\n previewStream,\n videoEl,\n videoTrack,\n fps,\n width: outputWidth,\n height: outputHeight,\n sourceWidth,\n sourceHeight,\n destroy,\n }\n}\n\nexport function isImageMediaFile(file: File | string): boolean {\n if (typeof file === 'string') {\n return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/i.test(file.split('?')[0])\n }\n if (file.type.startsWith('image/')) {\n return true\n }\n const name = file.name.toLowerCase()\n return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/.test(name)\n}\n\nexport function isVideoMediaFile(file: File | string): boolean {\n if (typeof file === 'string') {\n return /\\.(mp4|mov|webm|m4v|avi|mkv)$/i.test(file.split('?')[0])\n }\n if (file.type.startsWith('video/')) {\n return true\n }\n const name = file.name.toLowerCase()\n return /\\.(mp4|mov|webm|m4v|avi|mkv)$/.test(name)\n}\n\nexport async function createMediaFileStream(\n fileOrUrl: File | string,\n options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n if (isImageMediaFile(fileOrUrl)) {\n return createImageFileStream(fileOrUrl, options)\n }\n if (isVideoMediaFile(fileOrUrl)) {\n const { createVideoFileStream } = await import('./video-file-stream')\n return createVideoFileStream(fileOrUrl, options)\n }\n\n const i18n = options.i18n ?? createSDKI18n()\n const typeStr = typeof fileOrUrl === 'string' ? 'url' : (fileOrUrl.type || 'unknown')\n throw new Error(i18n.t('errors.invalidMediaFileType', { type: typeStr }))\n}\n","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { computeCenterCropRect, type CropRect } from './capture-crop'\nimport { mountCaptureVideo } from './capture-host'\n\nimport { resolveRtcPublishFps } from './publish-fps'\n\ntype VideoFrameCallbackMetadata = {\n mediaTime: number\n presentedFrames: number\n width: number\n height: number\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 MirroredCameraStream = {\n /** Original camera stream from getUserMedia. */\n sourceStream: MediaStream\n /** Horizontally flipped stream for RTC publish and local preview. */\n previewStream: MediaStream\n videoTrack: MediaStreamTrack\n videoEl: HTMLVideoElement\n width: number\n height: number\n destroy: () => void\n}\n\nexport type MirroredCameraStreamOptions = {\n fps?: number\n /** Mobile H5 uses 24fps publish; web uses 30fps. Auto-detected from viewport when omitted. */\n mobile?: boolean\n i18n?: SDKI18n\n /** Session target size — center-crop + scale before publish (WYSIWYG with preview). */\n targetSize?: [number, number]\n /** Horizontal flip before crop/scale. Defaults to true for legacy mirror helper. */\n mirror?: boolean\n}\n\nexport type OpenMirroredCameraStreamOptions = MirroredCameraStreamOptions & {\n width?: number\n height?: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n}\n\nexport async function openMirroredCameraStream(\n options: OpenMirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n\n const stream = await requestCameraMediaStream({\n width: options.width ?? 1280,\n height: options.height ?? 960,\n frameRate: options.frameRate ?? 30,\n facingMode: options.facingMode ?? 'user',\n })\n\n return createPublishCameraStream(stream, {\n fps: resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps ?? options.frameRate }),\n i18n,\n mirror: true,\n })\n}\n\n/** Canvas pipeline: optional mirror + center-crop/scale to session size for WYSIWYG publish. */\nexport async function createPublishCameraStream(\n sourceStream: MediaStream,\n options: MirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const mirror = options.mirror ?? false\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 waitForEvent(videoEl, 'loadedmetadata')\n const playResult = videoEl.play()\n if (playResult && typeof (playResult as Promise<void>).then === 'function') {\n await playResult\n }\n\n const sourceWidth = videoEl.videoWidth || 0\n const sourceHeight = videoEl.videoHeight || 0\n if (!sourceWidth || !sourceHeight) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const targetSize = options.targetSize\n const hasTargetSize =\n !!targetSize && targetSize[0] > 0 && targetSize[1] > 0\n\n if (!mirror && !hasTargetSize) {\n return {\n sourceStream,\n previewStream: sourceStream,\n videoTrack: sourceTrack,\n videoEl,\n width: sourceWidth,\n height: sourceHeight,\n destroy: () => {\n try {\n videoEl.pause()\n } catch {\n }\n try {\n videoEl.srcObject = null\n videoEl.remove()\n } catch {\n }\n },\n }\n }\n\n let outputWidth = sourceWidth\n let outputHeight = sourceHeight\n let cropRect: CropRect = {\n x: 0,\n y: 0,\n width: sourceWidth,\n height: sourceHeight,\n }\n\n if (hasTargetSize) {\n outputWidth = targetSize![0]\n outputHeight = targetSize![1]\n cropRect = computeCenterCropRect(sourceWidth, sourceHeight, outputWidth / outputHeight)\n }\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 throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n const fps = resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps })\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 throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n const previewStream = captureStreamFn.call(canvas, fps)\n const videoTrack = previewStream.getVideoTracks()[0]\n if (!videoTrack) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n let rafId: number | null = null\n let videoFrameCallbackId: number | null = null\n let destroyed = false\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n ctx.clearRect(0, 0, outputWidth, outputHeight)\n ctx.save()\n if (mirror) {\n ctx.translate(outputWidth, 0)\n ctx.scale(-1, 1)\n }\n ctx.drawImage(\n videoEl,\n cropRect.x,\n cropRect.y,\n cropRect.width,\n cropRect.height,\n 0,\n 0,\n outputWidth,\n outputHeight,\n )\n ctx.restore()\n }\n\n const scheduleNextFrame = () => {\n if (destroyed) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n videoFrameCallbackId = video.requestVideoFrameCallback(() => {\n drawFrame()\n scheduleNextFrame()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n drawFrame()\n scheduleNextFrame()\n })\n }\n\n drawFrame()\n scheduleNextFrame()\n\n const destroy = () => {\n destroyed = true\n\n const video = videoEl as VideoWithFrameCallback\n if (videoFrameCallbackId !== null && video.cancelVideoFrameCallback) {\n video.cancelVideoFrameCallback(videoFrameCallbackId)\n videoFrameCallbackId = null\n }\n\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n rafId = 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.srcObject = null\n videoEl.remove()\n } catch {\n }\n }\n\n return {\n sourceStream,\n previewStream,\n videoTrack,\n videoEl,\n width: outputWidth,\n height: outputHeight,\n destroy,\n }\n}\n\nexport async function createMirroredCameraStreamFromMediaStream(\n sourceStream: MediaStream,\n options: MirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n return createPublishCameraStream(sourceStream, { ...options, mirror: options.mirror ?? true })\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 = () => {\n cleanup()\n reject(new Error(`failed to load video metadata: ${String(eventName)}`))\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/rtc/image-file-stream.ts","../src/rtc/mirror-camera-stream.ts","../src/shared/ref-image.ts","../src/drag/remote-view-host.ts","../src/realtime/initial-state.ts","../src/realtime/prewarm.ts","../src/realtime/session.ts","../src/realtime/create-client.ts","../src/drag/drag-video-sync.ts"],"names":["createVideoFileStream","options","overlay","drawable","videoHost"],"mappings":"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","file":"index.js","sourcesContent":["import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { resolveUploadVideoSize } from '../shared/reference-video-size'\nimport type { VideoFileStream, VideoFileStreamOptions } from './video-file-stream'\nimport { drawSourceCenterCrop } from './canvas-frame-draw'\n\nimport { resolveRtcPublishFps } from './publish-fps'\n\nexport type ImageFileStreamOptions = VideoFileStreamOptions\n\nfunction loadImageElement(url: string, crossOrigin: boolean): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n if (crossOrigin) {\n image.crossOrigin = 'anonymous'\n }\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error('failed to load image'))\n image.src = url\n })\n}\n\nexport async function createImageFileStream(\n fileOrUrl: File | string,\n options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const isUrl = typeof fileOrUrl === 'string'\n const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n\n let imageEl: HTMLImageElement\n try {\n imageEl = await loadImageElement(url, isUrl)\n } catch {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageLoadFailed'))\n }\n\n const sourceWidth = imageEl.naturalWidth || imageEl.width || 0\n const sourceHeight = imageEl.naturalHeight || imageEl.height || 0\n if (!sourceWidth || !sourceHeight) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageTrackMissing'))\n }\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 fps = resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps })\n const frameIntervalMs = Math.max(1, Math.round(1000 / fps))\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 const previewStream = captureStreamFn.call(canvas, fps)\n const videoTrack = previewStream.getVideoTracks()[0]\n\n if (!videoTrack) {\n if (!isUrl) URL.revokeObjectURL(url)\n throw new Error(i18n.t('errors.imageTrackMissing'))\n }\n\n let intervalId: ReturnType<typeof setInterval> | null = null\n let destroyed = false\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n drawSourceCenterCrop(\n ctx,\n imageEl,\n outputWidth,\n outputHeight,\n sourceWidth,\n sourceHeight,\n )\n }\n\n drawFrame()\n intervalId = setInterval(drawFrame, frameIntervalMs)\n\n const videoEl = document.createElement('video')\n videoEl.muted = true\n videoEl.playsInline = true\n\n const destroy = () => {\n destroyed = true\n\n if (intervalId !== null) {\n clearInterval(intervalId)\n intervalId = null\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 imageEl.src = ''\n } catch {\n }\n\n try {\n videoEl.remove()\n } catch {\n }\n\n if (!isUrl) URL.revokeObjectURL(url)\n }\n\n return {\n url,\n previewStream,\n videoEl,\n videoTrack,\n fps,\n width: outputWidth,\n height: outputHeight,\n sourceWidth,\n sourceHeight,\n destroy,\n }\n}\n\nexport function isImageMediaFile(file: File | string): boolean {\n if (typeof file === 'string') {\n return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/i.test(file.split('?')[0])\n }\n if (file.type.startsWith('image/')) {\n return true\n }\n const name = file.name.toLowerCase()\n return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/.test(name)\n}\n\nexport function isVideoMediaFile(file: File | string): boolean {\n if (typeof file === 'string') {\n return /\\.(mp4|mov|webm|m4v|avi|mkv)$/i.test(file.split('?')[0])\n }\n if (file.type.startsWith('video/')) {\n return true\n }\n const name = file.name.toLowerCase()\n return /\\.(mp4|mov|webm|m4v|avi|mkv)$/.test(name)\n}\n\nexport async function createMediaFileStream(\n fileOrUrl: File | string,\n options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n if (isImageMediaFile(fileOrUrl)) {\n return createImageFileStream(fileOrUrl, options)\n }\n if (isVideoMediaFile(fileOrUrl)) {\n const { createVideoFileStream } = await import('./video-file-stream')\n return createVideoFileStream(fileOrUrl, options)\n }\n\n const i18n = options.i18n ?? createSDKI18n()\n const typeStr = typeof fileOrUrl === 'string' ? 'url' : (fileOrUrl.type || 'unknown')\n throw new Error(i18n.t('errors.invalidMediaFileType', { type: typeStr }))\n}\n","import { createSDKI18n, type SDKI18n } from '../i18n'\nimport { requestCameraMediaStream } from '../shared/camera-stream'\nimport { computeCenterCropRect, type CropRect } from './capture-crop'\nimport { mountCaptureVideo } from './capture-host'\n\nimport { resolveRtcPublishFps } from './publish-fps'\n\ntype VideoFrameCallbackMetadata = {\n mediaTime: number\n presentedFrames: number\n width: number\n height: number\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 MirroredCameraStream = {\n /** Original camera stream from getUserMedia. */\n sourceStream: MediaStream\n /** Horizontally flipped stream for RTC publish and local preview. */\n previewStream: MediaStream\n videoTrack: MediaStreamTrack\n videoEl: HTMLVideoElement\n width: number\n height: number\n destroy: () => void\n}\n\nexport type MirroredCameraStreamOptions = {\n fps?: number\n /** Mobile H5 uses 24fps publish; web uses 30fps. Auto-detected from viewport when omitted. */\n mobile?: boolean\n i18n?: SDKI18n\n /** Session target size — center-crop + scale before publish (WYSIWYG with preview). */\n targetSize?: [number, number]\n /** Horizontal flip before crop/scale. Defaults to true for legacy mirror helper. */\n mirror?: boolean\n}\n\nexport type OpenMirroredCameraStreamOptions = MirroredCameraStreamOptions & {\n width?: number\n height?: number\n frameRate?: number\n facingMode?: ConstrainDOMString\n}\n\nexport async function openMirroredCameraStream(\n options: OpenMirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n\n const stream = await requestCameraMediaStream({\n width: options.width ?? 1280,\n height: options.height ?? 960,\n frameRate: options.frameRate ?? 30,\n facingMode: options.facingMode ?? 'user',\n })\n\n return createPublishCameraStream(stream, {\n fps: resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps ?? options.frameRate }),\n i18n,\n mirror: true,\n })\n}\n\n/** Canvas pipeline: optional mirror + center-crop/scale to session size for WYSIWYG publish. */\nexport async function createPublishCameraStream(\n sourceStream: MediaStream,\n options: MirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n const i18n = options.i18n ?? createSDKI18n()\n const mirror = options.mirror ?? false\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 waitForEvent(videoEl, 'loadedmetadata')\n const playResult = videoEl.play()\n if (playResult && typeof (playResult as Promise<void>).then === 'function') {\n await playResult\n }\n\n const sourceWidth = videoEl.videoWidth || 0\n const sourceHeight = videoEl.videoHeight || 0\n if (!sourceWidth || !sourceHeight) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n const targetSize = options.targetSize\n const hasTargetSize =\n !!targetSize && targetSize[0] > 0 && targetSize[1] > 0\n\n if (!mirror && !hasTargetSize) {\n return {\n sourceStream,\n previewStream: sourceStream,\n videoTrack: sourceTrack,\n videoEl,\n width: sourceWidth,\n height: sourceHeight,\n destroy: () => {\n try {\n videoEl.pause()\n } catch {\n }\n try {\n videoEl.srcObject = null\n videoEl.remove()\n } catch {\n }\n },\n }\n }\n\n let outputWidth = sourceWidth\n let outputHeight = sourceHeight\n let cropRect: CropRect = {\n x: 0,\n y: 0,\n width: sourceWidth,\n height: sourceHeight,\n }\n\n if (hasTargetSize) {\n outputWidth = targetSize![0]\n outputHeight = targetSize![1]\n cropRect = computeCenterCropRect(sourceWidth, sourceHeight, outputWidth / outputHeight)\n }\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 throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n const fps = resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps })\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 throw new Error(i18n.t('errors.captureStreamUnsupported'))\n }\n\n const previewStream = captureStreamFn.call(canvas, fps)\n const videoTrack = previewStream.getVideoTracks()[0]\n if (!videoTrack) {\n throw new Error(i18n.t('errors.videoTrackMissing'))\n }\n\n let rafId: number | null = null\n let videoFrameCallbackId: number | null = null\n let destroyed = false\n\n const drawFrame = () => {\n if (destroyed) {\n return\n }\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n ctx.clearRect(0, 0, outputWidth, outputHeight)\n ctx.save()\n if (mirror) {\n ctx.translate(outputWidth, 0)\n ctx.scale(-1, 1)\n }\n ctx.drawImage(\n videoEl,\n cropRect.x,\n cropRect.y,\n cropRect.width,\n cropRect.height,\n 0,\n 0,\n outputWidth,\n outputHeight,\n )\n ctx.restore()\n }\n\n const scheduleNextFrame = () => {\n if (destroyed) {\n return\n }\n\n const video = videoEl as VideoWithFrameCallback\n if (video.requestVideoFrameCallback) {\n videoFrameCallbackId = video.requestVideoFrameCallback(() => {\n drawFrame()\n scheduleNextFrame()\n })\n return\n }\n\n rafId = window.requestAnimationFrame(() => {\n drawFrame()\n scheduleNextFrame()\n })\n }\n\n drawFrame()\n scheduleNextFrame()\n\n const destroy = () => {\n destroyed = true\n\n const video = videoEl as VideoWithFrameCallback\n if (videoFrameCallbackId !== null && video.cancelVideoFrameCallback) {\n video.cancelVideoFrameCallback(videoFrameCallbackId)\n videoFrameCallbackId = null\n }\n\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n rafId = 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.srcObject = null\n videoEl.remove()\n } catch {\n }\n }\n\n return {\n sourceStream,\n previewStream,\n videoTrack,\n videoEl,\n width: outputWidth,\n height: outputHeight,\n destroy,\n }\n}\n\nexport async function createMirroredCameraStreamFromMediaStream(\n sourceStream: MediaStream,\n options: MirroredCameraStreamOptions = {},\n): Promise<MirroredCameraStream> {\n return createPublishCameraStream(sourceStream, { ...options, mirror: options.mirror ?? true })\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 = () => {\n cleanup()\n reject(new Error(`failed to load video metadata: ${String(eventName)}`))\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","import type { XmaxOpenClient } from '../sdk/client'\n\nexport async function resolveRefImageUrl(\n client: XmaxOpenClient,\n input: File | string,\n): Promise<string> {\n if (input instanceof File) {\n return (await client.uploadImage(input)).url\n }\n\n const raw = input.trim()\n if (!raw) {\n return ''\n }\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw\n }\n\n const res = await fetch(raw)\n if (!res.ok) {\n throw new Error(`Failed to load ref image: ${res.status}`)\n }\n\n const blob = await res.blob()\n const mime = blob.type || 'image/png'\n const ext =\n mime === 'image/jpeg' ? 'jpg' :\n mime === 'image/webp' ? 'webp' :\n mime === 'image/gif' ? 'gif' :\n 'png'\n const file = new File([blob], `ref.${ext}`, { type: mime })\n return (await client.uploadImage(file)).url\n}\n","export type RemoteViewHost = {\n wrapper: HTMLElement\n videoHost: HTMLElement\n dragHost: HTMLElement\n}\n\nexport function createRemoteViewHost(wrapper: HTMLElement): RemoteViewHost {\n const computed = getComputedStyle(wrapper)\n if (computed.position === 'static') {\n wrapper.style.position = 'relative'\n }\n\n const videoHost = document.createElement('div')\n videoHost.dataset.XmaxRemoteVideo = 'true'\n videoHost.style.cssText =\n 'position:relative;z-index:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;'\n\n const dragHost = document.createElement('div')\n dragHost.dataset.XmaxDragSurface = 'true'\n dragHost.style.cssText =\n 'position:absolute;inset:0;z-index:20;touch-action:none;'\n\n wrapper.replaceChildren()\n wrapper.appendChild(videoHost)\n wrapper.appendChild(dragHost)\n\n return { wrapper, videoHost, dragHost }\n}\n","import type { RealtimeInitialState } from './types'\n\n/** Internal RTC start `params.model` placeholder when the host omits it. */\nexport const DEFAULT_RTC_START_MODEL = 'default'\n\nexport function resolveGenerationModel(model?: string | null): string {\n const trimmed = model?.trim()\n return trimmed || DEFAULT_RTC_START_MODEL\n}\n\nexport function resolvePromptText(prompt: RealtimeInitialState['prompt']): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nexport function resolveInitialRefImage(initialState?: RealtimeInitialState): string | undefined {\n if (!initialState) {\n return undefined\n }\n if (typeof initialState.refImage === 'string' && initialState.refImage.trim()) {\n return initialState.refImage.trim()\n }\n if (typeof initialState.image === 'string' && initialState.image.trim()) {\n return initialState.image.trim()\n }\n return undefined\n}\n\nexport function shouldAutoStartOnConnect(initialState?: RealtimeInitialState): boolean {\n return initialState?.autoStart === true\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createSDKI18n } from '../i18n'\nimport type { RealtimeModel, XmaxClientOptions } from './types'\n\nexport type PrewarmedRoomResources = {\n client: XmaxOpenClient\n rtc: RtcManager\n sessionUid: string\n}\n\n/** Holds a joined RTC room before camera input is attached — iOS enterRoom-at-launch equivalent. */\nexport class RealtimePrewarmHandle {\n readonly modelName: string\n\n private consumed = false\n private disposed = false\n\n private constructor(\n readonly client: XmaxOpenClient,\n readonly rtc: RtcManager,\n readonly sessionUid: string,\n modelName: string,\n ) {\n this.modelName = modelName\n }\n\n static async create(\n model: RealtimeModel,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimePrewarmHandle> {\n const modelName = model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n const sdkI18n = createSDKI18n({})\n const client = new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: clientOptions.onError,\n })\n\n const rtc = new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const createdSession = await client.createSession(modelName)\n const sessionUid = createdSession.sessionUid?.trim()\n if (!sessionUid) {\n throw new Error('Session uid is missing')\n }\n\n const joinInfo = client.getRtcJoinInfo(createdSession)\n await rtc.join(joinInfo)\n\n const handle = new RealtimePrewarmHandle(client, rtc, sessionUid, modelName)\n\n client.startHeartbeat(\n sessionUid,\n clientOptions.heartbeatIntervalMs ?? 10_000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void handle.cancel()\n }\n },\n () => {\n void handle.cancel()\n },\n )\n\n return handle\n }\n\n consume(expectedModelName: string): PrewarmedRoomResources | null {\n const normalized = expectedModelName.trim()\n if (this.consumed || this.disposed || !normalized || this.modelName !== normalized) {\n return null\n }\n\n this.consumed = true\n return {\n client: this.client,\n rtc: this.rtc,\n sessionUid: this.sessionUid,\n }\n }\n\n async cancel(): Promise<void> {\n if (this.consumed || this.disposed) {\n return\n }\n\n this.disposed = true\n this.client.beginTeardown()\n try {\n await this.client.closeSession(this.sessionUid)\n } catch {\n }\n try {\n await this.rtc.leave()\n } catch {\n }\n this.client.endTeardown()\n }\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { createDragTrackController, type DragTrackController } from '../drag/drag-track-controller'\nimport { createRemoteViewHost, type RemoteViewHost } from '../drag/remote-view-host'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError } from '../shared/error-utils'\nimport { resolveRefImageUrl } from '../shared/ref-image'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport {\n resolveInitialRefImage,\n resolveGenerationModel,\n resolvePromptText,\n shouldAutoStartOnConnect,\n} from './initial-state'\nimport { resolveRtcPublishFps } from '../rtc/publish-fps'\nimport { RealtimePrewarmHandle, type PrewarmedRoomResources } from './prewarm'\nimport type {\n RealtimeConnectOptions,\n RealtimeDisconnectOptions,\n RealtimeDisconnectReason,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nfunction resolvePromptInput(prompt?: string | RealtimePromptState): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nfunction resolveRefImagePath(refImage?: string | null): string | undefined {\n const trimmed = refImage?.trim()\n return trimmed || undefined\n}\n\nfunction getVideoTrack(stream: MediaStream): MediaStreamTrack {\n const track = stream.getVideoTracks()[0]\n if (!track) {\n throw new Error('Missing video track in MediaStream')\n }\n return track\n}\n\nfunction readVideoSize(track: MediaStreamTrack): { width: number; height: number } | null {\n const settings = track.getSettings?.()\n if (typeof settings?.width === 'number' && settings.width > 0 &&\n typeof settings?.height === 'number' && settings.height > 0) {\n return { width: settings.width, height: settings.height }\n }\n return null\n}\n\nexport class RealtimeSession implements XmaxRealtimeSession {\n private readonly client: XmaxOpenClient\n private readonly rtc: RtcManager\n private readonly reportError: (error: unknown, fallbackMessage?: string) => never\n private readonly remoteElement: HTMLElement | null\n private readonly onRemoteStream?: (stream: MediaStream) => void\n private readonly onDisconnect?: (reason: RealtimeDisconnectReason) => void\n private readonly onPublishPipelineWaitChange?: (waiting: boolean) => void\n\n private sessionUid: string | null = null\n private taskUid: string | null = null\n private localVideoSize: { width: number; height: number } | null = null\n private currentPrompt = ''\n private currentGenerationModel = ''\n private disconnected = false\n /** True only after `connect()` bootstrap succeeds — gates `onDisconnect`. */\n private sessionEstablished = false\n private disconnectNotified = false\n private pendingDisconnectReason: RealtimeDisconnectReason = 'client'\n private remoteViewHost: RemoteViewHost | null = null\n private dragController: DragTrackController | null = null\n private dragTrackFitMode: 'contain' | 'cover' = 'cover'\n private sessionTargetSize: [number, number] | null = null\n private sessionSizeOverride: [number, number] | undefined\n private mirroredInputStream: NativeCameraStream | null = null\n private hiddenRemoteElement: HTMLElement | null = null\n private remoteStreamNotifyTimer: ReturnType<typeof setInterval> | null = null\n private lastNotifiedRemoteStream: MediaStream | null = null\n private dragOption: boolean | undefined = undefined\n\n constructor(\n client: XmaxOpenClient,\n rtc: RtcManager,\n reportError: (error: unknown, fallbackMessage?: string) => never,\n options: Pick<RealtimeConnectOptions, 'remoteElement' | 'onRemoteStream' | 'onDisconnect' | 'drag'>,\n clientOptions?: Pick<XmaxClientOptions, 'onPublishPipelineWaitChange'>,\n ) {\n this.client = client\n this.rtc = rtc\n this.reportError = reportError\n this.onRemoteStream = options.onRemoteStream\n this.onDisconnect = options.onDisconnect\n this.onPublishPipelineWaitChange = clientOptions?.onPublishPipelineWaitChange\n\n if (options.remoteElement) {\n this.remoteElement = options.remoteElement\n if (options.drag !== false) {\n this.remoteViewHost = createRemoteViewHost(this.remoteElement)\n }\n return\n }\n\n if (options.onRemoteStream) {\n const hidden = document.createElement('div')\n hidden.setAttribute('data-Xmax-remote-host', 'true')\n hidden.style.cssText =\n 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden'\n document.body.appendChild(hidden)\n this.hiddenRemoteElement = hidden\n this.remoteElement = hidden\n this.remoteViewHost = createRemoteViewHost(hidden)\n this.rtc.setOnRemotePlayerMounted(() => {\n this.scheduleNotifyRemoteStream()\n })\n return\n }\n\n this.remoteElement = null\n }\n\n private get remoteVideoContainer(): HTMLElement | null {\n return this.remoteViewHost?.videoHost ?? this.remoteElement\n }\n\n static async connect(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimeSession> {\n const sdkI18n = createSDKI18n({})\n // Connect-level onError wins when set; otherwise keep createXmaxClient.onError (Playground/API path).\n const notifyUserError = options.onError ?? clientOptions.onError\n const reportError = (error: unknown, fallbackMessage?: string): never => {\n throw notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }\n\n const modelName = options.model.name.trim()\n const prewarmed = options.prewarmed instanceof RealtimePrewarmHandle\n ? options.prewarmed.consume(modelName)\n : null\n\n const client = prewarmed?.client ?? new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: notifyUserError,\n })\n\n const rtc = prewarmed?.rtc ?? new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const session = new RealtimeSession(client, rtc, reportError, options, clientOptions)\n\n try {\n await session.bootstrap(stream, options, clientOptions.heartbeatIntervalMs ?? 10_000, prewarmed)\n session.sessionEstablished = true\n return session\n } catch (error) {\n await session.safeDisconnect()\n throw reportError(error)\n }\n }\n\n private async bootstrap(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n heartbeatIntervalMs: number,\n prewarmed: PrewarmedRoomResources | null = null,\n ): Promise<void> {\n this.dragOption = options.drag\n\n const modelName = options.model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n if (prewarmed) {\n this.sessionUid = prewarmed.sessionUid\n } else {\n const createdSession = await this.client.createSession(modelName)\n if (!createdSession.sessionUid?.trim()) {\n throw new Error('Session uid is missing')\n }\n\n this.sessionUid = createdSession.sessionUid\n this.client.startHeartbeat(\n createdSession.sessionUid,\n heartbeatIntervalMs,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void this.safeDisconnect({ reason: 'session_inactive' })\n }\n },\n () => {\n void this.safeDisconnect({ reason: 'heartbeat_error' })\n },\n )\n\n const joinInfo = this.client.getRtcJoinInfo(createdSession)\n await this.rtc.join(joinInfo)\n }\n\n if (options.localElement) {\n this.rtc.setLocalVideoContainer(options.localElement)\n }\n\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n this.sessionSizeOverride = options.size\n\n const videoTrack = getVideoTrack(stream)\n const isFileInput = options.inputKind === 'file'\n this.dragTrackFitMode = isFileInput ? 'contain' : 'cover'\n const rawVideoSize = readVideoSize(videoTrack)\n const publishSize: [number, number] = options.size\n ?? (rawVideoSize\n ? resolveUploadVideoSize(rawVideoSize.width, rawVideoSize.height)\n : DEFAULT_SESSION_TARGET_SIZE)\n\n let publishTrack = videoTrack\n if (isFileInput) {\n if (options.size) {\n this.localVideoSize = { width: options.size[0], height: options.size[1] }\n } else if (rawVideoSize) {\n this.localVideoSize = { width: rawVideoSize.width, height: rawVideoSize.height }\n } else {\n this.localVideoSize = null\n }\n } else if (options.prebuiltCameraStream) {\n this.mirroredInputStream = options.prebuiltCameraStream\n publishTrack = options.prebuiltCameraStream.videoTrack\n this.localVideoSize = {\n width: options.prebuiltCameraStream.width,\n height: options.prebuiltCameraStream.height,\n }\n } else {\n const processedStream = await createNativeCameraStream(stream)\n this.mirroredInputStream = processedStream\n publishTrack = processedStream.videoTrack\n this.localVideoSize = { width: processedStream.width, height: processedStream.height }\n }\n\n const initialState = options.initialState\n this.currentPrompt = resolvePromptText(initialState?.prompt)\n this.currentGenerationModel = resolveGenerationModel(initialState?.model)\n\n const publishFpsOptions = {\n mobile: options.mobile,\n highQuality: true as const,\n fps: isFileInput\n ? options.model.fps\n : resolveRtcPublishFps({ mobile: options.mobile }),\n }\n\n // Publish before ref upload so RTC outbound warms while ref image uploads.\n await this.rtc.startExternalVideoPublishing(publishTrack, publishSize, publishFpsOptions)\n\n let initialRefImageUrl: string | undefined\n const initialRefImage = resolveInitialRefImage(initialState)\n if (initialRefImage) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialRefImage)\n } else if (initialState?.image instanceof File) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialState.image)\n } else if (initialState?.image instanceof Blob) {\n const mime = initialState.image.type || 'image/png'\n const file = new File([initialState.image], 'ref-image', { type: mime })\n initialRefImageUrl = await resolveRefImageUrl(this.client, file)\n }\n\n if (options.localElement) {\n queueMicrotask(() => this.refreshLocalPreview())\n }\n\n if (shouldAutoStartOnConnect(initialState)) {\n // static_* are never cached — only included when Instant passes them on this start.\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options.size,\n refImage: initialRefImageUrl,\n staticGenerate: initialState?.staticGenerate,\n staticImagePath: initialState?.staticImagePath?.trim() || undefined,\n })\n }\n }\n\n async setPrompt(\n prompt: string | RealtimePromptState,\n _options?: { enhance?: boolean },\n ): Promise<void> {\n try {\n const promptText = resolvePromptInput(prompt)\n this.currentPrompt = promptText\n if (!this.taskUid) {\n await this.runStart({\n prompt: promptText || undefined,\n })\n return\n }\n await this.restart({ prompt: promptText })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async set(input: RealtimeSetInput): Promise<void> {\n try {\n let refImage: string | undefined\n if (input.image === null) {\n refImage = undefined\n } else if (input.image !== undefined) {\n refImage = await this.setRefImage(input.image as File | string)\n }\n\n const prompt = input.prompt !== undefined ? resolvePromptInput(input.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setImage(\n image: string | File | Blob,\n options?: RealtimeSetImageOptions,\n ): Promise<void> {\n try {\n const refImage = await this.setRefImage(image as File | string)\n const prompt = options?.prompt ? resolvePromptInput(options.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setRefImage(input: File | string): Promise<string> {\n try {\n const resolved = await resolveRefImageUrl(this.client, input)\n return resolved\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async restart(options?: RealtimeRestartOptions): Promise<void> {\n try {\n let resolvedRefImage: string | undefined\n if (options && 'refImage' in options) {\n const ref = options.refImage\n if (ref === null || ref === '') {\n resolvedRefImage = undefined\n } else if (typeof ref === 'string' && ref.trim()) {\n resolvedRefImage = await this.setRefImage(ref.trim())\n }\n }\n\n if (options?.prompt !== undefined) {\n this.currentPrompt = options.prompt.trim()\n }\n if (options?.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n // static_* are never cached — only sent when the caller passes them (Instant only).\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options?.size,\n refImage: resolvedRefImage,\n staticGenerate: options?.staticGenerate === true ? true : undefined,\n staticImagePath: options?.staticImagePath?.trim() || undefined,\n preserveRemoteOutput: options?.preserveRemoteOutput,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async refreshRemoteOutput(options?: { force?: boolean }): Promise<void> {\n if (!this.remoteVideoContainer) {\n return\n }\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n await this.rtc.refreshRemoteVideoBinding(options)\n this.scheduleNotifyRemoteStream()\n }\n\n refreshLocalPreview(): void {\n this.rtc.refreshLocalVideoPreview()\n }\n\n getInputPreviewStream(): MediaStream | null {\n return this.mirroredInputStream?.previewStream ?? null\n }\n\n detachRemoteOutput(): void {\n this.rtc.setRemoteVideoContainer(null)\n }\n\n async sendTracks(tracks: Array<[number, number]>): Promise<void> {\n if (!this.rtc.snapshot.joined || !this.taskUid) {\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createTracksRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: this.taskUid,\n sessionUid: this.taskUid,\n tracks,\n }),\n )\n } catch {\n // Track sending is best-effort for live interaction.\n }\n }\n\n async stop(options?: { preserveRemoteDom?: boolean }): Promise<void> {\n this.updateDragController(false)\n\n const preserveRemoteDom = options?.preserveRemoteDom ?? false\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n if (!this.rtc.snapshot.joined) {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createStopRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n sessionUid: this.taskUid ?? undefined,\n }),\n )\n } finally {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n async disconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n if (this.disconnected) {\n return\n }\n this.disconnected = true\n await this.safeDisconnect({ ...options, reason: 'client' })\n }\n\n getSessionUid(): string | null {\n return this.sessionUid\n }\n\n private async runStart(options: {\n prompt?: string\n model?: string\n size?: [number, number]\n refImage?: string\n staticGenerate?: boolean\n staticImagePath?: string\n preserveRemoteOutput?: boolean\n }): Promise<void> {\n if (!this.rtc.snapshot.joined) {\n return\n }\n\n const preserveRemoteOutput = options.preserveRemoteOutput ?? false\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n const startPrompt = options.prompt?.trim() ?? this.currentPrompt\n if (options.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n const modelLabel = resolveGenerationModel(this.currentGenerationModel)\n\n await this.rtc.ensurePublishedInputBeforeStart()\n\n if (!preserveRemoteOutput) {\n this.rtc.setRemoteVideoContainer(null)\n this.rtc.clearRemoteVideo()\n }\n\n const size = resolveSessionTargetSize({\n localVideoSize: this.localVideoSize,\n overrideSize: options.size ?? this.sessionSizeOverride,\n })\n this.sessionTargetSize = size\n\n const taskUid = createTaskUid()\n this.taskUid = taskUid\n\n this.rtc.configureSessionSei(taskUid)\n\n try {\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n const startRoomEvent = createStartRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: modelLabel,\n size,\n prompt: startPrompt,\n refImagePath: resolveRefImagePath(options.refImage),\n // Never reuse prior start — caller must pass Instant fields each time.\n staticGenerate: options.staticGenerate === true ? true : undefined,\n staticImagePath: options.staticImagePath?.trim() || undefined,\n })\n\n await this.rtc.sendRoomEvent(startRoomEvent)\n\n await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput })\n this.updateDragController(true)\n this.scheduleNotifyRemoteStream()\n } catch (error) {\n this.rtc.configureSessionSei(null)\n throw error\n } finally {\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n private isDragEnabled(): boolean {\n if (this.dragOption === false) {\n return false\n }\n if (this.dragOption === true) {\n return true\n }\n return Boolean(this.remoteElement && !this.hiddenRemoteElement)\n }\n\n private updateDragController(active: boolean): void {\n const dragHost = this.remoteViewHost?.dragHost\n if (!dragHost || !active || !this.taskUid || !this.isDragEnabled()) {\n this.dragController?.setEnabled(false)\n return\n }\n\n const targetSize = this.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\n if (!this.dragController) {\n this.dragController = createDragTrackController(dragHost, {\n targetSize,\n fitMode: this.dragTrackFitMode,\n mirrored: false,\n enabled: true,\n onTracks: (tracks) => {\n void this.sendTracks(tracks)\n },\n })\n return\n }\n\n this.dragController.setTargetSize(targetSize)\n this.dragController.setFitMode(this.dragTrackFitMode)\n this.dragController.setMirrored(false)\n this.dragController.setEnabled(true)\n }\n\n private scheduleNotifyRemoteStream(): void {\n if (!this.onRemoteStream) {\n return\n }\n\n this.clearRemoteStreamNotifyTimer()\n if (this.notifyRemoteStreamOnce()) {\n return\n }\n\n let attempts = 0\n this.remoteStreamNotifyTimer = setInterval(() => {\n attempts += 1\n if (this.notifyRemoteStreamOnce() || attempts >= 60) {\n this.clearRemoteStreamNotifyTimer()\n }\n }, 500)\n }\n\n private notifyRemoteStreamOnce(): boolean {\n const videoRoot = this.remoteVideoContainer\n if (!this.onRemoteStream || !videoRoot) {\n return false\n }\n\n const video = videoRoot instanceof HTMLVideoElement\n ? videoRoot\n : videoRoot.querySelector('video')\n\n if (!(video instanceof HTMLVideoElement) || !(video.srcObject instanceof MediaStream)) {\n return false\n }\n\n if (this.lastNotifiedRemoteStream === video.srcObject) {\n return true\n }\n\n this.lastNotifiedRemoteStream = video.srcObject\n this.onRemoteStream(video.srcObject)\n return true\n }\n\n private clearRemoteStreamNotifyTimer(): void {\n if (this.remoteStreamNotifyTimer !== null) {\n clearInterval(this.remoteStreamNotifyTimer)\n this.remoteStreamNotifyTimer = null\n }\n }\n\n private emitDisconnect(reason: RealtimeDisconnectReason): void {\n if (!this.sessionEstablished || this.disconnectNotified) {\n return\n }\n this.disconnectNotified = true\n try {\n this.onDisconnect?.(reason)\n } catch {\n // Host callback errors must not break teardown.\n }\n }\n\n private async safeDisconnect(\n options?: RealtimeDisconnectOptions & { reason?: RealtimeDisconnectReason },\n ): Promise<void> {\n const reason = options?.reason ?? this.pendingDisconnectReason\n this.pendingDisconnectReason = reason\n this.disconnected = true\n\n this.clearRemoteStreamNotifyTimer()\n this.lastNotifiedRemoteStream = null\n const activeSessionUid = this.sessionUid\n this.sessionUid = null\n\n this.client.beginTeardown()\n\n if (activeSessionUid) {\n try {\n await this.client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n const generationActive = !!this.taskUid && this.rtc.snapshot.joined\n try {\n if (generationActive) {\n await this.stop()\n } else {\n this.updateDragController(false)\n this.rtc.clearRemoteVideo()\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.stopVideoPublishing()\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.leave()\n }\n } catch {\n }\n\n this.client.endTeardown()\n\n this.taskUid = null\n this.currentPrompt = ''\n this.currentGenerationModel = ''\n this.sessionTargetSize = null\n this.dragController?.destroy()\n this.dragController = null\n this.mirroredInputStream?.destroy()\n this.mirroredInputStream = null\n\n if (this.hiddenRemoteElement) {\n this.hiddenRemoteElement.remove()\n this.hiddenRemoteElement = null\n }\n\n this.emitDisconnect(reason)\n }\n}\n","import { XMAX_OPEN_API_PRODUCTION_BASE_URL, XmaxOpenClient } from '../sdk/client'\nimport { RealtimeSession } from './session'\nimport { RealtimePrewarmHandle } from './prewarm'\nimport type { RealtimeConnectOptions, XmaxClient, XmaxClientOptions } from './types'\n\nfunction resolveClientOptions(options: XmaxClientOptions): Required<Pick<XmaxClientOptions, 'baseUrl'>> & XmaxClientOptions {\n return {\n ...options,\n baseUrl: options.baseUrl?.trim() || XMAX_OPEN_API_PRODUCTION_BASE_URL,\n }\n}\n\nexport function createXmaxClient(options: XmaxClientOptions): XmaxClient {\n const resolved = resolveClientOptions(options)\n const httpClient = new XmaxOpenClient({\n apiKey: resolved.apiKey,\n authToken: resolved.authToken,\n baseUrl: resolved.baseUrl,\n onError: resolved.onError,\n })\n\n return {\n files: {\n uploadImage: (file: File) => httpClient.uploadImage(file),\n uploadVideo: (file: File) => httpClient.uploadVideo(file),\n upload: (file: File) => httpClient.uploadImage(file),\n },\n realtime: {\n prewarm: (options: { model: RealtimeConnectOptions['model'] }) =>\n RealtimePrewarmHandle.create(options.model, resolved),\n connect: (stream: MediaStream, connectOptions: RealtimeConnectOptions) =>\n RealtimeSession.connect(stream, connectOptions, resolved),\n },\n }\n}\n\nexport type {\n RealtimeConnectOptions,\n RealtimeDisconnectReason,\n RealtimeInitialState,\n RealtimeModel,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n SeiGateState,\n XmaxClient,\n XmaxClientFiles,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nexport { models } from './models'\nexport { RealtimeSession } from './session'\nexport { RealtimePrewarmHandle } from './prewarm'\n","import { getFitContentRect, type ContentRect } from './map-viewport'\nimport type { RemoteViewHost } from './remote-view-host'\n\nexport const DRAG_SYNCED_ATTR = 'data-xmax-drag-synced'\n\nexport type DragVideoSyncOptions = {\n getTargetSize: () => [number, number]\n getFitMode: () => 'contain' | 'cover'\n onSync?: () => void\n}\n\nexport type RemoteDragLayout = {\n /** Drawable overlay aligned to the painted RTC media on screen. */\n overlay: ContentRect\n /** Pointer → session coordinate mapping bounds. */\n mapping: ContentRect\n /** Hit-test bounds inside the preview frame. */\n hitRect: ContentRect\n source: 'media' | 'intrinsic' | 'fit'\n}\n\nfunction toContentRect(rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>): ContentRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n}\n\nexport function isMediaInsetInContainer(\n mediaRect: Pick<DOMRect, 'width' | 'height'>,\n containerRect: Pick<DOMRect, 'width' | 'height'>,\n): boolean {\n if (!mediaRect.width || !mediaRect.height || !containerRect.width || !containerRect.height) {\n return false\n }\n const widthRatio = mediaRect.width / containerRect.width\n const heightRatio = mediaRect.height / containerRect.height\n return widthRatio < 0.98 || heightRatio < 0.98\n}\n\nexport function intersectContentRects(a: ContentRect, b: ContentRect): ContentRect {\n const left = Math.max(a.left, b.left)\n const top = Math.max(a.top, b.top)\n const right = Math.min(a.left + a.width, b.left + b.width)\n const bottom = Math.min(a.top + a.height, b.top + b.height)\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n }\n}\n\nexport function readMediaIntrinsicSize(\n media: HTMLVideoElement | HTMLCanvasElement,\n): [number, number] | null {\n const video = media as HTMLVideoElement\n if ('videoWidth' in video && video.videoWidth > 0 && video.videoHeight > 0) {\n return [video.videoWidth, video.videoHeight]\n }\n\n if (media.width > 0 && media.height > 0) {\n return [media.width, media.height]\n }\n return null\n}\n\nexport function resolveMediaObjectFit(\n media: HTMLElement,\n fallback: 'contain' | 'cover',\n): 'contain' | 'cover' | 'fill' {\n if (typeof getComputedStyle !== 'function') {\n return fallback\n }\n\n const fit = getComputedStyle(media).objectFit\n if (fit === 'contain' || fit === 'cover' || fit === 'fill') {\n return fit\n }\n return fallback\n}\n\nexport function resolveRemoteDragLayout(input: {\n wrapperRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n mediaRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n media: HTMLVideoElement | HTMLCanvasElement | null\n targetSize: [number, number]\n fitMode: 'contain' | 'cover'\n}): RemoteDragLayout | null {\n const { wrapperRect, mediaRect, media, targetSize, fitMode } = input\n if (!wrapperRect.width || !wrapperRect.height || !mediaRect.width || !mediaRect.height) {\n return null\n }\n\n const wrapper = toContentRect(wrapperRect)\n\n // Upload / RTC FIT: map linearly across the media layout box (h-full w-auto). Hit-test only\n // the visible portion inside the preview frame (wide images overflow horizontally).\n if (fitMode === 'contain') {\n const overlay = toContentRect(mediaRect)\n const hitRect = intersectContentRects(overlay, wrapper)\n const drawable = hitRect.width > 0 && hitRect.height > 0 ? hitRect : wrapper\n return { overlay: drawable, mapping: overlay, hitRect: drawable, source: 'media' }\n }\n\n if (isMediaInsetInContainer(mediaRect, wrapperRect)) {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: overlay, source: 'media' }\n }\n\n const intrinsic = media ? readMediaIntrinsicSize(media) : null\n const frameSize = intrinsic ?? targetSize\n const objectFit = media ? resolveMediaObjectFit(media, fitMode) : fitMode\n\n if (objectFit === 'fill') {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: wrapper, source: 'intrinsic' }\n }\n\n const mapping = getFitContentRect(mediaRect, frameSize, objectFit)\n const overlay = intersectContentRects(mapping, wrapper)\n const drawable = overlay.width > 0 && overlay.height > 0 ? overlay : wrapper\n return {\n overlay: drawable,\n mapping,\n hitRect: wrapper,\n source: intrinsic ? 'intrinsic' : 'fit',\n }\n}\n\nfunction resetDragHostFullBleed(dragHost: HTMLElement): void {\n dragHost.style.inset = '0'\n dragHost.style.left = ''\n dragHost.style.top = ''\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.style.width = ''\n dragHost.style.height = ''\n dragHost.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\n/** Align drag overlay to the painted RTC media region on screen. */\nexport function syncDragHostToVideo(\n host: RemoteViewHost,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const { wrapper, videoHost, dragHost } = host\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const mediaRect = media.getBoundingClientRect()\n const layout = resolveRemoteDragLayout({\n wrapperRect,\n mediaRect,\n media,\n targetSize,\n fitMode,\n })\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const { overlay } = layout\n dragHost.style.inset = 'auto'\n dragHost.style.left = `${overlay.left - wrapperRect.left}px`\n dragHost.style.top = `${overlay.top - wrapperRect.top}px`\n dragHost.style.width = `${overlay.width}px`\n dragHost.style.height = `${overlay.height}px`\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\nfunction resetDragSurfaceFullBleed(dragSurface: HTMLElement): void {\n dragSurface.style.inset = '0'\n dragSurface.style.left = ''\n dragSurface.style.top = ''\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.style.width = ''\n dragSurface.style.height = ''\n dragSurface.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\nfunction applyDragSurfaceOverlayStyles(\n dragSurface: HTMLElement,\n overlay: ContentRect,\n wrapperRect: Pick<DOMRect, 'left' | 'top'>,\n): boolean {\n const nextLeft = `${overlay.left - wrapperRect.left}px`\n const nextTop = `${overlay.top - wrapperRect.top}px`\n const nextWidth = `${overlay.width}px`\n const nextHeight = `${overlay.height}px`\n\n if (\n dragSurface.hasAttribute(DRAG_SYNCED_ATTR)\n && dragSurface.style.inset === 'auto'\n && dragSurface.style.left === nextLeft\n && dragSurface.style.top === nextTop\n && dragSurface.style.width === nextWidth\n && dragSurface.style.height === nextHeight\n ) {\n return false\n }\n\n dragSurface.style.inset = 'auto'\n dragSurface.style.left = nextLeft\n dragSurface.style.top = nextTop\n dragSurface.style.width = nextWidth\n dragSurface.style.height = nextHeight\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\n/** Align app-layer drag overlay to the painted RTC media region (xmax-open-sdk track surface). */\nexport function syncDragSurfaceToVideo(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const layout = resolveRemoteDragLayoutFromSurface(dragSurface, targetSize, fitMode)\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const { overlay } = layout\n return applyDragSurfaceOverlayStyles(dragSurface, overlay, wrapperRect)\n}\n\nexport function resolveRemoteDragLayoutFromSurface(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): RemoteDragLayout | null {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return null\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]') as HTMLElement | null\n if (!videoHost) {\n return null\n }\n\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n return null\n }\n\n return resolveRemoteDragLayout({\n wrapperRect: wrapper.getBoundingClientRect(),\n mediaRect: media.getBoundingClientRect(),\n media,\n targetSize,\n fitMode,\n })\n}\n\nexport function observeDragHostVideoSync(\n host: RemoteViewHost,\n options: DragVideoSyncOptions,\n): () => void {\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n\n const bindMediaListeners = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (!media || mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => apply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n syncDragHostToVideo(host, options.getTargetSize(), options.getFitMode())\n options.onSync?.()\n bindMediaListeners()\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => apply())\n : null\n resizeObserver?.observe(host.wrapper)\n resizeObserver?.observe(host.videoHost)\n\n const observeMedia = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n }\n }\n observeMedia()\n\n const mutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n apply()\n })\n : null\n mutationObserver?.observe(host.videoHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n\n const onWindowChange = () => apply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragHostFullBleed(host.dragHost)\n }\n}\n\n/** Keep an app-layer drag surface aligned with remote output video layout. */\nexport function observeDragSurfaceVideoSync(\n dragSurface: HTMLElement,\n options: DragVideoSyncOptions,\n): () => void {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return () => {}\n }\n\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n let rafId: number | null = null\n let observedVideoHost: Element | null = null\n\n const bindMediaListeners = (media: EventTarget) => {\n if (mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => scheduleApply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n const changed = syncDragSurfaceToVideo(dragSurface, options.getTargetSize(), options.getFitMode())\n if (changed) {\n options.onSync?.()\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n const media = videoHost?.querySelector('video, canvas')\n if (media) {\n bindMediaListeners(media)\n }\n }\n\n const scheduleApply = () => {\n if (rafId !== null) {\n return\n }\n rafId = requestAnimationFrame(() => {\n rafId = null\n apply()\n })\n }\n\n const bindVideoHostObserver = (videoHostObserver: MutationObserver | null) => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n if (!host || host === observedVideoHost || !videoHostObserver) {\n return\n }\n\n videoHostObserver.disconnect()\n observedVideoHost = host\n videoHostObserver.observe(host, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleApply())\n : null\n resizeObserver?.observe(wrapper)\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n if (videoHost) {\n resizeObserver?.observe(videoHost)\n }\n\n const observeMedia = () => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n const media = host?.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n bindMediaListeners(media)\n }\n }\n observeMedia()\n\n const videoHostMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n scheduleApply()\n })\n : null\n bindVideoHostObserver(videoHostMutationObserver)\n\n // Child-list only on wrapper — never watch dragSurface style (would loop with sync).\n const wrapperMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n bindVideoHostObserver(videoHostMutationObserver)\n observeMedia()\n scheduleApply()\n })\n : null\n wrapperMutationObserver?.observe(wrapper, {\n childList: true,\n subtree: true,\n })\n\n const onWindowChange = () => scheduleApply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n resizeObserver?.disconnect()\n wrapperMutationObserver?.disconnect()\n videoHostMutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragSurfaceFullBleed(dragSurface)\n }\n}\n"]}
|