werift 0.22.9 → 0.24.0

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.
Files changed (173) hide show
  1. package/README.md +46 -0
  2. package/lib/common/src/transport.d.ts +22 -9
  3. package/lib/common/src/transport.js +152 -25
  4. package/lib/common/src/transport.js.map +1 -1
  5. package/lib/dtls/src/flight/server/flight6.js +12 -2
  6. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  7. package/lib/dtls/src/server.js +6 -1
  8. package/lib/dtls/src/server.js.map +1 -1
  9. package/lib/dtls/src/socket.d.ts +1 -0
  10. package/lib/dtls/src/socket.js +3 -0
  11. package/lib/dtls/src/socket.js.map +1 -1
  12. package/lib/ice/src/candidate.d.ts +16 -1
  13. package/lib/ice/src/candidate.js +99 -15
  14. package/lib/ice/src/candidate.js.map +1 -1
  15. package/lib/ice/src/ice.d.ts +2 -0
  16. package/lib/ice/src/ice.js +171 -41
  17. package/lib/ice/src/ice.js.map +1 -1
  18. package/lib/ice/src/iceBase.d.ts +23 -2
  19. package/lib/ice/src/iceBase.js +63 -1
  20. package/lib/ice/src/iceBase.js.map +1 -1
  21. package/lib/ice/src/index.d.ts +2 -0
  22. package/lib/ice/src/index.js +2 -0
  23. package/lib/ice/src/index.js.map +1 -1
  24. package/lib/ice/src/stun/const.d.ts +1 -26
  25. package/lib/ice/src/stun/const.js +15 -54
  26. package/lib/ice/src/stun/const.js.map +1 -1
  27. package/lib/ice/src/stun/message.d.ts +1 -25
  28. package/lib/ice/src/stun/message.js +15 -149
  29. package/lib/ice/src/stun/message.js.map +1 -1
  30. package/lib/ice/src/stun/protocol.d.ts +1 -1
  31. package/lib/ice/src/stun/protocol.js +2 -2
  32. package/lib/ice/src/stun/protocol.js.map +1 -1
  33. package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
  34. package/lib/ice/src/stun/tcpFrame.js +26 -0
  35. package/lib/ice/src/stun/tcpFrame.js.map +1 -0
  36. package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
  37. package/lib/ice/src/stun/tcpProtocol.js +326 -0
  38. package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
  39. package/lib/ice/src/stun/transaction.d.ts +2 -1
  40. package/lib/ice/src/stun/transaction.js +9 -3
  41. package/lib/ice/src/stun/transaction.js.map +1 -1
  42. package/lib/ice/src/turn/frame.d.ts +1 -0
  43. package/lib/ice/src/turn/frame.js +18 -0
  44. package/lib/ice/src/turn/frame.js.map +1 -0
  45. package/lib/ice/src/turn/protocol.d.ts +9 -7
  46. package/lib/ice/src/turn/protocol.js +32 -44
  47. package/lib/ice/src/turn/protocol.js.map +1 -1
  48. package/lib/ice/src/types/model.d.ts +1 -1
  49. package/lib/ice/src/types/model.js.map +1 -1
  50. package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
  51. package/lib/{ice → ice-server}/src/stun/attributes.js +60 -19
  52. package/lib/ice-server/src/stun/attributes.js.map +1 -0
  53. package/lib/ice-server/src/stun/const.d.ts +28 -0
  54. package/lib/ice-server/src/stun/const.js +88 -0
  55. package/lib/ice-server/src/stun/const.js.map +1 -0
  56. package/lib/ice-server/src/stun/message.d.ts +37 -0
  57. package/lib/ice-server/src/stun/message.js +190 -0
  58. package/lib/ice-server/src/stun/message.js.map +1 -0
  59. package/lib/ice-server/src/turn/auth.d.ts +1 -0
  60. package/lib/ice-server/src/turn/auth.js +10 -0
  61. package/lib/ice-server/src/turn/auth.js.map +1 -0
  62. package/lib/ice-server/src/turn/frame.d.ts +13 -0
  63. package/lib/ice-server/src/turn/frame.js +69 -0
  64. package/lib/ice-server/src/turn/frame.js.map +1 -0
  65. package/lib/index.mjs +3075 -883
  66. package/lib/nonstandard/index.mjs +1964 -447
  67. package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
  68. package/lib/rtp/src/extra/container/mp4/container.js +258 -173
  69. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  70. package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
  71. package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
  72. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  73. package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
  74. package/lib/rtp/src/extra/processor/mp4.js +115 -60
  75. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  76. package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
  77. package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
  78. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  79. package/lib/rtp/src/index.d.ts +1 -0
  80. package/lib/rtp/src/index.js +1 -0
  81. package/lib/rtp/src/index.js.map +1 -1
  82. package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
  83. package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
  84. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  85. package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
  86. package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
  87. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  88. package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
  89. package/lib/rtp/src/srtp/cipher/index.js +1 -1
  90. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  91. package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
  92. package/lib/rtp/src/srtp/context/srtp.js +22 -5
  93. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  94. package/lib/rtp/src/srtp/error.d.ts +3 -0
  95. package/lib/rtp/src/srtp/error.js +11 -0
  96. package/lib/rtp/src/srtp/error.js.map +1 -0
  97. package/lib/rtp/src/srtp/packet.d.ts +5 -0
  98. package/lib/rtp/src/srtp/packet.js +48 -0
  99. package/lib/rtp/src/srtp/packet.js.map +1 -0
  100. package/lib/webrtc/src/dataChannel.d.ts +4 -2
  101. package/lib/webrtc/src/dataChannel.js +14 -4
  102. package/lib/webrtc/src/dataChannel.js.map +1 -1
  103. package/lib/webrtc/src/errors.d.ts +3 -0
  104. package/lib/webrtc/src/errors.js +11 -0
  105. package/lib/webrtc/src/errors.js.map +1 -0
  106. package/lib/webrtc/src/helper.d.ts +5 -1
  107. package/lib/webrtc/src/helper.js +33 -1
  108. package/lib/webrtc/src/helper.js.map +1 -1
  109. package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
  110. package/lib/webrtc/src/media/receiver/statistics.js +22 -0
  111. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  112. package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
  113. package/lib/webrtc/src/media/rtpReceiver.js +135 -20
  114. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  115. package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
  116. package/lib/webrtc/src/media/rtpSender.js +177 -28
  117. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  118. package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
  119. package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
  120. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  121. package/lib/webrtc/src/media/stats.d.ts +15 -1
  122. package/lib/webrtc/src/media/stats.js +55 -1
  123. package/lib/webrtc/src/media/stats.js.map +1 -1
  124. package/lib/webrtc/src/media/track.d.ts +2 -1
  125. package/lib/webrtc/src/media/track.js +7 -1
  126. package/lib/webrtc/src/media/track.js.map +1 -1
  127. package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
  128. package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
  129. package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
  130. package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
  131. package/lib/webrtc/src/nonstandard/navigator.js +96 -32
  132. package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
  133. package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
  134. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
  135. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
  136. package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
  137. package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
  138. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  139. package/lib/webrtc/src/peerConnection.d.ts +185 -49
  140. package/lib/webrtc/src/peerConnection.js +477 -107
  141. package/lib/webrtc/src/peerConnection.js.map +1 -1
  142. package/lib/webrtc/src/sctpManager.d.ts +2 -2
  143. package/lib/webrtc/src/sctpManager.js +30 -9
  144. package/lib/webrtc/src/sctpManager.js.map +1 -1
  145. package/lib/webrtc/src/sdp.d.ts +10 -7
  146. package/lib/webrtc/src/sdp.js +39 -9
  147. package/lib/webrtc/src/sdp.js.map +1 -1
  148. package/lib/webrtc/src/sdpManager.d.ts +5 -4
  149. package/lib/webrtc/src/sdpManager.js +53 -31
  150. package/lib/webrtc/src/sdpManager.js.map +1 -1
  151. package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
  152. package/lib/webrtc/src/secureTransportManager.js +101 -23
  153. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  154. package/lib/webrtc/src/transceiverManager.d.ts +5 -4
  155. package/lib/webrtc/src/transceiverManager.js +64 -64
  156. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  157. package/lib/webrtc/src/transport/dtls.d.ts +16 -4
  158. package/lib/webrtc/src/transport/dtls.js +208 -35
  159. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  160. package/lib/webrtc/src/transport/ice.d.ts +21 -3
  161. package/lib/webrtc/src/transport/ice.js +159 -30
  162. package/lib/webrtc/src/transport/ice.js.map +1 -1
  163. package/lib/webrtc/src/transport/sctp.d.ts +10 -3
  164. package/lib/webrtc/src/transport/sctp.js +44 -13
  165. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  166. package/lib/webrtc/src/utils.d.ts +14 -4
  167. package/lib/webrtc/src/utils.js +138 -16
  168. package/lib/webrtc/src/utils.js.map +1 -1
  169. package/package.json +7 -4
  170. package/lib/ice/src/stun/attributes.js.map +0 -1
  171. package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
  172. package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
  173. package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
@@ -6,9 +6,26 @@ exports.candidateToIce = candidateToIce;
6
6
  const crypto_1 = require("crypto");
7
7
  const common_1 = require("../imports/common");
8
8
  const src_1 = require("../../../ice/src");
9
+ const helper_1 = require("../helper");
9
10
  const stats_1 = require("../media/stats");
10
11
  const sdp_1 = require("../sdp");
11
12
  const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/ice.ts");
13
+ function mapCandidatePairState(state) {
14
+ switch (state) {
15
+ case 0:
16
+ return "frozen";
17
+ case 1:
18
+ return "waiting";
19
+ case 2:
20
+ return "in-progress";
21
+ case 3:
22
+ return "succeeded";
23
+ case 4:
24
+ return "failed";
25
+ default:
26
+ return "failed";
27
+ }
28
+ }
12
29
  /**
13
30
  * +------------+
14
31
  | |
@@ -57,6 +74,18 @@ class RTCIceTransport {
57
74
  writable: true,
58
75
  value: "new"
59
76
  });
77
+ Object.defineProperty(this, "component", {
78
+ enumerable: true,
79
+ configurable: true,
80
+ writable: true,
81
+ value: "rtp"
82
+ });
83
+ Object.defineProperty(this, "iceRestarts", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: 0
88
+ });
60
89
  Object.defineProperty(this, "waitStart", {
61
90
  enumerable: true,
62
91
  configurable: true,
@@ -69,6 +98,24 @@ class RTCIceTransport {
69
98
  writable: true,
70
99
  value: false
71
100
  });
101
+ Object.defineProperty(this, "events", {
102
+ enumerable: true,
103
+ configurable: true,
104
+ writable: true,
105
+ value: new helper_1.EventTarget()
106
+ });
107
+ Object.defineProperty(this, "onstatechange", {
108
+ enumerable: true,
109
+ configurable: true,
110
+ writable: true,
111
+ value: void 0
112
+ });
113
+ Object.defineProperty(this, "ongatheringstatechange", {
114
+ enumerable: true,
115
+ configurable: true,
116
+ writable: true,
117
+ value: void 0
118
+ });
72
119
  Object.defineProperty(this, "onStateChange", {
73
120
  enumerable: true,
74
121
  configurable: true,
@@ -87,18 +134,37 @@ class RTCIceTransport {
87
134
  writable: true,
88
135
  value: new common_1.Event()
89
136
  });
137
+ Object.defineProperty(this, "addEventListener", {
138
+ enumerable: true,
139
+ configurable: true,
140
+ writable: true,
141
+ value: (type, listener, options) => {
142
+ this.events.addEventListener(type, listener, options);
143
+ }
144
+ });
145
+ Object.defineProperty(this, "removeEventListener", {
146
+ enumerable: true,
147
+ configurable: true,
148
+ writable: true,
149
+ value: (type, listener) => {
150
+ this.events.removeEventListener(type, listener);
151
+ }
152
+ });
153
+ Object.defineProperty(this, "dispatchEvent", {
154
+ enumerable: true,
155
+ configurable: true,
156
+ writable: true,
157
+ value: (event) => this.events.dispatchEvent(event)
158
+ });
90
159
  Object.defineProperty(this, "addRemoteCandidate", {
91
160
  enumerable: true,
92
161
  configurable: true,
93
162
  writable: true,
94
163
  value: (candidate) => {
95
164
  if (!this.connection.remoteCandidatesEnd) {
96
- if (!candidate) {
97
- return this.connection.addRemoteCandidate(undefined);
98
- }
99
- else {
100
- return this.connection.addRemoteCandidate(candidateToIce(candidate));
101
- }
165
+ return !candidate
166
+ ? this.connection.addRemoteCandidate(undefined)
167
+ : this.connection.addRemoteCandidate(candidateToIce(candidate));
102
168
  }
103
169
  }
104
170
  });
@@ -109,8 +175,15 @@ class RTCIceTransport {
109
175
  this.iceGather.onIceCandidate = (candidate) => {
110
176
  this.onIceCandidate.execute(candidate);
111
177
  };
178
+ this.iceGather.onGatheringStateChange.subscribe(() => {
179
+ this.ongatheringstatechange?.();
180
+ this.events.emit("gatheringstatechange");
181
+ });
112
182
  }
113
183
  get role() {
184
+ if (!this.connection.remoteUsername || !this.connection.remotePassword) {
185
+ return "unknown";
186
+ }
114
187
  if (this.connection.iceControlling)
115
188
  return "controlling";
116
189
  else
@@ -125,10 +198,46 @@ class RTCIceTransport {
125
198
  get localParameters() {
126
199
  return this.iceGather.localParameters;
127
200
  }
128
- setState(state) {
201
+ getRemoteCandidates() {
202
+ return this.connection.remoteCandidates
203
+ .filter((candidate) => candidate.type !== "prflx")
204
+ .map((candidate) => candidateFromIce(candidate).toJSON());
205
+ }
206
+ getLocalCandidates() {
207
+ return this.connection.localCandidates.map((candidate) => candidateFromIce(candidate).toJSON());
208
+ }
209
+ getSelectedCandidatePair() {
210
+ const pair = this.connection.candidatePairs.find((candidate) => candidate.nominated) ??
211
+ this.connection.candidatePairs.find((candidate) => candidate.state === 3);
212
+ if (!pair) {
213
+ return null;
214
+ }
215
+ return {
216
+ local: candidateFromIce(pair.localCandidate).toJSON(),
217
+ remote: candidateFromIce(pair.remoteCandidate).toJSON(),
218
+ };
219
+ }
220
+ getLocalParameters() {
221
+ return this.localParameters ?? null;
222
+ }
223
+ getRemoteParameters() {
224
+ if (!this.connection.remoteUsername || !this.connection.remotePassword) {
225
+ return null;
226
+ }
227
+ return new RTCIceParameters({
228
+ iceLite: this.connection.remoteIsLite,
229
+ password: this.connection.remotePassword,
230
+ usernameFragment: this.connection.remoteUsername,
231
+ });
232
+ }
233
+ setState(state, emitEvent = true) {
129
234
  if (state !== this.state) {
130
235
  this.state = state;
131
236
  this.onStateChange.execute(state);
237
+ if (emitEvent) {
238
+ this.onstatechange?.();
239
+ this.events.emit("statechange");
240
+ }
132
241
  }
133
242
  }
134
243
  gather() {
@@ -155,6 +264,7 @@ class RTCIceTransport {
155
264
  this.connection.setRemoteParams(remoteParameters);
156
265
  }
157
266
  restart() {
267
+ this.iceRestarts++;
158
268
  this.connection.restart();
159
269
  this.setState("new");
160
270
  this.iceGather.gatheringState = "new";
@@ -186,46 +296,52 @@ class RTCIceTransport {
186
296
  }
187
297
  async stop() {
188
298
  if (this.state !== "closed") {
189
- this.setState("closed");
299
+ this.setState("closed", false);
190
300
  await this.connection.close();
191
301
  }
192
302
  this.onStateChange.complete();
193
303
  this.onIceCandidate.complete();
194
304
  this.onNegotiationNeeded.complete();
195
305
  }
196
- async getStats() {
197
- const timestamp = (0, stats_1.getStatsTimestamp)();
306
+ async getStats(timestamp = (0, stats_1.getStatsTimestamp)(), transportId = (0, stats_1.generateStatsId)("transport", this.id)) {
198
307
  const stats = [];
199
308
  // Local candidates
200
- for (const candidate of this.localCandidates) {
309
+ for (const candidate of this.connection.localCandidates) {
201
310
  const candidateStats = {
202
311
  type: "local-candidate",
203
- id: (0, stats_1.generateStatsId)("local-candidate", candidate.foundation),
312
+ id: (0, stats_1.generateStatsId)("local-candidate", candidate.id),
204
313
  timestamp,
205
- transportId: (0, stats_1.generateStatsId)("transport", this.id),
206
- address: candidate.ip,
314
+ transportId,
315
+ address: candidate.host,
207
316
  port: candidate.port,
208
- protocol: candidate.protocol,
317
+ protocol: candidate.transport,
209
318
  candidateType: candidate.type,
210
319
  priority: candidate.priority,
211
320
  foundation: candidate.foundation,
321
+ relatedAddress: candidate.relatedAddress,
322
+ relatedPort: candidate.relatedPort,
323
+ usernameFragment: candidate.ufrag,
324
+ tcpType: candidate.tcptype,
212
325
  };
213
326
  stats.push(candidateStats);
214
327
  }
215
328
  // Remote candidates
216
329
  for (const candidate of this.connection.remoteCandidates) {
217
- const ice = candidateFromIce(candidate);
218
330
  const candidateStats = {
219
331
  type: "remote-candidate",
220
- id: (0, stats_1.generateStatsId)("remote-candidate", ice.foundation),
332
+ id: (0, stats_1.generateStatsId)("remote-candidate", candidate.id),
221
333
  timestamp,
222
- transportId: (0, stats_1.generateStatsId)("transport", this.id),
223
- address: ice.ip,
224
- port: ice.port,
225
- protocol: ice.protocol,
226
- candidateType: ice.type,
227
- priority: ice.priority,
228
- foundation: ice.foundation,
334
+ transportId,
335
+ address: candidate.host,
336
+ port: candidate.port,
337
+ protocol: candidate.transport,
338
+ candidateType: candidate.type,
339
+ priority: candidate.priority,
340
+ foundation: candidate.foundation,
341
+ relatedAddress: candidate.relatedAddress,
342
+ relatedPort: candidate.relatedPort,
343
+ usernameFragment: candidate.ufrag,
344
+ tcpType: candidate.tcptype,
229
345
  };
230
346
  stats.push(candidateStats);
231
347
  }
@@ -239,18 +355,27 @@ class RTCIceTransport {
239
355
  for (const pair of pairs) {
240
356
  const pairStats = {
241
357
  type: "candidate-pair",
242
- id: (0, stats_1.generateStatsId)("candidate-pair", pair.foundation),
358
+ id: (0, stats_1.generateStatsId)("candidate-pair", pair.id),
243
359
  timestamp,
244
- transportId: (0, stats_1.generateStatsId)("transport", this.id),
245
- localCandidateId: (0, stats_1.generateStatsId)("local-candidate", pair.localCandidate.foundation),
246
- remoteCandidateId: (0, stats_1.generateStatsId)("remote-candidate", pair.remoteCandidate.foundation),
247
- state: pair.state,
360
+ transportId,
361
+ localCandidateId: (0, stats_1.generateStatsId)("local-candidate", pair.localCandidate.id),
362
+ remoteCandidateId: (0, stats_1.generateStatsId)("remote-candidate", pair.remoteCandidate.id),
363
+ state: mapCandidatePairState(pair.state),
248
364
  nominated: pair.nominated,
249
365
  packetsSent: pair.packetsSent,
250
366
  packetsReceived: pair.packetsReceived,
251
367
  bytesSent: pair.bytesSent,
252
368
  bytesReceived: pair.bytesReceived,
253
369
  currentRoundTripTime: pair.rtt,
370
+ totalRoundTripTime: pair.totalRoundTripTime,
371
+ roundTripTimeMeasurements: pair.roundTripTimeMeasurements,
372
+ requestsReceived: pair.requestsReceived,
373
+ requestsSent: pair.requestsSent,
374
+ responsesReceived: pair.responsesReceived,
375
+ responsesSent: pair.responsesSent,
376
+ retransmissionsReceived: pair.retransmissionsReceived,
377
+ retransmissionsSent: pair.retransmissionsSent,
378
+ consentRequestsSent: pair.consentRequestsSent,
254
379
  };
255
380
  stats.push(pairStats);
256
381
  }
@@ -318,6 +443,7 @@ class RTCIceGatherer {
318
443
  }
319
444
  get localParameters() {
320
445
  const params = new RTCIceParameters({
446
+ iceLite: this.connection.iceLite,
321
447
  usernameFragment: this.connection.localUsername,
322
448
  password: this.connection.localPassword,
323
449
  });
@@ -493,7 +619,10 @@ class IceCandidate {
493
619
  if (!data.candidate) {
494
620
  throw new Error("candidate is required");
495
621
  }
496
- const candidate = (0, sdp_1.candidateFromSdp)(data.candidate);
622
+ const normalizedCandidate = data.candidate.startsWith("candidate:")
623
+ ? data.candidate.slice("candidate:".length)
624
+ : data.candidate;
625
+ const candidate = (0, sdp_1.candidateFromSdp)(normalizedCandidate);
497
626
  candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;
498
627
  candidate.sdpMid = data.sdpMid ?? undefined;
499
628
  return candidate;
@@ -1 +1 @@
1
- {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":";;;AA+SA,4CAgBC;AAED,wCAeC;AAhVD,mCAAoC;AACpC,8CAAiD;AAEjD,0CAK0B;AAC1B,0CAMwB;AACxB,gCAA0D;AAE1D,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,6CAA6C,CAAC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAa,eAAe;IAW1B,YAAoB,SAAyB;QAAjC;;;;mBAAQ,SAAS;WAAgB;QAVpC;;;;mBAAK,IAAA,mBAAU,GAAE,CAAC,QAAQ,EAAE;WAAC;QACtC;;;;;WAA0B;QAC1B;;;;mBAA+B,KAAK;WAAC;QAC7B;;;;;WAAsB;QACtB;;;;mBAAe,KAAK;WAAC;QAEpB;;;;mBAAgB,IAAI,cAAK,EAA2B;WAAC;QACrD;;;;mBAAiB,IAAI,cAAK,EAA8B;WAAC;QACzD;;;;mBAAsB,IAAI,cAAK,EAAM;WAAC;QAyC/C;;;;mBAAqB,CAAC,SAAwB,EAAE,EAAE;gBAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;oBACzC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;WAAC;QA9CA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;YAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc;YAAE,OAAO,aAAa,CAAC;;YACpD,OAAO,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;IACvC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;IACxC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;IACxC,CAAC;IAEO,QAAQ,CAAC,KAA4B;QAC3C,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAEnB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAYD,eAAe,CAAC,gBAAkC,EAAE,YAAY,GAAG,KAAK;QACtE,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,IACE,IAAI,CAAC,UAAU,CAAC,cAAc;YAC9B,IAAI,CAAC,UAAU,CAAC,cAAc;YAC9B,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,gBAAgB,CAAC,gBAAgB;gBACnE,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,gBAAgB,CAAC,QAAQ,CAAC,EAC/D,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAK,EAAE,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,SAAS,GAAG,IAAA,yBAAiB,GAAE,CAAC;QACtC,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,mBAAmB;QACnB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAyB;gBAC3C,IAAI,EAAE,iBAAiB;gBACvB,EAAE,EAAE,IAAA,uBAAe,EAAC,iBAAiB,EAAE,SAAS,CAAC,UAAU,CAAC;gBAC5D,SAAS;gBACT,WAAW,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,EAAE,SAAS,CAAC,EAAE;gBACrB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,aAAa,EAAE,SAAS,CAAC,IAAW;gBACpC,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,UAAU,EAAE,SAAS,CAAC,UAAU;aACjC,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,cAAc,GAAyB;gBAC3C,IAAI,EAAE,kBAAkB;gBACxB,EAAE,EAAE,IAAA,uBAAe,EAAC,kBAAkB,EAAE,GAAG,CAAC,UAAU,CAAC;gBACvD,SAAS;gBACT,WAAW,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,EAAE,GAAG,CAAC,EAAE;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,aAAa,EAAE,GAAG,CAAC,IAAW;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc;YAC3C,CAAC,CAAC;gBACE,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5D,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aAC9D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAA6B;gBAC1C,IAAI,EAAE,gBAAgB;gBACtB,EAAE,EAAE,IAAA,uBAAe,EAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC;gBACtD,SAAS;gBACT,WAAW,EAAE,IAAA,uBAAe,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClD,gBAAgB,EAAE,IAAA,uBAAe,EAC/B,iBAAiB,EACjB,IAAI,CAAC,cAAc,CAAC,UAAU,CAC/B;gBACD,iBAAiB,EAAE,IAAA,uBAAe,EAChC,kBAAkB,EAClB,IAAI,CAAC,eAAe,CAAC,UAAU,CAChC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAY;gBACxB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,oBAAoB,EAAE,IAAI,CAAC,GAAG;aAC/B,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAxMD,0CAwMC;AAEY,QAAA,kBAAkB,GAAG;IAChC,KAAK;IACL,UAAU;IACV,WAAW;IACX,WAAW;IACX,cAAc;IACd,QAAQ;IACR,QAAQ;CACA,CAAC;AAGE,QAAA,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAG3E,MAAa,cAAc;IAOzB,YAAoB,UAA+B,EAAE;QAAzC;;;;mBAAQ,OAAO;WAA0B;QANrD;;;;mBAAgE,GAAG,EAAE,GAAE,CAAC;WAAC;QACzE;;;;mBAAmC,KAAK;WAAC;QAChC;;;;;WAA0B;QAE1B;;;;mBAAyB,IAAI,cAAK,EAAsB;WAAC;QAGhE,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACrD,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;YAClC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;YAC/C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;SACxC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,KAAuB;QACtC,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AA1CD,wCA0CC;AAED,SAAgB,gBAAgB,CAAC,CAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,YAAY,CAChC,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,KAAK,CACR,CAAC;IACF,SAAS,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC5C,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IACtC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IAC9B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,cAAc,CAAC,CAAe;IAC5C,OAAO,IAAI,eAAS,CAClB,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,EAAE,EACJ,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,cAAc,EAChB,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,KAAK,CACR,CAAC;AACJ,CAAC;AASD,MAAa,eAAe;IAM1B,YAAY,KAA+B;QAL3C;;;;;WAAmB;QACnB;;;;;WAAgB;QAChB;;;;;WAAuB;QACvB;;;;;WAA0B;QAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,eAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,CAAM;QAClB,IAAI,OAAO,CAAC,EAAE,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IAED,MAAM;QACJ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC;IACJ,CAAC;CACF;AA5BD,0CA4BC;AAED,MAAa,YAAY;IAYvB,YACS,SAAiB,EACjB,UAAkB,EAClB,EAAU,EACV,IAAY,EACZ,QAAgB,EAChB,QAAgB,EAChB,IAAY,EACZ,UAAmB,EACnB,KAAc;QARrB;;;;mBAAO,SAAS;WAAQ;QACxB;;;;mBAAO,UAAU;WAAQ;QACzB;;;;mBAAO,EAAE;WAAQ;QACjB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,UAAU;WAAS;QAC1B;;;;mBAAO,KAAK;WAAS;QApBvB,MAAM;QACN,4EAA4E;QAC5E,sEAAsE;QACtE,kCAAkC;QAClC,MAAM;QACC;;;;;WAAwB;QACxB;;;;;WAAqB;QACrB;;;;;WAAgB;QAChB;;;;;WAAuB;QACvB;;;;;WAAiB;IAYrB,CAAC;IAEJ,MAAM;QACJ,OAAO,IAAI,eAAe,CAAC;YACzB,SAAS,EAAE,IAAA,oBAAc,EAAC,IAAI,CAAC;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,KAAK;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA2C;QACzD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,SAAS,GAAG,IAAA,sBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC;YAC1D,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;IACpB,CAAC;CACF;AA5CD,oCA4CC;AAED,MAAa,gBAAgB;IAK3B,YAAY,QAAmC,EAAE;QAJjD;;;;mBAAU,KAAK;WAAC;QAChB;;;;;WAA0B;QAC1B;;;;;WAAkB;QAGhB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,4CAQC","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport {\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\n/**\n * +------------+\n | |\n |disconnected|\n | |\n +------------+\n ^ ^\n | |\n+------+ +----------+ +-----------+ +----------+\n| | | | | | | |\n| new | ---> | checking | ---> | connected | ---> | completed|\n| | | | | | | |\n+------+ +----+-----+ +-----------+ +----------+\n | \n | \n v \n +-------+ \n | | \n | failed| \n | | \n +-------+ \n */\n\nexport class RTCIceTransport {\n readonly id = randomUUID().toString();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n private waitStart?: Event<[]>;\n private renominating = false;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n }\n\n get role() {\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n private setState(state: RTCIceConnectionState) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n if (!candidate) {\n return this.connection.addRemoteCandidate(undefined);\n } else {\n return this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\");\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n\n async getStats(): Promise<RTCStats[]> {\n const timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n // Local candidates\n for (const candidate of this.localCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"local-candidate\",\n id: generateStatsId(\"local-candidate\", candidate.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n address: candidate.ip,\n port: candidate.port,\n protocol: candidate.protocol,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n };\n stats.push(candidateStats);\n }\n\n // Remote candidates\n for (const candidate of this.connection.remoteCandidates) {\n const ice = candidateFromIce(candidate);\n const candidateStats: RTCIceCandidateStats = {\n type: \"remote-candidate\",\n id: generateStatsId(\"remote-candidate\", ice.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n address: ice.ip,\n port: ice.port,\n protocol: ice.protocol,\n candidateType: ice.type as any,\n priority: ice.priority,\n foundation: ice.foundation,\n };\n stats.push(candidateStats);\n }\n\n // Candidate pairs\n const pairs = this.connection?.candidatePairs\n ? [\n ...this.connection.candidatePairs.filter((p) => p.nominated),\n ...this.connection.candidatePairs.filter((p) => !p.nominated),\n ]\n : [];\n for (const pair of pairs) {\n const pairStats: RTCIceCandidatePairStats = {\n type: \"candidate-pair\",\n id: generateStatsId(\"candidate-pair\", pair.foundation),\n timestamp,\n transportId: generateStatsId(\"transport\", this.id),\n localCandidateId: generateStatsId(\n \"local-candidate\",\n pair.localCandidate.foundation,\n ),\n remoteCandidateId: generateStatsId(\n \"remote-candidate\",\n pair.remoteCandidate.foundation,\n ),\n state: pair.state as any,\n nominated: pair.nominated,\n packetsSent: pair.packetsSent,\n packetsReceived: pair.packetsReceived,\n bytesSent: pair.bytesSent,\n bytesReceived: pair.bytesReceived,\n currentRoundTripTime: pair.rtt,\n };\n stats.push(pairStats);\n }\n\n return stats;\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const candidate = candidateFromSdp(data.candidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
1
+ {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport { EventTarget as DomEventTarget } from \"../helper\";\nimport {\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n type RTCStatsIceCandidatePairState,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nfunction mapCandidatePairState(state: number): RTCStatsIceCandidatePairState {\n switch (state) {\n case 0:\n return \"frozen\";\n case 1:\n return \"waiting\";\n case 2:\n return \"in-progress\";\n case 3:\n return \"succeeded\";\n case 4:\n return \"failed\";\n default:\n return \"failed\";\n }\n}\n\n/**\n * +------------+\n | |\n |disconnected|\n | |\n +------------+\n ^ ^\n | |\n+------+ +----------+ +-----------+ +----------+\n| | | | | | | |\n| new | ---> | checking | ---> | connected | ---> | completed|\n| | | | | | | |\n+------+ +----+-----+ +-----------+ +----------+\n | \n | \n v \n +-------+ \n | | \n | failed| \n | | \n +-------+ \n */\n\nexport class RTCIceTransport {\n readonly id = randomUUID().toString();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n readonly component = \"rtp\";\n iceRestarts = 0;\n private waitStart?: Event<[]>;\n private renominating = false;\n private readonly events = new DomEventTarget();\n onstatechange?: () => void;\n ongatheringstatechange?: () => void;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n this.iceGather.onGatheringStateChange.subscribe(() => {\n this.ongatheringstatechange?.();\n this.events.emit(\"gatheringstatechange\");\n });\n }\n\n addEventListener = (\n type: string,\n listener: (...args: any[]) => void,\n options?: boolean | { once?: boolean },\n ) => {\n this.events.addEventListener(type, listener, options);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.events.removeEventListener(type, listener);\n };\n\n dispatchEvent = (event: globalThis.Event) => this.events.dispatchEvent(event);\n\n get role() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return \"unknown\";\n }\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n getRemoteCandidates() {\n return this.connection.remoteCandidates\n .filter((candidate) => candidate.type !== \"prflx\")\n .map((candidate) => candidateFromIce(candidate).toJSON());\n }\n\n getLocalCandidates() {\n return this.connection.localCandidates.map((candidate) =>\n candidateFromIce(candidate).toJSON(),\n );\n }\n\n getSelectedCandidatePair() {\n const pair =\n this.connection.candidatePairs.find((candidate) => candidate.nominated) ??\n this.connection.candidatePairs.find((candidate) => candidate.state === 3);\n if (!pair) {\n return null;\n }\n\n return {\n local: candidateFromIce(pair.localCandidate).toJSON(),\n remote: candidateFromIce(pair.remoteCandidate).toJSON(),\n };\n }\n\n getLocalParameters() {\n return this.localParameters ?? null;\n }\n\n getRemoteParameters() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return null;\n }\n\n return new RTCIceParameters({\n iceLite: this.connection.remoteIsLite,\n password: this.connection.remotePassword,\n usernameFragment: this.connection.remoteUsername,\n });\n }\n\n private setState(state: RTCIceConnectionState, emitEvent = true) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n if (emitEvent) {\n this.onstatechange?.();\n this.events.emit(\"statechange\");\n }\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n return !candidate\n ? this.connection.addRemoteCandidate(undefined)\n : this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.iceRestarts++;\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\", false);\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n\n async getStats(\n timestamp = getStatsTimestamp(),\n transportId = generateStatsId(\"transport\", this.id),\n ): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n // Local candidates\n for (const candidate of this.connection.localCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"local-candidate\",\n id: generateStatsId(\"local-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Remote candidates\n for (const candidate of this.connection.remoteCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"remote-candidate\",\n id: generateStatsId(\"remote-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Candidate pairs\n const pairs = this.connection?.candidatePairs\n ? [\n ...this.connection.candidatePairs.filter((p) => p.nominated),\n ...this.connection.candidatePairs.filter((p) => !p.nominated),\n ]\n : [];\n for (const pair of pairs) {\n const pairStats: RTCIceCandidatePairStats = {\n type: \"candidate-pair\",\n id: generateStatsId(\"candidate-pair\", pair.id),\n timestamp,\n transportId,\n localCandidateId: generateStatsId(\n \"local-candidate\",\n pair.localCandidate.id,\n ),\n remoteCandidateId: generateStatsId(\n \"remote-candidate\",\n pair.remoteCandidate.id,\n ),\n state: mapCandidatePairState(pair.state),\n nominated: pair.nominated,\n packetsSent: pair.packetsSent,\n packetsReceived: pair.packetsReceived,\n bytesSent: pair.bytesSent,\n bytesReceived: pair.bytesReceived,\n currentRoundTripTime: pair.rtt,\n totalRoundTripTime: pair.totalRoundTripTime,\n roundTripTimeMeasurements: pair.roundTripTimeMeasurements,\n requestsReceived: pair.requestsReceived,\n requestsSent: pair.requestsSent,\n responsesReceived: pair.responsesReceived,\n responsesSent: pair.responsesSent,\n retransmissionsReceived: pair.retransmissionsReceived,\n retransmissionsSent: pair.retransmissionsSent,\n consentRequestsSent: pair.consentRequestsSent,\n };\n stats.push(pairStats);\n }\n\n return stats;\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n iceLite: this.connection.iceLite,\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const normalizedCandidate = data.candidate.startsWith(\"candidate:\")\n ? data.candidate.slice(\"candidate:\".length)\n : data.candidate;\n const candidate = candidateFromSdp(normalizedCandidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
@@ -2,8 +2,10 @@ import { Event } from "../imports/common";
2
2
  import { SCTP } from "../../../sctp/src";
3
3
  import { RTCDataChannel } from "../dataChannel";
4
4
  import type { RTCDtlsTransport } from "./dtls";
5
+ export declare const DEFAULT_MAX_MESSAGE_SIZE = 65536;
5
6
  export declare class RTCSctpTransport {
6
7
  port: number;
8
+ maxMessageSize: number;
7
9
  dtlsTransport: RTCDtlsTransport;
8
10
  sctp: SCTP;
9
11
  readonly onDataChannel: Event<[RTCDataChannel]>;
@@ -14,10 +16,12 @@ export declare class RTCSctpTransport {
14
16
  dataChannels: {
15
17
  [key: number]: RTCDataChannel;
16
18
  };
19
+ remoteMaxMessageSize: number;
17
20
  private dataChannelQueue;
18
21
  private dataChannelId?;
19
22
  private eventDisposer;
20
- constructor(port?: number);
23
+ constructor(port?: number, maxMessageSize?: number);
24
+ get transport(): RTCDtlsTransport;
21
25
  setDtlsTransport(dtlsTransport: RTCDtlsTransport): void;
22
26
  private get isServer();
23
27
  channelByLabel(label: string): RTCDataChannel | undefined;
@@ -25,8 +29,11 @@ export declare class RTCSctpTransport {
25
29
  dataChannelAddNegotiated(channel: RTCDataChannel): void;
26
30
  dataChannelOpen(channel: RTCDataChannel): void;
27
31
  private dataChannelFlush;
28
- datachannelSend: (channel: RTCDataChannel, data: Buffer | string) => void;
29
- static getCapabilities(): RTCSctpCapabilities;
32
+ private assertSendableMessageSize;
33
+ datachannelSend: (channel: RTCDataChannel, data: Buffer | string) => number;
34
+ getCapabilities(): RTCSctpCapabilities;
35
+ static getCapabilities(maxMessageSize?: number): RTCSctpCapabilities;
36
+ setRemoteMaxMessageSize(maxMessageSize?: number): void;
30
37
  setRemotePort(port: number): void;
31
38
  start(remotePort: number): Promise<void>;
32
39
  stop(): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RTCSctpCapabilities = exports.RTCSctpTransport = void 0;
3
+ exports.RTCSctpCapabilities = exports.RTCSctpTransport = exports.DEFAULT_MAX_MESSAGE_SIZE = void 0;
4
4
  const crypto_1 = require("crypto");
5
5
  const jspack_1 = require("@shinyoshiaki/jspack");
6
6
  const common_1 = require("../imports/common");
@@ -8,14 +8,21 @@ const src_1 = require("../../../sctp/src");
8
8
  const const_1 = require("../const");
9
9
  const dataChannel_1 = require("../dataChannel");
10
10
  const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/sctp.ts");
11
+ exports.DEFAULT_MAX_MESSAGE_SIZE = 65536;
11
12
  class RTCSctpTransport {
12
- constructor(port = 5000) {
13
+ constructor(port = 5000, maxMessageSize = exports.DEFAULT_MAX_MESSAGE_SIZE) {
13
14
  Object.defineProperty(this, "port", {
14
15
  enumerable: true,
15
16
  configurable: true,
16
17
  writable: true,
17
18
  value: port
18
19
  });
20
+ Object.defineProperty(this, "maxMessageSize", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: maxMessageSize
25
+ });
19
26
  Object.defineProperty(this, "dtlsTransport", {
20
27
  enumerable: true,
21
28
  configurable: true,
@@ -64,6 +71,12 @@ class RTCSctpTransport {
64
71
  writable: true,
65
72
  value: {}
66
73
  });
74
+ Object.defineProperty(this, "remoteMaxMessageSize", {
75
+ enumerable: true,
76
+ configurable: true,
77
+ writable: true,
78
+ value: exports.DEFAULT_MAX_MESSAGE_SIZE
79
+ });
67
80
  Object.defineProperty(this, "dataChannelQueue", {
68
81
  enumerable: true,
69
82
  configurable: true,
@@ -186,17 +199,24 @@ class RTCSctpTransport {
186
199
  configurable: true,
187
200
  writable: true,
188
201
  value: (channel, data) => {
189
- channel.addBufferedAmount(data.length);
202
+ const userData = Buffer.isBuffer(data) ? data : Buffer.from(data);
203
+ const size = (0, dataChannel_1.getDataChannelMessageSize)(data);
204
+ this.assertSendableMessageSize(size);
205
+ channel.addBufferedAmount(size);
190
206
  this.dataChannelQueue.push(typeof data === "string"
191
- ? [channel, const_1.WEBRTC_STRING, Buffer.from(data)]
192
- : [channel, const_1.WEBRTC_BINARY, data]);
207
+ ? [channel, const_1.WEBRTC_STRING, userData]
208
+ : [channel, const_1.WEBRTC_BINARY, userData]);
193
209
  if (this.sctp.associationState !== src_1.SCTP_STATE.ESTABLISHED) {
194
210
  log("sctp not established", this.sctp.associationState);
195
211
  }
196
212
  this.dataChannelFlush();
213
+ return size;
197
214
  }
198
215
  });
199
216
  }
217
+ get transport() {
218
+ return this.dtlsTransport;
219
+ }
200
220
  setDtlsTransport(dtlsTransport) {
201
221
  if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {
202
222
  return;
@@ -263,7 +283,7 @@ class RTCSctpTransport {
263
283
  }
264
284
  }
265
285
  dataChannelOpen(channel) {
266
- if (channel.id) {
286
+ if (channel.id !== undefined) {
267
287
  if (this.dataChannels[channel.id])
268
288
  throw new Error(`Data channel with ID ${channel.id} already registered`);
269
289
  this.dataChannels[channel.id] = channel;
@@ -274,11 +294,11 @@ class RTCSctpTransport {
274
294
  if (!channel.ordered) {
275
295
  channelType = 0x80;
276
296
  }
277
- if (channel.maxRetransmits) {
297
+ if (channel.maxRetransmits !== null) {
278
298
  channelType = 1;
279
299
  reliability = channel.maxRetransmits;
280
300
  }
281
- else if (channel.maxPacketLifeTime) {
301
+ else if (channel.maxPacketLifeTime !== null) {
282
302
  channelType = 2;
283
303
  reliability = channel.maxPacketLifeTime;
284
304
  }
@@ -325,12 +345,12 @@ class RTCSctpTransport {
325
345
  });
326
346
  }
327
347
  else {
328
- const expiry = channel.maxPacketLifeTime
348
+ const expiry = channel.maxPacketLifeTime !== null
329
349
  ? Date.now() + channel.maxPacketLifeTime / 1000
330
350
  : undefined;
331
351
  await this.sctp.send(streamId, protocol, userData, {
332
352
  expiry,
333
- maxRetransmits: channel.maxRetransmits,
353
+ maxRetransmits: channel.maxRetransmits ?? undefined,
334
354
  ordered: channel.ordered,
335
355
  });
336
356
  channel.addBufferedAmount(-userData.length);
@@ -339,8 +359,19 @@ class RTCSctpTransport {
339
359
  // Resetting the queue to empty array mitigates this.
340
360
  this.dataChannelQueue = [];
341
361
  }
342
- static getCapabilities() {
343
- return new RTCSctpCapabilities(65536);
362
+ assertSendableMessageSize(size) {
363
+ if (this.remoteMaxMessageSize !== 0 && size > this.remoteMaxMessageSize) {
364
+ throw new Error(`max-message-size exceeded: ${size} > ${this.remoteMaxMessageSize}`);
365
+ }
366
+ }
367
+ getCapabilities() {
368
+ return RTCSctpTransport.getCapabilities(this.maxMessageSize);
369
+ }
370
+ static getCapabilities(maxMessageSize = exports.DEFAULT_MAX_MESSAGE_SIZE) {
371
+ return new RTCSctpCapabilities(maxMessageSize);
372
+ }
373
+ setRemoteMaxMessageSize(maxMessageSize) {
374
+ this.remoteMaxMessageSize = maxMessageSize ?? exports.DEFAULT_MAX_MESSAGE_SIZE;
344
375
  }
345
376
  setRemotePort(port) {
346
377
  this.sctp.setRemotePort(port);
@@ -375,7 +406,7 @@ class RTCSctpTransport {
375
406
  this.dataChannelQueue = this.dataChannelQueue.filter((queueItem) => queueItem[0].id !== channel.id);
376
407
  // Remove any pending reconfiguration requests for this channel
377
408
  this.sctp.reconfigQueue = this.sctp.reconfigQueue.filter((streamId) => streamId !== channel.id);
378
- if (channel.id) {
409
+ if (channel.id !== undefined) {
379
410
  delete this.dataChannels[channel.id];
380
411
  }
381
412
  channel.setReadyState("closed");