@xmaxai/sdk 1.0.0 → 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-M5QA6LWS.js → chunk-F567ONBH.js} +32 -190
- package/dist/chunk-F567ONBH.js.map +1 -0
- package/dist/{chunk-PLU2YVAS.js → chunk-TFGYBN3Q.js} +493 -136
- package/dist/chunk-TFGYBN3Q.js.map +1 -0
- package/dist/index.cjs +76 -294
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +376 -10
- package/dist/index.d.ts +376 -10
- package/dist/index.js +1003 -9
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +34 -277
- 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.cts → rtc-manager-DnQoznIg.d.cts} +2 -17
- package/dist/{rtc-manager-gYDkADGw.d.ts → rtc-manager-DnQoznIg.d.ts} +2 -17
- package/dist/video-file-stream-4TAGKL2Q.js +3 -0
- package/dist/{video-file-stream-UXJ6TNIB.js.map → video-file-stream-4TAGKL2Q.js.map} +1 -1
- package/package.json +1 -6
- package/dist/chunk-7X7QCO3O.js +0 -992
- package/dist/chunk-7X7QCO3O.js.map +0 -1
- package/dist/chunk-EGNRAZ5U.js +0 -432
- package/dist/chunk-EGNRAZ5U.js.map +0 -1
- package/dist/chunk-M5QA6LWS.js.map +0 -1
- package/dist/chunk-PLU2YVAS.js.map +0 -1
- package/dist/experimental/index.cjs +0 -3873
- 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-BEgtCLkJ.d.cts +0 -346
- package/dist/index-D9wwNTfP.d.ts +0 -346
- package/dist/video-file-stream-UXJ6TNIB.js +0 -4
package/dist/react/index.d.cts
CHANGED
|
@@ -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,
|
|
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
|
};
|
package/dist/react/index.d.ts
CHANGED
|
@@ -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,
|
|
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
|
};
|
package/dist/react/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createVideoFileStream } from '../chunk-
|
|
3
|
-
import { createSDKI18n, resolveUploadVideoSize, isMobilePublishEnvironment, resolveSessionTargetSize, DEFAULT_SESSION_TARGET_SIZE } from '../chunk-PLU2YVAS.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,
|
|
151
|
-
}, [
|
|
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:
|
|
170
|
+
onError: externalOnError
|
|
181
171
|
});
|
|
182
172
|
clientRef.current = created;
|
|
183
173
|
return created;
|
|
184
|
-
}, [config.apiKey, config.authToken, config.baseUrl, config.locale,
|
|
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
|
]);
|
package/dist/react/index.js.map
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
|
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,
|
|
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 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"video-file-stream-
|
|
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.
|
|
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": {
|