model-action 2.3.4 → 2.3.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Init.d.ts","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC7B,oCAAoC;IACpC,SAAS,EAAE,WAAW,CAAC;IACvB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc;IACd,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,UAAW,SAAQ,MAAM;IAClC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,IAAI;CAuFvE"}
1
+ {"version":3,"file":"Init.d.ts","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC7B,oCAAoC;IACpC,SAAS,EAAE,WAAW,CAAC;IACvB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc;IACd,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC/B;AAED,qBAAa,UAAW,SAAQ,MAAM;IAClC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,IAAI;CA0FvE"}
@@ -21,8 +21,9 @@ export class InitAction extends Action {
21
21
  console.error("解析消息失败:", error);
22
22
  }
23
23
  };
24
- // UE 内嵌 WebBrowser:不创建 peer-stream,只挂回包
25
- if (typeof (window === null || window === void 0 ? void 0 : window.ue5) === 'function') {
24
+ // UE 内嵌 WebBrowser / CEF:不创建 peer-stream,只挂回包
25
+ const isCefEnv = new URLSearchParams(window.location.search).get('env') === 'cef';
26
+ if (typeof (window === null || window === void 0 ? void 0 : window.ue5) === 'function' || isCefEnv) {
26
27
  const ue = window === null || window === void 0 ? void 0 : window.ue;
27
28
  if (ue === null || ue === void 0 ? void 0 : ue.interface) {
28
29
  ue.interface.return = handleMessage;
@@ -46,6 +47,8 @@ export class InitAction extends Action {
46
47
  // 设置 WebSocket 连接地址
47
48
  ps.id = options.wsUrl;
48
49
  // 将 video 元素添加到容器
50
+ if (!options.container)
51
+ return null;
49
52
  options.container.appendChild(ps);
50
53
  // 注册键盘和鼠标事件
51
54
  if (ps.registerKeyboardEvents) {
@@ -1 +1 @@
1
- {"version":3,"file":"Init.js","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Init.js","sourceRoot":"","sources":["../../src/modules/Init.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "model-action",
3
- "version": "2.3.4",
3
+ "version": "2.3.5",
4
4
  "description": "与三维交互api",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,119 +1,122 @@
1
- /**
2
- * 视频初始化操作方法
3
- */
4
- import { Action } from "./Action";
5
- // 导入 peer-stream.js 以确保自定义元素在使用前被注册
6
- import "../peer-stream.js";
7
- // 初始化配置选项
8
- export interface InitVideoOptions {
9
- /** 视频容器元素(DOM元素或ref);ue5 内嵌模式可忽略 */
10
- container: HTMLElement;
11
- /** WebSocket连接地址;ue5 内嵌模式可忽略 */
12
- wsUrl: string;
13
- /** 消息回调函数 */
14
- onMessage?: (data: any) => void;
15
- /** 播放开始回调函数(仅 Pixel Streaming) */
16
- onPlaying?: () => void;
17
- /** 排队人数变化回调函数(仅 Pixel Streaming) */
18
- onQueueChange?: (seq: number) => void;
19
- /** 视频元数据加载完成回调函数(仅 Pixel Streaming) */
20
- onLoadedMetadata?: () => void;
21
- /** 日志记录回调 **/
22
- onLog?: (data: any) => void;
23
- }
24
-
25
- export class InitAction extends Action {
26
- /**
27
- * 初始化三维通信
28
- * - 有 window.ue5:UE 内嵌浏览器,只绑定 ue.interface.return,不创建 video
29
- * - 无 window.ue5:Pixel Streaming,创建 peer-stream video
30
- * @returns Pixel Streaming 返回 video 元素;ue5 内嵌返回 null
31
- */
32
- static initVideo(options: InitVideoOptions): HTMLVideoElement | null {
33
- Action.setOnLog(options.onLog);
34
-
35
- const handleMessage = (raw: string) => {
36
- try {
37
- Action.handleIncomingRawMessage(raw, options.onMessage);
38
- } catch (error) {
39
- console.error("解析消息失败:", error);
40
- }
41
- };
42
-
43
- // UE 内嵌 WebBrowser:不创建 peer-stream,只挂回包
44
- if (typeof (window as any)?.ue5 === 'function') {
45
- const ue = (window as any)?.ue;
46
- if (ue?.interface) {
47
- ue.interface.return = handleMessage;
48
- } else {
49
- console.warn('initVideo: 已检测到 ue5,但未找到 ue.interface,回包可能无法接收');
50
- }
51
- return null;
52
- }
53
-
54
- // Pixel Streaming:创建 peer-stream video 元素
55
- const ps = document.createElement("video", { is: "peer-stream" }) as any;
56
-
57
- // 设置样式
58
- ps.style.width = "100%";
59
- ps.style.height = "100%";
60
- ps.style.backgroundRepeat = "no-repeat";
61
- ps.style.backgroundSize = "cover";
62
- ps.style.backgroundPosition = "center";
63
- ps.style.left = "0px";
64
- ps.style.top = "0px";
65
- ps.style.position = "absolute";
66
-
67
- // 设置 WebSocket 连接地址
68
- ps.id = options.wsUrl;
69
-
70
- // video 元素添加到容器
71
- options.container.appendChild(ps);
72
-
73
- // 注册键盘和鼠标事件
74
- if (ps.registerKeyboardEvents) {
75
- ps.registerKeyboardEvents();
76
- }
77
- if (ps.registerMouseHoverEvents) {
78
- ps.registerMouseHoverEvents();
79
- }
80
-
81
- // 监听消息事件
82
- ps.addEventListener("message", (e: any) => {
83
- handleMessage(e.detail);
84
- });
85
-
86
- // 监听元数据加载完成
87
- ps.addEventListener("loadedmetadata", () => {
88
- if (ps) {
89
- ps.style.objectFit = "fill";
90
- ps.style.width = "100%";
91
- ps.style.height = "100%";
92
- }
93
- options.onLoadedMetadata?.();
94
- });
95
-
96
- // 监听排队人数变化
97
- if (ps.ws && options.onQueueChange) {
98
- ps.ws.addEventListener('message', (e: MessageEvent) => {
99
- try {
100
- const data = JSON.parse(e.data);
101
- if (data.type === "playerqueue") {
102
- options.onQueueChange!(data.seq);
103
- }
104
- } catch (error) {
105
- // 忽略解析错误,可能不是 JSON 数据
106
- }
107
- });
108
- }
109
-
110
- // 监听播放开始事件
111
- if (options.onPlaying) {
112
- ps.addEventListener("playing", () => {
113
- options.onPlaying!();
114
- });
115
- }
116
-
117
- return ps;
118
- }
119
- }
1
+ /**
2
+ * 视频初始化操作方法
3
+ */
4
+ import { Action } from "./Action";
5
+ // 导入 peer-stream.js 以确保自定义元素在使用前被注册
6
+ import "../peer-stream.js";
7
+ // 初始化配置选项
8
+ export interface InitVideoOptions {
9
+ /** 视频容器元素(DOM元素或ref);ue5 内嵌模式可忽略 */
10
+ container: HTMLElement;
11
+ /** WebSocket连接地址;ue5 内嵌模式可忽略 */
12
+ wsUrl: string;
13
+ /** 消息回调函数 */
14
+ onMessage?: (data: any) => void;
15
+ /** 播放开始回调函数(仅 Pixel Streaming) */
16
+ onPlaying?: () => void;
17
+ /** 排队人数变化回调函数(仅 Pixel Streaming) */
18
+ onQueueChange?: (seq: number) => void;
19
+ /** 视频元数据加载完成回调函数(仅 Pixel Streaming) */
20
+ onLoadedMetadata?: () => void;
21
+ /** 日志记录回调 **/
22
+ onLog?: (data: any) => void;
23
+ }
24
+
25
+ export class InitAction extends Action {
26
+ /**
27
+ * 初始化三维通信
28
+ * - 有 window.ue5:UE 内嵌浏览器,只绑定 ue.interface.return,不创建 video
29
+ * - 无 window.ue5:Pixel Streaming,创建 peer-stream video
30
+ * @returns Pixel Streaming 返回 video 元素;ue5 内嵌返回 null
31
+ */
32
+ static initVideo(options: InitVideoOptions): HTMLVideoElement | null {
33
+ Action.setOnLog(options.onLog);
34
+
35
+ const handleMessage = (raw: string) => {
36
+ try {
37
+ Action.handleIncomingRawMessage(raw, options.onMessage);
38
+ } catch (error) {
39
+ console.error("解析消息失败:", error);
40
+ }
41
+ };
42
+
43
+
44
+ // UE 内嵌 WebBrowser / CEF:不创建 peer-stream,只挂回包
45
+ const isCefEnv = new URLSearchParams(window.location.search).get('env') === 'cef';
46
+ if (typeof (window as any)?.ue5 === 'function' || isCefEnv) {
47
+ const ue = (window as any)?.ue;
48
+ if (ue?.interface) {
49
+ ue.interface.return = handleMessage;
50
+ } else {
51
+ console.warn('initVideo: 已检测到 ue5,但未找到 ue.interface,回包可能无法接收');
52
+ }
53
+ return null;
54
+ }
55
+
56
+ // Pixel Streaming:创建 peer-stream video 元素
57
+ const ps = document.createElement("video", { is: "peer-stream" }) as any;
58
+
59
+ // 设置样式
60
+ ps.style.width = "100%";
61
+ ps.style.height = "100%";
62
+ ps.style.backgroundRepeat = "no-repeat";
63
+ ps.style.backgroundSize = "cover";
64
+ ps.style.backgroundPosition = "center";
65
+ ps.style.left = "0px";
66
+ ps.style.top = "0px";
67
+ ps.style.position = "absolute";
68
+
69
+ // 设置 WebSocket 连接地址
70
+ ps.id = options.wsUrl;
71
+
72
+ // 将 video 元素添加到容器
73
+ if (!options.container) return null;
74
+ options.container.appendChild(ps);
75
+
76
+ // 注册键盘和鼠标事件
77
+ if (ps.registerKeyboardEvents) {
78
+ ps.registerKeyboardEvents();
79
+ }
80
+ if (ps.registerMouseHoverEvents) {
81
+ ps.registerMouseHoverEvents();
82
+ }
83
+
84
+ // 监听消息事件
85
+ ps.addEventListener("message", (e: any) => {
86
+ handleMessage(e.detail);
87
+ });
88
+
89
+ // 监听元数据加载完成
90
+ ps.addEventListener("loadedmetadata", () => {
91
+ if (ps) {
92
+ ps.style.objectFit = "fill";
93
+ ps.style.width = "100%";
94
+ ps.style.height = "100%";
95
+ }
96
+ options.onLoadedMetadata?.();
97
+ });
98
+
99
+ // 监听排队人数变化
100
+ if (ps.ws && options.onQueueChange) {
101
+ ps.ws.addEventListener('message', (e: MessageEvent) => {
102
+ try {
103
+ const data = JSON.parse(e.data);
104
+ if (data.type === "playerqueue") {
105
+ options.onQueueChange!(data.seq);
106
+ }
107
+ } catch (error) {
108
+ // 忽略解析错误,可能不是 JSON 数据
109
+ }
110
+ });
111
+ }
112
+
113
+ // 监听播放开始事件
114
+ if (options.onPlaying) {
115
+ ps.addEventListener("playing", () => {
116
+ options.onPlaying!();
117
+ });
118
+ }
119
+
120
+ return ps;
121
+ }
122
+ }