@xmaxai/web-sdk 1.0.2 → 1.0.3
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/{chunk-5NIEZJP5.cjs → chunk-JWAAS6P4.cjs} +324 -276
- package/dist/chunk-JWAAS6P4.cjs.map +1 -0
- package/dist/{chunk-6RIEDVRQ.js → chunk-YMLRUDAO.js} +213 -165
- package/dist/chunk-YMLRUDAO.js.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -8
- package/dist/index.d.ts +17 -8
- package/dist/index.js +1 -1
- package/dist/react/index.cjs +3 -3
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-5NIEZJP5.cjs.map +0 -1
- package/dist/chunk-6RIEDVRQ.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var _chunkJWAAS6P4cjs = require('./chunk-JWAAS6P4.cjs');
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
|
|
@@ -55,5 +55,5 @@ var _chunk5NIEZJP5cjs = require('./chunk-5NIEZJP5.cjs');
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
exports.CameraPosition =
|
|
58
|
+
exports.CameraPosition = _chunkJWAAS6P4cjs.CameraPosition; exports.MediaService = _chunkJWAAS6P4cjs.MediaService; exports.RealtimeConfiguration = _chunkJWAAS6P4cjs.RealtimeConfiguration; exports.RealtimeConnectionState = _chunkJWAAS6P4cjs.RealtimeConnectionState; exports.RealtimeContext = _chunkJWAAS6P4cjs.RealtimeContext; exports.RealtimeMediaStream = _chunkJWAAS6P4cjs.RealtimeMediaStream; exports.RealtimeModel = _chunkJWAAS6P4cjs.RealtimeModel; exports.RealtimeReason = _chunkJWAAS6P4cjs.RealtimeReason; exports.RealtimeState = _chunkJWAAS6P4cjs.RealtimeState; exports.RealtimeVideoEncoderPreference = _chunkJWAAS6P4cjs.RealtimeVideoEncoderPreference; exports.RealtimeVideoFormat = _chunkJWAAS6P4cjs.RealtimeVideoFormat; exports.RealtimeVideoTrack = _chunkJWAAS6P4cjs.RealtimeVideoTrack; exports.StorageService = _chunkJWAAS6P4cjs.StorageService; exports.StoredFile = _chunkJWAAS6P4cjs.StoredFile; exports.VideoContentMode = _chunkJWAAS6P4cjs.VideoContentMode; exports.XmaxClient = _chunkJWAAS6P4cjs.XmaxClient; exports.XmaxConfiguration = _chunkJWAAS6P4cjs.XmaxConfiguration; exports.XmaxEnvironment = _chunkJWAAS6P4cjs.XmaxEnvironment; exports.XmaxError = _chunkJWAAS6P4cjs.XmaxError; exports.XmaxErrorCode = _chunkJWAAS6P4cjs.XmaxErrorCode; exports.XmaxLogger = _chunkJWAAS6P4cjs.XmaxLogger; exports.XmaxLoggerOption = _chunkJWAAS6P4cjs.XmaxLoggerOption; exports.XmaxRealtimeVideoView = _chunkJWAAS6P4cjs.XmaxRealtimeVideoView; exports.XmaxVideoView = _chunkJWAAS6P4cjs.XmaxVideoView; exports.apiBaseURL = _chunkJWAAS6P4cjs.apiBaseURL; exports.defaultCameraVideoFormat = _chunkJWAAS6P4cjs.defaultCameraVideoFormat; exports.defaultFrameRate = _chunkJWAAS6P4cjs.defaultFrameRate;
|
|
59
59
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-
|
|
1
|
+
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-weZCpU/source/packages/xmax-sdk/dist/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,spDAAC","file":"/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-weZCpU/source/packages/xmax-sdk/dist/index.cjs"}
|
package/dist/index.d.cts
CHANGED
|
@@ -314,7 +314,7 @@ declare enum XmaxErrorCode {
|
|
|
314
314
|
*/
|
|
315
315
|
cameraPermissionDenied = "CAMERA_PERMISSION_DENIED",
|
|
316
316
|
/**
|
|
317
|
-
* @deprecated
|
|
317
|
+
* @deprecated 为兼容保留;相机预热改为固定等待,不再抛出此错误。
|
|
318
318
|
*/
|
|
319
319
|
cameraExposureTimeout = "CAMERA_EXPOSURE_TIMEOUT",
|
|
320
320
|
/**
|
|
@@ -504,13 +504,18 @@ interface RealtimeLaunchTiming {
|
|
|
504
504
|
*/
|
|
505
505
|
readonly cameraMs?: number;
|
|
506
506
|
/**
|
|
507
|
-
*
|
|
507
|
+
* 确认相机与麦克风权限可用的耗时;系统弹窗时统计到用户完成授权。
|
|
508
|
+
* 权限被拒绝或浏览器不支持观察时不记录。
|
|
509
|
+
*/
|
|
510
|
+
readonly permissionMs?: number;
|
|
511
|
+
/**
|
|
512
|
+
* 开始创建会话到 RTC 进房配置与相机预热等待完成;不含发布本地流。
|
|
508
513
|
*/
|
|
509
514
|
readonly connectionMs?: number;
|
|
510
515
|
/**
|
|
511
|
-
*
|
|
516
|
+
* 发布本地流到 RTC 房间的耗时。
|
|
512
517
|
*/
|
|
513
|
-
readonly
|
|
518
|
+
readonly publishMs?: number;
|
|
514
519
|
/**
|
|
515
520
|
* 开始发送生成信令到 SDK 远端视图首次呈现视频帧。
|
|
516
521
|
*/
|
|
@@ -656,7 +661,7 @@ interface XmaxRealtimeManaging {
|
|
|
656
661
|
position: CameraPosition;
|
|
657
662
|
useMicrophone: boolean;
|
|
658
663
|
/**
|
|
659
|
-
*
|
|
664
|
+
* 是否在发布前等待相机预热(固定 200ms),默认 true;false 跳过等待,不产生预热耗时。
|
|
660
665
|
*/
|
|
661
666
|
enableFrameValidation?: boolean;
|
|
662
667
|
}): Promise<RealtimeMediaStream>;
|
|
@@ -677,8 +682,7 @@ interface XmaxRealtimeManaging {
|
|
|
677
682
|
* 使用当前 Manager 创建的本地流建立实时连接。
|
|
678
683
|
*
|
|
679
684
|
* 创建实时会话、加入 RTC 房间并发布本地流,成功后启动会话心跳。
|
|
680
|
-
*
|
|
681
|
-
* 记录警告并按当前画面继续发布,不因环境较暗而阻断连接。
|
|
685
|
+
* 启用帧检测时,发布前并行等待相机预热(固定 200ms),避免把黑帧推给 RTC。
|
|
682
686
|
* 返回的远端媒体流在生成开始后承载远端生成画面。
|
|
683
687
|
*
|
|
684
688
|
* @param localStream 由 `createLocalCameraStream` 创建的本地媒体流。
|
|
@@ -985,8 +989,13 @@ interface ApiServicing {
|
|
|
985
989
|
put<T>(path: string, body?: unknown): Promise<T>;
|
|
986
990
|
/**
|
|
987
991
|
* 发送 DELETE 请求。
|
|
992
|
+
*
|
|
993
|
+
* @param options.keepalive 为 true 时请求可存活于页面卸载之后,
|
|
994
|
+
* 用于刷新或关闭页签时的清理请求。
|
|
988
995
|
*/
|
|
989
|
-
delete<T>(path: string
|
|
996
|
+
delete<T>(path: string, options?: {
|
|
997
|
+
keepalive?: boolean;
|
|
998
|
+
}): Promise<T>;
|
|
990
999
|
}
|
|
991
1000
|
|
|
992
1001
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -314,7 +314,7 @@ declare enum XmaxErrorCode {
|
|
|
314
314
|
*/
|
|
315
315
|
cameraPermissionDenied = "CAMERA_PERMISSION_DENIED",
|
|
316
316
|
/**
|
|
317
|
-
* @deprecated
|
|
317
|
+
* @deprecated 为兼容保留;相机预热改为固定等待,不再抛出此错误。
|
|
318
318
|
*/
|
|
319
319
|
cameraExposureTimeout = "CAMERA_EXPOSURE_TIMEOUT",
|
|
320
320
|
/**
|
|
@@ -504,13 +504,18 @@ interface RealtimeLaunchTiming {
|
|
|
504
504
|
*/
|
|
505
505
|
readonly cameraMs?: number;
|
|
506
506
|
/**
|
|
507
|
-
*
|
|
507
|
+
* 确认相机与麦克风权限可用的耗时;系统弹窗时统计到用户完成授权。
|
|
508
|
+
* 权限被拒绝或浏览器不支持观察时不记录。
|
|
509
|
+
*/
|
|
510
|
+
readonly permissionMs?: number;
|
|
511
|
+
/**
|
|
512
|
+
* 开始创建会话到 RTC 进房配置与相机预热等待完成;不含发布本地流。
|
|
508
513
|
*/
|
|
509
514
|
readonly connectionMs?: number;
|
|
510
515
|
/**
|
|
511
|
-
*
|
|
516
|
+
* 发布本地流到 RTC 房间的耗时。
|
|
512
517
|
*/
|
|
513
|
-
readonly
|
|
518
|
+
readonly publishMs?: number;
|
|
514
519
|
/**
|
|
515
520
|
* 开始发送生成信令到 SDK 远端视图首次呈现视频帧。
|
|
516
521
|
*/
|
|
@@ -656,7 +661,7 @@ interface XmaxRealtimeManaging {
|
|
|
656
661
|
position: CameraPosition;
|
|
657
662
|
useMicrophone: boolean;
|
|
658
663
|
/**
|
|
659
|
-
*
|
|
664
|
+
* 是否在发布前等待相机预热(固定 200ms),默认 true;false 跳过等待,不产生预热耗时。
|
|
660
665
|
*/
|
|
661
666
|
enableFrameValidation?: boolean;
|
|
662
667
|
}): Promise<RealtimeMediaStream>;
|
|
@@ -677,8 +682,7 @@ interface XmaxRealtimeManaging {
|
|
|
677
682
|
* 使用当前 Manager 创建的本地流建立实时连接。
|
|
678
683
|
*
|
|
679
684
|
* 创建实时会话、加入 RTC 房间并发布本地流,成功后启动会话心跳。
|
|
680
|
-
*
|
|
681
|
-
* 记录警告并按当前画面继续发布,不因环境较暗而阻断连接。
|
|
685
|
+
* 启用帧检测时,发布前并行等待相机预热(固定 200ms),避免把黑帧推给 RTC。
|
|
682
686
|
* 返回的远端媒体流在生成开始后承载远端生成画面。
|
|
683
687
|
*
|
|
684
688
|
* @param localStream 由 `createLocalCameraStream` 创建的本地媒体流。
|
|
@@ -985,8 +989,13 @@ interface ApiServicing {
|
|
|
985
989
|
put<T>(path: string, body?: unknown): Promise<T>;
|
|
986
990
|
/**
|
|
987
991
|
* 发送 DELETE 请求。
|
|
992
|
+
*
|
|
993
|
+
* @param options.keepalive 为 true 时请求可存活于页面卸载之后,
|
|
994
|
+
* 用于刷新或关闭页签时的清理请求。
|
|
988
995
|
*/
|
|
989
|
-
delete<T>(path: string
|
|
996
|
+
delete<T>(path: string, options?: {
|
|
997
|
+
keepalive?: boolean;
|
|
998
|
+
}): Promise<T>;
|
|
990
999
|
}
|
|
991
1000
|
|
|
992
1001
|
/**
|
package/dist/index.js
CHANGED
package/dist/react/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkJWAAS6P4cjs = require('../chunk-JWAAS6P4.cjs');
|
|
5
5
|
|
|
6
6
|
// src/react/XmaxRealtimeVideo.tsx
|
|
7
7
|
|
|
@@ -17,7 +17,7 @@ function XmaxRealtimeVideo(props) {
|
|
|
17
17
|
if (!container) {
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
const view = new (0,
|
|
20
|
+
const view = new (0, _chunkJWAAS6P4cjs.XmaxRealtimeVideoView)();
|
|
21
21
|
view.element.style.width = "100%";
|
|
22
22
|
view.element.style.height = "100%";
|
|
23
23
|
view.attach(container);
|
|
@@ -71,7 +71,7 @@ function XmaxVideo(props) {
|
|
|
71
71
|
if (!container) {
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
|
-
const view = new (0,
|
|
74
|
+
const view = new (0, _chunkJWAAS6P4cjs.XmaxVideoView)();
|
|
75
75
|
view.element.style.width = "100%";
|
|
76
76
|
view.element.style.height = "100%";
|
|
77
77
|
view.attach(container);
|
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-
|
|
1
|
+
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-weZCpU/source/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":"/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-weZCpU/source/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 * 当前显示的本地视频轨道。\n */\n localTrack?: RealtimeVideoTrack;\n\n /**\n * 当前显示的远端生成视频轨道;首帧提交后自动渐入。\n */\n remoteTrack?: RealtimeVideoTrack;\n\n /**\n * 视频内容在容器中的显示模式,默认 fill。\n */\n videoContentMode?: VideoContentMode;\n\n /**\n * 容器类名。\n */\n className?: string;\n\n /**\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\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 * 当前显示的视频轨道;置空时清空画面。\n */\n track?: RealtimeVideoTrack;\n\n /**\n * 视频内容在容器中的显示模式,默认 fill。\n */\n videoContentMode?: VideoContentMode;\n\n /**\n * 是否镜像显示(仅影响显示,不影响发布流)。\n */\n mirrored?: boolean;\n\n /**\n * 容器类名。\n */\n className?: string;\n\n /**\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\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"]}
|
package/dist/react/index.js
CHANGED