@sbhjt-gr/react-native-webrtc 124.0.1 → 124.0.3

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.
@@ -70,12 +70,24 @@ export default class RTCPeerConnection extends EventTarget {
70
70
  log.debug(`${this._pcId} ctor`);
71
71
  }
72
72
  async createOffer(options) {
73
+ var _sdpInfo$sdp$length, _sdpInfo$sdp;
74
+ const _t0 = Date.now();
75
+ console.log(`[RNWebRTC] pc:${this._pcId} create_offer_start`, {
76
+ signalingState: this.signalingState,
77
+ connectionState: this.connectionState,
78
+ iceConnectionState: this.iceConnectionState
79
+ });
73
80
  log.debug(`${this._pcId} createOffer`);
74
81
  const {
75
82
  sdpInfo,
76
83
  newTransceivers,
77
84
  transceiversInfo
78
85
  } = await WebRTCModule.peerConnectionCreateOffer(this._pcId, RTCUtil.normalizeOfferOptions(options));
86
+ console.log(`[RNWebRTC] pc:${this._pcId} create_offer_done`, {
87
+ durationMs: Date.now() - _t0,
88
+ sdpType: sdpInfo === null || sdpInfo === void 0 ? void 0 : sdpInfo.type,
89
+ sdpLen: (_sdpInfo$sdp$length = sdpInfo === null || sdpInfo === void 0 ? void 0 : (_sdpInfo$sdp = sdpInfo.sdp) === null || _sdpInfo$sdp === void 0 ? void 0 : _sdpInfo$sdp.length) !== null && _sdpInfo$sdp$length !== void 0 ? _sdpInfo$sdp$length : 0
90
+ });
79
91
  log.debug(`${this._pcId} createOffer OK`);
80
92
  newTransceivers === null || newTransceivers === void 0 ? void 0 : newTransceivers.forEach(t => {
81
93
  const {
@@ -102,11 +114,22 @@ export default class RTCPeerConnection extends EventTarget {
102
114
  return sdpInfo;
103
115
  }
104
116
  async createAnswer() {
117
+ var _sdpInfo$sdp$length2, _sdpInfo$sdp2;
118
+ const _t0 = Date.now();
119
+ console.log(`[RNWebRTC] pc:${this._pcId} create_answer_start`, {
120
+ signalingState: this.signalingState,
121
+ connectionState: this.connectionState
122
+ });
105
123
  log.debug(`${this._pcId} createAnswer`);
106
124
  const {
107
125
  sdpInfo,
108
126
  transceiversInfo
109
127
  } = await WebRTCModule.peerConnectionCreateAnswer(this._pcId, {});
128
+ console.log(`[RNWebRTC] pc:${this._pcId} create_answer_done`, {
129
+ durationMs: Date.now() - _t0,
130
+ sdpType: sdpInfo === null || sdpInfo === void 0 ? void 0 : sdpInfo.type,
131
+ sdpLen: (_sdpInfo$sdp$length2 = sdpInfo === null || sdpInfo === void 0 ? void 0 : (_sdpInfo$sdp2 = sdpInfo.sdp) === null || _sdpInfo$sdp2 === void 0 ? void 0 : _sdpInfo$sdp2.length) !== null && _sdpInfo$sdp$length2 !== void 0 ? _sdpInfo$sdp$length2 : 0
132
+ });
110
133
  this._updateTransceivers(transceiversInfo);
111
134
  return sdpInfo;
112
135
  }
@@ -114,14 +137,20 @@ export default class RTCPeerConnection extends EventTarget {
114
137
  WebRTCModule.peerConnectionSetConfiguration(configuration, this._pcId);
115
138
  }
116
139
  async setLocalDescription(sessionDescription) {
117
- var _desc;
140
+ var _sessionDescription$s, _sessionDescription$s2, _desc;
141
+ const _t0 = Date.now();
142
+ console.log(`[RNWebRTC] pc:${this._pcId} set_local_desc_start`, {
143
+ type: sessionDescription === null || sessionDescription === void 0 ? void 0 : sessionDescription.type,
144
+ sdpLen: (_sessionDescription$s = sessionDescription === null || sessionDescription === void 0 ? void 0 : (_sessionDescription$s2 = sessionDescription.sdp) === null || _sessionDescription$s2 === void 0 ? void 0 : _sessionDescription$s2.length) !== null && _sessionDescription$s !== void 0 ? _sessionDescription$s : 0,
145
+ signalingState: this.signalingState
146
+ });
118
147
  log.debug(`${this._pcId} setLocalDescription`);
119
148
  let desc;
120
149
  if (sessionDescription) {
121
- var _sessionDescription$s;
150
+ var _sessionDescription$s3;
122
151
  desc = {
123
152
  type: sessionDescription.type,
124
- sdp: (_sessionDescription$s = sessionDescription.sdp) !== null && _sessionDescription$s !== void 0 ? _sessionDescription$s : ''
153
+ sdp: (_sessionDescription$s3 = sessionDescription.sdp) !== null && _sessionDescription$s3 !== void 0 ? _sessionDescription$s3 : ''
125
154
  };
126
155
  if (!RTCUtil.isSdpTypeValid(desc.type)) {
127
156
  throw new Error(`Invalid session description: invalid type: ${desc.type}`);
@@ -139,17 +168,28 @@ export default class RTCPeerConnection extends EventTarget {
139
168
  this.localDescription = null;
140
169
  }
141
170
  this._updateTransceivers(transceiversInfo, /* removeStopped */((_desc = desc) === null || _desc === void 0 ? void 0 : _desc.type) === 'answer');
171
+ console.log(`[RNWebRTC] pc:${this._pcId} set_local_desc_done`, {
172
+ durationMs: Date.now() - _t0,
173
+ signalingState: this.signalingState
174
+ });
142
175
  log.debug(`${this._pcId} setLocalDescription OK`);
143
176
  }
144
177
  async setRemoteDescription(sessionDescription) {
145
- var _sessionDescription$s2, _desc$type;
178
+ var _sessionDescription$s4, _sessionDescription$s5, _sessionDescription$s6, _desc$type;
179
+ const _t0 = Date.now();
180
+ console.log(`[RNWebRTC] pc:${this._pcId} set_remote_desc_start`, {
181
+ type: sessionDescription === null || sessionDescription === void 0 ? void 0 : sessionDescription.type,
182
+ sdpLen: (_sessionDescription$s4 = sessionDescription === null || sessionDescription === void 0 ? void 0 : (_sessionDescription$s5 = sessionDescription.sdp) === null || _sessionDescription$s5 === void 0 ? void 0 : _sessionDescription$s5.length) !== null && _sessionDescription$s4 !== void 0 ? _sessionDescription$s4 : 0,
183
+ signalingState: this.signalingState,
184
+ connectionState: this.connectionState
185
+ });
146
186
  log.debug(`${this._pcId} setRemoteDescription`);
147
187
  if (!sessionDescription) {
148
188
  return Promise.reject(new Error('No session description provided'));
149
189
  }
150
190
  const desc = {
151
191
  type: sessionDescription.type,
152
- sdp: (_sessionDescription$s2 = sessionDescription.sdp) !== null && _sessionDescription$s2 !== void 0 ? _sessionDescription$s2 : ''
192
+ sdp: (_sessionDescription$s6 = sessionDescription.sdp) !== null && _sessionDescription$s6 !== void 0 ? _sessionDescription$s6 : ''
153
193
  };
154
194
  if (!RTCUtil.isSdpTypeValid((_desc$type = desc.type) !== null && _desc$type !== void 0 ? _desc$type : '')) {
155
195
  throw new Error(`Invalid session description: invalid type: ${desc.type}`);
@@ -237,9 +277,24 @@ export default class RTCPeerConnection extends EventTarget {
237
277
  // Dispatch an unmute event for the track.
238
278
  track._setMutedInternal(false);
239
279
  }
280
+ console.log(`[RNWebRTC] pc:${this._pcId} set_remote_desc_done`, {
281
+ durationMs: Date.now() - _t0,
282
+ signalingState: this.signalingState,
283
+ pendingTrackEventsDispatched: this._pendingTrackEvents.length
284
+ });
240
285
  log.debug(`${this._pcId} setRemoteDescription OK`);
241
286
  }
242
287
  async addIceCandidate(candidate) {
288
+ console.log(`[RNWebRTC] pc:${this._pcId} add_ice_candidate`, {
289
+ type: candidate === null || candidate === void 0 ? void 0 : candidate.type,
290
+ protocol: candidate === null || candidate === void 0 ? void 0 : candidate.protocol,
291
+ sdpMid: candidate === null || candidate === void 0 ? void 0 : candidate.sdpMid,
292
+ sdpMLineIndex: candidate === null || candidate === void 0 ? void 0 : candidate.sdpMLineIndex,
293
+ empty: !(candidate !== null && candidate !== void 0 && candidate.candidate),
294
+ signalingState: this.signalingState,
295
+ connectionState: this.connectionState,
296
+ iceConnectionState: this.iceConnectionState
297
+ });
243
298
  log.debug(`${this._pcId} addIceCandidate`);
244
299
  if (!candidate || !candidate.candidate) {
245
300
  // XXX end-of candidates is not implemented: https://bugs.chromium.org/p/webrtc/issues/detail?id=9218
@@ -456,22 +511,43 @@ export default class RTCPeerConnection extends EventTarget {
456
511
  if (ev.pcId !== this._pcId) {
457
512
  return;
458
513
  }
514
+ console.log(`[RNWebRTC] pc:${this._pcId} negotiation_needed`, {
515
+ signalingState: this.signalingState,
516
+ connectionState: this.connectionState,
517
+ iceConnectionState: this.iceConnectionState
518
+ });
459
519
  this.dispatchEvent(new Event('negotiationneeded'));
460
520
  });
461
521
  addListener(this, 'peerConnectionIceConnectionChanged', ev => {
462
522
  if (ev.pcId !== this._pcId) {
463
523
  return;
464
524
  }
525
+ const prev = this.iceConnectionState;
465
526
  this.iceConnectionState = ev.iceConnectionState;
527
+ console.log(`[RNWebRTC] pc:${this._pcId} ice_connection_changed`, {
528
+ prev,
529
+ current: ev.iceConnectionState,
530
+ connectionState: this.connectionState,
531
+ signalingState: this.signalingState
532
+ });
466
533
  this.dispatchEvent(new Event('iceconnectionstatechange'));
467
534
  });
468
535
  addListener(this, 'peerConnectionStateChanged', ev => {
469
536
  if (ev.pcId !== this._pcId) {
470
537
  return;
471
538
  }
539
+ const prev = this.connectionState;
472
540
  this.connectionState = ev.connectionState;
541
+ console.log(`[RNWebRTC] pc:${this._pcId} connection_state_changed`, {
542
+ prev,
543
+ current: ev.connectionState,
544
+ iceConnectionState: this.iceConnectionState,
545
+ iceGatheringState: this.iceGatheringState,
546
+ signalingState: this.signalingState
547
+ });
473
548
  this.dispatchEvent(new Event('connectionstatechange'));
474
549
  if (ev.connectionState === 'closed') {
550
+ console.log(`[RNWebRTC] pc:${this._pcId} disposing`);
475
551
  // This PeerConnection is done, clean up.
476
552
  removeListener(this);
477
553
  WebRTCModule.peerConnectionDispose(this._pcId);
@@ -481,15 +557,28 @@ export default class RTCPeerConnection extends EventTarget {
481
557
  if (ev.pcId !== this._pcId) {
482
558
  return;
483
559
  }
560
+ const prev = this.signalingState;
484
561
  this.signalingState = ev.signalingState;
562
+ console.log(`[RNWebRTC] pc:${this._pcId} signaling_state_changed`, {
563
+ prev,
564
+ current: ev.signalingState,
565
+ connectionState: this.connectionState
566
+ });
485
567
  this.dispatchEvent(new Event('signalingstatechange'));
486
568
  });
487
569
 
488
570
  // Consider moving away from this event: https://github.com/WebKit/WebKit/pull/3953
489
571
  addListener(this, 'peerConnectionOnTrack', ev => {
572
+ var _ev$receiver, _ev$receiver2, _ev$receiver2$track, _ev$streams$length, _ev$streams;
490
573
  if (ev.pcId !== this._pcId) {
491
574
  return;
492
575
  }
576
+ console.log(`[RNWebRTC] pc:${this._pcId} track_event_queued`, {
577
+ receiverId: (_ev$receiver = ev.receiver) === null || _ev$receiver === void 0 ? void 0 : _ev$receiver.id,
578
+ trackKind: (_ev$receiver2 = ev.receiver) === null || _ev$receiver2 === void 0 ? void 0 : (_ev$receiver2$track = _ev$receiver2.track) === null || _ev$receiver2$track === void 0 ? void 0 : _ev$receiver2$track.kind,
579
+ streamCount: (_ev$streams$length = (_ev$streams = ev.streams) === null || _ev$streams === void 0 ? void 0 : _ev$streams.length) !== null && _ev$streams$length !== void 0 ? _ev$streams$length : 0,
580
+ pendingCount: this._pendingTrackEvents.length + 1
581
+ });
493
582
  log.debug(`${this._pcId} ontrack`);
494
583
 
495
584
  // NOTE: We need to make sure the track event fires right before sRD completes,
@@ -501,6 +590,9 @@ export default class RTCPeerConnection extends EventTarget {
501
590
  if (ev.pcId !== this._pcId) {
502
591
  return;
503
592
  }
593
+ console.log(`[RNWebRTC] pc:${this._pcId} remove_track`, {
594
+ receiverId: ev.receiverId
595
+ });
504
596
  log.debug(`${this._pcId} onremovetrack ${ev.receiverId}`);
505
597
  const receiver = this.getReceivers().find(r => r.id === ev.receiverId);
506
598
  const track = receiver === null || receiver === void 0 ? void 0 : receiver.track;
@@ -526,9 +618,16 @@ export default class RTCPeerConnection extends EventTarget {
526
618
  }
527
619
  });
528
620
  addListener(this, 'peerConnectionGotICECandidate', ev => {
621
+ var _ev$candidate, _ev$candidate2, _ev$candidate3;
529
622
  if (ev.pcId !== this._pcId) {
530
623
  return;
531
624
  }
625
+ console.log(`[RNWebRTC] pc:${this._pcId} local_ice_candidate`, {
626
+ type: (_ev$candidate = ev.candidate) === null || _ev$candidate === void 0 ? void 0 : _ev$candidate.type,
627
+ protocol: (_ev$candidate2 = ev.candidate) === null || _ev$candidate2 === void 0 ? void 0 : _ev$candidate2.protocol,
628
+ sdpMid: (_ev$candidate3 = ev.candidate) === null || _ev$candidate3 === void 0 ? void 0 : _ev$candidate3.sdpMid,
629
+ iceGatheringState: this.iceGatheringState
630
+ });
532
631
  const sdpInfo = ev.sdp;
533
632
 
534
633
  // Can happen when doing a rollback.
@@ -546,7 +645,13 @@ export default class RTCPeerConnection extends EventTarget {
546
645
  if (ev.pcId !== this._pcId) {
547
646
  return;
548
647
  }
648
+ const prev = this.iceGatheringState;
549
649
  this.iceGatheringState = ev.iceGatheringState;
650
+ console.log(`[RNWebRTC] pc:${this._pcId} ice_gathering_state_changed`, {
651
+ prev,
652
+ current: ev.iceGatheringState,
653
+ connectionState: this.connectionState
654
+ });
550
655
  if (this.iceGatheringState === 'complete') {
551
656
  const sdpInfo = ev.sdp;
552
657
 
@@ -1 +1 @@
1
- {"version":3,"names":["EventTarget","Event","defineEventAttribute","NativeModules","addListener","removeListener","Logger","MediaStream","MediaStreamTrack","MediaStreamTrackEvent","RTCDataChannel","RTCDataChannelEvent","RTCIceCandidate","RTCIceCandidateEvent","RTCRtpReceiveParameters","RTCRtpReceiver","RTCRtpSendParameters","RTCRtpSender","RTCRtpTransceiver","RTCSessionDescription","RTCTrackEvent","RTCUtil","log","WebRTCModule","nextPeerConnectionId","RTCPeerConnection","constructor","configuration","_defineProperty","_pcId","_configuration$iceSer","servers","iceServers","server","urls","url","Array","isArray","map","toLowerCase","filter","s","peerConnectionInit","Error","_transceivers","_remoteStreams","Map","_pendingTrackEvents","_registerEvents","debug","createOffer","options","sdpInfo","newTransceivers","transceiversInfo","peerConnectionCreateOffer","normalizeOfferOptions","forEach","t","transceiverOrder","transceiver","newSender","sender","track","remoteTrack","receiver","newReceiver","newTransceiver","_insertTransceiverSorted","_updateTransceivers","createAnswer","peerConnectionCreateAnswer","setConfiguration","peerConnectionSetConfiguration","setLocalDescription","sessionDescription","_desc","desc","_sessionDescription$s","type","sdp","isSdpTypeValid","peerConnectionSetLocalDescription","localDescription","setRemoteDescription","_sessionDescription$s2","_desc$type","Promise","reject","peerConnectionSetRemoteDescription","remoteDescription","pendingTrackEvents","ev","getTransceivers","id","_mid","mid","_currentDirection","currentDirection","_direction","direction","streams","streamInfo","has","streamId","stream","streamReactTag","tracks","set","get","_tracks","includes","push","eventData","dispatchEvent","_setMutedInternal","addIceCandidate","candidate","sdpMLineIndex","undefined","sdpMid","TypeError","newSdp","peerConnectionAddICECandidate","deepClone","addTrack","connectionState","_trackExists","_len","arguments","length","_key","streamIds","result","peerConnectionAddTrack","existingSender","getSenders","_track","existingTransceiver","addTransceiver","source","init","src","trackId","peerConnectionAddTransceiver","removeTrack","_peerConnectionId","find","peerConnectionRemoveTrack","getStats","selector","data","peerConnectionGetStats","JSON","parse","senders","receivers","getReceivers","r","matches","sr","e","stopped","close","peerConnectionClose","_ref","_setStopped","restartIce","peerConnectionRestartIce","pcId","iceConnectionState","peerConnectionDispose","signalingState","receiverId","values","trackIdx","indexOf","splice","iceGatheringState","channel","dataChannel","muted","createDataChannel","label","dataChannelDict","channelInfo","String","_sender$track","transceiverUpdates","removeStopped","update","transceiverId","_stopped","Boolean","isStopped","_sender","_rtpParameters","senderRtpParameters","_receiver","receiverRtpParameters","order","sort","a","b","proto","prototype"],"sources":["RTCPeerConnection.ts"],"sourcesContent":["import { EventTarget, Event, defineEventAttribute } from 'event-target-shim/index';\nimport { NativeModules } from 'react-native';\n\nimport { addListener, removeListener } from './EventEmitter';\nimport Logger from './Logger';\nimport MediaStream from './MediaStream';\nimport MediaStreamTrack from './MediaStreamTrack';\nimport MediaStreamTrackEvent from './MediaStreamTrackEvent';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDataChannelEvent from './RTCDataChannelEvent';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceCandidateEvent from './RTCIceCandidateEvent';\nimport RTCRtpReceiveParameters from './RTCRtpReceiveParameters';\nimport RTCRtpReceiver from './RTCRtpReceiver';\nimport RTCRtpSendParameters from './RTCRtpSendParameters';\nimport RTCRtpSender from './RTCRtpSender';\nimport RTCRtpTransceiver from './RTCRtpTransceiver';\nimport RTCSessionDescription, { RTCSessionDescriptionInit } from './RTCSessionDescription';\nimport RTCTrackEvent from './RTCTrackEvent';\nimport * as RTCUtil from './RTCUtil';\nimport { RTCOfferOptions } from './RTCUtil';\n\nconst log = new Logger('pc');\nconst { WebRTCModule } = NativeModules;\n\ntype RTCSignalingState =\n | 'stable'\n | 'have-local-offer'\n | 'have-remote-offer'\n | 'have-local-pranswer'\n | 'have-remote-pranswer'\n | 'closed';\n\ntype RTCIceGatheringState = 'new' | 'gathering' | 'complete';\n\ntype RTCPeerConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';\n\ntype RTCIceConnectionState = 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';\n\ntype RTCDataChannelInit = {\n ordered?: boolean,\n maxPacketLifeTime?: number,\n maxRetransmits?: number,\n protocol?: string,\n negotiated?: boolean,\n id?: number\n};\n\ntype RTCIceServer = {\n credential?: string,\n url?: string, // Deprecated.\n urls?: string | string[],\n username?: string\n};\n\ntype RTCConfiguration = {\n bundlePolicy?: 'balanced' | 'max-compat' | 'max-bundle',\n iceCandidatePoolSize?: number,\n iceServers?: RTCIceServer[],\n iceTransportPolicy?: 'all' | 'relay',\n rtcpMuxPolicy?: 'negotiate' | 'require'\n};\n\ntype RTCPeerConnectionEventMap = {\n connectionstatechange: Event<'connectionstatechange'>\n icecandidate: RTCIceCandidateEvent<'icecandidate'>\n icecandidateerror: RTCIceCandidateEvent<'icecandidateerror'>\n iceconnectionstatechange: Event<'iceconnectionstatechange'>\n icegatheringstatechange: Event<'icegatheringstatechange'>\n negotiationneeded: Event<'negotiationneeded'>\n signalingstatechange: Event<'signalingstatechange'>\n datachannel: RTCDataChannelEvent<'datachannel'>\n track: RTCTrackEvent<'track'>\n error: Event<'error'>\n}\n\nlet nextPeerConnectionId = 0;\n\nexport default class RTCPeerConnection extends EventTarget<RTCPeerConnectionEventMap> {\n localDescription: RTCSessionDescription | null = null;\n remoteDescription: RTCSessionDescription | null = null;\n signalingState: RTCSignalingState = 'stable';\n iceGatheringState: RTCIceGatheringState = 'new';\n connectionState: RTCPeerConnectionState = 'new';\n iceConnectionState: RTCIceConnectionState = 'new';\n\n _pcId: number;\n _transceivers: { order: number, transceiver: RTCRtpTransceiver }[];\n _remoteStreams: Map<string, MediaStream>;\n _pendingTrackEvents: any[];\n\n constructor(configuration?: RTCConfiguration) {\n super();\n\n this._pcId = nextPeerConnectionId++;\n\n // Sanitize ICE servers.\n if (configuration) {\n const servers = configuration?.iceServers ?? [];\n\n for (const server of servers) {\n let urls = server.url || server.urls;\n\n delete server.url;\n delete server.urls;\n\n if (!urls) {\n continue;\n }\n\n if (!Array.isArray(urls)) {\n urls = [ urls ];\n }\n\n // Native WebRTC does case sensitive parsing.\n server.urls = urls.map(url => url.toLowerCase());\n }\n\n // Filter out bogus servers.\n configuration.iceServers = servers.filter(s => s.urls);\n }\n\n if (!WebRTCModule.peerConnectionInit(configuration, this._pcId)) {\n throw new Error('Failed to initialize PeerConnection, check the native logs!');\n }\n\n this._transceivers = [];\n this._remoteStreams = new Map();\n this._pendingTrackEvents = [];\n\n this._registerEvents();\n\n log.debug(`${this._pcId} ctor`);\n }\n\n async createOffer(options?:RTCOfferOptions) {\n log.debug(`${this._pcId} createOffer`);\n\n const {\n sdpInfo,\n newTransceivers,\n transceiversInfo\n } = await WebRTCModule.peerConnectionCreateOffer(this._pcId, RTCUtil.normalizeOfferOptions(options));\n\n log.debug(`${this._pcId} createOffer OK`);\n\n newTransceivers?.forEach(t => {\n const { transceiverOrder, transceiver } = t;\n const newSender = new RTCRtpSender({ ...transceiver.sender, track: null });\n const remoteTrack\n = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n });\n\n this._updateTransceivers(transceiversInfo);\n\n return sdpInfo;\n }\n\n async createAnswer() {\n log.debug(`${this._pcId} createAnswer`);\n\n const {\n sdpInfo,\n transceiversInfo\n } = await WebRTCModule.peerConnectionCreateAnswer(this._pcId, {});\n\n this._updateTransceivers(transceiversInfo);\n\n return sdpInfo;\n }\n\n setConfiguration(configuration): void {\n WebRTCModule.peerConnectionSetConfiguration(configuration, this._pcId);\n }\n\n async setLocalDescription(sessionDescription?: RTCSessionDescription | RTCSessionDescriptionInit): Promise<void> {\n log.debug(`${this._pcId} setLocalDescription`);\n\n let desc;\n\n if (sessionDescription) {\n desc = {\n type: sessionDescription.type,\n sdp: sessionDescription.sdp ?? ''\n };\n\n if (!RTCUtil.isSdpTypeValid(desc.type)) {\n throw new Error(`Invalid session description: invalid type: ${desc.type}`);\n }\n } else {\n desc = null;\n }\n\n const {\n sdpInfo,\n transceiversInfo\n } = await WebRTCModule.peerConnectionSetLocalDescription(this._pcId, desc);\n\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n this._updateTransceivers(transceiversInfo, /* removeStopped */ desc?.type === 'answer');\n\n log.debug(`${this._pcId} setLocalDescription OK`);\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescription | RTCSessionDescriptionInit): Promise<void> {\n log.debug(`${this._pcId} setRemoteDescription`);\n\n if (!sessionDescription) {\n return Promise.reject(new Error('No session description provided'));\n }\n\n const desc = {\n type: sessionDescription.type,\n sdp: sessionDescription.sdp ?? ''\n };\n\n if (!RTCUtil.isSdpTypeValid(desc.type ?? '')) {\n throw new Error(`Invalid session description: invalid type: ${desc.type}`);\n }\n\n const {\n sdpInfo,\n newTransceivers,\n transceiversInfo\n } = await WebRTCModule.peerConnectionSetRemoteDescription(this._pcId, desc);\n\n if (sdpInfo.type && sdpInfo.sdp) {\n this.remoteDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.remoteDescription = null;\n }\n\n newTransceivers?.forEach(t => {\n const { transceiverOrder, transceiver } = t;\n const newSender = new RTCRtpSender({ ...transceiver.sender, track: null });\n const remoteTrack\n = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n });\n\n this._updateTransceivers(transceiversInfo, /* removeStopped */ desc.type === 'answer');\n\n // Fire track events. They must fire before sRD resolves.\n const pendingTrackEvents = this._pendingTrackEvents;\n\n this._pendingTrackEvents = [];\n\n for (const ev of pendingTrackEvents) {\n const [ transceiver ] = this\n .getTransceivers()\n .filter(t => t.receiver.id === ev.receiver.id);\n\n // We need to fire this event for an existing track sometimes, like\n // when the transceiver direction (on the sending side) switches from\n // sendrecv to recvonly and then back.\n\n // @ts-ignore\n const track: MediaStreamTrack = transceiver.receiver.track;\n\n transceiver._mid = ev.transceiver.mid;\n transceiver._currentDirection = ev.transceiver.currentDirection;\n transceiver._direction = ev.transceiver.direction;\n\n // Get the stream object from the event. Create if necessary.\n const streams: MediaStream[] = ev.streams.map(streamInfo => {\n // Here we are making sure that we don't create stream objects that already exist\n // So that event listeners do get the same object if it has been created before.\n if (!this._remoteStreams.has(streamInfo.streamId)) {\n const stream = new MediaStream({\n streamId: streamInfo.streamId,\n streamReactTag: streamInfo.streamReactTag,\n tracks: []\n });\n\n this._remoteStreams.set(streamInfo.streamId, stream);\n }\n\n const stream = this._remoteStreams.get(streamInfo.streamId);\n\n if (!stream?._tracks.includes(track)) {\n stream?._tracks.push(track);\n }\n\n return stream;\n });\n\n const eventData = {\n streams,\n transceiver,\n track,\n receiver: transceiver.receiver\n };\n\n\n this.dispatchEvent(new RTCTrackEvent('track', eventData));\n\n streams.forEach(stream => {\n stream.dispatchEvent(new MediaStreamTrackEvent('addtrack', { track }));\n });\n\n // Dispatch an unmute event for the track.\n track._setMutedInternal(false);\n }\n\n log.debug(`${this._pcId} setRemoteDescription OK`);\n }\n\n async addIceCandidate(candidate): Promise<void> {\n log.debug(`${this._pcId} addIceCandidate`);\n\n if (!candidate || !candidate.candidate) {\n // XXX end-of candidates is not implemented: https://bugs.chromium.org/p/webrtc/issues/detail?id=9218\n return;\n }\n\n if ((candidate.sdpMLineIndex === null ||\n candidate.sdpMLineIndex === undefined) &&\n (candidate.sdpMid === null ||\n candidate.sdpMid === undefined)\n ) {\n throw new TypeError('`sdpMLineIndex` and `sdpMid` must not be both null or undefined');\n }\n\n const newSdp = await WebRTCModule.peerConnectionAddICECandidate(\n this._pcId,\n RTCUtil.deepClone(candidate)\n );\n\n this.remoteDescription = new RTCSessionDescription(newSdp);\n }\n\n /**\n * @brief Adds a new track to the {@link RTCPeerConnection},\n * and indicates that it is contained in the specified {@link MediaStream}s.\n * This method has to be synchronous as the W3C API expects a track to be returned\n * @param {MediaStreamTrack} track The track to be added\n * @param {...MediaStream} streams One or more {@link MediaStream}s the track needs to be added to\n * https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack\n */\n addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender {\n log.debug(`${this._pcId} addTrack`);\n\n if (this.connectionState === 'closed') {\n throw new Error('Peer Connection is closed');\n }\n\n if (this._trackExists(track)) {\n throw new Error('Track already exists in a sender');\n }\n\n const streamIds = streams.map(s => s.id);\n const result = WebRTCModule.peerConnectionAddTrack(this._pcId, track.id, { streamIds });\n\n if (result === null) {\n throw new Error('Could not add sender');\n }\n\n const { transceiverOrder, transceiver, sender } = result;\n\n // According to the W3C docs, the sender could have been reused, and\n // so we check if that is the case, and update accordingly.\n const [ existingSender ] = this\n .getSenders()\n .filter(s => s.id === sender.id);\n\n if (existingSender) {\n // Update sender\n existingSender._track = track;\n\n // Update the corresponding transceiver as well\n const [ existingTransceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === existingSender.id);\n\n existingTransceiver._direction = transceiver.direction;\n existingTransceiver._currentDirection = transceiver.currentDirection;\n\n return existingSender;\n }\n\n // This is a new transceiver, should create a transceiver for it and add it\n const newSender = new RTCRtpSender({ ...transceiver.sender, track });\n const remoteTrack = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n\n return newSender;\n }\n\n addTransceiver(source: 'audio' | 'video' | MediaStreamTrack, init): RTCRtpTransceiver {\n log.debug(`${this._pcId} addTransceiver`);\n\n let src = {};\n\n if (source === 'audio') {\n src = { type: 'audio' };\n } else if (source === 'video') {\n src = { type: 'video' };\n } else {\n src = { trackId: source.id };\n }\n\n // Extract the stream ids\n if (init && init.streams) {\n init.streamIds = init.streams.map(stream => stream.id);\n }\n\n const result = WebRTCModule.peerConnectionAddTransceiver(this._pcId, { ...src, init: { ...init } });\n\n if (result === null) {\n throw new Error('Transceiver could not be added');\n }\n\n const t = result.transceiver;\n let track: MediaStreamTrack | null = null;\n\n if (typeof source === 'string') {\n if (t.sender.track) {\n track = new MediaStreamTrack(t.sender.track);\n }\n } else {\n // 'source' is a MediaStreamTrack\n track = source;\n }\n\n const sender = new RTCRtpSender({ ...t.sender, track });\n const remoteTrack = t.receiver.track ? new MediaStreamTrack(t.receiver.track) : null;\n const receiver = new RTCRtpReceiver({ ...t.receiver, track: remoteTrack });\n const transceiver = new RTCRtpTransceiver({\n ...result.transceiver,\n sender,\n receiver\n });\n\n this._insertTransceiverSorted(result.transceiverOrder, transceiver);\n\n return transceiver;\n }\n\n removeTrack(sender: RTCRtpSender) {\n log.debug(`${this._pcId} removeTrack`);\n\n if (this._pcId !== sender._peerConnectionId) {\n throw new Error('Sender does not belong to this peer connection');\n }\n\n if (this.connectionState === 'closed') {\n throw new Error('Peer Connection is closed');\n }\n\n const existingSender = this\n .getSenders()\n .find(s => s === sender);\n\n if (!existingSender) {\n throw new Error('Sender does not exist');\n }\n\n if (existingSender.track === null) {\n return;\n }\n\n // Blocking!\n WebRTCModule.peerConnectionRemoveTrack(this._pcId, sender.id);\n\n existingSender._track = null;\n\n const [ existingTransceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === existingSender.id);\n\n existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive';\n }\n\n async getStats(selector?: MediaStreamTrack) {\n log.debug(`${this._pcId} getStats`);\n\n if (!selector) {\n const data = await WebRTCModule.peerConnectionGetStats(this._pcId);\n\n /**\n * On both Android and iOS it is faster to construct a single\n * JSON string representing the Map of StatsReports and have it\n * pass through the React Native bridge rather than the Map of\n * StatsReports. While the implementations do try to be faster in\n * general, the stress is on being faster to pass through the React\n * Native bridge which is a bottleneck that tends to be visible in\n * the UI when there is congestion involving UI-related passing.\n */\n return new Map(JSON.parse(data));\n } else {\n const senders = this.getSenders().filter(s => s.track === selector);\n const receivers = this.getReceivers().filter(r => r.track === selector);\n const matches = senders.length + receivers.length;\n\n if (matches === 0) {\n throw new Error('Invalid selector: could not find matching sender / receiver');\n } else if (matches > 1) {\n throw new Error('Invalid selector: multiple matching senders / receivers');\n } else {\n const sr = senders[0] || receivers[0];\n\n return sr.getStats();\n }\n }\n }\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this._transceivers.map(e => e.transceiver);\n }\n\n getSenders(): RTCRtpSender[] {\n return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.sender);\n }\n\n getReceivers(): RTCRtpReceiver[] {\n return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.receiver);\n }\n\n close(): void {\n log.debug(`${this._pcId} close`);\n\n if (this.connectionState === 'closed') {\n return;\n }\n\n WebRTCModule.peerConnectionClose(this._pcId);\n\n // Mark transceivers as stopped.\n this._transceivers.forEach(({ transceiver })=> {\n transceiver._setStopped();\n });\n }\n\n restartIce(): void {\n WebRTCModule.peerConnectionRestartIce(this._pcId);\n }\n\n _registerEvents(): void {\n addListener(this, 'peerConnectionOnRenegotiationNeeded', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n\n addListener(this, 'peerConnectionIceConnectionChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n this.iceConnectionState = ev.iceConnectionState;\n\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n addListener(this, 'peerConnectionStateChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n this.connectionState = ev.connectionState;\n\n this.dispatchEvent(new Event('connectionstatechange'));\n\n if (ev.connectionState === 'closed') {\n // This PeerConnection is done, clean up.\n removeListener(this);\n\n WebRTCModule.peerConnectionDispose(this._pcId);\n }\n });\n\n addListener(this, 'peerConnectionSignalingStateChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n this.signalingState = ev.signalingState;\n\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n // Consider moving away from this event: https://github.com/WebKit/WebKit/pull/3953\n addListener(this, 'peerConnectionOnTrack', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n log.debug(`${this._pcId} ontrack`);\n\n // NOTE: We need to make sure the track event fires right before sRD completes,\n // so we queue them up here and dispatch the events when sRD fires, but before completing it.\n // In the future we should probably implement out own logic and drop this event altogether.\n this._pendingTrackEvents.push(ev);\n });\n\n addListener(this, 'peerConnectionOnRemoveTrack', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n log.debug(`${this._pcId} onremovetrack ${ev.receiverId}`);\n\n const receiver = this.getReceivers().find(r => r.id === ev.receiverId);\n const track = receiver?.track;\n\n if (receiver && track) {\n // As per the spec:\n // - Remove the track from any media streams that were previously passed to the `track` event.\n // https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-removetrack,\n // - Mark the track as muted:\n // https://w3c.github.io/webrtc-pc/#process-remote-track-removal\n for (const stream of this._remoteStreams.values()) {\n if (stream._tracks.includes(track)) {\n const trackIdx = stream._tracks.indexOf(track);\n\n log.debug(`${this._pcId} removetrack ${track.id}`);\n\n stream._tracks.splice(trackIdx, 1);\n\n stream.dispatchEvent(new MediaStreamTrackEvent('removetrack', { track }));\n\n // Dispatch a mute event for the track.\n track._setMutedInternal(true);\n }\n }\n }\n });\n\n addListener(this, 'peerConnectionGotICECandidate', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const sdpInfo = ev.sdp;\n\n // Can happen when doing a rollback.\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n const candidate = new RTCIceCandidate(ev.candidate);\n\n this.dispatchEvent(new RTCIceCandidateEvent('icecandidate', { candidate }));\n });\n\n addListener(this, 'peerConnectionIceGatheringChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n this.iceGatheringState = ev.iceGatheringState;\n\n if (this.iceGatheringState === 'complete') {\n const sdpInfo = ev.sdp;\n\n // Can happen when doing a rollback.\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n this.dispatchEvent(new RTCIceCandidateEvent('icecandidate', { candidate: null }));\n }\n\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n addListener(this, 'peerConnectionDidOpenDataChannel', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const channel = new RTCDataChannel(ev.dataChannel);\n\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel }));\n\n // Send 'open' event. Native doesn't update the state since it's already\n // set at this point.\n channel.dispatchEvent(new RTCDataChannelEvent('open', { channel }));\n });\n\n addListener(this, 'mediaStreamTrackMuteChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const [\n track\n ] = this.getReceivers().map(r => r.track).filter(t => t?.id === ev.trackId);\n\n if (track) {\n track._setMutedInternal(ev.muted);\n }\n });\n }\n\n /**\n * Creates a new RTCDataChannel object with the given label. The\n * RTCDataChannelInit dictionary can be used to configure properties of the\n * underlying channel such as data reliability.\n *\n * @param {string} label - the value with which the label attribute of the new\n * instance is to be initialized\n * @param {RTCDataChannelInit} dataChannelDict - an optional dictionary of\n * values with which to initialize corresponding attributes of the new\n * instance such as id\n */\n createDataChannel(label: string, dataChannelDict?: RTCDataChannelInit): RTCDataChannel {\n if (arguments.length === 0) {\n throw new TypeError('1 argument required, but 0 present');\n }\n\n if (dataChannelDict && 'id' in dataChannelDict) {\n const id = dataChannelDict.id;\n\n if (typeof id !== 'number') {\n throw new TypeError('DataChannel id must be a number: ' + id);\n }\n }\n\n const channelInfo = WebRTCModule.createDataChannel(this._pcId, String(label), dataChannelDict);\n\n if (channelInfo === null) {\n throw new TypeError('Failed to create new DataChannel');\n }\n\n return new RTCDataChannel(channelInfo);\n }\n\n /**\n * Check whether a media stream track exists already in a sender.\n * See https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack for more information\n */\n _trackExists(track: MediaStreamTrack): boolean {\n const [ sender ] = this\n .getSenders()\n .filter(\n sender => sender.track?.id === track.id\n );\n\n return sender? true : false;\n }\n\n /**\n * Updates transceivers after offer/answer updates if necessary.\n */\n _updateTransceivers(transceiverUpdates, removeStopped = false) {\n for (const update of transceiverUpdates) {\n const [ transceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === update.transceiverId);\n\n if (!transceiver) {\n continue;\n }\n\n if (update.currentDirection) {\n transceiver._currentDirection = update.currentDirection;\n }\n\n transceiver._mid = update.mid;\n transceiver._stopped = Boolean(update.isStopped);\n transceiver._sender._rtpParameters = new RTCRtpSendParameters(update.senderRtpParameters);\n transceiver._receiver._rtpParameters = new RTCRtpReceiveParameters(update.receiverRtpParameters);\n }\n\n if (removeStopped) {\n const stopped = this.getTransceivers().filter(t => t.stopped);\n const newTransceivers = this._transceivers.filter(t => !stopped.includes(t.transceiver));\n\n this._transceivers = newTransceivers;\n }\n }\n\n /**\n * Inserts transceiver into the transceiver array in the order they are created (timestamp).\n * @param order an index that refers to when it it was created relatively.\n * @param transceiver the transceiver object to be inserted.\n */\n _insertTransceiverSorted(order: number, transceiver: RTCRtpTransceiver) {\n this._transceivers.push({ order, transceiver });\n this._transceivers.sort((a, b) => a.order - b.order);\n }\n}\n\n/**\n * Define the `onxxx` event handlers.\n */\nconst proto = RTCPeerConnection.prototype;\n\ndefineEventAttribute(proto, 'connectionstatechange');\ndefineEventAttribute(proto, 'icecandidate');\ndefineEventAttribute(proto, 'icecandidateerror');\ndefineEventAttribute(proto, 'iceconnectionstatechange');\ndefineEventAttribute(proto, 'icegatheringstatechange');\ndefineEventAttribute(proto, 'negotiationneeded');\ndefineEventAttribute(proto, 'signalingstatechange');\ndefineEventAttribute(proto, 'datachannel');\ndefineEventAttribute(proto, 'track');\ndefineEventAttribute(proto, 'error');\n"],"mappings":";AAAA,SAASA,WAAW,EAAEC,KAAK,EAAEC,oBAAoB,QAAQ,yBAAyB;AAClF,SAASC,aAAa,QAAQ,cAAc;AAE5C,SAASC,WAAW,EAAEC,cAAc,QAAQ,gBAAgB;AAC5D,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAOC,WAAW,MAAM,eAAe;AACvC,OAAOC,gBAAgB,MAAM,oBAAoB;AACjD,OAAOC,qBAAqB,MAAM,yBAAyB;AAC3D,OAAOC,cAAc,MAAM,kBAAkB;AAC7C,OAAOC,mBAAmB,MAAM,uBAAuB;AACvD,OAAOC,eAAe,MAAM,mBAAmB;AAC/C,OAAOC,oBAAoB,MAAM,wBAAwB;AACzD,OAAOC,uBAAuB,MAAM,2BAA2B;AAC/D,OAAOC,cAAc,MAAM,kBAAkB;AAC7C,OAAOC,oBAAoB,MAAM,wBAAwB;AACzD,OAAOC,YAAY,MAAM,gBAAgB;AACzC,OAAOC,iBAAiB,MAAM,qBAAqB;AACnD,OAAOC,qBAAqB,MAAqC,yBAAyB;AAC1F,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,OAAO,MAAM,WAAW;AAGpC,MAAMC,GAAG,GAAG,IAAIhB,MAAM,CAAC,IAAI,CAAC;AAC5B,MAAM;EAAEiB;AAAa,CAAC,GAAGpB,aAAa;AAqDtC,IAAIqB,oBAAoB,GAAG,CAAC;AAE5B,eAAe,MAAMC,iBAAiB,SAASzB,WAAW,CAA4B;EAalF0B,WAAWA,CAACC,aAAgC,EAAE;IAC1C,KAAK,CAAC,CAAC;IAACC,eAAA,2BAbqC,IAAI;IAAAA,eAAA,4BACH,IAAI;IAAAA,eAAA,yBAClB,QAAQ;IAAAA,eAAA,4BACF,KAAK;IAAAA,eAAA,0BACL,KAAK;IAAAA,eAAA,6BACH,KAAK;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAU7C,IAAI,CAACC,KAAK,GAAGL,oBAAoB,EAAE;;IAEnC;IACA,IAAIG,aAAa,EAAE;MAAA,IAAAG,qBAAA;MACf,MAAMC,OAAO,IAAAD,qBAAA,GAAGH,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEK,UAAU,cAAAF,qBAAA,cAAAA,qBAAA,GAAI,EAAE;MAE/C,KAAK,MAAMG,MAAM,IAAIF,OAAO,EAAE;QAC1B,IAAIG,IAAI,GAAGD,MAAM,CAACE,GAAG,IAAIF,MAAM,CAACC,IAAI;QAEpC,OAAOD,MAAM,CAACE,GAAG;QACjB,OAAOF,MAAM,CAACC,IAAI;QAElB,IAAI,CAACA,IAAI,EAAE;UACP;QACJ;QAEA,IAAI,CAACE,KAAK,CAACC,OAAO,CAACH,IAAI,CAAC,EAAE;UACtBA,IAAI,GAAG,CAAEA,IAAI,CAAE;QACnB;;QAEA;QACAD,MAAM,CAACC,IAAI,GAAGA,IAAI,CAACI,GAAG,CAACH,GAAG,IAAIA,GAAG,CAACI,WAAW,CAAC,CAAC,CAAC;MACpD;;MAEA;MACAZ,aAAa,CAACK,UAAU,GAAGD,OAAO,CAACS,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACP,IAAI,CAAC;IAC1D;IAEA,IAAI,CAACX,YAAY,CAACmB,kBAAkB,CAACf,aAAa,EAAE,IAAI,CAACE,KAAK,CAAC,EAAE;MAC7D,MAAM,IAAIc,KAAK,CAAC,6DAA6D,CAAC;IAClF;IAEA,IAAI,CAACC,aAAa,GAAG,EAAE;IACvB,IAAI,CAACC,cAAc,GAAG,IAAIC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAACC,mBAAmB,GAAG,EAAE;IAE7B,IAAI,CAACC,eAAe,CAAC,CAAC;IAEtB1B,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,OAAM,CAAC;EACnC;EAEA,MAAMqB,WAAWA,CAACC,OAAwB,EAAE;IACxC7B,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,cAAa,CAAC;IAEtC,MAAM;MACFuB,OAAO;MACPC,eAAe;MACfC;IACJ,CAAC,GAAG,MAAM/B,YAAY,CAACgC,yBAAyB,CAAC,IAAI,CAAC1B,KAAK,EAAER,OAAO,CAACmC,qBAAqB,CAACL,OAAO,CAAC,CAAC;IAEpG7B,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,iBAAgB,CAAC;IAEzCwB,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAEI,OAAO,CAACC,CAAC,IAAI;MAC1B,MAAM;QAAEC,gBAAgB;QAAEC;MAAY,CAAC,GAAGF,CAAC;MAC3C,MAAMG,SAAS,GAAG,IAAI5C,YAAY,CAAC;QAAE,GAAG2C,WAAW,CAACE,MAAM;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAC1E,MAAMC,WAAW,GACXJ,WAAW,CAACK,QAAQ,CAACF,KAAK,GAAG,IAAIvD,gBAAgB,CAACoD,WAAW,CAACK,QAAQ,CAACF,KAAK,CAAC,GAAG,IAAI;MAC1F,MAAMG,WAAW,GAAG,IAAInD,cAAc,CAAC;QAAE,GAAG6C,WAAW,CAACK,QAAQ;QAAEF,KAAK,EAAEC;MAAY,CAAC,CAAC;MACvF,MAAMG,cAAc,GAAG,IAAIjD,iBAAiB,CAAC;QACzC,GAAG0C,WAAW;QACdE,MAAM,EAAED,SAAS;QACjBI,QAAQ,EAAEC;MACd,CAAC,CAAC;MAEF,IAAI,CAACE,wBAAwB,CAACT,gBAAgB,EAAEQ,cAAc,CAAC;IACnE,CAAC,CAAC;IAEF,IAAI,CAACE,mBAAmB,CAACf,gBAAgB,CAAC;IAE1C,OAAOF,OAAO;EAClB;EAEA,MAAMkB,YAAYA,CAAA,EAAG;IACjBhD,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,eAAc,CAAC;IAEvC,MAAM;MACFuB,OAAO;MACPE;IACJ,CAAC,GAAG,MAAM/B,YAAY,CAACgD,0BAA0B,CAAC,IAAI,CAAC1C,KAAK,EAAE,CAAC,CAAC,CAAC;IAEjE,IAAI,CAACwC,mBAAmB,CAACf,gBAAgB,CAAC;IAE1C,OAAOF,OAAO;EAClB;EAEAoB,gBAAgBA,CAAC7C,aAAa,EAAQ;IAClCJ,YAAY,CAACkD,8BAA8B,CAAC9C,aAAa,EAAE,IAAI,CAACE,KAAK,CAAC;EAC1E;EAEA,MAAM6C,mBAAmBA,CAACC,kBAAsE,EAAiB;IAAA,IAAAC,KAAA;IAC7GtD,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,sBAAqB,CAAC;IAE9C,IAAIgD,IAAI;IAER,IAAIF,kBAAkB,EAAE;MAAA,IAAAG,qBAAA;MACpBD,IAAI,GAAG;QACHE,IAAI,EAAEJ,kBAAkB,CAACI,IAAI;QAC7BC,GAAG,GAAAF,qBAAA,GAAEH,kBAAkB,CAACK,GAAG,cAAAF,qBAAA,cAAAA,qBAAA,GAAI;MACnC,CAAC;MAED,IAAI,CAACzD,OAAO,CAAC4D,cAAc,CAACJ,IAAI,CAACE,IAAI,CAAC,EAAE;QACpC,MAAM,IAAIpC,KAAK,CAAE,8CAA6CkC,IAAI,CAACE,IAAK,EAAC,CAAC;MAC9E;IACJ,CAAC,MAAM;MACHF,IAAI,GAAG,IAAI;IACf;IAEA,MAAM;MACFzB,OAAO;MACPE;IACJ,CAAC,GAAG,MAAM/B,YAAY,CAAC2D,iCAAiC,CAAC,IAAI,CAACrD,KAAK,EAAEgD,IAAI,CAAC;IAE1E,IAAIzB,OAAO,CAAC2B,IAAI,IAAI3B,OAAO,CAAC4B,GAAG,EAAE;MAC7B,IAAI,CAACG,gBAAgB,GAAG,IAAIhE,qBAAqB,CAACiC,OAAO,CAAC;IAC9D,CAAC,MAAM;MACH,IAAI,CAAC+B,gBAAgB,GAAG,IAAI;IAChC;IAEA,IAAI,CAACd,mBAAmB,CAACf,gBAAgB,EAAE,mBAAoB,EAAAsB,KAAA,GAAAC,IAAI,cAAAD,KAAA,uBAAJA,KAAA,CAAMG,IAAI,MAAK,QAAQ,CAAC;IAEvFzD,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,yBAAwB,CAAC;EACrD;EAEA,MAAMuD,oBAAoBA,CAACT,kBAAqE,EAAiB;IAAA,IAAAU,sBAAA,EAAAC,UAAA;IAC7GhE,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,uBAAsB,CAAC;IAE/C,IAAI,CAAC8C,kBAAkB,EAAE;MACrB,OAAOY,OAAO,CAACC,MAAM,CAAC,IAAI7C,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvE;IAEA,MAAMkC,IAAI,GAAG;MACTE,IAAI,EAAEJ,kBAAkB,CAACI,IAAI;MAC7BC,GAAG,GAAAK,sBAAA,GAAEV,kBAAkB,CAACK,GAAG,cAAAK,sBAAA,cAAAA,sBAAA,GAAI;IACnC,CAAC;IAED,IAAI,CAAChE,OAAO,CAAC4D,cAAc,EAAAK,UAAA,GAACT,IAAI,CAACE,IAAI,cAAAO,UAAA,cAAAA,UAAA,GAAI,EAAE,CAAC,EAAE;MAC1C,MAAM,IAAI3C,KAAK,CAAE,8CAA6CkC,IAAI,CAACE,IAAK,EAAC,CAAC;IAC9E;IAEA,MAAM;MACF3B,OAAO;MACPC,eAAe;MACfC;IACJ,CAAC,GAAG,MAAM/B,YAAY,CAACkE,kCAAkC,CAAC,IAAI,CAAC5D,KAAK,EAAEgD,IAAI,CAAC;IAE3E,IAAIzB,OAAO,CAAC2B,IAAI,IAAI3B,OAAO,CAAC4B,GAAG,EAAE;MAC7B,IAAI,CAACU,iBAAiB,GAAG,IAAIvE,qBAAqB,CAACiC,OAAO,CAAC;IAC/D,CAAC,MAAM;MACH,IAAI,CAACsC,iBAAiB,GAAG,IAAI;IACjC;IAEArC,eAAe,aAAfA,eAAe,uBAAfA,eAAe,CAAEI,OAAO,CAACC,CAAC,IAAI;MAC1B,MAAM;QAAEC,gBAAgB;QAAEC;MAAY,CAAC,GAAGF,CAAC;MAC3C,MAAMG,SAAS,GAAG,IAAI5C,YAAY,CAAC;QAAE,GAAG2C,WAAW,CAACE,MAAM;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAC1E,MAAMC,WAAW,GACXJ,WAAW,CAACK,QAAQ,CAACF,KAAK,GAAG,IAAIvD,gBAAgB,CAACoD,WAAW,CAACK,QAAQ,CAACF,KAAK,CAAC,GAAG,IAAI;MAC1F,MAAMG,WAAW,GAAG,IAAInD,cAAc,CAAC;QAAE,GAAG6C,WAAW,CAACK,QAAQ;QAAEF,KAAK,EAAEC;MAAY,CAAC,CAAC;MACvF,MAAMG,cAAc,GAAG,IAAIjD,iBAAiB,CAAC;QACzC,GAAG0C,WAAW;QACdE,MAAM,EAAED,SAAS;QACjBI,QAAQ,EAAEC;MACd,CAAC,CAAC;MAEF,IAAI,CAACE,wBAAwB,CAACT,gBAAgB,EAAEQ,cAAc,CAAC;IACnE,CAAC,CAAC;IAEF,IAAI,CAACE,mBAAmB,CAACf,gBAAgB,EAAE,mBAAoBuB,IAAI,CAACE,IAAI,KAAK,QAAQ,CAAC;;IAEtF;IACA,MAAMY,kBAAkB,GAAG,IAAI,CAAC5C,mBAAmB;IAEnD,IAAI,CAACA,mBAAmB,GAAG,EAAE;IAE7B,KAAK,MAAM6C,EAAE,IAAID,kBAAkB,EAAE;MACjC,MAAM,CAAE/B,WAAW,CAAE,GAAG,IAAI,CACvBiC,eAAe,CAAC,CAAC,CACjBrD,MAAM,CAACkB,CAAC,IAAIA,CAAC,CAACO,QAAQ,CAAC6B,EAAE,KAAMF,EAAE,CAAC3B,QAAQ,CAAC6B,EAAE,CAAC;;MAEnD;MACA;MACA;;MAEA;MACA,MAAM/B,KAAuB,GAAGH,WAAW,CAACK,QAAQ,CAACF,KAAK;MAE1DH,WAAW,CAACmC,IAAI,GAAGH,EAAE,CAAChC,WAAW,CAACoC,GAAG;MACrCpC,WAAW,CAACqC,iBAAiB,GAAGL,EAAE,CAAChC,WAAW,CAACsC,gBAAgB;MAC/DtC,WAAW,CAACuC,UAAU,GAAGP,EAAE,CAAChC,WAAW,CAACwC,SAAS;;MAEjD;MACA,MAAMC,OAAsB,GAAGT,EAAE,CAACS,OAAO,CAAC/D,GAAG,CAACgE,UAAU,IAAI;QACxD;QACA;QACA,IAAI,CAAC,IAAI,CAACzD,cAAc,CAAC0D,GAAG,CAACD,UAAU,CAACE,QAAQ,CAAC,EAAE;UAC/C,MAAMC,MAAM,GAAG,IAAIlG,WAAW,CAAC;YAC3BiG,QAAQ,EAAEF,UAAU,CAACE,QAAQ;YAC7BE,cAAc,EAAEJ,UAAU,CAACI,cAAc;YACzCC,MAAM,EAAE;UACZ,CAAC,CAAC;UAEF,IAAI,CAAC9D,cAAc,CAAC+D,GAAG,CAACN,UAAU,CAACE,QAAQ,EAAEC,MAAM,CAAC;QACxD;QAEA,MAAMA,MAAM,GAAG,IAAI,CAAC5D,cAAc,CAACgE,GAAG,CAACP,UAAU,CAACE,QAAQ,CAAC;QAE3D,IAAI,EAACC,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEK,OAAO,CAACC,QAAQ,CAAChD,KAAK,CAAC,GAAE;UAClC0C,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEK,OAAO,CAACE,IAAI,CAACjD,KAAK,CAAC;QAC/B;QAEA,OAAO0C,MAAM;MACjB,CAAC,CAAC;MAEF,MAAMQ,SAAS,GAAG;QACdZ,OAAO;QACPzC,WAAW;QACXG,KAAK;QACLE,QAAQ,EAAEL,WAAW,CAACK;MAC1B,CAAC;MAGD,IAAI,CAACiD,aAAa,CAAC,IAAI9F,aAAa,CAAC,OAAO,EAAE6F,SAAS,CAAC,CAAC;MAEzDZ,OAAO,CAAC5C,OAAO,CAACgD,MAAM,IAAI;QACtBA,MAAM,CAACS,aAAa,CAAC,IAAIzG,qBAAqB,CAAC,UAAU,EAAE;UAAEsD;QAAM,CAAC,CAAC,CAAC;MAC1E,CAAC,CAAC;;MAEF;MACAA,KAAK,CAACoD,iBAAiB,CAAC,KAAK,CAAC;IAClC;IAEA7F,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,0BAAyB,CAAC;EACtD;EAEA,MAAMuF,eAAeA,CAACC,SAAS,EAAiB;IAC5C/F,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,kBAAiB,CAAC;IAE1C,IAAI,CAACwF,SAAS,IAAI,CAACA,SAAS,CAACA,SAAS,EAAE;MACpC;MACA;IACJ;IAEA,IAAI,CAACA,SAAS,CAACC,aAAa,KAAK,IAAI,IAChCD,SAAS,CAACC,aAAa,KAAKC,SAAS,MACrCF,SAAS,CAACG,MAAM,KAAK,IAAI,IACzBH,SAAS,CAACG,MAAM,KAAKD,SAAS,CAAC,EAClC;MACE,MAAM,IAAIE,SAAS,CAAC,iEAAiE,CAAC;IAC1F;IAEA,MAAMC,MAAM,GAAG,MAAMnG,YAAY,CAACoG,6BAA6B,CAC3D,IAAI,CAAC9F,KAAK,EACVR,OAAO,CAACuG,SAAS,CAACP,SAAS,CAC/B,CAAC;IAED,IAAI,CAAC3B,iBAAiB,GAAG,IAAIvE,qBAAqB,CAACuG,MAAM,CAAC;EAC9D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACIG,QAAQA,CAAC9D,KAAuB,EAA2C;IACvEzC,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,WAAU,CAAC;IAEnC,IAAI,IAAI,CAACiG,eAAe,KAAK,QAAQ,EAAE;MACnC,MAAM,IAAInF,KAAK,CAAC,2BAA2B,CAAC;IAChD;IAEA,IAAI,IAAI,CAACoF,YAAY,CAAChE,KAAK,CAAC,EAAE;MAC1B,MAAM,IAAIpB,KAAK,CAAC,kCAAkC,CAAC;IACvD;IAAC,SAAAqF,IAAA,GAAAC,SAAA,CAAAC,MAAA,EATgC7B,OAAO,OAAAjE,KAAA,CAAA4F,IAAA,OAAAA,IAAA,WAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;MAAP9B,OAAO,CAAA8B,IAAA,QAAAF,SAAA,CAAAE,IAAA;IAAA;IAWxC,MAAMC,SAAS,GAAG/B,OAAO,CAAC/D,GAAG,CAACG,CAAC,IAAIA,CAAC,CAACqD,EAAE,CAAC;IACxC,MAAMuC,MAAM,GAAG9G,YAAY,CAAC+G,sBAAsB,CAAC,IAAI,CAACzG,KAAK,EAAEkC,KAAK,CAAC+B,EAAE,EAAE;MAAEsC;IAAU,CAAC,CAAC;IAEvF,IAAIC,MAAM,KAAK,IAAI,EAAE;MACjB,MAAM,IAAI1F,KAAK,CAAC,sBAAsB,CAAC;IAC3C;IAEA,MAAM;MAAEgB,gBAAgB;MAAEC,WAAW;MAAEE;IAAO,CAAC,GAAGuE,MAAM;;IAExD;IACA;IACA,MAAM,CAAEE,cAAc,CAAE,GAAG,IAAI,CAC1BC,UAAU,CAAC,CAAC,CACZhG,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACqD,EAAE,KAAKhC,MAAM,CAACgC,EAAE,CAAC;IAEpC,IAAIyC,cAAc,EAAE;MAChB;MACAA,cAAc,CAACE,MAAM,GAAG1E,KAAK;;MAE7B;MACA,MAAM,CAAE2E,mBAAmB,CAAE,GAAG,IAAI,CAC/B7C,eAAe,CAAC,CAAC,CACjBrD,MAAM,CAACkB,CAAC,IAAIA,CAAC,CAACI,MAAM,CAACgC,EAAE,KAAKyC,cAAc,CAACzC,EAAE,CAAC;MAEnD4C,mBAAmB,CAACvC,UAAU,GAAGvC,WAAW,CAACwC,SAAS;MACtDsC,mBAAmB,CAACzC,iBAAiB,GAAGrC,WAAW,CAACsC,gBAAgB;MAEpE,OAAOqC,cAAc;IACzB;;IAEA;IACA,MAAM1E,SAAS,GAAG,IAAI5C,YAAY,CAAC;MAAE,GAAG2C,WAAW,CAACE,MAAM;MAAEC;IAAM,CAAC,CAAC;IACpE,MAAMC,WAAW,GAAGJ,WAAW,CAACK,QAAQ,CAACF,KAAK,GAAG,IAAIvD,gBAAgB,CAACoD,WAAW,CAACK,QAAQ,CAACF,KAAK,CAAC,GAAG,IAAI;IACxG,MAAMG,WAAW,GAAG,IAAInD,cAAc,CAAC;MAAE,GAAG6C,WAAW,CAACK,QAAQ;MAAEF,KAAK,EAAEC;IAAY,CAAC,CAAC;IACvF,MAAMG,cAAc,GAAG,IAAIjD,iBAAiB,CAAC;MACzC,GAAG0C,WAAW;MACdE,MAAM,EAAED,SAAS;MACjBI,QAAQ,EAAEC;IACd,CAAC,CAAC;IAEF,IAAI,CAACE,wBAAwB,CAACT,gBAAgB,EAAEQ,cAAc,CAAC;IAE/D,OAAON,SAAS;EACpB;EAEA8E,cAAcA,CAACC,MAA4C,EAAEC,IAAI,EAAqB;IAClFvH,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,iBAAgB,CAAC;IAEzC,IAAIiH,GAAG,GAAG,CAAC,CAAC;IAEZ,IAAIF,MAAM,KAAK,OAAO,EAAE;MACpBE,GAAG,GAAG;QAAE/D,IAAI,EAAE;MAAQ,CAAC;IAC3B,CAAC,MAAM,IAAI6D,MAAM,KAAK,OAAO,EAAE;MAC3BE,GAAG,GAAG;QAAE/D,IAAI,EAAE;MAAQ,CAAC;IAC3B,CAAC,MAAM;MACH+D,GAAG,GAAG;QAAEC,OAAO,EAAEH,MAAM,CAAC9C;MAAG,CAAC;IAChC;;IAEA;IACA,IAAI+C,IAAI,IAAIA,IAAI,CAACxC,OAAO,EAAE;MACtBwC,IAAI,CAACT,SAAS,GAAGS,IAAI,CAACxC,OAAO,CAAC/D,GAAG,CAACmE,MAAM,IAAIA,MAAM,CAACX,EAAE,CAAC;IAC1D;IAEA,MAAMuC,MAAM,GAAG9G,YAAY,CAACyH,4BAA4B,CAAC,IAAI,CAACnH,KAAK,EAAE;MAAE,GAAGiH,GAAG;MAAED,IAAI,EAAE;QAAE,GAAGA;MAAK;IAAE,CAAC,CAAC;IAEnG,IAAIR,MAAM,KAAK,IAAI,EAAE;MACjB,MAAM,IAAI1F,KAAK,CAAC,gCAAgC,CAAC;IACrD;IAEA,MAAMe,CAAC,GAAG2E,MAAM,CAACzE,WAAW;IAC5B,IAAIG,KAA8B,GAAG,IAAI;IAEzC,IAAI,OAAO6E,MAAM,KAAK,QAAQ,EAAE;MAC5B,IAAIlF,CAAC,CAACI,MAAM,CAACC,KAAK,EAAE;QAChBA,KAAK,GAAG,IAAIvD,gBAAgB,CAACkD,CAAC,CAACI,MAAM,CAACC,KAAK,CAAC;MAChD;IACJ,CAAC,MAAM;MACH;MACAA,KAAK,GAAG6E,MAAM;IAClB;IAEA,MAAM9E,MAAM,GAAG,IAAI7C,YAAY,CAAC;MAAE,GAAGyC,CAAC,CAACI,MAAM;MAAEC;IAAM,CAAC,CAAC;IACvD,MAAMC,WAAW,GAAGN,CAAC,CAACO,QAAQ,CAACF,KAAK,GAAG,IAAIvD,gBAAgB,CAACkD,CAAC,CAACO,QAAQ,CAACF,KAAK,CAAC,GAAG,IAAI;IACpF,MAAME,QAAQ,GAAG,IAAIlD,cAAc,CAAC;MAAE,GAAG2C,CAAC,CAACO,QAAQ;MAAEF,KAAK,EAAEC;IAAY,CAAC,CAAC;IAC1E,MAAMJ,WAAW,GAAG,IAAI1C,iBAAiB,CAAC;MACtC,GAAGmH,MAAM,CAACzE,WAAW;MACrBE,MAAM;MACNG;IACJ,CAAC,CAAC;IAEF,IAAI,CAACG,wBAAwB,CAACiE,MAAM,CAAC1E,gBAAgB,EAAEC,WAAW,CAAC;IAEnE,OAAOA,WAAW;EACtB;EAEAqF,WAAWA,CAACnF,MAAoB,EAAE;IAC9BxC,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,cAAa,CAAC;IAEtC,IAAI,IAAI,CAACA,KAAK,KAAKiC,MAAM,CAACoF,iBAAiB,EAAE;MACzC,MAAM,IAAIvG,KAAK,CAAC,gDAAgD,CAAC;IACrE;IAEA,IAAI,IAAI,CAACmF,eAAe,KAAK,QAAQ,EAAE;MACnC,MAAM,IAAInF,KAAK,CAAC,2BAA2B,CAAC;IAChD;IAEA,MAAM4F,cAAc,GAAG,IAAI,CACtBC,UAAU,CAAC,CAAC,CACZW,IAAI,CAAC1G,CAAC,IAAIA,CAAC,KAAKqB,MAAM,CAAC;IAE5B,IAAI,CAACyE,cAAc,EAAE;MACjB,MAAM,IAAI5F,KAAK,CAAC,uBAAuB,CAAC;IAC5C;IAEA,IAAI4F,cAAc,CAACxE,KAAK,KAAK,IAAI,EAAE;MAC/B;IACJ;;IAEA;IACAxC,YAAY,CAAC6H,yBAAyB,CAAC,IAAI,CAACvH,KAAK,EAAEiC,MAAM,CAACgC,EAAE,CAAC;IAE7DyC,cAAc,CAACE,MAAM,GAAG,IAAI;IAE5B,MAAM,CAAEC,mBAAmB,CAAE,GAAG,IAAI,CAC/B7C,eAAe,CAAC,CAAC,CACjBrD,MAAM,CAACkB,CAAC,IAAIA,CAAC,CAACI,MAAM,CAACgC,EAAE,KAAKyC,cAAc,CAACzC,EAAE,CAAC;IAEnD4C,mBAAmB,CAACvC,UAAU,GAAGuC,mBAAmB,CAACtC,SAAS,KAAK,UAAU,GAAG,UAAU,GAAG,UAAU;EAC3G;EAEA,MAAMiD,QAAQA,CAACC,QAA2B,EAAE;IACxChI,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,WAAU,CAAC;IAEnC,IAAI,CAACyH,QAAQ,EAAE;MACX,MAAMC,IAAI,GAAG,MAAMhI,YAAY,CAACiI,sBAAsB,CAAC,IAAI,CAAC3H,KAAK,CAAC;;MAElE;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACY,OAAO,IAAIiB,GAAG,CAAC2G,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC,CAAC;IACpC,CAAC,MAAM;MACH,MAAMI,OAAO,GAAG,IAAI,CAACnB,UAAU,CAAC,CAAC,CAAChG,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACsB,KAAK,KAAKuF,QAAQ,CAAC;MACnE,MAAMM,SAAS,GAAG,IAAI,CAACC,YAAY,CAAC,CAAC,CAACrH,MAAM,CAACsH,CAAC,IAAIA,CAAC,CAAC/F,KAAK,KAAKuF,QAAQ,CAAC;MACvE,MAAMS,OAAO,GAAGJ,OAAO,CAACzB,MAAM,GAAG0B,SAAS,CAAC1B,MAAM;MAEjD,IAAI6B,OAAO,KAAK,CAAC,EAAE;QACf,MAAM,IAAIpH,KAAK,CAAC,6DAA6D,CAAC;MAClF,CAAC,MAAM,IAAIoH,OAAO,GAAG,CAAC,EAAE;QACpB,MAAM,IAAIpH,KAAK,CAAC,yDAAyD,CAAC;MAC9E,CAAC,MAAM;QACH,MAAMqH,EAAE,GAAGL,OAAO,CAAC,CAAC,CAAC,IAAIC,SAAS,CAAC,CAAC,CAAC;QAErC,OAAOI,EAAE,CAACX,QAAQ,CAAC,CAAC;MACxB;IACJ;EACJ;EAEAxD,eAAeA,CAAA,EAAwB;IACnC,OAAO,IAAI,CAACjD,aAAa,CAACN,GAAG,CAAC2H,CAAC,IAAIA,CAAC,CAACrG,WAAW,CAAC;EACrD;EAEA4E,UAAUA,CAAA,EAAmB;IACzB,OAAO,IAAI,CAAC5F,aAAa,CAACJ,MAAM,CAACyH,CAAC,IAAI,CAACA,CAAC,CAACrG,WAAW,CAACsG,OAAO,CAAC,CAAC5H,GAAG,CAAC2H,CAAC,IAAIA,CAAC,CAACrG,WAAW,CAACE,MAAM,CAAC;EAChG;EAEA+F,YAAYA,CAAA,EAAqB;IAC7B,OAAO,IAAI,CAACjH,aAAa,CAACJ,MAAM,CAACyH,CAAC,IAAI,CAACA,CAAC,CAACrG,WAAW,CAACsG,OAAO,CAAC,CAAC5H,GAAG,CAAC2H,CAAC,IAAIA,CAAC,CAACrG,WAAW,CAACK,QAAQ,CAAC;EAClG;EAEAkG,KAAKA,CAAA,EAAS;IACV7I,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,QAAO,CAAC;IAEhC,IAAI,IAAI,CAACiG,eAAe,KAAK,QAAQ,EAAE;MACnC;IACJ;IAEAvG,YAAY,CAAC6I,mBAAmB,CAAC,IAAI,CAACvI,KAAK,CAAC;;IAE5C;IACA,IAAI,CAACe,aAAa,CAACa,OAAO,CAAC4G,IAAA,IAAoB;MAAA,IAAnB;QAAEzG;MAAY,CAAC,GAAAyG,IAAA;MACvCzG,WAAW,CAAC0G,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;EACN;EAEAC,UAAUA,CAAA,EAAS;IACfhJ,YAAY,CAACiJ,wBAAwB,CAAC,IAAI,CAAC3I,KAAK,CAAC;EACrD;EAEAmB,eAAeA,CAAA,EAAS;IACpB5C,WAAW,CAAC,IAAI,EAAE,qCAAqC,EAAGwF,EAAO,IAAK;MAClE,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,IAAI,CAACqF,aAAa,CAAC,IAAIjH,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACtD,CAAC,CAAC;IAEFG,WAAW,CAAC,IAAI,EAAE,oCAAoC,EAAGwF,EAAO,IAAK;MACjE,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,IAAI,CAAC6I,kBAAkB,GAAG9E,EAAE,CAAC8E,kBAAkB;MAE/C,IAAI,CAACxD,aAAa,CAAC,IAAIjH,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEFG,WAAW,CAAC,IAAI,EAAE,4BAA4B,EAAGwF,EAAO,IAAK;MACzD,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,IAAI,CAACiG,eAAe,GAAGlC,EAAE,CAACkC,eAAe;MAEzC,IAAI,CAACZ,aAAa,CAAC,IAAIjH,KAAK,CAAC,uBAAuB,CAAC,CAAC;MAEtD,IAAI2F,EAAE,CAACkC,eAAe,KAAK,QAAQ,EAAE;QACjC;QACAzH,cAAc,CAAC,IAAI,CAAC;QAEpBkB,YAAY,CAACoJ,qBAAqB,CAAC,IAAI,CAAC9I,KAAK,CAAC;MAClD;IACJ,CAAC,CAAC;IAEFzB,WAAW,CAAC,IAAI,EAAE,qCAAqC,EAAGwF,EAAO,IAAK;MAClE,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,IAAI,CAAC+I,cAAc,GAAGhF,EAAE,CAACgF,cAAc;MAEvC,IAAI,CAAC1D,aAAa,CAAC,IAAIjH,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzD,CAAC,CAAC;;IAEF;IACAG,WAAW,CAAC,IAAI,EAAE,uBAAuB,EAAGwF,EAAO,IAAK;MACpD,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEAP,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,UAAS,CAAC;;MAElC;MACA;MACA;MACA,IAAI,CAACkB,mBAAmB,CAACiE,IAAI,CAACpB,EAAE,CAAC;IACrC,CAAC,CAAC;IAEFxF,WAAW,CAAC,IAAI,EAAE,6BAA6B,EAAGwF,EAAO,IAAK;MAC1D,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEAP,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,kBAAiB+D,EAAE,CAACiF,UAAW,EAAC,CAAC;MAEzD,MAAM5G,QAAQ,GAAG,IAAI,CAAC4F,YAAY,CAAC,CAAC,CAACV,IAAI,CAACW,CAAC,IAAIA,CAAC,CAAChE,EAAE,KAAKF,EAAE,CAACiF,UAAU,CAAC;MACtE,MAAM9G,KAAK,GAAGE,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEF,KAAK;MAE7B,IAAIE,QAAQ,IAAIF,KAAK,EAAE;QACnB;QACA;QACA;QACA;QACA;QACA,KAAK,MAAM0C,MAAM,IAAI,IAAI,CAAC5D,cAAc,CAACiI,MAAM,CAAC,CAAC,EAAE;UAC/C,IAAIrE,MAAM,CAACK,OAAO,CAACC,QAAQ,CAAChD,KAAK,CAAC,EAAE;YAChC,MAAMgH,QAAQ,GAAGtE,MAAM,CAACK,OAAO,CAACkE,OAAO,CAACjH,KAAK,CAAC;YAE9CzC,GAAG,CAAC2B,KAAK,CAAE,GAAE,IAAI,CAACpB,KAAM,gBAAekC,KAAK,CAAC+B,EAAG,EAAC,CAAC;YAElDW,MAAM,CAACK,OAAO,CAACmE,MAAM,CAACF,QAAQ,EAAE,CAAC,CAAC;YAElCtE,MAAM,CAACS,aAAa,CAAC,IAAIzG,qBAAqB,CAAC,aAAa,EAAE;cAAEsD;YAAM,CAAC,CAAC,CAAC;;YAEzE;YACAA,KAAK,CAACoD,iBAAiB,CAAC,IAAI,CAAC;UACjC;QACJ;MACJ;IACJ,CAAC,CAAC;IAEF/G,WAAW,CAAC,IAAI,EAAE,+BAA+B,EAAGwF,EAAO,IAAK;MAC5D,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,MAAMuB,OAAO,GAAGwC,EAAE,CAACZ,GAAG;;MAEtB;MACA,IAAI5B,OAAO,CAAC2B,IAAI,IAAI3B,OAAO,CAAC4B,GAAG,EAAE;QAC7B,IAAI,CAACG,gBAAgB,GAAG,IAAIhE,qBAAqB,CAACiC,OAAO,CAAC;MAC9D,CAAC,MAAM;QACH,IAAI,CAAC+B,gBAAgB,GAAG,IAAI;MAChC;MAEA,MAAMkC,SAAS,GAAG,IAAIzG,eAAe,CAACgF,EAAE,CAACyB,SAAS,CAAC;MAEnD,IAAI,CAACH,aAAa,CAAC,IAAIrG,oBAAoB,CAAC,cAAc,EAAE;QAAEwG;MAAU,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEFjH,WAAW,CAAC,IAAI,EAAE,mCAAmC,EAAGwF,EAAO,IAAK;MAChE,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,IAAI,CAACqJ,iBAAiB,GAAGtF,EAAE,CAACsF,iBAAiB;MAE7C,IAAI,IAAI,CAACA,iBAAiB,KAAK,UAAU,EAAE;QACvC,MAAM9H,OAAO,GAAGwC,EAAE,CAACZ,GAAG;;QAEtB;QACA,IAAI5B,OAAO,CAAC2B,IAAI,IAAI3B,OAAO,CAAC4B,GAAG,EAAE;UAC7B,IAAI,CAACG,gBAAgB,GAAG,IAAIhE,qBAAqB,CAACiC,OAAO,CAAC;QAC9D,CAAC,MAAM;UACH,IAAI,CAAC+B,gBAAgB,GAAG,IAAI;QAChC;QAEA,IAAI,CAAC+B,aAAa,CAAC,IAAIrG,oBAAoB,CAAC,cAAc,EAAE;UAAEwG,SAAS,EAAE;QAAK,CAAC,CAAC,CAAC;MACrF;MAEA,IAAI,CAACH,aAAa,CAAC,IAAIjH,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEFG,WAAW,CAAC,IAAI,EAAE,kCAAkC,EAAGwF,EAAO,IAAK;MAC/D,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,MAAMsJ,OAAO,GAAG,IAAIzK,cAAc,CAACkF,EAAE,CAACwF,WAAW,CAAC;MAElD,IAAI,CAAClE,aAAa,CAAC,IAAIvG,mBAAmB,CAAC,aAAa,EAAE;QAAEwK;MAAQ,CAAC,CAAC,CAAC;;MAEvE;MACA;MACAA,OAAO,CAACjE,aAAa,CAAC,IAAIvG,mBAAmB,CAAC,MAAM,EAAE;QAAEwK;MAAQ,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF/K,WAAW,CAAC,IAAI,EAAE,6BAA6B,EAAGwF,EAAO,IAAK;MAC1D,IAAIA,EAAE,CAAC6E,IAAI,KAAK,IAAI,CAAC5I,KAAK,EAAE;QACxB;MACJ;MAEA,MAAM,CACFkC,KAAK,CACR,GAAG,IAAI,CAAC8F,YAAY,CAAC,CAAC,CAACvH,GAAG,CAACwH,CAAC,IAAIA,CAAC,CAAC/F,KAAK,CAAC,CAACvB,MAAM,CAACkB,CAAC,IAAI,CAAAA,CAAC,aAADA,CAAC,uBAADA,CAAC,CAAEoC,EAAE,MAAKF,EAAE,CAACmD,OAAO,CAAC;MAE3E,IAAIhF,KAAK,EAAE;QACPA,KAAK,CAACoD,iBAAiB,CAACvB,EAAE,CAACyF,KAAK,CAAC;MACrC;IACJ,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACIC,iBAAiBA,CAACC,KAAa,EAAEC,eAAoC,EAAkB;IACnF,IAAIvD,SAAS,CAACC,MAAM,KAAK,CAAC,EAAE;MACxB,MAAM,IAAIT,SAAS,CAAC,oCAAoC,CAAC;IAC7D;IAEA,IAAI+D,eAAe,IAAI,IAAI,IAAIA,eAAe,EAAE;MAC5C,MAAM1F,EAAE,GAAG0F,eAAe,CAAC1F,EAAE;MAE7B,IAAI,OAAOA,EAAE,KAAK,QAAQ,EAAE;QACxB,MAAM,IAAI2B,SAAS,CAAC,mCAAmC,GAAG3B,EAAE,CAAC;MACjE;IACJ;IAEA,MAAM2F,WAAW,GAAGlK,YAAY,CAAC+J,iBAAiB,CAAC,IAAI,CAACzJ,KAAK,EAAE6J,MAAM,CAACH,KAAK,CAAC,EAAEC,eAAe,CAAC;IAE9F,IAAIC,WAAW,KAAK,IAAI,EAAE;MACtB,MAAM,IAAIhE,SAAS,CAAC,kCAAkC,CAAC;IAC3D;IAEA,OAAO,IAAI/G,cAAc,CAAC+K,WAAW,CAAC;EAC1C;;EAEA;AACJ;AACA;AACA;EACI1D,YAAYA,CAAChE,KAAuB,EAAW;IAC3C,MAAM,CAAED,MAAM,CAAE,GAAG,IAAI,CAClB0E,UAAU,CAAC,CAAC,CACZhG,MAAM,CACHsB,MAAM;MAAA,IAAA6H,aAAA;MAAA,OAAI,EAAAA,aAAA,GAAA7H,MAAM,CAACC,KAAK,cAAA4H,aAAA,uBAAZA,aAAA,CAAc7F,EAAE,MAAK/B,KAAK,CAAC+B,EAAE;IAAA,CAC3C,CAAC;IAEL,OAAOhC,MAAM,GAAE,IAAI,GAAG,KAAK;EAC/B;;EAEA;AACJ;AACA;EACIO,mBAAmBA,CAACuH,kBAAkB,EAAyB;IAAA,IAAvBC,aAAa,GAAA5D,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAV,SAAA,GAAAU,SAAA,MAAG,KAAK;IACzD,KAAK,MAAM6D,MAAM,IAAIF,kBAAkB,EAAE;MACrC,MAAM,CAAEhI,WAAW,CAAE,GAAG,IAAI,CACvBiC,eAAe,CAAC,CAAC,CACjBrD,MAAM,CAACkB,CAAC,IAAIA,CAAC,CAACI,MAAM,CAACgC,EAAE,KAAKgG,MAAM,CAACC,aAAa,CAAC;MAEtD,IAAI,CAACnI,WAAW,EAAE;QACd;MACJ;MAEA,IAAIkI,MAAM,CAAC5F,gBAAgB,EAAE;QACzBtC,WAAW,CAACqC,iBAAiB,GAAG6F,MAAM,CAAC5F,gBAAgB;MAC3D;MAEAtC,WAAW,CAACmC,IAAI,GAAG+F,MAAM,CAAC9F,GAAG;MAC7BpC,WAAW,CAACoI,QAAQ,GAAGC,OAAO,CAACH,MAAM,CAACI,SAAS,CAAC;MAChDtI,WAAW,CAACuI,OAAO,CAACC,cAAc,GAAG,IAAIpL,oBAAoB,CAAC8K,MAAM,CAACO,mBAAmB,CAAC;MACzFzI,WAAW,CAAC0I,SAAS,CAACF,cAAc,GAAG,IAAItL,uBAAuB,CAACgL,MAAM,CAACS,qBAAqB,CAAC;IACpG;IAEA,IAAIV,aAAa,EAAE;MACf,MAAM3B,OAAO,GAAG,IAAI,CAACrE,eAAe,CAAC,CAAC,CAACrD,MAAM,CAACkB,CAAC,IAAIA,CAAC,CAACwG,OAAO,CAAC;MAC7D,MAAM7G,eAAe,GAAG,IAAI,CAACT,aAAa,CAACJ,MAAM,CAACkB,CAAC,IAAI,CAACwG,OAAO,CAACnD,QAAQ,CAACrD,CAAC,CAACE,WAAW,CAAC,CAAC;MAExF,IAAI,CAAChB,aAAa,GAAGS,eAAe;IACxC;EACJ;;EAEA;AACJ;AACA;AACA;AACA;EACIe,wBAAwBA,CAACoI,KAAa,EAAE5I,WAA8B,EAAE;IACpE,IAAI,CAAChB,aAAa,CAACoE,IAAI,CAAC;MAAEwF,KAAK;MAAE5I;IAAY,CAAC,CAAC;IAC/C,IAAI,CAAChB,aAAa,CAAC6J,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACF,KAAK,GAAGG,CAAC,CAACH,KAAK,CAAC;EACxD;AACJ;;AAEA;AACA;AACA;AACA,MAAMI,KAAK,GAAGnL,iBAAiB,CAACoL,SAAS;AAEzC3M,oBAAoB,CAAC0M,KAAK,EAAE,uBAAuB,CAAC;AACpD1M,oBAAoB,CAAC0M,KAAK,EAAE,cAAc,CAAC;AAC3C1M,oBAAoB,CAAC0M,KAAK,EAAE,mBAAmB,CAAC;AAChD1M,oBAAoB,CAAC0M,KAAK,EAAE,0BAA0B,CAAC;AACvD1M,oBAAoB,CAAC0M,KAAK,EAAE,yBAAyB,CAAC;AACtD1M,oBAAoB,CAAC0M,KAAK,EAAE,mBAAmB,CAAC;AAChD1M,oBAAoB,CAAC0M,KAAK,EAAE,sBAAsB,CAAC;AACnD1M,oBAAoB,CAAC0M,KAAK,EAAE,aAAa,CAAC;AAC1C1M,oBAAoB,CAAC0M,KAAK,EAAE,OAAO,CAAC;AACpC1M,oBAAoB,CAAC0M,KAAK,EAAE,OAAO,CAAC"}
1
+ {"version":3,"names":["EventTarget","Event","defineEventAttribute","NativeModules","addListener","removeListener","Logger","MediaStream","MediaStreamTrack","MediaStreamTrackEvent","RTCDataChannel","RTCDataChannelEvent","RTCIceCandidate","RTCIceCandidateEvent","RTCRtpReceiveParameters","RTCRtpReceiver","RTCRtpSendParameters","RTCRtpSender","RTCRtpTransceiver","RTCSessionDescription","RTCTrackEvent","RTCUtil","log","WebRTCModule","nextPeerConnectionId","RTCPeerConnection","constructor","configuration","_defineProperty","_pcId","_configuration$iceSer","servers","iceServers","server","urls","url","Array","isArray","map","toLowerCase","filter","s","peerConnectionInit","Error","_transceivers","_remoteStreams","Map","_pendingTrackEvents","_registerEvents","debug","createOffer","options","_sdpInfo$sdp$length","_sdpInfo$sdp","_t0","Date","now","console","signalingState","connectionState","iceConnectionState","sdpInfo","newTransceivers","transceiversInfo","peerConnectionCreateOffer","normalizeOfferOptions","durationMs","sdpType","type","sdpLen","sdp","length","forEach","t","transceiverOrder","transceiver","newSender","sender","track","remoteTrack","receiver","newReceiver","newTransceiver","_insertTransceiverSorted","_updateTransceivers","createAnswer","_sdpInfo$sdp$length2","_sdpInfo$sdp2","peerConnectionCreateAnswer","setConfiguration","peerConnectionSetConfiguration","setLocalDescription","sessionDescription","_sessionDescription$s","_sessionDescription$s2","_desc","desc","_sessionDescription$s3","isSdpTypeValid","peerConnectionSetLocalDescription","localDescription","setRemoteDescription","_sessionDescription$s4","_sessionDescription$s5","_sessionDescription$s6","_desc$type","Promise","reject","peerConnectionSetRemoteDescription","remoteDescription","pendingTrackEvents","ev","getTransceivers","id","_mid","mid","_currentDirection","currentDirection","_direction","direction","streams","streamInfo","has","streamId","stream","streamReactTag","tracks","set","get","_tracks","includes","push","eventData","dispatchEvent","_setMutedInternal","pendingTrackEventsDispatched","addIceCandidate","candidate","protocol","sdpMid","sdpMLineIndex","empty","undefined","TypeError","newSdp","peerConnectionAddICECandidate","deepClone","addTrack","_trackExists","_len","arguments","_key","streamIds","result","peerConnectionAddTrack","existingSender","getSenders","_track","existingTransceiver","addTransceiver","source","init","src","trackId","peerConnectionAddTransceiver","removeTrack","_peerConnectionId","find","peerConnectionRemoveTrack","getStats","selector","data","peerConnectionGetStats","JSON","parse","senders","receivers","getReceivers","r","matches","sr","e","stopped","close","peerConnectionClose","_ref","_setStopped","restartIce","peerConnectionRestartIce","pcId","prev","current","iceGatheringState","peerConnectionDispose","_ev$receiver","_ev$receiver2","_ev$receiver2$track","_ev$streams$length","_ev$streams","receiverId","trackKind","kind","streamCount","pendingCount","values","trackIdx","indexOf","splice","_ev$candidate","_ev$candidate2","_ev$candidate3","channel","dataChannel","muted","createDataChannel","label","dataChannelDict","channelInfo","String","_sender$track","transceiverUpdates","removeStopped","update","transceiverId","_stopped","Boolean","isStopped","_sender","_rtpParameters","senderRtpParameters","_receiver","receiverRtpParameters","order","sort","a","b","proto","prototype"],"sources":["RTCPeerConnection.ts"],"sourcesContent":["import { EventTarget, Event, defineEventAttribute } from 'event-target-shim/index';\nimport { NativeModules } from 'react-native';\n\nimport { addListener, removeListener } from './EventEmitter';\nimport Logger from './Logger';\nimport MediaStream from './MediaStream';\nimport MediaStreamTrack from './MediaStreamTrack';\nimport MediaStreamTrackEvent from './MediaStreamTrackEvent';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDataChannelEvent from './RTCDataChannelEvent';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceCandidateEvent from './RTCIceCandidateEvent';\nimport RTCRtpReceiveParameters from './RTCRtpReceiveParameters';\nimport RTCRtpReceiver from './RTCRtpReceiver';\nimport RTCRtpSendParameters from './RTCRtpSendParameters';\nimport RTCRtpSender from './RTCRtpSender';\nimport RTCRtpTransceiver from './RTCRtpTransceiver';\nimport RTCSessionDescription, { RTCSessionDescriptionInit } from './RTCSessionDescription';\nimport RTCTrackEvent from './RTCTrackEvent';\nimport * as RTCUtil from './RTCUtil';\nimport { RTCOfferOptions } from './RTCUtil';\n\nconst log = new Logger('pc');\nconst { WebRTCModule } = NativeModules;\n\ntype RTCSignalingState =\n | 'stable'\n | 'have-local-offer'\n | 'have-remote-offer'\n | 'have-local-pranswer'\n | 'have-remote-pranswer'\n | 'closed';\n\ntype RTCIceGatheringState = 'new' | 'gathering' | 'complete';\n\ntype RTCPeerConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';\n\ntype RTCIceConnectionState = 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';\n\ntype RTCDataChannelInit = {\n ordered?: boolean,\n maxPacketLifeTime?: number,\n maxRetransmits?: number,\n protocol?: string,\n negotiated?: boolean,\n id?: number\n};\n\ntype RTCIceServer = {\n credential?: string,\n url?: string, // Deprecated.\n urls?: string | string[],\n username?: string\n};\n\ntype RTCConfiguration = {\n bundlePolicy?: 'balanced' | 'max-compat' | 'max-bundle',\n iceCandidatePoolSize?: number,\n iceServers?: RTCIceServer[],\n iceTransportPolicy?: 'all' | 'relay',\n rtcpMuxPolicy?: 'negotiate' | 'require'\n};\n\ntype RTCPeerConnectionEventMap = {\n connectionstatechange: Event<'connectionstatechange'>\n icecandidate: RTCIceCandidateEvent<'icecandidate'>\n icecandidateerror: RTCIceCandidateEvent<'icecandidateerror'>\n iceconnectionstatechange: Event<'iceconnectionstatechange'>\n icegatheringstatechange: Event<'icegatheringstatechange'>\n negotiationneeded: Event<'negotiationneeded'>\n signalingstatechange: Event<'signalingstatechange'>\n datachannel: RTCDataChannelEvent<'datachannel'>\n track: RTCTrackEvent<'track'>\n error: Event<'error'>\n}\n\nlet nextPeerConnectionId = 0;\n\nexport default class RTCPeerConnection extends EventTarget<RTCPeerConnectionEventMap> {\n localDescription: RTCSessionDescription | null = null;\n remoteDescription: RTCSessionDescription | null = null;\n signalingState: RTCSignalingState = 'stable';\n iceGatheringState: RTCIceGatheringState = 'new';\n connectionState: RTCPeerConnectionState = 'new';\n iceConnectionState: RTCIceConnectionState = 'new';\n\n _pcId: number;\n _transceivers: { order: number, transceiver: RTCRtpTransceiver }[];\n _remoteStreams: Map<string, MediaStream>;\n _pendingTrackEvents: any[];\n\n constructor(configuration?: RTCConfiguration) {\n super();\n\n this._pcId = nextPeerConnectionId++;\n\n // Sanitize ICE servers.\n if (configuration) {\n const servers = configuration?.iceServers ?? [];\n\n for (const server of servers) {\n let urls = server.url || server.urls;\n\n delete server.url;\n delete server.urls;\n\n if (!urls) {\n continue;\n }\n\n if (!Array.isArray(urls)) {\n urls = [ urls ];\n }\n\n // Native WebRTC does case sensitive parsing.\n server.urls = urls.map(url => url.toLowerCase());\n }\n\n // Filter out bogus servers.\n configuration.iceServers = servers.filter(s => s.urls);\n }\n\n if (!WebRTCModule.peerConnectionInit(configuration, this._pcId)) {\n throw new Error('Failed to initialize PeerConnection, check the native logs!');\n }\n\n this._transceivers = [];\n this._remoteStreams = new Map();\n this._pendingTrackEvents = [];\n\n this._registerEvents();\n\n log.debug(`${this._pcId} ctor`);\n }\n\n async createOffer(options?:RTCOfferOptions) {\n const _t0 = Date.now();\n console.log(`[RNWebRTC] pc:${this._pcId} create_offer_start`, {\n signalingState: this.signalingState,\n connectionState: this.connectionState,\n iceConnectionState: this.iceConnectionState,\n });\n log.debug(`${this._pcId} createOffer`);\n\n const {\n sdpInfo,\n newTransceivers,\n transceiversInfo\n } = await WebRTCModule.peerConnectionCreateOffer(this._pcId, RTCUtil.normalizeOfferOptions(options));\n\n console.log(`[RNWebRTC] pc:${this._pcId} create_offer_done`, {\n durationMs: Date.now() - _t0,\n sdpType: sdpInfo?.type,\n sdpLen: sdpInfo?.sdp?.length ?? 0,\n });\n log.debug(`${this._pcId} createOffer OK`);\n\n newTransceivers?.forEach(t => {\n const { transceiverOrder, transceiver } = t;\n const newSender = new RTCRtpSender({ ...transceiver.sender, track: null });\n const remoteTrack\n = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n });\n\n this._updateTransceivers(transceiversInfo);\n\n return sdpInfo;\n }\n\n async createAnswer() {\n const _t0 = Date.now();\n console.log(`[RNWebRTC] pc:${this._pcId} create_answer_start`, {\n signalingState: this.signalingState,\n connectionState: this.connectionState,\n });\n log.debug(`${this._pcId} createAnswer`);\n\n const {\n sdpInfo,\n transceiversInfo\n } = await WebRTCModule.peerConnectionCreateAnswer(this._pcId, {});\n\n console.log(`[RNWebRTC] pc:${this._pcId} create_answer_done`, {\n durationMs: Date.now() - _t0,\n sdpType: sdpInfo?.type,\n sdpLen: sdpInfo?.sdp?.length ?? 0,\n });\n\n this._updateTransceivers(transceiversInfo);\n\n return sdpInfo;\n }\n\n setConfiguration(configuration): void {\n WebRTCModule.peerConnectionSetConfiguration(configuration, this._pcId);\n }\n\n async setLocalDescription(sessionDescription?: RTCSessionDescription | RTCSessionDescriptionInit): Promise<void> {\n const _t0 = Date.now();\n console.log(`[RNWebRTC] pc:${this._pcId} set_local_desc_start`, {\n type: sessionDescription?.type,\n sdpLen: sessionDescription?.sdp?.length ?? 0,\n signalingState: this.signalingState,\n });\n log.debug(`${this._pcId} setLocalDescription`);\n\n let desc;\n\n if (sessionDescription) {\n desc = {\n type: sessionDescription.type,\n sdp: sessionDescription.sdp ?? ''\n };\n\n if (!RTCUtil.isSdpTypeValid(desc.type)) {\n throw new Error(`Invalid session description: invalid type: ${desc.type}`);\n }\n } else {\n desc = null;\n }\n\n const {\n sdpInfo,\n transceiversInfo\n } = await WebRTCModule.peerConnectionSetLocalDescription(this._pcId, desc);\n\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n this._updateTransceivers(transceiversInfo, /* removeStopped */ desc?.type === 'answer');\n\n console.log(`[RNWebRTC] pc:${this._pcId} set_local_desc_done`, {\n durationMs: Date.now() - _t0,\n signalingState: this.signalingState,\n });\n log.debug(`${this._pcId} setLocalDescription OK`);\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescription | RTCSessionDescriptionInit): Promise<void> {\n const _t0 = Date.now();\n console.log(`[RNWebRTC] pc:${this._pcId} set_remote_desc_start`, {\n type: sessionDescription?.type,\n sdpLen: sessionDescription?.sdp?.length ?? 0,\n signalingState: this.signalingState,\n connectionState: this.connectionState,\n });\n log.debug(`${this._pcId} setRemoteDescription`);\n\n if (!sessionDescription) {\n return Promise.reject(new Error('No session description provided'));\n }\n\n const desc = {\n type: sessionDescription.type,\n sdp: sessionDescription.sdp ?? ''\n };\n\n if (!RTCUtil.isSdpTypeValid(desc.type ?? '')) {\n throw new Error(`Invalid session description: invalid type: ${desc.type}`);\n }\n\n const {\n sdpInfo,\n newTransceivers,\n transceiversInfo\n } = await WebRTCModule.peerConnectionSetRemoteDescription(this._pcId, desc);\n\n if (sdpInfo.type && sdpInfo.sdp) {\n this.remoteDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.remoteDescription = null;\n }\n\n newTransceivers?.forEach(t => {\n const { transceiverOrder, transceiver } = t;\n const newSender = new RTCRtpSender({ ...transceiver.sender, track: null });\n const remoteTrack\n = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n });\n\n this._updateTransceivers(transceiversInfo, /* removeStopped */ desc.type === 'answer');\n\n // Fire track events. They must fire before sRD resolves.\n const pendingTrackEvents = this._pendingTrackEvents;\n\n this._pendingTrackEvents = [];\n\n for (const ev of pendingTrackEvents) {\n const [ transceiver ] = this\n .getTransceivers()\n .filter(t => t.receiver.id === ev.receiver.id);\n\n // We need to fire this event for an existing track sometimes, like\n // when the transceiver direction (on the sending side) switches from\n // sendrecv to recvonly and then back.\n\n // @ts-ignore\n const track: MediaStreamTrack = transceiver.receiver.track;\n\n transceiver._mid = ev.transceiver.mid;\n transceiver._currentDirection = ev.transceiver.currentDirection;\n transceiver._direction = ev.transceiver.direction;\n\n // Get the stream object from the event. Create if necessary.\n const streams: MediaStream[] = ev.streams.map(streamInfo => {\n // Here we are making sure that we don't create stream objects that already exist\n // So that event listeners do get the same object if it has been created before.\n if (!this._remoteStreams.has(streamInfo.streamId)) {\n const stream = new MediaStream({\n streamId: streamInfo.streamId,\n streamReactTag: streamInfo.streamReactTag,\n tracks: []\n });\n\n this._remoteStreams.set(streamInfo.streamId, stream);\n }\n\n const stream = this._remoteStreams.get(streamInfo.streamId);\n\n if (!stream?._tracks.includes(track)) {\n stream?._tracks.push(track);\n }\n\n return stream;\n });\n\n const eventData = {\n streams,\n transceiver,\n track,\n receiver: transceiver.receiver\n };\n\n\n this.dispatchEvent(new RTCTrackEvent('track', eventData));\n\n streams.forEach(stream => {\n stream.dispatchEvent(new MediaStreamTrackEvent('addtrack', { track }));\n });\n\n // Dispatch an unmute event for the track.\n track._setMutedInternal(false);\n }\n\n console.log(`[RNWebRTC] pc:${this._pcId} set_remote_desc_done`, {\n durationMs: Date.now() - _t0,\n signalingState: this.signalingState,\n pendingTrackEventsDispatched: this._pendingTrackEvents.length,\n });\n log.debug(`${this._pcId} setRemoteDescription OK`);\n }\n\n async addIceCandidate(candidate): Promise<void> {\n console.log(`[RNWebRTC] pc:${this._pcId} add_ice_candidate`, {\n type: candidate?.type,\n protocol: candidate?.protocol,\n sdpMid: candidate?.sdpMid,\n sdpMLineIndex: candidate?.sdpMLineIndex,\n empty: !candidate?.candidate,\n signalingState: this.signalingState,\n connectionState: this.connectionState,\n iceConnectionState: this.iceConnectionState,\n });\n log.debug(`${this._pcId} addIceCandidate`);\n\n if (!candidate || !candidate.candidate) {\n // XXX end-of candidates is not implemented: https://bugs.chromium.org/p/webrtc/issues/detail?id=9218\n return;\n }\n\n if ((candidate.sdpMLineIndex === null ||\n candidate.sdpMLineIndex === undefined) &&\n (candidate.sdpMid === null ||\n candidate.sdpMid === undefined)\n ) {\n throw new TypeError('`sdpMLineIndex` and `sdpMid` must not be both null or undefined');\n }\n\n const newSdp = await WebRTCModule.peerConnectionAddICECandidate(\n this._pcId,\n RTCUtil.deepClone(candidate)\n );\n\n this.remoteDescription = new RTCSessionDescription(newSdp);\n }\n\n /**\n * @brief Adds a new track to the {@link RTCPeerConnection},\n * and indicates that it is contained in the specified {@link MediaStream}s.\n * This method has to be synchronous as the W3C API expects a track to be returned\n * @param {MediaStreamTrack} track The track to be added\n * @param {...MediaStream} streams One or more {@link MediaStream}s the track needs to be added to\n * https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack\n */\n addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender {\n log.debug(`${this._pcId} addTrack`);\n\n if (this.connectionState === 'closed') {\n throw new Error('Peer Connection is closed');\n }\n\n if (this._trackExists(track)) {\n throw new Error('Track already exists in a sender');\n }\n\n const streamIds = streams.map(s => s.id);\n const result = WebRTCModule.peerConnectionAddTrack(this._pcId, track.id, { streamIds });\n\n if (result === null) {\n throw new Error('Could not add sender');\n }\n\n const { transceiverOrder, transceiver, sender } = result;\n\n // According to the W3C docs, the sender could have been reused, and\n // so we check if that is the case, and update accordingly.\n const [ existingSender ] = this\n .getSenders()\n .filter(s => s.id === sender.id);\n\n if (existingSender) {\n // Update sender\n existingSender._track = track;\n\n // Update the corresponding transceiver as well\n const [ existingTransceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === existingSender.id);\n\n existingTransceiver._direction = transceiver.direction;\n existingTransceiver._currentDirection = transceiver.currentDirection;\n\n return existingSender;\n }\n\n // This is a new transceiver, should create a transceiver for it and add it\n const newSender = new RTCRtpSender({ ...transceiver.sender, track });\n const remoteTrack = transceiver.receiver.track ? new MediaStreamTrack(transceiver.receiver.track) : null;\n const newReceiver = new RTCRtpReceiver({ ...transceiver.receiver, track: remoteTrack });\n const newTransceiver = new RTCRtpTransceiver({\n ...transceiver,\n sender: newSender,\n receiver: newReceiver,\n });\n\n this._insertTransceiverSorted(transceiverOrder, newTransceiver);\n\n return newSender;\n }\n\n addTransceiver(source: 'audio' | 'video' | MediaStreamTrack, init): RTCRtpTransceiver {\n log.debug(`${this._pcId} addTransceiver`);\n\n let src = {};\n\n if (source === 'audio') {\n src = { type: 'audio' };\n } else if (source === 'video') {\n src = { type: 'video' };\n } else {\n src = { trackId: source.id };\n }\n\n // Extract the stream ids\n if (init && init.streams) {\n init.streamIds = init.streams.map(stream => stream.id);\n }\n\n const result = WebRTCModule.peerConnectionAddTransceiver(this._pcId, { ...src, init: { ...init } });\n\n if (result === null) {\n throw new Error('Transceiver could not be added');\n }\n\n const t = result.transceiver;\n let track: MediaStreamTrack | null = null;\n\n if (typeof source === 'string') {\n if (t.sender.track) {\n track = new MediaStreamTrack(t.sender.track);\n }\n } else {\n // 'source' is a MediaStreamTrack\n track = source;\n }\n\n const sender = new RTCRtpSender({ ...t.sender, track });\n const remoteTrack = t.receiver.track ? new MediaStreamTrack(t.receiver.track) : null;\n const receiver = new RTCRtpReceiver({ ...t.receiver, track: remoteTrack });\n const transceiver = new RTCRtpTransceiver({\n ...result.transceiver,\n sender,\n receiver\n });\n\n this._insertTransceiverSorted(result.transceiverOrder, transceiver);\n\n return transceiver;\n }\n\n removeTrack(sender: RTCRtpSender) {\n log.debug(`${this._pcId} removeTrack`);\n\n if (this._pcId !== sender._peerConnectionId) {\n throw new Error('Sender does not belong to this peer connection');\n }\n\n if (this.connectionState === 'closed') {\n throw new Error('Peer Connection is closed');\n }\n\n const existingSender = this\n .getSenders()\n .find(s => s === sender);\n\n if (!existingSender) {\n throw new Error('Sender does not exist');\n }\n\n if (existingSender.track === null) {\n return;\n }\n\n // Blocking!\n WebRTCModule.peerConnectionRemoveTrack(this._pcId, sender.id);\n\n existingSender._track = null;\n\n const [ existingTransceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === existingSender.id);\n\n existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive';\n }\n\n async getStats(selector?: MediaStreamTrack) {\n log.debug(`${this._pcId} getStats`);\n\n if (!selector) {\n const data = await WebRTCModule.peerConnectionGetStats(this._pcId);\n\n /**\n * On both Android and iOS it is faster to construct a single\n * JSON string representing the Map of StatsReports and have it\n * pass through the React Native bridge rather than the Map of\n * StatsReports. While the implementations do try to be faster in\n * general, the stress is on being faster to pass through the React\n * Native bridge which is a bottleneck that tends to be visible in\n * the UI when there is congestion involving UI-related passing.\n */\n return new Map(JSON.parse(data));\n } else {\n const senders = this.getSenders().filter(s => s.track === selector);\n const receivers = this.getReceivers().filter(r => r.track === selector);\n const matches = senders.length + receivers.length;\n\n if (matches === 0) {\n throw new Error('Invalid selector: could not find matching sender / receiver');\n } else if (matches > 1) {\n throw new Error('Invalid selector: multiple matching senders / receivers');\n } else {\n const sr = senders[0] || receivers[0];\n\n return sr.getStats();\n }\n }\n }\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this._transceivers.map(e => e.transceiver);\n }\n\n getSenders(): RTCRtpSender[] {\n return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.sender);\n }\n\n getReceivers(): RTCRtpReceiver[] {\n return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.receiver);\n }\n\n close(): void {\n log.debug(`${this._pcId} close`);\n\n if (this.connectionState === 'closed') {\n return;\n }\n\n WebRTCModule.peerConnectionClose(this._pcId);\n\n // Mark transceivers as stopped.\n this._transceivers.forEach(({ transceiver })=> {\n transceiver._setStopped();\n });\n }\n\n restartIce(): void {\n WebRTCModule.peerConnectionRestartIce(this._pcId);\n }\n\n _registerEvents(): void {\n addListener(this, 'peerConnectionOnRenegotiationNeeded', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n console.log(`[RNWebRTC] pc:${this._pcId} negotiation_needed`, {\n signalingState: this.signalingState,\n connectionState: this.connectionState,\n iceConnectionState: this.iceConnectionState,\n });\n\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n\n addListener(this, 'peerConnectionIceConnectionChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const prev = this.iceConnectionState;\n this.iceConnectionState = ev.iceConnectionState;\n console.log(`[RNWebRTC] pc:${this._pcId} ice_connection_changed`, {\n prev,\n current: ev.iceConnectionState,\n connectionState: this.connectionState,\n signalingState: this.signalingState,\n });\n\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n addListener(this, 'peerConnectionStateChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const prev = this.connectionState;\n this.connectionState = ev.connectionState;\n console.log(`[RNWebRTC] pc:${this._pcId} connection_state_changed`, {\n prev,\n current: ev.connectionState,\n iceConnectionState: this.iceConnectionState,\n iceGatheringState: this.iceGatheringState,\n signalingState: this.signalingState,\n });\n\n this.dispatchEvent(new Event('connectionstatechange'));\n\n if (ev.connectionState === 'closed') {\n console.log(`[RNWebRTC] pc:${this._pcId} disposing`);\n // This PeerConnection is done, clean up.\n removeListener(this);\n\n WebRTCModule.peerConnectionDispose(this._pcId);\n }\n });\n\n addListener(this, 'peerConnectionSignalingStateChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const prev = this.signalingState;\n this.signalingState = ev.signalingState;\n console.log(`[RNWebRTC] pc:${this._pcId} signaling_state_changed`, {\n prev,\n current: ev.signalingState,\n connectionState: this.connectionState,\n });\n\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n // Consider moving away from this event: https://github.com/WebKit/WebKit/pull/3953\n addListener(this, 'peerConnectionOnTrack', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n console.log(`[RNWebRTC] pc:${this._pcId} track_event_queued`, {\n receiverId: ev.receiver?.id,\n trackKind: ev.receiver?.track?.kind,\n streamCount: ev.streams?.length ?? 0,\n pendingCount: this._pendingTrackEvents.length + 1,\n });\n\n log.debug(`${this._pcId} ontrack`);\n\n // NOTE: We need to make sure the track event fires right before sRD completes,\n // so we queue them up here and dispatch the events when sRD fires, but before completing it.\n // In the future we should probably implement out own logic and drop this event altogether.\n this._pendingTrackEvents.push(ev);\n });\n\n addListener(this, 'peerConnectionOnRemoveTrack', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n console.log(`[RNWebRTC] pc:${this._pcId} remove_track`, { receiverId: ev.receiverId });\n log.debug(`${this._pcId} onremovetrack ${ev.receiverId}`);\n\n const receiver = this.getReceivers().find(r => r.id === ev.receiverId);\n const track = receiver?.track;\n\n if (receiver && track) {\n // As per the spec:\n // - Remove the track from any media streams that were previously passed to the `track` event.\n // https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-removetrack,\n // - Mark the track as muted:\n // https://w3c.github.io/webrtc-pc/#process-remote-track-removal\n for (const stream of this._remoteStreams.values()) {\n if (stream._tracks.includes(track)) {\n const trackIdx = stream._tracks.indexOf(track);\n\n log.debug(`${this._pcId} removetrack ${track.id}`);\n\n stream._tracks.splice(trackIdx, 1);\n\n stream.dispatchEvent(new MediaStreamTrackEvent('removetrack', { track }));\n\n // Dispatch a mute event for the track.\n track._setMutedInternal(true);\n }\n }\n }\n });\n\n addListener(this, 'peerConnectionGotICECandidate', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n console.log(`[RNWebRTC] pc:${this._pcId} local_ice_candidate`, {\n type: ev.candidate?.type,\n protocol: ev.candidate?.protocol,\n sdpMid: ev.candidate?.sdpMid,\n iceGatheringState: this.iceGatheringState,\n });\n\n const sdpInfo = ev.sdp;\n\n // Can happen when doing a rollback.\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n const candidate = new RTCIceCandidate(ev.candidate);\n\n this.dispatchEvent(new RTCIceCandidateEvent('icecandidate', { candidate }));\n });\n\n addListener(this, 'peerConnectionIceGatheringChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const prev = this.iceGatheringState;\n this.iceGatheringState = ev.iceGatheringState;\n console.log(`[RNWebRTC] pc:${this._pcId} ice_gathering_state_changed`, {\n prev,\n current: ev.iceGatheringState,\n connectionState: this.connectionState,\n });\n\n if (this.iceGatheringState === 'complete') {\n const sdpInfo = ev.sdp;\n\n // Can happen when doing a rollback.\n if (sdpInfo.type && sdpInfo.sdp) {\n this.localDescription = new RTCSessionDescription(sdpInfo);\n } else {\n this.localDescription = null;\n }\n\n this.dispatchEvent(new RTCIceCandidateEvent('icecandidate', { candidate: null }));\n }\n\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n addListener(this, 'peerConnectionDidOpenDataChannel', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const channel = new RTCDataChannel(ev.dataChannel);\n\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel }));\n\n // Send 'open' event. Native doesn't update the state since it's already\n // set at this point.\n channel.dispatchEvent(new RTCDataChannelEvent('open', { channel }));\n });\n\n addListener(this, 'mediaStreamTrackMuteChanged', (ev: any) => {\n if (ev.pcId !== this._pcId) {\n return;\n }\n\n const [\n track\n ] = this.getReceivers().map(r => r.track).filter(t => t?.id === ev.trackId);\n\n if (track) {\n track._setMutedInternal(ev.muted);\n }\n });\n }\n\n /**\n * Creates a new RTCDataChannel object with the given label. The\n * RTCDataChannelInit dictionary can be used to configure properties of the\n * underlying channel such as data reliability.\n *\n * @param {string} label - the value with which the label attribute of the new\n * instance is to be initialized\n * @param {RTCDataChannelInit} dataChannelDict - an optional dictionary of\n * values with which to initialize corresponding attributes of the new\n * instance such as id\n */\n createDataChannel(label: string, dataChannelDict?: RTCDataChannelInit): RTCDataChannel {\n if (arguments.length === 0) {\n throw new TypeError('1 argument required, but 0 present');\n }\n\n if (dataChannelDict && 'id' in dataChannelDict) {\n const id = dataChannelDict.id;\n\n if (typeof id !== 'number') {\n throw new TypeError('DataChannel id must be a number: ' + id);\n }\n }\n\n const channelInfo = WebRTCModule.createDataChannel(this._pcId, String(label), dataChannelDict);\n\n if (channelInfo === null) {\n throw new TypeError('Failed to create new DataChannel');\n }\n\n return new RTCDataChannel(channelInfo);\n }\n\n /**\n * Check whether a media stream track exists already in a sender.\n * See https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack for more information\n */\n _trackExists(track: MediaStreamTrack): boolean {\n const [ sender ] = this\n .getSenders()\n .filter(\n sender => sender.track?.id === track.id\n );\n\n return sender? true : false;\n }\n\n /**\n * Updates transceivers after offer/answer updates if necessary.\n */\n _updateTransceivers(transceiverUpdates, removeStopped = false) {\n for (const update of transceiverUpdates) {\n const [ transceiver ] = this\n .getTransceivers()\n .filter(t => t.sender.id === update.transceiverId);\n\n if (!transceiver) {\n continue;\n }\n\n if (update.currentDirection) {\n transceiver._currentDirection = update.currentDirection;\n }\n\n transceiver._mid = update.mid;\n transceiver._stopped = Boolean(update.isStopped);\n transceiver._sender._rtpParameters = new RTCRtpSendParameters(update.senderRtpParameters);\n transceiver._receiver._rtpParameters = new RTCRtpReceiveParameters(update.receiverRtpParameters);\n }\n\n if (removeStopped) {\n const stopped = this.getTransceivers().filter(t => t.stopped);\n const newTransceivers = this._transceivers.filter(t => !stopped.includes(t.transceiver));\n\n this._transceivers = newTransceivers;\n }\n }\n\n /**\n * Inserts transceiver into the transceiver array in the order they are created (timestamp).\n * @param order an index that refers to when it it was created relatively.\n * @param transceiver the transceiver object to be inserted.\n */\n _insertTransceiverSorted(order: number, transceiver: RTCRtpTransceiver) {\n this._transceivers.push({ order, transceiver });\n this._transceivers.sort((a, b) => a.order - b.order);\n }\n}\n\n/**\n * Define the `onxxx` event handlers.\n */\nconst proto = RTCPeerConnection.prototype;\n\ndefineEventAttribute(proto, 'connectionstatechange');\ndefineEventAttribute(proto, 'icecandidate');\ndefineEventAttribute(proto, 'icecandidateerror');\ndefineEventAttribute(proto, 'iceconnectionstatechange');\ndefineEventAttribute(proto, 'icegatheringstatechange');\ndefineEventAttribute(proto, 'negotiationneeded');\ndefineEventAttribute(proto, 'signalingstatechange');\ndefineEventAttribute(proto, 'datachannel');\ndefineEventAttribute(proto, 'track');\ndefineEventAttribute(proto, 'error');\n"],"mappings":"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"}
@@ -17,6 +17,10 @@ export default function getUserMedia() {
17
17
  if ((typeof constraints.audio === 'undefined' || !constraints.audio) && (typeof constraints.video === 'undefined' || !constraints.video)) {
18
18
  return Promise.reject(new TypeError('audio and/or video is required'));
19
19
  }
20
+ console.log('[RNWebRTC] get_user_media_start', {
21
+ audio: !!constraints.audio,
22
+ video: !!constraints.video
23
+ });
20
24
 
21
25
  // Normalize constraints.
22
26
  constraints = RTCUtil.normalizeConstraints(constraints);
@@ -24,6 +28,7 @@ export default function getUserMedia() {
24
28
  // Request required permissions
25
29
  const reqPermissions = [];
26
30
  if (constraints.audio) {
31
+ console.log('[RNWebRTC] requesting_mic_permission');
27
32
  reqPermissions.push(permissions.request({
28
33
  name: 'microphone'
29
34
  }));
@@ -31,21 +36,28 @@ export default function getUserMedia() {
31
36
  reqPermissions.push(Promise.resolve(false));
32
37
  }
33
38
  if (constraints.video) {
39
+ console.log('[RNWebRTC] requesting_camera_permission');
34
40
  reqPermissions.push(permissions.request({
35
41
  name: 'camera'
36
42
  }));
37
43
  } else {
38
44
  reqPermissions.push(Promise.resolve(false));
39
45
  }
46
+ const _t0 = Date.now();
40
47
  return new Promise((resolve, reject) => {
41
48
  Promise.all(reqPermissions).then(results => {
42
49
  const [audioPerm, videoPerm] = results;
50
+ console.log('[RNWebRTC] permission_results', {
51
+ audioPerm,
52
+ videoPerm
53
+ });
43
54
 
44
55
  // Check permission results and remove unneeded permissions.
45
56
 
46
57
  if (!audioPerm && !videoPerm) {
47
58
  // https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia
48
59
  // step 4
60
+ console.log('[RNWebRTC] permission_denied_both');
49
61
  const error = {
50
62
  message: 'Permission denied.',
51
63
  name: 'SecurityError'
@@ -63,6 +75,12 @@ export default function getUserMedia() {
63
75
  trackInfo.constraints = RTCUtil.deepClone(c);
64
76
  }
65
77
  }
78
+ console.log('[RNWebRTC] get_user_media_success', {
79
+ durationMs: Date.now() - _t0,
80
+ streamId: id,
81
+ trackCount: tracks.length,
82
+ trackKinds: tracks.map(t => t.kind)
83
+ });
66
84
  const info = {
67
85
  streamId: id,
68
86
  streamReactTag: id,
@@ -71,6 +89,11 @@ export default function getUserMedia() {
71
89
  resolve(new MediaStream(info));
72
90
  };
73
91
  const failure = (type, message) => {
92
+ console.log('[RNWebRTC] get_user_media_error', {
93
+ durationMs: Date.now() - _t0,
94
+ type,
95
+ message
96
+ });
74
97
  let error;
75
98
  switch (type) {
76
99
  case 'TypeError':