@pulsebeam/peer 0.0.17 → 0.0.19
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/README.md +4 -0
- package/dist/index.cjs +17 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -9
- package/dist/index.d.ts +27 -9
- package/dist/index.js +17 -17
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
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:
|
133
|
+
* @generated from protobuf field: pulsebeam.v1.Message msg = 1;
|
134
134
|
*/
|
135
|
-
|
135
|
+
msg?: Message;
|
136
136
|
}
|
137
137
|
/**
|
138
138
|
* @generated MessageType for protobuf message pulsebeam.v1.RecvResp
|
@@ -228,6 +228,12 @@ interface MessagePayload {
|
|
228
228
|
* @generated from protobuf field: pulsebeam.v1.Ack ack = 4;
|
229
229
|
*/
|
230
230
|
ack: Ack;
|
231
|
+
} | {
|
232
|
+
oneofKind: "ping";
|
233
|
+
/**
|
234
|
+
* @generated from protobuf field: pulsebeam.v1.Ping ping = 5;
|
235
|
+
*/
|
236
|
+
ping: Ping;
|
231
237
|
} | {
|
232
238
|
oneofKind: undefined;
|
233
239
|
};
|
@@ -390,6 +396,18 @@ interface Ack {
|
|
390
396
|
* @generated MessageType for protobuf message pulsebeam.v1.Ack
|
391
397
|
*/
|
392
398
|
declare const Ack: Ack$Type;
|
399
|
+
declare class Ping$Type extends MessageType<Ping> {
|
400
|
+
constructor();
|
401
|
+
}
|
402
|
+
/**
|
403
|
+
* @generated from protobuf message pulsebeam.v1.Ping
|
404
|
+
*/
|
405
|
+
interface Ping {
|
406
|
+
}
|
407
|
+
/**
|
408
|
+
* @generated MessageType for protobuf message pulsebeam.v1.Ping
|
409
|
+
*/
|
410
|
+
declare const Ping: Ping$Type;
|
393
411
|
declare class AckRange$Type extends MessageType<AckRange> {
|
394
412
|
constructor();
|
395
413
|
}
|
@@ -412,9 +430,9 @@ interface AckRange {
|
|
412
430
|
declare const AckRange: AckRange$Type;
|
413
431
|
|
414
432
|
/**
|
415
|
-
* @generated from protobuf service pulsebeam.v1.
|
433
|
+
* @generated from protobuf service pulsebeam.v1.Signaling
|
416
434
|
*/
|
417
|
-
interface
|
435
|
+
interface ISignalingClient {
|
418
436
|
/**
|
419
437
|
* @generated from protobuf rpc: Prepare(pulsebeam.v1.PrepareReq) returns (pulsebeam.v1.PrepareResp);
|
420
438
|
*/
|
@@ -424,9 +442,9 @@ interface ITunnelClient {
|
|
424
442
|
*/
|
425
443
|
send(input: SendReq, options?: RpcOptions): UnaryCall<SendReq, SendResp>;
|
426
444
|
/**
|
427
|
-
* @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (pulsebeam.v1.RecvResp);
|
445
|
+
* @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (stream pulsebeam.v1.RecvResp);
|
428
446
|
*/
|
429
|
-
recv(input: RecvReq, options?: RpcOptions):
|
447
|
+
recv(input: RecvReq, options?: RpcOptions): ServerStreamingCall<RecvReq, RecvResp>;
|
430
448
|
}
|
431
449
|
|
432
450
|
type LogObj = Record<string, unknown>;
|
@@ -456,7 +474,7 @@ declare class Logger {
|
|
456
474
|
* access to underlying media tracks, data channels, and connection state.
|
457
475
|
*
|
458
476
|
* Usage:
|
459
|
-
* @example `peer.onsession = (session) => {console.log(session.
|
477
|
+
* @example `peer.onsession = (session) => {console.log(session.other.peerId)};`
|
460
478
|
*/
|
461
479
|
interface ISession {
|
462
480
|
/**
|
@@ -609,7 +627,7 @@ declare class Peer {
|
|
609
627
|
* @param opts Configuration options for the peer.
|
610
628
|
* @param isRecoverable Function to determine if an error is recoverable.
|
611
629
|
*/
|
612
|
-
constructor(logger: Logger, client:
|
630
|
+
constructor(logger: Logger, client: ISignalingClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
|
613
631
|
/**
|
614
632
|
* Starts the peer, making it ready to establish connections.
|
615
633
|
* 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:
|
133
|
+
* @generated from protobuf field: pulsebeam.v1.Message msg = 1;
|
134
134
|
*/
|
135
|
-
|
135
|
+
msg?: Message;
|
136
136
|
}
|
137
137
|
/**
|
138
138
|
* @generated MessageType for protobuf message pulsebeam.v1.RecvResp
|
@@ -228,6 +228,12 @@ interface MessagePayload {
|
|
228
228
|
* @generated from protobuf field: pulsebeam.v1.Ack ack = 4;
|
229
229
|
*/
|
230
230
|
ack: Ack;
|
231
|
+
} | {
|
232
|
+
oneofKind: "ping";
|
233
|
+
/**
|
234
|
+
* @generated from protobuf field: pulsebeam.v1.Ping ping = 5;
|
235
|
+
*/
|
236
|
+
ping: Ping;
|
231
237
|
} | {
|
232
238
|
oneofKind: undefined;
|
233
239
|
};
|
@@ -390,6 +396,18 @@ interface Ack {
|
|
390
396
|
* @generated MessageType for protobuf message pulsebeam.v1.Ack
|
391
397
|
*/
|
392
398
|
declare const Ack: Ack$Type;
|
399
|
+
declare class Ping$Type extends MessageType<Ping> {
|
400
|
+
constructor();
|
401
|
+
}
|
402
|
+
/**
|
403
|
+
* @generated from protobuf message pulsebeam.v1.Ping
|
404
|
+
*/
|
405
|
+
interface Ping {
|
406
|
+
}
|
407
|
+
/**
|
408
|
+
* @generated MessageType for protobuf message pulsebeam.v1.Ping
|
409
|
+
*/
|
410
|
+
declare const Ping: Ping$Type;
|
393
411
|
declare class AckRange$Type extends MessageType<AckRange> {
|
394
412
|
constructor();
|
395
413
|
}
|
@@ -412,9 +430,9 @@ interface AckRange {
|
|
412
430
|
declare const AckRange: AckRange$Type;
|
413
431
|
|
414
432
|
/**
|
415
|
-
* @generated from protobuf service pulsebeam.v1.
|
433
|
+
* @generated from protobuf service pulsebeam.v1.Signaling
|
416
434
|
*/
|
417
|
-
interface
|
435
|
+
interface ISignalingClient {
|
418
436
|
/**
|
419
437
|
* @generated from protobuf rpc: Prepare(pulsebeam.v1.PrepareReq) returns (pulsebeam.v1.PrepareResp);
|
420
438
|
*/
|
@@ -424,9 +442,9 @@ interface ITunnelClient {
|
|
424
442
|
*/
|
425
443
|
send(input: SendReq, options?: RpcOptions): UnaryCall<SendReq, SendResp>;
|
426
444
|
/**
|
427
|
-
* @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (pulsebeam.v1.RecvResp);
|
445
|
+
* @generated from protobuf rpc: Recv(pulsebeam.v1.RecvReq) returns (stream pulsebeam.v1.RecvResp);
|
428
446
|
*/
|
429
|
-
recv(input: RecvReq, options?: RpcOptions):
|
447
|
+
recv(input: RecvReq, options?: RpcOptions): ServerStreamingCall<RecvReq, RecvResp>;
|
430
448
|
}
|
431
449
|
|
432
450
|
type LogObj = Record<string, unknown>;
|
@@ -456,7 +474,7 @@ declare class Logger {
|
|
456
474
|
* access to underlying media tracks, data channels, and connection state.
|
457
475
|
*
|
458
476
|
* Usage:
|
459
|
-
* @example `peer.onsession = (session) => {console.log(session.
|
477
|
+
* @example `peer.onsession = (session) => {console.log(session.other.peerId)};`
|
460
478
|
*/
|
461
479
|
interface ISession {
|
462
480
|
/**
|
@@ -609,7 +627,7 @@ declare class Peer {
|
|
609
627
|
* @param opts Configuration options for the peer.
|
610
628
|
* @param isRecoverable Function to determine if an error is recoverable.
|
611
629
|
*/
|
612
|
-
constructor(logger: Logger, client:
|
630
|
+
constructor(logger: Logger, client: ISignalingClient, opts: PeerOptionsFull, isRecoverable: (_err: unknown) => boolean);
|
613
631
|
/**
|
614
632
|
* Starts the peer, making it ready to establish connections.
|
615
633
|
* Peers must be started before a connection can occur.
|
package/dist/index.js
CHANGED
@@ -1,37 +1,37 @@
|
|
1
|
-
var
|
2
|
-
`).map(t=>t.trim())};
|
1
|
+
var Tt=Object.create;var Z=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var xt=Object.getPrototypeOf,kt=Object.prototype.hasOwnProperty;var _t=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),D=(e,t)=>{for(var n in t)Z(e,n,{get:t[n],enumerable:!0})},Et=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Pt(t))!kt.call(e,s)&&s!==n&&Z(e,s,{get:()=>t[s],enumerable:!(r=bt(t,s))||r.enumerable});return e};var tt=(e,t,n)=>(n=e!=null?Tt(xt(e)):{},Et(t||!e||!e.__esModule?Z(n,"default",{value:e,enumerable:!0}):n,e));var xe=_t((Cr,Pe)=>{"use strict";var d={};d.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)};d.localCName=d.generateIdentifier();d.splitLines=function(e){return e.trim().split(`
|
2
|
+
`).map(t=>t.trim())};d.splitSections=function(e){return e.split(`
|
3
3
|
m=`).map((n,r)=>(r>0?"m="+n:n).trim()+`\r
|
4
|
-
`)};
|
5
|
-
`};
|
6
|
-
`};
|
7
|
-
`}return t};
|
8
|
-
`}),t};
|
4
|
+
`)};d.getDescription=function(e){let t=d.splitSections(e);return t&&t[0]};d.getMediaSections=function(e){let t=d.splitSections(e);return t.shift(),t};d.matchPrefix=function(e,t){return d.splitLines(e).filter(n=>n.indexOf(t)===0)};d.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};d.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(" ")};d.parseIceOptions=function(e){return e.substring(14).split(" ")};d.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};d.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
|
5
|
+
`};d.parseExtmap=function(e){let t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}};d.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&e.direction!=="sendrecv"?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+`\r
|
6
|
+
`};d.parseFmtp=function(e){let t={},n,r=e.substring(e.indexOf(" ")+1).split(";");for(let s=0;s<r.length;s++)n=r[s].trim().split("="),t[n[0].trim()]=n[1];return t};d.writeFmtp=function(e){let t="",n=e.payloadType;if(e.preferredPayloadType!==void 0&&(n=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){let r=[];Object.keys(e.parameters).forEach(s=>{e.parameters[s]!==void 0?r.push(s+"="+e.parameters[s]):r.push(s)}),t+="a=fmtp:"+n+" "+r.join(";")+`\r
|
7
|
+
`}return t};d.parseRtcpFb=function(e){let t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}};d.writeRtcpFb=function(e){let t="",n=e.payloadType;return e.preferredPayloadType!==void 0&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach(r=>{t+="a=rtcp-fb:"+n+" "+r.type+(r.parameter&&r.parameter.length?" "+r.parameter:"")+`\r
|
8
|
+
`}),t};d.parseSsrcMedia=function(e){let t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n};d.parseSsrcGroup=function(e){let t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map(n=>parseInt(n,10))}};d.getMid=function(e){let t=d.matchPrefix(e,"a=mid:")[0];if(t)return t.substring(6)};d.parseFingerprint=function(e){let t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}};d.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:d.matchPrefix(e+t,"a=fingerprint:").map(d.parseFingerprint)}};d.writeDtlsParameters=function(e,t){let n="a=setup:"+t+`\r
|
9
9
|
`;return e.fingerprints.forEach(r=>{n+="a=fingerprint:"+r.algorithm+" "+r.value+`\r
|
10
|
-
`}),n};
|
11
|
-
`};
|
10
|
+
`}),n};d.parseCryptoLine=function(e){let t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}};d.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+(typeof e.keyParams=="object"?d.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+`\r
|
11
|
+
`};d.parseCryptoKeyParams=function(e){if(e.indexOf("inline:")!==0)return null;let t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}};d.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")};d.getCryptoParameters=function(e,t){return d.matchPrefix(e+t,"a=crypto:").map(d.parseCryptoLine)};d.getIceParameters=function(e,t){let n=d.matchPrefix(e+t,"a=ice-ufrag:")[0],r=d.matchPrefix(e+t,"a=ice-pwd:")[0];return n&&r?{usernameFragment:n.substring(12),password:r.substring(10)}:null};d.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+`\r
|
12
12
|
a=ice-pwd:`+e.password+`\r
|
13
13
|
`;return e.iceLite&&(t+=`a=ice-lite\r
|
14
|
-
`),t};
|
14
|
+
`),t};d.parseRtpParameters=function(e){let t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=d.splitLines(e)[0].split(" ");t.profile=r[2];for(let i=3;i<r.length;i++){let o=r[i],a=d.matchPrefix(e,"a=rtpmap:"+o+" ")[0];if(a){let l=d.parseRtpMap(a),c=d.matchPrefix(e,"a=fmtp:"+o+" ");switch(l.parameters=c.length?d.parseFmtp(c[0]):{},l.rtcpFeedback=d.matchPrefix(e,"a=rtcp-fb:"+o+" ").map(d.parseRtcpFb),t.codecs.push(l),l.name.toUpperCase()){case"RED":case"ULPFEC":t.fecMechanisms.push(l.name.toUpperCase());break;default:break}}}d.matchPrefix(e,"a=extmap:").forEach(i=>{t.headerExtensions.push(d.parseExtmap(i))});let s=d.matchPrefix(e,"a=rtcp-fb:* ").map(d.parseRtcpFb);return t.codecs.forEach(i=>{s.forEach(o=>{i.rtcpFeedback.find(l=>l.type===o.type&&l.parameter===o.parameter)||i.rtcpFeedback.push(o)})}),t};d.writeRtpDescription=function(e,t){let n="";n+="m="+e+" ",n+=t.codecs.length>0?"9":"0",n+=" "+(t.profile||"UDP/TLS/RTP/SAVPF")+" ",n+=t.codecs.map(s=>s.preferredPayloadType!==void 0?s.preferredPayloadType:s.payloadType).join(" ")+`\r
|
15
15
|
`,n+=`c=IN IP4 0.0.0.0\r
|
16
16
|
`,n+=`a=rtcp:9 IN IP4 0.0.0.0\r
|
17
|
-
`,t.codecs.forEach(s=>{n+=
|
18
|
-
`),t.headerExtensions&&t.headerExtensions.forEach(s=>{n+=
|
17
|
+
`,t.codecs.forEach(s=>{n+=d.writeRtpMap(s),n+=d.writeFmtp(s),n+=d.writeRtcpFb(s)});let r=0;return t.codecs.forEach(s=>{s.maxptime>r&&(r=s.maxptime)}),r>0&&(n+="a=maxptime:"+r+`\r
|
18
|
+
`),t.headerExtensions&&t.headerExtensions.forEach(s=>{n+=d.writeExtmap(s)}),n};d.parseRtpEncodingParameters=function(e){let t=[],n=d.parseRtpParameters(e),r=n.fecMechanisms.indexOf("RED")!==-1,s=n.fecMechanisms.indexOf("ULPFEC")!==-1,i=d.matchPrefix(e,"a=ssrc:").map(p=>d.parseSsrcMedia(p)).filter(p=>p.attribute==="cname"),o=i.length>0&&i[0].ssrc,a,l=d.matchPrefix(e,"a=ssrc-group:FID").map(p=>p.substring(17).split(" ").map(m=>parseInt(m,10)));l.length>0&&l[0].length>1&&l[0][0]===o&&(a=l[0][1]),n.codecs.forEach(p=>{if(p.name.toUpperCase()==="RTX"&&p.parameters.apt){let u={ssrc:o,codecPayloadType:parseInt(p.parameters.apt,10)};o&&a&&(u.rtx={ssrc:a}),t.push(u),r&&(u=JSON.parse(JSON.stringify(u)),u.fec={ssrc:o,mechanism:s?"red+ulpfec":"red"},t.push(u))}}),t.length===0&&o&&t.push({ssrc:o});let c=d.matchPrefix(e,"b=");return c.length&&(c[0].indexOf("b=TIAS:")===0?c=parseInt(c[0].substring(7),10):c[0].indexOf("b=AS:")===0?c=parseInt(c[0].substring(5),10)*1e3*.95-50*40*8:c=void 0,t.forEach(p=>{p.maxBitrate=c})),t};d.parseRtcpParameters=function(e){let t={},n=d.matchPrefix(e,"a=ssrc:").map(i=>d.parseSsrcMedia(i)).filter(i=>i.attribute==="cname")[0];n&&(t.cname=n.value,t.ssrc=n.ssrc);let r=d.matchPrefix(e,"a=rtcp-rsize");t.reducedSize=r.length>0,t.compound=r.length===0;let s=d.matchPrefix(e,"a=rtcp-mux");return t.mux=s.length>0,t};d.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+=`a=rtcp-rsize\r
|
19
19
|
`),e.mux&&(t+=`a=rtcp-mux\r
|
20
20
|
`),e.ssrc!==void 0&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+`\r
|
21
|
-
`),t};
|
21
|
+
`),t};d.parseMsid=function(e){let t,n=d.matchPrefix(e,"a=msid:");if(n.length===1)return t=n[0].substring(7).split(" "),{stream:t[0],track:t[1]};let r=d.matchPrefix(e,"a=ssrc:").map(s=>d.parseSsrcMedia(s)).filter(s=>s.attribute==="msid");if(r.length>0)return t=r[0].value.split(" "),{stream:t[0],track:t[1]}};d.parseSctpDescription=function(e){let t=d.parseMLine(e),n=d.matchPrefix(e,"a=max-message-size:"),r;n.length>0&&(r=parseInt(n[0].substring(19),10)),isNaN(r)&&(r=65536);let s=d.matchPrefix(e,"a=sctp-port:");if(s.length>0)return{port:parseInt(s[0].substring(12),10),protocol:t.fmt,maxMessageSize:r};let i=d.matchPrefix(e,"a=sctpmap:");if(i.length>0){let o=i[0].substring(10).split(" ");return{port:parseInt(o[0],10),protocol:o[1],maxMessageSize:r}}};d.writeSctpDescription=function(e,t){let n=[];return e.protocol!=="DTLS/SCTP"?n=["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+`\r
|
22
22
|
`,`c=IN IP4 0.0.0.0\r
|
23
23
|
`,"a=sctp-port:"+t.port+`\r
|
24
24
|
`]:n=["m="+e.kind+" 9 "+e.protocol+" "+t.port+`\r
|
25
25
|
`,`c=IN IP4 0.0.0.0\r
|
26
26
|
`,"a=sctpmap:"+t.port+" "+t.protocol+` 65535\r
|
27
27
|
`],t.maxMessageSize!==void 0&&n.push("a=max-message-size:"+t.maxMessageSize+`\r
|
28
|
-
`),n.join("")};
|
28
|
+
`),n.join("")};d.generateSessionId=function(){return Math.random().toString().substr(2,22)};d.writeSessionBoilerplate=function(e,t,n){let r,s=t!==void 0?t:2;return e?r=e:r=d.generateSessionId(),`v=0\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
|
+
`};d.getDirection=function(e,t){let n=d.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?d.getDirection(t):"sendrecv"};d.getKind=function(e){return d.splitLines(e)[0].split(" ")[0].substring(2)};d.isRejected=function(e){return e.split(" ",2)[1]==="0"};d.parseMLine=function(e){let n=d.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}};d.parseOLine=function(e){let n=d.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]}};d.isValidSDP=function(e){if(typeof e!="string"||e.length===0)return!1;let t=d.splitLines(e);for(let n=0;n<t.length;n++)if(t[n].length<2||t[n].charAt(1)!=="=")return!1;return!0};typeof Pe=="object"&&(Pe.exports=d)});var nt=!0,st=!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 l=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,l),s.apply(this,[o,l])};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 l=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,l])},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 it(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(nt=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function ot(e){return typeof e!="boolean"?new Error("Argument type: "+typeof e+". Please use a boolean."):(st=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function O(){if(typeof window=="object"){if(nt)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function v(e,t){st&&console.warn(e+" is deprecated, please use "+t+" instead.")}function at(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 rt(e){return Object.prototype.toString.call(e)==="[object Object]"}function w(e){return rt(e)?Object.keys(e).reduce(function(t,n){let r=rt(e[n]),s=r?w(e[n]):e[n],i=r&&!Object.keys(s).length;return s===void 0||i?t:Object.assign(t,{[n]:s})},{}):e}function $(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach(r=>{r.endsWith("Id")?$(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach(s=>{$(e,e.get(s),n)})}))}function ee(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&&$(e,a,s)})}),s}var j={};D(j,{fixNegotiationNeeded:()=>oe,shimAddTrackRemoveTrack:()=>ie,shimAddTrackRemoveTrackWithNative:()=>pt,shimGetSendersWithDtmf:()=>ne,shimGetUserMedia:()=>L,shimMediaStream:()=>te,shimOnTrack:()=>re,shimPeerConnection:()=>A,shimSenderReceiverGetStats:()=>se});var ct=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 l={};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){l.optional=l.optional||[];let m={};typeof p.ideal=="number"?(m[u("min",c)]=p.ideal,l.optional.push(m),m={},m[u("max",c)]=p.ideal,l.optional.push(m)):(m[u("",c)]=p.ideal,l.optional.push(m))}p.exact!==void 0&&typeof p.exact!="number"?(l.mandatory=l.mandatory||{},l.mandatory[u("",c)]=p.exact):["min","max"].forEach(m=>{p[m]!==void 0&&(l.mandatory=l.mandatory||{},l.mandatory[u(m,c)]=p[m])})}),a.advanced&&(l.optional=(l.optional||[]).concat(a.advanced)),l},s=function(a,l){if(t.version>=61)return l(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),ct("chrome: "+JSON.stringify(a)),l(a)})}a.video=r(a.video)}return ct("chrome: "+JSON.stringify(a)),l(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,l,c){s(a,p=>{n.webkitGetUserMedia(p,l,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(l){return s(l,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 te(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function re(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 ne(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,l){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 l=this._senders.indexOf(a);l!==-1&&this._senders.splice(l,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(l=>l.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 se(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=>ee(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=>ee(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 pt(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 l=t.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(l)===-1&&this._shimmedLocalStreams[a.id].push(l):this._shimmedLocalStreams[a.id]=[a,l],l};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 l=this.getSenders().filter(c=>a.indexOf(c)===-1);this._shimmedLocalStreams[o.id]=[o].concat(l)};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 l=this._shimmedLocalStreams[a].indexOf(o);l!==-1&&this._shimmedLocalStreams[a].splice(l,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function ie(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return pt(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 l=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){let c=l.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 oe(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:()=>ue,shimCreateAnswer:()=>he,shimCreateOffer:()=>fe,shimGetDisplayMedia:()=>lt,shimGetParameters:()=>me,shimGetUserMedia:()=>U,shimOnTrack:()=>ae,shimPeerConnection:()=>F,shimRTCDataChannel:()=>de,shimReceiverGetStats:()=>pe,shimRemoveStream:()=>le,shimSenderGetStats:()=>ce});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,l){a in o&&!(l in o)&&(o[l]=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 lt(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 ae(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(l=>{if(t.version<53&&!o)try{l.forEach(c=>{c.type=n[c.type]||c.type})}catch(c){if(c.name!=="TypeError")throw c;l.forEach((p,u)=>{l.set(u,Object.assign({},p,{type:n[p.type]||p.type}))})}return l}).then(o,a)}}function ce(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 pe(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 de(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function ue(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 me(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 fe(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 he(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 G={};D(G,{shimAudioContext:()=>be,shimCallbacksAPI:()=>ye,shimConstraints:()=>dt,shimCreateOfferLegacy:()=>Te,shimGetUserMedia:()=>Se,shimLocalStreamsAPI:()=>ge,shimRTCIceServerUrls:()=>Re,shimRemoteStreamsAPI:()=>Ce,shimTrackEventTransceiver:()=>ve});function ge(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 Ce(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 ye(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(l,c,p){let u=s.apply(this,[l]);return p?(u.then(c,p),Promise.resolve()):u};t.setLocalDescription=a,a=function(l,c,p){let u=i.apply(this,[l]);return p?(u.then(c,p),Promise.resolve()):u},t.setRemoteDescription=a,a=function(l,c,p){let u=o.apply(this,[l]);return p?(u.then(c,p),Promise.resolve()):u},t.addIceCandidate=a}function Se(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:w(e.video)}):e}function Re(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 ve(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 Te(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 be(e){typeof e!="object"||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var ke={};D(ke,{removeExtmapAllowMixed:()=>K,shimAddIceCandidateNullOrEmpty:()=>_,shimConnectionState:()=>z,shimMaxMessageSize:()=>x,shimParameterlessSetLocalDescription:()=>E,shimRTCIceCandidate:()=>P,shimRTCIceCandidateRelayProtocol:()=>q,shimSendThrowTypeError:()=>k});var T=tt(xe());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 q(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 l=T.default.splitSections(a.sdp);return l.shift(),l.some(c=>{let p=T.default.parseMLine(c);return p&&p.kind==="application"&&p.protocol.indexOf("SCTP")!==-1})},r=function(a){let l=a.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(l===null||l.length<2)return-1;let c=parseInt(l[1],10);return c!==c?-1:c},s=function(a){let l=65536;return t.browser==="firefox"&&(t.version<57?a===-1?l=16384:l=2147483637:t.version<60?l=t.version===57?65535:65536:l=2147483637),l},i=function(a,l){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"&&l!==-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:l}=this.getConfiguration();l==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp},enumerable:!0,configurable:!0})}if(n(arguments[0])){let l=r(arguments[0]),c=s(l),p=i(arguments[0],l),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],l=a.length||a.size||a.byteLength;if(r.readyState==="open"&&s.sctp&&l>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
|
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 It=tt(xe());function ut({window:e}={},t={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){let n=O,r=at(e),s={browserDetails:r,commonShim:ke,extractVersion:b,disableLog:it,disableWarnings:ot,sdp:It};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),te(e,r),A(e,r),re(e,r),ie(e,r),ne(e,r),se(e,r),oe(e,r),P(e,r),q(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),ae(e,r),le(e,r),ce(e,r),pe(e,r),de(e,r),ue(e,r),me(e,r),fe(e,r),he(e,r),P(e,r),z(e,r),x(e,r),k(e,r);break;case"safari":if(!G||!t.shimSafari)return n("Safari shim is not included in this adapter release."),s;n("adapter.js shimming safari."),s.browserShim=G,_(e,r),E(e,r),Re(e,r),Te(e,r),ye(e,r),ge(e,r),Ce(e,r),ve(e,r),Se(e,r),be(e,r),P(e,r),q(e,r),x(e,r),k(e,r),K(e,r);break;default:n("Unsupported browser!");break}return s}var Mt=ut({window:typeof window>"u"?void 0:window}),I=Mt;import{ServiceType as Dt}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",[])}},Ot=new _e,Ee=class extends h{constructor(){super("pulsebeam.v1.PrepareResp",[{no:1,name:"ice_servers",kind:"message",repeat:1,T:()=>At}])}},Lt=new Ee,Ie=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}])}},At=new Ie,Me=class extends h{constructor(){super("pulsebeam.v1.SendReq",[{no:1,name:"msg",kind:"message",T:()=>mt}])}},jt=new Me,De=class extends h{constructor(){super("pulsebeam.v1.SendResp",[])}},Ut=new De,Oe=class extends h{constructor(){super("pulsebeam.v1.RecvReq",[{no:1,name:"src",kind:"message",T:()=>je}])}},Ft=new Oe,Le=class extends h{constructor(){super("pulsebeam.v1.RecvResp",[{no:1,name:"msg",kind:"message",T:()=>mt}])}},Nt=new Le,Ae=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}])}},je=new Ae,Ue=class extends h{constructor(){super("pulsebeam.v1.Message",[{no:1,name:"header",kind:"message",T:()=>qt},{no:2,name:"payload",kind:"message",T:()=>Gt}])}},mt=new Ue,Fe=class extends h{constructor(){super("pulsebeam.v1.MessagePayload",[{no:1,name:"signal",kind:"message",oneof:"payloadType",T:()=>zt},{no:2,name:"join",kind:"message",oneof:"payloadType",T:()=>Bt},{no:3,name:"bye",kind:"message",oneof:"payloadType",T:()=>Vt},{no:4,name:"ack",kind:"message",oneof:"payloadType",T:()=>Ht},{no:5,name:"ping",kind:"message",oneof:"payloadType",T:()=>Yt}])}},Gt=new Fe,Ne=class extends h{constructor(){super("pulsebeam.v1.MessageHeader",[{no:1,name:"src",kind:"message",T:()=>je},{no:2,name:"dst",kind:"message",T:()=>je},{no:7,name:"seqnum",kind:"scalar",T:13},{no:8,name:"reliable",kind:"scalar",T:8}])}},qt=new Ne,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:()=>Kt},{no:10,name:"ice_candidate",kind:"message",oneof:"data",T:()=>Jt}])}},zt=new Ge,qe=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}])}},Kt=new qe,ze=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}])}},Jt=new ze,Ke=class extends h{constructor(){super("pulsebeam.v1.Join",[])}},Bt=new Ke,Je=class extends h{constructor(){super("pulsebeam.v1.Bye",[])}},Vt=new Je,Be=class extends h{constructor(){super("pulsebeam.v1.Ack",[{no:1,name:"ack_ranges",kind:"message",repeat:1,T:()=>Wt}])}},Ht=new Be,Ve=class extends h{constructor(){super("pulsebeam.v1.Ping",[])}},Yt=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}])}},Wt=new He,Ye=class extends h{constructor(){super("pulsebeam.v1.DataChannel",[{no:10,name:"heartbeat",kind:"message",oneof:"payload",T:()=>Xt}])}},br=new Ye,We=class extends h{constructor(){super("pulsebeam.v1.DataChannelHeartbeat",[])}},Xt=new We,J=new Dt("pulsebeam.v1.Signaling",[{name:"Prepare",options:{},I:Ot,O:Lt},{name:"Send",options:{},I:jt,O:Ut},{name:"Recv",serverStreaming:!0,options:{},I:Ft,O:Nt}]);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,l=0;for(;(l<=n||n<0)&&!a?.aborted;)try{return await e()}catch(c){if(!o(c)||(l++,n>=0&&l>n))throw c;let p=Qt(l,r,s,i);await V(p,a).catch(()=>{})}if(a?.aborted)return null;throw new Error("Retry failed: max retries exceeded")}function Qt(e,t,n,r){let s=Math.min(t*2**(e-1),n),i=Math.random()*r*s;return s+i}var ft=9e5,ht=50,Ze=1e3;var Zt=1e4,$t=1e3;var wt=V,er=e=>{let t;do{let n=new Uint32Array(1);crypto.getRandomValues(n),t=n[0]}while(t>=0&&t<e);return t},tr=e=>!0,$e=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()}},Y=class{constructor(t,n){this.client=t;this.opts=n;this.onstream=t=>{};this.onclosed=t=>{};this.handleControlMessage=t=>{switch(t.payloadType.oneofKind){case"ping":this.logger.debug("received ping");break;default:this.logger.warn("received unknown control message",{payload:t});break}};this.handleMessages=t=>{if(this.logger.debug("received",{msg:t}),this.abort.signal.aborted)return;if(!t.header)return t.payload?this.handleControlMessage(t.payload):void 0;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 we(this,this.info,n,this.logger),this.streams.push(s),this.onstream(s)}s.enqueue(t)};this.asleep=n.asleep||wt,this.randUint32=n.randUint32||er,this.isRecoverable=n.isRecoverable||tr,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($t,this.abort.signal);this.logger.debug("gc loop is closed")}async pollLoop(){let t={abort:this.abort.signal,timeout:ft},n={baseDelay:ht,maxDelay:Ze,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(Ze,a).catch(()=>{}),o=!!this.streams.find(l=>l.other.groupId===t&&l.other.peerId===n)}async send(t,n){let r=H(t,this.abort.signal),s={abort:r,timeout:ft},i={baseDelay:ht,maxDelay:Ze,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}}},we=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.recvq=new $e(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>Zt;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:this.lastSeqnum,reliable:n},payload:{...t}};this.lastSeqnum++,await this.transport.send(r,s)}async handleMessage(t){if(!t.payload){this.logger.warn("payload is missing from the stream message",{msg:t});return}this.onpayload(t.payload)}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 rr={DEBUG:console.debug,INFO:console.info,WARN:console.warn,ERROR:console.error},gt={DEBUG:e=>console.debug(W(e)),INFO:e=>console.info(W(e)),WARN:e=>console.warn(W(e)),ERROR:e=>console.error(W(e))};function Ct(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;Ct(e[i],t,o,r)}else{let o=t[n]||[];o.push(`${i}=${e[i]}`),t[n]=o}}}function W(e){let t={};Ct(e,t);let n=[];for(let r in t)n.push(`[${r}] ${t[r].join(" ")}`);return n.join(`
|
36
|
+
`)}var X=class e{constructor(t,n,r){this.name=t;n||(n={}),r||(r=rr),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 nr=2,yt=5e3;function St(e){return{candidate:e.candidate,sdpMid:e.sdpMid,sdpMLineIndex:e.sdpMLineIndex,usernameFragment:e.password}}function sr(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 Rt(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 Q=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<yt){let n=yt-t,r=window.setTimeout(()=>{this.triggerIceRestart(),this.timers=this.timers.filter(s=>s===r)},n);return}this.pc.connectionState!=="connected"&&(this.iceRestartCount>=nr&&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=St(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=St(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:sr(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:Rt(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=[],l=[];i.forEach(c=>{c.type==="candidate-pair"?o.push(c):c.type==="local-candidate"?a.push(c):c.type==="remote-candidate"&&l.push(c)}),this.logger.debug("iceconnectionstate changed",{connectionstate:this.pc.connectionState,iceconnectionstate:this.pc.iceConnectionState,local:a,remote:l,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:Rt(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 ir}from"@protobuf-ts/runtime-rpc";import{GrpcStatusCode as S,GrpcWebFetchTransport as or}from"@protobuf-ts/grpcweb-transport";import{jwtDecode as ar}from"jwt-decode";var cr="https://cloud.pulsebeam.dev/grpc";var et=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 Y(n,{enableDiscovery:!1,groupId:r.groupId,peerId:r.peerId,logger:this.logger,isRecoverable:s}),this.transport.onstream=o=>{let a=new Q(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())}},pr=[S[S.PERMISSION_DENIED],S[S.INVALID_ARGUMENT],S[S.ABORTED],S[S.NOT_FOUND],S[S.UNAUTHENTICATED]];function vt(e){return e instanceof Error?e instanceof ir?!pr.includes(e.code):!0:!1}async function Yr(e){let t=e.token,n=new or({baseUrl:e.baseUrl||cr,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:vt});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=ar(t),a={...e,iceServers:i,groupId:o.gid,peerId:o.pid};return new et(new X("pulsebeam",void 0,gt),r,a,vt)}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{et as Peer,Yr as createPeer};
|
37
37
|
//# sourceMappingURL=index.js.map
|