node-datachannel 0.27.0 → 0.29.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 (104) hide show
  1. package/.eslintrc.json +25 -25
  2. package/.prettierignore +7 -0
  3. package/.prettierrc +1 -0
  4. package/API.md +34 -4
  5. package/BULDING.md +12 -2
  6. package/CMakeLists.txt +10 -4
  7. package/README.md +22 -18
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/lib/datachannel-stream.cjs +13 -13
  10. package/dist/cjs/lib/datachannel-stream.cjs.map +1 -1
  11. package/dist/cjs/lib/index.cjs +4 -1
  12. package/dist/cjs/lib/index.cjs.map +1 -1
  13. package/dist/cjs/lib/websocket-server.cjs.map +1 -1
  14. package/dist/cjs/lib/websocket.cjs.map +1 -1
  15. package/dist/cjs/polyfill/Events.cjs +52 -3
  16. package/dist/cjs/polyfill/Events.cjs.map +1 -1
  17. package/dist/cjs/polyfill/Exception.cjs.map +1 -1
  18. package/dist/cjs/polyfill/RTCCertificate.cjs +5 -2
  19. package/dist/cjs/polyfill/RTCCertificate.cjs.map +1 -1
  20. package/dist/cjs/polyfill/RTCDataChannel.cjs +43 -22
  21. package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -1
  22. package/dist/cjs/polyfill/RTCDtlsTransport.cjs +6 -5
  23. package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -1
  24. package/dist/cjs/polyfill/RTCError.cjs +9 -2
  25. package/dist/cjs/polyfill/RTCError.cjs.map +1 -1
  26. package/dist/cjs/polyfill/RTCIceCandidate.cjs +13 -8
  27. package/dist/cjs/polyfill/RTCIceCandidate.cjs.map +1 -1
  28. package/dist/cjs/polyfill/RTCIceTransport.cjs +26 -16
  29. package/dist/cjs/polyfill/RTCIceTransport.cjs.map +1 -1
  30. package/dist/cjs/polyfill/RTCPeerConnection.cjs +80 -70
  31. package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -1
  32. package/dist/cjs/polyfill/RTCSctpTransport.cjs +9 -11
  33. package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -1
  34. package/dist/cjs/polyfill/RTCSessionDescription.cjs +10 -2
  35. package/dist/cjs/polyfill/RTCSessionDescription.cjs.map +1 -1
  36. package/dist/cjs/polyfill/index.cjs.map +1 -1
  37. package/dist/esm/index.mjs.map +1 -1
  38. package/dist/esm/lib/datachannel-stream.mjs.map +1 -1
  39. package/dist/esm/lib/index.mjs +4 -2
  40. package/dist/esm/lib/index.mjs.map +1 -1
  41. package/dist/esm/lib/websocket-server.mjs.map +1 -1
  42. package/dist/esm/lib/websocket.mjs.map +1 -1
  43. package/dist/esm/polyfill/Events.mjs +52 -4
  44. package/dist/esm/polyfill/Events.mjs.map +1 -1
  45. package/dist/esm/polyfill/Exception.mjs.map +1 -1
  46. package/dist/esm/polyfill/RTCCertificate.mjs +5 -2
  47. package/dist/esm/polyfill/RTCCertificate.mjs.map +1 -1
  48. package/dist/esm/polyfill/RTCDataChannel.mjs +43 -22
  49. package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -1
  50. package/dist/esm/polyfill/RTCDtlsTransport.mjs +6 -5
  51. package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -1
  52. package/dist/esm/polyfill/RTCError.mjs +9 -2
  53. package/dist/esm/polyfill/RTCError.mjs.map +1 -1
  54. package/dist/esm/polyfill/RTCIceCandidate.mjs +13 -8
  55. package/dist/esm/polyfill/RTCIceCandidate.mjs.map +1 -1
  56. package/dist/esm/polyfill/RTCIceTransport.mjs +26 -17
  57. package/dist/esm/polyfill/RTCIceTransport.mjs.map +1 -1
  58. package/dist/esm/polyfill/RTCPeerConnection.mjs +80 -70
  59. package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -1
  60. package/dist/esm/polyfill/RTCSctpTransport.mjs +9 -11
  61. package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -1
  62. package/dist/esm/polyfill/RTCSessionDescription.mjs +10 -2
  63. package/dist/esm/polyfill/RTCSessionDescription.mjs.map +1 -1
  64. package/dist/esm/polyfill/index.mjs.map +1 -1
  65. package/dist/types/lib/index.d.ts +14 -3
  66. package/dist/types/lib/types.d.ts +30 -7
  67. package/dist/types/polyfill/Events.d.ts +4 -1
  68. package/dist/types/polyfill/RTCCertificate.d.ts +1 -0
  69. package/dist/types/polyfill/RTCDataChannel.d.ts +6 -6
  70. package/dist/types/polyfill/RTCDtlsTransport.d.ts +5 -4
  71. package/dist/types/polyfill/RTCError.d.ts +1 -0
  72. package/dist/types/polyfill/RTCIceCandidate.d.ts +1 -1
  73. package/dist/types/polyfill/RTCIceTransport.d.ts +17 -8
  74. package/dist/types/polyfill/RTCPeerConnection.d.ts +22 -11
  75. package/dist/types/polyfill/RTCSctpTransport.d.ts +4 -3
  76. package/dist/types/polyfill/RTCSessionDescription.d.ts +1 -0
  77. package/jest.config.ts +8 -8
  78. package/package.json +6 -3
  79. package/rollup.config.mjs +1 -1
  80. package/src/cpp/data-channel-wrapper.cpp +11 -0
  81. package/src/cpp/ice-udp-mux-listener-wrapper.cpp +150 -0
  82. package/src/cpp/ice-udp-mux-listener-wrapper.h +43 -0
  83. package/src/cpp/main.cpp +2 -0
  84. package/src/cpp/peer-connection-wrapper.cpp +68 -2
  85. package/src/cpp/peer-connection-wrapper.h +1 -0
  86. package/src/index.ts +0 -1
  87. package/src/lib/datachannel-stream.ts +83 -84
  88. package/src/lib/index.ts +175 -139
  89. package/src/lib/types.ts +122 -71
  90. package/src/lib/websocket-server.ts +25 -25
  91. package/src/lib/websocket.ts +19 -19
  92. package/src/polyfill/Events.ts +71 -18
  93. package/src/polyfill/Exception.ts +24 -24
  94. package/src/polyfill/README.md +8 -8
  95. package/src/polyfill/RTCCertificate.ts +16 -12
  96. package/src/polyfill/RTCDataChannel.ts +216 -191
  97. package/src/polyfill/RTCDtlsTransport.ts +39 -39
  98. package/src/polyfill/RTCError.ts +63 -56
  99. package/src/polyfill/RTCIceCandidate.ts +120 -116
  100. package/src/polyfill/RTCIceTransport.ts +72 -64
  101. package/src/polyfill/RTCPeerConnection.ts +436 -420
  102. package/src/polyfill/RTCSctpTransport.ts +44 -47
  103. package/src/polyfill/RTCSessionDescription.ts +26 -17
  104. package/src/polyfill/index.ts +22 -22
@@ -28,7 +28,7 @@ var __privateWrapper = (obj, member, setter, getter) => ({
28
28
  return __privateGet(obj, member, getter);
29
29
  }
30
30
  });
31
- var _peerConnection, _localOffer, _localAnswer, _dataChannels, _dataChannelsClosed, _config, _canTrickleIceCandidates, _sctp, _localCandidates, _remoteCandidates;
31
+ var _peerConnection, _localOffer, _localAnswer, _dataChannels, _dataChannelsClosed, _config, _canTrickleIceCandidates, _sctp, _announceNegotiation, _localCandidates, _remoteCandidates;
32
32
  class RTCPeerConnection extends EventTarget {
33
33
  constructor(config = { iceServers: [], iceTransportPolicy: "all" }) {
34
34
  super();
@@ -38,20 +38,22 @@ class RTCPeerConnection extends EventTarget {
38
38
  __privateAdd(this, _dataChannels);
39
39
  __privateAdd(this, _dataChannelsClosed, 0);
40
40
  __privateAdd(this, _config);
41
- __privateAdd(this, _canTrickleIceCandidates);
41
+ __privateAdd(this, _canTrickleIceCandidates, null);
42
42
  __privateAdd(this, _sctp);
43
+ __privateAdd(this, _announceNegotiation, false);
43
44
  __privateAdd(this, _localCandidates, []);
44
45
  __privateAdd(this, _remoteCandidates, []);
45
46
  // events
46
- __publicField(this, "onconnectionstatechange");
47
+ __publicField(this, "onconnectionstatechange", null);
48
+ // For ondatachannel we need to define type manually
47
49
  __publicField(this, "ondatachannel");
48
- __publicField(this, "onicecandidate");
49
- __publicField(this, "onicecandidateerror");
50
- __publicField(this, "oniceconnectionstatechange");
51
- __publicField(this, "onicegatheringstatechange");
52
- __publicField(this, "onnegotiationneeded");
53
- __publicField(this, "onsignalingstatechange");
54
- __publicField(this, "ontrack");
50
+ __publicField(this, "onicecandidate", null);
51
+ __publicField(this, "onicecandidateerror", null);
52
+ __publicField(this, "oniceconnectionstatechange", null);
53
+ __publicField(this, "onicegatheringstatechange", null);
54
+ __publicField(this, "onnegotiationneeded", null);
55
+ __publicField(this, "onsignalingstatechange", null);
56
+ __publicField(this, "ontrack", null);
55
57
  this._checkConfiguration(config);
56
58
  __privateSet(this, _config, config);
57
59
  __privateSet(this, _localOffer, createDeferredPromise());
@@ -60,22 +62,19 @@ class RTCPeerConnection extends EventTarget {
60
62
  __privateSet(this, _canTrickleIceCandidates, null);
61
63
  try {
62
64
  const peerIdentity = config?.peerIdentity ?? `peer-${getRandomString(7)}`;
63
- __privateSet(this, _peerConnection, config?.peerConnection ?? new index.PeerConnection(
64
- peerIdentity,
65
- {
66
- ...config,
67
- iceServers: config?.iceServers?.map((server) => {
68
- const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
69
- return urls.map((url) => {
70
- if (server.username && server.credential) {
71
- const [protocol, rest] = url.split(/:(.*)/);
72
- return `${protocol}:${server.username}:${server.credential}@${rest}`;
73
- }
74
- return url;
75
- });
76
- }).flat() ?? []
77
- }
78
- ));
65
+ __privateSet(this, _peerConnection, config?.peerConnection ?? new index.PeerConnection(peerIdentity, {
66
+ ...config,
67
+ iceServers: config?.iceServers?.map((server) => {
68
+ const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
69
+ return urls.map((url) => {
70
+ if (server.username && server.credential) {
71
+ const [protocol, rest] = url.split(/:(.*)/);
72
+ return `${protocol}:${server.username}:${server.credential}@${rest}`;
73
+ }
74
+ return url;
75
+ });
76
+ }).flat() ?? []
77
+ }));
79
78
  } catch (error) {
80
79
  if (!error || !error.message) throw new Exception.NotFoundError("Unknown error");
81
80
  throw new Exception.SyntaxError(error.message);
@@ -99,10 +98,10 @@ class RTCPeerConnection extends EventTarget {
99
98
  });
100
99
  __privateGet(this, _peerConnection).onLocalDescription((sdp, type) => {
101
100
  if (type === "offer") {
102
- __privateGet(this, _localOffer).resolve({ sdp, type });
101
+ __privateGet(this, _localOffer).resolve(new RTCSessionDescription.default({ sdp, type }));
103
102
  }
104
103
  if (type === "answer") {
105
- __privateGet(this, _localAnswer).resolve({ sdp, type });
104
+ __privateGet(this, _localAnswer).resolve(new RTCSessionDescription.default({ sdp, type }));
106
105
  }
107
106
  });
108
107
  __privateGet(this, _peerConnection).onLocalCandidate((candidate, sdpMid) => {
@@ -114,42 +113,32 @@ class RTCPeerConnection extends EventTarget {
114
113
  this.dispatchEvent(new Events.RTCPeerConnectionIceEvent(new RTCIceCandidate.default({ candidate, sdpMid })));
115
114
  });
116
115
  this.addEventListener("connectionstatechange", (e) => {
117
- if (this.onconnectionstatechange) this.onconnectionstatechange(e);
116
+ this.onconnectionstatechange?.(e);
118
117
  });
119
118
  this.addEventListener("signalingstatechange", (e) => {
120
- if (this.onsignalingstatechange) this.onsignalingstatechange(e);
119
+ this.onsignalingstatechange?.(e);
121
120
  });
122
121
  this.addEventListener("iceconnectionstatechange", (e) => {
123
- if (this.oniceconnectionstatechange) this.oniceconnectionstatechange(e);
122
+ this.oniceconnectionstatechange?.(e);
124
123
  });
125
124
  this.addEventListener("icegatheringstatechange", (e) => {
126
- if (this.onicegatheringstatechange) this.onicegatheringstatechange(e);
125
+ this.onicegatheringstatechange?.(e);
127
126
  });
128
127
  this.addEventListener("datachannel", (e) => {
129
- if (this.ondatachannel) this.ondatachannel(e);
128
+ this.ondatachannel?.(e);
130
129
  });
131
130
  this.addEventListener("icecandidate", (e) => {
132
- if (this.onicecandidate) this.onicecandidate(e);
131
+ this.onicecandidate?.(e);
132
+ });
133
+ this.addEventListener("track", (e) => {
134
+ this.ontrack?.(e);
135
+ });
136
+ this.addEventListener("negotiationneeded", (e) => {
137
+ __privateSet(this, _announceNegotiation, true);
138
+ this.onnegotiationneeded?.(e);
133
139
  });
134
140
  __privateSet(this, _sctp, new RTCSctpTransport.default({
135
- pc: this,
136
- extraFunctions: {
137
- maxDataChannelId: () => {
138
- return __privateGet(this, _peerConnection).maxDataChannelId();
139
- },
140
- maxMessageSize: () => {
141
- return __privateGet(this, _peerConnection).maxMessageSize();
142
- },
143
- localCandidates: () => {
144
- return __privateGet(this, _localCandidates);
145
- },
146
- remoteCandidates: () => {
147
- return __privateGet(this, _remoteCandidates);
148
- },
149
- selectedCandidatePair: () => {
150
- return __privateGet(this, _peerConnection).getSelectedCandidatePair();
151
- }
152
- }
141
+ pc: this
153
142
  }));
154
143
  }
155
144
  static async generateCertificate() {
@@ -162,22 +151,22 @@ class RTCPeerConnection extends EventTarget {
162
151
  if (Array.isArray(config?.iceServers)) {
163
152
  for (let i = 0; i < config.iceServers.length; i++) {
164
153
  if (config.iceServers[i] === null) throw new TypeError("IceServers cannot be null");
165
- if (config.iceServers[i] === void 0) throw new TypeError("IceServers cannot be undefined");
166
- if (Object.keys(config.iceServers[i]).length === 0) throw new TypeError("IceServers cannot be empty");
154
+ if (config.iceServers[i] === void 0)
155
+ throw new TypeError("IceServers cannot be undefined");
156
+ if (Object.keys(config.iceServers[i]).length === 0)
157
+ throw new TypeError("IceServers cannot be empty");
167
158
  if (typeof config.iceServers[i].urls === "string")
168
159
  config.iceServers[i].urls = [config.iceServers[i].urls];
169
160
  if (config.iceServers[i].urls?.some((url) => url == ""))
170
161
  throw new Exception.SyntaxError("IceServers urls cannot be empty");
171
- if (config.iceServers[i].urls?.some(
172
- (url) => {
173
- try {
174
- const parsedURL = new URL(url);
175
- return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);
176
- } catch (error) {
177
- return true;
178
- }
162
+ if (config.iceServers[i].urls?.some((url) => {
163
+ try {
164
+ const parsedURL = new URL(url);
165
+ return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);
166
+ } catch (error) {
167
+ return true;
179
168
  }
180
- ))
169
+ }))
181
170
  throw new Exception.SyntaxError("IceServers urls wrong format");
182
171
  if (config.iceServers[i].urls?.some((url) => url.startsWith("turn"))) {
183
172
  if (!config.iceServers[i].username)
@@ -196,6 +185,22 @@ class RTCPeerConnection extends EventTarget {
196
185
  this._checkConfiguration(config);
197
186
  __privateSet(this, _config, config);
198
187
  }
188
+ // Extra FUnctions
189
+ get ext_maxDataChannelId() {
190
+ return __privateGet(this, _peerConnection).maxDataChannelId();
191
+ }
192
+ get ext_maxMessageSize() {
193
+ return __privateGet(this, _peerConnection).maxMessageSize();
194
+ }
195
+ get ext_localCandidates() {
196
+ return __privateGet(this, _localCandidates);
197
+ }
198
+ get ext_remoteCandidates() {
199
+ return __privateGet(this, _remoteCandidates);
200
+ }
201
+ selectedCandidatePair() {
202
+ return __privateGet(this, _peerConnection).getSelectedCandidatePair();
203
+ }
199
204
  get canTrickleIceCandidates() {
200
205
  return __privateGet(this, _canTrickleIceCandidates);
201
206
  }
@@ -251,15 +256,19 @@ class RTCPeerConnection extends EventTarget {
251
256
  throw new Exception.OperationError("This is only for test case.");
252
257
  }
253
258
  try {
254
- __privateGet(this, _peerConnection).addRemoteCandidate(candidate.candidate, candidate.sdpMid || "0");
259
+ __privateGet(this, _peerConnection).addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? "0");
255
260
  __privateGet(this, _remoteCandidates).push(
256
- new RTCIceCandidate.default({ candidate: candidate.candidate, sdpMid: candidate.sdpMid || "0" })
261
+ new RTCIceCandidate.default({
262
+ candidate: candidate.candidate,
263
+ sdpMid: candidate.sdpMid ?? "0"
264
+ })
257
265
  );
258
266
  } catch (error) {
259
267
  if (!error || !error.message) throw new Exception.NotFoundError("Unknown error");
260
268
  if (error.message.includes("remote candidate without remote description"))
261
269
  throw new Exception.InvalidStateError(error.message);
262
- if (error.message.includes("Invalid candidate format")) throw new Exception.OperationError(error.message);
270
+ if (error.message.includes("Invalid candidate format"))
271
+ throw new Exception.OperationError(error.message);
263
272
  throw new Exception.NotFoundError(error.message);
264
273
  }
265
274
  }
@@ -272,10 +281,6 @@ class RTCPeerConnection extends EventTarget {
272
281
  throw new DOMException("Not implemented");
273
282
  }
274
283
  close() {
275
- __privateGet(this, _dataChannels).forEach((channel) => {
276
- channel.close();
277
- __privateWrapper(this, _dataChannelsClosed)._++;
278
- });
279
284
  __privateGet(this, _peerConnection).close();
280
285
  }
281
286
  createAnswer() {
@@ -289,6 +294,10 @@ class RTCPeerConnection extends EventTarget {
289
294
  __privateGet(this, _dataChannels).delete(dataChannel);
290
295
  __privateWrapper(this, _dataChannelsClosed)._++;
291
296
  });
297
+ if (__privateGet(this, _announceNegotiation) == null) {
298
+ __privateSet(this, _announceNegotiation, false);
299
+ this.dispatchEvent(new Event("negotiationneeded"));
300
+ }
292
301
  return dataChannel;
293
302
  }
294
303
  createOffer() {
@@ -399,6 +408,7 @@ _dataChannelsClosed = new WeakMap();
399
408
  _config = new WeakMap();
400
409
  _canTrickleIceCandidates = new WeakMap();
401
410
  _sctp = new WeakMap();
411
+ _announceNegotiation = new WeakMap();
402
412
  _localCandidates = new WeakMap();
403
413
  _remoteCandidates = new WeakMap();
404
414
  function createDeferredPromise() {
@@ -1 +1 @@
1
- {"version":3,"file":"RTCPeerConnection.cjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: any;\n #localAnswer: any;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null;\n #sctp: globalThis.RTCSctpTransport;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCDataChannelEvent) => any) | null;\n onicecandidate: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCPeerConnectionIceEvent) => any) | null;\n onicecandidateerror: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n oniceconnectionstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n onicegatheringstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n onnegotiationneeded: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n onsignalingstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;\n ontrack: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCTrackEvent) => any) | null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined) throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0) throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some(\n (url) => {\n try {\n const parsedURL = new URL(url)\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol)\n } catch (error) {\n return true\n }\n },\n )\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection = config?.peerConnection ?? new PeerConnection(peerIdentity,\n {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n },\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve({ sdp, type });\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve({ sdp, type });\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n if (this.onconnectionstatechange) this.onconnectionstatechange(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n if (this.onsignalingstatechange) this.onsignalingstatechange(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n if (this.oniceconnectionstatechange) this.oniceconnectionstatechange(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n if (this.onicegatheringstatechange) this.onicegatheringstatechange(e);\n });\n this.addEventListener('datachannel', (e) => {\n if (this.ondatachannel) this.ondatachannel(e as globalThis.RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n if (this.onicecandidate) this.onicecandidate(e as globalThis.RTCPeerConnectionIceEvent);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n extraFunctions: {\n maxDataChannelId: (): number => {\n return this.#peerConnection.maxDataChannelId();\n },\n maxMessageSize: (): number => {\n return this.#peerConnection.maxMessageSize();\n },\n localCandidates: (): globalThis.RTCIceCandidate[] => {\n return this.#localCandidates;\n },\n remoteCandidates: (): globalThis.RTCIceCandidate[] => {\n return this.#remoteCandidates;\n },\n selectedCandidatePair: (): { local: SelectedCandidateInfo; remote: SelectedCandidateInfo } | null => {\n return this.#peerConnection.getSelectedCandidatePair();\n },\n },\n });\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription():globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid || '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({ candidate: candidate.candidate, sdpMid: candidate.sdpMid || '0' }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format')) throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n // close all channels before shutting down\n this.#dataChannels.forEach((channel) => {\n channel.close();\n this.#dataChannelsClosed++;\n });\n\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n\n createDataChannel(label, opts = {}): globalThis.RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, opts);\n const dataChannel = new RTCDataChannel(channel, opts);\n\n // ensure we can close all channels when shutting down\n this.#dataChannels.add(dataChannel);\n dataChannel.addEventListener('close', () => {\n this.#dataChannels.delete(dataChannel);\n this.#dataChannelsClosed++;\n });\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if(!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["PeerConnection","exceptions.NotFoundError","exceptions.SyntaxError","RTCDataChannel","RTCDataChannelEvent","RTCIceCandidate","RTCPeerConnectionIceEvent","RTCSctpTransport","exceptions.InvalidAccessError","RTCSessionDescription","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":"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"}
1
+ {"version":3,"file":"RTCPeerConnection.cjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, opts);\n const dataChannel = new RTCDataChannel(channel, opts);\n\n // ensure we can close all channels when shutting down\n this.#dataChannels.add(dataChannel);\n dataChannel.addEventListener('close', () => {\n this.#dataChannels.delete(dataChannel);\n this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["PeerConnection","exceptions.NotFoundError","exceptions.SyntaxError","RTCDataChannel","RTCDataChannelEvent","RTCSessionDescription","RTCIceCandidate","RTCPeerConnectionIceEvent","RTCSctpTransport","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":"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"}
@@ -14,31 +14,30 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
14
14
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
15
15
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
16
16
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
17
- var _pc, _extraFunctions, _transport;
17
+ var _pc, _transport;
18
18
  class RTCSctpTransport extends EventTarget {
19
19
  constructor(initial) {
20
20
  super();
21
21
  __privateAdd(this, _pc, null);
22
- __privateAdd(this, _extraFunctions, null);
23
22
  __privateAdd(this, _transport, null);
24
23
  __publicField(this, "onstatechange", null);
25
24
  __privateSet(this, _pc, initial.pc);
26
- __privateSet(this, _extraFunctions, initial.extraFunctions);
27
- __privateSet(this, _transport, new RTCDtlsTransport.default({ pc: initial.pc, extraFunctions: initial.extraFunctions }));
25
+ __privateSet(this, _transport, new RTCDtlsTransport.default({
26
+ pc: initial.pc
27
+ }));
28
28
  __privateGet(this, _pc).addEventListener("connectionstatechange", () => {
29
- this.dispatchEvent(new Event("statechange"));
30
- });
31
- this.addEventListener("statechange", (e) => {
32
- if (this.onstatechange) this.onstatechange(e);
29
+ const e = new Event("statechange");
30
+ this.dispatchEvent(e);
31
+ this.onstatechange?.(e);
33
32
  });
34
33
  }
35
34
  get maxChannels() {
36
35
  if (this.state !== "connected") return null;
37
- return __privateGet(this, _pc) ? __privateGet(this, _extraFunctions).maxDataChannelId() : 0;
36
+ return __privateGet(this, _pc).ext_maxDataChannelId;
38
37
  }
39
38
  get maxMessageSize() {
40
39
  if (this.state !== "connected") return null;
41
- return __privateGet(this, _pc) ? __privateGet(this, _extraFunctions).maxMessageSize() : 0;
40
+ return __privateGet(this, _pc)?.ext_maxMessageSize ?? 65536;
42
41
  }
43
42
  get state() {
44
43
  let state = __privateGet(this, _pc).connectionState;
@@ -54,7 +53,6 @@ class RTCSctpTransport extends EventTarget {
54
53
  }
55
54
  }
56
55
  _pc = new WeakMap();
57
- _extraFunctions = new WeakMap();
58
56
  _transport = new WeakMap();
59
57
 
60
58
  exports.default = RTCSctpTransport;
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSctpTransport.cjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: globalThis.RTCPeerConnection = null;\n #extraFunctions = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: ((this: globalThis.RTCSctpTransport, ev: Event) => any) | null = null;\n\n constructor(initial: { pc: globalThis.RTCPeerConnection, extraFunctions }) {\n super();\n this.#pc = initial.pc;\n this.#extraFunctions = initial.extraFunctions;\n\n this.#transport = new RTCDtlsTransport({ pc: initial.pc, extraFunctions: initial.extraFunctions });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n this.dispatchEvent(new Event('statechange'));\n });\n\n // forward events to properties\n this.addEventListener('statechange', (e) => {\n if (this.onstatechange) this.onstatechange(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc ? this.#extraFunctions.maxDataChannelId() : 0;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc ? this.#extraFunctions.maxMessageSize() : 0;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":["RTCDtlsTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,eAAA,EAAA,UAAA,CAAA;AAGA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO7F,YAAY,OAA+D,EAAA;AACvE,IAAM,KAAA,EAAA,CAAA;AAPV,IAAoC,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACpC,IAAkB,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAClB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAAgF,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5E,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAkB,OAAQ,CAAA,cAAA,CAAA,CAAA;AAE/B,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAIA,wBAAA,CAAiB,EAAE,EAAA,EAAI,QAAQ,EAAI,EAAA,cAAA,EAAgB,OAAQ,CAAA,cAAA,EAAgB,CAAA,CAAA,CAAA;AAGjG,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACrD,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,aAAa,CAAC,CAAA,CAAA;AAAA,KAC9C,CAAA,CAAA;AAGD,IAAK,IAAA,CAAA,gBAAA,CAAiB,aAAe,EAAA,CAAC,CAAM,KAAA;AACxC,MAAA,IAAI,IAAK,CAAA,aAAA,EAAoB,IAAA,CAAA,aAAA,CAAc,CAAC,CAAA,CAAA;AAAA,KAC/C,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC7B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,GAAA,CAAA,GAAM,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,kBAAqB,GAAA,CAAA,CAAA;AAAA,GAChE;AAAA,EAEA,IAAI,cAAyB,GAAA;AACzB,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,GAAA,CAAA,GAAM,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,gBAAmB,GAAA,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG1C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC3C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACD,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC7E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACZ;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,SAAyC,GAAA;AACzC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GAChB;AACJ,CAAA;AAjDI,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSctpTransport.cjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc,\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":["RTCDtlsTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAIA,wBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAA,GACzC;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -14,12 +14,20 @@ class RTCSessionDescription {
14
14
  constructor(init) {
15
15
  __privateAdd(this, _type);
16
16
  __privateAdd(this, _sdp);
17
- __privateSet(this, _type, init ? init.type : null);
18
- __privateSet(this, _sdp, init ? init.sdp : null);
17
+ __privateSet(this, _type, init?.type);
18
+ __privateSet(this, _sdp, init?.sdp ?? "");
19
19
  }
20
20
  get type() {
21
21
  return __privateGet(this, _type);
22
22
  }
23
+ set type(type) {
24
+ if (type !== "offer" && type !== "answer" && type !== "pranswer" && type !== "rollback") {
25
+ throw new TypeError(
26
+ `Failed to set the 'type' property on 'RTCSessionDescription': The provided value '${type}' is not a valid enum value of type RTCSdpType.`
27
+ );
28
+ }
29
+ __privateSet(this, _type, type);
30
+ }
23
31
  get sdp() {
24
32
  return __privateGet(this, _sdp);
25
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSessionDescription.cjs","sources":["../../../src/polyfill/RTCSessionDescription.ts"],"sourcesContent":["// https://developer.mozilla.org/docs/Web/API/RTCSessionDescription\n//\n// Example usage\n// const init = {\n// type: 'offer',\n// sdp: 'v=0\\r\\no=- 1234567890 1234567890 IN IP4 192.168.1.1\\r\\ns=-\\r\\nt=0 0\\r\\na=ice-ufrag:abcd\\r\\na=ice-pwd:efgh\\r\\n'\n// };\n\nexport default class RTCSessionDescription implements globalThis.RTCSessionDescriptionInit {\n #type: globalThis.RTCSdpType;\n #sdp: string;\n\n constructor(init: globalThis.RTCSessionDescriptionInit) {\n this.#type = init ? init.type : null;\n this.#sdp = init ? init.sdp : null;\n }\n\n get type(): globalThis.RTCSdpType {\n return this.#type;\n }\n\n get sdp(): string {\n return this.#sdp;\n }\n\n toJSON(): globalThis.RTCSessionDescriptionInit {\n return {\n sdp: this.#sdp,\n type: this.#type,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA,IAAA,KAAA,EAAA,IAAA,CAAA;AAQA,MAAqB,qBAAsE,CAAA;AAAA,EAIvF,YAAY,IAA4C,EAAA;AAHxD,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAGI,IAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,IAAO,GAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA,CAAA;AAChC,IAAK,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,IAAO,GAAA,IAAA,CAAK,GAAM,GAAA,IAAA,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,IAAI,IAA8B,GAAA;AAC9B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,GAAc,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAEA,MAA+C,GAAA;AAC3C,IAAO,OAAA;AAAA,MACH,KAAK,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA;AAAA,MACV,MAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,KACf,CAAA;AAAA,GACJ;AACJ,CAAA;AAtBI,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSessionDescription.cjs","sources":["../../../src/polyfill/RTCSessionDescription.ts"],"sourcesContent":["// https://developer.mozilla.org/docs/Web/API/RTCSessionDescription\n//\n// Example usage\n// const init = {\n// type: 'offer',\n// sdp: 'v=0\\r\\no=- 1234567890 1234567890 IN IP4 192.168.1.1\\r\\ns=-\\r\\nt=0 0\\r\\na=ice-ufrag:abcd\\r\\na=ice-pwd:efgh\\r\\n'\n// };\n\nexport default class RTCSessionDescription implements globalThis.RTCSessionDescriptionInit {\n #type: globalThis.RTCSdpType;\n #sdp: string;\n\n constructor(init: globalThis.RTCSessionDescriptionInit) {\n this.#type = init?.type;\n this.#sdp = init?.sdp ?? '';\n }\n\n get type(): globalThis.RTCSdpType {\n return this.#type;\n }\n\n set type(type) {\n if (type !== 'offer' && type !== 'answer' && type !== 'pranswer' && type !== 'rollback') {\n throw new TypeError(\n `Failed to set the 'type' property on 'RTCSessionDescription': The provided value '${type}' is not a valid enum value of type RTCSdpType.`,\n );\n }\n this.#type = type;\n }\n\n get sdp(): string {\n return this.#sdp;\n }\n\n toJSON(): globalThis.RTCSessionDescriptionInit {\n return {\n sdp: this.#sdp,\n type: this.#type,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA,IAAA,KAAA,EAAA,IAAA,CAAA;AAQA,MAAqB,qBAAsE,CAAA;AAAA,EAIzF,YAAY,IAA4C,EAAA;AAHxD,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAGE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,IAAM,EAAA,IAAA,CAAA,CAAA;AACnB,IAAK,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,MAAM,GAAO,IAAA,EAAA,CAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,IAAI,IAA8B,GAAA;AAChC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAAK,IAAM,EAAA;AACb,IAAA,IAAI,SAAS,OAAW,IAAA,IAAA,KAAS,YAAY,IAAS,KAAA,UAAA,IAAc,SAAS,UAAY,EAAA;AACvF,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,qFAAqF,IAAI,CAAA,+CAAA,CAAA;AAAA,OAC3F,CAAA;AAAA,KACF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,KAAQ,EAAA,IAAA,CAAA,CAAA;AAAA,GACf;AAAA,EAEA,IAAI,GAAc,GAAA;AAChB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,MAA+C,GAAA;AAC7C,IAAO,OAAA;AAAA,MACL,KAAK,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA;AAAA,MACV,MAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,KACb,CAAA;AAAA,GACF;AACF,CAAA;AA/BE,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/polyfill/index.ts"],"sourcesContent":["import RTCCertificate from './RTCCertificate';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCError from './RTCError';\n\nexport {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n\nexport default {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n"],"names":["RTCCertificate","RTCDataChannel","RTCDtlsTransport","RTCIceCandidate","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RTCSessionDescription","RTCDataChannelEvent","RTCPeerConnectionIceEvent","RTCError"],"mappings":";;;;;;;;;;;;;;;AAyBA,QAAe;AAAA,kBACXA,sBAAA;AAAA,kBACAC,sBAAA;AAAA,oBACAC,wBAAA;AAAA,mBACAC,uBAAA;AAAA,mBACAC,uBAAA;AAAA,qBACAC,yBAAA;AAAA,oBACAC,wBAAA;AAAA,yBACAC,6BAAA;AAAA,uBACAC,0BAAA;AAAA,6BACAC,gCAAA;AAAA,YACAC,gBAAA;AACJ,CAAA;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/polyfill/index.ts"],"sourcesContent":["import RTCCertificate from './RTCCertificate';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCError from './RTCError';\n\nexport {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n\nexport default {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n"],"names":["RTCCertificate","RTCDataChannel","RTCDtlsTransport","RTCIceCandidate","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RTCSessionDescription","RTCDataChannelEvent","RTCPeerConnectionIceEvent","RTCError"],"mappings":";;;;;;;;;;;;;;;AAyBA,QAAe;AAAA,kBACbA,sBAAA;AAAA,kBACAC,sBAAA;AAAA,oBACAC,wBAAA;AAAA,mBACAC,uBAAA;AAAA,mBACAC,uBAAA;AAAA,qBACAC,yBAAA;AAAA,oBACAC,wBAAA;AAAA,yBACAC,6BAAA;AAAA,uBACAC,0BAAA;AAAA,6BACAC,gCAAA;AAAA,YACAC,gBAAA;AACF,CAAA;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/index.ts"],"sourcesContent":["// This file is created for builder process\n// So builder can find and compile all files and folders\n// Not intended to be imported directly\n\nimport n from './lib/index';\nimport p from './polyfill/index';\n\n\nexport const nodeDataChannel = n;\nexport const polyfill = p;\n"],"names":[],"mappings":";;;AAQO,MAAM,eAAkB,GAAA,EAAA;AACxB,MAAM,QAAW,GAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/index.ts"],"sourcesContent":["// This file is created for builder process\n// So builder can find and compile all files and folders\n// Not intended to be imported directly\n\nimport n from './lib/index';\nimport p from './polyfill/index';\n\nexport const nodeDataChannel = n;\nexport const polyfill = p;\n"],"names":[],"mappings":";;;AAOO,MAAM,eAAkB,GAAA,EAAA;AACxB,MAAM,QAAW,GAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"datachannel-stream.mjs","sources":["../../../src/lib/datachannel-stream.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as stream from 'stream';\n\n/**\n * Turns a node-datachannel DataChannel into a real Node.js stream, complete with buffering,\n * backpressure (up to a point - if the buffer fills up, messages are dropped), and\n * support for piping data elsewhere.\n *\n * Read & written data may be either UTF-8 strings or Buffers - this difference exists at\n * the protocol level, and is preserved here throughout.\n */\nexport default class DataChannelStream extends stream.Duplex {\n private _rawChannel: any;\n private _readActive: boolean;\n\n\n constructor(rawChannel: any, streamOptions?: Omit<stream.DuplexOptions, 'objectMode'>) {\n super({\n allowHalfOpen: false, // Default to autoclose on end().\n ...streamOptions,\n objectMode: true, // Preserve the string/buffer distinction (WebRTC treats them differently)\n });\n\n this._rawChannel = rawChannel;\n this._readActive = true;\n\n rawChannel.onMessage((msg: any) => {\n if (!this._readActive) return; // If the buffer is full, drop messages.\n\n // If the push is rejected, we pause reading until the next call to _read().\n this._readActive = this.push(msg);\n });\n\n // When the DataChannel closes, the readable & writable ends close\n rawChannel.onClosed(() => {\n this.push(null);\n this.destroy();\n });\n\n rawChannel.onError((errMsg: string) => {\n this.destroy(new Error(`DataChannel error: ${errMsg}`));\n });\n\n // Buffer all writes until the DataChannel opens\n if (!rawChannel.isOpen()) {\n this.cork();\n rawChannel.onOpen(() => this.uncork());\n }\n }\n\n _read(): void {\n // Stop dropping messages, if the buffer filling up meant we were doing so before.\n this._readActive = true;\n }\n\n _write(chunk, _encoding, callback): void {\n let sentOk;\n\n try {\n if (Buffer.isBuffer(chunk)) {\n sentOk = this._rawChannel.sendMessageBinary(chunk);\n } else if (typeof chunk === 'string') {\n sentOk = this._rawChannel.sendMessage(chunk);\n } else {\n const typeName = chunk.constructor.name || typeof chunk;\n throw new Error(`Cannot write ${typeName} to DataChannel stream`);\n }\n } catch (err) {\n return callback(err);\n }\n\n if (sentOk) {\n callback(null);\n } else {\n callback(new Error('Failed to write to DataChannel'));\n }\n }\n\n _final(callback): void {\n if (!this.allowHalfOpen) this.destroy();\n callback(null);\n }\n\n _destroy(maybeErr, callback): void {\n // When the stream is destroyed, we close the DataChannel.\n this._rawChannel.close();\n callback(maybeErr);\n }\n\n get label(): string {\n return this._rawChannel.getLabel();\n }\n\n get id(): number {\n return this._rawChannel.getId();\n }\n\n get protocol(): string {\n return this._rawChannel.getProtocol();\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datachannel-stream.mjs","sources":["../../../src/lib/datachannel-stream.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as stream from 'stream';\n\n/**\n * Turns a node-datachannel DataChannel into a real Node.js stream, complete with buffering,\n * backpressure (up to a point - if the buffer fills up, messages are dropped), and\n * support for piping data elsewhere.\n *\n * Read & written data may be either UTF-8 strings or Buffers - this difference exists at\n * the protocol level, and is preserved here throughout.\n */\nexport default class DataChannelStream extends stream.Duplex {\n private _rawChannel: any;\n private _readActive: boolean;\n\n constructor(rawChannel: any, streamOptions?: Omit<stream.DuplexOptions, 'objectMode'>) {\n super({\n allowHalfOpen: false, // Default to autoclose on end().\n ...streamOptions,\n objectMode: true, // Preserve the string/buffer distinction (WebRTC treats them differently)\n });\n\n this._rawChannel = rawChannel;\n this._readActive = true;\n\n rawChannel.onMessage((msg: any) => {\n if (!this._readActive) return; // If the buffer is full, drop messages.\n\n // If the push is rejected, we pause reading until the next call to _read().\n this._readActive = this.push(msg);\n });\n\n // When the DataChannel closes, the readable & writable ends close\n rawChannel.onClosed(() => {\n this.push(null);\n this.destroy();\n });\n\n rawChannel.onError((errMsg: string) => {\n this.destroy(new Error(`DataChannel error: ${errMsg}`));\n });\n\n // Buffer all writes until the DataChannel opens\n if (!rawChannel.isOpen()) {\n this.cork();\n rawChannel.onOpen(() => this.uncork());\n }\n }\n\n _read(): void {\n // Stop dropping messages, if the buffer filling up meant we were doing so before.\n this._readActive = true;\n }\n\n _write(chunk, _encoding, callback): void {\n let sentOk;\n\n try {\n if (Buffer.isBuffer(chunk)) {\n sentOk = this._rawChannel.sendMessageBinary(chunk);\n } else if (typeof chunk === 'string') {\n sentOk = this._rawChannel.sendMessage(chunk);\n } else {\n const typeName = chunk.constructor.name || typeof chunk;\n throw new Error(`Cannot write ${typeName} to DataChannel stream`);\n }\n } catch (err) {\n return callback(err);\n }\n\n if (sentOk) {\n callback(null);\n } else {\n callback(new Error('Failed to write to DataChannel'));\n }\n }\n\n _final(callback): void {\n if (!this.allowHalfOpen) this.destroy();\n callback(null);\n }\n\n _destroy(maybeErr, callback): void {\n // When the stream is destroyed, we close the DataChannel.\n this._rawChannel.close();\n callback(maybeErr);\n }\n\n get label(): string {\n return this._rawChannel.getLabel();\n }\n\n get id(): number {\n return this._rawChannel.getId();\n }\n\n get protocol(): string {\n return this._rawChannel.getProtocol();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ const Video = nodeDataChannel.Video;
23
23
  const Track = nodeDataChannel.Track;
24
24
  const DataChannel = nodeDataChannel.DataChannel;
25
25
  const PeerConnection = nodeDataChannel.PeerConnection;
26
+ const IceUdpMuxListener = nodeDataChannel.IceUdpMuxListener;
26
27
  const RtcpReceivingSession = nodeDataChannel.RtcpReceivingSession;
27
28
  const DataChannelStream = DataChannelStream$1;
28
29
  var n = {
@@ -39,8 +40,9 @@ var n = {
39
40
  PeerConnection,
40
41
  WebSocket,
41
42
  WebSocketServer,
42
- DataChannelStream
43
+ DataChannelStream,
44
+ IceUdpMuxListener
43
45
  };
44
46
 
45
- export { Audio, DataChannel, DataChannelStream, PeerConnection, RtcpReceivingSession, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
47
+ export { Audio, DataChannel, DataChannelStream, IceUdpMuxListener, PeerConnection, RtcpReceivingSession, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
46
48
  //# sourceMappingURL=index.mjs.map