@xmaxai/sdk 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/{chunk-EGNRAZ5U.js → chunk-4YHBCQ2C.js} +3 -3
- package/dist/{chunk-EGNRAZ5U.js.map → chunk-4YHBCQ2C.js.map} +1 -1
- package/dist/{chunk-PLU2YVAS.js → chunk-LCPC56BK.js} +2 -2
- package/dist/chunk-LCPC56BK.js.map +1 -0
- package/dist/{chunk-M5QA6LWS.js → chunk-V4NR6CPP.js} +28 -9
- package/dist/chunk-V4NR6CPP.js.map +1 -0
- package/dist/{chunk-7X7QCO3O.js → chunk-VLJZ56PT.js} +25 -20
- package/dist/chunk-VLJZ56PT.js.map +1 -0
- package/dist/experimental/index.cjs +46 -22
- package/dist/experimental/index.cjs.map +1 -1
- package/dist/experimental/index.d.cts +1 -1
- package/dist/experimental/index.d.ts +1 -1
- package/dist/experimental/index.js +3 -3
- package/dist/{index-D9wwNTfP.d.ts → index-Cw8C8LbO.d.ts} +24 -3
- package/dist/{index-BEgtCLkJ.d.cts → index-Dg1ElHAj.d.cts} +24 -3
- package/dist/index.cjs +46 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -8
- package/dist/react/index.cjs +25 -6
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +3 -3
- package/dist/video-file-stream-K7GQMIJ5.js +4 -0
- package/dist/{video-file-stream-UXJ6TNIB.js.map → video-file-stream-K7GQMIJ5.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-7X7QCO3O.js.map +0 -1
- package/dist/chunk-M5QA6LWS.js.map +0 -1
- package/dist/chunk-PLU2YVAS.js.map +0 -1
- package/dist/video-file-stream-UXJ6TNIB.js +0 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { XmaxOpenClient, XMAX_OPEN_API_PRODUCTION_BASE_URL, RtcManager, ACTIVE_STATUS, createNativeCameraStream, createTracksRtcRoomEvent, createStopRtcRoomEvent, createTaskUid, createStartRtcRoomEvent, createDragTrackController, notifyError, getFitContentRect } from './chunk-
|
|
2
|
-
import { createSDKI18n, resolveUploadVideoSize, DEFAULT_SESSION_TARGET_SIZE, resolveRtcPublishFps, resolveSessionTargetSize } from './chunk-
|
|
1
|
+
import { XmaxOpenClient, XMAX_OPEN_API_PRODUCTION_BASE_URL, RtcManager, ACTIVE_STATUS, createNativeCameraStream, createTracksRtcRoomEvent, createStopRtcRoomEvent, createTaskUid, createStartRtcRoomEvent, createDragTrackController, notifyError, getFitContentRect } from './chunk-V4NR6CPP.js';
|
|
2
|
+
import { createSDKI18n, resolveUploadVideoSize, DEFAULT_SESSION_TARGET_SIZE, resolveRtcPublishFps, resolveSessionTargetSize } from './chunk-LCPC56BK.js';
|
|
3
3
|
|
|
4
4
|
// src/drag/remote-view-host.ts
|
|
5
5
|
function createRemoteViewHost(wrapper) {
|
|
@@ -182,7 +182,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
182
182
|
this.localVideoSize = null;
|
|
183
183
|
this.currentPrompt = "";
|
|
184
184
|
this.currentGenerationModel = "";
|
|
185
|
-
this.currentStaticGenerate = void 0;
|
|
186
185
|
this.disconnected = false;
|
|
187
186
|
this.remoteViewHost = null;
|
|
188
187
|
this.dragController = null;
|
|
@@ -318,7 +317,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
318
317
|
const initialState = options.initialState;
|
|
319
318
|
this.currentPrompt = resolvePromptText(initialState?.prompt);
|
|
320
319
|
this.currentGenerationModel = resolveGenerationModel(initialState?.model);
|
|
321
|
-
this.currentStaticGenerate = initialState?.staticGenerate;
|
|
322
320
|
const publishFpsOptions = {
|
|
323
321
|
mobile: options.mobile,
|
|
324
322
|
highQuality: true,
|
|
@@ -345,7 +343,8 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
345
343
|
model: this.currentGenerationModel || void 0,
|
|
346
344
|
size: options.size,
|
|
347
345
|
refImage: initialRefImageUrl,
|
|
348
|
-
staticGenerate:
|
|
346
|
+
staticGenerate: initialState?.staticGenerate,
|
|
347
|
+
staticImagePath: initialState?.staticImagePath?.trim() || void 0
|
|
349
348
|
});
|
|
350
349
|
}
|
|
351
350
|
}
|
|
@@ -424,15 +423,14 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
424
423
|
if (options?.model !== void 0) {
|
|
425
424
|
this.currentGenerationModel = resolveGenerationModel(options.model);
|
|
426
425
|
}
|
|
427
|
-
if (options?.staticGenerate !== void 0) {
|
|
428
|
-
this.currentStaticGenerate = options.staticGenerate;
|
|
429
|
-
}
|
|
430
426
|
await this.runStart({
|
|
431
427
|
prompt: this.currentPrompt || void 0,
|
|
432
428
|
model: this.currentGenerationModel || void 0,
|
|
433
429
|
size: options?.size,
|
|
434
430
|
refImage: resolvedRefImage,
|
|
435
|
-
staticGenerate:
|
|
431
|
+
staticGenerate: options?.staticGenerate === true ? true : void 0,
|
|
432
|
+
staticImagePath: options?.staticImagePath?.trim() || void 0,
|
|
433
|
+
preserveRemoteOutput: options?.preserveRemoteOutput
|
|
436
434
|
});
|
|
437
435
|
} catch (error) {
|
|
438
436
|
this.reportError(error);
|
|
@@ -523,17 +521,20 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
523
521
|
if (!this.rtc.snapshot.joined) {
|
|
524
522
|
return;
|
|
525
523
|
}
|
|
524
|
+
const preserveRemoteOutput = options.preserveRemoteOutput ?? false;
|
|
525
|
+
if (preserveRemoteOutput) {
|
|
526
|
+
this.rtc.setPreserveRemoteDom(true);
|
|
527
|
+
}
|
|
526
528
|
const startPrompt = options.prompt?.trim() ?? this.currentPrompt;
|
|
527
529
|
if (options.model !== void 0) {
|
|
528
530
|
this.currentGenerationModel = resolveGenerationModel(options.model);
|
|
529
531
|
}
|
|
530
|
-
if (options.staticGenerate !== void 0) {
|
|
531
|
-
this.currentStaticGenerate = options.staticGenerate;
|
|
532
|
-
}
|
|
533
532
|
const modelLabel = resolveGenerationModel(this.currentGenerationModel);
|
|
534
533
|
await this.rtc.ensurePublishedInputBeforeStart();
|
|
535
|
-
|
|
536
|
-
|
|
534
|
+
if (!preserveRemoteOutput) {
|
|
535
|
+
this.rtc.setRemoteVideoContainer(null);
|
|
536
|
+
this.rtc.clearRemoteVideo();
|
|
537
|
+
}
|
|
537
538
|
const size = resolveSessionTargetSize({
|
|
538
539
|
localVideoSize: this.localVideoSize,
|
|
539
540
|
overrideSize: options.size ?? this.sessionSizeOverride
|
|
@@ -554,16 +555,21 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
554
555
|
size,
|
|
555
556
|
prompt: startPrompt,
|
|
556
557
|
refImagePath: resolveRefImagePath(options.refImage),
|
|
557
|
-
|
|
558
|
+
// Never reuse prior start — caller must pass Instant fields each time.
|
|
559
|
+
staticGenerate: options.staticGenerate === true ? true : void 0,
|
|
560
|
+
staticImagePath: options.staticImagePath?.trim() || void 0
|
|
558
561
|
});
|
|
559
|
-
console.log("[Xmax SDK] \u771F\u5B9E\u53D1\u9001 start ->", startRoomEvent);
|
|
560
562
|
await this.rtc.sendRoomEvent(startRoomEvent);
|
|
561
|
-
await this.rtc.refreshRemoteVideoBinding({ force:
|
|
563
|
+
await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput });
|
|
562
564
|
this.updateDragController(true);
|
|
563
565
|
this.scheduleNotifyRemoteStream();
|
|
564
566
|
} catch (error) {
|
|
565
567
|
this.rtc.configureSessionSei(null);
|
|
566
568
|
throw error;
|
|
569
|
+
} finally {
|
|
570
|
+
if (preserveRemoteOutput) {
|
|
571
|
+
this.rtc.setPreserveRemoteDom(false);
|
|
572
|
+
}
|
|
567
573
|
}
|
|
568
574
|
}
|
|
569
575
|
isDragEnabled() {
|
|
@@ -690,7 +696,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
690
696
|
this.taskUid = null;
|
|
691
697
|
this.currentPrompt = "";
|
|
692
698
|
this.currentGenerationModel = "";
|
|
693
|
-
this.currentStaticGenerate = void 0;
|
|
694
699
|
this.sessionTargetSize = null;
|
|
695
700
|
this.dragController?.destroy();
|
|
696
701
|
this.dragController = null;
|
|
@@ -988,5 +993,5 @@ function observeDragSurfaceVideoSync(dragSurface, options) {
|
|
|
988
993
|
}
|
|
989
994
|
|
|
990
995
|
export { RealtimePrewarmHandle, RealtimeSession, createRemoteViewHost, createXmaxClient, observeDragSurfaceVideoSync, resolveRefImageUrl, syncDragSurfaceToVideo };
|
|
991
|
-
//# sourceMappingURL=chunk-
|
|
992
|
-
//# sourceMappingURL=chunk-
|
|
996
|
+
//# sourceMappingURL=chunk-VLJZ56PT.js.map
|
|
997
|
+
//# sourceMappingURL=chunk-VLJZ56PT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/drag/remote-view-host.ts","../src/shared/ref-image.ts","../src/realtime/initial-state.ts","../src/realtime/prewarm.ts","../src/realtime/session.ts","../src/realtime/create-client.ts","../src/drag/drag-video-sync.ts"],"names":["options","overlay","drawable","videoHost"],"mappings":"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","file":"chunk-VLJZ56PT.js","sourcesContent":["export type RemoteViewHost = {\n wrapper: HTMLElement\n videoHost: HTMLElement\n dragHost: HTMLElement\n}\n\nexport function createRemoteViewHost(wrapper: HTMLElement): RemoteViewHost {\n const computed = getComputedStyle(wrapper)\n if (computed.position === 'static') {\n wrapper.style.position = 'relative'\n }\n\n const videoHost = document.createElement('div')\n videoHost.dataset.XmaxRemoteVideo = 'true'\n videoHost.style.cssText =\n 'position:relative;z-index:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;'\n\n const dragHost = document.createElement('div')\n dragHost.dataset.XmaxDragSurface = 'true'\n dragHost.style.cssText =\n 'position:absolute;inset:0;z-index:20;touch-action:none;'\n\n wrapper.replaceChildren()\n wrapper.appendChild(videoHost)\n wrapper.appendChild(dragHost)\n\n return { wrapper, videoHost, dragHost }\n}\n","import type { XmaxOpenClient } from '../sdk/client'\n\nexport async function resolveRefImageUrl(\n client: XmaxOpenClient,\n input: File | string,\n): Promise<string> {\n if (input instanceof File) {\n return (await client.uploadImage(input)).url\n }\n\n const raw = input.trim()\n if (!raw) {\n return ''\n }\n\n if (/^https?:\\/\\//i.test(raw)) {\n return raw\n }\n\n const res = await fetch(raw)\n if (!res.ok) {\n throw new Error(`Failed to load ref image: ${res.status}`)\n }\n\n const blob = await res.blob()\n const mime = blob.type || 'image/png'\n const ext =\n mime === 'image/jpeg' ? 'jpg' :\n mime === 'image/webp' ? 'webp' :\n mime === 'image/gif' ? 'gif' :\n 'png'\n const file = new File([blob], `ref.${ext}`, { type: mime })\n return (await client.uploadImage(file)).url\n}\n","import type { RealtimeInitialState } from './types'\n\n/** Internal RTC start `params.model` placeholder when the host omits it. */\nexport const DEFAULT_RTC_START_MODEL = 'default'\n\nexport function resolveGenerationModel(model?: string | null): string {\n const trimmed = model?.trim()\n return trimmed || DEFAULT_RTC_START_MODEL\n}\n\nexport function resolvePromptText(prompt: RealtimeInitialState['prompt']): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nexport function resolveInitialRefImage(initialState?: RealtimeInitialState): string | undefined {\n if (!initialState) {\n return undefined\n }\n if (typeof initialState.refImage === 'string' && initialState.refImage.trim()) {\n return initialState.refImage.trim()\n }\n if (typeof initialState.image === 'string' && initialState.image.trim()) {\n return initialState.image.trim()\n }\n return undefined\n}\n\nexport function shouldAutoStartOnConnect(initialState?: RealtimeInitialState): boolean {\n return initialState?.autoStart === true\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createSDKI18n } from '../i18n'\nimport type { RealtimeModel, XmaxClientOptions } from './types'\n\nexport type PrewarmedRoomResources = {\n client: XmaxOpenClient\n rtc: RtcManager\n sessionUid: string\n}\n\n/** Holds a joined RTC room before camera input is attached — iOS enterRoom-at-launch equivalent. */\nexport class RealtimePrewarmHandle {\n readonly modelName: string\n\n private consumed = false\n private disposed = false\n\n private constructor(\n readonly client: XmaxOpenClient,\n readonly rtc: RtcManager,\n readonly sessionUid: string,\n modelName: string,\n ) {\n this.modelName = modelName\n }\n\n static async create(\n model: RealtimeModel,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimePrewarmHandle> {\n const modelName = model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n const sdkI18n = createSDKI18n({})\n const client = new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: clientOptions.onError,\n })\n\n const rtc = new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const createdSession = await client.createSession(modelName)\n const sessionUid = createdSession.sessionUid?.trim()\n if (!sessionUid) {\n throw new Error('Session uid is missing')\n }\n\n const joinInfo = client.getRtcJoinInfo(createdSession)\n await rtc.join(joinInfo)\n\n const handle = new RealtimePrewarmHandle(client, rtc, sessionUid, modelName)\n\n client.startHeartbeat(\n sessionUid,\n clientOptions.heartbeatIntervalMs ?? 10_000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void handle.cancel()\n }\n },\n () => {\n void handle.cancel()\n },\n )\n\n return handle\n }\n\n consume(expectedModelName: string): PrewarmedRoomResources | null {\n const normalized = expectedModelName.trim()\n if (this.consumed || this.disposed || !normalized || this.modelName !== normalized) {\n return null\n }\n\n this.consumed = true\n return {\n client: this.client,\n rtc: this.rtc,\n sessionUid: this.sessionUid,\n }\n }\n\n async cancel(): Promise<void> {\n if (this.consumed || this.disposed) {\n return\n }\n\n this.disposed = true\n this.client.beginTeardown()\n try {\n await this.client.closeSession(this.sessionUid)\n } catch {\n }\n try {\n await this.rtc.leave()\n } catch {\n }\n this.client.endTeardown()\n }\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { createDragTrackController, type DragTrackController } from '../drag/drag-track-controller'\nimport { createRemoteViewHost, type RemoteViewHost } from '../drag/remote-view-host'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError } from '../shared/error-utils'\nimport { resolveRefImageUrl } from '../shared/ref-image'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport {\n resolveInitialRefImage,\n resolveGenerationModel,\n resolvePromptText,\n shouldAutoStartOnConnect,\n} from './initial-state'\nimport { shouldMirrorInput } from './mirror'\nimport { resolveRtcPublishFps } from '../rtc/publish-fps'\nimport { RealtimePrewarmHandle, type PrewarmedRoomResources } from './prewarm'\nimport type {\n RealtimeConnectOptions,\n RealtimeDisconnectOptions,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nfunction resolvePromptInput(prompt?: string | RealtimePromptState): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nfunction resolveRefImagePath(refImage?: string | null): string | undefined {\n const trimmed = refImage?.trim()\n return trimmed || undefined\n}\n\nfunction getVideoTrack(stream: MediaStream): MediaStreamTrack {\n const track = stream.getVideoTracks()[0]\n if (!track) {\n throw new Error('Missing video track in MediaStream')\n }\n return track\n}\n\nfunction readVideoSize(track: MediaStreamTrack): { width: number; height: number } | null {\n const settings = track.getSettings?.()\n if (typeof settings?.width === 'number' && settings.width > 0 &&\n typeof settings?.height === 'number' && settings.height > 0) {\n return { width: settings.width, height: settings.height }\n }\n return null\n}\n\nexport class RealtimeSession implements XmaxRealtimeSession {\n private readonly client: XmaxOpenClient\n private readonly rtc: RtcManager\n private readonly reportError: (error: unknown, fallbackMessage?: string) => never\n private readonly remoteElement: HTMLElement | null\n private readonly onRemoteStream?: (stream: MediaStream) => void\n private readonly onPublishPipelineWaitChange?: (waiting: boolean) => void\n\n private sessionUid: string | null = null\n private taskUid: string | null = null\n private localVideoSize: { width: number; height: number } | null = null\n private currentPrompt = ''\n private currentGenerationModel = ''\n private disconnected = false\n private remoteViewHost: RemoteViewHost | null = null\n private dragController: DragTrackController | null = null\n private dragTrackFitMode: 'contain' | 'cover' = 'cover'\n private sessionTargetSize: [number, number] | null = null\n private sessionSizeOverride: [number, number] | undefined\n private mirroredInputStream: NativeCameraStream | null = null\n private hiddenRemoteElement: HTMLElement | null = null\n private remoteStreamNotifyTimer: ReturnType<typeof setInterval> | null = null\n private lastNotifiedRemoteStream: MediaStream | null = null\n private dragOption: boolean | undefined = undefined\n\n constructor(\n client: XmaxOpenClient,\n rtc: RtcManager,\n reportError: (error: unknown, fallbackMessage?: string) => never,\n options: Pick<RealtimeConnectOptions, 'remoteElement' | 'onRemoteStream' | 'drag'>,\n clientOptions?: Pick<XmaxClientOptions, 'onPublishPipelineWaitChange'>,\n ) {\n this.client = client\n this.rtc = rtc\n this.reportError = reportError\n this.onRemoteStream = options.onRemoteStream\n this.onPublishPipelineWaitChange = clientOptions?.onPublishPipelineWaitChange\n\n if (options.remoteElement) {\n this.remoteElement = options.remoteElement\n if (options.drag !== false) {\n this.remoteViewHost = createRemoteViewHost(this.remoteElement)\n }\n return\n }\n\n if (options.onRemoteStream) {\n const hidden = document.createElement('div')\n hidden.setAttribute('data-Xmax-remote-host', 'true')\n hidden.style.cssText =\n 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden'\n document.body.appendChild(hidden)\n this.hiddenRemoteElement = hidden\n this.remoteElement = hidden\n this.remoteViewHost = createRemoteViewHost(hidden)\n this.rtc.setOnRemotePlayerMounted(() => {\n this.scheduleNotifyRemoteStream()\n })\n return\n }\n\n this.remoteElement = null\n }\n\n private get remoteVideoContainer(): HTMLElement | null {\n return this.remoteViewHost?.videoHost ?? this.remoteElement\n }\n\n static async connect(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimeSession> {\n const sdkI18n = createSDKI18n({})\n const notifyUserError = clientOptions.onError\n const reportError = (error: unknown, fallbackMessage?: string): never => {\n throw notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }\n\n const modelName = options.model.name.trim()\n const prewarmed = options.prewarmed instanceof RealtimePrewarmHandle\n ? options.prewarmed.consume(modelName)\n : null\n\n const client = prewarmed?.client ?? new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: notifyUserError,\n })\n\n const rtc = prewarmed?.rtc ?? new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const session = new RealtimeSession(client, rtc, reportError, options, clientOptions)\n\n try {\n await session.bootstrap(stream, options, clientOptions.heartbeatIntervalMs ?? 10_000, prewarmed)\n return session\n } catch (error) {\n await session.safeDisconnect()\n throw reportError(error)\n }\n }\n\n private async bootstrap(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n heartbeatIntervalMs: number,\n prewarmed: PrewarmedRoomResources | null = null,\n ): Promise<void> {\n this.dragOption = options.drag\n\n const modelName = options.model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n if (prewarmed) {\n this.sessionUid = prewarmed.sessionUid\n } else {\n const createdSession = await this.client.createSession(modelName)\n if (!createdSession.sessionUid?.trim()) {\n throw new Error('Session uid is missing')\n }\n\n this.sessionUid = createdSession.sessionUid\n this.client.startHeartbeat(\n createdSession.sessionUid,\n heartbeatIntervalMs,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void this.safeDisconnect()\n }\n },\n () => {\n void this.safeDisconnect()\n },\n )\n\n const joinInfo = this.client.getRtcJoinInfo(createdSession)\n await this.rtc.join(joinInfo)\n }\n\n if (options.localElement) {\n this.rtc.setLocalVideoContainer(options.localElement)\n }\n\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n this.sessionSizeOverride = options.size\n\n const videoTrack = getVideoTrack(stream)\n const isFileInput = options.inputKind === 'file'\n this.dragTrackFitMode = isFileInput ? 'contain' : 'cover'\n const rawVideoSize = readVideoSize(videoTrack)\n const publishSize: [number, number] = options.size\n ?? (rawVideoSize\n ? resolveUploadVideoSize(rawVideoSize.width, rawVideoSize.height)\n : DEFAULT_SESSION_TARGET_SIZE)\n\n let publishTrack = videoTrack\n if (isFileInput) {\n if (options.size) {\n this.localVideoSize = { width: options.size[0], height: options.size[1] }\n } else if (rawVideoSize) {\n this.localVideoSize = { width: rawVideoSize.width, height: rawVideoSize.height }\n } else {\n this.localVideoSize = null\n }\n } else if (options.prebuiltCameraStream) {\n this.mirroredInputStream = options.prebuiltCameraStream\n publishTrack = options.prebuiltCameraStream.videoTrack\n this.localVideoSize = {\n width: options.prebuiltCameraStream.width,\n height: options.prebuiltCameraStream.height,\n }\n } else {\n const processedStream = await createNativeCameraStream(stream)\n this.mirroredInputStream = processedStream\n publishTrack = processedStream.videoTrack\n this.localVideoSize = { width: processedStream.width, height: processedStream.height }\n }\n\n const initialState = options.initialState\n this.currentPrompt = resolvePromptText(initialState?.prompt)\n this.currentGenerationModel = resolveGenerationModel(initialState?.model)\n\n const publishFpsOptions = {\n mobile: options.mobile,\n highQuality: true as const,\n fps: isFileInput\n ? options.model.fps\n : resolveRtcPublishFps({ mobile: options.mobile }),\n }\n\n // Publish before ref upload so RTC outbound warms while ref image uploads.\n await this.rtc.startExternalVideoPublishing(publishTrack, publishSize, publishFpsOptions)\n\n let initialRefImageUrl: string | undefined\n const initialRefImage = resolveInitialRefImage(initialState)\n if (initialRefImage) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialRefImage)\n } else if (initialState?.image instanceof File) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialState.image)\n } else if (initialState?.image instanceof Blob) {\n const mime = initialState.image.type || 'image/png'\n const file = new File([initialState.image], 'ref-image', { type: mime })\n initialRefImageUrl = await resolveRefImageUrl(this.client, file)\n }\n\n if (options.localElement) {\n queueMicrotask(() => this.refreshLocalPreview())\n }\n\n if (shouldAutoStartOnConnect(initialState)) {\n // static_* are never cached — only included when Instant passes them on this start.\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options.size,\n refImage: initialRefImageUrl,\n staticGenerate: initialState?.staticGenerate,\n staticImagePath: initialState?.staticImagePath?.trim() || undefined,\n })\n }\n }\n\n async setPrompt(\n prompt: string | RealtimePromptState,\n _options?: { enhance?: boolean },\n ): Promise<void> {\n try {\n const promptText = resolvePromptInput(prompt)\n this.currentPrompt = promptText\n if (!this.taskUid) {\n await this.runStart({\n prompt: promptText || undefined,\n })\n return\n }\n await this.restart({ prompt: promptText })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async set(input: RealtimeSetInput): Promise<void> {\n try {\n let refImage: string | undefined\n if (input.image === null) {\n refImage = undefined\n } else if (input.image !== undefined) {\n refImage = await this.setRefImage(input.image as File | string)\n }\n\n const prompt = input.prompt !== undefined ? resolvePromptInput(input.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setImage(\n image: string | File | Blob,\n options?: RealtimeSetImageOptions,\n ): Promise<void> {\n try {\n const refImage = await this.setRefImage(image as File | string)\n const prompt = options?.prompt ? resolvePromptInput(options.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setRefImage(input: File | string): Promise<string> {\n try {\n const resolved = await resolveRefImageUrl(this.client, input)\n return resolved\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async restart(options?: RealtimeRestartOptions): Promise<void> {\n try {\n let resolvedRefImage: string | undefined\n if (options && 'refImage' in options) {\n const ref = options.refImage\n if (ref === null || ref === '') {\n resolvedRefImage = undefined\n } else if (typeof ref === 'string' && ref.trim()) {\n resolvedRefImage = await this.setRefImage(ref.trim())\n }\n }\n\n if (options?.prompt !== undefined) {\n this.currentPrompt = options.prompt.trim()\n }\n if (options?.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n // static_* are never cached — only sent when the caller passes them (Instant only).\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options?.size,\n refImage: resolvedRefImage,\n staticGenerate: options?.staticGenerate === true ? true : undefined,\n staticImagePath: options?.staticImagePath?.trim() || undefined,\n preserveRemoteOutput: options?.preserveRemoteOutput,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setMode(options?: RealtimeRestartOptions): Promise<void> {\n return this.restart(options)\n }\n\n async refreshRemoteOutput(options?: { force?: boolean }): Promise<void> {\n if (!this.remoteVideoContainer) {\n return\n }\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n await this.rtc.refreshRemoteVideoBinding(options)\n this.scheduleNotifyRemoteStream()\n }\n\n refreshLocalPreview(): void {\n this.rtc.refreshLocalVideoPreview()\n }\n\n getInputPreviewStream(): MediaStream | null {\n return this.mirroredInputStream?.previewStream ?? null\n }\n\n detachRemoteOutput(): void {\n this.rtc.setRemoteVideoContainer(null)\n }\n\n async sendTracks(tracks: Array<[number, number]>): Promise<void> {\n if (!this.rtc.snapshot.joined || !this.taskUid) {\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createTracksRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: this.taskUid,\n sessionUid: this.taskUid,\n tracks,\n }),\n )\n } catch {\n // Track sending is best-effort for live interaction.\n }\n }\n\n async stop(options?: { preserveRemoteDom?: boolean }): Promise<void> {\n this.updateDragController(false)\n\n const preserveRemoteDom = options?.preserveRemoteDom ?? false\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n if (!this.rtc.snapshot.joined) {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createStopRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n sessionUid: this.taskUid ?? undefined,\n }),\n )\n } finally {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n async disconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n if (this.disconnected) {\n return\n }\n this.disconnected = true\n await this.safeDisconnect(options)\n }\n\n getSessionUid(): string | null {\n return this.sessionUid\n }\n\n private async runStart(options: {\n prompt?: string\n model?: string\n size?: [number, number]\n refImage?: string\n staticGenerate?: boolean\n staticImagePath?: string\n preserveRemoteOutput?: boolean\n }): Promise<void> {\n if (!this.rtc.snapshot.joined) {\n return\n }\n\n const preserveRemoteOutput = options.preserveRemoteOutput ?? false\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n const startPrompt = options.prompt?.trim() ?? this.currentPrompt\n if (options.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n const modelLabel = resolveGenerationModel(this.currentGenerationModel)\n\n await this.rtc.ensurePublishedInputBeforeStart()\n\n if (!preserveRemoteOutput) {\n this.rtc.setRemoteVideoContainer(null)\n this.rtc.clearRemoteVideo()\n }\n\n const size = resolveSessionTargetSize({\n localVideoSize: this.localVideoSize,\n overrideSize: options.size ?? this.sessionSizeOverride,\n })\n this.sessionTargetSize = size\n\n const taskUid = createTaskUid()\n this.taskUid = taskUid\n\n this.rtc.configureSessionSei(taskUid)\n\n try {\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n const startRoomEvent = createStartRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n uid: taskUid,\n sessionUid: taskUid,\n model: modelLabel,\n size,\n prompt: startPrompt,\n refImagePath: resolveRefImagePath(options.refImage),\n // Never reuse prior start — caller must pass Instant fields each time.\n staticGenerate: options.staticGenerate === true ? true : undefined,\n staticImagePath: options.staticImagePath?.trim() || undefined,\n })\n\n\n await this.rtc.sendRoomEvent(startRoomEvent)\n\n await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput })\n this.updateDragController(true)\n this.scheduleNotifyRemoteStream()\n } catch (error) {\n this.rtc.configureSessionSei(null)\n throw error\n } finally {\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n private isDragEnabled(): boolean {\n if (this.dragOption === false) {\n return false\n }\n if (this.dragOption === true) {\n return true\n }\n return Boolean(this.remoteElement && !this.hiddenRemoteElement)\n }\n\n private updateDragController(active: boolean): void {\n const dragHost = this.remoteViewHost?.dragHost\n if (!dragHost || !active || !this.taskUid || !this.isDragEnabled()) {\n this.dragController?.setEnabled(false)\n return\n }\n\n const targetSize = this.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\n if (!this.dragController) {\n this.dragController = createDragTrackController(dragHost, {\n targetSize,\n fitMode: this.dragTrackFitMode,\n mirrored: false,\n enabled: true,\n onTracks: (tracks) => {\n const media = this.remoteViewHost?.videoHost?.querySelector('video, canvas') as HTMLElement | null\n const mediaRect = media?.getBoundingClientRect()\n const dragRect = dragHost.getBoundingClientRect()\n console.log('[Xmax] sendTracks', {\n taskUid: this.taskUid,\n targetSize: this.sessionTargetSize,\n fitMode: this.dragTrackFitMode,\n tracks,\n dragRect: dragRect ? { w: dragRect.width, h: dragRect.height } : null,\n mediaRect: mediaRect ? { w: mediaRect.width, h: mediaRect.height, l: mediaRect.left, t: mediaRect.top } : null,\n })\n void this.sendTracks(tracks)\n },\n })\n return\n }\n\n this.dragController.setTargetSize(targetSize)\n this.dragController.setFitMode(this.dragTrackFitMode)\n this.dragController.setMirrored(false)\n this.dragController.setEnabled(true)\n }\n\n private scheduleNotifyRemoteStream(): void {\n if (!this.onRemoteStream) {\n return\n }\n\n this.clearRemoteStreamNotifyTimer()\n if (this.notifyRemoteStreamOnce()) {\n return\n }\n\n let attempts = 0\n this.remoteStreamNotifyTimer = setInterval(() => {\n attempts += 1\n if (this.notifyRemoteStreamOnce() || attempts >= 60) {\n this.clearRemoteStreamNotifyTimer()\n }\n }, 500)\n }\n\n private notifyRemoteStreamOnce(): boolean {\n const videoRoot = this.remoteVideoContainer\n if (!this.onRemoteStream || !videoRoot) {\n return false\n }\n\n const video = videoRoot instanceof HTMLVideoElement\n ? videoRoot\n : videoRoot.querySelector('video')\n\n if (!(video instanceof HTMLVideoElement) || !(video.srcObject instanceof MediaStream)) {\n return false\n }\n\n if (this.lastNotifiedRemoteStream === video.srcObject) {\n return true\n }\n\n this.lastNotifiedRemoteStream = video.srcObject\n this.onRemoteStream(video.srcObject)\n return true\n }\n\n private clearRemoteStreamNotifyTimer(): void {\n if (this.remoteStreamNotifyTimer !== null) {\n clearInterval(this.remoteStreamNotifyTimer)\n this.remoteStreamNotifyTimer = null\n }\n }\n\n private async safeDisconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n this.clearRemoteStreamNotifyTimer()\n this.lastNotifiedRemoteStream = null\n const activeSessionUid = this.sessionUid\n this.sessionUid = null\n\n this.client.beginTeardown()\n\n if (activeSessionUid) {\n try {\n await this.client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n const generationActive = !!this.taskUid && this.rtc.snapshot.joined\n try {\n if (generationActive) {\n await this.stop()\n } else {\n this.updateDragController(false)\n this.rtc.clearRemoteVideo()\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.stopVideoPublishing()\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.leave()\n }\n } catch {\n }\n\n this.client.endTeardown()\n\n this.taskUid = null\n this.currentPrompt = ''\n this.currentGenerationModel = ''\n this.sessionTargetSize = null\n this.dragController?.destroy()\n this.dragController = null\n this.mirroredInputStream?.destroy()\n this.mirroredInputStream = null\n\n if (this.hiddenRemoteElement) {\n this.hiddenRemoteElement.remove()\n this.hiddenRemoteElement = null\n }\n }\n}\n","import { XMAX_OPEN_API_PRODUCTION_BASE_URL, XmaxOpenClient } from '../sdk/client'\nimport { RealtimeSession } from './session'\nimport { RealtimePrewarmHandle } from './prewarm'\nimport type { RealtimeConnectOptions, XmaxClient, XmaxClientOptions } from './types'\n\nfunction resolveClientOptions(options: XmaxClientOptions): Required<Pick<XmaxClientOptions, 'baseUrl'>> & XmaxClientOptions {\n return {\n ...options,\n baseUrl: options.baseUrl?.trim() || XMAX_OPEN_API_PRODUCTION_BASE_URL,\n }\n}\n\nexport function createXmaxClient(options: XmaxClientOptions): XmaxClient {\n const resolved = resolveClientOptions(options)\n const httpClient = new XmaxOpenClient({\n apiKey: resolved.apiKey,\n authToken: resolved.authToken,\n baseUrl: resolved.baseUrl,\n onError: resolved.onError,\n })\n\n return {\n files: {\n uploadImage: (file: File) => httpClient.uploadImage(file),\n uploadVideo: (file: File) => httpClient.uploadVideo(file),\n upload: (file: File) => httpClient.uploadImage(file),\n },\n realtime: {\n prewarm: (options: { model: RealtimeConnectOptions['model'] }) =>\n RealtimePrewarmHandle.create(options.model, resolved),\n connect: (stream: MediaStream, connectOptions: RealtimeConnectOptions) =>\n RealtimeSession.connect(stream, connectOptions, resolved),\n },\n }\n}\n\nexport type {\n RealtimeConnectOptions,\n RealtimeInitialState,\n RealtimeModel,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n RealtimeSetModeOptions,\n SeiGateState,\n XmaxClient,\n XmaxClientFiles,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nexport { models } from './models'\nexport { RealtimeSession } from './session'\nexport { RealtimePrewarmHandle } from './prewarm'\n","import { getFitContentRect, type ContentRect } from './map-viewport'\nimport type { RemoteViewHost } from './remote-view-host'\n\nexport const DRAG_SYNCED_ATTR = 'data-xmax-drag-synced'\n\nexport type DragVideoSyncOptions = {\n getTargetSize: () => [number, number]\n getFitMode: () => 'contain' | 'cover'\n onSync?: () => void\n}\n\nexport type RemoteDragLayout = {\n /** Drawable overlay aligned to the painted RTC media on screen. */\n overlay: ContentRect\n /** Pointer → session coordinate mapping bounds. */\n mapping: ContentRect\n /** Hit-test bounds inside the preview frame. */\n hitRect: ContentRect\n source: 'media' | 'intrinsic' | 'fit'\n}\n\nfunction toContentRect(rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>): ContentRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n}\n\nexport function isMediaInsetInContainer(\n mediaRect: Pick<DOMRect, 'width' | 'height'>,\n containerRect: Pick<DOMRect, 'width' | 'height'>,\n): boolean {\n if (!mediaRect.width || !mediaRect.height || !containerRect.width || !containerRect.height) {\n return false\n }\n const widthRatio = mediaRect.width / containerRect.width\n const heightRatio = mediaRect.height / containerRect.height\n return widthRatio < 0.98 || heightRatio < 0.98\n}\n\nexport function intersectContentRects(a: ContentRect, b: ContentRect): ContentRect {\n const left = Math.max(a.left, b.left)\n const top = Math.max(a.top, b.top)\n const right = Math.min(a.left + a.width, b.left + b.width)\n const bottom = Math.min(a.top + a.height, b.top + b.height)\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n }\n}\n\nexport function readMediaIntrinsicSize(\n media: HTMLVideoElement | HTMLCanvasElement,\n): [number, number] | null {\n const video = media as HTMLVideoElement\n if ('videoWidth' in video && video.videoWidth > 0 && video.videoHeight > 0) {\n return [video.videoWidth, video.videoHeight]\n }\n\n if (media.width > 0 && media.height > 0) {\n return [media.width, media.height]\n }\n return null\n}\n\nexport function resolveMediaObjectFit(\n media: HTMLElement,\n fallback: 'contain' | 'cover',\n): 'contain' | 'cover' | 'fill' {\n if (typeof getComputedStyle !== 'function') {\n return fallback\n }\n\n const fit = getComputedStyle(media).objectFit\n if (fit === 'contain' || fit === 'cover' || fit === 'fill') {\n return fit\n }\n return fallback\n}\n\nexport function resolveRemoteDragLayout(input: {\n wrapperRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n mediaRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n media: HTMLVideoElement | HTMLCanvasElement | null\n targetSize: [number, number]\n fitMode: 'contain' | 'cover'\n}): RemoteDragLayout | null {\n const { wrapperRect, mediaRect, media, targetSize, fitMode } = input\n if (!wrapperRect.width || !wrapperRect.height || !mediaRect.width || !mediaRect.height) {\n return null\n }\n\n const wrapper = toContentRect(wrapperRect)\n\n // Upload / RTC FIT: map linearly across the media layout box (h-full w-auto). Hit-test only\n // the visible portion inside the preview frame (wide images overflow horizontally).\n if (fitMode === 'contain') {\n const overlay = toContentRect(mediaRect)\n const hitRect = intersectContentRects(overlay, wrapper)\n const drawable = hitRect.width > 0 && hitRect.height > 0 ? hitRect : wrapper\n return { overlay: drawable, mapping: overlay, hitRect: drawable, source: 'media' }\n }\n\n if (isMediaInsetInContainer(mediaRect, wrapperRect)) {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: overlay, source: 'media' }\n }\n\n const intrinsic = media ? readMediaIntrinsicSize(media) : null\n const frameSize = intrinsic ?? targetSize\n const objectFit = media ? resolveMediaObjectFit(media, fitMode) : fitMode\n\n if (objectFit === 'fill') {\n const overlay = toContentRect(mediaRect)\n return { overlay, mapping: overlay, hitRect: wrapper, source: 'intrinsic' }\n }\n\n const mapping = getFitContentRect(mediaRect, frameSize, objectFit)\n const overlay = intersectContentRects(mapping, wrapper)\n const drawable = overlay.width > 0 && overlay.height > 0 ? overlay : wrapper\n return {\n overlay: drawable,\n mapping,\n hitRect: wrapper,\n source: intrinsic ? 'intrinsic' : 'fit',\n }\n}\n\nfunction resetDragHostFullBleed(dragHost: HTMLElement): void {\n dragHost.style.inset = '0'\n dragHost.style.left = ''\n dragHost.style.top = ''\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.style.width = ''\n dragHost.style.height = ''\n dragHost.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\n/** Align drag overlay to the painted RTC media region on screen. */\nexport function syncDragHostToVideo(\n host: RemoteViewHost,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const { wrapper, videoHost, dragHost } = host\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const mediaRect = media.getBoundingClientRect()\n const layout = resolveRemoteDragLayout({\n wrapperRect,\n mediaRect,\n media,\n targetSize,\n fitMode,\n })\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragHostFullBleed(dragHost)\n return false\n }\n\n const { overlay } = layout\n dragHost.style.inset = 'auto'\n dragHost.style.left = `${overlay.left - wrapperRect.left}px`\n dragHost.style.top = `${overlay.top - wrapperRect.top}px`\n dragHost.style.width = `${overlay.width}px`\n dragHost.style.height = `${overlay.height}px`\n dragHost.style.right = ''\n dragHost.style.bottom = ''\n dragHost.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\nfunction resetDragSurfaceFullBleed(dragSurface: HTMLElement): void {\n dragSurface.style.inset = '0'\n dragSurface.style.left = ''\n dragSurface.style.top = ''\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.style.width = ''\n dragSurface.style.height = ''\n dragSurface.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\nfunction applyDragSurfaceOverlayStyles(\n dragSurface: HTMLElement,\n overlay: ContentRect,\n wrapperRect: Pick<DOMRect, 'left' | 'top'>,\n): boolean {\n const nextLeft = `${overlay.left - wrapperRect.left}px`\n const nextTop = `${overlay.top - wrapperRect.top}px`\n const nextWidth = `${overlay.width}px`\n const nextHeight = `${overlay.height}px`\n\n if (\n dragSurface.hasAttribute(DRAG_SYNCED_ATTR)\n && dragSurface.style.inset === 'auto'\n && dragSurface.style.left === nextLeft\n && dragSurface.style.top === nextTop\n && dragSurface.style.width === nextWidth\n && dragSurface.style.height === nextHeight\n ) {\n return false\n }\n\n dragSurface.style.inset = 'auto'\n dragSurface.style.left = nextLeft\n dragSurface.style.top = nextTop\n dragSurface.style.width = nextWidth\n dragSurface.style.height = nextHeight\n dragSurface.style.right = ''\n dragSurface.style.bottom = ''\n dragSurface.setAttribute(DRAG_SYNCED_ATTR, '')\n return true\n}\n\n/** Align app-layer drag overlay to the painted RTC media region (xmax-open-sdk track surface). */\nexport function syncDragSurfaceToVideo(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): boolean {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const layout = resolveRemoteDragLayoutFromSurface(dragSurface, targetSize, fitMode)\n if (!layout || !layout.overlay.width || !layout.overlay.height) {\n resetDragSurfaceFullBleed(dragSurface)\n return false\n }\n\n const wrapperRect = wrapper.getBoundingClientRect()\n const { overlay } = layout\n return applyDragSurfaceOverlayStyles(dragSurface, overlay, wrapperRect)\n}\n\nexport function resolveRemoteDragLayoutFromSurface(\n dragSurface: HTMLElement,\n targetSize: [number, number],\n fitMode: 'contain' | 'cover',\n): RemoteDragLayout | null {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return null\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]') as HTMLElement | null\n if (!videoHost) {\n return null\n }\n\n const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n if (!media) {\n return null\n }\n\n return resolveRemoteDragLayout({\n wrapperRect: wrapper.getBoundingClientRect(),\n mediaRect: media.getBoundingClientRect(),\n media,\n targetSize,\n fitMode,\n })\n}\n\nexport function observeDragHostVideoSync(\n host: RemoteViewHost,\n options: DragVideoSyncOptions,\n): () => void {\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n\n const bindMediaListeners = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (!media || mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => apply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n syncDragHostToVideo(host, options.getTargetSize(), options.getFitMode())\n options.onSync?.()\n bindMediaListeners()\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => apply())\n : null\n resizeObserver?.observe(host.wrapper)\n resizeObserver?.observe(host.videoHost)\n\n const observeMedia = () => {\n const media = host.videoHost.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n }\n }\n observeMedia()\n\n const mutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n apply()\n })\n : null\n mutationObserver?.observe(host.videoHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n\n const onWindowChange = () => apply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragHostFullBleed(host.dragHost)\n }\n}\n\n/** Keep an app-layer drag surface aligned with remote output video layout. */\nexport function observeDragSurfaceVideoSync(\n dragSurface: HTMLElement,\n options: DragVideoSyncOptions,\n): () => void {\n const wrapper = dragSurface.parentElement\n if (!wrapper) {\n return () => {}\n }\n\n const mediaListeners = new Map<EventTarget, Array<() => void>>()\n let rafId: number | null = null\n let observedVideoHost: Element | null = null\n\n const bindMediaListeners = (media: EventTarget) => {\n if (mediaListeners.has(media)) {\n return\n }\n\n const rerender = () => scheduleApply()\n const bindings: Array<() => void> = []\n const add = (type: string) => {\n media.addEventListener(type, rerender)\n bindings.push(() => media.removeEventListener(type, rerender))\n }\n\n add('loadedmetadata')\n add('loadeddata')\n add('resize')\n mediaListeners.set(media, bindings)\n }\n\n const apply = () => {\n const changed = syncDragSurfaceToVideo(dragSurface, options.getTargetSize(), options.getFitMode())\n if (changed) {\n options.onSync?.()\n }\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n const media = videoHost?.querySelector('video, canvas')\n if (media) {\n bindMediaListeners(media)\n }\n }\n\n const scheduleApply = () => {\n if (rafId !== null) {\n return\n }\n rafId = requestAnimationFrame(() => {\n rafId = null\n apply()\n })\n }\n\n const bindVideoHostObserver = (videoHostObserver: MutationObserver | null) => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n if (!host || host === observedVideoHost || !videoHostObserver) {\n return\n }\n\n videoHostObserver.disconnect()\n observedVideoHost = host\n videoHostObserver.observe(host, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'width', 'height'],\n })\n }\n\n apply()\n\n const resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => scheduleApply())\n : null\n resizeObserver?.observe(wrapper)\n\n const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n if (videoHost) {\n resizeObserver?.observe(videoHost)\n }\n\n const observeMedia = () => {\n const host = wrapper.querySelector('[data-xmax-remote-video]')\n const media = host?.querySelector('video, canvas')\n if (media) {\n resizeObserver?.observe(media)\n bindMediaListeners(media)\n }\n }\n observeMedia()\n\n const videoHostMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n observeMedia()\n scheduleApply()\n })\n : null\n bindVideoHostObserver(videoHostMutationObserver)\n\n // Child-list only on wrapper — never watch dragSurface style (would loop with sync).\n const wrapperMutationObserver = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n bindVideoHostObserver(videoHostMutationObserver)\n observeMedia()\n scheduleApply()\n })\n : null\n wrapperMutationObserver?.observe(wrapper, {\n childList: true,\n subtree: true,\n })\n\n const onWindowChange = () => scheduleApply()\n window.addEventListener('resize', onWindowChange)\n window.addEventListener('scroll', onWindowChange, true)\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n resizeObserver?.disconnect()\n wrapperMutationObserver?.disconnect()\n videoHostMutationObserver?.disconnect()\n for (const unbind of Array.from(mediaListeners.values())) {\n unbind.forEach((dispose) => dispose())\n }\n mediaListeners.clear()\n window.removeEventListener('resize', onWindowChange)\n window.removeEventListener('scroll', onWindowChange, true)\n resetDragSurfaceFullBleed(dragSurface)\n }\n}\n"]}
|
|
@@ -547,7 +547,8 @@ var XmaxOpenClient = class {
|
|
|
547
547
|
return p.data;
|
|
548
548
|
}
|
|
549
549
|
const mappedMessage = resolveApiErrorMessage(p.code, this.i18n.locale);
|
|
550
|
-
const
|
|
550
|
+
const backendMessage = typeof p.message === "string" && p.message.trim() ? p.message.trim() : void 0;
|
|
551
|
+
const errorMessage = mappedMessage ?? backendMessage ?? this.i18n.t("errors.requestRetry");
|
|
551
552
|
throw new Error(errorMessage);
|
|
552
553
|
} catch (error) {
|
|
553
554
|
if (this.isAbortError(error)) {
|
|
@@ -699,6 +700,7 @@ function createStartRtcRoomEvent(input) {
|
|
|
699
700
|
const resolvedPrompt = input.prompt?.trim() ?? "";
|
|
700
701
|
const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || void 0;
|
|
701
702
|
const useRefImage = !!refImagePath;
|
|
703
|
+
const staticImagePath = input.staticImagePath?.trim() || void 0;
|
|
702
704
|
return {
|
|
703
705
|
event: "start",
|
|
704
706
|
user_id: input.userId?.trim() || void 0,
|
|
@@ -710,7 +712,9 @@ function createStartRtcRoomEvent(input) {
|
|
|
710
712
|
prompt: resolvedPrompt,
|
|
711
713
|
ref_image_path: useRefImage ? refImagePath : void 0,
|
|
712
714
|
ref_image: useRefImage ? refImagePath : void 0,
|
|
713
|
-
|
|
715
|
+
// Instant-only — omit when false/undefined so non-instant starts never carry leftover flags.
|
|
716
|
+
static_generate: input.staticGenerate === true ? true : void 0,
|
|
717
|
+
static_image_path: staticImagePath,
|
|
714
718
|
...input.extraParams ?? {}
|
|
715
719
|
}
|
|
716
720
|
};
|
|
@@ -1035,7 +1039,7 @@ var _RtcManager = class _RtcManager {
|
|
|
1035
1039
|
this.lastRemoteSei = null;
|
|
1036
1040
|
this.lastRemoteSeiUserId = null;
|
|
1037
1041
|
this.hasLoggedSeiSendFailure = false;
|
|
1038
|
-
if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId) {
|
|
1042
|
+
if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId && !this.preserveRemoteDom) {
|
|
1039
1043
|
this.pendingRemoteVideoUserId = this.remoteVideoUserId;
|
|
1040
1044
|
this.remoteVideoUserId = null;
|
|
1041
1045
|
}
|
|
@@ -2538,6 +2542,7 @@ function drawNeon(ctx, segs, container, targetSize, dpr, fitMode, mirrored) {
|
|
|
2538
2542
|
}
|
|
2539
2543
|
var DragTrackController = class {
|
|
2540
2544
|
constructor(container, options) {
|
|
2545
|
+
this.strokeActive = false;
|
|
2541
2546
|
this.activePointers = /* @__PURE__ */ new Map();
|
|
2542
2547
|
this.lastTargetPoints = /* @__PURE__ */ new Map();
|
|
2543
2548
|
this.segQueue = [];
|
|
@@ -2547,6 +2552,8 @@ var DragTrackController = class {
|
|
|
2547
2552
|
this.resizeObserver = null;
|
|
2548
2553
|
this.container = container;
|
|
2549
2554
|
this.onTracks = options.onTracks;
|
|
2555
|
+
this.onStrokeStart = options.onStrokeStart;
|
|
2556
|
+
this.onStrokeEnd = options.onStrokeEnd;
|
|
2550
2557
|
this.targetSize = options.targetSize;
|
|
2551
2558
|
this.fitMode = options.fitMode ?? "cover";
|
|
2552
2559
|
this.mirrored = options.mirrored ?? false;
|
|
@@ -2717,11 +2724,17 @@ var DragTrackController = class {
|
|
|
2717
2724
|
this.flushTracks();
|
|
2718
2725
|
}, 30);
|
|
2719
2726
|
}
|
|
2720
|
-
finishStroke() {
|
|
2727
|
+
finishStroke(emitEnd = false) {
|
|
2728
|
+
const wasActive = this.strokeActive;
|
|
2729
|
+
this.strokeActive = false;
|
|
2721
2730
|
this.stopSampling();
|
|
2722
2731
|
this.stopDrawLoop();
|
|
2723
2732
|
this.segQueue.length = 0;
|
|
2724
2733
|
this.clearCanvas();
|
|
2734
|
+
if (emitEnd && wasActive && this.onStrokeEnd) {
|
|
2735
|
+
Promise.resolve(this.onStrokeEnd()).catch(() => {
|
|
2736
|
+
});
|
|
2737
|
+
}
|
|
2725
2738
|
}
|
|
2726
2739
|
handlePointerDown(e) {
|
|
2727
2740
|
if (!this.enabled) {
|
|
@@ -2745,6 +2758,12 @@ var DragTrackController = class {
|
|
|
2745
2758
|
if (targetPoint) {
|
|
2746
2759
|
this.lastTargetPoints.set(e.pointerId, targetPoint);
|
|
2747
2760
|
}
|
|
2761
|
+
const strokeWasActive = this.strokeActive;
|
|
2762
|
+
this.strokeActive = true;
|
|
2763
|
+
if (!strokeWasActive && this.onStrokeStart) {
|
|
2764
|
+
Promise.resolve(this.onStrokeStart()).catch(() => {
|
|
2765
|
+
});
|
|
2766
|
+
}
|
|
2748
2767
|
this.startDrawLoop();
|
|
2749
2768
|
this.startSampling();
|
|
2750
2769
|
}
|
|
@@ -2777,7 +2796,7 @@ var DragTrackController = class {
|
|
|
2777
2796
|
} catch {
|
|
2778
2797
|
}
|
|
2779
2798
|
if (this.activePointers.size === 0) {
|
|
2780
|
-
this.finishStroke();
|
|
2799
|
+
this.finishStroke(true);
|
|
2781
2800
|
}
|
|
2782
2801
|
}
|
|
2783
2802
|
handlePointerCancel(e) {
|
|
@@ -2787,7 +2806,7 @@ var DragTrackController = class {
|
|
|
2787
2806
|
this.activePointers.delete(e.pointerId);
|
|
2788
2807
|
this.lastTargetPoints.delete(e.pointerId);
|
|
2789
2808
|
if (this.activePointers.size === 0) {
|
|
2790
|
-
this.finishStroke();
|
|
2809
|
+
this.finishStroke(true);
|
|
2791
2810
|
}
|
|
2792
2811
|
}
|
|
2793
2812
|
};
|
|
@@ -3036,7 +3055,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3036
3055
|
this.localVideoSize = null;
|
|
3037
3056
|
this.currentPrompt = "";
|
|
3038
3057
|
this.currentGenerationModel = "";
|
|
3039
|
-
this.currentStaticGenerate = void 0;
|
|
3040
3058
|
this.disconnected = false;
|
|
3041
3059
|
this.remoteViewHost = null;
|
|
3042
3060
|
this.dragController = null;
|
|
@@ -3172,7 +3190,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3172
3190
|
const initialState = options.initialState;
|
|
3173
3191
|
this.currentPrompt = resolvePromptText(initialState?.prompt);
|
|
3174
3192
|
this.currentGenerationModel = resolveGenerationModel(initialState?.model);
|
|
3175
|
-
this.currentStaticGenerate = initialState?.staticGenerate;
|
|
3176
3193
|
const publishFpsOptions = {
|
|
3177
3194
|
mobile: options.mobile,
|
|
3178
3195
|
highQuality: true,
|
|
@@ -3199,7 +3216,8 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3199
3216
|
model: this.currentGenerationModel || void 0,
|
|
3200
3217
|
size: options.size,
|
|
3201
3218
|
refImage: initialRefImageUrl,
|
|
3202
|
-
staticGenerate:
|
|
3219
|
+
staticGenerate: initialState?.staticGenerate,
|
|
3220
|
+
staticImagePath: initialState?.staticImagePath?.trim() || void 0
|
|
3203
3221
|
});
|
|
3204
3222
|
}
|
|
3205
3223
|
}
|
|
@@ -3278,15 +3296,14 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3278
3296
|
if (options?.model !== void 0) {
|
|
3279
3297
|
this.currentGenerationModel = resolveGenerationModel(options.model);
|
|
3280
3298
|
}
|
|
3281
|
-
if (options?.staticGenerate !== void 0) {
|
|
3282
|
-
this.currentStaticGenerate = options.staticGenerate;
|
|
3283
|
-
}
|
|
3284
3299
|
await this.runStart({
|
|
3285
3300
|
prompt: this.currentPrompt || void 0,
|
|
3286
3301
|
model: this.currentGenerationModel || void 0,
|
|
3287
3302
|
size: options?.size,
|
|
3288
3303
|
refImage: resolvedRefImage,
|
|
3289
|
-
staticGenerate:
|
|
3304
|
+
staticGenerate: options?.staticGenerate === true ? true : void 0,
|
|
3305
|
+
staticImagePath: options?.staticImagePath?.trim() || void 0,
|
|
3306
|
+
preserveRemoteOutput: options?.preserveRemoteOutput
|
|
3290
3307
|
});
|
|
3291
3308
|
} catch (error) {
|
|
3292
3309
|
this.reportError(error);
|
|
@@ -3377,17 +3394,20 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3377
3394
|
if (!this.rtc.snapshot.joined) {
|
|
3378
3395
|
return;
|
|
3379
3396
|
}
|
|
3397
|
+
const preserveRemoteOutput = options.preserveRemoteOutput ?? false;
|
|
3398
|
+
if (preserveRemoteOutput) {
|
|
3399
|
+
this.rtc.setPreserveRemoteDom(true);
|
|
3400
|
+
}
|
|
3380
3401
|
const startPrompt = options.prompt?.trim() ?? this.currentPrompt;
|
|
3381
3402
|
if (options.model !== void 0) {
|
|
3382
3403
|
this.currentGenerationModel = resolveGenerationModel(options.model);
|
|
3383
3404
|
}
|
|
3384
|
-
if (options.staticGenerate !== void 0) {
|
|
3385
|
-
this.currentStaticGenerate = options.staticGenerate;
|
|
3386
|
-
}
|
|
3387
3405
|
const modelLabel = resolveGenerationModel(this.currentGenerationModel);
|
|
3388
3406
|
await this.rtc.ensurePublishedInputBeforeStart();
|
|
3389
|
-
|
|
3390
|
-
|
|
3407
|
+
if (!preserveRemoteOutput) {
|
|
3408
|
+
this.rtc.setRemoteVideoContainer(null);
|
|
3409
|
+
this.rtc.clearRemoteVideo();
|
|
3410
|
+
}
|
|
3391
3411
|
const size = resolveSessionTargetSize({
|
|
3392
3412
|
localVideoSize: this.localVideoSize,
|
|
3393
3413
|
overrideSize: options.size ?? this.sessionSizeOverride
|
|
@@ -3408,16 +3428,21 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3408
3428
|
size,
|
|
3409
3429
|
prompt: startPrompt,
|
|
3410
3430
|
refImagePath: resolveRefImagePath(options.refImage),
|
|
3411
|
-
|
|
3431
|
+
// Never reuse prior start — caller must pass Instant fields each time.
|
|
3432
|
+
staticGenerate: options.staticGenerate === true ? true : void 0,
|
|
3433
|
+
staticImagePath: options.staticImagePath?.trim() || void 0
|
|
3412
3434
|
});
|
|
3413
|
-
console.log("[Xmax SDK] \u771F\u5B9E\u53D1\u9001 start ->", startRoomEvent);
|
|
3414
3435
|
await this.rtc.sendRoomEvent(startRoomEvent);
|
|
3415
|
-
await this.rtc.refreshRemoteVideoBinding({ force:
|
|
3436
|
+
await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput });
|
|
3416
3437
|
this.updateDragController(true);
|
|
3417
3438
|
this.scheduleNotifyRemoteStream();
|
|
3418
3439
|
} catch (error) {
|
|
3419
3440
|
this.rtc.configureSessionSei(null);
|
|
3420
3441
|
throw error;
|
|
3442
|
+
} finally {
|
|
3443
|
+
if (preserveRemoteOutput) {
|
|
3444
|
+
this.rtc.setPreserveRemoteDom(false);
|
|
3445
|
+
}
|
|
3421
3446
|
}
|
|
3422
3447
|
}
|
|
3423
3448
|
isDragEnabled() {
|
|
@@ -3544,7 +3569,6 @@ var RealtimeSession = class _RealtimeSession {
|
|
|
3544
3569
|
this.taskUid = null;
|
|
3545
3570
|
this.currentPrompt = "";
|
|
3546
3571
|
this.currentGenerationModel = "";
|
|
3547
|
-
this.currentStaticGenerate = void 0;
|
|
3548
3572
|
this.sessionTargetSize = null;
|
|
3549
3573
|
this.dragController?.destroy();
|
|
3550
3574
|
this.dragController = null;
|