yjz-web-sdk 1.0.6 → 1.0.7-beta.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/lib/composables/useMouseTouchControl.d.ts +0 -4
- package/lib/core/WebRTCSdk.d.ts +1 -0
- package/lib/core/data/MessageType.d.ts +5 -2
- package/lib/core/data/WebRtcError.d.ts +3 -1
- package/lib/core/data/WebrtcDataType.d.ts +7 -1
- package/lib/core/groupctrl/GroupControllerManager.d.ts +1 -0
- package/lib/core/groupctrl/SdkController.d.ts +1 -0
- package/lib/core/rtc/WebRTCConfig.d.ts +4 -0
- package/lib/core/signal/SignalingClient.d.ts +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/yjz-web-sdk.js +90 -123
- package/lib/yjz-web-sdk.umd.cjs +28 -29
- package/package.json +1 -1
- package/lib/composables/useDeviceMode.d.ts +0 -6
|
@@ -2,7 +2,6 @@ import type { Ref } from 'vue';
|
|
|
2
2
|
import { ChannelDataType } from "../core/data/WebrtcDataType.ts";
|
|
3
3
|
import type { Dimension } from "../components/RemotePlayer/index.ts";
|
|
4
4
|
interface MouseTouchControlOptions {
|
|
5
|
-
isMobile: Ref<boolean>;
|
|
6
5
|
remoteVideoElement: Ref<HTMLVideoElement | null>;
|
|
7
6
|
cloudDeviceSize: Ref<Dimension>;
|
|
8
7
|
streamAngle: Ref<number>;
|
|
@@ -12,9 +11,6 @@ interface MouseTouchControlOptions {
|
|
|
12
11
|
}
|
|
13
12
|
export default function useMouseTouchControl(options: MouseTouchControlOptions): {
|
|
14
13
|
isPointerDown: any;
|
|
15
|
-
onTouchStart: (e: TouchEvent) => void;
|
|
16
|
-
onTouchMove: (e: TouchEvent) => void;
|
|
17
|
-
onTouchEnd: (e: TouchEvent) => void;
|
|
18
14
|
handleMouseDown: (event: PointerEvent) => void;
|
|
19
15
|
handleMouseMove: (event: PointerEvent) => void;
|
|
20
16
|
handleMouseEnter: (event: PointerEvent) => void;
|
package/lib/core/WebRTCSdk.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare class WebRTCSdk extends EventEmitter {
|
|
|
11
11
|
constructor(options: WebRTCConfigOptions);
|
|
12
12
|
/** 开始连接 signal 服务 */
|
|
13
13
|
startConnection(): void;
|
|
14
|
+
switchControl(isControl: boolean): void;
|
|
14
15
|
/** 停止连接,并发送退出信令 */
|
|
15
16
|
stop(): void;
|
|
16
17
|
/** 开始推流:触发媒体采集与轨道添加 */
|
|
@@ -7,7 +7,9 @@ export declare enum MessageType {
|
|
|
7
7
|
NotAvailable = "NotAvailable",
|
|
8
8
|
Ping = "Ping",
|
|
9
9
|
Pong = "Pong",
|
|
10
|
-
SendScreenshot = "SendScreenshot"
|
|
10
|
+
SendScreenshot = "SendScreenshot",
|
|
11
|
+
KickOut = "KickOut",
|
|
12
|
+
Error = "Error"
|
|
11
13
|
}
|
|
12
14
|
export declare enum SendType {
|
|
13
15
|
SignIn = "SignIn",
|
|
@@ -17,7 +19,8 @@ export declare enum SendType {
|
|
|
17
19
|
IceCandidates = "IceCandidates",
|
|
18
20
|
Pong = "Pong",
|
|
19
21
|
Identity = "Web",
|
|
20
|
-
RequestScreenshot = "RequestScreenshot"
|
|
22
|
+
RequestScreenshot = "RequestScreenshot",
|
|
23
|
+
SwitchControl = "SwitchControl"
|
|
21
24
|
}
|
|
22
25
|
export declare enum IceConnectionState {
|
|
23
26
|
NEW = "new",
|
|
@@ -12,7 +12,9 @@ export declare enum FailCode {
|
|
|
12
12
|
CAMERA = 10011,
|
|
13
13
|
NOT_AVAILABLE = 10012,
|
|
14
14
|
DATACHANNEL_ERR = 10013,
|
|
15
|
-
STREAM_STATE = 10014
|
|
15
|
+
STREAM_STATE = 10014,
|
|
16
|
+
AUTH_FAILED = 10015,
|
|
17
|
+
KICK_OUT_ERR = 10016
|
|
16
18
|
}
|
|
17
19
|
export declare const FailInfoMap: Record<FailCode, {
|
|
18
20
|
type: string;
|
|
@@ -10,7 +10,8 @@ export declare enum ChannelDataType {
|
|
|
10
10
|
CloudClipData = "CloudClipData",
|
|
11
11
|
ActionCommandEvent = "ActionCommandEvent",
|
|
12
12
|
ActionUpdateCloudStatus = "ActionUpdateCloudStatus",
|
|
13
|
-
ActionGesture = "ActionGesture"
|
|
13
|
+
ActionGesture = "ActionGesture",
|
|
14
|
+
ActionTrack = "ActionTrack"
|
|
14
15
|
}
|
|
15
16
|
export declare enum ActionCommandEventValue {
|
|
16
17
|
ENABLE = "ENABLE",
|
|
@@ -93,6 +94,10 @@ export declare class WheelData {
|
|
|
93
94
|
axis: number;
|
|
94
95
|
constructor(axis: number);
|
|
95
96
|
}
|
|
97
|
+
export declare class TrackEventData {
|
|
98
|
+
visible: boolean;
|
|
99
|
+
constructor(visible: boolean);
|
|
100
|
+
}
|
|
96
101
|
/**
|
|
97
102
|
* KeyEventData - 键盘事件数据类,包含键码及修饰状态
|
|
98
103
|
*/
|
|
@@ -161,6 +166,7 @@ export declare class ChannelData {
|
|
|
161
166
|
*/
|
|
162
167
|
static clarity(data: any): ChannelData;
|
|
163
168
|
static switchAudio(data: any): ChannelData;
|
|
169
|
+
static changeSender(data: any): ChannelData;
|
|
164
170
|
}
|
|
165
171
|
export interface RTCStatsReportExtended extends RTCStatsReport {
|
|
166
172
|
get(id: string): RTCStats | undefined;
|
|
@@ -11,6 +11,7 @@ export declare class GroupControllerManager extends EventEmitter {
|
|
|
11
11
|
constructor(interval?: number, visibility?: VisibilityManager);
|
|
12
12
|
startControl(configMap: Map<string, WebRTCConfigOptions>): void;
|
|
13
13
|
switchToMain(newRoomId: string, oldRoomId: string): void;
|
|
14
|
+
switchControl(roomId: string, isControl: boolean): void;
|
|
14
15
|
/**
|
|
15
16
|
* 找到当前主控config, 设置为从控
|
|
16
17
|
*/
|
|
@@ -9,6 +9,7 @@ export declare class SdkController extends EventEmitter {
|
|
|
9
9
|
setIsControl(value: boolean): void;
|
|
10
10
|
start(): void;
|
|
11
11
|
stop(): void;
|
|
12
|
+
switchControl(isControl: boolean): void;
|
|
12
13
|
sendData(type: ChannelDataType, data: any): void;
|
|
13
14
|
sendControlData(key: number): void;
|
|
14
15
|
requestScreenshot(visible: boolean): void;
|
|
@@ -17,6 +17,8 @@ export interface WebRTCConfigOptions {
|
|
|
17
17
|
screenUrl?: string;
|
|
18
18
|
connectStatus?: number;
|
|
19
19
|
cloudName?: string;
|
|
20
|
+
token: string;
|
|
21
|
+
isGroup: boolean;
|
|
20
22
|
}
|
|
21
23
|
export declare class WebRTCConfig {
|
|
22
24
|
signalServerUrl: string;
|
|
@@ -33,5 +35,7 @@ export declare class WebRTCConfig {
|
|
|
33
35
|
screenshotWidth: number;
|
|
34
36
|
screenshotHeight: number;
|
|
35
37
|
screenshotQuality: number;
|
|
38
|
+
token: string;
|
|
39
|
+
isGroup: boolean;
|
|
36
40
|
constructor(options: WebRTCConfigOptions);
|
|
37
41
|
}
|
|
@@ -3,7 +3,6 @@ import type { WebRTCConfig } from "../rtc/WebRTCConfig.ts";
|
|
|
3
3
|
export declare class SignalingClient extends EventEmitter {
|
|
4
4
|
private config;
|
|
5
5
|
private webSocket;
|
|
6
|
-
private timeout;
|
|
7
6
|
constructor(config: WebRTCConfig);
|
|
8
7
|
/**
|
|
9
8
|
* 启动 WebSocket 连接,并注册各事件处理
|
|
@@ -19,6 +18,7 @@ export declare class SignalingClient extends EventEmitter {
|
|
|
19
18
|
*/
|
|
20
19
|
sendMessage(message: string): void;
|
|
21
20
|
sendSignInMessage(): void;
|
|
21
|
+
sendSwitchControlMessage(isCtrl: boolean): void;
|
|
22
22
|
/**
|
|
23
23
|
* 用于从控请求当前截屏
|
|
24
24
|
* @param visible 当前从控page控件是否可见
|
package/lib/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { WebRTCSdk } from './core/WebRTCSdk';
|
|
2
2
|
import { getKeyEventData } from "./core/util/KeyCodeUtil";
|
|
3
3
|
import { transformCoordinate, valueToPercentage } from "./core/util/ScreenControlUtil";
|
|
4
|
-
import { ActionType, ChannelDataType, ContainerDirection, InputData, KeyEventData, TouchData, WheelData, GestureData, type ActionCommand, ActionCommandType, ActionCommandEventType, ActionCommandEventValue } from "./core/data/WebrtcDataType";
|
|
4
|
+
import { ActionType, ChannelDataType, ContainerDirection, InputData, KeyEventData, TouchData, WheelData, GestureData, type ActionCommand, ActionCommandType, ActionCommandEventType, ActionCommandEventValue, TrackEventData } from "./core/data/WebrtcDataType";
|
|
5
5
|
import type { WebRTCConfigOptions } from './core/rtc/WebRTCConfig';
|
|
6
6
|
import { GroupControllerManager } from "./core/groupctrl/GroupControllerManager.ts";
|
|
7
7
|
import { EmitType } from "./core/data/WebRtcError";
|
|
8
8
|
import RemotePlayer from './components/RemotePlayer/index.vue';
|
|
9
|
-
export { WebRTCSdk, getKeyEventData, transformCoordinate, valueToPercentage, ActionType, ChannelDataType, InputData, KeyEventData, TouchData, ContainerDirection, EmitType, WheelData, GestureData, type ActionCommand, ActionCommandType, GroupControllerManager, type WebRTCConfigOptions, ActionCommandEventType, ActionCommandEventValue, RemotePlayer };
|
|
9
|
+
export { WebRTCSdk, getKeyEventData, transformCoordinate, valueToPercentage, ActionType, ChannelDataType, InputData, KeyEventData, TouchData, ContainerDirection, EmitType, WheelData, GestureData, type ActionCommand, ActionCommandType, GroupControllerManager, type WebRTCConfigOptions, ActionCommandEventType, ActionCommandEventValue, RemotePlayer, TrackEventData };
|
package/lib/yjz-web-sdk.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode(".vContainer[data-v-
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode(".vContainer[data-v-9773f56a]{transition:transform .2s linear;transform-origin:center center;margin:0;overflow:hidden}.flex[data-v-9773f56a]{display:flex}.flex-1[data-v-9773f56a]{flex:1 1 0}.items-center[data-v-9773f56a]{align-items:center}.justify-center[data-v-9773f56a]{justify-content:center}.video-control[data-v-9773f56a]{width:100%;height:100%;display:block;-webkit-user-select:none;user-select:none;object-fit:contain;clip-path:inset(0 1px);-webkit-user-drag:none;touch-action:none}.circle-cursor[data-v-9773f56a]{cursor:url(\"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20fill='none'%3e%3ccircle%20cx='12'%20cy='12'%20r='12'%20fill='%23fff'%20opacity='.6'/%3e%3ccircle%20cx='12'%20cy='12'%20r='10'%20fill='%23000'%20opacity='.6'/%3e%3c/svg%3e\") 12 12,auto}.triangle-cursor[data-v-9773f56a]{cursor:url(\"data:image/svg+xml,%3csvg%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20width='22'%20height='22'%3e%3cpath%20d='M143.832313%205.834982H143.686438A108.676545%20108.676545%200%200%200%205.834982%20143.686438l34.499333-11.815839-34.499333%2011.815839%200.072938%200.218812%200.145874%200.437624%200.583498%201.750494%202.333993%206.71023%208.752474%2025.528047L49.232663%20269.867929a2254749.467572%202254749.467572%200%200%201%20223.917444%20652.351017l9.335972%2027.205605%202.552804%207.585476%200.729373%202.188119a72.572592%2072.572592%200%200%200%20126.181491%2040.844876%2072.134968%2072.134968%200%200%200%2014.076895-18.963693c3.282178-6.41848%205.689108-13.639271%208.023101-20.3495l0.072937-0.291749%2072.572592-209.329989%2047.409231-136.830334%2015.53564-44.710551%200.145874-0.364687%200.510561-0.145874%2045.002301-15.900327%20137.486769-48.649165c99.340573-35.228705%20202.984445-71.989094%20209.913487-74.906584l3.355115-1.312871c8.023101-3.136303%2022.391744-8.606599%2033.915834-20.130689a72.499655%2072.499655%200%200%200%200-102.549813L999.240712%20304.877823c-1.823432-1.969307-7.293728-7.731351-13.274585-11.961714a89.056417%2089.056417%200%200%200-27.205605-12.3264h-0.145874l-2.552805-0.875247L948.184617%20277.161657l-27.86204-9.263034-94.672588-31.800653A405018.007245%20405018.007245%200%200%201%20268.919745%2048.138604L178.039896%2017.504947%20152.657723%208.752473%20145.874556%206.637292%20144.196999%205.90792%20143.832313%205.834982z'%20fill='%23000000'%20opacity='.7'%3e%3c/path%3e%3c/svg%3e\") 1 1,auto}.default-cursor[data-v-9773f56a]{cursor:default}.no-events[data-v-9773f56a]{pointer-events:none!important}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}}();
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
-
import {
|
|
5
|
+
import { computed, onMounted, onUnmounted, ref, onBeforeUnmount, defineComponent, toRefs, createElementBlock, openBlock, createElementVNode, normalizeStyle, unref, normalizeClass } from "vue";
|
|
6
6
|
function _mergeNamespaces(n, m) {
|
|
7
7
|
for (var i = 0; i < m.length; i++) {
|
|
8
8
|
const e = m[i];
|
|
@@ -200,6 +200,8 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
|
200
200
|
MessageType2["Ping"] = "Ping";
|
|
201
201
|
MessageType2["Pong"] = "Pong";
|
|
202
202
|
MessageType2["SendScreenshot"] = "SendScreenshot";
|
|
203
|
+
MessageType2["KickOut"] = "KickOut";
|
|
204
|
+
MessageType2["Error"] = "Error";
|
|
203
205
|
return MessageType2;
|
|
204
206
|
})(MessageType || {});
|
|
205
207
|
var SendType = /* @__PURE__ */ ((SendType2) => {
|
|
@@ -211,6 +213,7 @@ var SendType = /* @__PURE__ */ ((SendType2) => {
|
|
|
211
213
|
SendType2["Pong"] = "Pong";
|
|
212
214
|
SendType2["Identity"] = "Web";
|
|
213
215
|
SendType2["RequestScreenshot"] = "RequestScreenshot";
|
|
216
|
+
SendType2["SwitchControl"] = "SwitchControl";
|
|
214
217
|
return SendType2;
|
|
215
218
|
})(SendType || {});
|
|
216
219
|
var FailCode = /* @__PURE__ */ ((FailCode2) => {
|
|
@@ -228,6 +231,8 @@ var FailCode = /* @__PURE__ */ ((FailCode2) => {
|
|
|
228
231
|
FailCode2[FailCode2["NOT_AVAILABLE"] = 10012] = "NOT_AVAILABLE";
|
|
229
232
|
FailCode2[FailCode2["DATACHANNEL_ERR"] = 10013] = "DATACHANNEL_ERR";
|
|
230
233
|
FailCode2[FailCode2["STREAM_STATE"] = 10014] = "STREAM_STATE";
|
|
234
|
+
FailCode2[FailCode2["AUTH_FAILED"] = 10015] = "AUTH_FAILED";
|
|
235
|
+
FailCode2[FailCode2["KICK_OUT_ERR"] = 10016] = "KICK_OUT_ERR";
|
|
231
236
|
return FailCode2;
|
|
232
237
|
})(FailCode || {});
|
|
233
238
|
const FailInfoMap = {
|
|
@@ -278,7 +283,7 @@ const FailInfoMap = {
|
|
|
278
283
|
[
|
|
279
284
|
10012
|
|
280
285
|
/* NOT_AVAILABLE */
|
|
281
|
-
]: { type: "notAvailable", description: "
|
|
286
|
+
]: { type: "notAvailable", description: "网络环境异常" },
|
|
282
287
|
[
|
|
283
288
|
10013
|
|
284
289
|
/* DATACHANNEL_ERR */
|
|
@@ -286,7 +291,15 @@ const FailInfoMap = {
|
|
|
286
291
|
[
|
|
287
292
|
10014
|
|
288
293
|
/* STREAM_STATE */
|
|
289
|
-
]: { type: "stream_state", description: "webrtc统计信息获取失败" }
|
|
294
|
+
]: { type: "stream_state", description: "webrtc统计信息获取失败" },
|
|
295
|
+
[
|
|
296
|
+
10015
|
|
297
|
+
/* AUTH_FAILED */
|
|
298
|
+
]: { type: "auth_failed", description: "鉴权失败" },
|
|
299
|
+
[
|
|
300
|
+
10016
|
|
301
|
+
/* KICK_OUT_ERR */
|
|
302
|
+
]: { type: "kick_out_err", description: "被踢出投屏房间" }
|
|
290
303
|
};
|
|
291
304
|
function createWebRtcError(code, rawError) {
|
|
292
305
|
const info = FailInfoMap[code];
|
|
@@ -313,6 +326,7 @@ var EmitType = /* @__PURE__ */ ((EmitType2) => {
|
|
|
313
326
|
return EmitType2;
|
|
314
327
|
})(EmitType || {});
|
|
315
328
|
class SignalingClient extends EventEmitter {
|
|
329
|
+
// private timeout: ReturnType<typeof setTimeout> | null = null;
|
|
316
330
|
constructor(config) {
|
|
317
331
|
super();
|
|
318
332
|
// 私有属性 config,用于存储 WebRTC 配置信息
|
|
@@ -320,7 +334,6 @@ class SignalingClient extends EventEmitter {
|
|
|
320
334
|
// 根据实际情况替换为具体配置类型
|
|
321
335
|
// 私有属性 webSocket,用于存储 WebSocket 连接实例,初始值为 null
|
|
322
336
|
__publicField(this, "webSocket", null);
|
|
323
|
-
__publicField(this, "timeout", null);
|
|
324
337
|
this.config = config;
|
|
325
338
|
}
|
|
326
339
|
/**
|
|
@@ -330,12 +343,6 @@ class SignalingClient extends EventEmitter {
|
|
|
330
343
|
this.webSocket = new WebSocket(this.config.signalServerUrl);
|
|
331
344
|
this.webSocket.onopen = () => {
|
|
332
345
|
this.sendSignInMessage();
|
|
333
|
-
if (this.timeout === null) {
|
|
334
|
-
this.timeout = setTimeout(() => {
|
|
335
|
-
this.emit(EmitType.webrtcError, createWebRtcError(FailCode.NOT_AVAILABLE, ""));
|
|
336
|
-
this.timeout = null;
|
|
337
|
-
}, 4e3);
|
|
338
|
-
}
|
|
339
346
|
};
|
|
340
347
|
this.webSocket.onclose = () => {
|
|
341
348
|
this.webSocket = null;
|
|
@@ -345,12 +352,6 @@ class SignalingClient extends EventEmitter {
|
|
|
345
352
|
};
|
|
346
353
|
this.webSocket.onmessage = (event) => {
|
|
347
354
|
const message = JSON.parse(event.data);
|
|
348
|
-
if (message.type === MessageType.Offer) {
|
|
349
|
-
if (this.timeout) {
|
|
350
|
-
clearTimeout(this.timeout);
|
|
351
|
-
this.timeout = null;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
355
|
this.emit(EmitType.signalMessage, message);
|
|
355
356
|
};
|
|
356
357
|
}
|
|
@@ -388,6 +389,22 @@ class SignalingClient extends EventEmitter {
|
|
|
388
389
|
isControl: this.config.isControl ? "true" : "false",
|
|
389
390
|
screenshotWidth: this.config.screenshotWidth,
|
|
390
391
|
screenshotHeight: this.config.screenshotHeight,
|
|
392
|
+
screenshotQuality: this.config.screenshotQuality,
|
|
393
|
+
token: this.config.token,
|
|
394
|
+
isGroup: this.config.isGroup
|
|
395
|
+
};
|
|
396
|
+
const jsonMessage = JSON.stringify(message);
|
|
397
|
+
this.sendMessage(jsonMessage);
|
|
398
|
+
}
|
|
399
|
+
sendSwitchControlMessage(isCtrl) {
|
|
400
|
+
this.config.isControl = isCtrl;
|
|
401
|
+
const message = {
|
|
402
|
+
type: SendType.SwitchControl,
|
|
403
|
+
identity: SendType.Identity,
|
|
404
|
+
isControl: this.config.isControl ? "true" : "false",
|
|
405
|
+
roomId: this.config.roomId,
|
|
406
|
+
screenshotWidth: this.config.screenshotWidth,
|
|
407
|
+
screenshotHeight: this.config.screenshotHeight,
|
|
391
408
|
screenshotQuality: this.config.screenshotQuality
|
|
392
409
|
};
|
|
393
410
|
const jsonMessage = JSON.stringify(message);
|
|
@@ -3013,6 +3030,8 @@ class WebRTCConfig {
|
|
|
3013
3030
|
__publicField(this, "screenshotWidth");
|
|
3014
3031
|
__publicField(this, "screenshotHeight");
|
|
3015
3032
|
__publicField(this, "screenshotQuality");
|
|
3033
|
+
__publicField(this, "token");
|
|
3034
|
+
__publicField(this, "isGroup");
|
|
3016
3035
|
this.signalServerUrl = options.signalServerUrl || "";
|
|
3017
3036
|
this.myId = options.myId || "";
|
|
3018
3037
|
this.roomId = options.roomId || "";
|
|
@@ -3027,6 +3046,8 @@ class WebRTCConfig {
|
|
|
3027
3046
|
this.screenshotWidth = options.screenshotWidth || 144;
|
|
3028
3047
|
this.screenshotHeight = options.screenshotHeight || 256;
|
|
3029
3048
|
this.screenshotQuality = options.screenshotQuality || 20;
|
|
3049
|
+
this.token = options.token;
|
|
3050
|
+
this.isGroup = options.isGroup;
|
|
3030
3051
|
}
|
|
3031
3052
|
}
|
|
3032
3053
|
const setRemoteDescriptionWithHandleOffer = (peerConnection, sdp2, sendAnswer, onError) => {
|
|
@@ -3046,7 +3067,6 @@ const setLocalDescriptionWithCreateAnswer = (peerConnection, answer, sendAnswer,
|
|
|
3046
3067
|
const createPeerConnection = (config) => {
|
|
3047
3068
|
const iceServers = [
|
|
3048
3069
|
{ urls: config.stunServerUri },
|
|
3049
|
-
{ urls: config.stunServerUriAli },
|
|
3050
3070
|
{
|
|
3051
3071
|
urls: config.turnServerUri,
|
|
3052
3072
|
username: config.turnServerUserName,
|
|
@@ -3057,7 +3077,7 @@ const createPeerConnection = (config) => {
|
|
|
3057
3077
|
iceServers,
|
|
3058
3078
|
iceTransportPolicy: "all",
|
|
3059
3079
|
bundlePolicy: "max-bundle",
|
|
3060
|
-
|
|
3080
|
+
iceCandidatePoolSize: 4
|
|
3061
3081
|
};
|
|
3062
3082
|
return new RTCPeerConnection(peerConnectionConfig);
|
|
3063
3083
|
};
|
|
@@ -3115,6 +3135,7 @@ var ChannelDataType = /* @__PURE__ */ ((ChannelDataType2) => {
|
|
|
3115
3135
|
ChannelDataType2["ActionCommandEvent"] = "ActionCommandEvent";
|
|
3116
3136
|
ChannelDataType2["ActionUpdateCloudStatus"] = "ActionUpdateCloudStatus";
|
|
3117
3137
|
ChannelDataType2["ActionGesture"] = "ActionGesture";
|
|
3138
|
+
ChannelDataType2["ActionTrack"] = "ActionTrack";
|
|
3118
3139
|
return ChannelDataType2;
|
|
3119
3140
|
})(ChannelDataType || {});
|
|
3120
3141
|
var ActionCommandEventValue = /* @__PURE__ */ ((ActionCommandEventValue2) => {
|
|
@@ -3177,6 +3198,12 @@ class WheelData {
|
|
|
3177
3198
|
this.axis = axis;
|
|
3178
3199
|
}
|
|
3179
3200
|
}
|
|
3201
|
+
class TrackEventData {
|
|
3202
|
+
constructor(visible) {
|
|
3203
|
+
__publicField(this, "visible");
|
|
3204
|
+
this.visible = visible;
|
|
3205
|
+
}
|
|
3206
|
+
}
|
|
3180
3207
|
class KeyEventData {
|
|
3181
3208
|
constructor(keyCode, meta) {
|
|
3182
3209
|
__publicField(this, "keyCode");
|
|
@@ -3271,6 +3298,9 @@ class ChannelData {
|
|
|
3271
3298
|
static switchAudio(data) {
|
|
3272
3299
|
return new ChannelData("ActionCommandEvent", this.formatData(data));
|
|
3273
3300
|
}
|
|
3301
|
+
static changeSender(data) {
|
|
3302
|
+
return new ChannelData("ActionTrack", this.formatData(data));
|
|
3303
|
+
}
|
|
3274
3304
|
}
|
|
3275
3305
|
class WebRTCClient extends EventEmitter {
|
|
3276
3306
|
constructor(config) {
|
|
@@ -3346,6 +3376,9 @@ class WebRTCClient extends EventEmitter {
|
|
|
3346
3376
|
case ChannelDataType.ActionCommandEvent:
|
|
3347
3377
|
channelData = ChannelData.switchAudio(data);
|
|
3348
3378
|
break;
|
|
3379
|
+
case ChannelDataType.ActionTrack:
|
|
3380
|
+
channelData = ChannelData.changeSender(data);
|
|
3381
|
+
break;
|
|
3349
3382
|
}
|
|
3350
3383
|
if (channelData) {
|
|
3351
3384
|
const jsonString = JSON.stringify(channelData);
|
|
@@ -3652,6 +3685,16 @@ class WebRTCSdk extends EventEmitter {
|
|
|
3652
3685
|
const base64Str = `data:image/png;base64,${message.screenshot}`;
|
|
3653
3686
|
this.emit(EmitType.screenshot, { "room_id": this.config.roomId, "base64": base64Str });
|
|
3654
3687
|
break;
|
|
3688
|
+
case MessageType.KickOut:
|
|
3689
|
+
this.emit(EmitType.webrtcError, createWebRtcError(FailCode.KICK_OUT_ERR, ""));
|
|
3690
|
+
break;
|
|
3691
|
+
case MessageType.Error:
|
|
3692
|
+
if (message.error.includes("云手机没有就绪")) {
|
|
3693
|
+
this.emit(EmitType.webrtcError, createWebRtcError(FailCode.NOT_AVAILABLE, ""));
|
|
3694
|
+
} else if (message.error.includes("token 验证失败")) {
|
|
3695
|
+
this.emit(EmitType.webrtcError, createWebRtcError(FailCode.AUTH_FAILED, ""));
|
|
3696
|
+
}
|
|
3697
|
+
break;
|
|
3655
3698
|
}
|
|
3656
3699
|
});
|
|
3657
3700
|
/** 发送 Offer 信令 */
|
|
@@ -3730,6 +3773,9 @@ class WebRTCSdk extends EventEmitter {
|
|
|
3730
3773
|
startConnection() {
|
|
3731
3774
|
this.signalingClient.start();
|
|
3732
3775
|
}
|
|
3776
|
+
switchControl(isControl) {
|
|
3777
|
+
this.signalingClient.sendSwitchControlMessage(isControl);
|
|
3778
|
+
}
|
|
3733
3779
|
/** 停止连接,并发送退出信令 */
|
|
3734
3780
|
stop() {
|
|
3735
3781
|
this.sendSignOut();
|
|
@@ -4062,6 +4108,9 @@ class SdkController extends EventEmitter {
|
|
|
4062
4108
|
this.sdk.stop();
|
|
4063
4109
|
this.sdk.removeAllListeners();
|
|
4064
4110
|
}
|
|
4111
|
+
switchControl(isControl) {
|
|
4112
|
+
this.sdk.switchControl(isControl);
|
|
4113
|
+
}
|
|
4065
4114
|
sendData(type, data) {
|
|
4066
4115
|
if ((this.config.canOperate || this.config.isControl) && this.config.connectStatus === 1) {
|
|
4067
4116
|
this.sdk.sendChannelData(type, data);
|
|
@@ -4096,10 +4145,15 @@ class GroupControllerManager extends EventEmitter {
|
|
|
4096
4145
|
}
|
|
4097
4146
|
switchToMain(newRoomId, oldRoomId) {
|
|
4098
4147
|
if (newRoomId && oldRoomId) {
|
|
4099
|
-
this.
|
|
4100
|
-
this.
|
|
4148
|
+
this.switchControl(newRoomId, true);
|
|
4149
|
+
this.switchControl(oldRoomId, false);
|
|
4101
4150
|
}
|
|
4102
4151
|
}
|
|
4152
|
+
switchControl(roomId, isControl) {
|
|
4153
|
+
let ctrl = this.getController(roomId);
|
|
4154
|
+
ctrl == null ? void 0 : ctrl.setIsControl(isControl);
|
|
4155
|
+
ctrl == null ? void 0 : ctrl.switchControl(isControl);
|
|
4156
|
+
}
|
|
4103
4157
|
/**
|
|
4104
4158
|
* 找到当前主控config, 设置为从控
|
|
4105
4159
|
*/
|
|
@@ -4216,25 +4270,6 @@ class GroupControllerManager extends EventEmitter {
|
|
|
4216
4270
|
}
|
|
4217
4271
|
}
|
|
4218
4272
|
}
|
|
4219
|
-
function useDeviceMode() {
|
|
4220
|
-
const isMobile = ref(false);
|
|
4221
|
-
const checkDeviceMode = () => {
|
|
4222
|
-
isMobile.value = /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);
|
|
4223
|
-
};
|
|
4224
|
-
const checkTouchSupport = () => {
|
|
4225
|
-
if (navigator.maxTouchPoints > 0) {
|
|
4226
|
-
isMobile.value = true;
|
|
4227
|
-
}
|
|
4228
|
-
};
|
|
4229
|
-
const handleUp = () => {
|
|
4230
|
-
};
|
|
4231
|
-
return {
|
|
4232
|
-
isMobile,
|
|
4233
|
-
checkDeviceMode,
|
|
4234
|
-
checkTouchSupport,
|
|
4235
|
-
handleUp
|
|
4236
|
-
};
|
|
4237
|
-
}
|
|
4238
4273
|
function useCursorStyle(cursorType) {
|
|
4239
4274
|
return computed(() => {
|
|
4240
4275
|
switch (cursorType.value) {
|
|
@@ -4361,7 +4396,6 @@ function useRemoteVideo(videoContainer, remoteVideoElement, videoAngle, emit) {
|
|
|
4361
4396
|
}
|
|
4362
4397
|
function useMouseTouchControl(options) {
|
|
4363
4398
|
const {
|
|
4364
|
-
isMobile,
|
|
4365
4399
|
remoteVideoElement,
|
|
4366
4400
|
cloudDeviceSize,
|
|
4367
4401
|
streamAngle,
|
|
@@ -4373,8 +4407,6 @@ function useMouseTouchControl(options) {
|
|
|
4373
4407
|
const bound = ref(0);
|
|
4374
4408
|
const pointerList = ref(new Array(20).fill(0));
|
|
4375
4409
|
const pointerDownTime = ref(new Array(10).fill(0));
|
|
4376
|
-
const endX = ref(0);
|
|
4377
|
-
const endY = ref(0);
|
|
4378
4410
|
const handlePointerEvent = (event, action) => {
|
|
4379
4411
|
if (!remoteVideoElement.value) return;
|
|
4380
4412
|
const offsetTime = Math.trunc(event.timeStamp - pointerDownTime.value[0]);
|
|
@@ -4414,59 +4446,20 @@ function useMouseTouchControl(options) {
|
|
|
4414
4446
|
y
|
|
4415
4447
|
);
|
|
4416
4448
|
const touchData = new TouchData(action, 0, percentResult[0], percentResult[1], offsetTime);
|
|
4449
|
+
console.log("touchData", touchData);
|
|
4417
4450
|
emit("channelEvent", ChannelDataType.ClickData, touchData);
|
|
4418
4451
|
};
|
|
4419
|
-
const onTouchStart = (e) => {
|
|
4420
|
-
if (!isMobile.value) return;
|
|
4421
|
-
const touches = Array.from(e.touches);
|
|
4422
|
-
if (touches.length > 0) {
|
|
4423
|
-
pointerDownTime.value[0] = e.timeStamp;
|
|
4424
|
-
bound.value = Math.trunc(4 / widthRadio.value);
|
|
4425
|
-
endX.value = touches[0].clientX;
|
|
4426
|
-
endY.value = touches[0].clientY;
|
|
4427
|
-
const event = {
|
|
4428
|
-
clientX: endX.value,
|
|
4429
|
-
clientY: endY.value,
|
|
4430
|
-
timeStamp: e.timeStamp
|
|
4431
|
-
};
|
|
4432
|
-
handlePointerEvent(event, ActionType.ACTION_DOWN);
|
|
4433
|
-
}
|
|
4434
|
-
};
|
|
4435
|
-
const onTouchMove = (e) => {
|
|
4436
|
-
if (!isMobile.value) return;
|
|
4437
|
-
const touches = Array.from(e.touches);
|
|
4438
|
-
if (touches.length > 0) {
|
|
4439
|
-
endX.value = touches[0].clientX;
|
|
4440
|
-
endY.value = touches[0].clientY;
|
|
4441
|
-
const event = {
|
|
4442
|
-
clientX: endX.value,
|
|
4443
|
-
clientY: endY.value,
|
|
4444
|
-
timeStamp: e.timeStamp
|
|
4445
|
-
};
|
|
4446
|
-
handlePointerEvent(event, ActionType.ACTION_MOVE);
|
|
4447
|
-
}
|
|
4448
|
-
};
|
|
4449
|
-
const onTouchEnd = (e) => {
|
|
4450
|
-
if (!isMobile.value) return;
|
|
4451
|
-
const event = {
|
|
4452
|
-
clientX: endX.value,
|
|
4453
|
-
clientY: endY.value,
|
|
4454
|
-
timeStamp: e.timeStamp
|
|
4455
|
-
};
|
|
4456
|
-
handlePointerEvent(event, ActionType.ACTION_UP);
|
|
4457
|
-
};
|
|
4458
4452
|
const handleMouseDown = (event) => {
|
|
4459
|
-
if (isMobile.value) return;
|
|
4460
4453
|
isPointerDown.value = true;
|
|
4461
4454
|
if (remoteVideoElement.value) {
|
|
4462
4455
|
remoteVideoElement.value.setPointerCapture(event.pointerId);
|
|
4463
4456
|
}
|
|
4464
4457
|
pointerDownTime.value[0] = event.timeStamp;
|
|
4465
|
-
bound.value = Math.trunc(
|
|
4458
|
+
bound.value = Math.trunc(6 / widthRadio.value);
|
|
4466
4459
|
handlePointerEvent(event, ActionType.ACTION_DOWN);
|
|
4467
4460
|
};
|
|
4468
4461
|
const handleMouseMove = (event) => {
|
|
4469
|
-
if (
|
|
4462
|
+
if (!isPointerDown.value) return;
|
|
4470
4463
|
handlePointerEvent(event, ActionType.ACTION_MOVE);
|
|
4471
4464
|
if (!remoteVideoElement.value) {
|
|
4472
4465
|
return;
|
|
@@ -4478,7 +4471,7 @@ function useMouseTouchControl(options) {
|
|
|
4478
4471
|
}
|
|
4479
4472
|
};
|
|
4480
4473
|
const handleMouseUp = (event) => {
|
|
4481
|
-
if (
|
|
4474
|
+
if (!isPointerDown.value) return;
|
|
4482
4475
|
isPointerDown.value = false;
|
|
4483
4476
|
handlePointerEvent(event, ActionType.ACTION_UP);
|
|
4484
4477
|
if (remoteVideoElement.value) {
|
|
@@ -4486,14 +4479,13 @@ function useMouseTouchControl(options) {
|
|
|
4486
4479
|
}
|
|
4487
4480
|
};
|
|
4488
4481
|
const handleMouseEnter = (event) => {
|
|
4489
|
-
if (isMobile.value) return;
|
|
4490
4482
|
if (event.buttons === 1 && !isPointerDown.value) {
|
|
4491
4483
|
isPointerDown.value = true;
|
|
4492
4484
|
if (remoteVideoElement.value) {
|
|
4493
4485
|
remoteVideoElement.value.setPointerCapture(event.pointerId);
|
|
4494
4486
|
}
|
|
4495
4487
|
pointerDownTime.value[0] = event.timeStamp;
|
|
4496
|
-
bound.value = Math.trunc(
|
|
4488
|
+
bound.value = Math.trunc(6 / widthRadio.value);
|
|
4497
4489
|
handlePointerEvent(event, ActionType.ACTION_DOWN);
|
|
4498
4490
|
}
|
|
4499
4491
|
};
|
|
@@ -4513,9 +4505,6 @@ function useMouseTouchControl(options) {
|
|
|
4513
4505
|
};
|
|
4514
4506
|
return {
|
|
4515
4507
|
isPointerDown,
|
|
4516
|
-
onTouchStart,
|
|
4517
|
-
onTouchMove,
|
|
4518
|
-
onTouchEnd,
|
|
4519
4508
|
handleMouseDown,
|
|
4520
4509
|
handleMouseMove,
|
|
4521
4510
|
handleMouseEnter,
|
|
@@ -4566,12 +4555,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4566
4555
|
const { streamAngle, videoAngle, cursorType, cloudDeviceSize, disabled, bgColor } = toRefs(props);
|
|
4567
4556
|
const videoContainer = ref(null);
|
|
4568
4557
|
const remoteVideoElement = ref(null);
|
|
4569
|
-
const {
|
|
4570
|
-
isMobile,
|
|
4571
|
-
checkDeviceMode,
|
|
4572
|
-
checkTouchSupport,
|
|
4573
|
-
handleUp
|
|
4574
|
-
} = useDeviceMode();
|
|
4575
4558
|
const cursorClass = useCursorStyle(cursorType);
|
|
4576
4559
|
const {
|
|
4577
4560
|
videoSize,
|
|
@@ -4582,9 +4565,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4582
4565
|
stopPlay
|
|
4583
4566
|
} = useRemoteVideo(videoContainer, remoteVideoElement, videoAngle, emit);
|
|
4584
4567
|
const {
|
|
4585
|
-
onTouchStart,
|
|
4586
|
-
onTouchMove,
|
|
4587
|
-
onTouchEnd,
|
|
4588
4568
|
handleMouseDown,
|
|
4589
4569
|
handleMouseMove,
|
|
4590
4570
|
handleMouseEnter,
|
|
@@ -4592,7 +4572,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4592
4572
|
handleMouseLeave,
|
|
4593
4573
|
handleWheel
|
|
4594
4574
|
} = useMouseTouchControl({
|
|
4595
|
-
isMobile,
|
|
4596
4575
|
remoteVideoElement,
|
|
4597
4576
|
cloudDeviceSize,
|
|
4598
4577
|
streamAngle,
|
|
@@ -4612,17 +4591,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4612
4591
|
}
|
|
4613
4592
|
};
|
|
4614
4593
|
onMounted(() => {
|
|
4615
|
-
checkDeviceMode();
|
|
4616
|
-
window.addEventListener("resize", checkDeviceMode);
|
|
4617
|
-
window.addEventListener("pointerdown", checkTouchSupport);
|
|
4618
|
-
window.addEventListener("pointerup", handleUp);
|
|
4619
4594
|
document.addEventListener("click", handleClick);
|
|
4620
4595
|
initVideoContainer();
|
|
4621
4596
|
});
|
|
4622
4597
|
onUnmounted(() => {
|
|
4623
|
-
window.removeEventListener("resize", checkDeviceMode);
|
|
4624
|
-
window.removeEventListener("pointerdown", checkTouchSupport);
|
|
4625
|
-
window.removeEventListener("pointerup", handleUp);
|
|
4626
4598
|
document.removeEventListener("click", handleClick);
|
|
4627
4599
|
});
|
|
4628
4600
|
__expose({ startPlay, stopPlay });
|
|
@@ -4635,9 +4607,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4635
4607
|
}, [
|
|
4636
4608
|
createElementVNode("div", {
|
|
4637
4609
|
ref: "keyboardArea",
|
|
4638
|
-
onPointerenter: _cache[
|
|
4610
|
+
onPointerenter: _cache[6] || (_cache[6] = //@ts-ignore
|
|
4639
4611
|
(...args) => unref(startListening) && unref(startListening)(...args)),
|
|
4640
|
-
onPointerleave: _cache[
|
|
4612
|
+
onPointerleave: _cache[7] || (_cache[7] = //@ts-ignore
|
|
4641
4613
|
(...args) => unref(stopListening) && unref(stopListening)(...args)),
|
|
4642
4614
|
class: "vContainer",
|
|
4643
4615
|
style: normalizeStyle([{ height: unref(videoSize).height + "px", width: unref(videoSize).width + "px", transform: `rotate(${unref(videoAngle)}deg)` }, { "position": "relative", "overflow": "hidden" }])
|
|
@@ -4646,23 +4618,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
4646
4618
|
ref_key: "remoteVideoElement",
|
|
4647
4619
|
ref: remoteVideoElement,
|
|
4648
4620
|
class: normalizeClass(["video-control", [unref(cursorClass), { "no-events": unref(disabled) }]]),
|
|
4649
|
-
|
|
4650
|
-
(...args) => unref(onTouchStart) && unref(onTouchStart)(...args)),
|
|
4651
|
-
onTouchmove: _cache[1] || (_cache[1] = //@ts-ignore
|
|
4652
|
-
(...args) => unref(onTouchMove) && unref(onTouchMove)(...args)),
|
|
4653
|
-
onTouchend: _cache[2] || (_cache[2] = //@ts-ignore
|
|
4654
|
-
(...args) => unref(onTouchEnd) && unref(onTouchEnd)(...args)),
|
|
4655
|
-
onPointerenter: _cache[3] || (_cache[3] = //@ts-ignore
|
|
4621
|
+
onPointerenter: _cache[0] || (_cache[0] = //@ts-ignore
|
|
4656
4622
|
(...args) => unref(handleMouseEnter) && unref(handleMouseEnter)(...args)),
|
|
4657
|
-
onPointerdown: _cache[
|
|
4623
|
+
onPointerdown: _cache[1] || (_cache[1] = //@ts-ignore
|
|
4658
4624
|
(...args) => unref(handleMouseDown) && unref(handleMouseDown)(...args)),
|
|
4659
|
-
onPointermove: _cache[
|
|
4625
|
+
onPointermove: _cache[2] || (_cache[2] = //@ts-ignore
|
|
4660
4626
|
(...args) => unref(handleMouseMove) && unref(handleMouseMove)(...args)),
|
|
4661
|
-
onPointerup: _cache[
|
|
4627
|
+
onPointerup: _cache[3] || (_cache[3] = //@ts-ignore
|
|
4662
4628
|
(...args) => unref(handleMouseUp) && unref(handleMouseUp)(...args)),
|
|
4663
|
-
onPointerleave: _cache[
|
|
4629
|
+
onPointerleave: _cache[4] || (_cache[4] = //@ts-ignore
|
|
4664
4630
|
(...args) => unref(handleMouseLeave) && unref(handleMouseLeave)(...args)),
|
|
4665
|
-
onWheel: _cache[
|
|
4631
|
+
onWheel: _cache[5] || (_cache[5] = //@ts-ignore
|
|
4666
4632
|
(...args) => unref(handleWheel) && unref(handleWheel)(...args)),
|
|
4667
4633
|
style: normalizeStyle({ backgroundColor: `${unref(bgColor)}` }),
|
|
4668
4634
|
autoplay: "",
|
|
@@ -4682,7 +4648,7 @@ const _export_sfc = (sfc, props) => {
|
|
|
4682
4648
|
}
|
|
4683
4649
|
return target;
|
|
4684
4650
|
};
|
|
4685
|
-
const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4651
|
+
const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-9773f56a"]]);
|
|
4686
4652
|
export {
|
|
4687
4653
|
ActionCommandEventType,
|
|
4688
4654
|
ActionCommandEventValue,
|
|
@@ -4697,6 +4663,7 @@ export {
|
|
|
4697
4663
|
KeyEventData,
|
|
4698
4664
|
index as RemotePlayer,
|
|
4699
4665
|
TouchData,
|
|
4666
|
+
TrackEventData,
|
|
4700
4667
|
WebRTCSdk,
|
|
4701
4668
|
WheelData,
|
|
4702
4669
|
getKeyEventData,
|
package/lib/yjz-web-sdk.umd.cjs
CHANGED
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode(".vContainer[data-v-
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).YjzSDK={},e.Vue)}(this,(function(e,t){"use strict";var n=Object.defineProperty,r=(e,t,r)=>((e,t,r)=>t in e?n(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);function i(e,t){for(var n=0;n<t.length;n++){const r=t[n];if("string"!=typeof r&&!Array.isArray(r))for(const t in r)if("default"!==t&&!(t in e)){const n=Object.getOwnPropertyDescriptor(r,t);n&&Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>r[t]})}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}function o(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var s,a={exports:{}};var c=(s||(s=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new i(r,o||e,s),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],a]:e._events[c].push(a):(e._events[c]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,s=new Array(o);i<o;i++)s[i]=r[i].fn;return s},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,i,o,s){var a=n?n+e:e;if(!this._events[a])return!1;var c,d,l=this._events[a],p=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),p){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,i),!0;case 5:return l.fn.call(l.context,t,r,i,o),!0;case 6:return l.fn.call(l.context,t,r,i,o,s),!0}for(d=1,c=new Array(p-1);d<p;d++)c[d-1]=arguments[d];l.fn.apply(l.context,c)}else{var h,u=l.length;for(d=0;d<u;d++)switch(l[d].once&&this.removeListener(e,l[d].fn,void 0,!0),p){case 1:l[d].fn.call(l[d].context);break;case 2:l[d].fn.call(l[d].context,t);break;case 3:l[d].fn.call(l[d].context,t,r);break;case 4:l[d].fn.call(l[d].context,t,r,i);break;default:if(!c)for(h=1,c=new Array(p-1);h<p;h++)c[h-1]=arguments[h];l[d].fn.apply(l[d].context,c)}}return!0},a.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,i){var o=n?n+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||i&&!a.once||r&&a.context!==r||s(this,o);else{for(var c=0,d=[],l=a.length;c<l;c++)(a[c].fn!==t||i&&!a[c].once||r&&a[c].context!==r)&&d.push(a[c]);d.length?this._events[o]=1===d.length?d[0]:d:s(this,o)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&s(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(a)),a.exports);const d=o(c);var l=(e=>(e.Peers="Peers",e.Offer="Offer",e.Answer="Answer",e.IceCandidates="IceCandidates",e.SignOut="SignOut",e.NotAvailable="NotAvailable",e.Ping="Ping",e.Pong="Pong",e.SendScreenshot="SendScreenshot",e))(l||{}),p=(e=>(e.SignIn="SignIn",e.SignOut="SignOut",e.Answer="Answer",e.Offer="Offer",e.IceCandidates="IceCandidates",e.Pong="Pong",e.Identity="Web",e.RequestScreenshot="RequestScreenshot",e))(p||{}),h=(e=>(e[e.SOCKET=10001]="SOCKET",e[e.SOCKET_CLOSE=10002]="SOCKET_CLOSE",e[e.CREATE_OFFER=10003]="CREATE_OFFER",e[e.HANDLE_OFFER=10004]="HANDLE_OFFER",e[e.CREATE_ANSWER=10005]="CREATE_ANSWER",e[e.HANDLE_ANSWER=10006]="HANDLE_ANSWER",e[e.LOCAL_DES=10007]="LOCAL_DES",e[e.REMOTE_DES=10008]="REMOTE_DES",e[e.HANDLE_ICE=10009]="HANDLE_ICE",e[e.ICE_STATE=10010]="ICE_STATE",e[e.CAMERA=10011]="CAMERA",e[e.NOT_AVAILABLE=10012]="NOT_AVAILABLE",e[e.DATACHANNEL_ERR=10013]="DATACHANNEL_ERR",e[e.STREAM_STATE=10014]="STREAM_STATE",e))(h||{});const u={10001:{type:"socket",description:"WebSocket连接失败"},10002:{type:"socket_close",description:"WebSocket已关闭"},10003:{type:"createOffer",description:"创建offer失败"},10004:{type:"handleOffer",description:"处理offer失败"},10005:{type:"createAnswer",description:"创建answer失败"},10006:{type:"handleAnswer",description:"处理answer失败"},10007:{type:"setLocalDescription",description:"设置本地描述失败"},10008:{type:"setRemoteDescription",description:"设置远端描述失败"},10009:{type:"handleICE",description:"处理 ICE 失败"},10010:{type:"iceState",description:"ICE 状态异常"},10011:{type:"camera",description:"摄像头异常"},10012:{type:"notAvailable",description:"
|
|
1
|
+
!function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode(".vContainer[data-v-9773f56a]{transition:transform .2s linear;transform-origin:center center;margin:0;overflow:hidden}.flex[data-v-9773f56a]{display:flex}.flex-1[data-v-9773f56a]{flex:1 1 0}.items-center[data-v-9773f56a]{align-items:center}.justify-center[data-v-9773f56a]{justify-content:center}.video-control[data-v-9773f56a]{width:100%;height:100%;display:block;-webkit-user-select:none;user-select:none;object-fit:contain;clip-path:inset(0 1px);-webkit-user-drag:none;touch-action:none}.circle-cursor[data-v-9773f56a]{cursor:url(\"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20fill='none'%3e%3ccircle%20cx='12'%20cy='12'%20r='12'%20fill='%23fff'%20opacity='.6'/%3e%3ccircle%20cx='12'%20cy='12'%20r='10'%20fill='%23000'%20opacity='.6'/%3e%3c/svg%3e\") 12 12,auto}.triangle-cursor[data-v-9773f56a]{cursor:url(\"data:image/svg+xml,%3csvg%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20width='22'%20height='22'%3e%3cpath%20d='M143.832313%205.834982H143.686438A108.676545%20108.676545%200%200%200%205.834982%20143.686438l34.499333-11.815839-34.499333%2011.815839%200.072938%200.218812%200.145874%200.437624%200.583498%201.750494%202.333993%206.71023%208.752474%2025.528047L49.232663%20269.867929a2254749.467572%202254749.467572%200%200%201%20223.917444%20652.351017l9.335972%2027.205605%202.552804%207.585476%200.729373%202.188119a72.572592%2072.572592%200%200%200%20126.181491%2040.844876%2072.134968%2072.134968%200%200%200%2014.076895-18.963693c3.282178-6.41848%205.689108-13.639271%208.023101-20.3495l0.072937-0.291749%2072.572592-209.329989%2047.409231-136.830334%2015.53564-44.710551%200.145874-0.364687%200.510561-0.145874%2045.002301-15.900327%20137.486769-48.649165c99.340573-35.228705%20202.984445-71.989094%20209.913487-74.906584l3.355115-1.312871c8.023101-3.136303%2022.391744-8.606599%2033.915834-20.130689a72.499655%2072.499655%200%200%200%200-102.549813L999.240712%20304.877823c-1.823432-1.969307-7.293728-7.731351-13.274585-11.961714a89.056417%2089.056417%200%200%200-27.205605-12.3264h-0.145874l-2.552805-0.875247L948.184617%20277.161657l-27.86204-9.263034-94.672588-31.800653A405018.007245%20405018.007245%200%200%201%20268.919745%2048.138604L178.039896%2017.504947%20152.657723%208.752473%20145.874556%206.637292%20144.196999%205.90792%20143.832313%205.834982z'%20fill='%23000000'%20opacity='.7'%3e%3c/path%3e%3c/svg%3e\") 1 1,auto}.default-cursor[data-v-9773f56a]{cursor:default}.no-events[data-v-9773f56a]{pointer-events:none!important}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}}();
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).YjzSDK={},e.Vue)}(this,(function(e,t){"use strict";var n=Object.defineProperty,r=(e,t,r)=>((e,t,r)=>t in e?n(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);function i(e,t){for(var n=0;n<t.length;n++){const r=t[n];if("string"!=typeof r&&!Array.isArray(r))for(const t in r)if("default"!==t&&!(t in e)){const n=Object.getOwnPropertyDescriptor(r,t);n&&Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>r[t]})}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}function o(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var s,a={exports:{}};var c=(s||(s=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new i(r,o||e,s),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],a]:e._events[c].push(a):(e._events[c]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,s=new Array(o);i<o;i++)s[i]=r[i].fn;return s},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,i,o,s){var a=n?n+e:e;if(!this._events[a])return!1;var c,d,l=this._events[a],p=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),p){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,i),!0;case 5:return l.fn.call(l.context,t,r,i,o),!0;case 6:return l.fn.call(l.context,t,r,i,o,s),!0}for(d=1,c=new Array(p-1);d<p;d++)c[d-1]=arguments[d];l.fn.apply(l.context,c)}else{var h,u=l.length;for(d=0;d<u;d++)switch(l[d].once&&this.removeListener(e,l[d].fn,void 0,!0),p){case 1:l[d].fn.call(l[d].context);break;case 2:l[d].fn.call(l[d].context,t);break;case 3:l[d].fn.call(l[d].context,t,r);break;case 4:l[d].fn.call(l[d].context,t,r,i);break;default:if(!c)for(h=1,c=new Array(p-1);h<p;h++)c[h-1]=arguments[h];l[d].fn.apply(l[d].context,c)}}return!0},a.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,i){var o=n?n+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||i&&!a.once||r&&a.context!==r||s(this,o);else{for(var c=0,d=[],l=a.length;c<l;c++)(a[c].fn!==t||i&&!a[c].once||r&&a[c].context!==r)&&d.push(a[c]);d.length?this._events[o]=1===d.length?d[0]:d:s(this,o)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&s(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(a)),a.exports);const d=o(c);var l=(e=>(e.Peers="Peers",e.Offer="Offer",e.Answer="Answer",e.IceCandidates="IceCandidates",e.SignOut="SignOut",e.NotAvailable="NotAvailable",e.Ping="Ping",e.Pong="Pong",e.SendScreenshot="SendScreenshot",e.KickOut="KickOut",e.Error="Error",e))(l||{}),p=(e=>(e.SignIn="SignIn",e.SignOut="SignOut",e.Answer="Answer",e.Offer="Offer",e.IceCandidates="IceCandidates",e.Pong="Pong",e.Identity="Web",e.RequestScreenshot="RequestScreenshot",e.SwitchControl="SwitchControl",e))(p||{}),h=(e=>(e[e.SOCKET=10001]="SOCKET",e[e.SOCKET_CLOSE=10002]="SOCKET_CLOSE",e[e.CREATE_OFFER=10003]="CREATE_OFFER",e[e.HANDLE_OFFER=10004]="HANDLE_OFFER",e[e.CREATE_ANSWER=10005]="CREATE_ANSWER",e[e.HANDLE_ANSWER=10006]="HANDLE_ANSWER",e[e.LOCAL_DES=10007]="LOCAL_DES",e[e.REMOTE_DES=10008]="REMOTE_DES",e[e.HANDLE_ICE=10009]="HANDLE_ICE",e[e.ICE_STATE=10010]="ICE_STATE",e[e.CAMERA=10011]="CAMERA",e[e.NOT_AVAILABLE=10012]="NOT_AVAILABLE",e[e.DATACHANNEL_ERR=10013]="DATACHANNEL_ERR",e[e.STREAM_STATE=10014]="STREAM_STATE",e[e.AUTH_FAILED=10015]="AUTH_FAILED",e[e.KICK_OUT_ERR=10016]="KICK_OUT_ERR",e))(h||{});const u={10001:{type:"socket",description:"WebSocket连接失败"},10002:{type:"socket_close",description:"WebSocket已关闭"},10003:{type:"createOffer",description:"创建offer失败"},10004:{type:"handleOffer",description:"处理offer失败"},10005:{type:"createAnswer",description:"创建answer失败"},10006:{type:"handleAnswer",description:"处理answer失败"},10007:{type:"setLocalDescription",description:"设置本地描述失败"},10008:{type:"setRemoteDescription",description:"设置远端描述失败"},10009:{type:"handleICE",description:"处理 ICE 失败"},10010:{type:"iceState",description:"ICE 状态异常"},10011:{type:"camera",description:"摄像头异常"},10012:{type:"notAvailable",description:"网络环境异常"},10013:{type:"datachannel_err",description:"信令通道错误"},10014:{type:"stream_state",description:"webrtc统计信息获取失败"},10015:{type:"auth_failed",description:"鉴权失败"},10016:{type:"kick_out_err",description:"被踢出投屏房间"}};function f(e,t){const n=u[e];return{code:e,type:n.type,message:n.description,rawError:t}}var m=(e=>(e.signalMessage="signalMessage",e.webrtcError="webrtcError",e.sendAnswer="sendAnswer",e.sendOffer="sendOffer",e.sendICEMessage="sendICEMessage",e.streamTrack="streamTrack",e.iceConnectionState="iceConnectionState",e.cloudStatusChanged="cloudStatusChanged",e.statisticInfo="statisticInfo",e.cloudClipData="cloudClipData",e.screenshot="screenshot",e.groupError="groupError",e))(m||{});class C extends d{
|
|
3
|
+
// private timeout: ReturnType<typeof setTimeout> | null = null;
|
|
4
|
+
constructor(e){super(),
|
|
3
5
|
// 私有属性 config,用于存储 WebRTC 配置信息
|
|
4
6
|
r(this,"config"),
|
|
5
7
|
// 根据实际情况替换为具体配置类型
|
|
6
8
|
// 私有属性 webSocket,用于存储 WebSocket 连接实例,初始值为 null
|
|
7
|
-
r(this,"webSocket",null),
|
|
9
|
+
r(this,"webSocket",null),this.config=e}
|
|
8
10
|
/**
|
|
9
11
|
* 启动 WebSocket 连接,并注册各事件处理
|
|
10
|
-
*/start(){this.webSocket=new WebSocket(this.config.signalServerUrl),this.webSocket.onopen=()=>{this.sendSignInMessage()
|
|
12
|
+
*/start(){this.webSocket=new WebSocket(this.config.signalServerUrl),this.webSocket.onopen=()=>{this.sendSignInMessage()},this.webSocket.onclose=()=>{this.webSocket=null},this.webSocket.onerror=e=>{this.emit(m.webrtcError,f(h.SOCKET,e))},this.webSocket.onmessage=e=>{const t=JSON.parse(e.data);this.emit(m.signalMessage,t)}}
|
|
11
13
|
/**
|
|
12
14
|
* 关闭 WebSocket 连接,并通知外部
|
|
13
15
|
*/close(){this.webSocket&&(this.webSocket.onopen=null,this.webSocket.onmessage=null,this.webSocket.onerror=null,this.webSocket.onclose=null,this.webSocket.readyState!==WebSocket.OPEN&&this.webSocket.readyState!==WebSocket.CONNECTING||this.webSocket.close(1e3,"Normal Closure"),this.webSocket=null),this.removeAllListeners()}
|
|
14
16
|
/**
|
|
15
17
|
* 发送消息到服务端
|
|
16
18
|
* @param message - 消息字符串
|
|
17
|
-
*/sendMessage(e){this.webSocket&&this.webSocket.readyState===WebSocket.OPEN&&this.webSocket.send(e)}sendSignInMessage(){const e={type:p.SignIn,identity:p.Identity,turnServerUri:this.config.turnServerUri,roomId:this.config.roomId,isControl:this.config.isControl?"true":"false",screenshotWidth:this.config.screenshotWidth,screenshotHeight:this.config.screenshotHeight,screenshotQuality:this.config.screenshotQuality},t=JSON.stringify(e);this.sendMessage(t)}
|
|
19
|
+
*/sendMessage(e){this.webSocket&&this.webSocket.readyState===WebSocket.OPEN&&this.webSocket.send(e)}sendSignInMessage(){const e={type:p.SignIn,identity:p.Identity,turnServerUri:this.config.turnServerUri,roomId:this.config.roomId,isControl:this.config.isControl?"true":"false",screenshotWidth:this.config.screenshotWidth,screenshotHeight:this.config.screenshotHeight,screenshotQuality:this.config.screenshotQuality,token:this.config.token,isGroup:this.config.isGroup},t=JSON.stringify(e);this.sendMessage(t)}sendSwitchControlMessage(e){this.config.isControl=e;const t={type:p.SwitchControl,identity:p.Identity,isControl:this.config.isControl?"true":"false",roomId:this.config.roomId,screenshotWidth:this.config.screenshotWidth,screenshotHeight:this.config.screenshotHeight,screenshotQuality:this.config.screenshotQuality},n=JSON.stringify(t);this.sendMessage(n)}
|
|
18
20
|
/**
|
|
19
21
|
* 用于从控请求当前截屏
|
|
20
22
|
* @param visible 当前从控page控件是否可见
|
|
21
|
-
*/sendRequestScreenshot(e){const t={type:p.RequestScreenshot,visible:e,roomId:this.config.roomId},n=JSON.stringify(t);this.sendMessage(n)}}let g=!0,
|
|
23
|
+
*/sendRequestScreenshot(e){const t={type:p.RequestScreenshot,visible:e,roomId:this.config.roomId},n=JSON.stringify(t);this.sendMessage(n)}}let g=!0,y=!0;function v(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseFloat(r[n],10)}function S(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function T(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(g=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function R(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(y=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function b(){if("object"==typeof window){if(g)return;"undefined"!=typeof console&&console.log}}function w(e){return"[object Object]"===Object.prototype.toString.call(e)}function P(e){return w(e)?Object.keys(e).reduce((function(t,n){const r=w(e[n]),i=r?P(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function E(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?E(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{E(e,e.get(t),n)}))})))}function k(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&E(e,n,i)}))})),i}const _=b;function A(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),_("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return _("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function O(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function I(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else S(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function D(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function M(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>
|
|
22
24
|
/* Note: this will include stats of all senders that
|
|
23
25
|
* send a track with the same id as sender.track as
|
|
24
26
|
* it is not possible to identify the RTCRtpSender.
|
|
25
|
-
*/k(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),S(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>k(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function x(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function L(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return x(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function N(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function j(e,t){S(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}const U=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:j,shimAddTrackRemoveTrack:L,shimAddTrackRemoveTrackWithNative:x,shimGetSendersWithDtmf:D,shimGetUserMedia:A,shimMediaStream:O,shimOnTrack:I,shimPeerConnection:N,shimSenderReceiverGetStats:M},Symbol.toStringTag,{value:"Module"}));function F(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function V(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function z(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(r){if("TypeError"!==r.name)throw r;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function K(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function W(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),S(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function B(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function J(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function G(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||// Avoid being fooled by patched getParameters() below.
|
|
26
|
-
1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function
|
|
27
|
+
*/k(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),S(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>k(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function x(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function L(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return x(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function N(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function j(e,t){S(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}const U=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:j,shimAddTrackRemoveTrack:L,shimAddTrackRemoveTrackWithNative:x,shimGetSendersWithDtmf:D,shimGetUserMedia:A,shimMediaStream:O,shimOnTrack:I,shimPeerConnection:N,shimSenderReceiverGetStats:M},Symbol.toStringTag,{value:"Module"}));function F(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function V(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function K(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(r){if("TypeError"!==r.name)throw r;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function z(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function W(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),S(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function B(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function G(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function H(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||// Avoid being fooled by patched getParameters() below.
|
|
28
|
+
1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function J(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function q(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function Q(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}const $=Object.freeze(Object.defineProperty({__proto__:null,shimAddTransceiver:H,shimCreateAnswer:Q,shimCreateOffer:q,shimGetDisplayMedia:function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})},shimGetParameters:J,shimGetUserMedia:F,shimOnTrack:V,shimPeerConnection:K,shimRTCDataChannel:G,shimReceiverGetStats:W,shimRemoveStream:B,shimSenderGetStats:z},Symbol.toStringTag,{value:"Module"}));function Y(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function X(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function Z(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function ee(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(te(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function te(e){return e&&void 0!==e.video?Object.assign({},e,{video:P(e.video)}):e}function ne(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;n<e.iceServers.length;n++){let r=e.iceServers[n];void 0===r.urls&&r.url?(r=JSON.parse(JSON.stringify(r)),r.urls=r.url,delete r.url,t.push(r)):t.push(e.iceServers[n])}e.iceServers=t}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function re(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function ie(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function oe(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}const se=Object.freeze(Object.defineProperty({__proto__:null,shimAudioContext:oe,shimCallbacksAPI:Z,shimConstraints:te,shimCreateOfferLegacy:ie,shimGetUserMedia:ee,shimLocalStreamsAPI:Y,shimRTCIceServerUrls:ne,shimRemoteStreamsAPI:X,shimTrackEventTransceiver:re},Symbol.toStringTag,{value:"Module"}));var ae,ce={exports:{}};var de=(ae||(ae=1,function(e){const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},t.getDescription=function(e){const n=t.splitSections(e);return n&&n[0]},t.getMediaSections=function(e){const n=t.splitSections(e);return n.shift(),n},t.matchPrefix=function(e,n){return t.splitLines(e).filter((e=>0===e.indexOf(n)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],
|
|
27
29
|
// address is an alias for ip.
|
|
28
30
|
port:parseInt(t[5],10),
|
|
29
31
|
// skip parts[6] == 'typ'
|
|
30
32
|
type:t[7]};for(let r=8;r<t.length;r+=2)switch(t[r]){case"raddr":n.relatedAddress=t[r+1];break;case"rport":n.relatedPort=parseInt(t[r+1],10);break;case"tcptype":n.tcpType=t[r+1];break;case"ufrag":n.ufrag=t[r+1],n.usernameFragment=t[r+1];break;default:void 0===n[t[r]]&&(n[t[r]]=t[r+1])}return n},t.writeCandidate=function(e){const t=[];t.push(e.foundation);const n=e.component;"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);const r=e.type;return t.push("typ"),t.push(r),"host"!==r&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},t.parseIceOptions=function(e){return e.substring(14).split(" ")},t.parseRtpMap=function(e){let t=e.substring(9).split(" ");const n={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),n.name=t[0],n.clockRate=parseInt(t[1],10),n.channels=3===t.length?parseInt(t[2],10):1,n.numChannels=n.channels,n},t.writeRtpMap=function(e){let t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);const n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},t.parseExtmap=function(e){const t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let n;const r=e.substring(e.indexOf(" ")+1).split(";");for(let i=0;i<r.length;i++)n=r[i].trim().split("="),t[n[0].trim()]=n[1];return t},t.writeFmtp=function(e){let t="",n=e.payloadType;if(void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){const r=[];Object.keys(e.parameters).forEach((t=>{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)})),t+="a=fmtp:"+n+" "+r.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const n=t.matchPrefix(e,"a=mid:")[0];if(n)return n.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),
|
|
31
33
|
// algorithm is case-sensitive in Edge.
|
|
32
|
-
value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let o=3;o<r.length;o++){const i=r[o],s=t.matchPrefix(e,"a=rtpmap:"+i+" ")[0];if(s){const r=t.parseRtpMap(s),o=t.matchPrefix(e,"a=fmtp:"+i+" ");switch(r.parameters=o.length?t.parseFmtp(o[0]):{},r.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+i+" ").map(t.parseRtcpFb),n.codecs.push(r),r.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(r.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const d=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));d.length>0&&d[0].length>1&&d[0][0]===a&&(c=d[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;return i=e||t.generateSessionId(),"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let t=0;t<r.length;t++)switch(r[t]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[t].substring(2)}return n?t.getDirection(n):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const n=t.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}},t.parseOLine=function(e){const n=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:n[0],sessionId:n[1],sessionVersion:parseInt(n[2],10),netType:n[3],addressType:n[4],address:n[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const n=t.splitLines(e);for(let t=0;t<n.length;t++)if(n[t].length<2||"="!==n[t].charAt(1))return!1;return!0},e.exports=t}(ce)),ce.exports);const le=o(de),pe=i({__proto__:null,default:le},[de]);function he(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=le.parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,S(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function ue(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||S(e,"icecandidate",(e=>{if(e.candidate){const t=le.parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function fe(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=le.splitSections(e.sdp);return t.shift(),t.some((e=>{const t=le.parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=le.matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function me(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},S(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function Ce(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function ge(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t._safariVersion>=13.1)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function ve(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function ye(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const Se=Object.freeze(Object.defineProperty({__proto__:null,removeExtmapAllowMixed:ge,shimAddIceCandidateNullOrEmpty:ve,shimConnectionState:Ce,shimMaxMessageSize:fe,shimParameterlessSetLocalDescription:ye,shimRTCIceCandidate:he,shimRTCIceCandidateRelayProtocol:ue,shimSendThrowTypeError:me},Symbol.toStringTag,{value:"Module"}));!function({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const n=b,r=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.userAgentData&&n.userAgentData.brands){const e=n.userAgentData.brands.find((e=>"Chromium"===e.brand));if(e)return{browser:"chrome",version:parseInt(e.version,10)}}if(n.mozGetUserMedia)t.browser="firefox",t.version=parseInt(y(n.userAgent,/Firefox\/(\d+)\./,1));else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=parseInt(y(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2));else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=parseInt(y(n.userAgent,/AppleWebKit\/(\d+)\./,1)),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype,t._safariVersion=y(n.userAgent,/Version\/(\d+(\.?\d+))/,1)}return t}(e),i={browserDetails:r,commonShim:Se,extractVersion:y,disableLog:T,disableWarnings:R,
|
|
34
|
+
value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let o=3;o<r.length;o++){const i=r[o],s=t.matchPrefix(e,"a=rtpmap:"+i+" ")[0];if(s){const r=t.parseRtpMap(s),o=t.matchPrefix(e,"a=fmtp:"+i+" ");switch(r.parameters=o.length?t.parseFmtp(o[0]):{},r.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+i+" ").map(t.parseRtcpFb),n.codecs.push(r),r.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(r.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const d=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));d.length>0&&d[0].length>1&&d[0][0]===a&&(c=d[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;return i=e||t.generateSessionId(),"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let t=0;t<r.length;t++)switch(r[t]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[t].substring(2)}return n?t.getDirection(n):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const n=t.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}},t.parseOLine=function(e){const n=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:n[0],sessionId:n[1],sessionVersion:parseInt(n[2],10),netType:n[3],addressType:n[4],address:n[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const n=t.splitLines(e);for(let t=0;t<n.length;t++)if(n[t].length<2||"="!==n[t].charAt(1))return!1;return!0},e.exports=t}(ce)),ce.exports);const le=o(de),pe=i({__proto__:null,default:le},[de]);function he(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=le.parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,S(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function ue(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||S(e,"icecandidate",(e=>{if(e.candidate){const t=le.parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function fe(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=le.splitSections(e.sdp);return t.shift(),t.some((e=>{const t=le.parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=le.matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function me(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},S(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function Ce(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function ge(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t._safariVersion>=13.1)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function ye(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function ve(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const Se=Object.freeze(Object.defineProperty({__proto__:null,removeExtmapAllowMixed:ge,shimAddIceCandidateNullOrEmpty:ye,shimConnectionState:Ce,shimMaxMessageSize:fe,shimParameterlessSetLocalDescription:ve,shimRTCIceCandidate:he,shimRTCIceCandidateRelayProtocol:ue,shimSendThrowTypeError:me},Symbol.toStringTag,{value:"Module"}));!function({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const n=b,r=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.userAgentData&&n.userAgentData.brands){const e=n.userAgentData.brands.find((e=>"Chromium"===e.brand));if(e)return{browser:"chrome",version:parseInt(e.version,10)}}if(n.mozGetUserMedia)t.browser="firefox",t.version=parseInt(v(n.userAgent,/Firefox\/(\d+)\./,1));else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=parseInt(v(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2));else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=parseInt(v(n.userAgent,/AppleWebKit\/(\d+)\./,1)),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype,t._safariVersion=v(n.userAgent,/Version\/(\d+(\.?\d+))/,1)}return t}(e),i={browserDetails:r,commonShim:Se,extractVersion:v,disableLog:T,disableWarnings:R,
|
|
33
35
|
// Expose sdp as a convenience. For production apps include directly.
|
|
34
|
-
sdp:pe};switch(r.browser){case"chrome":if(!U||!N||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),i;if(null===r.version)return n("Chrome shim can not determine version, not shimming."),i;n("adapter.js shimming chrome."),i.browserShim=U,
|
|
36
|
+
sdp:pe};switch(r.browser){case"chrome":if(!U||!N||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),i;if(null===r.version)return n("Chrome shim can not determine version, not shimming."),i;n("adapter.js shimming chrome."),i.browserShim=U,ye(e,r),ve(e),A(e,r),O(e),N(e,r),I(e),L(e,r),D(e),M(e),j(e,r),he(e),ue(e),Ce(e),fe(e,r),me(e),ge(e,r);break;case"firefox":if(!$||!K||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),i;n("adapter.js shimming firefox."),i.browserShim=$,ye(e,r),ve(e),F(e,r),K(e,r),V(e),B(e),z(e),W(e),G(e),H(e),J(e),q(e),Q(e),he(e),Ce(e),fe(e,r),me(e);break;case"safari":if(!se||!t.shimSafari)return n("Safari shim is not included in this adapter release."),i;n("adapter.js shimming safari."),i.browserShim=se,ye(e,r),ve(e),ne(e),ie(e),Z(e),Y(e),X(e),re(e),ee(e),oe(e),he(e),ue(e),fe(e,r),me(e),ge(e,r);break;default:n("Unsupported browser!")}}({window:"undefined"==typeof window?void 0:window});class Te{constructor(e){r(this,"signalServerUrl"),r(this,"myId"),r(this,"roomId"),r(this,"targetId"),r(this,"stunServerUri"),r(this,"stunServerUriAli"),r(this,"stunServerUriTel"),r(this,"turnServerUri"),r(this,"turnServerUserName"),r(this,"turnServerPassword"),r(this,"isControl"),r(this,"screenshotWidth"),r(this,"screenshotHeight"),r(this,"screenshotQuality"),r(this,"token"),r(this,"isGroup"),this.signalServerUrl=e.signalServerUrl||"",this.myId=e.myId||"",this.roomId=e.roomId||"",this.targetId=e.targetId||"",this.stunServerUri=e.stunServerUri||"stun:stun.l.google.com:19302",this.stunServerUriAli=e.stunServerUriAli||"stun:stun.middle.aliyun.com:3478",this.stunServerUriTel=e.stunServerUriTel||"stun:stun.qq.com:3478",this.turnServerUri=e.turnServerUri||"turn:121.37.25.106:3478",this.turnServerUserName=e.turnServerUserName||"yangyj",this.turnServerPassword=e.turnServerPassword||"hb@2025@168",this.isControl=e.isControl??!0,this.screenshotWidth=e.screenshotWidth||144,this.screenshotHeight=e.screenshotHeight||256,this.screenshotQuality=e.screenshotQuality||20,this.token=e.token,this.isGroup=e.isGroup}}const Re=(e,t,n)=>{e.createAnswer().then((r=>be(e,r,t,n))).catch((e=>null==n?void 0:n(f(h.CREATE_ANSWER,e))))},be=(e,t,n,r)=>{e.setLocalDescription(t).then((()=>{null==n||n(t.sdp??"")})).catch((e=>{null==r||r(f(h.LOCAL_DES,e))}))},we=(e,t,n)=>{e.createOffer().then((r=>Pe(e,r,t,n))).catch((e=>null==n?void 0:n(f(h.CREATE_OFFER,e))))},Pe=(e,t,n,r)=>{e.setLocalDescription(t).then((()=>n(t.sdp??""))).catch((e=>null==r?void 0:r(f(h.LOCAL_DES,e))))};var Ee=(e=>(e.ClickData="ClickData",e.ClipboardData="ClipboardData",e.ActionCommand="ActionCommand",e.ActionInput="ActionInput",e.ActionChinese="ActionChinese",e.ActionRequestCloudDeviceInfo="ActionRequestCloudDeviceInfo",e.ActionClarity="ActionClarity",e.ActionWheel="ActionWheel",e.CloudClipData="CloudClipData",e.ActionCommandEvent="ActionCommandEvent",e.ActionUpdateCloudStatus="ActionUpdateCloudStatus",e.ActionGesture="ActionGesture",e.ActionTrack="ActionTrack",e))(Ee||{}),ke=(e=>(e.ENABLE="ENABLE",e.DISABLE="DISABLE",e))(ke||{}),_e=(e=>(e.ActionBack="ActionBack",e.ActionHome="ActionHome",e.ActionRecent="ActionRecent",e.ActionSwitchNavButtons="ActionSwitchNavButtons",e.ActionSwitchNavGestural="ActionSwitchNavGestural",e))(_e||{}),Ae=(e=>(e.ACTION_CONTROL_VIDEO_AND_AUDIO="ACTION_CONTROL_VIDEO_AND_AUDIO",e.ACTION_CONTROL_VIDEO="ACTION_CONTROL_VIDEO",e.ACTION_CONTROL_AUDIO="ACTION_CONTROL_AUDIO",e))(Ae||{});const Oe={ACTION_DOWN:0,ACTION_MOVE:2,ACTION_UP:1},Ie={ROTATION_0:0,ROTATION_180:2},De={Vertical:0,Horizontal:1};class Me{constructor(e,t,n,i,o,s="adb"){r(this,"action"),r(this,"p"),r(this,"x"),r(this,"y"),r(this,"offsetTime"),r(this,"type"),this.action=e,this.p=t,this.x=n,this.y=i,this.offsetTime=o,this.type=s}}class xe{constructor(e){r(this,"axis"),this.axis=e}}class Le{constructor(e,t){r(this,"keyCode"),r(this,"meta"),this.keyCode=e,this.meta=t}}class Ne{constructor(e,t=null){r(this,"type"),r(this,"data"),this.type=e,this.data=t}toString(){return JSON.stringify({type:this.type,data:this.data})}
|
|
35
37
|
/**
|
|
36
38
|
* 格式化数据
|
|
37
39
|
* 如果数据已经是字符串,则直接返回;否则使用 JSON.stringify() 转换为字符串
|
|
@@ -68,21 +70,21 @@ sdp:pe};switch(r.browser){case"chrome":if(!U||!N||!t.shimChrome)return n("Chrome
|
|
|
68
70
|
/**
|
|
69
71
|
* 生成清晰度数据(clarity)
|
|
70
72
|
* @param data 清晰度数据
|
|
71
|
-
*/static clarity(e){return new Ne("ActionClarity",this.formatData(e))}static switchAudio(e){return new Ne("ActionCommandEvent",this.formatData(e))}}class je extends d{constructor(e){super(),r(this,"config"),r(this,"peerConnection",null),r(this,"localStream",null),r(this,"isPushingStream",!1),r(this,"dataChannel",null),r(this,"statsTimer"),r(this,"lastReportTime",0),r(this,"lastBytesReceived",0),r(this,"lastPacketsLost",0),r(this,"lastPacketsReceived",0),r(this,"lostPacketCount",0),r(this,"maxLostRate",0),r(this,"lastSecondDecodedCount",0),this.config=e}async startPush(){if(!this.isPushingStream){this.isPushingStream=!0;try{await this.readyCapture()}catch(e){this.emit(m.webrtcError,f(h.CAMERA,e))}}}handleOffer(e){this.resetPeerConnection(),((e,t,n,r)=>{const i=new RTCSessionDescription({type:"offer",sdp:t});e.setRemoteDescription(i).then((()=>Re(e,n,r))).catch((e=>null==r?void 0:r(f(h.HANDLE_OFFER,e))))})(this.peerConnection,e,(e=>{this.emit(m.sendAnswer,e)}),(e=>this.emit(m.webrtcError,e)))}handleAnswer(e){((e,t,n)=>{const r=new RTCSessionDescription({type:"answer",sdp:t});e.setRemoteDescription(r).catch((e=>null==n?void 0:n(f(h.REMOTE_DES,e))))})(this.peerConnection,e??"",(e=>this.emit(m.webrtcError,e)))}handleIceCandidate(e){((e,t,n)=>{e.addIceCandidate(t).catch((e=>null==n?void 0:n(f(h.HANDLE_ICE,e))))})(this.peerConnection,e,(e=>this.emit(m.webrtcError,e)))}sendChannelData(e,t){var n;try{let r=null;switch(e){case Ee.ClickData:r=Ne.click(t);break;case Ee.ClipboardData:r=Ne.clipboard(t);break;case Ee.ActionInput:r=Ne.input(t);break;case Ee.ActionChinese:r=Ne.chinese(t);break;case Ee.ActionRequestCloudDeviceInfo:r=Ne.requestCloudDeviceInfo();break;case Ee.ActionClarity:r=Ne.clarity(t);break;case Ee.ActionWheel:r=Ne.wheel(t);break;case Ee.ActionGesture:r=Ne.gesture(t);break;case Ee.ActionCommand:r=Ne.action(t);break;case Ee.ActionCommandEvent:r=Ne.switchAudio(t)}if(r){const e=JSON.stringify(r),t=(new TextEncoder).encode(e).buffer;null==(n=this.dataChannel)||n.send(t),r=null}}catch(r){this.emit(m.webrtcError,f(h.DATACHANNEL_ERR,r))}}closeConnection(){this.statsTimer&&(clearInterval(this.statsTimer),this.statsTimer=void 0),this.peerConnection&&("function"==typeof this.peerConnection.getSenders&&this.peerConnection.getSenders&&this.peerConnection.getSenders().forEach((e=>{var t,n;e.track&&(null==(n=(t=e.track).stop)||n.call(t))})),"function"==typeof this.peerConnection.getReceivers&&this.peerConnection.getReceivers&&this.peerConnection.getReceivers().forEach((e=>{var t,n;e.track&&(null==(n=(t=e.track).stop)||n.call(t))})),this.peerConnection.getTransceivers&&this.peerConnection.getTransceivers().forEach((e=>{var t;null==(t=e.stop)||t.call(e)})),this.removeAllListeners(),this.dataChannel=null,this.peerConnection.onicecandidate=null,this.peerConnection.ontrack=null,this.peerConnection.ondatachannel=null,this.peerConnection.onconnectionstatechange=null,this.peerConnection.oniceconnectionstatechange=null,this.peerConnection.onsignalingstatechange=null,this.peerConnection.onnegotiationneeded=null,this.peerConnection.onicegatheringstatechange=null,this.peerConnection.close(),this.peerConnection=null)}async readyCapture(){this.resetPeerConnection();try{this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:640,height:480},audio:!0});const e=await this.getRotatedStream(this.localStream);e.getTracks().forEach((t=>{t.contentHint="detail",this.peerConnection.addTrack(t,e)})),this.peerConnection.getSenders().forEach((e=>this.setVideoParams(e))),we(this.peerConnection,(e=>{this.emit(m.sendOffer,e)}),(e=>this.emit(m.webrtcError,e)))}catch(e){throw new Error(`mediaDevices error: ${e}`)}}async getRotatedStream(e){const t=document.createElement("canvas"),n=t.getContext("2d"),r=e.getVideoTracks()[0],{width:i,height:o}=await new Promise((e=>{const t=document.createElement("video");t.srcObject=new MediaStream([r]),t.onloadedmetadata=()=>e({width:t.videoWidth,height:t.videoHeight})}));t.width=640,t.height=480;const s=document.createElement("video");s.srcObject=e,await s.play();const a=()=>{n.clearRect(0,0,t.width,t.height),n.save(),n.translate(t.width/2,t.height/2),n.rotate(Math.PI/2),n.drawImage(s,-i/2,-o/2,i,o),n.restore(),requestAnimationFrame(a)};return a(),t.captureStream()}async setVideoParams(e){const t=e.getParameters();t.degradationPreference="maintain-resolution",t.encodings.forEach((e=>{e.maxBitrate=1e6,e.priority="high",e.scaleResolutionDownBy=1})),await e.setParameters(t)}stopPush(){var e;this.isPushingStream&&(this.isPushingStream=!1,null==(e=this.localStream)||e.getTracks().forEach((e=>{var t;null==(t=this.peerConnection)||t.getSenders().forEach((e=>{var t;null==(t=this.peerConnection)||t.removeTrack(e)})),e.stop()})),this.localStream=null,we(this.peerConnection,(e=>{this.emit(m.sendOffer,e)}),(e=>this.emit(m.webrtcError,e))))}resetPeerConnection(){var e,t,n,r,i;this.peerConnection||(this.peerConnection=(e=>{const t=[{urls:e.stunServerUri},{urls:e.
|
|
73
|
+
*/static clarity(e){return new Ne("ActionClarity",this.formatData(e))}static switchAudio(e){return new Ne("ActionCommandEvent",this.formatData(e))}static changeSender(e){return new Ne("ActionTrack",this.formatData(e))}}class je extends d{constructor(e){super(),r(this,"config"),r(this,"peerConnection",null),r(this,"localStream",null),r(this,"isPushingStream",!1),r(this,"dataChannel",null),r(this,"statsTimer"),r(this,"lastReportTime",0),r(this,"lastBytesReceived",0),r(this,"lastPacketsLost",0),r(this,"lastPacketsReceived",0),r(this,"lostPacketCount",0),r(this,"maxLostRate",0),r(this,"lastSecondDecodedCount",0),this.config=e}async startPush(){if(!this.isPushingStream){this.isPushingStream=!0;try{await this.readyCapture()}catch(e){this.emit(m.webrtcError,f(h.CAMERA,e))}}}handleOffer(e){this.resetPeerConnection(),((e,t,n,r)=>{const i=new RTCSessionDescription({type:"offer",sdp:t});e.setRemoteDescription(i).then((()=>Re(e,n,r))).catch((e=>null==r?void 0:r(f(h.HANDLE_OFFER,e))))})(this.peerConnection,e,(e=>{this.emit(m.sendAnswer,e)}),(e=>this.emit(m.webrtcError,e)))}handleAnswer(e){((e,t,n)=>{const r=new RTCSessionDescription({type:"answer",sdp:t});e.setRemoteDescription(r).catch((e=>null==n?void 0:n(f(h.REMOTE_DES,e))))})(this.peerConnection,e??"",(e=>this.emit(m.webrtcError,e)))}handleIceCandidate(e){((e,t,n)=>{e.addIceCandidate(t).catch((e=>null==n?void 0:n(f(h.HANDLE_ICE,e))))})(this.peerConnection,e,(e=>this.emit(m.webrtcError,e)))}sendChannelData(e,t){var n;try{let r=null;switch(e){case Ee.ClickData:r=Ne.click(t);break;case Ee.ClipboardData:r=Ne.clipboard(t);break;case Ee.ActionInput:r=Ne.input(t);break;case Ee.ActionChinese:r=Ne.chinese(t);break;case Ee.ActionRequestCloudDeviceInfo:r=Ne.requestCloudDeviceInfo();break;case Ee.ActionClarity:r=Ne.clarity(t);break;case Ee.ActionWheel:r=Ne.wheel(t);break;case Ee.ActionGesture:r=Ne.gesture(t);break;case Ee.ActionCommand:r=Ne.action(t);break;case Ee.ActionCommandEvent:r=Ne.switchAudio(t);break;case Ee.ActionTrack:r=Ne.changeSender(t)}if(r){const e=JSON.stringify(r),t=(new TextEncoder).encode(e).buffer;null==(n=this.dataChannel)||n.send(t),r=null}}catch(r){this.emit(m.webrtcError,f(h.DATACHANNEL_ERR,r))}}closeConnection(){this.statsTimer&&(clearInterval(this.statsTimer),this.statsTimer=void 0),this.peerConnection&&("function"==typeof this.peerConnection.getSenders&&this.peerConnection.getSenders&&this.peerConnection.getSenders().forEach((e=>{var t,n;e.track&&(null==(n=(t=e.track).stop)||n.call(t))})),"function"==typeof this.peerConnection.getReceivers&&this.peerConnection.getReceivers&&this.peerConnection.getReceivers().forEach((e=>{var t,n;e.track&&(null==(n=(t=e.track).stop)||n.call(t))})),this.peerConnection.getTransceivers&&this.peerConnection.getTransceivers().forEach((e=>{var t;null==(t=e.stop)||t.call(e)})),this.removeAllListeners(),this.dataChannel=null,this.peerConnection.onicecandidate=null,this.peerConnection.ontrack=null,this.peerConnection.ondatachannel=null,this.peerConnection.onconnectionstatechange=null,this.peerConnection.oniceconnectionstatechange=null,this.peerConnection.onsignalingstatechange=null,this.peerConnection.onnegotiationneeded=null,this.peerConnection.onicegatheringstatechange=null,this.peerConnection.close(),this.peerConnection=null)}async readyCapture(){this.resetPeerConnection();try{this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:640,height:480},audio:!0});const e=await this.getRotatedStream(this.localStream);e.getTracks().forEach((t=>{t.contentHint="detail",this.peerConnection.addTrack(t,e)})),this.peerConnection.getSenders().forEach((e=>this.setVideoParams(e))),we(this.peerConnection,(e=>{this.emit(m.sendOffer,e)}),(e=>this.emit(m.webrtcError,e)))}catch(e){throw new Error(`mediaDevices error: ${e}`)}}async getRotatedStream(e){const t=document.createElement("canvas"),n=t.getContext("2d"),r=e.getVideoTracks()[0],{width:i,height:o}=await new Promise((e=>{const t=document.createElement("video");t.srcObject=new MediaStream([r]),t.onloadedmetadata=()=>e({width:t.videoWidth,height:t.videoHeight})}));t.width=640,t.height=480;const s=document.createElement("video");s.srcObject=e,await s.play();const a=()=>{n.clearRect(0,0,t.width,t.height),n.save(),n.translate(t.width/2,t.height/2),n.rotate(Math.PI/2),n.drawImage(s,-i/2,-o/2,i,o),n.restore(),requestAnimationFrame(a)};return a(),t.captureStream()}async setVideoParams(e){const t=e.getParameters();t.degradationPreference="maintain-resolution",t.encodings.forEach((e=>{e.maxBitrate=1e6,e.priority="high",e.scaleResolutionDownBy=1})),await e.setParameters(t)}stopPush(){var e;this.isPushingStream&&(this.isPushingStream=!1,null==(e=this.localStream)||e.getTracks().forEach((e=>{var t;null==(t=this.peerConnection)||t.getSenders().forEach((e=>{var t;null==(t=this.peerConnection)||t.removeTrack(e)})),e.stop()})),this.localStream=null,we(this.peerConnection,(e=>{this.emit(m.sendOffer,e)}),(e=>this.emit(m.webrtcError,e))))}resetPeerConnection(){var e,t,n,r,i;this.peerConnection||(this.peerConnection=(e=>{const t=[{urls:e.stunServerUri},{urls:e.turnServerUri,username:e.turnServerUserName,credential:e.turnServerPassword}];return new RTCPeerConnection({iceServers:t,iceTransportPolicy:"all",bundlePolicy:"max-bundle",iceCandidatePoolSize:4})})(this.config),e=this.peerConnection,t=e=>{this.emit(m.sendICEMessage,e)},n=e=>{this.emit(m.streamTrack,e)},r=e=>{this.emit(m.iceConnectionState,e)},i=e=>this.emit(m.webrtcError,e),e.onicecandidate=e=>{if(!e.candidate)return;const n={sdp:e.candidate.candidate,sdpMid:e.candidate.sdpMid,sdpMLineIndex:e.candidate.sdpMLineIndex};t(JSON.stringify(n))},e.oniceconnectionstatechange=()=>{const t=e.iceConnectionState;t&&("failed"!==t&&"disconnected"!==t&&"closed"!==t||null==i||i(f(h.ICE_STATE,"failed")),null==r||r(t))},e.ontrack=e=>{const t=e.track;t.contentHint="motion",null==n||n(t)},this.checkStats(),this.configDataChannel())}configDataChannel(){this.peerConnection.ondatachannel=e=>{this.dataChannel=e.channel,this.dataChannel.onmessage=e=>this.handleDataChannelMessage(e),this.dataChannel.onerror=e=>this.emit(m.webrtcError,f(h.DATACHANNEL_ERR,e)),this.sendChannelData(Ee.ActionRequestCloudDeviceInfo,"")}}handleDataChannelMessage(e){const t=JSON.parse(e.data);if(t.type===Ee.ActionCommandEvent){const{action:e,value:n}=JSON.parse(t.data);"ACTION_CONTROL_VIDEO"===e&&("ENABLE"===n?this.startPush():this.stopPush())}else if(t.type===Ee.ActionUpdateCloudStatus){const{rotation:e,screenWidth:n,screenHeight:r,gestureMode:i}=JSON.parse(t.data),o={direction:[Ie.ROTATION_0,Ie.ROTATION_180].includes(e)?De.Vertical:De.Horizontal,screenWidth:n,screenHeight:r,gestureMode:i};this.emit(m.cloudStatusChanged,o)}else t.type===Ee.CloudClipData&&this.emit(m.cloudClipData,t.data)}checkStats(){this.statsTimer=setInterval((()=>this.processStats()),1e3)}processStats(){this.peerConnection&&this.peerConnection.getStats(null).then((e=>{let t=0,n=0,r=0,i=0,o=0,s=0,a=0,c=0,d=0,l="";const p=Date.now();e.forEach((p=>{if("inbound-rtp"===p.type&&(s+=p.bytesReceived||0,i+=p.packetsLost||0,o+=p.packetsReceived||0,"video"===p.kind&&(t=p.framesPerSecond||0,n=p.totalDecodeTime||0,a=p.framesDecoded||0,d=p.framesReceived||0,c=(p.pliCount||0)+(p.firCount||0))),"candidate-pair"===p.type&&"succeeded"===p.state){r=void 0!==p.currentRoundTripTime?p.currentRoundTripTime:p.responsesReceived>0?p.totalRoundTripTime/p.responsesReceived:0;const t=e.get(p.localCandidateId),n=e.get(p.remoteCandidateId);t&&n&&(l=this.getConnectionType(t,n))}})),r=Math.floor(1e3*(r||0));const h=p-this.lastReportTime,u=s-this.lastBytesReceived,f=(h>0?1e3*u/h:0)/1024,C=f/1024;this.lastBytesReceived=s,this.lastReportTime=p;let g=0;const y=i-this.lastPacketsLost,v=o-this.lastPacketsReceived;y>0&&v>0&&(g=y/(y+v),this.maxLostRate=Math.max(this.maxLostRate||0,g),this.lostPacketCount++),this.lastPacketsLost=i,this.lastPacketsReceived=o;const S=void 0!==t?t:a-this.lastSecondDecodedCount;this.lastSecondDecodedCount=a;const T=f<1024?`${Math.floor(f)} KB/s`:`${Math.floor(C)} MB/s`,R=a>0?Math.floor(1e4*n/a):0,b={connectionType:l,framesPerSecond:S,currentRoundTripTime:r,lostRate:Math.floor(100*g),
|
|
72
74
|
// percent
|
|
73
75
|
bitrate:T,pliCount:c,averageDecodeTime:R,framesDecoded:a,framesReceived:d};this.emit(m.statisticInfo,b)})).catch((e=>{this.emit(m.webrtcError,f(h.STREAM_STATE,e))}))}getConnectionType(e,t){return"host"===e.candidateType&&"host"===t.candidateType?"直连":"relay"===e.candidateType||"relay"===t.candidateType?"中继":"NAT"}}class Ue extends d{constructor(e){super(),r(this,"config"),r(this,"signalingClient"),r(this,"webRTCClient"),
|
|
74
76
|
/**
|
|
75
77
|
* 处理 signal 消息,根据不同消息类型分发到 webRTCClient 或直接触发 SDK 事件
|
|
76
78
|
* @param message 信令消息
|
|
77
79
|
*/
|
|
78
|
-
r(this,"handleSignaling",(e=>{switch(e.type){case l.Peers:this.config.myId=e.myId;break;case l.Offer:e.senderId&&e.sdp&&(this.config.targetId=e.senderId,this.webRTCClient.handleOffer(e.sdp));break;case l.Answer:e.sdp&&this.webRTCClient.handleAnswer(e.sdp);break;case l.IceCandidates:if(e.ice)try{const t=JSON.parse(e.ice);t.candidate=t.sdp,this.webRTCClient.handleIceCandidate(new RTCIceCandidate(t))}catch(t){this.emit("error",{type:"iceCandidate",error:t})}break;case l.SignOut:e.myId===this.config.myId&&(this.webRTCClient.closeConnection(),this.signalingClient.close(),this.removeAllListeners());break;case l.NotAvailable:this.emit(m.webrtcError,f(h.NOT_AVAILABLE,""));break;case l.Ping:this.sendPong();break;case l.SendScreenshot:const n=`data:image/png;base64,${e.screenshot}`;this.emit(m.screenshot,{room_id:this.config.roomId,base64:n})}})),
|
|
80
|
+
r(this,"handleSignaling",(e=>{switch(e.type){case l.Peers:this.config.myId=e.myId;break;case l.Offer:e.senderId&&e.sdp&&(this.config.targetId=e.senderId,this.webRTCClient.handleOffer(e.sdp));break;case l.Answer:e.sdp&&this.webRTCClient.handleAnswer(e.sdp);break;case l.IceCandidates:if(e.ice)try{const t=JSON.parse(e.ice);t.candidate=t.sdp,this.webRTCClient.handleIceCandidate(new RTCIceCandidate(t))}catch(t){this.emit("error",{type:"iceCandidate",error:t})}break;case l.SignOut:e.myId===this.config.myId&&(this.webRTCClient.closeConnection(),this.signalingClient.close(),this.removeAllListeners());break;case l.NotAvailable:this.emit(m.webrtcError,f(h.NOT_AVAILABLE,""));break;case l.Ping:this.sendPong();break;case l.SendScreenshot:const n=`data:image/png;base64,${e.screenshot}`;this.emit(m.screenshot,{room_id:this.config.roomId,base64:n});break;case l.KickOut:this.emit(m.webrtcError,f(h.KICK_OUT_ERR,""));break;case l.Error:e.error.includes("云手机没有就绪")?this.emit(m.webrtcError,f(h.NOT_AVAILABLE,"")):e.error.includes("token 验证失败")&&this.emit(m.webrtcError,f(h.AUTH_FAILED,""))}})),
|
|
79
81
|
/** 发送 Offer 信令 */
|
|
80
82
|
r(this,"sendOffer",(e=>{if(e&&e.length>0){const t={type:p.Offer,identity:p.Identity,roomId:this.config.roomId,senderId:this.config.myId,targetId:this.config.targetId,sdp:e};this.signalingClient.sendMessage(JSON.stringify(t))}})),
|
|
81
83
|
/** 发送 Answer 信令 */
|
|
82
84
|
r(this,"sendAnswer",(e=>{if(e&&e.length>0){const t={type:p.Answer,identity:p.Identity,roomId:this.config.roomId,senderId:this.config.myId,targetId:this.config.targetId,sdp:e};this.signalingClient.sendMessage(JSON.stringify(t))}})),
|
|
83
85
|
/** 发送 ICE 候选信息 */
|
|
84
86
|
r(this,"sendICEMessage",(e=>{if(e&&e.length>0){const t={type:p.IceCandidates,identity:p.Identity,roomId:this.config.roomId,senderId:this.config.myId,targetId:this.config.targetId,ice:e};this.signalingClient.sendMessage(JSON.stringify(t))}})),this.config=new Te(e),this.signalingClient=new C(this.config),this.webRTCClient=new je(this.config),this.signalingClient.on(m.signalMessage,(e=>this.handleSignaling(e))),this.signalingClient.on(m.webrtcError,(e=>{this.emit(m.webrtcError,e)})),this.webRTCClient.on(m.sendOffer,(e=>this.sendOffer(e))),this.webRTCClient.on(m.sendAnswer,(e=>this.sendAnswer(e))),this.webRTCClient.on(m.sendICEMessage,(e=>this.sendICEMessage(e))),this.webRTCClient.on(m.streamTrack,(e=>this.emit(m.streamTrack,e))),this.webRTCClient.on(m.iceConnectionState,(e=>this.emit(m.iceConnectionState,e))),this.webRTCClient.on(m.cloudStatusChanged,(e=>this.emit(m.cloudStatusChanged,e))),this.webRTCClient.on(m.cloudClipData,(e=>this.emit(m.cloudClipData,e))),this.webRTCClient.on(m.webrtcError,(e=>{this.emit(m.webrtcError,e)})),this.webRTCClient.on(m.statisticInfo,(e=>{this.emit(m.statisticInfo,e)}))}
|
|
85
|
-
/** 开始连接 signal 服务 */startConnection(){this.signalingClient.start()}
|
|
87
|
+
/** 开始连接 signal 服务 */startConnection(){this.signalingClient.start()}switchControl(e){this.signalingClient.sendSwitchControlMessage(e)}
|
|
86
88
|
/** 停止连接,并发送退出信令 */stop(){this.sendSignOut(),this.webRTCClient.closeConnection(),this.removeAllListeners()}
|
|
87
89
|
/** 开始推流:触发媒体采集与轨道添加 */async startPush(){}
|
|
88
90
|
/** 发送信道数据 */sendChannelData(e,t){this.webRTCClient.sendChannelData(e,t)}sendControlEvent(e){const t=new Le(e,0);this.webRTCClient.sendChannelData(Ee.ActionInput,t)}sendRequestScreenshot(e){this.signalingClient.sendRequestScreenshot(e)}sendPong(){const e={type:p.Pong},t=JSON.stringify(e);this.signalingClient.sendMessage(t)}sendSignOut(){const e={type:p.SignOut,identity:p.Identity,roomId:this.config.roomId,myId:this.config.myId};this.signalingClient.sendMessage(JSON.stringify(e))}}const Fe={
|
|
@@ -103,31 +105,28 @@ F1:131,F2:132,F3:133,F4:134,F5:135,F6:136,F7:137,F8:138,F9:139,F10:140,F11:141,F
|
|
|
103
105
|
// 数字小键盘
|
|
104
106
|
Numpad0:7,Numpad1:8,Numpad2:9,Numpad3:10,Numpad4:11,Numpad5:12,Numpad6:13,Numpad7:14,Numpad8:15,Numpad9:16,NumpadAdd:157,NumpadSubtract:156,NumpadMultiply:155,NumpadDivide:154,NumpadDecimal:158,NumpadEnter:66,
|
|
105
107
|
// 其他特殊键
|
|
106
|
-
Insert:124,Delete:112,Home:122,End:123,PageUp:92,PageDown:93,ScrollLock:116,Pause:121,ContextMenu:117},Ve=e=>{const t=Fe[e.code]??-1,n=(e=>{let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4096),e.metaKey&&(t|=65536),t})(e);return{keyCode:t,meta:n}};function
|
|
108
|
+
Insert:124,Delete:112,Home:122,End:123,PageUp:92,PageDown:93,ScrollLock:116,Pause:121,ContextMenu:117},Ve=e=>{const t=Fe[e.code]??-1,n=(e=>{let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4096),e.metaKey&&(t|=65536),t})(e);return{keyCode:t,meta:n}};function Ke(e,t,n,r,i,o,s,a){let c,d;-90===i?(d=t,c=n*e/r):(d=e,c=n*t/r);const l=(d-c)/2,p=d/2,h=l,u=d-l,f=p-l;if(-90===i){const e=We(l,p,h,u,f,a);return-90===o?[s,e]:[t-e,s]}{const n=We(l,p,h,u,f,s);if(-90===o){const[r,i]=function(e,t,n,r){const i=t/2,o=e/2,s=n-o,a=r-i;return[a+i,-s+o]}(e,t,n,a);return[r,i]}return[n,a]}}function ze(e,t,n,r,i,o,s,a){let c,d;return 0===i&&0===o?(c=s/e,d=a/t):-90===i&&0===o?(c=s/t,d=a/e):-90===i&&-90===o?(c=s/e*(r/n),d=a/t*(n/r)):(c=s/t*(r/n),d=a/e*(n/r)),[c,d]}function We(e,t,n,r,i,o){return o>=n&&o<=t-.1?(o-e)*t/i:o===t?t:o>=t+.1&&o<=r?t+(o-t)*t/i:o}class Be{constructor(){r(this,"visibility",new Map),r(this,"prevVisibility",new Map)}set(e,t){this.visibility.set(e,t)}
|
|
107
109
|
/**
|
|
108
110
|
* 设置视图的可见性,替换所有可见项
|
|
109
111
|
* @param viewIds
|
|
110
112
|
* @param visible
|
|
111
|
-
*/setViewIds(e,t){this.visibility.clear(),e.forEach((e=>{this.visibility.set(e,t)}))}getChanges(){const e=[];return this.visibility.forEach(((t,n)=>{const r=this.prevVisibility.get(n)??!1;e.push({viewId:n,nowVisible:t,wasVisible:r}),this.prevVisibility.set(n,t)})),e}clear(){this.visibility.clear(),this.prevVisibility.clear()}}class
|
|
113
|
+
*/setViewIds(e,t){this.visibility.clear(),e.forEach((e=>{this.visibility.set(e,t)}))}getChanges(){const e=[];return this.visibility.forEach(((t,n)=>{const r=this.prevVisibility.get(n)??!1;e.push({viewId:n,nowVisible:t,wasVisible:r}),this.prevVisibility.set(n,t)})),e}clear(){this.visibility.clear(),this.prevVisibility.clear()}}class Ge{constructor(e,t){r(this,"timer",null),this.interval=e,this.callback=t}start(){this.timer||(this.timer=setInterval(this.callback,this.interval))}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}}class He extends d{constructor(e){super(),r(this,"sdk"),r(this,"config"),this.config=e,this.sdk=new Ue(this.config),this.initSdk()}initSdk(){const e=this.config.roomId;this.sdk.removeAllListeners(),this.config.isControl?(this.sdk.on(m.streamTrack,(e=>{const t="video"===e.kind;this.emit(m.streamTrack,t,e)})),this.sdk.on(m.cloudStatusChanged,(e=>{this.emit(m.cloudStatusChanged,e)}))):this.sdk.on(m.screenshot,(t=>this.emit(m.screenshot,e,t))),this.sdk.on(m.iceConnectionState,(t=>this.emit(m.iceConnectionState,e,t))),this.sdk.on(m.webrtcError,(t=>{this.emit(m.webrtcError,e,t),this.stop()}))}
|
|
112
114
|
// 动态更新 isControl 值
|
|
113
|
-
setIsControl(e){this.config.isControl!==e&&(this.config.isControl=e,this.initSdk())}start(){this.sdk.startConnection()}stop(){this.sdk.stop(),this.sdk.removeAllListeners()}sendData(e,t){(this.config.canOperate||this.config.isControl)&&1===this.config.connectStatus&&this.sdk.sendChannelData(e,t)}sendControlData(e){(this.config.canOperate||this.config.isControl)&&1===this.config.connectStatus&&this.sdk.sendControlEvent(e)}requestScreenshot(e){this.sdk.sendRequestScreenshot(e)}}function
|
|
114
|
-
(...e)=>t.unref(
|
|
115
|
-
(...e)=>t.unref(
|
|
116
|
-
(...e)=>t.unref(
|
|
117
|
-
(...e)=>t.unref(
|
|
118
|
-
(...e)=>t.unref(
|
|
119
|
-
(...e)=>t.unref(
|
|
120
|
-
(...e)=>t.unref(
|
|
121
|
-
(...e)=>t.unref(
|
|
122
|
-
(...e)=>t.unref(I)&&t.unref(I)(...e)),onPointerleave:n[7]||(n[7]=//@ts-ignore
|
|
123
|
-
(...e)=>t.unref(D)&&t.unref(D)(...e)),onWheel:n[8]||(n[8]=//@ts-ignore
|
|
124
|
-
(...e)=>t.unref(M)&&t.unref(M)(...e)),style:t.normalizeStyle({backgroundColor:`${t.unref(p)}`}),autoplay:"",playsinline:"",muted:"",disablePictureInPicture:!0},null,38)],36)],512))}}),[["__scopeId","data-v-d46ae8ac"]]);e.ActionCommandEventType=Ae,e.ActionCommandEventValue=ke,e.ActionCommandType=_e,e.ActionType=Oe,e.ChannelDataType=Ee,e.ContainerDirection=De,e.EmitType=m,e.GestureData=class{constructor(e){r(this,"mode"),this.mode=e}},e.GroupControllerManager=class extends d{constructor(e=1e3,t=new Be){super(),r(this,"configs",new Map),r(this,"controllers",new Map),r(this,"visibility"),r(this,"loopManager"),this.visibility=t,this.loopManager=new Je(e,(()=>this.handleLoop()))}startControl(e){if(!e.size)throw new Error("配置为空");if(1!==Array.from(e.values()).filter((e=>e.isControl)).length)throw new Error("必须且仅有一个主控");this.configs=new Map(e),this.configs.forEach((e=>this.addController(e))),this.loopManager.start()}switchToMain(e,t){e&&t&&(this.refreshController(t),this.refreshController(e))}
|
|
115
|
+
setIsControl(e){this.config.isControl!==e&&(this.config.isControl=e,this.initSdk())}start(){this.sdk.startConnection()}stop(){this.sdk.stop(),this.sdk.removeAllListeners()}switchControl(e){this.sdk.switchControl(e)}sendData(e,t){(this.config.canOperate||this.config.isControl)&&1===this.config.connectStatus&&this.sdk.sendChannelData(e,t)}sendControlData(e){(this.config.canOperate||this.config.isControl)&&1===this.config.connectStatus&&this.sdk.sendControlEvent(e)}requestScreenshot(e){this.sdk.sendRequestScreenshot(e)}}function Je(e,n,r,i){const o=t.ref(!1),s=t.ref({}),a=t.ref({width:0,height:0}),c=t.ref(0),d=t.ref(0),l=t.ref(null),p=t.ref(0),h=t.computed((()=>r.value%180!=0)),u=t.computed((()=>{let e=0,t=0;const n=h.value?a.value.height:a.value.width,r=h.value?a.value.width:a.value.height,i=s.value.width??720,o=s.value.height??1280,l=i/o,p=n/l;return p>r?(t=r,e=t*l):(e=n,t=p),c.value=i/e,d.value=o/t,{width:e,height:t}})),f=()=>{o.value=!1;const e=n.value;e&&e.srcObject&&(e.srcObject.getTracks().forEach((e=>e.stop())),e.srcObject=null,e.cancelVideoFrameCallback(p.value))};return t.onBeforeUnmount((()=>{l.value&&e.value&&l.value.unobserve(e.value),f()})),{videoSize:u,remoteVideo:s,dimensions:a,widthRadio:c,heightRadio:d,screenStatus:o,initVideoContainer:()=>{e.value&&(l.value=new ResizeObserver((([e])=>{const{width:t,height:n}=e.contentRect;a.value={width:t,height:n}})),l.value.observe(e.value)),(()=>{const e=n.value;if(!e)return;const r=()=>{s.value={width:e.videoWidth,height:e.videoHeight},o.value=!0,i("loadedSuccess")};e.addEventListener("loadedmetadata",r),t.onBeforeUnmount((()=>{e.removeEventListener("loadedmetadata",r)}))})()},startPlay:e=>{const t=n.value;t&&(t.srcObject||(t.srcObject=new MediaStream),t.playsInline=!0,t.setAttribute("webkit-playsinline","true"),t.srcObject.addTrack(e))},stopPlay:f}}const qe=((e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n})(t.defineComponent({__name:"index",props:{streamAngle:{default:0},videoAngle:{default:0},cursorType:{default:0},cloudDeviceSize:{default:()=>({width:0,height:0})},disabled:{type:Boolean,default:!0},bgColor:{default:"transparent"}},emits:["channelEvent","groupControlEvent","loadedSuccess"],setup(e,{expose:n,emit:r}){const i=r,o=e,{streamAngle:s,videoAngle:a,cursorType:c,cloudDeviceSize:d,disabled:l,bgColor:p}=t.toRefs(o),h=t.ref(null),u=t.ref(null),f=function(e){return t.computed((()=>{switch(e.value){case 1:return"circle-cursor";case 2:return"triangle-cursor";default:return"default-cursor"}}))}(c),{videoSize:m,dimensions:C,widthRadio:g,initVideoContainer:y,startPlay:v,stopPlay:S}=Je(h,u,a,i),{handleMouseDown:T,handleMouseMove:R,handleMouseEnter:b,handleMouseUp:w,handleMouseLeave:P,handleWheel:E}=function(e){const{remoteVideoElement:n,cloudDeviceSize:r,streamAngle:i,videoAngle:o,widthRadio:s,emit:a}=e,c=t.ref(!1),d=t.ref(0),l=t.ref(new Array(20).fill(0)),p=t.ref(new Array(10).fill(0)),h=(e,t)=>{if(!n.value)return;const s=Math.trunc(e.timeStamp-p.value[0]),c=n.value.getBoundingClientRect();let h=e.clientX-c.left,u=e.clientY-c.top;const f=r.value.width,m=r.value.height,C=Ke(c.width,c.height,f,m,o.value,i.value,h,u);if(!C||C.length<2)return;if(h=C[0],u=C[1],t===Oe.ACTION_MOVE){const e=l.value[10]-u,t=l.value[0]-h;if(Math.abs(e)<d.value&&Math.abs(t)<d.value)return}l.value[0]=h,l.value[10]=u;const g=ze(c.width,c.height,f,m,o.value,i.value,h,u),y=new Me(t,0,g[0],g[1],s);a("channelEvent",Ee.ClickData,y)},u=e=>{c.value&&(c.value=!1,h(e,Oe.ACTION_UP),n.value&&n.value.releasePointerCapture(e.pointerId))};return{isPointerDown:c,handleMouseDown:e=>{c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),p.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),h(e,Oe.ACTION_DOWN)},handleMouseMove:e=>{if(!c.value)return;if(h(e,Oe.ACTION_MOVE),!n.value)return;const t=n.value.getBoundingClientRect(),{clientX:r,clientY:i}=e;(r<t.left||r>t.right||i<t.top||i>t.bottom)&&u(e)},handleMouseEnter:e=>{1!==e.buttons||c.value||(c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),p.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),h(e,Oe.ACTION_DOWN))},handleMouseUp:u,handleMouseLeave:e=>{c.value&&(h(e,Oe.ACTION_UP),c.value=!1,n.value&&n.value.releasePointerCapture(e.pointerId))},handleWheel:e=>{const t=-1*Math.sign(e.deltaY),n=new xe(t);a("channelEvent",Ee.ActionWheel,n)}}}({remoteVideoElement:u,cloudDeviceSize:d,streamAngle:s,videoAngle:a,widthRadio:g,emit:i}),{startListening:k,stopListening:_}=function(e,n){const r=t.ref(!1),i=e=>{const t=Ve(e);n("channelEvent",Ee.ActionInput,t)};return{startListening:()=>{e&&(r.value=!0,document.addEventListener("keydown",i))},stopListening:()=>{e&&(r.value=!1,document.removeEventListener("keydown",i))}}}(l,i);!function(e,n){let r=null;t.onMounted((()=>{e.value&&(r=new ResizeObserver((e=>{for(const t of e){const{width:e,height:r}=t.contentRect;n.value={width:e,height:r}}})),r.observe(e.value))})),t.onUnmounted((()=>{null==r||r.disconnect()}))}(h,C);const A=()=>{var e;(null==(e=u.value)?void 0:e.srcObject)&&(u.value.muted=!1)};return t.onMounted((()=>{document.addEventListener("click",A),y()})),t.onUnmounted((()=>{document.removeEventListener("click",A)})),n({startPlay:v,stopPlay:S}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"videoContainer",ref:h,class:"flex flex-1 items-center justify-center",style:{width:"100%",height:"100%",position:"relative",overflow:"hidden"}},[t.createElementVNode("div",{ref:"keyboardArea",onPointerenter:n[6]||(n[6]=//@ts-ignore
|
|
116
|
+
(...e)=>t.unref(k)&&t.unref(k)(...e)),onPointerleave:n[7]||(n[7]=//@ts-ignore
|
|
117
|
+
(...e)=>t.unref(_)&&t.unref(_)(...e)),class:"vContainer",style:t.normalizeStyle([{height:t.unref(m).height+"px",width:t.unref(m).width+"px",transform:`rotate(${t.unref(a)}deg)`},{position:"relative",overflow:"hidden"}])},[t.createElementVNode("video",{ref_key:"remoteVideoElement",ref:u,class:t.normalizeClass(["video-control",[t.unref(f),{"no-events":t.unref(l)}]]),onPointerenter:n[0]||(n[0]=//@ts-ignore
|
|
118
|
+
(...e)=>t.unref(b)&&t.unref(b)(...e)),onPointerdown:n[1]||(n[1]=//@ts-ignore
|
|
119
|
+
(...e)=>t.unref(T)&&t.unref(T)(...e)),onPointermove:n[2]||(n[2]=//@ts-ignore
|
|
120
|
+
(...e)=>t.unref(R)&&t.unref(R)(...e)),onPointerup:n[3]||(n[3]=//@ts-ignore
|
|
121
|
+
(...e)=>t.unref(w)&&t.unref(w)(...e)),onPointerleave:n[4]||(n[4]=//@ts-ignore
|
|
122
|
+
(...e)=>t.unref(P)&&t.unref(P)(...e)),onWheel:n[5]||(n[5]=//@ts-ignore
|
|
123
|
+
(...e)=>t.unref(E)&&t.unref(E)(...e)),style:t.normalizeStyle({backgroundColor:`${t.unref(p)}`}),autoplay:"",playsinline:"",muted:"",disablePictureInPicture:!0},null,38)],36)],512))}}),[["__scopeId","data-v-9773f56a"]]);e.ActionCommandEventType=Ae,e.ActionCommandEventValue=ke,e.ActionCommandType=_e,e.ActionType=Oe,e.ChannelDataType=Ee,e.ContainerDirection=De,e.EmitType=m,e.GestureData=class{constructor(e){r(this,"mode"),this.mode=e}},e.GroupControllerManager=class extends d{constructor(e=1e3,t=new Be){super(),r(this,"configs",new Map),r(this,"controllers",new Map),r(this,"visibility"),r(this,"loopManager"),this.visibility=t,this.loopManager=new Ge(e,(()=>this.handleLoop()))}startControl(e){if(!e.size)throw new Error("配置为空");if(1!==Array.from(e.values()).filter((e=>e.isControl)).length)throw new Error("必须且仅有一个主控");this.configs=new Map(e),this.configs.forEach((e=>this.addController(e))),this.loopManager.start()}switchToMain(e,t){e&&t&&(this.switchControl(e,!0),this.switchControl(t,!1))}switchControl(e,t){let n=this.getController(e);null==n||n.setIsControl(t),null==n||n.switchControl(t)}
|
|
125
124
|
/**
|
|
126
125
|
* 找到当前主控config, 设置为从控
|
|
127
126
|
*/clearCurrentControl(){for(const[e,t]of this.configs.entries())if(t.isControl)return this.configs.set(e,{...t,isControl:!1}),e}
|
|
128
127
|
/**
|
|
129
128
|
* 找到目标config, 设置为主控
|
|
130
129
|
* @param roomId
|
|
131
|
-
*/setAsControl(e){for(const[t,n]of this.configs.entries())if(t===e)return this.configs.set(t,{...n,isControl:!0}),t}stopControl(){this.controllers.forEach((e=>{e.removeAllListeners(),e.stop()})),this.controllers.clear(),this.configs.clear(),this.visibility.clear(),this.loopManager.stop(),this.removeAllListeners()}addController(e){const t=new
|
|
130
|
+
*/setAsControl(e){for(const[t,n]of this.configs.entries())if(t===e)return this.configs.set(t,{...n,isControl:!0}),t}stopControl(){this.controllers.forEach((e=>{e.removeAllListeners(),e.stop()})),this.controllers.clear(),this.configs.clear(),this.visibility.clear(),this.loopManager.stop(),this.removeAllListeners()}addController(e){const t=new He(e);t.on(m.streamTrack,((e,t)=>{this.emit(m.streamTrack,e,t)})),t.on(m.iceConnectionState,((e,t)=>{this.emit(m.iceConnectionState,e,t)})),t.on(m.cloudStatusChanged,(e=>{this.emit(m.cloudStatusChanged,e)})),t.on(m.webrtcError,((e,t)=>{this.emit(m.webrtcError,e,t)})),t.on(m.screenshot,((e,t)=>{this.emit(m.screenshot,e,t)})),t.start(),this.controllers.set(e.roomId,t)}getConfigs(){return new Map(this.configs)}
|
|
132
131
|
// 🔥 新增:暴露拿单个 controller
|
|
133
|
-
getController(e){return this.controllers.get(e)}refreshController(e){const t=this.configs.get(e);if(!t)throw new Error(`未找到配置项: ${e}`);const n=this.controllers.get(e);n&&(n.removeAllListeners(),n.stop(),this.controllers.delete(e)),this.addController(t)}updateProperty(e,t,n){const r=this.configs.get(e);if(!r)throw new Error(`未找到 ${e}`);r[t]=n}setVisibility(e,t){this.visibility.set(e,t)}setViewIds(e,t){this.visibility.setViewIds(e,t)}sendData(e,t){this.controllers.forEach((n=>n.sendData(e,t)))}sendControlEvent(e){this.controllers.forEach((t=>t.sendControlData(e)))}handleLoop(){try{this.visibility.getChanges().forEach((({viewId:e,nowVisible:t,wasVisible:n})=>{var r,i;const o=this.controllers.get(e);if(!o)return;const s=null==(r=this.configs.get(e))?void 0:r.isControl,a=null==(i=this.configs.get(e))?void 0:i.canOperate;t&&!s&&a?o.requestScreenshot(!0):n&&!t&&o.requestScreenshot(!1)}))}catch(e){}}},e.InputData=class{constructor(e){r(this,"text"),this.text=e}},e.KeyEventData=Le,e.RemotePlayer=qe,e.TouchData=Me,e.WebRTCSdk=Ue,e.WheelData=xe,e.getKeyEventData=Ve,e.transformCoordinate=
|
|
132
|
+
getController(e){return this.controllers.get(e)}refreshController(e){const t=this.configs.get(e);if(!t)throw new Error(`未找到配置项: ${e}`);const n=this.controllers.get(e);n&&(n.removeAllListeners(),n.stop(),this.controllers.delete(e)),this.addController(t)}updateProperty(e,t,n){const r=this.configs.get(e);if(!r)throw new Error(`未找到 ${e}`);r[t]=n}setVisibility(e,t){this.visibility.set(e,t)}setViewIds(e,t){this.visibility.setViewIds(e,t)}sendData(e,t){this.controllers.forEach((n=>n.sendData(e,t)))}sendControlEvent(e){this.controllers.forEach((t=>t.sendControlData(e)))}handleLoop(){try{this.visibility.getChanges().forEach((({viewId:e,nowVisible:t,wasVisible:n})=>{var r,i;const o=this.controllers.get(e);if(!o)return;const s=null==(r=this.configs.get(e))?void 0:r.isControl,a=null==(i=this.configs.get(e))?void 0:i.canOperate;t&&!s&&a?o.requestScreenshot(!0):n&&!t&&o.requestScreenshot(!1)}))}catch(e){}}},e.InputData=class{constructor(e){r(this,"text"),this.text=e}},e.KeyEventData=Le,e.RemotePlayer=qe,e.TouchData=Me,e.TrackEventData=class{constructor(e){r(this,"visible"),this.visible=e}},e.WebRTCSdk=Ue,e.WheelData=xe,e.getKeyEventData=Ve,e.transformCoordinate=Ke,e.valueToPercentage=ze,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
package/package.json
CHANGED