yjz-web-sdk 1.0.8-beta.14 → 1.0.8-beta.16

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.
@@ -23,7 +23,6 @@ export declare class WebRTCClient extends EventEmitter {
23
23
  private rafId;
24
24
  private currentMedia;
25
25
  private fileImage?;
26
- private ua;
27
26
  constructor(config: WebRTCConfig);
28
27
  startPush(useBackCamera?: boolean): Promise<void>;
29
28
  handleOffer(offerSdp: string): void;
@@ -43,7 +42,7 @@ export declare class WebRTCClient extends EventEmitter {
43
42
  private configDataChannel;
44
43
  private handleDataChannelMessage;
45
44
  private checkStats;
46
- private processStats;
45
+ private processStatsOptimized;
47
46
  private getConnectionType;
48
47
  /** 获取或创建 video 元素(懒初始化) */
49
48
  private getFileVideo;
@@ -590,6 +590,7 @@ class SignalingClient extends EventEmitter {
590
590
  const message = {
591
591
  traceId: this.config.traceId,
592
592
  type: SendType.GroupSignIn,
593
+ connectorType: this.config.connectorType,
593
594
  identity: SendType.Identity,
594
595
  turnServerUri: this.config.turnServerUri,
595
596
  mainRoomIdOfGroup: this.config.mainRoomIdOfGroup,
@@ -3259,14 +3260,9 @@ const createAnswer = (peerConnection, sendAnswer, onError) => {
3259
3260
  peerConnection.createAnswer().then((answer) => setLocalDescriptionWithCreateAnswer(peerConnection, answer, sendAnswer, onError)).catch((error) => onError == null ? void 0 : onError(createWebRtcError(FailCode.CREATE_ANSWER, error)));
3260
3261
  };
3261
3262
  const setLocalDescriptionWithCreateAnswer = (peerConnection, answer, sendAnswer, onError) => {
3262
- var _a;
3263
3263
  Logger.info("信息日志:", "设置本地answer Description=======>");
3264
- let sdp2 = (_a = answer.sdp) == null ? void 0 : _a.replace(
3265
- /a=rtpmap:\d+ opus\/48000\/2\r\n/g,
3266
- "$&a=ptime:0\r\na=maxptime:10\r\n"
3267
- );
3268
- peerConnection.setLocalDescription({ type: answer.type, sdp: sdp2 }).then(() => {
3269
- sendAnswer == null ? void 0 : sendAnswer(sdp2 ?? "");
3264
+ peerConnection.setLocalDescription(answer).then(() => {
3265
+ sendAnswer == null ? void 0 : sendAnswer(answer.sdp ?? "");
3270
3266
  }).catch((error) => {
3271
3267
  onError == null ? void 0 : onError(createWebRtcError(FailCode.LOCAL_DES, error));
3272
3268
  });
@@ -3332,15 +3328,10 @@ const createOffer = async (peerConnection, sendOfferMessage) => {
3332
3328
  }
3333
3329
  };
3334
3330
  const setLocalDescriptionWithCreateOffer = async (peerConnection, offer, sendOfferMessage) => {
3335
- var _a;
3336
3331
  Logger.info("信息日志:", "设置本地offer Description=======>");
3337
3332
  try {
3338
- const sdp2 = (_a = offer.sdp) == null ? void 0 : _a.replace(
3339
- /a=rtpmap:\d+ opus\/48000\/2\r\n/g,
3340
- "$&a=ptime:0\r\na=maxptime:10\r\n"
3341
- );
3342
- await peerConnection.setLocalDescription({ type: offer.type, sdp: sdp2 });
3343
- sendOfferMessage(sdp2 ?? "");
3333
+ await peerConnection.setLocalDescription(offer);
3334
+ sendOfferMessage(offer.sdp ?? "");
3344
3335
  } catch (err) {
3345
3336
  throw new Error("摄像头视频流添加失败");
3346
3337
  }
@@ -3568,6 +3559,7 @@ class FileTypeUtils {
3568
3559
  }
3569
3560
  }
3570
3561
  class WebRTCClient extends EventEmitter {
3562
+ // private isFireFox: boolean = false;
3571
3563
  constructor(config) {
3572
3564
  super();
3573
3565
  __publicField(this, "config");
@@ -3591,7 +3583,6 @@ class WebRTCClient extends EventEmitter {
3591
3583
  __publicField(this, "rafId", 0);
3592
3584
  __publicField(this, "currentMedia", null);
3593
3585
  __publicField(this, "fileImage");
3594
- __publicField(this, "ua", "");
3595
3586
  __publicField(this, "startPushLocal", async (file) => {
3596
3587
  var _a;
3597
3588
  if (this.isPushingLocalStream || !file) return;
@@ -3624,7 +3615,6 @@ class WebRTCClient extends EventEmitter {
3624
3615
  }
3625
3616
  });
3626
3617
  this.config = config;
3627
- this.ua = navigator.userAgent;
3628
3618
  }
3629
3619
  async startPush(useBackCamera = true) {
3630
3620
  if (this.isPushingLocalStream) {
@@ -3771,7 +3761,7 @@ class WebRTCClient extends EventEmitter {
3771
3761
  const rotatedStream = await this.getRotatedStream(this.localStream, useBackCamera);
3772
3762
  this.rotatedStream = rotatedStream;
3773
3763
  rotatedStream.getTracks().forEach((track) => {
3774
- track.contentHint = "detail";
3764
+ track.contentHint = "motion";
3775
3765
  const sender = this.peerConnection.addTrack(track, rotatedStream);
3776
3766
  senders.push(sender);
3777
3767
  });
@@ -3844,15 +3834,26 @@ class WebRTCClient extends EventEmitter {
3844
3834
  }
3845
3835
  async getRotatedStream(localStream, useBackCamera) {
3846
3836
  const canvas = document.createElement("canvas");
3837
+ canvas.width = 640;
3838
+ canvas.height = 480;
3839
+ canvas.style.position = "absolute";
3840
+ canvas.style.top = "-9999px";
3841
+ canvas.style.left = "-9999px";
3842
+ canvas.style.width = "1px";
3843
+ canvas.style.height = "1px";
3844
+ canvas.style.opacity = "0";
3845
+ document.body.appendChild(canvas);
3847
3846
  const ctx = canvas.getContext("2d");
3848
3847
  const video = document.createElement("video");
3849
3848
  video.srcObject = localStream;
3850
3849
  video.muted = true;
3850
+ video.playsInline = true;
3851
+ video.autoplay = true;
3852
+ video.setAttribute("playsinline", "true");
3853
+ video.setAttribute("webkit-playsinline", "true");
3851
3854
  await video.play();
3852
3855
  const width = video.videoWidth;
3853
3856
  const height = video.videoHeight;
3854
- canvas.width = 640;
3855
- canvas.height = 480;
3856
3857
  const drawFrame = () => {
3857
3858
  ctx.clearRect(0, 0, canvas.width, canvas.height);
3858
3859
  ctx.save();
@@ -3876,7 +3877,10 @@ class WebRTCClient extends EventEmitter {
3876
3877
  rafId = requestAnimationFrame(drawLoop);
3877
3878
  const stream = canvas.captureStream(fps);
3878
3879
  stream.getTracks().forEach((track) => {
3879
- const stopLoop = () => cancelAnimationFrame(rafId);
3880
+ const stopLoop = () => {
3881
+ cancelAnimationFrame(rafId);
3882
+ canvas.remove();
3883
+ };
3880
3884
  track.addEventListener("ended", stopLoop);
3881
3885
  track.addEventListener("stop", stopLoop);
3882
3886
  });
@@ -3993,13 +3997,19 @@ class WebRTCClient extends EventEmitter {
3993
3997
  }
3994
3998
  }
3995
3999
  checkStats() {
3996
- this.statsTimer = setInterval(() => this.processStats(), 1e3);
3997
- }
3998
- processStats() {
3999
- if (!this.peerConnection) {
4000
- return;
4001
- }
4002
- this.peerConnection.getStats(null).then((statsReport) => {
4000
+ this.statsTimer = setInterval(() => this.processStatsOptimized(), 1e3);
4001
+ }
4002
+ async processStatsOptimized() {
4003
+ const pc = this.peerConnection;
4004
+ if (!pc) return;
4005
+ const ua = navigator.userAgent;
4006
+ const isSafari = /Safari/.test(ua) && !/Chrome/.test(ua);
4007
+ const isMobile = /iPhone|iPad|Android/i.test(ua);
4008
+ const minInterval = isSafari || isMobile ? 3e3 : 1e3;
4009
+ const now = Date.now();
4010
+ if (this.lastReportTime && now - this.lastReportTime < minInterval) return;
4011
+ try {
4012
+ const statsReport = await pc.getStats(null);
4003
4013
  let videoFps = 0;
4004
4014
  let totalDecodeTime = 0;
4005
4015
  let roundTripTime = 0;
@@ -4007,22 +4017,19 @@ class WebRTCClient extends EventEmitter {
4007
4017
  let packetsReceived = 0;
4008
4018
  let bytesReceived = 0;
4009
4019
  let framesDecoded = 0;
4010
- let pliCount = 0;
4011
4020
  let framesReceived = 0;
4021
+ let pliCount = 0;
4012
4022
  let connectionType = "";
4013
- const currentTime = Date.now();
4014
- statsReport.forEach((report) => {
4015
- if (report.type === "inbound-rtp") {
4023
+ for (const report of statsReport.values()) {
4024
+ if (report.type === "inbound-rtp" && report.kind === "video") {
4016
4025
  bytesReceived += report.bytesReceived || 0;
4017
4026
  packetsLost += report.packetsLost || 0;
4018
4027
  packetsReceived += report.packetsReceived || 0;
4019
- if (report.kind === "video") {
4020
- videoFps = report.framesPerSecond || 0;
4021
- totalDecodeTime = report.totalDecodeTime || 0;
4022
- framesDecoded = report.framesDecoded || 0;
4023
- framesReceived = report.framesReceived || 0;
4024
- pliCount = (report.pliCount || 0) + (report.firCount || 0);
4025
- }
4028
+ videoFps = report.framesPerSecond || 0;
4029
+ totalDecodeTime = report.totalDecodeTime || 0;
4030
+ framesDecoded = report.framesDecoded || 0;
4031
+ framesReceived = report.framesReceived || 0;
4032
+ pliCount = (report.pliCount || 0) + (report.firCount || 0);
4026
4033
  }
4027
4034
  if (report.type === "candidate-pair" && report.state === "succeeded") {
4028
4035
  roundTripTime = typeof report.currentRoundTripTime !== "undefined" ? report.currentRoundTripTime : report.responsesReceived > 0 ? report.totalRoundTripTime / report.responsesReceived : 0;
@@ -4032,28 +4039,30 @@ class WebRTCClient extends EventEmitter {
4032
4039
  connectionType = this.getConnectionType(local, remote);
4033
4040
  }
4034
4041
  }
4035
- });
4036
- if (!this.ua.includes("Firefox")) {
4037
- roundTripTime = Math.floor((roundTripTime || 0) * 1e3);
4038
4042
  }
4039
- const deltaTime = currentTime - this.lastReportTime;
4040
- const bytesDiff = bytesReceived - this.lastBytesReceived;
4043
+ if (roundTripTime > 1e3) {
4044
+ roundTripTime = Math.floor(roundTripTime / 1e3);
4045
+ } else if (roundTripTime < 1) {
4046
+ roundTripTime = Math.floor(roundTripTime * 1e3);
4047
+ }
4048
+ const deltaTime = now - (this.lastReportTime || now);
4049
+ const bytesDiff = bytesReceived - (this.lastBytesReceived || 0);
4041
4050
  const bytesPerSecond = deltaTime > 0 ? bytesDiff * 1e3 / deltaTime : 0;
4042
4051
  const kilobytesPerSecond = bytesPerSecond / 1024;
4043
4052
  const megabytesPerSecond = kilobytesPerSecond / 1024;
4044
4053
  this.lastBytesReceived = bytesReceived;
4045
- this.lastReportTime = currentTime;
4054
+ this.lastReportTime = now;
4055
+ const lostPackets = packetsLost - (this.lastPacketsLost || 0);
4056
+ const receivedPackets = packetsReceived - (this.lastPacketsReceived || 0);
4046
4057
  let lossRate = 0;
4047
- const lostPackets = packetsLost - this.lastPacketsLost;
4048
- const receivedPackets = packetsReceived - this.lastPacketsReceived;
4049
4058
  if (lostPackets > 0 && receivedPackets > 0) {
4050
4059
  lossRate = lostPackets / (lostPackets + receivedPackets);
4051
4060
  this.maxLostRate = Math.max(this.maxLostRate || 0, lossRate);
4052
- this.lostPacketCount++;
4061
+ this.lostPacketCount = (this.lostPacketCount || 0) + 1;
4053
4062
  }
4054
4063
  this.lastPacketsLost = packetsLost;
4055
4064
  this.lastPacketsReceived = packetsReceived;
4056
- const fps = typeof videoFps !== "undefined" ? videoFps : framesDecoded - this.lastSecondDecodedCount;
4065
+ const fps = videoFps || framesDecoded - (this.lastSecondDecodedCount || 0);
4057
4066
  this.lastSecondDecodedCount = framesDecoded;
4058
4067
  const bitrate = kilobytesPerSecond < 1024 ? `${Math.floor(kilobytesPerSecond)} KB/s` : `${Math.floor(megabytesPerSecond)} MB/s`;
4059
4068
  const averageDecodeTime = framesDecoded > 0 ? Math.floor(1e4 * totalDecodeTime / framesDecoded) : 0;
@@ -4062,7 +4071,6 @@ class WebRTCClient extends EventEmitter {
4062
4071
  framesPerSecond: fps,
4063
4072
  currentRoundTripTime: roundTripTime,
4064
4073
  lostRate: Math.floor(lossRate * 100),
4065
- // percent
4066
4074
  bitrate,
4067
4075
  pliCount,
4068
4076
  averageDecodeTime,
@@ -4070,9 +4078,9 @@ class WebRTCClient extends EventEmitter {
4070
4078
  framesReceived
4071
4079
  };
4072
4080
  this.emit(EmitType.statisticInfo, screenInfo);
4073
- }).catch((error) => {
4081
+ } catch (error) {
4074
4082
  this.emit(EmitType.webrtcError, createWebRtcError(FailCode.STREAM_STATE, error));
4075
- });
4083
+ }
4076
4084
  }
4077
4085
  getConnectionType(local, remote) {
4078
4086
  if (local.candidateType === "host" && remote.candidateType === "host") return "直连";
@@ -5224,7 +5232,7 @@ function useMouseTouchControl(options) {
5224
5232
  x,
5225
5233
  y
5226
5234
  );
5227
- const touchData = new TouchData(action, 0, percentResult[0], percentResult[1], offsetTime);
5235
+ const touchData = new TouchData(action, 0, percentResult[0], percentResult[1], offsetTime, "web");
5228
5236
  emit("channelEvent", ChannelDataType.ClickData, touchData);
5229
5237
  };
5230
5238
  const handleMouseDown = (event) => {
@@ -14,7 +14,7 @@ i(this,"webSocket",null),i(this,"timeout",null),this.config=e}
14
14
  /**
15
15
  * 发送消息到服务端
16
16
  * @param message - 消息字符串
17
- */sendMessage(e){this.webSocket&&this.webSocket.readyState===WebSocket.OPEN&&this.webSocket.send(e)}sendSignInMessage(){const e={traceId:this.config.traceId,type:h.SignIn,targetId:this.config.myId,identity:h.Identity,turnServerUri:this.config.turnServerUri,roomId:this.config.roomId,token:this.config.token,isGroup:this.config.isGroup,turnKey:this.config.turnKey,connectorType:this.config.connectorType},t=JSON.stringify(e);w.debug("调试日志:",`屏控登录信息====>${t}`),this.sendMessage(t)}sendSwitchControlMessage(e,t){const n={type:h.SwitchControl,identity:h.Identity,roomId:e,connectorType:t,targetId:this.config.myId},i=JSON.stringify(n);w.debug("调试日志:",`切换主控信令消息====>${i}`),this.sendMessage(i)}sendSwitchControlToMainMessage(e){const t={type:h.SwitchControlToMain,identity:h.Identity,groupId:this.config.groupId,turnKey:this.config.turnKey,roomId:e,traceId:P(16)},n=JSON.stringify(t);w.debug("调试日志:",`切换主控信令消息====>${n}`),this.sendMessage(n)}sendGroupAcceptControl(e,t){const n={type:h.GroupAcceptControl,targetId:this.config.myId,identity:h.Identity,roomIds:e,isAccept:t},i=JSON.stringify(n);w.debug("调试日志:",`修改控制状态====>${i}`),this.sendMessage(i)}sendGroupAction(e){const t=P(16),n={type:h.GroupSendAction,identity:h.Identity,targetId:this.config.myId,groupId:this.config.groupId,action:e,epSendAt:Date.now(),traceId:t},i=JSON.stringify(n);w.debug("调试日志:",`发送群控事件====>${i}`),this.sendMessage(i)}sendGroupSignInMessage(){const e={traceId:this.config.traceId,type:h.GroupSignIn,identity:h.Identity,turnServerUri:this.config.turnServerUri,mainRoomIdOfGroup:this.config.mainRoomIdOfGroup,subRoomIdsOfGroup:this.config.subRoomIdsOfGroup,turnKey:this.config.turnKey,groupId:"group_0001",token:this.config.token},t=JSON.stringify(e);w.debug("调试日志:",`群控登录信息====>${t}`),this.sendMessage(t)}}function P(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n="";for(let i=0;i<e;i++){n+=t[Math.floor(62*Math.random())]}return n}let k=!0,I=!0;function A(e,t,n){const i=e.match(t);return i&&i.length>=n&&parseFloat(i[n],10)}function _(e,t,n){if(!e.RTCPeerConnection)return;const i=e.RTCPeerConnection.prototype,r=i.addEventListener;i.addEventListener=function(e,i){if(e!==t)return r.apply(this,arguments);const o=e=>{const t=n(e);t&&(i.handleEvent?i.handleEvent(t):i(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(i,o),r.apply(this,[e,o])};const o=i.removeEventListener;i.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 i=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,i])},Object.defineProperty(i,"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 O(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(k=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function D(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(I=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function M(){if("object"==typeof window){if(k)return;"undefined"!=typeof console&&console.log}}function L(e,t){}function x(e){return"[object Object]"===Object.prototype.toString.call(e)}function N(e){return x(e)?Object.keys(e).reduce(function(t,n){const i=x(e[n]),r=i?N(e[n]):e[n],o=i&&!Object.keys(r).length;return void 0===r||o?t:Object.assign(t,{[n]:r})},{}):e}function j(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach(i=>{i.endsWith("Id")?j(e,e.get(t[i]),n):i.endsWith("Ids")&&t[i].forEach(t=>{j(e,e.get(t),n)})}))}function F(e,t,n){const i=n?"outbound-rtp":"inbound-rtp",r=new Map;if(null===t)return r;const o=[];return e.forEach(e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)}),o.forEach(t=>{e.forEach(n=>{n.type===i&&n.trackId===t.id&&j(e,n,r)})}),r}const U=M;function G(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const i=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 i="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==i.exact&&"number"==typeof i.exact&&(i.min=i.max=i.exact);const r=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==i.ideal){t.optional=t.optional||[];let e={};"number"==typeof i.ideal?(e[r("min",n)]=i.ideal,t.optional.push(e),e={},e[r("max",n)]=i.ideal,t.optional.push(e)):(e[r("",n)]=i.ideal,t.optional.push(e))}void 0!==i.exact&&"number"!=typeof i.exact?(t.mandatory=t.mandatory||{},t.mandatory[r("",n)]=i.exact):["min","max"].forEach(e=>{void 0!==i[e]&&(t.mandatory=t.mandatory||{},t.mandatory[r(e,n)]=i[e])})}),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},r=function(e,r){if(t.version>=61)return r(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=i(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=i(e.video),U("chrome: "+JSON.stringify(e)),r(e)})}e.video=i(e.video)}return U("chrome: "+JSON.stringify(e)),r(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,i){r(e,e=>{n.webkitGetUserMedia(e,t,e=>{i&&i(o(e))})})}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return r(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 K(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function V(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 i;i=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===n.track.id):{track:n.track};const r=new Event("track");r.track=n.track,r.receiver=i,r.transceiver={receiver:i},r.streams=[t.stream],this.dispatchEvent(r)}),t.stream.getTracks().forEach(n=>{let i;i=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===n.id):{track:n};const r=new Event("track");r.track=n,r.receiver=i,r.transceiver={receiver:i},r.streams=[t.stream],this.dispatchEvent(r)})},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else _(e,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function z(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,i){let r=n.apply(this,arguments);return r||(r=t(this,e),this._senders.push(r)),r};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){i.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 i=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],i.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 W(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=>
17
+ */sendMessage(e){this.webSocket&&this.webSocket.readyState===WebSocket.OPEN&&this.webSocket.send(e)}sendSignInMessage(){const e={traceId:this.config.traceId,type:h.SignIn,targetId:this.config.myId,identity:h.Identity,turnServerUri:this.config.turnServerUri,roomId:this.config.roomId,token:this.config.token,isGroup:this.config.isGroup,turnKey:this.config.turnKey,connectorType:this.config.connectorType},t=JSON.stringify(e);w.debug("调试日志:",`屏控登录信息====>${t}`),this.sendMessage(t)}sendSwitchControlMessage(e,t){const n={type:h.SwitchControl,identity:h.Identity,roomId:e,connectorType:t,targetId:this.config.myId},i=JSON.stringify(n);w.debug("调试日志:",`切换主控信令消息====>${i}`),this.sendMessage(i)}sendSwitchControlToMainMessage(e){const t={type:h.SwitchControlToMain,identity:h.Identity,groupId:this.config.groupId,turnKey:this.config.turnKey,roomId:e,traceId:P(16)},n=JSON.stringify(t);w.debug("调试日志:",`切换主控信令消息====>${n}`),this.sendMessage(n)}sendGroupAcceptControl(e,t){const n={type:h.GroupAcceptControl,targetId:this.config.myId,identity:h.Identity,roomIds:e,isAccept:t},i=JSON.stringify(n);w.debug("调试日志:",`修改控制状态====>${i}`),this.sendMessage(i)}sendGroupAction(e){const t=P(16),n={type:h.GroupSendAction,identity:h.Identity,targetId:this.config.myId,groupId:this.config.groupId,action:e,epSendAt:Date.now(),traceId:t},i=JSON.stringify(n);w.debug("调试日志:",`发送群控事件====>${i}`),this.sendMessage(i)}sendGroupSignInMessage(){const e={traceId:this.config.traceId,type:h.GroupSignIn,connectorType:this.config.connectorType,identity:h.Identity,turnServerUri:this.config.turnServerUri,mainRoomIdOfGroup:this.config.mainRoomIdOfGroup,subRoomIdsOfGroup:this.config.subRoomIdsOfGroup,turnKey:this.config.turnKey,groupId:"group_0001",token:this.config.token},t=JSON.stringify(e);w.debug("调试日志:",`群控登录信息====>${t}`),this.sendMessage(t)}}function P(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let n="";for(let i=0;i<e;i++){n+=t[Math.floor(62*Math.random())]}return n}let k=!0,I=!0;function A(e,t,n){const i=e.match(t);return i&&i.length>=n&&parseFloat(i[n],10)}function _(e,t,n){if(!e.RTCPeerConnection)return;const i=e.RTCPeerConnection.prototype,r=i.addEventListener;i.addEventListener=function(e,i){if(e!==t)return r.apply(this,arguments);const o=e=>{const t=n(e);t&&(i.handleEvent?i.handleEvent(t):i(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(i,o),r.apply(this,[e,o])};const o=i.removeEventListener;i.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 i=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,i])},Object.defineProperty(i,"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 O(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(k=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function D(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(I=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function M(){if("object"==typeof window){if(k)return;"undefined"!=typeof console&&console.log}}function L(e,t){}function x(e){return"[object Object]"===Object.prototype.toString.call(e)}function N(e){return x(e)?Object.keys(e).reduce(function(t,n){const i=x(e[n]),r=i?N(e[n]):e[n],o=i&&!Object.keys(r).length;return void 0===r||o?t:Object.assign(t,{[n]:r})},{}):e}function j(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach(i=>{i.endsWith("Id")?j(e,e.get(t[i]),n):i.endsWith("Ids")&&t[i].forEach(t=>{j(e,e.get(t),n)})}))}function F(e,t,n){const i=n?"outbound-rtp":"inbound-rtp",r=new Map;if(null===t)return r;const o=[];return e.forEach(e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)}),o.forEach(t=>{e.forEach(n=>{n.type===i&&n.trackId===t.id&&j(e,n,r)})}),r}const U=M;function G(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const i=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 i="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==i.exact&&"number"==typeof i.exact&&(i.min=i.max=i.exact);const r=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==i.ideal){t.optional=t.optional||[];let e={};"number"==typeof i.ideal?(e[r("min",n)]=i.ideal,t.optional.push(e),e={},e[r("max",n)]=i.ideal,t.optional.push(e)):(e[r("",n)]=i.ideal,t.optional.push(e))}void 0!==i.exact&&"number"!=typeof i.exact?(t.mandatory=t.mandatory||{},t.mandatory[r("",n)]=i.exact):["min","max"].forEach(e=>{void 0!==i[e]&&(t.mandatory=t.mandatory||{},t.mandatory[r(e,n)]=i[e])})}),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},r=function(e,r){if(t.version>=61)return r(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=i(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=i(e.video),U("chrome: "+JSON.stringify(e)),r(e)})}e.video=i(e.video)}return U("chrome: "+JSON.stringify(e)),r(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,i){r(e,e=>{n.webkitGetUserMedia(e,t,e=>{i&&i(o(e))})})}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return r(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 K(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function V(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 i;i=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===n.track.id):{track:n.track};const r=new Event("track");r.track=n.track,r.receiver=i,r.transceiver={receiver:i},r.streams=[t.stream],this.dispatchEvent(r)}),t.stream.getTracks().forEach(n=>{let i;i=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===n.id):{track:n};const r=new Event("track");r.track=n,r.receiver=i,r.transceiver={receiver:i},r.streams=[t.stream],this.dispatchEvent(r)})},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else _(e,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function z(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,i){let r=n.apply(this,arguments);return r||(r=t(this,e),this._senders.push(r)),r};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){i.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 i=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],i.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 W(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=>
18
18
  /* Note: this will include stats of all senders that
19
19
  * send a track with the same id as sender.track as
20
20
  * it is not possible to identify the RTCRtpSender.
@@ -27,7 +27,7 @@ type:t[7]};for(let i=8;i<t.length;i+=2)switch(t[i]){case"raddr":n.relatedAddress
27
27
  // algorithm is case-sensitive in Edge.
28
28
  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 i=t.matchPrefix(e+n,"a=ice-ufrag:")[0],r=t.matchPrefix(e+n,"a=ice-pwd:")[0];return i&&r?{usernameFragment:i.substring(12),password:r.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:[]},i=t.splitLines(e)[0].split(" ");n.profile=i[2];for(let o=3;o<i.length;o++){const r=i[o],s=t.matchPrefix(e,"a=rtpmap:"+r+" ")[0];if(s){const i=t.parseRtpMap(s),o=t.matchPrefix(e,"a=fmtp:"+r+" ");switch(i.parameters=o.length?t.parseFmtp(o[0]):{},i.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+r+" ").map(t.parseRtcpFb),n.codecs.push(i),i.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(i.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach(e=>{n.headerExtensions.push(t.parseExtmap(e))});const r=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach(e=>{r.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 i="";i+="m="+e+" ",i+=n.codecs.length>0?"9":"0",i+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",i+=n.codecs.map(e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType).join(" ")+"\r\n",i+="c=IN IP4 0.0.0.0\r\n",i+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach(e=>{i+=t.writeRtpMap(e),i+=t.writeFmtp(e),i+=t.writeRtcpFb(e)});let r=0;return n.codecs.forEach(e=>{e.maxptime>r&&(r=e.maxptime)}),r>0&&(i+="a=maxptime:"+r+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach(e=>{i+=t.writeExtmap(e)}),i},t.parseRtpEncodingParameters=function(e){const n=[],i=t.parseRtpParameters(e),r=-1!==i.fecMechanisms.indexOf("RED"),o=-1!==i.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]),i.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),r&&(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={},i=t.matchPrefix(e,"a=ssrc:").map(e=>t.parseSsrcMedia(e)).filter(e=>"cname"===e.attribute)[0];i&&(n.cname=i.value,n.ssrc=i.ssrc);const r=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=r.length>0,n.compound=0===r.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 i=t.matchPrefix(e,"a=msid:");if(1===i.length)return n=i[0].substring(7).split(" "),{stream:n[0],track:n[1]};const r=t.matchPrefix(e,"a=ssrc:").map(e=>t.parseSsrcMedia(e)).filter(e=>"msid"===e.attribute);return r.length>0?(n=r[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),i=t.matchPrefix(e,"a=max-message-size:");let r;i.length>0&&(r=parseInt(i[0].substring(19),10)),isNaN(r)&&(r=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:r};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:r}}},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,i){let r;const o=void 0!==n?n:2;return r=e||t.generateSessionId(),"v=0\r\no="+(i||"thisisadapterortc")+" "+r+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const i=t.splitLines(e);for(let t=0;t<i.length;t++)switch(i[t]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return i[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}(ve)),ve.exports);const Te=o(Se),Re=r({__proto__:null,default:Te},[Se]);function be(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),i=Te.parseCandidate(e.candidate);for(const e in i)e in n||Object.defineProperty(n,e,{value:i[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,_(e,"icecandidate",t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t))}function we(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||_(e,"icecandidate",e=>{if(e.candidate){const t=Te.parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e})}function Ee(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=Te.splitSections(e.sdp);return t.shift(),t.some(e=>{const t=Te.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),i=function(e,n){let i=65536;"firefox"===t.browser&&57===t.version&&(i=65535);const r=Te.matchPrefix(e.sdp,"a=max-message-size:");return r.length>0?i=parseInt(r[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(i=2147483637),i}(arguments[0],e);let r;r=0===n&&0===i?Number.POSITIVE_INFINITY:0===n||0===i?Math.max(n,i):Math.min(n,i);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>r}),this._sctp=o}return n.apply(this,arguments)}}function Pe(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const i=arguments[0],r=i.length||i.size||i.byteLength;if("open"===e.readyState&&t.sctp&&r>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},_(e,"datachannel",e=>(t(e.channel,e.target),e))}function ke(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 Ie(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 Ae(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 _e(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 Oe=Object.freeze(Object.defineProperty({__proto__:null,removeExtmapAllowMixed:Ie,shimAddIceCandidateNullOrEmpty:Ae,shimConnectionState:ke,shimMaxMessageSize:Ee,shimParameterlessSetLocalDescription:_e,shimRTCIceCandidate:be,shimRTCIceCandidateRelayProtocol:we,shimSendThrowTypeError:Pe},Symbol.toStringTag,{value:"Module"}));!function({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const n=M,i=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(A(n.userAgent,/Firefox\/(\d+)\./,1));else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=parseInt(A(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(A(n.userAgent,/AppleWebKit\/(\d+)\./,1)),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype,t._safariVersion=A(n.userAgent,/Version\/(\d+(\.?\d+))/,1)}return t}(e),r={browserDetails:i,commonShim:Oe,extractVersion:A,disableLog:O,disableWarnings:D,
29
29
  // Expose sdp as a convenience. For production apps include directly.
30
- sdp:Re};switch(i.browser){case"chrome":if(!q||!H||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),r;if(null===i.version)return n("Chrome shim can not determine version, not shimming."),r;n("adapter.js shimming chrome."),r.browserShim=q,Ae(e,i),_e(e),G(e,i),K(e),H(e,i),V(e),J(e,i),z(e),W(e),$(e,i),be(e),we(e),ke(e),Ee(e,i),Pe(e),Ie(e,i);break;case"firefox":if(!ae||!Q||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),r;n("adapter.js shimming firefox."),r.browserShim=ae,Ae(e,i),_e(e),X(e,i),Q(e,i),Y(e),te(e),Z(e),ee(e),ne(e),ie(e),re(e),oe(e),se(e),be(e),ke(e),Ee(e,i),Pe(e);break;case"safari":if(!Ce||!t.shimSafari)return n("Safari shim is not included in this adapter release."),r;n("adapter.js shimming safari."),r.browserShim=Ce,Ae(e,i),_e(e),ue(e),me(e),le(e),ce(e),de(e),fe(e),he(e),ge(e),be(e),we(e),Ee(e,i),Pe(e),Ie(e,i);break;default:n("Unsupported browser!")}}({window:"undefined"==typeof window?void 0:window});class De{constructor(e){i(this,"signalServerUrl"),i(this,"myId"),i(this,"roomId"),i(this,"targetId"),i(this,"stunServerUri"),i(this,"stunServerUriAli"),i(this,"stunServerUriTel"),i(this,"turnServerUri"),i(this,"turnServerUserName"),i(this,"turnServerPassword"),i(this,"token"),i(this,"connectorType"),i(this,"mainRoomIdOfGroup"),i(this,"subRoomIdsOfGroup"),i(this,"mainCloudMyId"),i(this,"connectorAndRoomId"),i(this,"groupId"),i(this,"isGroup"),i(this,"turnKey"),i(this,"traceId",""),i(this,"signAgain"),this.signalServerUrl=e.signalServerUrl||"",this.myId=e.myId||"",this.roomId=e.roomId||"",this.targetId=e.targetId||"",this.turnKey=e.turnKey||[],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.token=e.token,this.connectorType=e.connectorType||p.WebRTC,this.mainRoomIdOfGroup=e.mainRoomIdOfGroup,this.subRoomIdsOfGroup=e.subRoomIdsOfGroup,this.connectorAndRoomId=e.connectorAndRoomId,this.mainCloudMyId=e.mainCloudMyId,this.groupId=e.groupId,this.isGroup=e.isGroup,this.traceId=e.traceId||"",this.signAgain=e.signAgain||!0}}const Me=(e,t,n)=>{w.info("信息日志:","创建webrtcAnswer=======>"),e.createAnswer().then(i=>Le(e,i,t,n)).catch(e=>null==n?void 0:n(g(u.CREATE_ANSWER,e)))},Le=(e,t,n,i)=>{var r;w.info("信息日志:","设置本地answer Description=======>");let o=null==(r=t.sdp)?void 0:r.replace(/a=rtpmap:\d+ opus\/48000\/2\r\n/g,"$&a=ptime:0\r\na=maxptime:10\r\n");e.setLocalDescription({type:t.type,sdp:o}).then(()=>{null==n||n(o??"")}).catch(e=>{null==i||i(g(u.LOCAL_DES,e))})},xe=async(e,t)=>{try{const n=await e.createOffer();await Ne(e,n,t)}catch(n){throw new Error("摄像头视频流添加失败")}},Ne=async(e,t,n)=>{var i;w.info("信息日志:","设置本地offer Description=======>");try{const r=null==(i=t.sdp)?void 0:i.replace(/a=rtpmap:\d+ opus\/48000\/2\r\n/g,"$&a=ptime:0\r\na=maxptime:10\r\n");await e.setLocalDescription({type:t.type,sdp:r}),n(r??"")}catch(r){throw new Error("摄像头视频流添加失败")}};var je=(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))(je||{}),Fe=(e=>(e.ENABLE="ENABLE",e.DISABLE="DISABLE",e))(Fe||{}),Ue=(e=>(e.ActionBack="ActionBack",e.ActionHome="ActionHome",e.ActionRecent="ActionRecent",e.ActionSwitchNavButtons="ActionSwitchNavButtons",e.ActionSwitchNavGestural="ActionSwitchNavGestural",e))(Ue||{}),Ge=(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))(Ge||{});const Ke={ACTION_DOWN:0,ACTION_MOVE:2,ACTION_UP:1},Ve={ROTATION_0:0,ROTATION_180:2},ze={Vertical:0,Horizontal:1};class We{constructor(e,t,n,r,o,s="adb"){i(this,"action"),i(this,"p"),i(this,"x"),i(this,"y"),i(this,"offsetTime"),i(this,"type"),this.action=e,this.p=t,this.x=n,this.y=r,this.offsetTime=o,this.type=s}}class Be{constructor(e){i(this,"axis"),this.axis=e}}class Je{constructor(e,t){i(this,"keyCode"),i(this,"meta"),this.keyCode=e,this.meta=t}}class He{constructor(e,t=null,n=null){i(this,"type"),i(this,"data"),i(this,"myId"),this.type=e,this.data=t,this.myId=n}toString(){return JSON.stringify({type:this.type,data:this.data,myId:this.myId})}
30
+ sdp:Re};switch(i.browser){case"chrome":if(!q||!H||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),r;if(null===i.version)return n("Chrome shim can not determine version, not shimming."),r;n("adapter.js shimming chrome."),r.browserShim=q,Ae(e,i),_e(e),G(e,i),K(e),H(e,i),V(e),J(e,i),z(e),W(e),$(e,i),be(e),we(e),ke(e),Ee(e,i),Pe(e),Ie(e,i);break;case"firefox":if(!ae||!Q||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),r;n("adapter.js shimming firefox."),r.browserShim=ae,Ae(e,i),_e(e),X(e,i),Q(e,i),Y(e),te(e),Z(e),ee(e),ne(e),ie(e),re(e),oe(e),se(e),be(e),ke(e),Ee(e,i),Pe(e);break;case"safari":if(!Ce||!t.shimSafari)return n("Safari shim is not included in this adapter release."),r;n("adapter.js shimming safari."),r.browserShim=Ce,Ae(e,i),_e(e),ue(e),me(e),le(e),ce(e),de(e),fe(e),he(e),ge(e),be(e),we(e),Ee(e,i),Pe(e),Ie(e,i);break;default:n("Unsupported browser!")}}({window:"undefined"==typeof window?void 0:window});class De{constructor(e){i(this,"signalServerUrl"),i(this,"myId"),i(this,"roomId"),i(this,"targetId"),i(this,"stunServerUri"),i(this,"stunServerUriAli"),i(this,"stunServerUriTel"),i(this,"turnServerUri"),i(this,"turnServerUserName"),i(this,"turnServerPassword"),i(this,"token"),i(this,"connectorType"),i(this,"mainRoomIdOfGroup"),i(this,"subRoomIdsOfGroup"),i(this,"mainCloudMyId"),i(this,"connectorAndRoomId"),i(this,"groupId"),i(this,"isGroup"),i(this,"turnKey"),i(this,"traceId",""),i(this,"signAgain"),this.signalServerUrl=e.signalServerUrl||"",this.myId=e.myId||"",this.roomId=e.roomId||"",this.targetId=e.targetId||"",this.turnKey=e.turnKey||[],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.token=e.token,this.connectorType=e.connectorType||p.WebRTC,this.mainRoomIdOfGroup=e.mainRoomIdOfGroup,this.subRoomIdsOfGroup=e.subRoomIdsOfGroup,this.connectorAndRoomId=e.connectorAndRoomId,this.mainCloudMyId=e.mainCloudMyId,this.groupId=e.groupId,this.isGroup=e.isGroup,this.traceId=e.traceId||"",this.signAgain=e.signAgain||!0}}const Me=(e,t,n)=>{w.info("信息日志:","创建webrtcAnswer=======>"),e.createAnswer().then(i=>Le(e,i,t,n)).catch(e=>null==n?void 0:n(g(u.CREATE_ANSWER,e)))},Le=(e,t,n,i)=>{w.info("信息日志:","设置本地answer Description=======>"),e.setLocalDescription(t).then(()=>{null==n||n(t.sdp??"")}).catch(e=>{null==i||i(g(u.LOCAL_DES,e))})},xe=async(e,t)=>{try{const n=await e.createOffer();await Ne(e,n,t)}catch(n){throw new Error("摄像头视频流添加失败")}},Ne=async(e,t,n)=>{w.info("信息日志:","设置本地offer Description=======>");try{await e.setLocalDescription(t),n(t.sdp??"")}catch(i){throw new Error("摄像头视频流添加失败")}};var je=(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))(je||{}),Fe=(e=>(e.ENABLE="ENABLE",e.DISABLE="DISABLE",e))(Fe||{}),Ue=(e=>(e.ActionBack="ActionBack",e.ActionHome="ActionHome",e.ActionRecent="ActionRecent",e.ActionSwitchNavButtons="ActionSwitchNavButtons",e.ActionSwitchNavGestural="ActionSwitchNavGestural",e))(Ue||{}),Ge=(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))(Ge||{});const Ke={ACTION_DOWN:0,ACTION_MOVE:2,ACTION_UP:1},Ve={ROTATION_0:0,ROTATION_180:2},ze={Vertical:0,Horizontal:1};class We{constructor(e,t,n,r,o,s="adb"){i(this,"action"),i(this,"p"),i(this,"x"),i(this,"y"),i(this,"offsetTime"),i(this,"type"),this.action=e,this.p=t,this.x=n,this.y=r,this.offsetTime=o,this.type=s}}class Be{constructor(e){i(this,"axis"),this.axis=e}}class Je{constructor(e,t){i(this,"keyCode"),i(this,"meta"),this.keyCode=e,this.meta=t}}class He{constructor(e,t=null,n=null){i(this,"type"),i(this,"data"),i(this,"myId"),this.type=e,this.data=t,this.myId=n}toString(){return JSON.stringify({type:this.type,data:this.data,myId:this.myId})}
31
31
  /**
32
32
  * 格式化数据
33
33
  * 如果数据已经是字符串,则直接返回;否则使用 JSON.stringify() 转换为字符串
@@ -66,10 +66,12 @@ sdp:Re};switch(i.browser){case"chrome":if(!q||!H||!t.shimChrome)return n("Chrome
66
66
  * @param data 清晰度数据
67
67
  */static clarity(e){return new He("ActionClarity",this.formatData(e))}static switchAudio(e){return new He("ActionCommandEvent",this.formatData(e))}static changeSender(e){return new He("ActionTrack",this.formatData(e))}}class $e{
68
68
  /** 读取文件头并判断类型 */
69
- static async detectFileType(e){const t=await e.slice(0,16).arrayBuffer(),n=new Uint8Array(t);return 255===n[0]&&216===n[1]&&255===n[2]||137===n[0]&&80===n[1]&&78===n[2]&&71===n[3]||71===n[0]&&73===n[1]&&70===n[2]&&56===n[3]||82===n[0]&&73===n[1]&&70===n[2]&&70===n[3]&&87===n[8]&&69===n[9]&&66===n[10]&&80===n[11]?"image":"ftyp"===String.fromCharCode(...n.slice(4,8))||26===n[0]&&69===n[1]&&223===n[2]&&163===n[3]||79===n[0]&&103===n[1]&&103===n[2]&&83===n[3]?"video":"unknown"}}class qe extends d{constructor(e){super(),i(this,"config"),i(this,"peerConnection",null),i(this,"localStream",null),i(this,"rotatedStream",null),i(this,"isPushingStream",!1),i(this,"isPushingLocalStream",!1),i(this,"dataChannel",null),i(this,"statsTimer"),i(this,"lastReportTime",0),i(this,"lastBytesReceived",0),i(this,"lastPacketsLost",0),i(this,"lastPacketsReceived",0),i(this,"lostPacketCount",0),i(this,"maxLostRate",0),i(this,"lastSecondDecodedCount",0),i(this,"fileVideo"),i(this,"canvas"),i(this,"canvasStream",null),i(this,"rafId",0),i(this,"currentMedia",null),i(this,"fileImage"),i(this,"ua",""),i(this,"startPushLocal",async e=>{var t;if(!this.isPushingLocalStream&&e)try{await this.loadMedia(e),this.startCanvasStream();const n=[];null==(t=this.canvasStream)||t.getTracks().forEach(e=>{e.contentHint="detail";const t=this.peerConnection.addTrack(e,this.canvasStream);n.push(t)}),n.forEach(e=>this.setVideoParams(e)),await xe(this.peerConnection,e=>{this.emit(y.sendOffer,e)}),this.isPushingLocalStream=!0}catch(n){let e;this.isPushingLocalStream=!1,e=n instanceof Error?n.message:String(n),this.emit(y.cameraError,C(m.LOCAL_STREAM_FAIL,e))}}),this.config=e,this.ua=navigator.userAgent}async startPush(e=!0){this.isPushingLocalStream&&this.stopLocal();try{this.isPushingStream=!0,await this.readyCapture(e)}catch(t){let e;this.isPushingStream=!1,e=t instanceof Error?t.message:String(t),this.emit(y.cameraError,C(m.CAMERA_STREAM_FAIL,e))}}handleOffer(e){this.resetPeerConnection(),((e,t,n,i)=>{w.info("信息日志:","设置远程offer Description=======>");const r=new RTCSessionDescription({type:"offer",sdp:t});e.setRemoteDescription(r).then(()=>Me(e,n,i)).catch(e=>null==i?void 0:i(g(u.HANDLE_OFFER,e)))})(this.peerConnection,e,e=>{this.emit(y.sendAnswer,e)},e=>this.emit(y.webrtcError,e))}handleAnswer(e){((e,t,n)=>{const i=new RTCSessionDescription({type:"answer",sdp:t});e.setRemoteDescription(i).catch(e=>null==n?void 0:n(g(u.REMOTE_DES,e)))})(this.peerConnection,e??"",e=>this.emit(y.webrtcError,e))}handleIceCandidate(e){((e,t,n)=>{w.info("信息日志:","接收远程ice 并设置=======>"),e.addIceCandidate(t).catch(e=>null==n?void 0:n(g(u.HANDLE_ICE,e)))})(this.peerConnection,e,e=>this.emit(y.webrtcError,e))}sendChannelData(e,t){var n;try{let i=null;switch(e){case je.ClickData:i=He.click(t);break;case je.ClipboardData:i=He.clipboard(t);break;case je.ActionInput:i=He.input(t,this.config.myId);break;case je.ActionChinese:i=He.chinese(t);break;case je.ActionRequestCloudDeviceInfo:i=He.requestCloudDeviceInfo();break;case je.ActionClarity:i=He.clarity(t);break;case je.ActionWheel:i=He.wheel(t);break;case je.ActionGesture:i=He.gesture(t);break;case je.ActionCommand:i=He.action(t);break;case je.ActionCommandEvent:i=He.switchAudio(t);break;case je.ActionTrack:i=He.changeSender(t)}if(i){const e=JSON.stringify(i),t=(new TextEncoder).encode(e).buffer;null==(n=this.dataChannel)||n.send(t),i=null}}catch(i){this.emit(y.webrtcError,g(u.DATACHANNEL_ERR,i))}}closeConnection(){w.info("信息日志:","关闭webrtc连接=======>"),this.statsTimer&&(clearInterval(this.statsTimer),this.statsTimer=void 0),this.stopPush(),this.stopLocal(),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(e){this.resetPeerConnection(),this.stopPush(),w.info("信息日志:","启用摄像头推流到云机=======>",e);try{this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:{ideal:640},height:{ideal:480},facingMode:e?{ideal:"environment"}:{ideal:"user"},frameRate:{ideal:20,max:30}},audio:!0});const t=[],n=await this.getRotatedStream(this.localStream,e);this.rotatedStream=n,n.getTracks().forEach(e=>{e.contentHint="detail";const i=this.peerConnection.addTrack(e,n);t.push(i)}),await xe(this.peerConnection,e=>{this.emit(y.sendOffer,e)}),t.forEach(e=>this.setVideoParams(e))}catch(t){if(t instanceof DOMException)switch(t.name){case"NotAllowedError":throw new Error("用户拒绝了摄像头或麦克风权限");case"NotFoundError":throw new Error("未找到摄像头或麦克风设备");case"OverconstrainedError":throw new Error("设备无法满足指定约束");case"NotReadableError":throw new Error("设备忙或无法访问");default:throw new Error(`其他错误: ${t.message}`)}throw new Error(`mediaDevices 异常: ${t}`)}}
69
+ static async detectFileType(e){const t=await e.slice(0,16).arrayBuffer(),n=new Uint8Array(t);return 255===n[0]&&216===n[1]&&255===n[2]||137===n[0]&&80===n[1]&&78===n[2]&&71===n[3]||71===n[0]&&73===n[1]&&70===n[2]&&56===n[3]||82===n[0]&&73===n[1]&&70===n[2]&&70===n[3]&&87===n[8]&&69===n[9]&&66===n[10]&&80===n[11]?"image":"ftyp"===String.fromCharCode(...n.slice(4,8))||26===n[0]&&69===n[1]&&223===n[2]&&163===n[3]||79===n[0]&&103===n[1]&&103===n[2]&&83===n[3]?"video":"unknown"}}class qe extends d{
70
+ // private isFireFox: boolean = false;
71
+ constructor(e){super(),i(this,"config"),i(this,"peerConnection",null),i(this,"localStream",null),i(this,"rotatedStream",null),i(this,"isPushingStream",!1),i(this,"isPushingLocalStream",!1),i(this,"dataChannel",null),i(this,"statsTimer"),i(this,"lastReportTime",0),i(this,"lastBytesReceived",0),i(this,"lastPacketsLost",0),i(this,"lastPacketsReceived",0),i(this,"lostPacketCount",0),i(this,"maxLostRate",0),i(this,"lastSecondDecodedCount",0),i(this,"fileVideo"),i(this,"canvas"),i(this,"canvasStream",null),i(this,"rafId",0),i(this,"currentMedia",null),i(this,"fileImage"),i(this,"startPushLocal",async e=>{var t;if(!this.isPushingLocalStream&&e)try{await this.loadMedia(e),this.startCanvasStream();const n=[];null==(t=this.canvasStream)||t.getTracks().forEach(e=>{e.contentHint="detail";const t=this.peerConnection.addTrack(e,this.canvasStream);n.push(t)}),n.forEach(e=>this.setVideoParams(e)),await xe(this.peerConnection,e=>{this.emit(y.sendOffer,e)}),this.isPushingLocalStream=!0}catch(n){let e;this.isPushingLocalStream=!1,e=n instanceof Error?n.message:String(n),this.emit(y.cameraError,C(m.LOCAL_STREAM_FAIL,e))}}),this.config=e}async startPush(e=!0){this.isPushingLocalStream&&this.stopLocal();try{this.isPushingStream=!0,await this.readyCapture(e)}catch(t){let e;this.isPushingStream=!1,e=t instanceof Error?t.message:String(t),this.emit(y.cameraError,C(m.CAMERA_STREAM_FAIL,e))}}handleOffer(e){this.resetPeerConnection(),((e,t,n,i)=>{w.info("信息日志:","设置远程offer Description=======>");const r=new RTCSessionDescription({type:"offer",sdp:t});e.setRemoteDescription(r).then(()=>Me(e,n,i)).catch(e=>null==i?void 0:i(g(u.HANDLE_OFFER,e)))})(this.peerConnection,e,e=>{this.emit(y.sendAnswer,e)},e=>this.emit(y.webrtcError,e))}handleAnswer(e){((e,t,n)=>{const i=new RTCSessionDescription({type:"answer",sdp:t});e.setRemoteDescription(i).catch(e=>null==n?void 0:n(g(u.REMOTE_DES,e)))})(this.peerConnection,e??"",e=>this.emit(y.webrtcError,e))}handleIceCandidate(e){((e,t,n)=>{w.info("信息日志:","接收远程ice 并设置=======>"),e.addIceCandidate(t).catch(e=>null==n?void 0:n(g(u.HANDLE_ICE,e)))})(this.peerConnection,e,e=>this.emit(y.webrtcError,e))}sendChannelData(e,t){var n;try{let i=null;switch(e){case je.ClickData:i=He.click(t);break;case je.ClipboardData:i=He.clipboard(t);break;case je.ActionInput:i=He.input(t,this.config.myId);break;case je.ActionChinese:i=He.chinese(t);break;case je.ActionRequestCloudDeviceInfo:i=He.requestCloudDeviceInfo();break;case je.ActionClarity:i=He.clarity(t);break;case je.ActionWheel:i=He.wheel(t);break;case je.ActionGesture:i=He.gesture(t);break;case je.ActionCommand:i=He.action(t);break;case je.ActionCommandEvent:i=He.switchAudio(t);break;case je.ActionTrack:i=He.changeSender(t)}if(i){const e=JSON.stringify(i),t=(new TextEncoder).encode(e).buffer;null==(n=this.dataChannel)||n.send(t),i=null}}catch(i){this.emit(y.webrtcError,g(u.DATACHANNEL_ERR,i))}}closeConnection(){w.info("信息日志:","关闭webrtc连接=======>"),this.statsTimer&&(clearInterval(this.statsTimer),this.statsTimer=void 0),this.stopPush(),this.stopLocal(),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(e){this.resetPeerConnection(),this.stopPush(),w.info("信息日志:","启用摄像头推流到云机=======>",e);try{this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:{ideal:640},height:{ideal:480},facingMode:e?{ideal:"environment"}:{ideal:"user"},frameRate:{ideal:20,max:30}},audio:!0});const t=[],n=await this.getRotatedStream(this.localStream,e);this.rotatedStream=n,n.getTracks().forEach(e=>{e.contentHint="motion";const i=this.peerConnection.addTrack(e,n);t.push(i)}),await xe(this.peerConnection,e=>{this.emit(y.sendOffer,e)}),t.forEach(e=>this.setVideoParams(e))}catch(t){if(t instanceof DOMException)switch(t.name){case"NotAllowedError":throw new Error("用户拒绝了摄像头或麦克风权限");case"NotFoundError":throw new Error("未找到摄像头或麦克风设备");case"OverconstrainedError":throw new Error("设备无法满足指定约束");case"NotReadableError":throw new Error("设备忙或无法访问");default:throw new Error(`其他错误: ${t.message}`)}throw new Error(`mediaDevices 异常: ${t}`)}}
70
72
  /**
71
73
  * ✅ 切换前后摄像头(无缝)
72
- */async switchCamera(e){var t;try{w.info("信息日志:","切换摄像头 => "+(e?"后置":"前置")),this.isPushingStream=!0,this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:{ideal:640},height:{ideal:480},facingMode:e?{ideal:"environment"}:{ideal:"user"},frameRate:{ideal:20,max:30}},audio:!1});const n=await this.getRotatedStream(this.localStream,e);this.rotatedStream=n;const i=this.rotatedStream.getVideoTracks()[0],r=null==(t=this.peerConnection)?void 0:t.getSenders().find(e=>e.track&&"video"===e.track.kind);r&&await r.replaceTrack(i)}catch(n){if(this.isPushingStream=!1,n instanceof DOMException)switch(n.name){case"NotAllowedError":throw new Error("用户拒绝了摄像头或麦克风权限");case"NotFoundError":throw new Error("未找到摄像头或麦克风设备");case"OverconstrainedError":throw new Error("设备无法满足指定约束");case"NotReadableError":throw new Error("设备忙或无法访问");default:throw new Error(`其他错误: ${n.message}`)}throw new Error(`mediaDevices 异常: ${n}`)}}async getRotatedStream(e,t){const n=document.createElement("canvas"),i=n.getContext("2d"),r=document.createElement("video");r.srcObject=e,r.muted=!0,await r.play();const o=r.videoWidth,s=r.videoHeight;n.width=640,n.height=480;let a,c=0;const d=e=>{e-c>=40&&((()=>{i.clearRect(0,0,n.width,n.height),i.save(),i.translate(n.width/2,n.height/2);const e=t?-Math.PI/2:Math.PI/2;i.rotate(e),i.drawImage(r,-o/2,-s/2,o,s),i.restore()})(),c=e),a=requestAnimationFrame(d)};a=requestAnimationFrame(d);const l=n.captureStream(25);return l.getTracks().forEach(e=>{const t=()=>cancelAnimationFrame(a);e.addEventListener("ended",t),e.addEventListener("stop",t)}),l}
74
+ */async switchCamera(e){var t;try{w.info("信息日志:","切换摄像头 => "+(e?"后置":"前置")),this.isPushingStream=!0,this.localStream=await navigator.mediaDevices.getUserMedia({video:{width:{ideal:640},height:{ideal:480},facingMode:e?{ideal:"environment"}:{ideal:"user"},frameRate:{ideal:20,max:30}},audio:!1});const n=await this.getRotatedStream(this.localStream,e);this.rotatedStream=n;const i=this.rotatedStream.getVideoTracks()[0],r=null==(t=this.peerConnection)?void 0:t.getSenders().find(e=>e.track&&"video"===e.track.kind);r&&await r.replaceTrack(i)}catch(n){if(this.isPushingStream=!1,n instanceof DOMException)switch(n.name){case"NotAllowedError":throw new Error("用户拒绝了摄像头或麦克风权限");case"NotFoundError":throw new Error("未找到摄像头或麦克风设备");case"OverconstrainedError":throw new Error("设备无法满足指定约束");case"NotReadableError":throw new Error("设备忙或无法访问");default:throw new Error(`其他错误: ${n.message}`)}throw new Error(`mediaDevices 异常: ${n}`)}}async getRotatedStream(e,t){const n=document.createElement("canvas");n.width=640,n.height=480,n.style.position="absolute",n.style.top="-9999px",n.style.left="-9999px",n.style.width="1px",n.style.height="1px",n.style.opacity="0",document.body.appendChild(n);const i=n.getContext("2d"),r=document.createElement("video");r.srcObject=e,r.muted=!0,r.playsInline=!0,r.autoplay=!0,r.setAttribute("playsinline","true"),r.setAttribute("webkit-playsinline","true"),await r.play();const o=r.videoWidth,s=r.videoHeight;let a,c=0;const d=e=>{e-c>=40&&((()=>{i.clearRect(0,0,n.width,n.height),i.save(),i.translate(n.width/2,n.height/2);const e=t?-Math.PI/2:Math.PI/2;i.rotate(e),i.drawImage(r,-o/2,-s/2,o,s),i.restore()})(),c=e),a=requestAnimationFrame(d)};a=requestAnimationFrame(d);const l=n.captureStream(25);return l.getTracks().forEach(e=>{const t=()=>{cancelAnimationFrame(a),n.remove()};e.addEventListener("ended",t),e.addEventListener("stop",t)}),l}
73
75
  // private async setVideoParams(sender: RTCRtpSender) {
74
76
  // Logger.info('信息日志:', '设置推流视频参数=======>')
75
77
  // const params = sender.getParameters();
@@ -82,9 +84,7 @@ static async detectFileType(e){const t=await e.slice(0,16).arrayBuffer(),n=new U
82
84
  // });
83
85
  // await sender.setParameters(params);
84
86
  // }
85
- async setVideoParams(e){const t=e.getParameters(),n=/Android|iPhone|iPad/i.test(navigator.userAgent)?6e5:18e5;t.degradationPreference="maintain-resolution",t.encodings&&0!==t.encodings.length||(t.encodings=[{}]),t.encodings.forEach(e=>{e.maxBitrate=n,e.maxFramerate=30,e.scaleResolutionDownBy=1,e.priority="high"});try{await e.setParameters(t),w.info("信息日志:",`设置推流视频参数成功:${n/1e3}kbps / 30fps`)}catch(i){w.error("设置推流参数失败:",i)}}stopPush(){var e,t,n;this.isPushingStream&&(this.isPushingStream=!1,w.info("信息日志:","停止推流到云机=======>"),null==(e=this.localStream)||e.getTracks().forEach(e=>e.stop()),this.localStream=null,null==(t=this.rotatedStream)||t.getTracks().forEach(e=>e.stop()),this.rotatedStream=null,null==(n=this.peerConnection)||n.getSenders().forEach(e=>{var t;try{null==(t=this.peerConnection)||t.removeTrack(e)}catch(n){}}))}resetPeerConnection(){var e,t,n,i,r;this.peerConnection||(this.peerConnection=(e=>{w.info("信息日志:","初始化 Webrtc PeerConnection=======>");const t=[{urls:e.stunServerUri},{urls:e.turnServerUri,username:e.turnServerUserName,credential:e.turnServerPassword}];return new RTCPeerConnection({iceServers:t,iceTransportPolicy:"all",bundlePolicy:"max-bundle"})})(this.config),e=this.peerConnection,t=e=>{this.emit(y.sendICEMessage,e)},n=e=>{this.emit(y.streamTrack,e)},i=e=>{this.emit(y.iceConnectionState,e),"connected"===e&&this.checkStats()},r=e=>this.emit(y.webrtcError,e),e.onicecandidate=e=>{if(!e.candidate)return;const n={sdp:e.candidate.candidate,sdpMid:e.candidate.sdpMid,sdpMLineIndex:e.candidate.sdpMLineIndex};w.debug("信息日志:",`webrtc 生成的icecandidate===>${JSON.stringify(n)}`),t(JSON.stringify(n))},e.onconnectionstatechange=()=>{const t=e.iceConnectionState;t&&(w.debug("信息日志:","webrtc p2p连接状态===>",t),"failed"!==t&&"disconnected"!==t&&"closed"!==t||null==r||r(g(u.ICE_STATE,"failed")),null==i||i(t))},e.ontrack=e=>{w.debug("信息日志:","webrtc p2p连接后获取的音视频track");const t=e.track;t.contentHint="motion",null==n||n(t)},this.configDataChannel())}configDataChannel(){this.peerConnection.ondatachannel=e=>{this.dataChannel=e.channel,this.dataChannel.onmessage=e=>this.handleDataChannelMessage(e),this.dataChannel.onerror=e=>this.emit(y.webrtcError,g(u.DATACHANNEL_ERR,e)),this.sendChannelData(je.ActionRequestCloudDeviceInfo,"")}}handleDataChannelMessage(e){const t=JSON.parse(e.data);if(t.type===je.ActionCommandEvent){const{action:e,value:n,cameraId:i}=JSON.parse(t.data);"ACTION_CONTROL_VIDEO"===e&&("ENABLE"===n?this.isPushingStream?this.switchCamera(0===Number(i)):this.startPush(0===Number(i)):(this.stopPush(),this.stopLocal()))}else if(t.type===je.ActionUpdateCloudStatus){const{rotation:e,screenWidth:n,screenHeight:i,gestureMode:r,level:o,isClarity:s}=JSON.parse(t.data),a={direction:[Ve.ROTATION_0,Ve.ROTATION_180].includes(e)?ze.Vertical:ze.Horizontal,screenWidth:n,screenHeight:i,gestureMode:r,clarityLevel:o,isClarity:s};this.emit(y.cloudStatusChanged,a)}else t.type===je.CloudClipData&&this.emit(y.cloudClipData,t.data)}checkStats(){this.statsTimer=setInterval(()=>this.processStats(),1e3)}processStats(){this.peerConnection&&this.peerConnection.getStats(null).then(e=>{let t=0,n=0,i=0,r=0,o=0,s=0,a=0,c=0,d=0,l="";const h=Date.now();e.forEach(h=>{if("inbound-rtp"===h.type&&(s+=h.bytesReceived||0,r+=h.packetsLost||0,o+=h.packetsReceived||0,"video"===h.kind&&(t=h.framesPerSecond||0,n=h.totalDecodeTime||0,a=h.framesDecoded||0,d=h.framesReceived||0,c=(h.pliCount||0)+(h.firCount||0))),"candidate-pair"===h.type&&"succeeded"===h.state){i=void 0!==h.currentRoundTripTime?h.currentRoundTripTime:h.responsesReceived>0?h.totalRoundTripTime/h.responsesReceived:0;const t=e.get(h.localCandidateId),n=e.get(h.remoteCandidateId);t&&n&&(l=this.getConnectionType(t,n))}}),this.ua.includes("Firefox")||(i=Math.floor(1e3*(i||0)));const p=h-this.lastReportTime,u=s-this.lastBytesReceived,f=(p>0?1e3*u/p:0)/1024,m=f/1024;this.lastBytesReceived=s,this.lastReportTime=h;let g=0;const C=r-this.lastPacketsLost,v=o-this.lastPacketsReceived;C>0&&v>0&&(g=C/(C+v),this.maxLostRate=Math.max(this.maxLostRate||0,g),this.lostPacketCount++),this.lastPacketsLost=r,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(m)} MB/s`,R=a>0?Math.floor(1e4*n/a):0,b={connectionType:l,framesPerSecond:S,currentRoundTripTime:i,lostRate:Math.floor(100*g),
86
- // percent
87
- bitrate:T,pliCount:c,averageDecodeTime:R,framesDecoded:a,framesReceived:d};this.emit(y.statisticInfo,b)}).catch(e=>{this.emit(y.webrtcError,g(u.STREAM_STATE,e))})}getConnectionType(e,t){return"host"===e.candidateType&&"host"===t.candidateType?"直连":"relay"===e.candidateType||"relay"===t.candidateType?"中继":"NAT"}
87
+ async setVideoParams(e){const t=e.getParameters(),n=/Android|iPhone|iPad/i.test(navigator.userAgent)?6e5:18e5;t.degradationPreference="maintain-resolution",t.encodings&&0!==t.encodings.length||(t.encodings=[{}]),t.encodings.forEach(e=>{e.maxBitrate=n,e.maxFramerate=30,e.scaleResolutionDownBy=1,e.priority="high"});try{await e.setParameters(t),w.info("信息日志:",`设置推流视频参数成功:${n/1e3}kbps / 30fps`)}catch(i){w.error("设置推流参数失败:",i)}}stopPush(){var e,t,n;this.isPushingStream&&(this.isPushingStream=!1,w.info("信息日志:","停止推流到云机=======>"),null==(e=this.localStream)||e.getTracks().forEach(e=>e.stop()),this.localStream=null,null==(t=this.rotatedStream)||t.getTracks().forEach(e=>e.stop()),this.rotatedStream=null,null==(n=this.peerConnection)||n.getSenders().forEach(e=>{var t;try{null==(t=this.peerConnection)||t.removeTrack(e)}catch(n){}}))}resetPeerConnection(){var e,t,n,i,r;this.peerConnection||(this.peerConnection=(e=>{w.info("信息日志:","初始化 Webrtc PeerConnection=======>");const t=[{urls:e.stunServerUri},{urls:e.turnServerUri,username:e.turnServerUserName,credential:e.turnServerPassword}];return new RTCPeerConnection({iceServers:t,iceTransportPolicy:"all",bundlePolicy:"max-bundle"})})(this.config),e=this.peerConnection,t=e=>{this.emit(y.sendICEMessage,e)},n=e=>{this.emit(y.streamTrack,e)},i=e=>{this.emit(y.iceConnectionState,e),"connected"===e&&this.checkStats()},r=e=>this.emit(y.webrtcError,e),e.onicecandidate=e=>{if(!e.candidate)return;const n={sdp:e.candidate.candidate,sdpMid:e.candidate.sdpMid,sdpMLineIndex:e.candidate.sdpMLineIndex};w.debug("信息日志:",`webrtc 生成的icecandidate===>${JSON.stringify(n)}`),t(JSON.stringify(n))},e.onconnectionstatechange=()=>{const t=e.iceConnectionState;t&&(w.debug("信息日志:","webrtc p2p连接状态===>",t),"failed"!==t&&"disconnected"!==t&&"closed"!==t||null==r||r(g(u.ICE_STATE,"failed")),null==i||i(t))},e.ontrack=e=>{w.debug("信息日志:","webrtc p2p连接后获取的音视频track");const t=e.track;t.contentHint="motion",null==n||n(t)},this.configDataChannel())}configDataChannel(){this.peerConnection.ondatachannel=e=>{this.dataChannel=e.channel,this.dataChannel.onmessage=e=>this.handleDataChannelMessage(e),this.dataChannel.onerror=e=>this.emit(y.webrtcError,g(u.DATACHANNEL_ERR,e)),this.sendChannelData(je.ActionRequestCloudDeviceInfo,"")}}handleDataChannelMessage(e){const t=JSON.parse(e.data);if(t.type===je.ActionCommandEvent){const{action:e,value:n,cameraId:i}=JSON.parse(t.data);"ACTION_CONTROL_VIDEO"===e&&("ENABLE"===n?this.isPushingStream?this.switchCamera(0===Number(i)):this.startPush(0===Number(i)):(this.stopPush(),this.stopLocal()))}else if(t.type===je.ActionUpdateCloudStatus){const{rotation:e,screenWidth:n,screenHeight:i,gestureMode:r,level:o,isClarity:s}=JSON.parse(t.data),a={direction:[Ve.ROTATION_0,Ve.ROTATION_180].includes(e)?ze.Vertical:ze.Horizontal,screenWidth:n,screenHeight:i,gestureMode:r,clarityLevel:o,isClarity:s};this.emit(y.cloudStatusChanged,a)}else t.type===je.CloudClipData&&this.emit(y.cloudClipData,t.data)}checkStats(){this.statsTimer=setInterval(()=>this.processStatsOptimized(),1e3)}async processStatsOptimized(){const e=this.peerConnection;if(!e)return;const t=navigator.userAgent,n=/Safari/.test(t)&&!/Chrome/.test(t),i=/iPhone|iPad|Android/i.test(t),r=n||i?3e3:1e3,o=Date.now();if(!(this.lastReportTime&&o-this.lastReportTime<r))try{const t=await e.getStats(null);let n=0,i=0,r=0,s=0,a=0,c=0,d=0,l=0,h=0,p="";for(const e of t.values())if("inbound-rtp"===e.type&&"video"===e.kind&&(c+=e.bytesReceived||0,s+=e.packetsLost||0,a+=e.packetsReceived||0,n=e.framesPerSecond||0,i=e.totalDecodeTime||0,d=e.framesDecoded||0,l=e.framesReceived||0,h=(e.pliCount||0)+(e.firCount||0)),"candidate-pair"===e.type&&"succeeded"===e.state){r=void 0!==e.currentRoundTripTime?e.currentRoundTripTime:e.responsesReceived>0?e.totalRoundTripTime/e.responsesReceived:0;const n=t.get(e.localCandidateId),i=t.get(e.remoteCandidateId);n&&i&&(p=this.getConnectionType(n,i))}r>1e3?r=Math.floor(r/1e3):r<1&&(r=Math.floor(1e3*r));const u=o-(this.lastReportTime||o),f=c-(this.lastBytesReceived||0),m=(u>0?1e3*f/u:0)/1024,g=m/1024;this.lastBytesReceived=c,this.lastReportTime=o;const C=s-(this.lastPacketsLost||0),v=a-(this.lastPacketsReceived||0);let S=0;C>0&&v>0&&(S=C/(C+v),this.maxLostRate=Math.max(this.maxLostRate||0,S),this.lostPacketCount=(this.lostPacketCount||0)+1),this.lastPacketsLost=s,this.lastPacketsReceived=a;const T=n||d-(this.lastSecondDecodedCount||0);this.lastSecondDecodedCount=d;const R=m<1024?`${Math.floor(m)} KB/s`:`${Math.floor(g)} MB/s`,b=d>0?Math.floor(1e4*i/d):0,w={connectionType:p,framesPerSecond:T,currentRoundTripTime:r,lostRate:Math.floor(100*S),bitrate:R,pliCount:h,averageDecodeTime:b,framesDecoded:d,framesReceived:l};this.emit(y.statisticInfo,w)}catch(s){this.emit(y.webrtcError,g(u.STREAM_STATE,s))}}getConnectionType(e,t){return"host"===e.candidateType&&"host"===t.candidateType?"直连":"relay"===e.candidateType||"relay"===t.candidateType?"中继":"NAT"}
88
88
  /** 获取或创建 video 元素(懒初始化) */getFileVideo(){return this.fileVideo||(this.fileVideo=document.createElement("video"),this.fileVideo.muted=!0,this.fileVideo.playsInline=!0),this.fileVideo}
89
89
  /** 获取或创建 canvas 元素(懒初始化) */getCanvas(){return this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.width=640,this.canvas.height=480),this.canvas}async loadMedia(e){var t;const n=this.getFileVideo(),i=this.getFileImage(),r=e.type.toLowerCase(),o=null==(t=e.name.split(".").pop())?void 0:t.toLowerCase();let s="unknown";if(r.startsWith("video/")||o&&["mp4","webm","ogg","mov","mkv"].includes(o)?s="video":(r.startsWith("image/")||o&&["jpg","jpeg","png","gif","bmp","webp"].includes(o))&&(s="image"),"unknown"===s&&(s=await $e.detectFileType(e)),"video"===s)return new Promise((t,i)=>{const r=URL.createObjectURL(e);n.src=r,n.onloadedmetadata=()=>t(),n.onerror=()=>i(new Error(`视频文件加载失败: ${e.name}`)),n.play().catch(e=>i(new Error(`视频播放失败: ${e}`))),this.currentMedia=n});if("image"===s)return new Promise((t,n)=>{const r=URL.createObjectURL(e);i.src=r,i.onload=()=>t(),i.onerror=()=>n(new Error(`图片文件加载失败: ${e.name}`)),this.currentMedia=i});throw new Error(`不支持的文件类型: ${r||o}`)}startCanvasStream(e=30){w.info("信息日志:","初始化,使用本地文件推流到云机=======>");const t=this.getCanvas(),n=t.getContext("2d"),i=this.currentMedia;if(!i)throw new Error("请先加载媒体文件");let r=0;const o=1e3/e;let s=1;const a=e=>{if(e-r>=o){let o,s;if(n.clearRect(0,0,t.width,t.height),n.save(),n.translate(t.width/2,t.height/2),n.rotate(Math.PI/2),n.scale(-1,1),i instanceof HTMLVideoElement)o=i.videoWidth,s=i.videoHeight;else{if(!(i instanceof HTMLImageElement))throw new Error("不支持的媒体类型");o=i.width,s=i.height}const a=Math.min(t.height/o,t.width/s),c=o*a,d=s*a;n.drawImage(i,-c/2,-d/2,c,d),n.restore(),r=e}s=requestAnimationFrame(a)};return a(0),this.rafId=requestAnimationFrame(a),this.canvasStream=t.captureStream(e),this.canvasStream.getTracks().forEach(e=>{const t=()=>cancelAnimationFrame(s);e.addEventListener("ended",t),e.addEventListener("stop",t)}),this.canvasStream}getFileImage(){if(!this.fileImage){const e=document.createElement("img");e.style.display="none",document.body.appendChild(e),this.fileImage=e}return this.fileImage}
90
90
  /** 停止推流并释放资源 */stopLocal(){var e,t;this.isPushingLocalStream&&(this.isPushingLocalStream=!1,cancelAnimationFrame(this.rafId),null==(e=this.canvasStream)||e.getTracks().forEach(e=>e.stop()),this.canvasStream=null,null==(t=this.peerConnection)||t.getSenders().forEach(e=>{var t;try{null==(t=this.peerConnection)||t.removeTrack(e)}catch(n){w.error("错误日志:","移除音视频轨道失败=====>",n)}}),this.fileVideo&&(this.fileVideo.pause(),this.fileVideo.src=""))}}const Xe=async(e,t=600)=>{const n=e.map(e=>({urls:e,username:"yangyj",credential:"hb@2025@168"})).map(e=>((e,t=600)=>new Promise(n=>{const i=performance.now();let r=!1;const o=new RTCPeerConnection({iceServers:[e],iceTransportPolicy:"relay"});o.createDataChannel("test"),o.createOffer().then(e=>o.setLocalDescription(e)).catch(()=>{r||(r=!0,o.close(),n({...e,rtt:1/0}))}),o.onicecandidate=t=>{if(!r){if(t.candidate&&t.candidate.candidate.includes("relay")){const t=Math.trunc(performance.now()-i);r=!0,o.close(),n({...e,rtt:t})}null===t.candidate&&(r=!0,o.close(),n({...e,rtt:1/0}))}},setTimeout(()=>{r||(r=!0,o.close(),n({...e,rtt:1/0}))},t)}))(e,t).then(e=>e).catch(t=>(w.warn("警告日志:","中继计算超时=====>",t),{...e,rtt:1/0}))),i=await Promise.all(n);w.debug("调试日志:","信令计算结果======>",i);const r=i.filter(e=>e.rtt!==1/0);if(0===r.length)throw new Error("All TURN servers are unreachable or slow (RTT = Infinity).");const o=r.sort((e,t)=>e.rtt-t.rtt)[0];return{best:o?Ye(o):void 0,all:i.map(Ye)}},Ye=e=>({urls:e.urls,rtt:e.rtt}),Qe=e=>!(e.hostTurn&&0!==e.hostTurn.length||e.spareTurn&&0!==e.spareTurn.length);class Ze extends d{
@@ -122,7 +122,7 @@ F1:131,F2:132,F3:133,F4:134,F5:135,F6:136,F7:137,F8:138,F9:139,F10:140,F11:141,F
122
122
  // 数字小键盘
123
123
  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,
124
124
  // 其他特殊键
125
- Insert:124,Delete:112,Home:122,End:123,PageUp:92,PageDown:93,ScrollLock:116,Pause:121,ContextMenu:117},tt=e=>{const t=et[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 nt(e,t,n,i,r,o,s,a){let c,d;-90===r?(d=t,c=n*e/i):(d=e,c=n*t/i);const l=(d-c)/2,h=d/2,p=l,u=d-l,f=h-l;if(-90===r){const e=rt(l,h,p,u,f,a);return-90===o?[s,e]:[t-e,s]}{const n=rt(l,h,p,u,f,s);if(-90===o){const[i,r]=function(e,t,n,i){const r=t/2,o=e/2,s=n-o,a=i-r;return[a+r,-s+o]}(e,t,n,a);return[i,r]}return[n,a]}}function it(e,t,n,i,r,o,s,a){let c,d;return 0===r&&0===o?(c=s/e,d=a/t):-90===r&&0===o?(c=s/t,d=a/e):-90===r&&-90===o?(c=s/e*(i/n),d=a/t*(n/i)):(c=s/t*(i/n),d=a/e*(n/i)),[c,d]}function rt(e,t,n,i,r,o){return o>=n&&o<=t-.1?(o-e)*t/r:o===t?t:o>=t+.1&&o<=i?t+(o-t)*t/r:o}function ot(e,n,i,r){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),h=t.computed(()=>i.value%180!=0),p=t.ref(0),u=t.computed(()=>{let e=0,t=0;const n=h.value?a.value.height:a.value.width,i=h.value?a.value.width:a.value.height,r=s.value.width??720,o=s.value.height??1280,l=r/o,p=n/l;return p>i?(t=i,e=t*l):(e=n,t=p),c.value=r/e,d.value=o/t,{width:e,height:t}}),f=(e,t)=>{e.srcObject||(e.srcObject=new MediaStream);const n=e.srcObject;m(n,t),e.playbackRate=1,e.playsInline=!0,e.disablePictureInPicture=!0,e.setAttribute("playsinline","true"),e.setAttribute("webkit-playsinline","true"),e.setAttribute("x5-video-player-type","h5"),e.setAttribute("x5-video-player-fullscreen","false"),e.setAttribute("x5-video-orientation","portraint"),e.preload="auto"},m=(e,t)=>{"video"===t.kind?(e.getVideoTracks().forEach(t=>{e.removeTrack(t),t.stop()}),e.addTrack(t)):"audio"===t.kind&&(e.getAudioTracks().some(e=>e.id===t.id)||e.addTrack(t))},g=()=>{o.value=!1;const e=n.value;e&&e.srcObject&&(e.srcObject.getTracks().forEach(e=>e.stop()),e.srcObject=null,p.value&&e.cancelVideoFrameCallback(p.value))},C=()=>{const e=n.value;e&&e.srcObject&&e.srcObject.getTracks().forEach(e=>{"audio"===e.kind&&(e.enabled="visible"===document.visibilityState)})};t.onMounted(()=>{document.addEventListener("visibilitychange",C)}),t.onBeforeUnmount(()=>{document.removeEventListener("visibilitychange",C),l.value&&e.value&&l.value.unobserve(e.value),g()});const y=e=>{const t=(n,i)=>{e.playbackRate=1.1,setTimeout(()=>{e.playbackRate=1},600),p.value=e.requestVideoFrameCallback(t)};p.value=e.requestVideoFrameCallback(t)};return{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 i=()=>{s.value={width:e.videoWidth,height:e.videoHeight},o.value=!0,r("loadedSuccess"),/Android|iPhone|iPad/i.test(navigator.userAgent)&&y(e)};e.addEventListener("loadedmetadata",i),t.onBeforeUnmount(()=>{e.removeEventListener("loadedmetadata",i),p.value&&e.cancelVideoFrameCallback(p.value)})})()},startPlay:e=>{const t=n.value;t&&f(t,e)},stopPlay:g}}const st=((e,t)=>{const n=e.__vccOpts||e;for(const[i,r]of t)n[i]=r;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:i}){const r=i,o=e,{streamAngle:s,videoAngle:a,cursorType:c,cloudDeviceSize:d,disabled:l,bgColor:h}=t.toRefs(o),p=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:g,widthRadio:C,initVideoContainer:y,startPlay:v,stopPlay:S}=ot(p,u,a,r),{handleMouseDown:T,handleMouseMove:R,handleMouseEnter:b,handleMouseUp:w,handleMouseLeave:E,handleWheel:P}=function(e){const{remoteVideoElement:n,cloudDeviceSize:i,streamAngle:r,videoAngle:o,widthRadio:s,emit:a}=e,c=t.ref(!1),d=t.ref(0),l=t.ref(new Array(20).fill(0)),h=t.ref(new Array(10).fill(0)),p=(e,t)=>{if(!n.value)return;const s=Math.trunc(e.timeStamp-h.value[0]),c=n.value.getBoundingClientRect();let p=e.clientX-c.left,u=e.clientY-c.top;const f=i.value.width,m=i.value.height,g=nt(c.width,c.height,f,m,o.value,r.value,p,u);if(!g||g.length<2)return;if(p=g[0],u=g[1],t===Ke.ACTION_MOVE){const e=l.value[10]-u,t=l.value[0]-p;if(Math.abs(e)<d.value&&Math.abs(t)<d.value)return}l.value[0]=p,l.value[10]=u;const C=it(c.width,c.height,f,m,o.value,r.value,p,u),y=new We(t,0,C[0],C[1],s);a("channelEvent",je.ClickData,y)},u=e=>{c.value&&(c.value=!1,p(e,Ke.ACTION_UP),n.value&&n.value.releasePointerCapture(e.pointerId))};return{isPointerDown:c,handleMouseDown:e=>{c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),h.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),p(e,Ke.ACTION_DOWN)},handleMouseMove:e=>{if(!c.value)return;if(p(e,Ke.ACTION_MOVE),!n.value)return;const t=n.value.getBoundingClientRect(),{clientX:i,clientY:r}=e;(i<t.left||i>t.right||r<t.top||r>t.bottom)&&u(e)},handleMouseEnter:e=>{1!==e.buttons||c.value||(c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),h.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),p(e,Ke.ACTION_DOWN))},handleMouseUp:u,handleMouseLeave:e=>{c.value&&(p(e,Ke.ACTION_UP),c.value=!1,n.value&&n.value.releasePointerCapture(e.pointerId))},handleWheel:e=>{const t=-1*Math.sign(e.deltaY),n=new Be(t);a("channelEvent",je.ActionWheel,n)}}}({remoteVideoElement:u,cloudDeviceSize:d,streamAngle:s,videoAngle:a,widthRadio:C,emit:r}),{startListening:k,stopListening:I}=function(e,n){const i=t.ref(!1),r=e=>{const t=tt(e);n("channelEvent",je.ActionInput,t)};return{startListening:()=>{e&&(i.value=!0,document.addEventListener("keydown",r))},stopListening:()=>{e&&(i.value=!1,document.removeEventListener("keydown",r))}}}(l,r);!function(e,n){let i=null;t.onMounted(()=>{e.value&&(i=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;n.value={width:e,height:i}}}),i.observe(e.value))}),t.onUnmounted(()=>{null==i||i.disconnect()})}(p,g);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.onBeforeUnmount(()=>{document.removeEventListener("click",A)}),n({startPlay:v,stopPlay:S,remoteVideoElement:u}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"videoContainer",ref:p,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
125
+ Insert:124,Delete:112,Home:122,End:123,PageUp:92,PageDown:93,ScrollLock:116,Pause:121,ContextMenu:117},tt=e=>{const t=et[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 nt(e,t,n,i,r,o,s,a){let c,d;-90===r?(d=t,c=n*e/i):(d=e,c=n*t/i);const l=(d-c)/2,h=d/2,p=l,u=d-l,f=h-l;if(-90===r){const e=rt(l,h,p,u,f,a);return-90===o?[s,e]:[t-e,s]}{const n=rt(l,h,p,u,f,s);if(-90===o){const[i,r]=function(e,t,n,i){const r=t/2,o=e/2,s=n-o,a=i-r;return[a+r,-s+o]}(e,t,n,a);return[i,r]}return[n,a]}}function it(e,t,n,i,r,o,s,a){let c,d;return 0===r&&0===o?(c=s/e,d=a/t):-90===r&&0===o?(c=s/t,d=a/e):-90===r&&-90===o?(c=s/e*(i/n),d=a/t*(n/i)):(c=s/t*(i/n),d=a/e*(n/i)),[c,d]}function rt(e,t,n,i,r,o){return o>=n&&o<=t-.1?(o-e)*t/r:o===t?t:o>=t+.1&&o<=i?t+(o-t)*t/r:o}function ot(e,n,i,r){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),h=t.computed(()=>i.value%180!=0),p=t.ref(0),u=t.computed(()=>{let e=0,t=0;const n=h.value?a.value.height:a.value.width,i=h.value?a.value.width:a.value.height,r=s.value.width??720,o=s.value.height??1280,l=r/o,p=n/l;return p>i?(t=i,e=t*l):(e=n,t=p),c.value=r/e,d.value=o/t,{width:e,height:t}}),f=(e,t)=>{e.srcObject||(e.srcObject=new MediaStream);const n=e.srcObject;m(n,t),e.playbackRate=1,e.playsInline=!0,e.disablePictureInPicture=!0,e.setAttribute("playsinline","true"),e.setAttribute("webkit-playsinline","true"),e.setAttribute("x5-video-player-type","h5"),e.setAttribute("x5-video-player-fullscreen","false"),e.setAttribute("x5-video-orientation","portraint"),e.preload="auto"},m=(e,t)=>{"video"===t.kind?(e.getVideoTracks().forEach(t=>{e.removeTrack(t),t.stop()}),e.addTrack(t)):"audio"===t.kind&&(e.getAudioTracks().some(e=>e.id===t.id)||e.addTrack(t))},g=()=>{o.value=!1;const e=n.value;e&&e.srcObject&&(e.srcObject.getTracks().forEach(e=>e.stop()),e.srcObject=null,p.value&&e.cancelVideoFrameCallback(p.value))},C=()=>{const e=n.value;e&&e.srcObject&&e.srcObject.getTracks().forEach(e=>{"audio"===e.kind&&(e.enabled="visible"===document.visibilityState)})};t.onMounted(()=>{document.addEventListener("visibilitychange",C)}),t.onBeforeUnmount(()=>{document.removeEventListener("visibilitychange",C),l.value&&e.value&&l.value.unobserve(e.value),g()});const y=e=>{const t=(n,i)=>{e.playbackRate=1.1,setTimeout(()=>{e.playbackRate=1},600),p.value=e.requestVideoFrameCallback(t)};p.value=e.requestVideoFrameCallback(t)};return{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 i=()=>{s.value={width:e.videoWidth,height:e.videoHeight},o.value=!0,r("loadedSuccess"),/Android|iPhone|iPad/i.test(navigator.userAgent)&&y(e)};e.addEventListener("loadedmetadata",i),t.onBeforeUnmount(()=>{e.removeEventListener("loadedmetadata",i),p.value&&e.cancelVideoFrameCallback(p.value)})})()},startPlay:e=>{const t=n.value;t&&f(t,e)},stopPlay:g}}const st=((e,t)=>{const n=e.__vccOpts||e;for(const[i,r]of t)n[i]=r;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:i}){const r=i,o=e,{streamAngle:s,videoAngle:a,cursorType:c,cloudDeviceSize:d,disabled:l,bgColor:h}=t.toRefs(o),p=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:g,widthRadio:C,initVideoContainer:y,startPlay:v,stopPlay:S}=ot(p,u,a,r),{handleMouseDown:T,handleMouseMove:R,handleMouseEnter:b,handleMouseUp:w,handleMouseLeave:E,handleWheel:P}=function(e){const{remoteVideoElement:n,cloudDeviceSize:i,streamAngle:r,videoAngle:o,widthRadio:s,emit:a}=e,c=t.ref(!1),d=t.ref(0),l=t.ref(new Array(20).fill(0)),h=t.ref(new Array(10).fill(0)),p=(e,t)=>{if(!n.value)return;const s=Math.trunc(e.timeStamp-h.value[0]),c=n.value.getBoundingClientRect();let p=e.clientX-c.left,u=e.clientY-c.top;const f=i.value.width,m=i.value.height,g=nt(c.width,c.height,f,m,o.value,r.value,p,u);if(!g||g.length<2)return;if(p=g[0],u=g[1],t===Ke.ACTION_MOVE){const e=l.value[10]-u,t=l.value[0]-p;if(Math.abs(e)<d.value&&Math.abs(t)<d.value)return}l.value[0]=p,l.value[10]=u;const C=it(c.width,c.height,f,m,o.value,r.value,p,u),y=new We(t,0,C[0],C[1],s,"web");a("channelEvent",je.ClickData,y)},u=e=>{c.value&&(c.value=!1,p(e,Ke.ACTION_UP),n.value&&n.value.releasePointerCapture(e.pointerId))};return{isPointerDown:c,handleMouseDown:e=>{c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),h.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),p(e,Ke.ACTION_DOWN)},handleMouseMove:e=>{if(!c.value)return;if(p(e,Ke.ACTION_MOVE),!n.value)return;const t=n.value.getBoundingClientRect(),{clientX:i,clientY:r}=e;(i<t.left||i>t.right||r<t.top||r>t.bottom)&&u(e)},handleMouseEnter:e=>{1!==e.buttons||c.value||(c.value=!0,n.value&&n.value.setPointerCapture(e.pointerId),h.value[0]=e.timeStamp,d.value=Math.trunc(6/s.value),p(e,Ke.ACTION_DOWN))},handleMouseUp:u,handleMouseLeave:e=>{c.value&&(p(e,Ke.ACTION_UP),c.value=!1,n.value&&n.value.releasePointerCapture(e.pointerId))},handleWheel:e=>{const t=-1*Math.sign(e.deltaY),n=new Be(t);a("channelEvent",je.ActionWheel,n)}}}({remoteVideoElement:u,cloudDeviceSize:d,streamAngle:s,videoAngle:a,widthRadio:C,emit:r}),{startListening:k,stopListening:I}=function(e,n){const i=t.ref(!1),r=e=>{const t=tt(e);n("channelEvent",je.ActionInput,t)};return{startListening:()=>{e&&(i.value=!0,document.addEventListener("keydown",r))},stopListening:()=>{e&&(i.value=!1,document.removeEventListener("keydown",r))}}}(l,r);!function(e,n){let i=null;t.onMounted(()=>{e.value&&(i=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;n.value={width:e,height:i}}}),i.observe(e.value))}),t.onUnmounted(()=>{null==i||i.disconnect()})}(p,g);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.onBeforeUnmount(()=>{document.removeEventListener("click",A)}),n({startPlay:v,stopPlay:S,remoteVideoElement:u}),(e,n)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"videoContainer",ref:p,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
126
126
  (...e)=>t.unref(k)&&t.unref(k)(...e)),onPointerleave:n[7]||(n[7]=//@ts-ignore
127
127
  (...e)=>t.unref(I)&&t.unref(I)(...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
128
128
  (...e)=>t.unref(b)&&t.unref(b)(...e)),onPointerdown:n[1]||(n[1]=//@ts-ignore
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "yjz-web-sdk",
3
3
  "private": false,
4
- "version": "1.0.8-beta.14",
4
+ "version": "1.0.8-beta.16",
5
5
  "type": "module",
6
6
  "description": "针对于亚矩阵项目的云手机投屏和屏幕控制",
7
7
  "license": "Apache-2.0",