@xmaxai/web-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import {
2
+ CameraPosition,
3
+ MediaService,
4
+ RealtimeConfiguration,
5
+ RealtimeConnectionState,
6
+ RealtimeContext,
7
+ RealtimeMediaStream,
8
+ RealtimeModel,
9
+ RealtimeReason,
10
+ RealtimeState,
11
+ RealtimeVideoEncoderPreference,
12
+ RealtimeVideoFormat,
13
+ RealtimeVideoTrack,
14
+ StorageService,
15
+ StoredFile,
16
+ VideoContentMode,
17
+ XmaxClient,
18
+ XmaxConfiguration,
19
+ XmaxEnvironment,
20
+ XmaxError,
21
+ XmaxErrorCode,
22
+ XmaxLogger,
23
+ XmaxLoggerOption,
24
+ XmaxRealtimeVideoView,
25
+ XmaxVideoView,
26
+ apiBaseURL,
27
+ defaultCameraVideoFormat,
28
+ defaultFrameRate
29
+ } from "./chunk-MJ72WWQX.js";
30
+ export {
31
+ CameraPosition,
32
+ MediaService,
33
+ RealtimeConfiguration,
34
+ RealtimeConnectionState,
35
+ RealtimeContext,
36
+ RealtimeMediaStream,
37
+ RealtimeModel,
38
+ RealtimeReason,
39
+ RealtimeState,
40
+ RealtimeVideoEncoderPreference,
41
+ RealtimeVideoFormat,
42
+ RealtimeVideoTrack,
43
+ StorageService,
44
+ StoredFile,
45
+ VideoContentMode,
46
+ XmaxClient,
47
+ XmaxConfiguration,
48
+ XmaxEnvironment,
49
+ XmaxError,
50
+ XmaxErrorCode,
51
+ XmaxLogger,
52
+ XmaxLoggerOption,
53
+ XmaxRealtimeVideoView,
54
+ XmaxVideoView,
55
+ apiBaseURL,
56
+ defaultCameraVideoFormat,
57
+ defaultFrameRate
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,116 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkJJWUZ3AWcjs = require('../chunk-JJWUZ3AW.cjs');
5
+
6
+ // src/react/XmaxRealtimeVideo.tsx
7
+
8
+
9
+
10
+ var _react = require('react');
11
+ var _jsxruntime = require('react/jsx-runtime');
12
+ function XmaxRealtimeVideo(props) {
13
+ const containerRef = _react.useRef.call(void 0, null);
14
+ const viewRef = _react.useRef.call(void 0, void 0);
15
+ _react.useEffect.call(void 0, () => {
16
+ const container = containerRef.current;
17
+ if (!container) {
18
+ return;
19
+ }
20
+ const view = new (0, _chunkJJWUZ3AWcjs.XmaxRealtimeVideoView)();
21
+ view.element.style.width = "100%";
22
+ view.element.style.height = "100%";
23
+ view.attach(container);
24
+ viewRef.current = view;
25
+ return () => {
26
+ viewRef.current = void 0;
27
+ view.localTrack = void 0;
28
+ view.remoteTrack = void 0;
29
+ view.detach();
30
+ };
31
+ }, []);
32
+ _react.useEffect.call(void 0, () => {
33
+ const view = viewRef.current;
34
+ if (view) {
35
+ view.localTrack = props.localTrack;
36
+ }
37
+ }, [props.localTrack]);
38
+ _react.useEffect.call(void 0, () => {
39
+ const view = viewRef.current;
40
+ if (view) {
41
+ view.remoteTrack = props.remoteTrack;
42
+ }
43
+ }, [props.remoteTrack]);
44
+ _react.useEffect.call(void 0, () => {
45
+ const view = viewRef.current;
46
+ if (view && props.videoContentMode) {
47
+ view.videoContentMode = props.videoContentMode;
48
+ }
49
+ }, [props.videoContentMode]);
50
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
51
+ "div",
52
+ {
53
+ ref: containerRef,
54
+ className: props.className,
55
+ style: { position: "relative", overflow: "hidden", ...props.style }
56
+ }
57
+ );
58
+ }
59
+
60
+ // src/react/XmaxVideo.tsx
61
+
62
+
63
+
64
+
65
+
66
+ function XmaxVideo(props) {
67
+ const containerRef = _react.useRef.call(void 0, null);
68
+ const viewRef = _react.useRef.call(void 0, void 0);
69
+ _react.useEffect.call(void 0, () => {
70
+ const container = containerRef.current;
71
+ if (!container) {
72
+ return;
73
+ }
74
+ const view = new (0, _chunkJJWUZ3AWcjs.XmaxVideoView)();
75
+ view.element.style.width = "100%";
76
+ view.element.style.height = "100%";
77
+ view.attach(container);
78
+ viewRef.current = view;
79
+ return () => {
80
+ viewRef.current = void 0;
81
+ view.track = void 0;
82
+ view.detach();
83
+ };
84
+ }, []);
85
+ _react.useEffect.call(void 0, () => {
86
+ const view = viewRef.current;
87
+ if (view) {
88
+ view.track = props.track;
89
+ }
90
+ }, [props.track]);
91
+ _react.useEffect.call(void 0, () => {
92
+ const view = viewRef.current;
93
+ if (view && props.videoContentMode) {
94
+ view.videoContentMode = props.videoContentMode;
95
+ }
96
+ }, [props.videoContentMode]);
97
+ _react.useEffect.call(void 0, () => {
98
+ const view = viewRef.current;
99
+ if (view && props.mirrored !== void 0) {
100
+ view.isMirrored = props.mirrored;
101
+ }
102
+ }, [props.mirrored]);
103
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
104
+ "div",
105
+ {
106
+ ref: containerRef,
107
+ className: props.className,
108
+ style: { position: "relative", overflow: "hidden", ...props.style }
109
+ }
110
+ );
111
+ }
112
+
113
+
114
+
115
+ exports.XmaxRealtimeVideo = XmaxRealtimeVideo; exports.XmaxVideo = XmaxVideo;
116
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/xmax.ai/dev/Xmax/Web/XmaxSDK/packages/xmax-sdk/dist/react/index.cjs","../../src/react/XmaxRealtimeVideo.tsx","../../src/react/XmaxVideo.tsx"],"names":["useRef","useEffect","jsx"],"mappings":"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","file":"/Users/xmax.ai/dev/Xmax/Web/XmaxSDK/packages/xmax-sdk/dist/react/index.cjs","sourcesContent":[null,"import {\n VideoContentMode,\n XmaxRealtimeVideoView,\n type RealtimeVideoTrack,\n} from \"../index\";\nimport {\n useEffect,\n useRef,\n type CSSProperties,\n} from \"react\";\n\nexport interface XmaxRealtimeVideoProps {\n /** 当前显示的本地视频轨道。 */\n localTrack?: RealtimeVideoTrack;\n\n /** 当前显示的远端生成视频轨道;首帧提交后自动渐入。 */\n remoteTrack?: RealtimeVideoTrack;\n\n /** 视频内容在容器中的显示模式,默认 fill。 */\n videoContentMode?: VideoContentMode;\n\n /** 容器类名。 */\n className?: string;\n\n /** 容器样式。 */\n style?: CSSProperties;\n}\n\n/**\n * 本地预览和远端生成画面自动切换的 React 组件。\n */\nexport function XmaxRealtimeVideo(props: XmaxRealtimeVideoProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<XmaxRealtimeVideoView | undefined>(undefined);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n const view = new XmaxRealtimeVideoView();\n view.element.style.width = \"100%\";\n view.element.style.height = \"100%\";\n view.attach(container);\n viewRef.current = view;\n return () => {\n viewRef.current = undefined;\n view.localTrack = undefined;\n view.remoteTrack = undefined;\n view.detach();\n };\n }, []);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.localTrack = props.localTrack;\n }\n }, [props.localTrack]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.remoteTrack = props.remoteTrack;\n }\n }, [props.remoteTrack]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.videoContentMode) {\n view.videoContentMode = props.videoContentMode;\n }\n }, [props.videoContentMode]);\n\n return (\n <div\n ref={containerRef}\n className={props.className}\n style={{ position: \"relative\", overflow: \"hidden\", ...props.style }}\n />\n );\n}\n","import {\n VideoContentMode,\n XmaxVideoView,\n type RealtimeVideoTrack,\n} from \"../index\";\nimport {\n useEffect,\n useRef,\n type CSSProperties,\n} from \"react\";\n\nexport interface XmaxVideoProps {\n /** 当前显示的视频轨道;置空时清空画面。 */\n track?: RealtimeVideoTrack;\n\n /** 视频内容在容器中的显示模式,默认 fill。 */\n videoContentMode?: VideoContentMode;\n\n /** 是否镜像显示(仅影响显示,不影响发布流)。 */\n mirrored?: boolean;\n\n /** 容器类名。 */\n className?: string;\n\n /** 容器样式。 */\n style?: CSSProperties;\n}\n\n/**\n * 单轨视频 React 组件:把一路视频轨渲染到容器。\n */\nexport function XmaxVideo(props: XmaxVideoProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<XmaxVideoView | undefined>(undefined);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n const view = new XmaxVideoView();\n view.element.style.width = \"100%\";\n view.element.style.height = \"100%\";\n view.attach(container);\n viewRef.current = view;\n return () => {\n viewRef.current = undefined;\n view.track = undefined;\n view.detach();\n };\n }, []);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.track = props.track;\n }\n }, [props.track]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.videoContentMode) {\n view.videoContentMode = props.videoContentMode;\n }\n }, [props.videoContentMode]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.mirrored !== undefined) {\n view.isMirrored = props.mirrored;\n }\n }, [props.mirrored]);\n\n return (\n <div\n ref={containerRef}\n className={props.className}\n style={{ position: \"relative\", overflow: \"hidden\", ...props.style }}\n />\n );\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import * as react from 'react';
2
+ import { CSSProperties } from 'react';
3
+ import { a as RealtimeVideoTrack, V as VideoContentMode } from '../VideoContentMode-BXkqM4XG.cjs';
4
+
5
+ interface XmaxRealtimeVideoProps {
6
+ /** 当前显示的本地视频轨道。 */
7
+ localTrack?: RealtimeVideoTrack;
8
+ /** 当前显示的远端生成视频轨道;首帧提交后自动渐入。 */
9
+ remoteTrack?: RealtimeVideoTrack;
10
+ /** 视频内容在容器中的显示模式,默认 fill。 */
11
+ videoContentMode?: VideoContentMode;
12
+ /** 容器类名。 */
13
+ className?: string;
14
+ /** 容器样式。 */
15
+ style?: CSSProperties;
16
+ }
17
+ /**
18
+ * 本地预览和远端生成画面自动切换的 React 组件。
19
+ */
20
+ declare function XmaxRealtimeVideo(props: XmaxRealtimeVideoProps): react.JSX.Element;
21
+
22
+ interface XmaxVideoProps {
23
+ /** 当前显示的视频轨道;置空时清空画面。 */
24
+ track?: RealtimeVideoTrack;
25
+ /** 视频内容在容器中的显示模式,默认 fill。 */
26
+ videoContentMode?: VideoContentMode;
27
+ /** 是否镜像显示(仅影响显示,不影响发布流)。 */
28
+ mirrored?: boolean;
29
+ /** 容器类名。 */
30
+ className?: string;
31
+ /** 容器样式。 */
32
+ style?: CSSProperties;
33
+ }
34
+ /**
35
+ * 单轨视频 React 组件:把一路视频轨渲染到容器。
36
+ */
37
+ declare function XmaxVideo(props: XmaxVideoProps): react.JSX.Element;
38
+
39
+ export { XmaxRealtimeVideo, type XmaxRealtimeVideoProps, XmaxVideo, type XmaxVideoProps };
@@ -0,0 +1,39 @@
1
+ import * as react from 'react';
2
+ import { CSSProperties } from 'react';
3
+ import { a as RealtimeVideoTrack, V as VideoContentMode } from '../VideoContentMode-BXkqM4XG.js';
4
+
5
+ interface XmaxRealtimeVideoProps {
6
+ /** 当前显示的本地视频轨道。 */
7
+ localTrack?: RealtimeVideoTrack;
8
+ /** 当前显示的远端生成视频轨道;首帧提交后自动渐入。 */
9
+ remoteTrack?: RealtimeVideoTrack;
10
+ /** 视频内容在容器中的显示模式,默认 fill。 */
11
+ videoContentMode?: VideoContentMode;
12
+ /** 容器类名。 */
13
+ className?: string;
14
+ /** 容器样式。 */
15
+ style?: CSSProperties;
16
+ }
17
+ /**
18
+ * 本地预览和远端生成画面自动切换的 React 组件。
19
+ */
20
+ declare function XmaxRealtimeVideo(props: XmaxRealtimeVideoProps): react.JSX.Element;
21
+
22
+ interface XmaxVideoProps {
23
+ /** 当前显示的视频轨道;置空时清空画面。 */
24
+ track?: RealtimeVideoTrack;
25
+ /** 视频内容在容器中的显示模式,默认 fill。 */
26
+ videoContentMode?: VideoContentMode;
27
+ /** 是否镜像显示(仅影响显示,不影响发布流)。 */
28
+ mirrored?: boolean;
29
+ /** 容器类名。 */
30
+ className?: string;
31
+ /** 容器样式。 */
32
+ style?: CSSProperties;
33
+ }
34
+ /**
35
+ * 单轨视频 React 组件:把一路视频轨渲染到容器。
36
+ */
37
+ declare function XmaxVideo(props: XmaxVideoProps): react.JSX.Element;
38
+
39
+ export { XmaxRealtimeVideo, type XmaxRealtimeVideoProps, XmaxVideo, type XmaxVideoProps };
@@ -0,0 +1,116 @@
1
+ import {
2
+ XmaxRealtimeVideoView,
3
+ XmaxVideoView
4
+ } from "../chunk-MJ72WWQX.js";
5
+
6
+ // src/react/XmaxRealtimeVideo.tsx
7
+ import {
8
+ useEffect,
9
+ useRef
10
+ } from "react";
11
+ import { jsx } from "react/jsx-runtime";
12
+ function XmaxRealtimeVideo(props) {
13
+ const containerRef = useRef(null);
14
+ const viewRef = useRef(void 0);
15
+ useEffect(() => {
16
+ const container = containerRef.current;
17
+ if (!container) {
18
+ return;
19
+ }
20
+ const view = new XmaxRealtimeVideoView();
21
+ view.element.style.width = "100%";
22
+ view.element.style.height = "100%";
23
+ view.attach(container);
24
+ viewRef.current = view;
25
+ return () => {
26
+ viewRef.current = void 0;
27
+ view.localTrack = void 0;
28
+ view.remoteTrack = void 0;
29
+ view.detach();
30
+ };
31
+ }, []);
32
+ useEffect(() => {
33
+ const view = viewRef.current;
34
+ if (view) {
35
+ view.localTrack = props.localTrack;
36
+ }
37
+ }, [props.localTrack]);
38
+ useEffect(() => {
39
+ const view = viewRef.current;
40
+ if (view) {
41
+ view.remoteTrack = props.remoteTrack;
42
+ }
43
+ }, [props.remoteTrack]);
44
+ useEffect(() => {
45
+ const view = viewRef.current;
46
+ if (view && props.videoContentMode) {
47
+ view.videoContentMode = props.videoContentMode;
48
+ }
49
+ }, [props.videoContentMode]);
50
+ return /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ ref: containerRef,
54
+ className: props.className,
55
+ style: { position: "relative", overflow: "hidden", ...props.style }
56
+ }
57
+ );
58
+ }
59
+
60
+ // src/react/XmaxVideo.tsx
61
+ import {
62
+ useEffect as useEffect2,
63
+ useRef as useRef2
64
+ } from "react";
65
+ import { jsx as jsx2 } from "react/jsx-runtime";
66
+ function XmaxVideo(props) {
67
+ const containerRef = useRef2(null);
68
+ const viewRef = useRef2(void 0);
69
+ useEffect2(() => {
70
+ const container = containerRef.current;
71
+ if (!container) {
72
+ return;
73
+ }
74
+ const view = new XmaxVideoView();
75
+ view.element.style.width = "100%";
76
+ view.element.style.height = "100%";
77
+ view.attach(container);
78
+ viewRef.current = view;
79
+ return () => {
80
+ viewRef.current = void 0;
81
+ view.track = void 0;
82
+ view.detach();
83
+ };
84
+ }, []);
85
+ useEffect2(() => {
86
+ const view = viewRef.current;
87
+ if (view) {
88
+ view.track = props.track;
89
+ }
90
+ }, [props.track]);
91
+ useEffect2(() => {
92
+ const view = viewRef.current;
93
+ if (view && props.videoContentMode) {
94
+ view.videoContentMode = props.videoContentMode;
95
+ }
96
+ }, [props.videoContentMode]);
97
+ useEffect2(() => {
98
+ const view = viewRef.current;
99
+ if (view && props.mirrored !== void 0) {
100
+ view.isMirrored = props.mirrored;
101
+ }
102
+ }, [props.mirrored]);
103
+ return /* @__PURE__ */ jsx2(
104
+ "div",
105
+ {
106
+ ref: containerRef,
107
+ className: props.className,
108
+ style: { position: "relative", overflow: "hidden", ...props.style }
109
+ }
110
+ );
111
+ }
112
+ export {
113
+ XmaxRealtimeVideo,
114
+ XmaxVideo
115
+ };
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/XmaxRealtimeVideo.tsx","../../src/react/XmaxVideo.tsx"],"sourcesContent":["import {\n VideoContentMode,\n XmaxRealtimeVideoView,\n type RealtimeVideoTrack,\n} from \"../index\";\nimport {\n useEffect,\n useRef,\n type CSSProperties,\n} from \"react\";\n\nexport interface XmaxRealtimeVideoProps {\n /** 当前显示的本地视频轨道。 */\n localTrack?: RealtimeVideoTrack;\n\n /** 当前显示的远端生成视频轨道;首帧提交后自动渐入。 */\n remoteTrack?: RealtimeVideoTrack;\n\n /** 视频内容在容器中的显示模式,默认 fill。 */\n videoContentMode?: VideoContentMode;\n\n /** 容器类名。 */\n className?: string;\n\n /** 容器样式。 */\n style?: CSSProperties;\n}\n\n/**\n * 本地预览和远端生成画面自动切换的 React 组件。\n */\nexport function XmaxRealtimeVideo(props: XmaxRealtimeVideoProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<XmaxRealtimeVideoView | undefined>(undefined);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n const view = new XmaxRealtimeVideoView();\n view.element.style.width = \"100%\";\n view.element.style.height = \"100%\";\n view.attach(container);\n viewRef.current = view;\n return () => {\n viewRef.current = undefined;\n view.localTrack = undefined;\n view.remoteTrack = undefined;\n view.detach();\n };\n }, []);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.localTrack = props.localTrack;\n }\n }, [props.localTrack]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.remoteTrack = props.remoteTrack;\n }\n }, [props.remoteTrack]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.videoContentMode) {\n view.videoContentMode = props.videoContentMode;\n }\n }, [props.videoContentMode]);\n\n return (\n <div\n ref={containerRef}\n className={props.className}\n style={{ position: \"relative\", overflow: \"hidden\", ...props.style }}\n />\n );\n}\n","import {\n VideoContentMode,\n XmaxVideoView,\n type RealtimeVideoTrack,\n} from \"../index\";\nimport {\n useEffect,\n useRef,\n type CSSProperties,\n} from \"react\";\n\nexport interface XmaxVideoProps {\n /** 当前显示的视频轨道;置空时清空画面。 */\n track?: RealtimeVideoTrack;\n\n /** 视频内容在容器中的显示模式,默认 fill。 */\n videoContentMode?: VideoContentMode;\n\n /** 是否镜像显示(仅影响显示,不影响发布流)。 */\n mirrored?: boolean;\n\n /** 容器类名。 */\n className?: string;\n\n /** 容器样式。 */\n style?: CSSProperties;\n}\n\n/**\n * 单轨视频 React 组件:把一路视频轨渲染到容器。\n */\nexport function XmaxVideo(props: XmaxVideoProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<XmaxVideoView | undefined>(undefined);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n const view = new XmaxVideoView();\n view.element.style.width = \"100%\";\n view.element.style.height = \"100%\";\n view.attach(container);\n viewRef.current = view;\n return () => {\n viewRef.current = undefined;\n view.track = undefined;\n view.detach();\n };\n }, []);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view) {\n view.track = props.track;\n }\n }, [props.track]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.videoContentMode) {\n view.videoContentMode = props.videoContentMode;\n }\n }, [props.videoContentMode]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (view && props.mirrored !== undefined) {\n view.isMirrored = props.mirrored;\n }\n }, [props.mirrored]);\n\n return (\n <div\n ref={containerRef}\n className={props.className}\n style={{ position: \"relative\", overflow: \"hidden\", ...props.style }}\n />\n );\n}\n"],"mappings":";;;;;;AAKA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAkEH;AA5CG,SAAS,kBAAkB,OAA+B;AAC/D,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,UAAU,OAA0C,MAAS;AAEnE,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,UAAM,OAAO,IAAI,sBAAsB;AACvC,SAAK,QAAQ,MAAM,QAAQ;AAC3B,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,OAAO,SAAS;AACrB,YAAQ,UAAU;AAClB,WAAO,MAAM;AACX,cAAQ,UAAU;AAClB,WAAK,aAAa;AAClB,WAAK,cAAc;AACnB,WAAK,OAAO;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,MAAM;AACR,WAAK,aAAa,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,YAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,MAAM;AACR,WAAK,cAAc,MAAM;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,YAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,QAAQ,MAAM,kBAAkB;AAClC,WAAK,mBAAmB,MAAM;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,MAAM,gBAAgB,CAAC;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,OAAO,EAAE,UAAU,YAAY,UAAU,UAAU,GAAG,MAAM,MAAM;AAAA;AAAA,EACpE;AAEJ;;;AC5EA;AAAA,EACE,aAAAA;AAAA,EACA,UAAAC;AAAA,OAEK;AAiEH,gBAAAC,YAAA;AA3CG,SAAS,UAAU,OAAuB;AAC/C,QAAM,eAAeD,QAAuB,IAAI;AAChD,QAAM,UAAUA,QAAkC,MAAS;AAE3D,EAAAD,WAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,UAAM,OAAO,IAAI,cAAc;AAC/B,SAAK,QAAQ,MAAM,QAAQ;AAC3B,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,OAAO,SAAS;AACrB,YAAQ,UAAU;AAClB,WAAO,MAAM;AACX,cAAQ,UAAU;AAClB,WAAK,QAAQ;AACb,WAAK,OAAO;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,MAAM;AACR,WAAK,QAAQ,MAAM;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,EAAAA,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,QAAQ,MAAM,kBAAkB;AAClC,WAAK,mBAAmB,MAAM;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,MAAM,gBAAgB,CAAC;AAE3B,EAAAA,WAAU,MAAM;AACd,UAAM,OAAO,QAAQ;AACrB,QAAI,QAAQ,MAAM,aAAa,QAAW;AACxC,WAAK,aAAa,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,OAAO,EAAE,UAAU,YAAY,UAAU,UAAU,GAAG,MAAM,MAAM;AAAA;AAAA,EACpE;AAEJ;","names":["useEffect","useRef","jsx"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@xmaxai/web-sdk",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "description": "XmaxSDK for Web — Realtime Interactive Video Generation",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "./react": {
17
+ "types": "./dist/react/index.d.ts",
18
+ "import": "./dist/react/index.js",
19
+ "require": "./dist/react/index.cjs"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "LICENSE"
25
+ ],
26
+ "scripts": {
27
+ "build": "node scripts/embed-framegen.mjs && tsup",
28
+ "test": "vitest run",
29
+ "typecheck": "tsc --noEmit",
30
+ "prepublishOnly": "npm run build && npm run test && cp ../../README.md ./README.md"
31
+ },
32
+ "devDependencies": {
33
+ "@types/react": "^18.3.12",
34
+ "react": "^18.3.1",
35
+ "@webgpu/types": "^0.1.64",
36
+ "tsup": "^8.3.5",
37
+ "typescript": "~5.6.3",
38
+ "vitest": "^2.1.8"
39
+ },
40
+ "peerDependencies": {
41
+ "react": ">=17"
42
+ },
43
+ "peerDependenciesMeta": {
44
+ "react": {
45
+ "optional": true
46
+ }
47
+ },
48
+ "dependencies": {
49
+ "framegen": "1.4.0",
50
+ "cos-js-sdk-v5": "^1.10.1",
51
+ "trtc-sdk-v5": "^5.6.0"
52
+ }
53
+ }