@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.
Files changed (38) hide show
  1. package/CHANGELOG.md +10 -2
  2. package/README.md +9 -5
  3. package/dist/{chunk-V4NR6CPP.js → chunk-F567ONBH.js} +7 -184
  4. package/dist/chunk-F567ONBH.js.map +1 -0
  5. package/dist/{chunk-LCPC56BK.js → chunk-TFGYBN3Q.js} +493 -136
  6. package/dist/chunk-TFGYBN3Q.js.map +1 -0
  7. package/dist/index.cjs +30 -272
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +369 -8
  10. package/dist/index.d.ts +369 -8
  11. package/dist/index.js +1003 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/react/index.cjs +9 -271
  14. package/dist/react/index.cjs.map +1 -1
  15. package/dist/react/index.d.cts +1 -3
  16. package/dist/react/index.d.ts +1 -3
  17. package/dist/react/index.js +6 -26
  18. package/dist/react/index.js.map +1 -1
  19. package/dist/{rtc-manager-gYDkADGw.d.ts → rtc-manager-DnQoznIg.d.cts} +2 -17
  20. package/dist/{rtc-manager-gYDkADGw.d.cts → rtc-manager-DnQoznIg.d.ts} +2 -17
  21. package/dist/video-file-stream-4TAGKL2Q.js +3 -0
  22. package/dist/{video-file-stream-K7GQMIJ5.js.map → video-file-stream-4TAGKL2Q.js.map} +1 -1
  23. package/package.json +1 -6
  24. package/dist/chunk-4YHBCQ2C.js +0 -432
  25. package/dist/chunk-4YHBCQ2C.js.map +0 -1
  26. package/dist/chunk-LCPC56BK.js.map +0 -1
  27. package/dist/chunk-V4NR6CPP.js.map +0 -1
  28. package/dist/chunk-VLJZ56PT.js +0 -997
  29. package/dist/chunk-VLJZ56PT.js.map +0 -1
  30. package/dist/experimental/index.cjs +0 -3897
  31. package/dist/experimental/index.cjs.map +0 -1
  32. package/dist/experimental/index.d.cts +0 -2
  33. package/dist/experimental/index.d.ts +0 -2
  34. package/dist/experimental/index.js +0 -5
  35. package/dist/experimental/index.js.map +0 -1
  36. package/dist/index-Cw8C8LbO.d.ts +0 -367
  37. package/dist/index-Dg1ElHAj.d.cts +0 -367
  38. package/dist/video-file-stream-K7GQMIJ5.js +0 -4
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { S as SDKLocale, a as SDKI18n, X as XmaxErrorNotifier, R as RtcStateSnapshot, U as UploadImageResult } from '../rtc-manager-gYDkADGw.cjs';
3
+ import { S as SDKLocale, a as SDKI18n, b as XmaxErrorNotifier, u as RtcStateSnapshot, U as UploadImageResult } from '../rtc-manager-DnQoznIg.cjs';
4
4
 
5
5
  type InputSource = 'none' | 'camera' | 'video';
6
6
  type XmaxSeiGateState = {
@@ -82,8 +82,6 @@ type XmaxContextValue = {
82
82
  tracks: Array<[number, number]>;
83
83
  }) => Promise<void>;
84
84
  stop: () => Promise<void>;
85
- /** @deprecated Mode switching is handled by stop + start with new prompt/refImage. */
86
- changeModel: () => Promise<void>;
87
85
  bindLocalView: (el: HTMLElement | null) => void;
88
86
  bindRemoteView: (el: HTMLElement | null) => void;
89
87
  };
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { S as SDKLocale, a as SDKI18n, X as XmaxErrorNotifier, R as RtcStateSnapshot, U as UploadImageResult } from '../rtc-manager-gYDkADGw.js';
3
+ import { S as SDKLocale, a as SDKI18n, b as XmaxErrorNotifier, u as RtcStateSnapshot, U as UploadImageResult } from '../rtc-manager-DnQoznIg.js';
4
4
 
5
5
  type InputSource = 'none' | 'camera' | 'video';
6
6
  type XmaxSeiGateState = {
@@ -82,8 +82,6 @@ type XmaxContextValue = {
82
82
  tracks: Array<[number, number]>;
83
83
  }) => Promise<void>;
84
84
  stop: () => Promise<void>;
85
- /** @deprecated Mode switching is handled by stop + start with new prompt/refImage. */
86
- changeModel: () => Promise<void>;
87
85
  bindLocalView: (el: HTMLElement | null) => void;
88
86
  bindRemoteView: (el: HTMLElement | null) => void;
89
87
  };
@@ -1,6 +1,5 @@
1
- import { browserToast, notifyError, RtcManager, XmaxOpenClient, ACTIVE_STATUS, createStopRtcRoomEvent, models, requestCameraMediaStream, createNativeCameraStream, createTaskUid, createStartRtcRoomEvent, createTracksRtcRoomEvent, createDragTrackController } from '../chunk-V4NR6CPP.js';
2
- import { createVideoFileStream } from '../chunk-4YHBCQ2C.js';
3
- import { createSDKI18n, resolveUploadVideoSize, isMobilePublishEnvironment, resolveSessionTargetSize, DEFAULT_SESSION_TARGET_SIZE } from '../chunk-LCPC56BK.js';
1
+ import { notifyError, RtcManager, XmaxOpenClient, ACTIVE_STATUS, createStopRtcRoomEvent, models, requestCameraMediaStream, createNativeCameraStream, createTaskUid, createStartRtcRoomEvent, createTracksRtcRoomEvent, createDragTrackController } from '../chunk-F567ONBH.js';
2
+ import { createSDKI18n, resolveUploadVideoSize, isMobilePublishEnvironment, createVideoFileStream, resolveSessionTargetSize, DEFAULT_SESSION_TARGET_SIZE } from '../chunk-TFGYBN3Q.js';
4
3
  import { createContext, useMemo, useRef, useCallback, useState, useEffect, useContext } from 'react';
5
4
  import { jsx, jsxs } from 'react/jsx-runtime';
6
5
 
@@ -137,18 +136,9 @@ function XmaxProvider({ config, children }) {
137
136
  const detachRemoteContainer = useCallback(() => {
138
137
  rtcManagerRef.current?.setRemoteVideoContainer(null);
139
138
  }, []);
140
- const notifyUserError = useCallback((message, error) => {
141
- if (externalOnError) {
142
- externalOnError(message, error);
143
- return;
144
- }
145
- if (typeof window !== "undefined" && typeof document !== "undefined") {
146
- browserToast.error(message);
147
- }
148
- }, [externalOnError]);
149
139
  const reportError = useCallback((error, fallbackMessage) => {
150
- return notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t("errors.requestFailed"));
151
- }, [notifyUserError, sdkI18n]);
140
+ return notifyError(error, externalOnError, fallbackMessage ?? sdkI18n.t("errors.requestFailed"));
141
+ }, [externalOnError, sdkI18n]);
152
142
  const rtcManagerRef = useRef(null);
153
143
  if (!rtcManagerRef.current) {
154
144
  rtcManagerRef.current = new RtcManager({
@@ -177,11 +167,11 @@ function XmaxProvider({ config, children }) {
177
167
  baseUrl: config.baseUrl,
178
168
  locale: config.locale,
179
169
  i18n: sdkI18n,
180
- onError: notifyUserError
170
+ onError: externalOnError
181
171
  });
182
172
  clientRef.current = created;
183
173
  return created;
184
- }, [config.apiKey, config.authToken, config.baseUrl, config.locale, notifyUserError, sdkI18n]);
174
+ }, [config.apiKey, config.authToken, config.baseUrl, config.locale, externalOnError, sdkI18n]);
185
175
  const ensureConnected = useCallback(async () => {
186
176
  const client = getClient();
187
177
  const rtc = rtcManagerRef.current;
@@ -591,11 +581,6 @@ function XmaxProvider({ config, children }) {
591
581
  if (!activeTaskUid) {
592
582
  return;
593
583
  }
594
- console.log("[Xmax] sendTracks", {
595
- taskUid: activeTaskUid,
596
- targetSize: sessionTargetSize,
597
- tracks: options.tracks
598
- });
599
584
  try {
600
585
  const event = createTracksRtcRoomEvent({
601
586
  userId: rtc.snapshot.userId ?? void 0,
@@ -648,9 +633,6 @@ function XmaxProvider({ config, children }) {
648
633
  debugLogRef.current("lifecycle", "warn", "remote output stalled", info);
649
634
  };
650
635
  }, []);
651
- const changeModel = useCallback(async () => {
652
- return;
653
- }, []);
654
636
  const bindLocalView = useCallback((el) => {
655
637
  localContainerRef.current = el;
656
638
  rtcManagerRef.current?.setLocalVideoContainer(el);
@@ -693,7 +675,6 @@ function XmaxProvider({ config, children }) {
693
675
  start,
694
676
  sendTracks,
695
677
  stop,
696
- changeModel,
697
678
  bindLocalView,
698
679
  bindRemoteView
699
680
  }), [
@@ -718,7 +699,6 @@ function XmaxProvider({ config, children }) {
718
699
  start,
719
700
  sendTracks,
720
701
  stop,
721
- changeModel,
722
702
  bindLocalView,
723
703
  bindRemoteView
724
704
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/session-debug.ts","../../src/react/provider.tsx","../../src/react/drag-track-surface.tsx","../../src/react/view.tsx"],"names":["result","useRef","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["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","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/shared/session-debug.ts","../../src/react/provider.tsx","../../src/react/drag-track-surface.tsx","../../src/react/view.tsx"],"names":["result","useRef","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["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 { 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 reportError = useCallback((error: unknown, fallbackMessage?: string) => {\n return notifyError(error, externalOnError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }, [externalOnError, 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: externalOnError,\n })\n clientRef.current = created\n return created\n }, [config.apiKey, config.authToken, config.baseUrl, config.locale, externalOnError, 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 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 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 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 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","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"]}
@@ -110,7 +110,7 @@ declare class XmaxOpenClient {
110
110
  private readonly pendingRequestControllers;
111
111
  constructor(options: ClientOptions);
112
112
  private throwError;
113
- /** Stop heartbeat, abort in-flight API requests, and suppress error toasts during teardown. */
113
+ /** Stop heartbeat, abort in-flight API requests, and suppress error notifications during teardown. */
114
114
  beginTeardown(): void;
115
115
  endTeardown(): void;
116
116
  private isAbortError;
@@ -132,8 +132,6 @@ declare class XmaxOpenClient {
132
132
  declare const MOBILE_PUBLISH_MAX_WIDTH_PX = 768;
133
133
  declare const RTC_PUBLISH_FPS_WEB = 30;
134
134
  declare const RTC_PUBLISH_FPS_MOBILE = 24;
135
- /** @deprecated Use {@link resolveRtcPublishFps} — web default only. */
136
- declare const RTC_PUBLISH_FPS = 30;
137
135
  type ResolveRtcPublishFpsOptions = {
138
136
  /** When set, skips viewport detection. */
139
137
  mobile?: boolean;
@@ -319,19 +317,6 @@ declare class RtcManager {
319
317
  * Cold — longer warmup; warm restart — quick sync (~200ms) so backend gets steady input after start.
320
318
  */
321
319
  ensurePublishedInputBeforeStart(): Promise<void>;
322
- /** @deprecated Use {@link ensurePublishedInputBeforeStart}. */
323
- waitForRtcOutboundBeforeStart(options?: {
324
- timeoutMs?: number;
325
- }): Promise<LocalPublishReadyResult>;
326
- /** @deprecated Use {@link waitForRtcOutboundBeforeStart}. */
327
- waitForPublishedInputFramesBeforeStart(): Promise<{
328
- ready: boolean;
329
- frameCount: number;
330
- elapsedMs: number;
331
- rtcSendReady: boolean;
332
- rtcSendReason?: LocalPublishReadyResult["reason"];
333
- rtcSendElapsedMs?: number;
334
- }>;
335
320
  private waitForMinPublishDuration;
336
321
  /**
337
322
  * Subscribe to the bot output stream before start — iOS bindRemoteVideoRenderer runs pre-request.
@@ -409,4 +394,4 @@ declare class RtcManager {
409
394
  private debugLog;
410
395
  }
411
396
 
412
- export { ACTIVE_STATUS as A, XMAX_OPEN_API_PRODUCTION_BASE_URL as B, type ClientOptions as C, type XmaxLogEntry as D, type XmaxSdkRegion as E, createSDKI18n as F, getDefaultMessages as G, isMobilePublishEnvironment as H, resolveRtcPublishFps as I, resolveRtcPublishFrameIntervalS as J, type LocalPublishReadyResult as L, MEDIA_TIME_EPSILON_S as M, PUBLISH_COLD_FRAME_TIMEOUT_MS as P, type RtcStateSnapshot as R, type SDKLocale as S, type UploadImageResult as U, type XmaxErrorNotifier as X, type SDKI18n as a, XmaxOpenClient as b, type CosSts as c, MEDIA_TIME_LOOP_JUMP_S as d, MOBILE_PUBLISH_MAX_WIDTH_PX as e, type ModelExtra as f, PUBLISH_COLD_MIN_FRAMES as g, PUBLISH_COLD_WARMUP_MS as h, PUBLISH_START_FRAME_TIMEOUT_MS as i, PUBLISH_START_MIN_FRAMES as j, PUBLISH_WARM_SKIP_MS as k, RTC_PUBLISH_FPS as l, RTC_PUBLISH_FPS_MOBILE as m, RTC_PUBLISH_FPS_WEB as n, RTC_PUBLISH_FRAME_INTERVAL_MS as o, RTC_PUBLISH_FRAME_INTERVAL_S as p, type RemoteSeiReceivedPayload as q, type ResolveRtcPublishFpsOptions as r, type RtcJoinInfo as s, type RtcLogEntry as t, RtcManager as u, type SDKMessages as v, type Session as w, type StsCredentials as x, type UploadVideoResult as y, XMAX_OPEN_API_BASE_URLS as z };
397
+ export { ACTIVE_STATUS as A, type XmaxLogEntry as B, type ClientOptions as C, type XmaxSdkRegion as D, createSDKI18n as E, getDefaultMessages as F, isMobilePublishEnvironment as G, resolveRtcPublishFps as H, resolveRtcPublishFrameIntervalS as I, type LocalPublishReadyResult as L, MEDIA_TIME_EPSILON_S as M, PUBLISH_COLD_FRAME_TIMEOUT_MS as P, RtcManager as R, type SDKLocale as S, type UploadImageResult as U, XmaxOpenClient as X, type SDKI18n as a, type XmaxErrorNotifier as b, type UploadVideoResult as c, type CosSts as d, MEDIA_TIME_LOOP_JUMP_S as e, MOBILE_PUBLISH_MAX_WIDTH_PX as f, type ModelExtra as g, PUBLISH_COLD_MIN_FRAMES as h, PUBLISH_COLD_WARMUP_MS as i, PUBLISH_START_FRAME_TIMEOUT_MS as j, PUBLISH_START_MIN_FRAMES as k, PUBLISH_WARM_SKIP_MS as l, RTC_PUBLISH_FPS_MOBILE as m, RTC_PUBLISH_FPS_WEB as n, RTC_PUBLISH_FRAME_INTERVAL_MS as o, RTC_PUBLISH_FRAME_INTERVAL_S as p, type RemoteSeiReceivedPayload as q, type ResolveRtcPublishFpsOptions as r, type RtcJoinInfo as s, type RtcLogEntry as t, type RtcStateSnapshot as u, type SDKMessages as v, type Session as w, type StsCredentials as x, XMAX_OPEN_API_BASE_URLS as y, XMAX_OPEN_API_PRODUCTION_BASE_URL as z };
@@ -110,7 +110,7 @@ declare class XmaxOpenClient {
110
110
  private readonly pendingRequestControllers;
111
111
  constructor(options: ClientOptions);
112
112
  private throwError;
113
- /** Stop heartbeat, abort in-flight API requests, and suppress error toasts during teardown. */
113
+ /** Stop heartbeat, abort in-flight API requests, and suppress error notifications during teardown. */
114
114
  beginTeardown(): void;
115
115
  endTeardown(): void;
116
116
  private isAbortError;
@@ -132,8 +132,6 @@ declare class XmaxOpenClient {
132
132
  declare const MOBILE_PUBLISH_MAX_WIDTH_PX = 768;
133
133
  declare const RTC_PUBLISH_FPS_WEB = 30;
134
134
  declare const RTC_PUBLISH_FPS_MOBILE = 24;
135
- /** @deprecated Use {@link resolveRtcPublishFps} — web default only. */
136
- declare const RTC_PUBLISH_FPS = 30;
137
135
  type ResolveRtcPublishFpsOptions = {
138
136
  /** When set, skips viewport detection. */
139
137
  mobile?: boolean;
@@ -319,19 +317,6 @@ declare class RtcManager {
319
317
  * Cold — longer warmup; warm restart — quick sync (~200ms) so backend gets steady input after start.
320
318
  */
321
319
  ensurePublishedInputBeforeStart(): Promise<void>;
322
- /** @deprecated Use {@link ensurePublishedInputBeforeStart}. */
323
- waitForRtcOutboundBeforeStart(options?: {
324
- timeoutMs?: number;
325
- }): Promise<LocalPublishReadyResult>;
326
- /** @deprecated Use {@link waitForRtcOutboundBeforeStart}. */
327
- waitForPublishedInputFramesBeforeStart(): Promise<{
328
- ready: boolean;
329
- frameCount: number;
330
- elapsedMs: number;
331
- rtcSendReady: boolean;
332
- rtcSendReason?: LocalPublishReadyResult["reason"];
333
- rtcSendElapsedMs?: number;
334
- }>;
335
320
  private waitForMinPublishDuration;
336
321
  /**
337
322
  * Subscribe to the bot output stream before start — iOS bindRemoteVideoRenderer runs pre-request.
@@ -409,4 +394,4 @@ declare class RtcManager {
409
394
  private debugLog;
410
395
  }
411
396
 
412
- export { ACTIVE_STATUS as A, XMAX_OPEN_API_PRODUCTION_BASE_URL as B, type ClientOptions as C, type XmaxLogEntry as D, type XmaxSdkRegion as E, createSDKI18n as F, getDefaultMessages as G, isMobilePublishEnvironment as H, resolveRtcPublishFps as I, resolveRtcPublishFrameIntervalS as J, type LocalPublishReadyResult as L, MEDIA_TIME_EPSILON_S as M, PUBLISH_COLD_FRAME_TIMEOUT_MS as P, type RtcStateSnapshot as R, type SDKLocale as S, type UploadImageResult as U, type XmaxErrorNotifier as X, type SDKI18n as a, XmaxOpenClient as b, type CosSts as c, MEDIA_TIME_LOOP_JUMP_S as d, MOBILE_PUBLISH_MAX_WIDTH_PX as e, type ModelExtra as f, PUBLISH_COLD_MIN_FRAMES as g, PUBLISH_COLD_WARMUP_MS as h, PUBLISH_START_FRAME_TIMEOUT_MS as i, PUBLISH_START_MIN_FRAMES as j, PUBLISH_WARM_SKIP_MS as k, RTC_PUBLISH_FPS as l, RTC_PUBLISH_FPS_MOBILE as m, RTC_PUBLISH_FPS_WEB as n, RTC_PUBLISH_FRAME_INTERVAL_MS as o, RTC_PUBLISH_FRAME_INTERVAL_S as p, type RemoteSeiReceivedPayload as q, type ResolveRtcPublishFpsOptions as r, type RtcJoinInfo as s, type RtcLogEntry as t, RtcManager as u, type SDKMessages as v, type Session as w, type StsCredentials as x, type UploadVideoResult as y, XMAX_OPEN_API_BASE_URLS as z };
397
+ export { ACTIVE_STATUS as A, type XmaxLogEntry as B, type ClientOptions as C, type XmaxSdkRegion as D, createSDKI18n as E, getDefaultMessages as F, isMobilePublishEnvironment as G, resolveRtcPublishFps as H, resolveRtcPublishFrameIntervalS as I, type LocalPublishReadyResult as L, MEDIA_TIME_EPSILON_S as M, PUBLISH_COLD_FRAME_TIMEOUT_MS as P, RtcManager as R, type SDKLocale as S, type UploadImageResult as U, XmaxOpenClient as X, type SDKI18n as a, type XmaxErrorNotifier as b, type UploadVideoResult as c, type CosSts as d, MEDIA_TIME_LOOP_JUMP_S as e, MOBILE_PUBLISH_MAX_WIDTH_PX as f, type ModelExtra as g, PUBLISH_COLD_MIN_FRAMES as h, PUBLISH_COLD_WARMUP_MS as i, PUBLISH_START_FRAME_TIMEOUT_MS as j, PUBLISH_START_MIN_FRAMES as k, PUBLISH_WARM_SKIP_MS as l, RTC_PUBLISH_FPS_MOBILE as m, RTC_PUBLISH_FPS_WEB as n, RTC_PUBLISH_FRAME_INTERVAL_MS as o, RTC_PUBLISH_FRAME_INTERVAL_S as p, type RemoteSeiReceivedPayload as q, type ResolveRtcPublishFpsOptions as r, type RtcJoinInfo as s, type RtcLogEntry as t, type RtcStateSnapshot as u, type SDKMessages as v, type Session as w, type StsCredentials as x, XMAX_OPEN_API_BASE_URLS as y, XMAX_OPEN_API_PRODUCTION_BASE_URL as z };
@@ -0,0 +1,3 @@
1
+ export { createVideoFileStream } from './chunk-TFGYBN3Q.js';
2
+ //# sourceMappingURL=video-file-stream-4TAGKL2Q.js.map
3
+ //# sourceMappingURL=video-file-stream-4TAGKL2Q.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"video-file-stream-K7GQMIJ5.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"video-file-stream-4TAGKL2Q.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmaxai/sdk",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Browser SDK for Xmax Open Platform — HTTP session, Volcengine RTC, and React bindings.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -33,11 +33,6 @@
33
33
  "types": "./dist/react/index.d.ts",
34
34
  "import": "./dist/react/index.js",
35
35
  "require": "./dist/react/index.cjs"
36
- },
37
- "./experimental": {
38
- "types": "./dist/experimental/index.d.ts",
39
- "import": "./dist/experimental/index.js",
40
- "require": "./dist/experimental/index.cjs"
41
36
  }
42
37
  },
43
38
  "publishConfig": {