@pulsebeam/peer 0.0.16 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { RpcOptions, UnaryCall } from '@protobuf-ts/runtime-rpc';
1
+ import { RpcOptions, UnaryCall, ServerStreamingCall } from '@protobuf-ts/runtime-rpc';
2
2
  import { MessageType } from '@protobuf-ts/runtime';
3
3
 
4
4
  /**
@@ -130,9 +130,9 @@ declare class RecvResp$Type extends MessageType<RecvResp> {
130
130
  */
131
131
  interface RecvResp {
132
132
  /**
133
- * @generated from protobuf field: repeated pulsebeam.v1.Message msgs = 1;
133
+ * @generated from protobuf field: pulsebeam.v1.Message msg = 1;
134
134
  */
135
- msgs: Message[];
135
+ msg?: Message;
136
136
  }
137
137
  /**
138
138
  * @generated MessageType for protobuf message pulsebeam.v1.RecvResp
@@ -412,9 +412,9 @@ interface AckRange {
412
412
  declare const AckRange: AckRange$Type;
413
413
 
414
414
  /**
415
- * @generated from protobuf service pulsebeam.v1.Tunnel
415
+ * @generated from protobuf service pulsebeam.v1.Signaling
416
416
  */
417
- interface ITunnelClient {
417
+ interface ISignalingClient {
418
418
  /**
419
419
  * @generated from protobuf rpc: Prepare(pulsebeam.v1.PrepareReq) returns (pulsebeam.v1.PrepareResp);
420
420
  */
@@ -424,9 +424,9 @@ interface ITunnelClient {
424
424
  */
425
425
  send(input: SendReq, options?: RpcOptions): UnaryCall<SendReq, SendResp>;
426
426
  /**
427
- * @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (pulsebeam.v1.RecvResp);
427
+ * @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (stream pulsebeam.v1.RecvResp);
428
428
  */
429
- recv(input: RecvReq, options?: RpcOptions): UnaryCall<RecvReq, RecvResp>;
429
+ recv(input: RecvReq, options?: RpcOptions): ServerStreamingCall<RecvReq, RecvResp>;
430
430
  }
431
431
 
432
432
  type LogObj = Record<string, unknown>;
@@ -456,7 +456,7 @@ declare class Logger {
456
456
  * access to underlying media tracks, data channels, and connection state.
457
457
  *
458
458
  * Usage:
459
- * @example `peer.onsession = (session) => {console.log(session.otherPeerId())};`
459
+ * @example `peer.onsession = (session) => {console.log(session.other.peerId)};`
460
460
  */
461
461
  interface ISession {
462
462
  /**
@@ -609,7 +609,7 @@ declare class Peer {
609
609
  * @param opts Configuration options for the peer.
610
610
  * @param isRecoverable Function to determine if an error is recoverable.
611
611
  */
612
- constructor(logger: Logger, client: ITunnelClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
612
+ constructor(logger: Logger, client: ISignalingClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
613
613
  /**
614
614
  * Starts the peer, making it ready to establish connections.
615
615
  * Peers must be started before a connection can occur.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { RpcOptions, UnaryCall } from '@protobuf-ts/runtime-rpc';
1
+ import { RpcOptions, UnaryCall, ServerStreamingCall } from '@protobuf-ts/runtime-rpc';
2
2
  import { MessageType } from '@protobuf-ts/runtime';
3
3
 
4
4
  /**
@@ -130,9 +130,9 @@ declare class RecvResp$Type extends MessageType<RecvResp> {
130
130
  */
131
131
  interface RecvResp {
132
132
  /**
133
- * @generated from protobuf field: repeated pulsebeam.v1.Message msgs = 1;
133
+ * @generated from protobuf field: pulsebeam.v1.Message msg = 1;
134
134
  */
135
- msgs: Message[];
135
+ msg?: Message;
136
136
  }
137
137
  /**
138
138
  * @generated MessageType for protobuf message pulsebeam.v1.RecvResp
@@ -412,9 +412,9 @@ interface AckRange {
412
412
  declare const AckRange: AckRange$Type;
413
413
 
414
414
  /**
415
- * @generated from protobuf service pulsebeam.v1.Tunnel
415
+ * @generated from protobuf service pulsebeam.v1.Signaling
416
416
  */
417
- interface ITunnelClient {
417
+ interface ISignalingClient {
418
418
  /**
419
419
  * @generated from protobuf rpc: Prepare(pulsebeam.v1.PrepareReq) returns (pulsebeam.v1.PrepareResp);
420
420
  */
@@ -424,9 +424,9 @@ interface ITunnelClient {
424
424
  */
425
425
  send(input: SendReq, options?: RpcOptions): UnaryCall<SendReq, SendResp>;
426
426
  /**
427
- * @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (pulsebeam.v1.RecvResp);
427
+ * @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (stream pulsebeam.v1.RecvResp);
428
428
  */
429
- recv(input: RecvReq, options?: RpcOptions): UnaryCall<RecvReq, RecvResp>;
429
+ recv(input: RecvReq, options?: RpcOptions): ServerStreamingCall<RecvReq, RecvResp>;
430
430
  }
431
431
 
432
432
  type LogObj = Record<string, unknown>;
@@ -456,7 +456,7 @@ declare class Logger {
456
456
  * access to underlying media tracks, data channels, and connection state.
457
457
  *
458
458
  * Usage:
459
- * @example `peer.onsession = (session) => {console.log(session.otherPeerId())};`
459
+ * @example `peer.onsession = (session) => {console.log(session.other.peerId)};`
460
460
  */
461
461
  interface ISession {
462
462
  /**
@@ -609,7 +609,7 @@ declare class Peer {
609
609
  * @param opts Configuration options for the peer.
610
610
  * @param isRecoverable Function to determine if an error is recoverable.
611
611
  */
612
- constructor(logger: Logger, client: ITunnelClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
612
+ constructor(logger: Logger, client: ISignalingClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
613
613
  /**
614
614
  * Starts the peer, making it ready to establish connections.
615
615
  * Peers must be started before a connection can occur.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var vt=Object.create;var $=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var Pt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var kt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),D=(e,t)=>{for(var n in t)$(e,n,{get:t[n],enumerable:!0})},_t=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of bt(t))!xt.call(e,s)&&s!==n&&$(e,s,{get:()=>t[s],enumerable:!(r=Tt(t,s))||r.enumerable});return e};var et=(e,t,n)=>(n=e!=null?vt(Pt(e)):{},_t(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var ke=kt((gr,xe)=>{"use strict";var l={};l.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)};l.localCName=l.generateIdentifier();l.splitLines=function(e){return e.trim().split(`
1
+ var vt=Object.create;var $=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var Pt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var kt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),D=(e,t)=>{for(var n in t)$(e,n,{get:t[n],enumerable:!0})},Et=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of bt(t))!xt.call(e,s)&&s!==n&&$(e,s,{get:()=>t[s],enumerable:!(r=Tt(t,s))||r.enumerable});return e};var et=(e,t,n)=>(n=e!=null?vt(Pt(e)):{},Et(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var ke=kt((gr,xe)=>{"use strict";var l={};l.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)};l.localCName=l.generateIdentifier();l.splitLines=function(e){return e.trim().split(`
2
2
  `).map(t=>t.trim())};l.splitSections=function(e){return e.split(`
3
3
  m=`).map((n,r)=>(r>0?"m="+n:n).trim()+`\r
4
4
  `)};l.getDescription=function(e){let t=l.splitSections(e);return t&&t[0]};l.getMediaSections=function(e){let t=l.splitSections(e);return t.shift(),t};l.matchPrefix=function(e,t){return l.splitLines(e).filter(n=>n.indexOf(t)===0)};l.parseCandidate=function(e){let t;e.indexOf("a=candidate:")===0?t=e.substring(12).split(" "):t=e.substring(10).split(" ");let n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let r=8;r<t.length;r+=2)switch(t[r]){case"raddr":n.relatedAddress=t[r+1];break;case"rport":n.relatedPort=parseInt(t[r+1],10);break;case"tcptype":n.tcpType=t[r+1];break;case"ufrag":n.ufrag=t[r+1],n.usernameFragment=t[r+1];break;default:n[t[r]]===void 0&&(n[t[r]]=t[r+1]);break}return n};l.writeCandidate=function(e){let t=[];t.push(e.foundation);let n=e.component;n==="rtp"?t.push(1):n==="rtcp"?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);let r=e.type;return t.push("typ"),t.push(r),r!=="host"&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&e.protocol.toLowerCase()==="tcp"&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")};l.parseIceOptions=function(e){return e.substring(14).split(" ")};l.parseRtpMap=function(e){let t=e.substring(9).split(" "),n={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),n.name=t[0],n.clockRate=parseInt(t[1],10),n.channels=t.length===3?parseInt(t[2],10):1,n.numChannels=n.channels,n};l.writeRtpMap=function(e){let t=e.payloadType;e.preferredPayloadType!==void 0&&(t=e.preferredPayloadType);let n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(n!==1?"/"+n:"")+`\r
@@ -29,9 +29,9 @@ a=ice-pwd:`+e.password+`\r
29
29
  o=`+(n||"thisisadapterortc")+" "+r+" "+s+` IN IP4 127.0.0.1\r
30
30
  s=-\r
31
31
  t=0 0\r
32
- `};l.getDirection=function(e,t){let n=l.splitLines(e);for(let r=0;r<n.length;r++)switch(n[r]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return n[r].substring(2);default:}return t?l.getDirection(t):"sendrecv"};l.getKind=function(e){return l.splitLines(e)[0].split(" ")[0].substring(2)};l.isRejected=function(e){return e.split(" ",2)[1]==="0"};l.parseMLine=function(e){let n=l.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}};l.parseOLine=function(e){let n=l.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]}};l.isValidSDP=function(e){if(typeof e!="string"||e.length===0)return!1;let t=l.splitLines(e);for(let n=0;n<t.length;n++)if(t[n].length<2||t[n].charAt(1)!=="=")return!1;return!0};typeof xe=="object"&&(xe.exports=l)});var rt=!0,nt=!0;function b(e,t,n){let r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function S(e,t,n){if(!e.RTCPeerConnection)return;let r=e.RTCPeerConnection.prototype,s=r.addEventListener;r.addEventListener=function(o,a){if(o!==t)return s.apply(this,arguments);let d=c=>{let p=n(c);p&&(a.handleEvent?a.handleEvent(p):a(p))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,d),s.apply(this,[o,d])};let i=r.removeEventListener;r.removeEventListener=function(o,a){if(o!==t||!this._eventMap||!this._eventMap[t])return i.apply(this,arguments);if(!this._eventMap[t].has(a))return i.apply(this,arguments);let d=this._eventMap[t].get(a);return this._eventMap[t].delete(a),this._eventMap[t].size===0&&delete this._eventMap[t],Object.keys(this._eventMap).length===0&&delete this._eventMap,i.apply(this,[o,d])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(o){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),o&&this.addEventListener(t,this["_on"+t]=o)},enumerable:!0,configurable:!0})}function st(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(rt=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function it(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(nt=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function O(){if(typeof window=="object"){if(rt)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function v(e,t){nt&&console.warn(e+" is deprecated, please use "+t+" instead.")}function ot(e){let t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;let{navigator:n}=e;if(n.userAgentData&&n.userAgentData.brands){let r=n.userAgentData.brands.find(s=>s.brand==="Chromium");if(r)return{browser:"chrome",version:parseInt(r.version,10)}}if(n.mozGetUserMedia)t.browser="firefox",t.version=b(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||e.isSecureContext===!1&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=b(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(e.RTCPeerConnection&&n.userAgent.match(/AppleWebKit\/(\d+)\./))t.browser="safari",t.version=b(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype;else return t.browser="Not a supported browser.",t;return t}function tt(e){return Object.prototype.toString.call(e)==="[object Object]"}function ee(e){return tt(e)?Object.keys(e).reduce(function(t,n){let r=tt(e[n]),s=r?ee(e[n]):e[n],i=r&&!Object.keys(s).length;return s===void 0||i?t:Object.assign(t,{[n]:s})},{}):e}function w(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach(r=>{r.endsWith("Id")?w(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach(s=>{w(e,e.get(s),n)})}))}function te(e,t,n){let r=n?"outbound-rtp":"inbound-rtp",s=new Map;if(t===null)return s;let i=[];return e.forEach(o=>{o.type==="track"&&o.trackIdentifier===t.id&&i.push(o)}),i.forEach(o=>{e.forEach(a=>{a.type===r&&a.trackId===o.id&&w(e,a,s)})}),s}var j={};D(j,{fixNegotiationNeeded:()=>ae,shimAddTrackRemoveTrack:()=>oe,shimAddTrackRemoveTrackWithNative:()=>ct,shimGetSendersWithDtmf:()=>se,shimGetUserMedia:()=>L,shimMediaStream:()=>re,shimOnTrack:()=>ne,shimPeerConnection:()=>A,shimSenderReceiverGetStats:()=>ie});var at=O;function L(e,t){let n=e&&e.navigator;if(!n.mediaDevices)return;let r=function(a){if(typeof a!="object"||a.mandatory||a.optional)return a;let d={};return Object.keys(a).forEach(c=>{if(c==="require"||c==="advanced"||c==="mediaSource")return;let p=typeof a[c]=="object"?a[c]:{ideal:a[c]};p.exact!==void 0&&typeof p.exact=="number"&&(p.min=p.max=p.exact);let u=function(m,f){return m?m+f.charAt(0).toUpperCase()+f.slice(1):f==="deviceId"?"sourceId":f};if(p.ideal!==void 0){d.optional=d.optional||[];let m={};typeof p.ideal=="number"?(m[u("min",c)]=p.ideal,d.optional.push(m),m={},m[u("max",c)]=p.ideal,d.optional.push(m)):(m[u("",c)]=p.ideal,d.optional.push(m))}p.exact!==void 0&&typeof p.exact!="number"?(d.mandatory=d.mandatory||{},d.mandatory[u("",c)]=p.exact):["min","max"].forEach(m=>{p[m]!==void 0&&(d.mandatory=d.mandatory||{},d.mandatory[u(m,c)]=p[m])})}),a.advanced&&(d.optional=(d.optional||[]).concat(a.advanced)),d},s=function(a,d){if(t.version>=61)return d(a);if(a=JSON.parse(JSON.stringify(a)),a&&typeof a.audio=="object"){let c=function(p,u,m){u in p&&!(m in p)&&(p[m]=p[u],delete p[u])};a=JSON.parse(JSON.stringify(a)),c(a.audio,"autoGainControl","googAutoGainControl"),c(a.audio,"noiseSuppression","googNoiseSuppression"),a.audio=r(a.audio)}if(a&&typeof a.video=="object"){let c=a.video.facingMode;c=c&&(typeof c=="object"?c:{ideal:c});let p=t.version<66;if(c&&(c.exact==="user"||c.exact==="environment"||c.ideal==="user"||c.ideal==="environment")&&!(n.mediaDevices.getSupportedConstraints&&n.mediaDevices.getSupportedConstraints().facingMode&&!p)){delete a.video.facingMode;let u;if(c.exact==="environment"||c.ideal==="environment"?u=["back","rear"]:(c.exact==="user"||c.ideal==="user")&&(u=["front"]),u)return n.mediaDevices.enumerateDevices().then(m=>{m=m.filter(g=>g.kind==="videoinput");let f=m.find(g=>u.some(C=>g.label.toLowerCase().includes(C)));return!f&&m.length&&u.includes("back")&&(f=m[m.length-1]),f&&(a.video.deviceId=c.exact?{exact:f.deviceId}:{ideal:f.deviceId}),a.video=r(a.video),at("chrome: "+JSON.stringify(a)),d(a)})}a.video=r(a.video)}return at("chrome: "+JSON.stringify(a)),d(a)},i=function(a){return t.version>=64?a:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[a.name]||a.name,message:a.message,constraint:a.constraint||a.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},o=function(a,d,c){s(a,p=>{n.webkitGetUserMedia(p,d,u=>{c&&c(i(u))})})};if(n.getUserMedia=o.bind(n),n.mediaDevices.getUserMedia){let a=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(d){return s(d,c=>a(c).then(p=>{if(c.audio&&!p.getAudioTracks().length||c.video&&!p.getVideoTracks().length)throw p.getTracks().forEach(u=>{u.stop()}),new DOMException("","NotFoundError");return p},p=>Promise.reject(i(p))))}}}function re(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function ne(e){if(typeof e=="object"&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(n){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=n)},enumerable:!0,configurable:!0});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=r=>{r.stream.addEventListener("addtrack",s=>{let i;e.RTCPeerConnection.prototype.getReceivers?i=this.getReceivers().find(a=>a.track&&a.track.id===s.track.id):i={track:s.track};let o=new Event("track");o.track=s.track,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],this.dispatchEvent(o)}),r.stream.getTracks().forEach(s=>{let i;e.RTCPeerConnection.prototype.getReceivers?i=this.getReceivers().find(a=>a.track&&a.track.id===s.id):i={track:s};let o=new Event("track");o.track=s,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],this.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else S(e,"track",t=>(t.transceiver||Object.defineProperty(t,"transceiver",{value:{receiver:t.receiver}}),t))}function se(e){if(typeof e=="object"&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){let t=function(s,i){return{track:i,get dtmf(){return this._dtmf===void 0&&(i.kind==="audio"?this._dtmf=s.createDTMFSender(i):this._dtmf=null),this._dtmf},_pc:s}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};let s=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(a,d){let c=s.apply(this,arguments);return c||(c=t(this,a),this._senders.push(c)),c};let i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(a){i.apply(this,arguments);let d=this._senders.indexOf(a);d!==-1&&this._senders.splice(d,1)}}let n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(i){this._senders=this._senders||[],n.apply(this,[i]),i.getTracks().forEach(o=>{this._senders.push(t(this,o))})};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(i){this._senders=this._senders||[],r.apply(this,[i]),i.getTracks().forEach(o=>{let a=this._senders.find(d=>d.track===o);a&&this._senders.splice(this._senders.indexOf(a),1)})}}else if(typeof e=="object"&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){let t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){let r=t.apply(this,[]);return r.forEach(s=>s._pc=this),r},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function ie(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){let n=e.RTCPeerConnection.prototype.getSenders;n&&(e.RTCPeerConnection.prototype.getSenders=function(){let i=n.apply(this,[]);return i.forEach(o=>o._pc=this),i});let r=e.RTCPeerConnection.prototype.addTrack;r&&(e.RTCPeerConnection.prototype.addTrack=function(){let i=r.apply(this,arguments);return i._pc=this,i}),e.RTCRtpSender.prototype.getStats=function(){let i=this;return this._pc.getStats().then(o=>te(o,i.track,!0))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){let n=e.RTCPeerConnection.prototype.getReceivers;n&&(e.RTCPeerConnection.prototype.getReceivers=function(){let s=n.apply(this,[]);return s.forEach(i=>i._pc=this),s}),S(e,"track",r=>(r.receiver._pc=r.srcElement,r)),e.RTCRtpReceiver.prototype.getStats=function(){let s=this;return this._pc.getStats().then(i=>te(i,s.track,!1))}}if(!("getStats"in e.RTCRtpSender.prototype&&"getStats"in e.RTCRtpReceiver.prototype))return;let t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){let r=arguments[0],s,i,o;return this.getSenders().forEach(a=>{a.track===r&&(s?o=!0:s=a)}),this.getReceivers().forEach(a=>(a.track===r&&(i?o=!0:i=a),a.track===r)),o||s&&i?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):s?s.getStats():i?i.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ct(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(o=>this._shimmedLocalStreams[o][0])};let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(o,a){if(!a)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};let d=t.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(d)===-1&&this._shimmedLocalStreams[a.id].push(d):this._shimmedLocalStreams[a.id]=[a,d],d};let n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(o){this._shimmedLocalStreams=this._shimmedLocalStreams||{},o.getTracks().forEach(c=>{if(this.getSenders().find(u=>u.track===c))throw new DOMException("Track already exists.","InvalidAccessError")});let a=this.getSenders();n.apply(this,arguments);let d=this.getSenders().filter(c=>a.indexOf(c)===-1);this._shimmedLocalStreams[o.id]=[o].concat(d)};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[o.id],r.apply(this,arguments)};let s=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},o&&Object.keys(this._shimmedLocalStreams).forEach(a=>{let d=this._shimmedLocalStreams[a].indexOf(o);d!==-1&&this._shimmedLocalStreams[a].splice(d,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function oe(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ct(e);let n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){let p=n.apply(this);return this._reverseStreams=this._reverseStreams||{},p.map(u=>this._reverseStreams[u.id])};let r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(p){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},p.getTracks().forEach(u=>{if(this.getSenders().find(f=>f.track===u))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[p.id]){let u=new e.MediaStream(p.getTracks());this._streams[p.id]=u,this._reverseStreams[u.id]=p,p=u}r.apply(this,[p])};let s=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(p){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[p.id]||p]),delete this._reverseStreams[this._streams[p.id]?this._streams[p.id].id:p.id],delete this._streams[p.id]},e.RTCPeerConnection.prototype.addTrack=function(p,u){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");let m=[].slice.call(arguments,1);if(m.length!==1||!m[0].getTracks().find(C=>C===p))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(C=>C.track===p))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};let g=this._streams[u.id];if(g)g.addTrack(p),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{let C=new e.MediaStream([p]);this._streams[u.id]=C,this._reverseStreams[C.id]=u,this.addStream(C)}return this.getSenders().find(C=>C.track===p)};function i(c,p){let u=p.sdp;return Object.keys(c._reverseStreams||[]).forEach(m=>{let f=c._reverseStreams[m],g=c._streams[f.id];u=u.replace(new RegExp(g.id,"g"),f.id)}),new RTCSessionDescription({type:p.type,sdp:u})}function o(c,p){let u=p.sdp;return Object.keys(c._reverseStreams||[]).forEach(m=>{let f=c._reverseStreams[m],g=c._streams[f.id];u=u.replace(new RegExp(f.id,"g"),g.id)}),new RTCSessionDescription({type:p.type,sdp:u})}["createOffer","createAnswer"].forEach(function(c){let p=e.RTCPeerConnection.prototype[c],u={[c](){let m=arguments;return arguments.length&&typeof arguments[0]=="function"?p.apply(this,[g=>{let C=i(this,g);m[0].apply(null,[C])},g=>{m[1]&&m[1].apply(null,g)},arguments[2]]):p.apply(this,arguments).then(g=>i(this,g))}};e.RTCPeerConnection.prototype[c]=u[c]});let a=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?a.apply(this,arguments):(arguments[0]=o(this,arguments[0]),a.apply(this,arguments))};let d=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){let c=d.get.apply(this);return c.type===""?c:i(this,c)}}),e.RTCPeerConnection.prototype.removeTrack=function(p){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!p._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(p._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let m;Object.keys(this._streams).forEach(f=>{this._streams[f].getTracks().find(C=>p.track===C)&&(m=this._streams[f])}),m&&(m.getTracks().length===1?this.removeStream(this._reverseStreams[m.id]):m.removeTrack(p.track),this.dispatchEvent(new Event("negotiationneeded")))}}function A(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(n){let r=e.RTCPeerConnection.prototype[n],s={[n](){return arguments[0]=new(n==="addIceCandidate"?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),r.apply(this,arguments)}};e.RTCPeerConnection.prototype[n]=s[n]})}function ae(e,t){S(e,"negotiationneeded",n=>{let r=n.target;if(!((t.version<72||r.getConfiguration&&r.getConfiguration().sdpSemantics==="plan-b")&&r.signalingState!=="stable"))return n})}var N={};D(N,{shimAddTransceiver:()=>me,shimCreateAnswer:()=>ge,shimCreateOffer:()=>he,shimGetDisplayMedia:()=>pt,shimGetParameters:()=>fe,shimGetUserMedia:()=>U,shimOnTrack:()=>ce,shimPeerConnection:()=>F,shimRTCDataChannel:()=>ue,shimReceiverGetStats:()=>de,shimRemoveStream:()=>le,shimSenderGetStats:()=>pe});function U(e,t){let n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(s,i,o){v("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(s).then(i,o)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){let s=function(o,a,d){a in o&&!(d in o)&&(o[d]=o[a],delete o[a])},i=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(o){return typeof o=="object"&&typeof o.audio=="object"&&(o=JSON.parse(JSON.stringify(o)),s(o.audio,"autoGainControl","mozAutoGainControl"),s(o.audio,"noiseSuppression","mozNoiseSuppression")),i(o)},r&&r.prototype.getSettings){let o=r.prototype.getSettings;r.prototype.getSettings=function(){let a=o.apply(this,arguments);return s(a,"mozAutoGainControl","autoGainControl"),s(a,"mozNoiseSuppression","noiseSuppression"),a}}if(r&&r.prototype.applyConstraints){let o=r.prototype.applyConstraints;r.prototype.applyConstraints=function(a){return this.kind==="audio"&&typeof a=="object"&&(a=JSON.parse(JSON.stringify(a)),s(a,"autoGainControl","mozAutoGainControl"),s(a,"noiseSuppression","mozNoiseSuppression")),o.apply(this,[a])}}}}function pt(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(r){if(!(r&&r.video)){let s=new DOMException("getDisplayMedia without video constraints is undefined");return s.name="NotFoundError",s.code=8,Promise.reject(s)}return r.video===!0?r.video={mediaSource:t}:r.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(r)})}function ce(e){typeof e=="object"&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function F(e,t){if(typeof e!="object"||!(e.RTCPeerConnection||e.mozRTCPeerConnection))return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(s){let i=e.RTCPeerConnection.prototype[s],o={[s](){return arguments[0]=new(s==="addIceCandidate"?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};e.RTCPeerConnection.prototype[s]=o[s]});let n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){let[i,o,a]=arguments;return r.apply(this,[i||null]).then(d=>{if(t.version<53&&!o)try{d.forEach(c=>{c.type=n[c.type]||c.type})}catch(c){if(c.name!=="TypeError")throw c;d.forEach((p,u)=>{d.set(u,Object.assign({},p,{type:n[p.type]||p.type}))})}return d}).then(o,a)}}function pe(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;let t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){let s=t.apply(this,[]);return s.forEach(i=>i._pc=this),s});let n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){let s=n.apply(this,arguments);return s._pc=this,s}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function de(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;let t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){let r=t.apply(this,[]);return r.forEach(s=>s._pc=this),r}),S(e,"track",n=>(n.receiver._pc=n.srcElement,n)),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function le(e){!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(n){v("removeStream","removeTrack"),this.getSenders().forEach(r=>{r.track&&n.getTracks().includes(r.track)&&this.removeTrack(r)})})}function ue(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function me(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let r=arguments[1]&&arguments[1].sendEncodings;r===void 0&&(r=[]),r=[...r];let s=r.length>0;s&&r.forEach(o=>{if("rid"in o&&!/^[a-z0-9]{0,16}$/i.test(o.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in o&&!(parseFloat(o.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in o&&!(parseFloat(o.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});let i=t.apply(this,arguments);if(s){let{sender:o}=i,a=o.getParameters();(!("encodings"in a)||a.encodings.length===1&&Object.keys(a.encodings[0]).length===0)&&(a.encodings=r,o.sendEncodings=r,this.setParametersPromises.push(o.setParameters(a).then(()=>{delete o.sendEncodings}).catch(()=>{delete o.sendEncodings})))}return i})}function fe(e){if(!(typeof e=="object"&&e.RTCRtpSender))return;let t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){let r=t.apply(this,arguments);return"encodings"in r||(r.encodings=[].concat(this.sendEncodings||[{}])),r})}function he(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}function ge(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}var q={};D(q,{shimAudioContext:()=>Pe,shimCallbacksAPI:()=>Se,shimConstraints:()=>dt,shimCreateOfferLegacy:()=>be,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>Ce,shimRTCIceServerUrls:()=>ve,shimRemoteStreamsAPI:()=>ye,shimTrackEventTransceiver:()=>Te});function Ce(e){if(!(typeof e!="object"||!e.RTCPeerConnection)){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(r){this._localStreams||(this._localStreams=[]),this._localStreams.includes(r)||this._localStreams.push(r),r.getAudioTracks().forEach(s=>t.call(this,s,r)),r.getVideoTracks().forEach(s=>t.call(this,s,r))},e.RTCPeerConnection.prototype.addTrack=function(r,...s){return s&&s.forEach(i=>{this._localStreams?this._localStreams.includes(i)||this._localStreams.push(i):this._localStreams=[i]}),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(n){this._localStreams||(this._localStreams=[]);let r=this._localStreams.indexOf(n);if(r===-1)return;this._localStreams.splice(r,1);let s=n.getTracks();this.getSenders().forEach(i=>{s.includes(i.track)&&this.removeTrack(i)})})}}function ye(e){if(!(typeof e!="object"||!e.RTCPeerConnection)&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(n){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=n),this.addEventListener("track",this._onaddstreampoly=r=>{r.streams.forEach(s=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(s))return;this._remoteStreams.push(s);let i=new Event("addstream");i.stream=s,this.dispatchEvent(i)})})}});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){let r=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(s){s.streams.forEach(i=>{if(r._remoteStreams||(r._remoteStreams=[]),r._remoteStreams.indexOf(i)>=0)return;r._remoteStreams.push(i);let o=new Event("addstream");o.stream=i,r.dispatchEvent(o)})}),t.apply(r,arguments)}}}function Se(e){if(typeof e!="object"||!e.RTCPeerConnection)return;let t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,s=t.setLocalDescription,i=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(c,p){let u=arguments.length>=2?arguments[2]:arguments[0],m=n.apply(this,[u]);return p?(m.then(c,p),Promise.resolve()):m},t.createAnswer=function(c,p){let u=arguments.length>=2?arguments[2]:arguments[0],m=r.apply(this,[u]);return p?(m.then(c,p),Promise.resolve()):m};let a=function(d,c,p){let u=s.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u};t.setLocalDescription=a,a=function(d,c,p){let u=i.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u},t.setRemoteDescription=a,a=function(d,c,p){let u=o.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u},t.addIceCandidate=a}function Re(e){let t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){let n=t.mediaDevices,r=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=s=>r(dt(s))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(r,s,i){t.mediaDevices.getUserMedia(r).then(s,i)}.bind(t))}function dt(e){return e&&e.video!==void 0?Object.assign({},e,{video:ee(e.video)}):e}function ve(e){if(!e.RTCPeerConnection)return;let t=e.RTCPeerConnection;e.RTCPeerConnection=function(r,s){if(r&&r.iceServers){let i=[];for(let o=0;o<r.iceServers.length;o++){let a=r.iceServers[o];a.urls===void 0&&a.url?(v("RTCIceServer.url","RTCIceServer.urls"),a=JSON.parse(JSON.stringify(a)),a.urls=a.url,delete a.url,i.push(a)):i.push(r.iceServers[o])}r.iceServers=i}return new t(r,s)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get(){return t.generateCertificate}})}function Te(e){typeof e=="object"&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function be(e){let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(r){if(r){typeof r.offerToReceiveAudio<"u"&&(r.offerToReceiveAudio=!!r.offerToReceiveAudio);let s=this.getTransceivers().find(o=>o.receiver.track.kind==="audio");r.offerToReceiveAudio===!1&&s?s.direction==="sendrecv"?s.setDirection?s.setDirection("sendonly"):s.direction="sendonly":s.direction==="recvonly"&&(s.setDirection?s.setDirection("inactive"):s.direction="inactive"):r.offerToReceiveAudio===!0&&!s&&this.addTransceiver("audio",{direction:"recvonly"}),typeof r.offerToReceiveVideo<"u"&&(r.offerToReceiveVideo=!!r.offerToReceiveVideo);let i=this.getTransceivers().find(o=>o.receiver.track.kind==="video");r.offerToReceiveVideo===!1&&i?i.direction==="sendrecv"?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":i.direction==="recvonly"&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):r.offerToReceiveVideo===!0&&!i&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Pe(e){typeof e!="object"||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var _e={};D(_e,{removeExtmapAllowMixed:()=>K,shimAddIceCandidateNullOrEmpty:()=>_,shimConnectionState:()=>z,shimMaxMessageSize:()=>x,shimParameterlessSetLocalDescription:()=>E,shimRTCIceCandidate:()=>P,shimRTCIceCandidateRelayProtocol:()=>G,shimSendThrowTypeError:()=>k});var T=et(ke());function P(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;let t=e.RTCIceCandidate;e.RTCIceCandidate=function(r){if(typeof r=="object"&&r.candidate&&r.candidate.indexOf("a=")===0&&(r=JSON.parse(JSON.stringify(r)),r.candidate=r.candidate.substring(2)),r.candidate&&r.candidate.length){let s=new t(r),i=T.default.parseCandidate(r.candidate);for(let o in i)o in s||Object.defineProperty(s,o,{value:i[o]});return s.toJSON=function(){return{candidate:s.candidate,sdpMid:s.sdpMid,sdpMLineIndex:s.sdpMLineIndex,usernameFragment:s.usernameFragment}},s}return new t(r)},e.RTCIceCandidate.prototype=t.prototype,S(e,"icecandidate",n=>(n.candidate&&Object.defineProperty(n,"candidate",{value:new e.RTCIceCandidate(n.candidate),writable:"false"}),n))}function G(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||S(e,"icecandidate",t=>{if(t.candidate){let n=T.default.parseCandidate(t.candidate.candidate);n.type==="relay"&&(t.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[n.priority>>24])}return t})}function x(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp}});let n=function(a){if(!a||!a.sdp)return!1;let d=T.default.splitSections(a.sdp);return d.shift(),d.some(c=>{let p=T.default.parseMLine(c);return p&&p.kind==="application"&&p.protocol.indexOf("SCTP")!==-1})},r=function(a){let d=a.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(d===null||d.length<2)return-1;let c=parseInt(d[1],10);return c!==c?-1:c},s=function(a){let d=65536;return t.browser==="firefox"&&(t.version<57?a===-1?d=16384:d=2147483637:t.version<60?d=t.version===57?65535:65536:d=2147483637),d},i=function(a,d){let c=65536;t.browser==="firefox"&&t.version===57&&(c=65535);let p=T.default.matchPrefix(a.sdp,"a=max-message-size:");return p.length>0?c=parseInt(p[0].substring(19),10):t.browser==="firefox"&&d!==-1&&(c=2147483637),c},o=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,t.browser==="chrome"&&t.version>=76){let{sdpSemantics:d}=this.getConfiguration();d==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp},enumerable:!0,configurable:!0})}if(n(arguments[0])){let d=r(arguments[0]),c=s(d),p=i(arguments[0],d),u;c===0&&p===0?u=Number.POSITIVE_INFINITY:c===0||p===0?u=Math.max(c,p):u=Math.min(c,p);let m={};Object.defineProperty(m,"maxMessageSize",{get(){return u}}),this._sctp=m}return o.apply(this,arguments)}}function k(e){if(!(e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype))return;function t(r,s){let i=r.send;r.send=function(){let a=arguments[0],d=a.length||a.size||a.byteLength;if(r.readyState==="open"&&s.sctp&&d>s.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+s.sctp.maxMessageSize+" bytes)");return i.apply(r,arguments)}}let n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){let s=n.apply(this,arguments);return t(s,this),s},S(e,"datachannel",r=>(t(r.channel,r.target),r))}function z(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;let 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(n){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),n&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=n)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(n=>{let r=t[n];t[n]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=s=>{let i=s.target;if(i._lastConnectionState!==i.connectionState){i._lastConnectionState=i.connectionState;let o=new Event("connectionstatechange",s);i.dispatchEvent(o)}return s},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),r.apply(this,arguments)}})}function K(e,t){if(!e.RTCPeerConnection||t.browser==="chrome"&&t.version>=71||t.browser==="safari"&&t.version>=605)return;let n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(s){if(s&&s.sdp&&s.sdp.indexOf(`
32
+ `};l.getDirection=function(e,t){let n=l.splitLines(e);for(let r=0;r<n.length;r++)switch(n[r]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return n[r].substring(2);default:}return t?l.getDirection(t):"sendrecv"};l.getKind=function(e){return l.splitLines(e)[0].split(" ")[0].substring(2)};l.isRejected=function(e){return e.split(" ",2)[1]==="0"};l.parseMLine=function(e){let n=l.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}};l.parseOLine=function(e){let n=l.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]}};l.isValidSDP=function(e){if(typeof e!="string"||e.length===0)return!1;let t=l.splitLines(e);for(let n=0;n<t.length;n++)if(t[n].length<2||t[n].charAt(1)!=="=")return!1;return!0};typeof xe=="object"&&(xe.exports=l)});var rt=!0,nt=!0;function b(e,t,n){let r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function y(e,t,n){if(!e.RTCPeerConnection)return;let r=e.RTCPeerConnection.prototype,s=r.addEventListener;r.addEventListener=function(o,a){if(o!==t)return s.apply(this,arguments);let d=c=>{let p=n(c);p&&(a.handleEvent?a.handleEvent(p):a(p))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,d),s.apply(this,[o,d])};let i=r.removeEventListener;r.removeEventListener=function(o,a){if(o!==t||!this._eventMap||!this._eventMap[t])return i.apply(this,arguments);if(!this._eventMap[t].has(a))return i.apply(this,arguments);let d=this._eventMap[t].get(a);return this._eventMap[t].delete(a),this._eventMap[t].size===0&&delete this._eventMap[t],Object.keys(this._eventMap).length===0&&delete this._eventMap,i.apply(this,[o,d])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(o){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),o&&this.addEventListener(t,this["_on"+t]=o)},enumerable:!0,configurable:!0})}function st(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(rt=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function it(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(nt=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function O(){if(typeof window=="object"){if(rt)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function v(e,t){nt&&console.warn(e+" is deprecated, please use "+t+" instead.")}function ot(e){let t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;let{navigator:n}=e;if(n.userAgentData&&n.userAgentData.brands){let r=n.userAgentData.brands.find(s=>s.brand==="Chromium");if(r)return{browser:"chrome",version:parseInt(r.version,10)}}if(n.mozGetUserMedia)t.browser="firefox",t.version=b(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||e.isSecureContext===!1&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=b(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(e.RTCPeerConnection&&n.userAgent.match(/AppleWebKit\/(\d+)\./))t.browser="safari",t.version=b(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype;else return t.browser="Not a supported browser.",t;return t}function tt(e){return Object.prototype.toString.call(e)==="[object Object]"}function ee(e){return tt(e)?Object.keys(e).reduce(function(t,n){let r=tt(e[n]),s=r?ee(e[n]):e[n],i=r&&!Object.keys(s).length;return s===void 0||i?t:Object.assign(t,{[n]:s})},{}):e}function w(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach(r=>{r.endsWith("Id")?w(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach(s=>{w(e,e.get(s),n)})}))}function te(e,t,n){let r=n?"outbound-rtp":"inbound-rtp",s=new Map;if(t===null)return s;let i=[];return e.forEach(o=>{o.type==="track"&&o.trackIdentifier===t.id&&i.push(o)}),i.forEach(o=>{e.forEach(a=>{a.type===r&&a.trackId===o.id&&w(e,a,s)})}),s}var j={};D(j,{fixNegotiationNeeded:()=>ae,shimAddTrackRemoveTrack:()=>oe,shimAddTrackRemoveTrackWithNative:()=>ct,shimGetSendersWithDtmf:()=>se,shimGetUserMedia:()=>L,shimMediaStream:()=>re,shimOnTrack:()=>ne,shimPeerConnection:()=>A,shimSenderReceiverGetStats:()=>ie});var at=O;function L(e,t){let n=e&&e.navigator;if(!n.mediaDevices)return;let r=function(a){if(typeof a!="object"||a.mandatory||a.optional)return a;let d={};return Object.keys(a).forEach(c=>{if(c==="require"||c==="advanced"||c==="mediaSource")return;let p=typeof a[c]=="object"?a[c]:{ideal:a[c]};p.exact!==void 0&&typeof p.exact=="number"&&(p.min=p.max=p.exact);let u=function(m,f){return m?m+f.charAt(0).toUpperCase()+f.slice(1):f==="deviceId"?"sourceId":f};if(p.ideal!==void 0){d.optional=d.optional||[];let m={};typeof p.ideal=="number"?(m[u("min",c)]=p.ideal,d.optional.push(m),m={},m[u("max",c)]=p.ideal,d.optional.push(m)):(m[u("",c)]=p.ideal,d.optional.push(m))}p.exact!==void 0&&typeof p.exact!="number"?(d.mandatory=d.mandatory||{},d.mandatory[u("",c)]=p.exact):["min","max"].forEach(m=>{p[m]!==void 0&&(d.mandatory=d.mandatory||{},d.mandatory[u(m,c)]=p[m])})}),a.advanced&&(d.optional=(d.optional||[]).concat(a.advanced)),d},s=function(a,d){if(t.version>=61)return d(a);if(a=JSON.parse(JSON.stringify(a)),a&&typeof a.audio=="object"){let c=function(p,u,m){u in p&&!(m in p)&&(p[m]=p[u],delete p[u])};a=JSON.parse(JSON.stringify(a)),c(a.audio,"autoGainControl","googAutoGainControl"),c(a.audio,"noiseSuppression","googNoiseSuppression"),a.audio=r(a.audio)}if(a&&typeof a.video=="object"){let c=a.video.facingMode;c=c&&(typeof c=="object"?c:{ideal:c});let p=t.version<66;if(c&&(c.exact==="user"||c.exact==="environment"||c.ideal==="user"||c.ideal==="environment")&&!(n.mediaDevices.getSupportedConstraints&&n.mediaDevices.getSupportedConstraints().facingMode&&!p)){delete a.video.facingMode;let u;if(c.exact==="environment"||c.ideal==="environment"?u=["back","rear"]:(c.exact==="user"||c.ideal==="user")&&(u=["front"]),u)return n.mediaDevices.enumerateDevices().then(m=>{m=m.filter(g=>g.kind==="videoinput");let f=m.find(g=>u.some(C=>g.label.toLowerCase().includes(C)));return!f&&m.length&&u.includes("back")&&(f=m[m.length-1]),f&&(a.video.deviceId=c.exact?{exact:f.deviceId}:{ideal:f.deviceId}),a.video=r(a.video),at("chrome: "+JSON.stringify(a)),d(a)})}a.video=r(a.video)}return at("chrome: "+JSON.stringify(a)),d(a)},i=function(a){return t.version>=64?a:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[a.name]||a.name,message:a.message,constraint:a.constraint||a.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},o=function(a,d,c){s(a,p=>{n.webkitGetUserMedia(p,d,u=>{c&&c(i(u))})})};if(n.getUserMedia=o.bind(n),n.mediaDevices.getUserMedia){let a=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(d){return s(d,c=>a(c).then(p=>{if(c.audio&&!p.getAudioTracks().length||c.video&&!p.getVideoTracks().length)throw p.getTracks().forEach(u=>{u.stop()}),new DOMException("","NotFoundError");return p},p=>Promise.reject(i(p))))}}}function re(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function ne(e){if(typeof e=="object"&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(n){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=n)},enumerable:!0,configurable:!0});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=r=>{r.stream.addEventListener("addtrack",s=>{let i;e.RTCPeerConnection.prototype.getReceivers?i=this.getReceivers().find(a=>a.track&&a.track.id===s.track.id):i={track:s.track};let o=new Event("track");o.track=s.track,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],this.dispatchEvent(o)}),r.stream.getTracks().forEach(s=>{let i;e.RTCPeerConnection.prototype.getReceivers?i=this.getReceivers().find(a=>a.track&&a.track.id===s.id):i={track:s};let o=new Event("track");o.track=s,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],this.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else y(e,"track",t=>(t.transceiver||Object.defineProperty(t,"transceiver",{value:{receiver:t.receiver}}),t))}function se(e){if(typeof e=="object"&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){let t=function(s,i){return{track:i,get dtmf(){return this._dtmf===void 0&&(i.kind==="audio"?this._dtmf=s.createDTMFSender(i):this._dtmf=null),this._dtmf},_pc:s}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};let s=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(a,d){let c=s.apply(this,arguments);return c||(c=t(this,a),this._senders.push(c)),c};let i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(a){i.apply(this,arguments);let d=this._senders.indexOf(a);d!==-1&&this._senders.splice(d,1)}}let n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(i){this._senders=this._senders||[],n.apply(this,[i]),i.getTracks().forEach(o=>{this._senders.push(t(this,o))})};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(i){this._senders=this._senders||[],r.apply(this,[i]),i.getTracks().forEach(o=>{let a=this._senders.find(d=>d.track===o);a&&this._senders.splice(this._senders.indexOf(a),1)})}}else if(typeof e=="object"&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){let t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){let r=t.apply(this,[]);return r.forEach(s=>s._pc=this),r},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function ie(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){let n=e.RTCPeerConnection.prototype.getSenders;n&&(e.RTCPeerConnection.prototype.getSenders=function(){let i=n.apply(this,[]);return i.forEach(o=>o._pc=this),i});let r=e.RTCPeerConnection.prototype.addTrack;r&&(e.RTCPeerConnection.prototype.addTrack=function(){let i=r.apply(this,arguments);return i._pc=this,i}),e.RTCRtpSender.prototype.getStats=function(){let i=this;return this._pc.getStats().then(o=>te(o,i.track,!0))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){let n=e.RTCPeerConnection.prototype.getReceivers;n&&(e.RTCPeerConnection.prototype.getReceivers=function(){let s=n.apply(this,[]);return s.forEach(i=>i._pc=this),s}),y(e,"track",r=>(r.receiver._pc=r.srcElement,r)),e.RTCRtpReceiver.prototype.getStats=function(){let s=this;return this._pc.getStats().then(i=>te(i,s.track,!1))}}if(!("getStats"in e.RTCRtpSender.prototype&&"getStats"in e.RTCRtpReceiver.prototype))return;let t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){let r=arguments[0],s,i,o;return this.getSenders().forEach(a=>{a.track===r&&(s?o=!0:s=a)}),this.getReceivers().forEach(a=>(a.track===r&&(i?o=!0:i=a),a.track===r)),o||s&&i?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):s?s.getStats():i?i.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ct(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(o=>this._shimmedLocalStreams[o][0])};let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(o,a){if(!a)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};let d=t.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(d)===-1&&this._shimmedLocalStreams[a.id].push(d):this._shimmedLocalStreams[a.id]=[a,d],d};let n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(o){this._shimmedLocalStreams=this._shimmedLocalStreams||{},o.getTracks().forEach(c=>{if(this.getSenders().find(u=>u.track===c))throw new DOMException("Track already exists.","InvalidAccessError")});let a=this.getSenders();n.apply(this,arguments);let d=this.getSenders().filter(c=>a.indexOf(c)===-1);this._shimmedLocalStreams[o.id]=[o].concat(d)};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[o.id],r.apply(this,arguments)};let s=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},o&&Object.keys(this._shimmedLocalStreams).forEach(a=>{let d=this._shimmedLocalStreams[a].indexOf(o);d!==-1&&this._shimmedLocalStreams[a].splice(d,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function oe(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ct(e);let n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){let p=n.apply(this);return this._reverseStreams=this._reverseStreams||{},p.map(u=>this._reverseStreams[u.id])};let r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(p){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},p.getTracks().forEach(u=>{if(this.getSenders().find(f=>f.track===u))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[p.id]){let u=new e.MediaStream(p.getTracks());this._streams[p.id]=u,this._reverseStreams[u.id]=p,p=u}r.apply(this,[p])};let s=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(p){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[p.id]||p]),delete this._reverseStreams[this._streams[p.id]?this._streams[p.id].id:p.id],delete this._streams[p.id]},e.RTCPeerConnection.prototype.addTrack=function(p,u){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");let m=[].slice.call(arguments,1);if(m.length!==1||!m[0].getTracks().find(C=>C===p))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(C=>C.track===p))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};let g=this._streams[u.id];if(g)g.addTrack(p),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{let C=new e.MediaStream([p]);this._streams[u.id]=C,this._reverseStreams[C.id]=u,this.addStream(C)}return this.getSenders().find(C=>C.track===p)};function i(c,p){let u=p.sdp;return Object.keys(c._reverseStreams||[]).forEach(m=>{let f=c._reverseStreams[m],g=c._streams[f.id];u=u.replace(new RegExp(g.id,"g"),f.id)}),new RTCSessionDescription({type:p.type,sdp:u})}function o(c,p){let u=p.sdp;return Object.keys(c._reverseStreams||[]).forEach(m=>{let f=c._reverseStreams[m],g=c._streams[f.id];u=u.replace(new RegExp(f.id,"g"),g.id)}),new RTCSessionDescription({type:p.type,sdp:u})}["createOffer","createAnswer"].forEach(function(c){let p=e.RTCPeerConnection.prototype[c],u={[c](){let m=arguments;return arguments.length&&typeof arguments[0]=="function"?p.apply(this,[g=>{let C=i(this,g);m[0].apply(null,[C])},g=>{m[1]&&m[1].apply(null,g)},arguments[2]]):p.apply(this,arguments).then(g=>i(this,g))}};e.RTCPeerConnection.prototype[c]=u[c]});let a=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?a.apply(this,arguments):(arguments[0]=o(this,arguments[0]),a.apply(this,arguments))};let d=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){let c=d.get.apply(this);return c.type===""?c:i(this,c)}}),e.RTCPeerConnection.prototype.removeTrack=function(p){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!p._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(p._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let m;Object.keys(this._streams).forEach(f=>{this._streams[f].getTracks().find(C=>p.track===C)&&(m=this._streams[f])}),m&&(m.getTracks().length===1?this.removeStream(this._reverseStreams[m.id]):m.removeTrack(p.track),this.dispatchEvent(new Event("negotiationneeded")))}}function A(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(n){let r=e.RTCPeerConnection.prototype[n],s={[n](){return arguments[0]=new(n==="addIceCandidate"?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),r.apply(this,arguments)}};e.RTCPeerConnection.prototype[n]=s[n]})}function ae(e,t){y(e,"negotiationneeded",n=>{let r=n.target;if(!((t.version<72||r.getConfiguration&&r.getConfiguration().sdpSemantics==="plan-b")&&r.signalingState!=="stable"))return n})}var N={};D(N,{shimAddTransceiver:()=>me,shimCreateAnswer:()=>ge,shimCreateOffer:()=>he,shimGetDisplayMedia:()=>pt,shimGetParameters:()=>fe,shimGetUserMedia:()=>U,shimOnTrack:()=>ce,shimPeerConnection:()=>F,shimRTCDataChannel:()=>ue,shimReceiverGetStats:()=>de,shimRemoveStream:()=>le,shimSenderGetStats:()=>pe});function U(e,t){let n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(s,i,o){v("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(s).then(i,o)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){let s=function(o,a,d){a in o&&!(d in o)&&(o[d]=o[a],delete o[a])},i=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(o){return typeof o=="object"&&typeof o.audio=="object"&&(o=JSON.parse(JSON.stringify(o)),s(o.audio,"autoGainControl","mozAutoGainControl"),s(o.audio,"noiseSuppression","mozNoiseSuppression")),i(o)},r&&r.prototype.getSettings){let o=r.prototype.getSettings;r.prototype.getSettings=function(){let a=o.apply(this,arguments);return s(a,"mozAutoGainControl","autoGainControl"),s(a,"mozNoiseSuppression","noiseSuppression"),a}}if(r&&r.prototype.applyConstraints){let o=r.prototype.applyConstraints;r.prototype.applyConstraints=function(a){return this.kind==="audio"&&typeof a=="object"&&(a=JSON.parse(JSON.stringify(a)),s(a,"autoGainControl","mozAutoGainControl"),s(a,"noiseSuppression","mozNoiseSuppression")),o.apply(this,[a])}}}}function pt(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(r){if(!(r&&r.video)){let s=new DOMException("getDisplayMedia without video constraints is undefined");return s.name="NotFoundError",s.code=8,Promise.reject(s)}return r.video===!0?r.video={mediaSource:t}:r.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(r)})}function ce(e){typeof e=="object"&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function F(e,t){if(typeof e!="object"||!(e.RTCPeerConnection||e.mozRTCPeerConnection))return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(s){let i=e.RTCPeerConnection.prototype[s],o={[s](){return arguments[0]=new(s==="addIceCandidate"?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};e.RTCPeerConnection.prototype[s]=o[s]});let n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){let[i,o,a]=arguments;return r.apply(this,[i||null]).then(d=>{if(t.version<53&&!o)try{d.forEach(c=>{c.type=n[c.type]||c.type})}catch(c){if(c.name!=="TypeError")throw c;d.forEach((p,u)=>{d.set(u,Object.assign({},p,{type:n[p.type]||p.type}))})}return d}).then(o,a)}}function pe(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;let t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){let s=t.apply(this,[]);return s.forEach(i=>i._pc=this),s});let n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){let s=n.apply(this,arguments);return s._pc=this,s}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function de(e){if(!(typeof e=="object"&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;let t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){let r=t.apply(this,[]);return r.forEach(s=>s._pc=this),r}),y(e,"track",n=>(n.receiver._pc=n.srcElement,n)),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function le(e){!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(n){v("removeStream","removeTrack"),this.getSenders().forEach(r=>{r.track&&n.getTracks().includes(r.track)&&this.removeTrack(r)})})}function ue(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function me(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let r=arguments[1]&&arguments[1].sendEncodings;r===void 0&&(r=[]),r=[...r];let s=r.length>0;s&&r.forEach(o=>{if("rid"in o&&!/^[a-z0-9]{0,16}$/i.test(o.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in o&&!(parseFloat(o.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in o&&!(parseFloat(o.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});let i=t.apply(this,arguments);if(s){let{sender:o}=i,a=o.getParameters();(!("encodings"in a)||a.encodings.length===1&&Object.keys(a.encodings[0]).length===0)&&(a.encodings=r,o.sendEncodings=r,this.setParametersPromises.push(o.setParameters(a).then(()=>{delete o.sendEncodings}).catch(()=>{delete o.sendEncodings})))}return i})}function fe(e){if(!(typeof e=="object"&&e.RTCRtpSender))return;let t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){let r=t.apply(this,arguments);return"encodings"in r||(r.encodings=[].concat(this.sendEncodings||[{}])),r})}function he(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}function ge(e){if(!(typeof e=="object"&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}var q={};D(q,{shimAudioContext:()=>Pe,shimCallbacksAPI:()=>Se,shimConstraints:()=>dt,shimCreateOfferLegacy:()=>be,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>Ce,shimRTCIceServerUrls:()=>ve,shimRemoteStreamsAPI:()=>ye,shimTrackEventTransceiver:()=>Te});function Ce(e){if(!(typeof e!="object"||!e.RTCPeerConnection)){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(r){this._localStreams||(this._localStreams=[]),this._localStreams.includes(r)||this._localStreams.push(r),r.getAudioTracks().forEach(s=>t.call(this,s,r)),r.getVideoTracks().forEach(s=>t.call(this,s,r))},e.RTCPeerConnection.prototype.addTrack=function(r,...s){return s&&s.forEach(i=>{this._localStreams?this._localStreams.includes(i)||this._localStreams.push(i):this._localStreams=[i]}),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(n){this._localStreams||(this._localStreams=[]);let r=this._localStreams.indexOf(n);if(r===-1)return;this._localStreams.splice(r,1);let s=n.getTracks();this.getSenders().forEach(i=>{s.includes(i.track)&&this.removeTrack(i)})})}}function ye(e){if(!(typeof e!="object"||!e.RTCPeerConnection)&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(n){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=n),this.addEventListener("track",this._onaddstreampoly=r=>{r.streams.forEach(s=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(s))return;this._remoteStreams.push(s);let i=new Event("addstream");i.stream=s,this.dispatchEvent(i)})})}});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){let r=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(s){s.streams.forEach(i=>{if(r._remoteStreams||(r._remoteStreams=[]),r._remoteStreams.indexOf(i)>=0)return;r._remoteStreams.push(i);let o=new Event("addstream");o.stream=i,r.dispatchEvent(o)})}),t.apply(r,arguments)}}}function Se(e){if(typeof e!="object"||!e.RTCPeerConnection)return;let t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,s=t.setLocalDescription,i=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(c,p){let u=arguments.length>=2?arguments[2]:arguments[0],m=n.apply(this,[u]);return p?(m.then(c,p),Promise.resolve()):m},t.createAnswer=function(c,p){let u=arguments.length>=2?arguments[2]:arguments[0],m=r.apply(this,[u]);return p?(m.then(c,p),Promise.resolve()):m};let a=function(d,c,p){let u=s.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u};t.setLocalDescription=a,a=function(d,c,p){let u=i.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u},t.setRemoteDescription=a,a=function(d,c,p){let u=o.apply(this,[d]);return p?(u.then(c,p),Promise.resolve()):u},t.addIceCandidate=a}function Re(e){let t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){let n=t.mediaDevices,r=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=s=>r(dt(s))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(r,s,i){t.mediaDevices.getUserMedia(r).then(s,i)}.bind(t))}function dt(e){return e&&e.video!==void 0?Object.assign({},e,{video:ee(e.video)}):e}function ve(e){if(!e.RTCPeerConnection)return;let t=e.RTCPeerConnection;e.RTCPeerConnection=function(r,s){if(r&&r.iceServers){let i=[];for(let o=0;o<r.iceServers.length;o++){let a=r.iceServers[o];a.urls===void 0&&a.url?(v("RTCIceServer.url","RTCIceServer.urls"),a=JSON.parse(JSON.stringify(a)),a.urls=a.url,delete a.url,i.push(a)):i.push(r.iceServers[o])}r.iceServers=i}return new t(r,s)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get(){return t.generateCertificate}})}function Te(e){typeof e=="object"&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function be(e){let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(r){if(r){typeof r.offerToReceiveAudio<"u"&&(r.offerToReceiveAudio=!!r.offerToReceiveAudio);let s=this.getTransceivers().find(o=>o.receiver.track.kind==="audio");r.offerToReceiveAudio===!1&&s?s.direction==="sendrecv"?s.setDirection?s.setDirection("sendonly"):s.direction="sendonly":s.direction==="recvonly"&&(s.setDirection?s.setDirection("inactive"):s.direction="inactive"):r.offerToReceiveAudio===!0&&!s&&this.addTransceiver("audio",{direction:"recvonly"}),typeof r.offerToReceiveVideo<"u"&&(r.offerToReceiveVideo=!!r.offerToReceiveVideo);let i=this.getTransceivers().find(o=>o.receiver.track.kind==="video");r.offerToReceiveVideo===!1&&i?i.direction==="sendrecv"?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":i.direction==="recvonly"&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):r.offerToReceiveVideo===!0&&!i&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Pe(e){typeof e!="object"||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var Ee={};D(Ee,{removeExtmapAllowMixed:()=>K,shimAddIceCandidateNullOrEmpty:()=>E,shimConnectionState:()=>z,shimMaxMessageSize:()=>x,shimParameterlessSetLocalDescription:()=>_,shimRTCIceCandidate:()=>P,shimRTCIceCandidateRelayProtocol:()=>G,shimSendThrowTypeError:()=>k});var T=et(ke());function P(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;let t=e.RTCIceCandidate;e.RTCIceCandidate=function(r){if(typeof r=="object"&&r.candidate&&r.candidate.indexOf("a=")===0&&(r=JSON.parse(JSON.stringify(r)),r.candidate=r.candidate.substring(2)),r.candidate&&r.candidate.length){let s=new t(r),i=T.default.parseCandidate(r.candidate);for(let o in i)o in s||Object.defineProperty(s,o,{value:i[o]});return s.toJSON=function(){return{candidate:s.candidate,sdpMid:s.sdpMid,sdpMLineIndex:s.sdpMLineIndex,usernameFragment:s.usernameFragment}},s}return new t(r)},e.RTCIceCandidate.prototype=t.prototype,y(e,"icecandidate",n=>(n.candidate&&Object.defineProperty(n,"candidate",{value:new e.RTCIceCandidate(n.candidate),writable:"false"}),n))}function G(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||y(e,"icecandidate",t=>{if(t.candidate){let n=T.default.parseCandidate(t.candidate.candidate);n.type==="relay"&&(t.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[n.priority>>24])}return t})}function x(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp}});let n=function(a){if(!a||!a.sdp)return!1;let d=T.default.splitSections(a.sdp);return d.shift(),d.some(c=>{let p=T.default.parseMLine(c);return p&&p.kind==="application"&&p.protocol.indexOf("SCTP")!==-1})},r=function(a){let d=a.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(d===null||d.length<2)return-1;let c=parseInt(d[1],10);return c!==c?-1:c},s=function(a){let d=65536;return t.browser==="firefox"&&(t.version<57?a===-1?d=16384:d=2147483637:t.version<60?d=t.version===57?65535:65536:d=2147483637),d},i=function(a,d){let c=65536;t.browser==="firefox"&&t.version===57&&(c=65535);let p=T.default.matchPrefix(a.sdp,"a=max-message-size:");return p.length>0?c=parseInt(p[0].substring(19),10):t.browser==="firefox"&&d!==-1&&(c=2147483637),c},o=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,t.browser==="chrome"&&t.version>=76){let{sdpSemantics:d}=this.getConfiguration();d==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp},enumerable:!0,configurable:!0})}if(n(arguments[0])){let d=r(arguments[0]),c=s(d),p=i(arguments[0],d),u;c===0&&p===0?u=Number.POSITIVE_INFINITY:c===0||p===0?u=Math.max(c,p):u=Math.min(c,p);let m={};Object.defineProperty(m,"maxMessageSize",{get(){return u}}),this._sctp=m}return o.apply(this,arguments)}}function k(e){if(!(e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype))return;function t(r,s){let i=r.send;r.send=function(){let a=arguments[0],d=a.length||a.size||a.byteLength;if(r.readyState==="open"&&s.sctp&&d>s.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+s.sctp.maxMessageSize+" bytes)");return i.apply(r,arguments)}}let n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){let s=n.apply(this,arguments);return t(s,this),s},y(e,"datachannel",r=>(t(r.channel,r.target),r))}function z(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;let 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(n){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),n&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=n)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(n=>{let r=t[n];t[n]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=s=>{let i=s.target;if(i._lastConnectionState!==i.connectionState){i._lastConnectionState=i.connectionState;let o=new Event("connectionstatechange",s);i.dispatchEvent(o)}return s},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),r.apply(this,arguments)}})}function K(e,t){if(!e.RTCPeerConnection||t.browser==="chrome"&&t.version>=71||t.browser==="safari"&&t.version>=605)return;let n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(s){if(s&&s.sdp&&s.sdp.indexOf(`
33
33
  a=extmap-allow-mixed`)!==-1){let i=s.sdp.split(`
34
34
  `).filter(o=>o.trim()!=="a=extmap-allow-mixed").join(`
35
- `);e.RTCSessionDescription&&s instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:s.type,sdp:i}):s.sdp=i}return n.apply(this,arguments)}}function _(e,t){if(!(e.RTCPeerConnection&&e.RTCPeerConnection.prototype))return;let n=e.RTCPeerConnection.prototype.addIceCandidate;!n||n.length===0||(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(t.browser==="chrome"&&t.version<78||t.browser==="firefox"&&t.version<68||t.browser==="safari")&&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;let n=e.RTCPeerConnection.prototype.setLocalDescription;!n||n.length===0||(e.RTCPeerConnection.prototype.setLocalDescription=function(){let s=arguments[0]||{};if(typeof s!="object"||s.type&&s.sdp)return n.apply(this,arguments);if(s={type:s.type,sdp:s.sdp},!s.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":s.type="offer";break;default:s.type="answer";break}return s.sdp||s.type!=="offer"&&s.type!=="answer"?n.apply(this,[s]):(s.type==="offer"?this.createOffer:this.createAnswer).apply(this).then(o=>n.apply(this,[o]))})}var Et=et(ke());function lt({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){let n=O,r=ot(e),s={browserDetails:r,commonShim:_e,extractVersion:b,disableLog:st,disableWarnings:it,sdp:Et};switch(r.browser){case"chrome":if(!j||!A||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),s;if(r.version===null)return n("Chrome shim can not determine version, not shimming."),s;n("adapter.js shimming chrome."),s.browserShim=j,_(e,r),E(e,r),L(e,r),re(e,r),A(e,r),ne(e,r),oe(e,r),se(e,r),ie(e,r),ae(e,r),P(e,r),G(e,r),z(e,r),x(e,r),k(e,r),K(e,r);break;case"firefox":if(!N||!F||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),s;n("adapter.js shimming firefox."),s.browserShim=N,_(e,r),E(e,r),U(e,r),F(e,r),ce(e,r),le(e,r),pe(e,r),de(e,r),ue(e,r),me(e,r),fe(e,r),he(e,r),ge(e,r),P(e,r),z(e,r),x(e,r),k(e,r);break;case"safari":if(!q||!t.shimSafari)return n("Safari shim is not included in this adapter release."),s;n("adapter.js shimming safari."),s.browserShim=q,_(e,r),E(e,r),ve(e,r),be(e,r),Se(e,r),Ce(e,r),ye(e,r),Te(e,r),Re(e,r),Pe(e,r),P(e,r),G(e,r),x(e,r),k(e,r),K(e,r);break;default:n("Unsupported browser!");break}return s}var It=lt({window:typeof window>"u"?void 0:window}),I=It;import{ServiceType as Mt}from"@protobuf-ts/runtime-rpc";import{MessageType as h}from"@protobuf-ts/runtime";var Xe=(i=>(i[i.UNSPECIFIED=0]="UNSPECIFIED",i[i.OFFER=1]="OFFER",i[i.ANSWER=2]="ANSWER",i[i.PRANSWER=3]="PRANSWER",i[i.ROLLBACK=4]="ROLLBACK",i))(Xe||{}),Ee=class extends h{constructor(){super("pulsebeam.v1.PrepareReq",[])}},Dt=new Ee,Ie=class extends h{constructor(){super("pulsebeam.v1.PrepareResp",[{no:1,name:"ice_servers",kind:"message",repeat:1,T:()=>Lt}])}},Ot=new Ie,Me=class extends h{constructor(){super("pulsebeam.v1.IceServer",[{no:1,name:"urls",kind:"scalar",repeat:2,T:9},{no:2,name:"username",kind:"scalar",opt:!0,T:9},{no:3,name:"credential",kind:"scalar",opt:!0,T:9}])}},Lt=new Me,De=class extends h{constructor(){super("pulsebeam.v1.SendReq",[{no:1,name:"msg",kind:"message",T:()=>ut}])}},At=new De,Oe=class extends h{constructor(){super("pulsebeam.v1.SendResp",[])}},jt=new Oe,Le=class extends h{constructor(){super("pulsebeam.v1.RecvReq",[{no:1,name:"src",kind:"message",T:()=>Ue}])}},Ut=new Le,Ae=class extends h{constructor(){super("pulsebeam.v1.RecvResp",[{no:1,name:"msgs",kind:"message",repeat:1,T:()=>ut}])}},Ft=new Ae,je=class extends h{constructor(){super("pulsebeam.v1.PeerInfo",[{no:1,name:"group_id",kind:"scalar",T:9},{no:2,name:"peer_id",kind:"scalar",T:9},{no:3,name:"conn_id",kind:"scalar",T:13}])}},Ue=new je,Fe=class extends h{constructor(){super("pulsebeam.v1.Message",[{no:1,name:"header",kind:"message",T:()=>qt},{no:2,name:"payload",kind:"message",T:()=>Nt}])}},ut=new Fe,Ne=class extends h{constructor(){super("pulsebeam.v1.MessagePayload",[{no:1,name:"signal",kind:"message",oneof:"payloadType",T:()=>Gt},{no:2,name:"join",kind:"message",oneof:"payloadType",T:()=>Jt},{no:3,name:"bye",kind:"message",oneof:"payloadType",T:()=>Bt},{no:4,name:"ack",kind:"message",oneof:"payloadType",T:()=>Vt}])}},Nt=new Ne,qe=class extends h{constructor(){super("pulsebeam.v1.MessageHeader",[{no:1,name:"src",kind:"message",T:()=>Ue},{no:2,name:"dst",kind:"message",T:()=>Ue},{no:7,name:"seqnum",kind:"scalar",T:13},{no:8,name:"reliable",kind:"scalar",T:8}])}},qt=new qe,Ge=class extends h{constructor(){super("pulsebeam.v1.Signal",[{no:1,name:"generation_counter",kind:"scalar",T:13},{no:9,name:"sdp",kind:"message",oneof:"data",T:()=>zt},{no:10,name:"ice_candidate",kind:"message",oneof:"data",T:()=>Kt}])}},Gt=new Ge,ze=class extends h{constructor(){super("pulsebeam.v1.Sdp",[{no:1,name:"kind",kind:"enum",T:()=>["pulsebeam.v1.SdpKind",Xe,"SDP_KIND_"]},{no:2,name:"sdp",kind:"scalar",T:9}])}},zt=new ze,Ke=class extends h{constructor(){super("pulsebeam.v1.ICECandidate",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdp_m_line_index",kind:"scalar",opt:!0,T:13},{no:3,name:"sdp_mid",kind:"scalar",opt:!0,T:9},{no:4,name:"username",kind:"scalar",opt:!0,T:9},{no:5,name:"password",kind:"scalar",opt:!0,T:9}])}},Kt=new Ke,Je=class extends h{constructor(){super("pulsebeam.v1.Join",[])}},Jt=new Je,Be=class extends h{constructor(){super("pulsebeam.v1.Bye",[])}},Bt=new Be,Ve=class extends h{constructor(){super("pulsebeam.v1.Ack",[{no:1,name:"ack_ranges",kind:"message",repeat:1,T:()=>Ht}])}},Vt=new Ve,He=class extends h{constructor(){super("pulsebeam.v1.AckRange",[{no:1,name:"seqnum_start",kind:"scalar",T:13},{no:2,name:"seqnum_end",kind:"scalar",T:13}])}},Ht=new He,Ye=class extends h{constructor(){super("pulsebeam.v1.DataChannel",[{no:10,name:"heartbeat",kind:"message",oneof:"payload",T:()=>Yt}])}},Tr=new Ye,We=class extends h{constructor(){super("pulsebeam.v1.DataChannelHeartbeat",[])}},Yt=new We,J=new Mt("pulsebeam.v1.Tunnel",[{name:"Prepare",options:{},I:Dt,O:Ot},{name:"Send",options:{},I:At,O:jt},{name:"Recv",options:{},I:Ut,O:Ft}]);import{stackIntercept as Qe}from"@protobuf-ts/runtime-rpc";var B=class{constructor(t){this._transport=t;this.typeName=J.typeName;this.methods=J.methods;this.options=J.options}prepare(t,n){let r=this.methods[0],s=this._transport.mergeOptions(n);return Qe("unary",this._transport,r,s,t)}send(t,n){let r=this.methods[1],s=this._transport.mergeOptions(n);return Qe("unary",this._transport,r,s,t)}recv(t,n){let r=this.methods[2],s=this._transport.mergeOptions(n);return Qe("unary",this._transport,r,s,t)}};function V(e,t){return new Promise(n=>{let r=setTimeout(()=>n(!0),e);t&&t.addEventListener("abort",()=>{clearTimeout(r),n(!1)})})}function H(...e){let t=new AbortController,n=()=>{t.abort();for(let r of e)r.removeEventListener("abort",n)};for(let r of e)r.addEventListener("abort",n);return t.signal}async function M(e,t){let{maxRetries:n,baseDelay:r,maxDelay:s,jitterFactor:i=.3,isRecoverable:o=()=>!0,abortSignal:a}=t,d=0;for(;(d<=n||n<0)&&!a?.aborted;)try{return await e()}catch(c){if(!o(c)||(d++,n>=0&&d>n))throw c;let p=Wt(d,r,s,i);await V(p,a).catch(()=>{})}if(a?.aborted)return null;throw new Error("Retry failed: max retries exceeded")}function Wt(e,t,n,r){let s=Math.min(t*2**(e-1),n),i=Math.random()*r*s;return s+i}var mt=9e5,ft=50,Y=1e3,Xt=5,Qt=1e4,Zt=1e3;var $t=V,wt=e=>Math.floor(Math.random()*(2**32-e))+e,er=e=>!0,Ze=class{constructor(t){this.onmsg=async t=>{};this.logger=t.sub("queue"),this.map=new Map,this.emitted=new Map,this.unreliable=[],this.processing=!1}enqueue(t){if(!t.header?.reliable)this.unreliable.push(t);else{let n=t.header.seqnum;if(this.map.has(n)||this.emitted.has(n))return;this.map.set(n,[performance.now(),t])}this.processNext()}async processNext(){if(this.processing)return;let t=this.unreliable.pop();if(!t){let n=this.map.entries().next().value;if(!n)return;let[r,s]=n;this.map.delete(r),this.emitted.set(r,s);let[i,o]=s;if(!o.header)return;t=o}this.processing=!0;try{await this.onmsg(t)}catch(n){let r={msg:t};n instanceof Error&&(r.err=n),this.logger.error("error processing message",r)}this.processing=!1,this.processNext()}},W=class{constructor(t,n){this.client=t;this.opts=n;this.onstream=t=>{};this.onclosed=t=>{};this.handleMessages=t=>{for(let n of t){if(this.logger.debug("received",{msg:n}),this.abort.signal.aborted)return;if(!n.header)continue;let r=n.header.src,s=n.header.dst;if(!r||!s)continue;if(s.connId>=16&&s.connId!=this.info.connId){this.logger.warn("received messages from a stale connection, ignoring",{receivedConnID:s.connId});continue}let i=null;for(let o of this.streams)if(r.groupId===o.other.groupId&&r.peerId===o.other.peerId&&r.connId===o.other.connId){i=o;break}if(!i){if(this.logger.debug(`session not found, creating one for ${r.peerId}:${r.connId}`),r.peerId==this.info.peerId){this.logger.warn("loopback detected, ignoring messages");return}i=new $e(this,this.info,r,this.logger),this.streams.push(i),this.onstream(i)}i.enqueue(n)}};this.asleep=n.asleep||$t,this.randUint32=n.randUint32||wt,this.isRecoverable=n.isRecoverable||er,this.info={groupId:n.groupId,peerId:n.peerId,connId:this.randUint32(16)},this.abort=new AbortController,this.logger=n.logger.sub("transport",{info:this.info}),this.streams=[]}async listen(){await Promise.all([this.pollLoop(),this.gcLoop()])}async gcLoop(){for(;!this.abort.signal.aborted;)this.streams=this.streams.filter(t=>!t.isClosed()),await V(Zt,this.abort.signal);this.logger.debug("gc loop is closed")}async pollLoop(){let t={abort:this.abort.signal,timeout:mt},n={baseDelay:ft,maxDelay:Y,maxRetries:-1,abortSignal:this.abort.signal,isRecoverable:this.isRecoverable};for(;!this.abort.signal.aborted;)try{let r=await M(async()=>await this.client.recv({src:this.info},t),n);if(r===null)break;new Promise(()=>this.handleMessages(r.response.msgs))}catch(r){this.logger.error("unrecoverable error, force closing",{err:r}),this.close();return}this.logger.debug("poll loop is closed")}async close(t){this.abort.signal.aborted||(t=t||"transport is closed",await Promise.all(this.streams.map(n=>n.close(t))),this.abort.abort(t),this.logger.debug("transport is now closed",{reason:t}),this.streams=[],this.onclosed(t))}async connect(t,n,r){let s={payloadType:{oneofKind:"join",join:{}}},i={src:this.info,dst:{groupId:t,peerId:n,connId:0},seqnum:0,reliable:!1},o=!1,a=H(r,this.abort.signal);for(;!a.aborted&&!o;)await this.send(a,{header:i,payload:s}),await this.asleep(Y,a).catch(()=>{}),o=!!this.streams.find(d=>d.other.groupId===t&&d.other.peerId===n)}async send(t,n){let r=H(t,this.abort.signal),s={abort:r,timeout:mt},i={baseDelay:ft,maxDelay:Y,maxRetries:-1,abortSignal:r,isRecoverable:this.isRecoverable};try{if(await M(async()=>await this.client.send({msg:n},s),i)===null){this.logger.warn("aborted, message dropped from sending",{msg:n});return}return}catch(o){this.logger.error("unrecoverable error, force closing",{err:o}),this.close();return}}},$e=class{constructor(t,n,r,s){this.transport=t;this.info=n;this.other=r;this.onpayload=async t=>{};this.onclosed=t=>{};this.logger=s.sub("stream",{other:r}),this.abort=new AbortController,this.ackedbuf={},this.recvq=new Ze(this.logger),this.recvq.onmsg=i=>this.handleMessage(i),this.lastSeqnum=0,this.closedAt=0}createSignal(...t){return H(this.abort.signal,...t)}isClosed(){let t=this.abort.signal.aborted&&performance.now()-this.closedAt>Qt;return t&&this.logger.debug("stream is ready for GC"),t}enqueue(t){if(this.abort.signal.aborted){this.logger.warn("received a message in closed state, ignoring new messages.");return}this.recvq.enqueue(t)}async send(t,n,r){r||(r=this.abort.signal);let s={header:{src:this.transport.info,dst:this.other,seqnum:0,reliable:n},payload:{...t}};if(!n){await this.transport.send(r,s);return}this.lastSeqnum++,s.header.seqnum=this.lastSeqnum,this.ackedbuf[s.header.seqnum]=!1;let i=Xt,o=i,a=s.header.seqnum;for(;!r.aborted&&(await this.transport.send(this.abort.signal,s),await this.transport.asleep(5*Y,this.abort.signal).catch(()=>{}),!this.ackedbuf[a]);){if(o<=0){let d="reached the maximum resend limit, dropping message";throw this.logger.warn(d,{seqnum:a,resendLimit:i,reliable:n}),new Error(d)}o--,this.logger.debug("resending",{...s.header})}}async handleMessage(t){let n=t.payload.payloadType;switch(n.oneofKind){case"ack":this.handleAck(n.ack);break;case"bye":this.close("received bye from other peer");break;case void 0:break;default:{if(t.header.reliable){let s={payloadType:{oneofKind:"ack",ack:{ackRanges:[{seqnumStart:t.header.seqnum,seqnumEnd:t.header.seqnum+1}]}}};this.logger.debug("ack",{seqnum:t.header.seqnum}),this.send(s,!1)}if(!t.payload)return;await this.onpayload(t.payload);break}}}handleAck(t){for(let n of t.ackRanges)for(let r=n.seqnumStart;r<n.seqnumEnd;r++)this.logger.debug("received ack",{seqnum:r}),this.ackedbuf[r]=!0}async close(t){this.abort.signal.aborted||(t=t||"session is closed",await this.send({payloadType:{oneofKind:"bye",bye:{}}},!1).catch(n=>this.logger.warn("failed to send bye",{e:n})),this.abort.abort(t),this.closedAt=performance.now(),this.onclosed(t),this.logger.debug("sent bye to the other peer",{reason:t}))}};var tr={DEBUG:console.debug,INFO:console.info,WARN:console.warn,ERROR:console.error},ht={DEBUG:e=>console.debug(X(e)),INFO:e=>console.info(X(e)),WARN:e=>console.warn(X(e)),ERROR:e=>console.error(X(e))};function gt(e,t,n="root",r=new Set){let s=".";if(!r.has(e)){r.add(e);for(let i in e)if(typeof e[i]=="object"&&e[i]!==null){let o=n+s+i;gt(e[i],t,o,r)}else{let o=t[n]||[];o.push(`${i}=${e[i]}`),t[n]=o}}}function X(e){let t={};gt(e,t);let n=[];for(let r in t)n.push(`[${r}] ${t[r].join(" ")}`);return n.join(`
36
- `)}var Q=class e{constructor(t,n,r){this.name=t;n||(n={}),r||(r=tr),this.sink=r,this.obj={...n,name:t}}log(t,n,r){let s=r||{};t({ts:Date.now(),message:n,...this.obj,...s})}debug(t,n){this.log(this.sink.DEBUG,t,n)}info(t,n){this.log(this.sink.INFO,t,n)}warn(t,n){this.log(this.sink.WARN,t,n)}error(t,n){this.log(this.sink.ERROR,t,n)}sub(t,n){return n||(n={}),new e(this.name+"."+t,{...this.obj,...n},this.sink)}};var rr=2,Ct=5e3;function yt(e){return{candidate:e.candidate,sdpMid:e.sdpMid,sdpMLineIndex:e.sdpMLineIndex,usernameFragment:e.password}}function nr(e){switch(e){case 1:return"offer";case 2:return"answer";case 3:return"pranswer";case 4:return"rollback";default:throw new Error(`unexpected kind: ${e}`)}}function St(e){switch(e){case"offer":return 1;case"answer":return 2;case"pranswer":return 3;case"rollback":return 4;default:throw new Error(`unexpected sdp type: ${e}`)}}var Z=class{constructor(t,n){this.stream=t;this.ondatachannel=()=>{};this.onconnectionstatechange=()=>{};this.ontrack=()=>{};this.triggerIceRestart=()=>{if(!this.impolite)return;let t=performance.now()-this.lastIceRestart;if(t<Ct){let n=Ct-t,r=window.setTimeout(()=>{this.triggerIceRestart(),this.timers=this.timers.filter(s=>s===r)},n);return}this.pc.connectionState!=="connected"&&(this.iceRestartCount>=rr&&this.close(),this.logger.debug("triggered ICE restart"),this.pc.restartIce(),this.generationCounter++,this.iceRestartCount++,this.lastIceRestart=performance.now())};this.sendSignal=t=>{this.stream.send({payloadType:{oneofKind:"signal",signal:{...t,generationCounter:this.generationCounter}}},!0)};this.handleMessage=async t=>{if(this.abort.signal.aborted){this.logger.warn("session is closed, ignoring message");return}switch(t.payloadType.oneofKind){case"signal":await this.handleSignal(t.payloadType.signal);break;case"bye":this.close();break;case"join":break}};this.handleSignal=async t=>{if(t.generationCounter<this.generationCounter){this.logger.warn("detected staled generationCounter signals, ignoring");return}let n=t.data;if(t.generationCounter>this.generationCounter){if(this.logger.debug("detected new generationCounter",{otherGenerationCounter:t.generationCounter,generationCounter:this.generationCounter,msg:n}),n.oneofKind==="iceCandidate"){let o=yt(n.iceCandidate);this.pendingCandidates.push(o),this.logger.warn("expecting an offer but got ice candidates during an ICE restart, adding to pending.",{ice:o,msg:n});return}this.generationCounter=t.generationCounter}if(n.oneofKind==="iceCandidate"){let o=yt(n.iceCandidate);this.pendingCandidates.push(o),this.checkPendingCandidates();return}if(n.oneofKind!="sdp")return;let r=n.sdp;this.logger.debug("received a SDP signal",{sdpKind:r.kind});let s=r.kind===1&&(this.makingOffer||this.pc.signalingState!=="stable");if(this.impolite&&s){this.logger.debug("ignored offer");return}if(this.logger.debug("creating an answer"),await this.pc.setRemoteDescription({type:nr(r.kind),sdp:r.sdp}),r.kind===1){if(await this.pc.setLocalDescription(),!this.pc.localDescription){this.logger.error("unexpected null local description");return}this.sendSignal({data:{oneofKind:"sdp",sdp:{kind:St(this.pc.localDescription.type),sdp:this.pc.localDescription.sdp}}})}this.checkPendingCandidates()};this.checkPendingCandidates=()=>{if(!["stable","have-local-offer","have-remote-offer"].includes(this.pc.signalingState)||!this.pc.remoteDescription){this.logger.debug("wait for adding pending candidates",{signalingState:this.pc.signalingState,iceConnectionState:this.pc.iceConnectionState,connectionState:this.pc.connectionState,remoteDescription:this.pc.remoteDescription,pendingCandidates:this.pendingCandidates.length});return}for(let n of this.pendingCandidates)!n.candidate||n.candidate===""||(this.pc.addIceCandidate(n).catch(r=>{this.logger.warn("failed to add candidate, skipping.",{candidate:n,e:r})}),this.logger.debug(`added ice: ${n.candidate}`));this.pendingCandidates=[]};this.pc=new RTCPeerConnection(n),this.makingOffer=!1,this.pendingCandidates=[],this.stream.info.connId===this.stream.other.connId?this.impolite=this.stream.info.peerId>this.stream.other.peerId:this.impolite=this.stream.info.connId>this.stream.other.connId,this.abort=new AbortController,this.logger=t.logger.sub("session",{role:this.impolite?"impolite":"polite"}),this.generationCounter=0,this.iceRestartCount=0,this.lastIceRestart=0,this.timers=[],this._connectionState="new",t.onpayload=i=>this.handleMessage(i),t.onclosed=i=>this.close(i),this.pc.oniceconnectionstatechange=async()=>{let i=await this.pc.getStats(),o=[],a=[],d=[];i.forEach(c=>{c.type==="candidate-pair"?o.push(c):c.type==="local-candidate"?a.push(c):c.type==="remote-candidate"&&d.push(c)}),this.logger.debug("iceconnectionstate changed",{connectionstate:this.pc.connectionState,iceconnectionstate:this.pc.iceConnectionState,local:a,remote:d,pair:o,pending:this.pendingCandidates})};let r=performance.now();this.pc.onconnectionstatechange=i=>{switch(this.logger.debug("connectionstate changed",{connectionstate:this.pc.connectionState,iceconnectionstate:this.pc.iceConnectionState}),this.setConnectionState(this.pc.connectionState,i),this.pc.connectionState){case"connecting":r=performance.now();break;case"connected":{let o=performance.now()-r;this.logger.debug(`it took ${o}ms to connect`),this.iceRestartCount=0;break}case"disconnected":this.triggerIceRestart();break;case"failed":this.close("detected sustained network failure");break;case"closed":break}};let s=!0;this.pc.onnegotiationneeded=async()=>{if(s){if(!this.impolite){this.stream.send({payloadType:{oneofKind:"join",join:{}}},!0);return}s=!1}try{if(this.makingOffer=!0,this.logger.debug("creating an offer"),await this.pc.setLocalDescription(),!this.pc.localDescription)throw new Error("expect localDescription to be not empty");this.sendSignal({data:{oneofKind:"sdp",sdp:{kind:St(this.pc.localDescription.type),sdp:this.pc.localDescription.sdp}}})}catch(i){i instanceof Error&&this.logger.error("failed in negotiating",{err:i})}finally{this.makingOffer=!1}},this.pc.onicecandidate=({candidate:i})=>{this.logger.debug("onicecandidate",{candidate:i});let o={candidate:"",sdpMLineIndex:0,sdpMid:""};if(!i||i.candidate===""){this.logger.debug("ice gathering is finished");return}o.candidate=i.candidate,o.sdpMLineIndex=i.sdpMLineIndex??void 0,o.sdpMid=i.sdpMid??void 0,o.username=i.usernameFragment??void 0,this.sendSignal({data:{oneofKind:"iceCandidate",iceCandidate:o}})},this.pc.ondatachannel=(...i)=>{this.ondatachannel&&this.ondatachannel(...i)},this.pc.ontrack=(...i)=>{this.ontrack&&this.ontrack(...i)}}addTrack(...t){return this.pc.addTrack(...t)}removeTrack(...t){return this.pc.removeTrack(...t)}createDataChannel(...t){return this.pc.createDataChannel(...t)}get connectionState(){return this.pc.connectionState}get closeReason(){return this._closeReason}get other(){return{groupId:this.stream.other.groupId,peerId:this.stream.other.peerId,connId:this.stream.other.connId}}close(t){if(this.abort.signal.aborted)return;this.abort.abort(t);for(let r of this.timers)clearTimeout(r);this.timers=[],this.stream.close(),this._closeReason=t,this.pc.close();let n=new Event("connectionstatechange");this.setConnectionState("closed",n),this.logger.debug("session closed",{connectionState:this.connectionState})}setConnectionState(t,n){t!==this._connectionState&&this.onconnectionstatechange&&this.onconnectionstatechange(n)}};import{RpcError as sr}from"@protobuf-ts/runtime-rpc";import{TwirpErrorCode as y,TwirpFetchTransport as ir}from"@protobuf-ts/twirp-transport";import{jwtDecode as or}from"jwt-decode";var ar="https://cloud.pulsebeam.dev/twirp";var we=class{constructor(t,n,r,s){this.onsession=t=>{};this.onstatechange=()=>{};this.peerId=r.peerId,this.logger=t.sub("peer",{peerId:this.peerId}),this.sessions=[],this._state="new";let i={bundlePolicy:"balanced",iceTransportPolicy:r.forceRelay?"relay":"all",iceCandidatePoolSize:0,iceServers:r.iceServers};this.transport=new W(n,{enableDiscovery:!1,groupId:r.groupId,peerId:r.peerId,logger:this.logger,isRecoverable:s}),this.transport.onstream=o=>{let a=new Z(o,i);this.sessions.push(a),this.onsession(a)},this.transport.onclosed=()=>{this.close()}}start(){if(this._state==="closed")throw new Error("peer is already closed");this.transport.listen()}async close(){this.sessions=[],await this.transport.close(),this.setState("closed")}connect(t,n,r){return this.transport.connect(t,n,r)}get state(){return this._state}setState(t){t!==this._state&&(this._state=t,this.onstatechange())}},cr=[y[y.permission_denied],y[y.invalid_argument],y[y.aborted],y[y.bad_route],y[y.malformed],y[y.not_found],y[y.unauthenticated]];function Rt(e){return e instanceof Error?e instanceof sr?!cr.includes(e.code):!0:!1}async function Hr(e){let t=e.token,n=new ir({baseUrl:e.baseUrl||ar,sendJson:!1,jsonOptions:{emitDefaultValues:!0,enumAsInteger:!0,ignoreUnknownFields:!0},interceptors:[{interceptUnary(c,p,u,m){return m.meta||(m.meta={}),m.meta.Authorization=`Bearer ${t}`,c(p,u,m)}}]}),r=new B(n),s=await M(async()=>await r.prepare({}),{baseDelay:50,maxDelay:1e3,maxRetries:5,isRecoverable:Rt});if(s===null)throw new Error("createPeer aborted");let i=[...e.iceServers||[]];for(let c of s.response.iceServers)i.push({urls:c.urls,username:c.username,credential:c.credential});let o=or(t),a={...e,iceServers:i,groupId:o.gid,peerId:o.pid};return new we(new Q("pulsebeam",void 0,ht),r,a,Rt)}I.disableLog(!1);I.disableWarnings(!1);console.log("UA: ",navigator.userAgent);console.log("webrtc-adapter is enabled",JSON.stringify({shim:I.browserShim,version:I.browserDetails},null,2));export{we as Peer,Hr as createPeer};
35
+ `);e.RTCSessionDescription&&s instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:s.type,sdp:i}):s.sdp=i}return n.apply(this,arguments)}}function E(e,t){if(!(e.RTCPeerConnection&&e.RTCPeerConnection.prototype))return;let n=e.RTCPeerConnection.prototype.addIceCandidate;!n||n.length===0||(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(t.browser==="chrome"&&t.version<78||t.browser==="firefox"&&t.version<68||t.browser==="safari")&&arguments[0]&&arguments[0].candidate===""?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function _(e,t){if(!(e.RTCPeerConnection&&e.RTCPeerConnection.prototype))return;let n=e.RTCPeerConnection.prototype.setLocalDescription;!n||n.length===0||(e.RTCPeerConnection.prototype.setLocalDescription=function(){let s=arguments[0]||{};if(typeof s!="object"||s.type&&s.sdp)return n.apply(this,arguments);if(s={type:s.type,sdp:s.sdp},!s.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":s.type="offer";break;default:s.type="answer";break}return s.sdp||s.type!=="offer"&&s.type!=="answer"?n.apply(this,[s]):(s.type==="offer"?this.createOffer:this.createAnswer).apply(this).then(o=>n.apply(this,[o]))})}var _t=et(ke());function lt({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){let n=O,r=ot(e),s={browserDetails:r,commonShim:Ee,extractVersion:b,disableLog:st,disableWarnings:it,sdp:_t};switch(r.browser){case"chrome":if(!j||!A||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),s;if(r.version===null)return n("Chrome shim can not determine version, not shimming."),s;n("adapter.js shimming chrome."),s.browserShim=j,E(e,r),_(e,r),L(e,r),re(e,r),A(e,r),ne(e,r),oe(e,r),se(e,r),ie(e,r),ae(e,r),P(e,r),G(e,r),z(e,r),x(e,r),k(e,r),K(e,r);break;case"firefox":if(!N||!F||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),s;n("adapter.js shimming firefox."),s.browserShim=N,E(e,r),_(e,r),U(e,r),F(e,r),ce(e,r),le(e,r),pe(e,r),de(e,r),ue(e,r),me(e,r),fe(e,r),he(e,r),ge(e,r),P(e,r),z(e,r),x(e,r),k(e,r);break;case"safari":if(!q||!t.shimSafari)return n("Safari shim is not included in this adapter release."),s;n("adapter.js shimming safari."),s.browserShim=q,E(e,r),_(e,r),ve(e,r),be(e,r),Se(e,r),Ce(e,r),ye(e,r),Te(e,r),Re(e,r),Pe(e,r),P(e,r),G(e,r),x(e,r),k(e,r),K(e,r);break;default:n("Unsupported browser!");break}return s}var It=lt({window:typeof window>"u"?void 0:window}),I=It;import{ServiceType as Mt}from"@protobuf-ts/runtime-rpc";import{MessageType as h}from"@protobuf-ts/runtime";var Xe=(i=>(i[i.UNSPECIFIED=0]="UNSPECIFIED",i[i.OFFER=1]="OFFER",i[i.ANSWER=2]="ANSWER",i[i.PRANSWER=3]="PRANSWER",i[i.ROLLBACK=4]="ROLLBACK",i))(Xe||{}),_e=class extends h{constructor(){super("pulsebeam.v1.PrepareReq",[])}},Dt=new _e,Ie=class extends h{constructor(){super("pulsebeam.v1.PrepareResp",[{no:1,name:"ice_servers",kind:"message",repeat:1,T:()=>Lt}])}},Ot=new Ie,Me=class extends h{constructor(){super("pulsebeam.v1.IceServer",[{no:1,name:"urls",kind:"scalar",repeat:2,T:9},{no:2,name:"username",kind:"scalar",opt:!0,T:9},{no:3,name:"credential",kind:"scalar",opt:!0,T:9}])}},Lt=new Me,De=class extends h{constructor(){super("pulsebeam.v1.SendReq",[{no:1,name:"msg",kind:"message",T:()=>ut}])}},At=new De,Oe=class extends h{constructor(){super("pulsebeam.v1.SendResp",[])}},jt=new Oe,Le=class extends h{constructor(){super("pulsebeam.v1.RecvReq",[{no:1,name:"src",kind:"message",T:()=>Ue}])}},Ut=new Le,Ae=class extends h{constructor(){super("pulsebeam.v1.RecvResp",[{no:1,name:"msg",kind:"message",T:()=>ut}])}},Ft=new Ae,je=class extends h{constructor(){super("pulsebeam.v1.PeerInfo",[{no:1,name:"group_id",kind:"scalar",T:9},{no:2,name:"peer_id",kind:"scalar",T:9},{no:3,name:"conn_id",kind:"scalar",T:13}])}},Ue=new je,Fe=class extends h{constructor(){super("pulsebeam.v1.Message",[{no:1,name:"header",kind:"message",T:()=>qt},{no:2,name:"payload",kind:"message",T:()=>Nt}])}},ut=new Fe,Ne=class extends h{constructor(){super("pulsebeam.v1.MessagePayload",[{no:1,name:"signal",kind:"message",oneof:"payloadType",T:()=>Gt},{no:2,name:"join",kind:"message",oneof:"payloadType",T:()=>Jt},{no:3,name:"bye",kind:"message",oneof:"payloadType",T:()=>Bt},{no:4,name:"ack",kind:"message",oneof:"payloadType",T:()=>Vt}])}},Nt=new Ne,qe=class extends h{constructor(){super("pulsebeam.v1.MessageHeader",[{no:1,name:"src",kind:"message",T:()=>Ue},{no:2,name:"dst",kind:"message",T:()=>Ue},{no:7,name:"seqnum",kind:"scalar",T:13},{no:8,name:"reliable",kind:"scalar",T:8}])}},qt=new qe,Ge=class extends h{constructor(){super("pulsebeam.v1.Signal",[{no:1,name:"generation_counter",kind:"scalar",T:13},{no:9,name:"sdp",kind:"message",oneof:"data",T:()=>zt},{no:10,name:"ice_candidate",kind:"message",oneof:"data",T:()=>Kt}])}},Gt=new Ge,ze=class extends h{constructor(){super("pulsebeam.v1.Sdp",[{no:1,name:"kind",kind:"enum",T:()=>["pulsebeam.v1.SdpKind",Xe,"SDP_KIND_"]},{no:2,name:"sdp",kind:"scalar",T:9}])}},zt=new ze,Ke=class extends h{constructor(){super("pulsebeam.v1.ICECandidate",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdp_m_line_index",kind:"scalar",opt:!0,T:13},{no:3,name:"sdp_mid",kind:"scalar",opt:!0,T:9},{no:4,name:"username",kind:"scalar",opt:!0,T:9},{no:5,name:"password",kind:"scalar",opt:!0,T:9}])}},Kt=new Ke,Je=class extends h{constructor(){super("pulsebeam.v1.Join",[])}},Jt=new Je,Be=class extends h{constructor(){super("pulsebeam.v1.Bye",[])}},Bt=new Be,Ve=class extends h{constructor(){super("pulsebeam.v1.Ack",[{no:1,name:"ack_ranges",kind:"message",repeat:1,T:()=>Ht}])}},Vt=new Ve,He=class extends h{constructor(){super("pulsebeam.v1.AckRange",[{no:1,name:"seqnum_start",kind:"scalar",T:13},{no:2,name:"seqnum_end",kind:"scalar",T:13}])}},Ht=new He,Ye=class extends h{constructor(){super("pulsebeam.v1.DataChannel",[{no:10,name:"heartbeat",kind:"message",oneof:"payload",T:()=>Yt}])}},Tr=new Ye,We=class extends h{constructor(){super("pulsebeam.v1.DataChannelHeartbeat",[])}},Yt=new We,J=new Mt("pulsebeam.v1.Signaling",[{name:"Prepare",options:{},I:Dt,O:Ot},{name:"Send",options:{},I:At,O:jt},{name:"Recv",serverStreaming:!0,options:{},I:Ut,O:Ft}]);import{stackIntercept as Qe}from"@protobuf-ts/runtime-rpc";var B=class{constructor(t){this._transport=t;this.typeName=J.typeName;this.methods=J.methods;this.options=J.options}prepare(t,n){let r=this.methods[0],s=this._transport.mergeOptions(n);return Qe("unary",this._transport,r,s,t)}send(t,n){let r=this.methods[1],s=this._transport.mergeOptions(n);return Qe("unary",this._transport,r,s,t)}recv(t,n){let r=this.methods[2],s=this._transport.mergeOptions(n);return Qe("serverStreaming",this._transport,r,s,t)}};function V(e,t){return new Promise(n=>{let r=setTimeout(()=>n(!0),e);t&&t.addEventListener("abort",()=>{clearTimeout(r),n(!1)})})}function H(...e){let t=new AbortController,n=()=>{t.abort();for(let r of e)r.removeEventListener("abort",n)};for(let r of e)r.addEventListener("abort",n);return t.signal}async function M(e,t){let{maxRetries:n,baseDelay:r,maxDelay:s,jitterFactor:i=.3,isRecoverable:o=()=>!0,abortSignal:a}=t,d=0;for(;(d<=n||n<0)&&!a?.aborted;)try{return await e()}catch(c){if(!o(c)||(d++,n>=0&&d>n))throw c;let p=Wt(d,r,s,i);await V(p,a).catch(()=>{})}if(a?.aborted)return null;throw new Error("Retry failed: max retries exceeded")}function Wt(e,t,n,r){let s=Math.min(t*2**(e-1),n),i=Math.random()*r*s;return s+i}var mt=9e5,ft=50,Y=1e3,Xt=5,Qt=1e4,Zt=1e3;var $t=V,wt=e=>Math.floor(Math.random()*(2**32-e))+e,er=e=>!0,Ze=class{constructor(t){this.onmsg=async t=>{};this.logger=t.sub("queue"),this.map=new Map,this.emitted=new Map,this.unreliable=[],this.processing=!1}enqueue(t){if(!t.header?.reliable)this.unreliable.push(t);else{let n=t.header.seqnum;if(this.map.has(n)||this.emitted.has(n))return;this.map.set(n,[performance.now(),t])}this.processNext()}async processNext(){if(this.processing)return;let t=this.unreliable.pop();if(!t){let n=this.map.entries().next().value;if(!n)return;let[r,s]=n;this.map.delete(r),this.emitted.set(r,s);let[i,o]=s;if(!o.header)return;t=o}this.processing=!0;try{await this.onmsg(t)}catch(n){let r={msg:t};n instanceof Error&&(r.err=n),this.logger.error("error processing message",r)}this.processing=!1,this.processNext()}},W=class{constructor(t,n){this.client=t;this.opts=n;this.onstream=t=>{};this.onclosed=t=>{};this.handleMessages=t=>{if(this.logger.debug("received",{msg:t}),this.abort.signal.aborted||!t.header)return;let n=t.header.src,r=t.header.dst;if(!n||!r)return;if(r.connId>=16&&r.connId!=this.info.connId){this.logger.warn("received messages from a stale connection, ignoring",{receivedConnID:r.connId});return}let s=null;for(let i of this.streams)if(n.groupId===i.other.groupId&&n.peerId===i.other.peerId&&n.connId===i.other.connId){s=i;break}if(!s){if(this.logger.debug(`session not found, creating one for ${n.peerId}:${n.connId}`),n.peerId==this.info.peerId){this.logger.warn("loopback detected, ignoring messages");return}s=new $e(this,this.info,n,this.logger),this.streams.push(s),this.onstream(s)}s.enqueue(t)};this.asleep=n.asleep||$t,this.randUint32=n.randUint32||wt,this.isRecoverable=n.isRecoverable||er,this.info={groupId:n.groupId,peerId:n.peerId,connId:this.randUint32(16)},this.abort=new AbortController,this.logger=n.logger.sub("transport",{info:this.info}),this.streams=[]}async listen(){await Promise.all([this.pollLoop(),this.gcLoop()])}async gcLoop(){for(;!this.abort.signal.aborted;)this.streams=this.streams.filter(t=>!t.isClosed()),await V(Zt,this.abort.signal);this.logger.debug("gc loop is closed")}async pollLoop(){let t={abort:this.abort.signal,timeout:mt},n={baseDelay:ft,maxDelay:Y,maxRetries:-1,abortSignal:this.abort.signal,isRecoverable:this.isRecoverable};for(;!this.abort.signal.aborted;)try{await M(async()=>{let r=this.client.recv({src:this.info},t);r.responses.onMessage(s=>!!s.msg&&this.handleMessages(s.msg)),await r},n)}catch(r){this.logger.error("unrecoverable error, force closing",{err:r}),this.close();return}this.logger.debug("poll loop is closed")}async close(t){this.abort.signal.aborted||(t=t||"transport is closed",await Promise.all(this.streams.map(n=>n.close(t))),this.abort.abort(t),this.logger.debug("transport is now closed",{reason:t}),this.streams=[],this.onclosed(t))}async connect(t,n,r){let s={payloadType:{oneofKind:"join",join:{}}},i={src:this.info,dst:{groupId:t,peerId:n,connId:0},seqnum:0,reliable:!1},o=!1,a=H(r,this.abort.signal);for(;!a.aborted&&!o;)await this.send(a,{header:i,payload:s}),await this.asleep(Y,a).catch(()=>{}),o=!!this.streams.find(d=>d.other.groupId===t&&d.other.peerId===n)}async send(t,n){let r=H(t,this.abort.signal),s={abort:r,timeout:mt},i={baseDelay:ft,maxDelay:Y,maxRetries:-1,abortSignal:r,isRecoverable:this.isRecoverable};try{if(await M(async()=>await this.client.send({msg:n},s),i)===null){this.logger.warn("aborted, message dropped from sending",{msg:n});return}return}catch(o){this.logger.error("unrecoverable error, force closing",{err:o}),this.close();return}}},$e=class{constructor(t,n,r,s){this.transport=t;this.info=n;this.other=r;this.onpayload=async t=>{};this.onclosed=t=>{};this.logger=s.sub("stream",{other:r}),this.abort=new AbortController,this.ackedbuf={},this.recvq=new Ze(this.logger),this.recvq.onmsg=i=>this.handleMessage(i),this.lastSeqnum=0,this.closedAt=0}createSignal(...t){return H(this.abort.signal,...t)}isClosed(){let t=this.abort.signal.aborted&&performance.now()-this.closedAt>Qt;return t&&this.logger.debug("stream is ready for GC"),t}enqueue(t){if(this.abort.signal.aborted){this.logger.warn("received a message in closed state, ignoring new messages.");return}this.recvq.enqueue(t)}async send(t,n,r){r||(r=this.abort.signal);let s={header:{src:this.transport.info,dst:this.other,seqnum:0,reliable:n},payload:{...t}};if(!n){await this.transport.send(r,s);return}this.lastSeqnum++,s.header.seqnum=this.lastSeqnum,this.ackedbuf[s.header.seqnum]=!1;let i=Xt,o=i,a=s.header.seqnum;for(;!r.aborted&&(await this.transport.send(this.abort.signal,s),await this.transport.asleep(5*Y,this.abort.signal).catch(()=>{}),!this.ackedbuf[a]);){if(o<=0){let d="reached the maximum resend limit, dropping message";throw this.logger.warn(d,{seqnum:a,resendLimit:i,reliable:n}),new Error(d)}o--,this.logger.debug("resending",{...s.header})}}async handleMessage(t){let n=t.payload.payloadType;switch(n.oneofKind){case"ack":this.handleAck(n.ack);break;case"bye":this.close("received bye from other peer");break;case void 0:break;default:{if(t.header.reliable){let s={payloadType:{oneofKind:"ack",ack:{ackRanges:[{seqnumStart:t.header.seqnum,seqnumEnd:t.header.seqnum+1}]}}};this.logger.debug("ack",{seqnum:t.header.seqnum}),this.send(s,!1)}if(!t.payload)return;await this.onpayload(t.payload);break}}}handleAck(t){for(let n of t.ackRanges)for(let r=n.seqnumStart;r<n.seqnumEnd;r++)this.logger.debug("received ack",{seqnum:r}),this.ackedbuf[r]=!0}async close(t){this.abort.signal.aborted||(t=t||"session is closed",await this.send({payloadType:{oneofKind:"bye",bye:{}}},!1).catch(n=>this.logger.warn("failed to send bye",{e:n})),this.abort.abort(t),this.closedAt=performance.now(),this.onclosed(t),this.logger.debug("sent bye to the other peer",{reason:t}))}};var tr={DEBUG:console.debug,INFO:console.info,WARN:console.warn,ERROR:console.error},ht={DEBUG:e=>console.debug(X(e)),INFO:e=>console.info(X(e)),WARN:e=>console.warn(X(e)),ERROR:e=>console.error(X(e))};function gt(e,t,n="root",r=new Set){let s=".";if(!r.has(e)){r.add(e);for(let i in e)if(typeof e[i]=="object"&&e[i]!==null){let o=n+s+i;gt(e[i],t,o,r)}else{let o=t[n]||[];o.push(`${i}=${e[i]}`),t[n]=o}}}function X(e){let t={};gt(e,t);let n=[];for(let r in t)n.push(`[${r}] ${t[r].join(" ")}`);return n.join(`
36
+ `)}var Q=class e{constructor(t,n,r){this.name=t;n||(n={}),r||(r=tr),this.sink=r,this.obj={...n,name:t}}log(t,n,r){let s=r||{};t({ts:Date.now(),message:n,...this.obj,...s})}debug(t,n){this.log(this.sink.DEBUG,t,n)}info(t,n){this.log(this.sink.INFO,t,n)}warn(t,n){this.log(this.sink.WARN,t,n)}error(t,n){this.log(this.sink.ERROR,t,n)}sub(t,n){return n||(n={}),new e(this.name+"."+t,{...this.obj,...n},this.sink)}};var rr=2,Ct=5e3;function yt(e){return{candidate:e.candidate,sdpMid:e.sdpMid,sdpMLineIndex:e.sdpMLineIndex,usernameFragment:e.password}}function nr(e){switch(e){case 1:return"offer";case 2:return"answer";case 3:return"pranswer";case 4:return"rollback";default:throw new Error(`unexpected kind: ${e}`)}}function St(e){switch(e){case"offer":return 1;case"answer":return 2;case"pranswer":return 3;case"rollback":return 4;default:throw new Error(`unexpected sdp type: ${e}`)}}var Z=class{constructor(t,n){this.stream=t;this.ondatachannel=()=>{};this.onconnectionstatechange=()=>{};this.ontrack=()=>{};this.triggerIceRestart=()=>{if(!this.impolite)return;let t=performance.now()-this.lastIceRestart;if(t<Ct){let n=Ct-t,r=window.setTimeout(()=>{this.triggerIceRestart(),this.timers=this.timers.filter(s=>s===r)},n);return}this.pc.connectionState!=="connected"&&(this.iceRestartCount>=rr&&this.close(),this.logger.debug("triggered ICE restart"),this.pc.restartIce(),this.generationCounter++,this.iceRestartCount++,this.lastIceRestart=performance.now())};this.sendSignal=t=>{this.stream.send({payloadType:{oneofKind:"signal",signal:{...t,generationCounter:this.generationCounter}}},!0)};this.handleMessage=async t=>{if(this.abort.signal.aborted){this.logger.warn("session is closed, ignoring message");return}switch(t.payloadType.oneofKind){case"signal":await this.handleSignal(t.payloadType.signal);break;case"bye":this.close();break;case"join":break}};this.handleSignal=async t=>{if(t.generationCounter<this.generationCounter){this.logger.warn("detected staled generationCounter signals, ignoring");return}let n=t.data;if(t.generationCounter>this.generationCounter){if(this.logger.debug("detected new generationCounter",{otherGenerationCounter:t.generationCounter,generationCounter:this.generationCounter,msg:n}),n.oneofKind==="iceCandidate"){let o=yt(n.iceCandidate);this.pendingCandidates.push(o),this.logger.warn("expecting an offer but got ice candidates during an ICE restart, adding to pending.",{ice:o,msg:n});return}this.generationCounter=t.generationCounter}if(n.oneofKind==="iceCandidate"){let o=yt(n.iceCandidate);this.pendingCandidates.push(o),this.checkPendingCandidates();return}if(n.oneofKind!="sdp")return;let r=n.sdp;this.logger.debug("received a SDP signal",{sdpKind:r.kind});let s=r.kind===1&&(this.makingOffer||this.pc.signalingState!=="stable");if(this.impolite&&s){this.logger.debug("ignored offer");return}if(this.logger.debug("creating an answer"),await this.pc.setRemoteDescription({type:nr(r.kind),sdp:r.sdp}),r.kind===1){if(await this.pc.setLocalDescription(),!this.pc.localDescription){this.logger.error("unexpected null local description");return}this.sendSignal({data:{oneofKind:"sdp",sdp:{kind:St(this.pc.localDescription.type),sdp:this.pc.localDescription.sdp}}})}this.checkPendingCandidates()};this.checkPendingCandidates=()=>{if(!["stable","have-local-offer","have-remote-offer"].includes(this.pc.signalingState)||!this.pc.remoteDescription){this.logger.debug("wait for adding pending candidates",{signalingState:this.pc.signalingState,iceConnectionState:this.pc.iceConnectionState,connectionState:this.pc.connectionState,remoteDescription:this.pc.remoteDescription,pendingCandidates:this.pendingCandidates.length});return}for(let n of this.pendingCandidates)!n.candidate||n.candidate===""||(this.pc.addIceCandidate(n).catch(r=>{this.logger.warn("failed to add candidate, skipping.",{candidate:n,e:r})}),this.logger.debug(`added ice: ${n.candidate}`));this.pendingCandidates=[]};this.pc=new RTCPeerConnection(n),this.makingOffer=!1,this.pendingCandidates=[],this.stream.info.connId===this.stream.other.connId?this.impolite=this.stream.info.peerId>this.stream.other.peerId:this.impolite=this.stream.info.connId>this.stream.other.connId,this.abort=new AbortController,this.logger=t.logger.sub("session",{role:this.impolite?"impolite":"polite"}),this.generationCounter=0,this.iceRestartCount=0,this.lastIceRestart=0,this.timers=[],this._connectionState="new",t.onpayload=i=>this.handleMessage(i),t.onclosed=i=>this.close(i),this.pc.oniceconnectionstatechange=async()=>{let i=await this.pc.getStats(),o=[],a=[],d=[];i.forEach(c=>{c.type==="candidate-pair"?o.push(c):c.type==="local-candidate"?a.push(c):c.type==="remote-candidate"&&d.push(c)}),this.logger.debug("iceconnectionstate changed",{connectionstate:this.pc.connectionState,iceconnectionstate:this.pc.iceConnectionState,local:a,remote:d,pair:o,pending:this.pendingCandidates})};let r=performance.now();this.pc.onconnectionstatechange=i=>{switch(this.logger.debug("connectionstate changed",{connectionstate:this.pc.connectionState,iceconnectionstate:this.pc.iceConnectionState}),this.setConnectionState(this.pc.connectionState,i),this.pc.connectionState){case"connecting":r=performance.now();break;case"connected":{let o=performance.now()-r;this.logger.debug(`it took ${o}ms to connect`),this.iceRestartCount=0;break}case"disconnected":this.triggerIceRestart();break;case"failed":this.close("detected sustained network failure");break;case"closed":break}};let s=!0;this.pc.onnegotiationneeded=async()=>{if(s){if(!this.impolite){this.stream.send({payloadType:{oneofKind:"join",join:{}}},!0);return}s=!1}try{if(this.makingOffer=!0,this.logger.debug("creating an offer"),await this.pc.setLocalDescription(),!this.pc.localDescription)throw new Error("expect localDescription to be not empty");this.sendSignal({data:{oneofKind:"sdp",sdp:{kind:St(this.pc.localDescription.type),sdp:this.pc.localDescription.sdp}}})}catch(i){i instanceof Error&&this.logger.error("failed in negotiating",{err:i})}finally{this.makingOffer=!1}},this.pc.onicecandidate=({candidate:i})=>{this.logger.debug("onicecandidate",{candidate:i});let o={candidate:"",sdpMLineIndex:0,sdpMid:""};if(!i||i.candidate===""){this.logger.debug("ice gathering is finished");return}o.candidate=i.candidate,o.sdpMLineIndex=i.sdpMLineIndex??void 0,o.sdpMid=i.sdpMid??void 0,o.username=i.usernameFragment??void 0,this.sendSignal({data:{oneofKind:"iceCandidate",iceCandidate:o}})},this.pc.ondatachannel=(...i)=>{this.ondatachannel&&this.ondatachannel(...i)},this.pc.ontrack=(...i)=>{this.ontrack&&this.ontrack(...i)}}addTrack(...t){return this.pc.addTrack(...t)}removeTrack(...t){return this.pc.removeTrack(...t)}createDataChannel(...t){return this.pc.createDataChannel(...t)}get connectionState(){return this.pc.connectionState}get closeReason(){return this._closeReason}get other(){return{groupId:this.stream.other.groupId,peerId:this.stream.other.peerId,connId:this.stream.other.connId}}close(t){if(this.abort.signal.aborted)return;this.abort.abort(t);for(let r of this.timers)clearTimeout(r);this.timers=[],this.stream.close(),this._closeReason=t,this.pc.close();let n=new Event("connectionstatechange");this.setConnectionState("closed",n),this.logger.debug("session closed",{connectionState:this.connectionState})}setConnectionState(t,n){t!==this._connectionState&&this.onconnectionstatechange&&this.onconnectionstatechange(n)}};import{RpcError as sr}from"@protobuf-ts/runtime-rpc";import{GrpcStatusCode as S,GrpcWebFetchTransport as ir}from"@protobuf-ts/grpcweb-transport";import{jwtDecode as or}from"jwt-decode";var ar="https://cloud.pulsebeam.dev/grpc";var we=class{constructor(t,n,r,s){this.onsession=t=>{};this.onstatechange=()=>{};this.peerId=r.peerId,this.logger=t.sub("peer",{peerId:this.peerId}),this.sessions=[],this._state="new";let i={bundlePolicy:"balanced",iceTransportPolicy:r.forceRelay?"relay":"all",iceCandidatePoolSize:0,iceServers:r.iceServers};this.transport=new W(n,{enableDiscovery:!1,groupId:r.groupId,peerId:r.peerId,logger:this.logger,isRecoverable:s}),this.transport.onstream=o=>{let a=new Z(o,i);this.sessions.push(a),this.onsession(a)},this.transport.onclosed=()=>{this.close()}}start(){if(this._state==="closed")throw new Error("peer is already closed");this.transport.listen()}async close(){this.sessions=[],await this.transport.close(),this.setState("closed")}connect(t,n,r){return this.transport.connect(t,n,r)}get state(){return this._state}setState(t){t!==this._state&&(this._state=t,this.onstatechange())}},cr=[S[S.PERMISSION_DENIED],S[S.INVALID_ARGUMENT],S[S.ABORTED],S[S.NOT_FOUND],S[S.UNAUTHENTICATED]];function Rt(e){return e instanceof Error?e instanceof sr?!cr.includes(e.code):!0:!1}async function Hr(e){let t=e.token,n=new ir({baseUrl:e.baseUrl||ar,sendJson:!1,format:"binary",jsonOptions:{emitDefaultValues:!0,enumAsInteger:!0,ignoreUnknownFields:!0},interceptors:[{interceptUnary(c,p,u,m){return m.meta||(m.meta={}),m.meta.Authorization=`Bearer ${t}`,c(p,u,m)}}]}),r=new B(n),s=await M(async()=>await r.prepare({}),{baseDelay:50,maxDelay:1e3,maxRetries:5,isRecoverable:Rt});if(s===null)throw new Error("createPeer aborted");let i=[...e.iceServers||[]];for(let c of s.response.iceServers)i.push({urls:c.urls,username:c.username,credential:c.credential});let o=or(t),a={...e,iceServers:i,groupId:o.gid,peerId:o.pid};return new we(new Q("pulsebeam",void 0,ht),r,a,Rt)}I.disableLog(!1);I.disableWarnings(!1);console.log("UA: ",navigator.userAgent);console.log("webrtc-adapter is enabled",JSON.stringify({shim:I.browserShim,version:I.browserDetails},null,2));export{we as Peer,Hr as createPeer};
37
37
  //# sourceMappingURL=index.js.map