@libp2p/webrtc 5.0.26-d8f003e6e → 5.0.27-2e35b6055

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 (119) hide show
  1. package/README.md +16 -21
  2. package/dist/index.min.js +31 -12
  3. package/dist/src/constants.d.ts +2 -0
  4. package/dist/src/constants.d.ts.map +1 -1
  5. package/dist/src/constants.js +2 -0
  6. package/dist/src/constants.js.map +1 -1
  7. package/dist/src/index.d.ts +33 -21
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +16 -21
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/maconn.d.ts +1 -0
  12. package/dist/src/maconn.d.ts.map +1 -1
  13. package/dist/src/maconn.js +4 -3
  14. package/dist/src/maconn.js.map +1 -1
  15. package/dist/src/muxer.d.ts +1 -0
  16. package/dist/src/muxer.d.ts.map +1 -1
  17. package/dist/src/muxer.js +2 -2
  18. package/dist/src/muxer.js.map +1 -1
  19. package/dist/src/private-to-private/util.d.ts +1 -0
  20. package/dist/src/private-to-private/util.d.ts.map +1 -1
  21. package/dist/src/private-to-private/util.js.map +1 -1
  22. package/dist/src/private-to-public/listener.browser.d.ts +17 -0
  23. package/dist/src/private-to-public/listener.browser.d.ts.map +1 -0
  24. package/dist/src/private-to-public/listener.browser.js +13 -0
  25. package/dist/src/private-to-public/listener.browser.js.map +1 -0
  26. package/dist/src/private-to-public/listener.d.ts +37 -0
  27. package/dist/src/private-to-public/listener.d.ts.map +1 -0
  28. package/dist/src/private-to-public/listener.js +175 -0
  29. package/dist/src/private-to-public/listener.js.map +1 -0
  30. package/dist/src/private-to-public/pb/message.d.ts.map +1 -0
  31. package/dist/src/private-to-public/pb/message.js.map +1 -0
  32. package/dist/src/private-to-public/transport.d.ts +10 -11
  33. package/dist/src/private-to-public/transport.d.ts.map +1 -1
  34. package/dist/src/private-to-public/transport.js +28 -155
  35. package/dist/src/private-to-public/transport.js.map +1 -1
  36. package/dist/src/private-to-public/utils/connect.d.ts +27 -0
  37. package/dist/src/private-to-public/utils/connect.d.ts.map +1 -0
  38. package/dist/src/private-to-public/utils/connect.js +142 -0
  39. package/dist/src/private-to-public/utils/connect.js.map +1 -0
  40. package/dist/src/private-to-public/utils/generate-certificates.browser.d.ts +2 -0
  41. package/dist/src/private-to-public/utils/generate-certificates.browser.d.ts.map +1 -0
  42. package/dist/src/private-to-public/utils/generate-certificates.browser.js +4 -0
  43. package/dist/src/private-to-public/utils/generate-certificates.browser.js.map +1 -0
  44. package/dist/src/private-to-public/utils/generate-certificates.d.ts +8 -0
  45. package/dist/src/private-to-public/utils/generate-certificates.d.ts.map +1 -0
  46. package/dist/src/private-to-public/utils/generate-certificates.js +39 -0
  47. package/dist/src/private-to-public/utils/generate-certificates.js.map +1 -0
  48. package/dist/src/private-to-public/utils/generate-noise-prologue.d.ts +7 -0
  49. package/dist/src/private-to-public/utils/generate-noise-prologue.d.ts.map +1 -0
  50. package/dist/src/private-to-public/utils/generate-noise-prologue.js +22 -0
  51. package/dist/src/private-to-public/utils/generate-noise-prologue.js.map +1 -0
  52. package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.d.ts +2 -0
  53. package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.d.ts.map +1 -0
  54. package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js +20 -0
  55. package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js.map +1 -0
  56. package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts +19 -0
  57. package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts.map +1 -0
  58. package/dist/src/private-to-public/utils/get-rtcpeerconnection.js +86 -0
  59. package/dist/src/private-to-public/utils/get-rtcpeerconnection.js.map +1 -0
  60. package/dist/src/private-to-public/utils/sdp.d.ts +36 -0
  61. package/dist/src/private-to-public/utils/sdp.d.ts.map +1 -0
  62. package/dist/src/private-to-public/{sdp.js → utils/sdp.js} +72 -57
  63. package/dist/src/private-to-public/utils/sdp.js.map +1 -0
  64. package/dist/src/private-to-public/utils/stun-listener.d.ts +15 -0
  65. package/dist/src/private-to-public/utils/stun-listener.d.ts.map +1 -0
  66. package/dist/src/private-to-public/utils/stun-listener.js +79 -0
  67. package/dist/src/private-to-public/utils/stun-listener.js.map +1 -0
  68. package/dist/src/stream.d.ts +2 -0
  69. package/dist/src/stream.d.ts.map +1 -1
  70. package/dist/src/stream.js +56 -12
  71. package/dist/src/stream.js.map +1 -1
  72. package/dist/src/util.d.ts +4 -0
  73. package/dist/src/util.d.ts.map +1 -1
  74. package/dist/src/util.js +7 -1
  75. package/dist/src/util.js.map +1 -1
  76. package/dist/src/webrtc/index.d.ts +2 -1
  77. package/dist/src/webrtc/index.d.ts.map +1 -1
  78. package/dist/src/webrtc/index.js +1 -1
  79. package/dist/src/webrtc/index.js.map +1 -1
  80. package/package.json +22 -11
  81. package/src/constants.ts +4 -0
  82. package/src/index.ts +35 -21
  83. package/src/maconn.ts +5 -3
  84. package/src/muxer.ts +3 -2
  85. package/src/private-to-private/util.ts +1 -0
  86. package/src/private-to-public/listener.browser.ts +28 -0
  87. package/src/private-to-public/listener.ts +233 -0
  88. package/src/private-to-public/transport.ts +39 -182
  89. package/src/private-to-public/utils/connect.ts +192 -0
  90. package/src/private-to-public/utils/generate-certificates.browser.ts +3 -0
  91. package/src/private-to-public/utils/generate-certificates.ts +51 -0
  92. package/src/private-to-public/utils/generate-noise-prologue.ts +26 -0
  93. package/src/private-to-public/utils/get-rtcpeerconnection.browser.ts +22 -0
  94. package/src/private-to-public/utils/get-rtcpeerconnection.ts +108 -0
  95. package/src/private-to-public/utils/sdp.ts +174 -0
  96. package/src/private-to-public/utils/stun-listener.ts +104 -0
  97. package/src/stream.ts +68 -15
  98. package/src/util.ts +11 -1
  99. package/src/webrtc/index.ts +2 -1
  100. package/dist/src/pb/message.d.ts.map +0 -1
  101. package/dist/src/pb/message.js.map +0 -1
  102. package/dist/src/private-to-public/options.d.ts +0 -6
  103. package/dist/src/private-to-public/options.d.ts.map +0 -1
  104. package/dist/src/private-to-public/options.js +0 -2
  105. package/dist/src/private-to-public/options.js.map +0 -1
  106. package/dist/src/private-to-public/sdp.d.ts +0 -31
  107. package/dist/src/private-to-public/sdp.d.ts.map +0 -1
  108. package/dist/src/private-to-public/sdp.js.map +0 -1
  109. package/dist/src/private-to-public/util.d.ts +0 -2
  110. package/dist/src/private-to-public/util.d.ts.map +0 -1
  111. package/dist/src/private-to-public/util.js +0 -3
  112. package/dist/src/private-to-public/util.js.map +0 -1
  113. package/src/private-to-public/options.ts +0 -4
  114. package/src/private-to-public/sdp.ts +0 -159
  115. package/src/private-to-public/util.ts +0 -2
  116. /package/dist/src/{pb → private-to-public/pb}/message.d.ts +0 -0
  117. /package/dist/src/{pb → private-to-public/pb}/message.js +0 -0
  118. /package/src/{pb → private-to-public/pb}/message.proto +0 -0
  119. /package/src/{pb → private-to-public/pb}/message.ts +0 -0
package/src/stream.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import { StreamStateError, TimeoutError } from '@libp2p/interface'
2
2
  import { AbstractStream, type AbstractStreamInit } from '@libp2p/utils/abstract-stream'
3
+ import { anySignal } from 'any-signal'
3
4
  import * as lengthPrefixed from 'it-length-prefixed'
4
5
  import { type Pushable, pushable } from 'it-pushable'
5
6
  import pDefer from 'p-defer'
6
- import { pEvent } from 'p-event'
7
7
  import pTimeout from 'p-timeout'
8
+ import { raceEvent } from 'race-event'
8
9
  import { raceSignal } from 'race-signal'
9
10
  import { encodingLength } from 'uint8-varint'
10
11
  import { Uint8ArrayList } from 'uint8arraylist'
11
- import { Message } from './pb/message.js'
12
+ import { Message } from './private-to-public/pb/message.js'
12
13
  import type { DataChannelOptions } from './index.js'
14
+ import type { RTCDataChannel } from './webrtc/index.js'
13
15
  import type { AbortOptions, ComponentLogger, Direction } from '@libp2p/interface'
14
16
  import type { DeferredPromise } from 'p-defer'
15
17
 
@@ -111,6 +113,7 @@ export class WebRTCStream extends AbstractStream {
111
113
  private readonly receiveFinAck: DeferredPromise<void>
112
114
  private readonly finAckTimeout: number
113
115
  private readonly openTimeout: number
116
+ private readonly closeController: AbortController
114
117
 
115
118
  constructor (init: WebRTCStreamInit) {
116
119
  // override onEnd to send/receive FIN_ACK before closing the stream
@@ -135,6 +138,7 @@ export class WebRTCStream extends AbstractStream {
135
138
  .then(() => {
136
139
  // stop processing incoming messages
137
140
  this.incomingData.end()
141
+ this.channel.close()
138
142
 
139
143
  // final cleanup
140
144
  originalOnEnd?.(err)
@@ -155,6 +159,7 @@ export class WebRTCStream extends AbstractStream {
155
159
  this.receiveFinAck = pDefer()
156
160
  this.finAckTimeout = init.closeTimeout ?? FIN_ACK_TIMEOUT
157
161
  this.openTimeout = init.openTimeout ?? OPEN_TIMEOUT
162
+ this.closeController = new AbortController()
158
163
 
159
164
  // set up initial state
160
165
  switch (this.channel.readyState) {
@@ -183,6 +188,11 @@ export class WebRTCStream extends AbstractStream {
183
188
  }
184
189
 
185
190
  this.channel.onclose = (_evt) => {
191
+ this.log.trace('received onclose event')
192
+
193
+ // stop any in-progress writes
194
+ this.closeController.abort()
195
+
186
196
  // if the channel has closed we'll never receive a FIN_ACK so resolve the
187
197
  // promise so we don't try to wait later
188
198
  this.receiveFinAck.resolve()
@@ -193,6 +203,11 @@ export class WebRTCStream extends AbstractStream {
193
203
  }
194
204
 
195
205
  this.channel.onerror = (evt) => {
206
+ this.log.trace('received onerror event')
207
+
208
+ // stop any in-progress writes
209
+ this.closeController.abort()
210
+
196
211
  const err = (evt as RTCErrorEvent).error
197
212
  this.abort(err)
198
213
  }
@@ -230,34 +245,59 @@ export class WebRTCStream extends AbstractStream {
230
245
  }
231
246
 
232
247
  async _sendMessage (data: Uint8ArrayList, checkBuffer: boolean = true): Promise<void> {
248
+ if (this.channel.readyState === 'closed' || this.channel.readyState === 'closing') {
249
+ throw new StreamStateError(`Invalid datachannel state - ${this.channel.readyState}`)
250
+ }
251
+
252
+ if (this.channel.readyState !== 'open') {
253
+ const timeout = AbortSignal.timeout(this.openTimeout)
254
+ const signal = anySignal([
255
+ this.closeController.signal,
256
+ timeout
257
+ ])
258
+
259
+ try {
260
+ this.log('channel state is "%s" and not "open", waiting for "open" event before sending data', this.channel.readyState)
261
+ await raceEvent(this.channel, 'open', signal)
262
+ } finally {
263
+ signal.clear()
264
+ }
265
+
266
+ this.log('channel state is now "%s", sending data', this.channel.readyState)
267
+ }
268
+
233
269
  if (checkBuffer && this.channel.bufferedAmount > this.maxBufferedAmount) {
270
+ const timeout = AbortSignal.timeout(this.bufferedAmountLowEventTimeout)
271
+ const signal = anySignal([
272
+ this.closeController.signal,
273
+ timeout
274
+ ])
275
+
234
276
  try {
235
277
  this.log('channel buffer is %d, wait for "bufferedamountlow" event', this.channel.bufferedAmount)
236
- await pEvent(this.channel, 'bufferedamountlow', { timeout: this.bufferedAmountLowEventTimeout })
278
+ await raceEvent(this.channel, 'bufferedamountlow', signal)
237
279
  } catch (err: any) {
238
- if (err instanceof TimeoutError) {
280
+ if (timeout.aborted) {
239
281
  throw new TimeoutError(`Timed out waiting for DataChannel buffer to clear after ${this.bufferedAmountLowEventTimeout}ms`)
240
282
  }
241
283
 
242
284
  throw err
285
+ } finally {
286
+ signal.clear()
243
287
  }
244
288
  }
245
289
 
246
- if (this.channel.readyState === 'closed' || this.channel.readyState === 'closing') {
247
- throw new StreamStateError(`Invalid datachannel state - ${this.channel.readyState}`)
248
- }
249
-
250
- if (this.channel.readyState !== 'open') {
251
- this.log('channel state is "%s" and not "open", waiting for "open" event before sending data', this.channel.readyState)
252
- await pEvent(this.channel, 'open', { timeout: this.openTimeout })
253
- this.log('channel state is now "%s", sending data', this.channel.readyState)
290
+ try {
291
+ // send message without copying data
292
+ this.channel.send(data.subarray())
293
+ } catch (err: any) {
294
+ this.log.error('error while sending message', err)
254
295
  }
255
-
256
- // send message without copying data
257
- this.channel.send(data.subarray())
258
296
  }
259
297
 
260
298
  async sendData (data: Uint8ArrayList): Promise<void> {
299
+ this.log.trace('-> will send %d bytes', data.byteLength)
300
+
261
301
  // sending messages is an async operation so use a copy of the list as it
262
302
  // may be changed beneath us
263
303
  data = data.sublist()
@@ -267,10 +307,14 @@ export class WebRTCStream extends AbstractStream {
267
307
  const buf = data.subarray(0, toSend)
268
308
  const msgbuf = Message.encode({ message: buf })
269
309
  const sendbuf = lengthPrefixed.encode.single(msgbuf)
310
+ this.log.trace('-> sending message %s', this.channel.readyState)
270
311
  await this._sendMessage(sendbuf)
312
+ this.log.trace('-> sent message %s', this.channel.readyState)
271
313
 
272
314
  data.consume(toSend)
273
315
  }
316
+
317
+ this.log.trace('-> sent data %s', this.channel.readyState)
274
318
  }
275
319
 
276
320
  async sendReset (): Promise<void> {
@@ -282,6 +326,11 @@ export class WebRTCStream extends AbstractStream {
282
326
  }
283
327
 
284
328
  async sendCloseWrite (options: AbortOptions): Promise<void> {
329
+ if (this.channel.readyState !== 'open') {
330
+ this.receiveFinAck.resolve()
331
+ return
332
+ }
333
+
285
334
  const sent = await this._sendFlag(Message.Flag.FIN)
286
335
 
287
336
  if (sent) {
@@ -303,6 +352,10 @@ export class WebRTCStream extends AbstractStream {
303
352
  }
304
353
 
305
354
  async sendCloseRead (): Promise<void> {
355
+ if (this.channel.readyState !== 'open') {
356
+ return
357
+ }
358
+
306
359
  await this._sendFlag(Message.Flag.STOP_SENDING)
307
360
  }
308
361
 
package/src/util.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { detect } from 'detect-browser'
2
2
  import pDefer from 'p-defer'
3
3
  import pTimeout from 'p-timeout'
4
- import { DEFAULT_ICE_SERVERS } from './constants.js'
4
+ import { DEFAULT_ICE_SERVERS, UFRAG_ALPHABET, UFRAG_PREFIX } from './constants.js'
5
+ import type { RTCDataChannel } from './webrtc/index.js'
6
+ import type { PeerConnection } from '@ipshipyard/node-datachannel'
5
7
  import type { LoggerOptions } from '@libp2p/interface'
6
8
 
7
9
  const browser = detect()
@@ -66,6 +68,10 @@ export interface AbortPromiseOptions {
66
68
  message?: string
67
69
  }
68
70
 
71
+ export function isPeerConnection (obj: any): obj is PeerConnection {
72
+ return typeof obj.state === 'function'
73
+ }
74
+
69
75
  export async function getRtcConfiguration (config?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>)): Promise<RTCConfiguration> {
70
76
  config = config ?? {}
71
77
 
@@ -81,3 +87,7 @@ export async function getRtcConfiguration (config?: RTCConfiguration | (() => RT
81
87
 
82
88
  return config
83
89
  }
90
+
91
+ export const genUfrag = (len: number = 32): string => {
92
+ return UFRAG_PREFIX + [...Array(len)].map(() => UFRAG_ALPHABET.at(Math.floor(Math.random() * UFRAG_ALPHABET.length))).join('')
93
+ }
@@ -1 +1,2 @@
1
- export { RTCSessionDescription, RTCIceCandidate, RTCPeerConnection } from 'node-datachannel/polyfill'
1
+ export { RTCSessionDescription, RTCIceCandidate, RTCPeerConnection } from '@ipshipyard/node-datachannel/polyfill'
2
+ export type { RTCDataChannel, RTCDataChannelEvent } from '@ipshipyard/node-datachannel/polyfill'
@@ -1 +0,0 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/pb/message.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAiB,KAAK,aAAa,EAAuC,MAAM,iBAAiB,CAAA;AACpH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,yBAAiB,OAAO,CAAC;IACvB,KAAY,IAAI;QACd,GAAG,QAAQ;QACX,YAAY,iBAAiB;QAC7B,KAAK,UAAU;QACf,OAAO,YAAY;KACpB;IASD,UAAiB,IAAI,CAAC;QACb,MAAM,KAAK,QAAO,MAAM,IAAI,CAElC,CAAA;KACF;IAIM,MAAM,KAAK,QAAO,MAAM,OAAO,CAiDrC,CAAA;IAEM,MAAM,MAAM,QAAS,QAAQ,OAAO,CAAC,KAAG,UAE9C,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,SAAS,cAAc,OAAO,CAAC,KAAG,OAExF,CAAA;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/pb/message.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { CreateListenerOptions, DialTransportOptions } from '@libp2p/interface';
2
- export interface WebRTCListenerOptions extends CreateListenerOptions {
3
- }
4
- export interface WebRTCDialOptions extends DialTransportOptions {
5
- }
6
- //# sourceMappingURL=options.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAEpF,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;CAAG;AACvE,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;CAAG"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/private-to-public/options.ts"],"names":[],"mappings":""}
@@ -1,31 +0,0 @@
1
- import { type Multiaddr } from '@multiformats/multiaddr';
2
- import type { LoggerOptions } from '@libp2p/interface';
3
- import type { MultihashDigest } from 'multiformats/hashes/interface';
4
- /**
5
- * Get base2 | identity decoders
6
- */
7
- export declare const mbdecoder: any;
8
- export declare function getLocalFingerprint(pc: RTCPeerConnection, options: LoggerOptions): string | undefined;
9
- export declare function getFingerprintFromSdp(sdp: string): string | undefined;
10
- export declare function certhash(ma: Multiaddr): string;
11
- /**
12
- * Convert a certhash into a multihash
13
- */
14
- export declare function decodeCerthash(certhash: string): MultihashDigest;
15
- /**
16
- * Extract the fingerprint from a multiaddr
17
- */
18
- export declare function ma2Fingerprint(ma: Multiaddr): string[];
19
- /**
20
- * Normalize the hash name from a given multihash has name
21
- */
22
- export declare function toSupportedHashFunction(code: number): 'SHA-1' | 'SHA-256' | 'SHA-512';
23
- /**
24
- * Create an answer SDP from a multiaddr
25
- */
26
- export declare function fromMultiAddr(ma: Multiaddr, ufrag: string): RTCSessionDescriptionInit;
27
- /**
28
- * Replace (munge) the ufrag and password values in a SDP
29
- */
30
- export declare function munge(desc: RTCSessionDescriptionInit, ufrag: string): RTCSessionDescriptionInit;
31
- //# sourceMappingURL=sdp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdp.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAKxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE;;GAEG;AAEH,eAAO,MAAM,SAAS,EAAE,GAAwE,CAAA;AAEhG,wBAAgB,mBAAmB,CAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAwBtG;AAGD,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE;AAgBD,wBAAgB,QAAQ,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAEjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAWvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAWtF;AA2BD;;GAEG;AACH,wBAAgB,aAAa,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAKtF;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAShG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const genUfrag: (len: number) => string;
2
- //# sourceMappingURL=util.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/util.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,QAAQ,QAAS,MAAM,KAAG,MAAoG,CAAA"}
@@ -1,3 +0,0 @@
1
- const charset = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
2
- export const genUfrag = (len) => [...Array(len)].map(() => charset.at(Math.floor(Math.random() * charset.length))).join('');
3
- //# sourceMappingURL=util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-public/util.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;AAC9F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { CreateListenerOptions, DialTransportOptions } from '@libp2p/interface'
2
-
3
- export interface WebRTCListenerOptions extends CreateListenerOptions {}
4
- export interface WebRTCDialOptions extends DialTransportOptions {}
@@ -1,159 +0,0 @@
1
- import { InvalidParametersError } from '@libp2p/interface'
2
- import { type Multiaddr } from '@multiformats/multiaddr'
3
- import { bases, digest } from 'multiformats/basics'
4
- import { InvalidFingerprintError, UnsupportedHashAlgorithmError } from '../error.js'
5
- import { MAX_MESSAGE_SIZE } from '../stream.js'
6
- import { CERTHASH_CODE } from './transport.js'
7
- import type { LoggerOptions } from '@libp2p/interface'
8
- import type { MultihashDigest } from 'multiformats/hashes/interface'
9
-
10
- /**
11
- * Get base2 | identity decoders
12
- */
13
- // @ts-expect-error - Not easy to combine these types.
14
- export const mbdecoder: any = Object.values(bases).map(b => b.decoder).reduce((d, b) => d.or(b))
15
-
16
- export function getLocalFingerprint (pc: RTCPeerConnection, options: LoggerOptions): string | undefined {
17
- // try to fetch fingerprint from local certificate
18
- const localCert = pc.getConfiguration().certificates?.at(0)
19
- if (localCert?.getFingerprints == null) {
20
- options.log.trace('fetching fingerprint from local SDP')
21
- const localDescription = pc.localDescription
22
- if (localDescription == null) {
23
- return undefined
24
- }
25
- return getFingerprintFromSdp(localDescription.sdp)
26
- }
27
-
28
- options.log.trace('fetching fingerprint from local certificate')
29
-
30
- if (localCert.getFingerprints().length === 0) {
31
- return undefined
32
- }
33
-
34
- const fingerprint = localCert.getFingerprints()[0].value
35
- if (fingerprint == null) {
36
- throw new InvalidFingerprintError('', 'no fingerprint on local certificate')
37
- }
38
-
39
- return fingerprint
40
- }
41
-
42
- const fingerprintRegex = /^a=fingerprint:(?:\w+-[0-9]+)\s(?<fingerprint>(:?[0-9a-fA-F]{2})+)$/m
43
- export function getFingerprintFromSdp (sdp: string): string | undefined {
44
- const searchResult = sdp.match(fingerprintRegex)
45
- return searchResult?.groups?.fingerprint
46
- }
47
-
48
- /**
49
- * Get base2 | identity decoders
50
- */
51
- function ipv (ma: Multiaddr): string {
52
- for (const proto of ma.protoNames()) {
53
- if (proto.startsWith('ip')) {
54
- return proto.toUpperCase()
55
- }
56
- }
57
-
58
- return 'IP6'
59
- }
60
-
61
- // Extract the certhash from a multiaddr
62
- export function certhash (ma: Multiaddr): string {
63
- const tups = ma.stringTuples()
64
- const certhash = tups.filter((tup) => tup[0] === CERTHASH_CODE).map((tup) => tup[1])[0]
65
-
66
- if (certhash === undefined || certhash === '') {
67
- throw new InvalidParametersError(`Couldn't find a certhash component of multiaddr: ${ma.toString()}`)
68
- }
69
-
70
- return certhash
71
- }
72
-
73
- /**
74
- * Convert a certhash into a multihash
75
- */
76
- export function decodeCerthash (certhash: string): MultihashDigest {
77
- return digest.decode(mbdecoder.decode(certhash))
78
- }
79
-
80
- /**
81
- * Extract the fingerprint from a multiaddr
82
- */
83
- export function ma2Fingerprint (ma: Multiaddr): string[] {
84
- const mhdecoded = decodeCerthash(certhash(ma))
85
- const prefix = toSupportedHashFunction(mhdecoded.code)
86
- const fingerprint = mhdecoded.digest.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '')
87
- const sdp = fingerprint.match(/.{1,2}/g)
88
-
89
- if (sdp == null) {
90
- throw new InvalidFingerprintError(fingerprint, ma.toString())
91
- }
92
-
93
- return [`${prefix} ${sdp.join(':').toUpperCase()}`, fingerprint]
94
- }
95
-
96
- /**
97
- * Normalize the hash name from a given multihash has name
98
- */
99
- export function toSupportedHashFunction (code: number): 'SHA-1' | 'SHA-256' | 'SHA-512' {
100
- switch (code) {
101
- case 0x11:
102
- return 'SHA-1'
103
- case 0x12:
104
- return 'SHA-256'
105
- case 0x13:
106
- return 'SHA-512'
107
- default:
108
- throw new UnsupportedHashAlgorithmError(code)
109
- }
110
- }
111
-
112
- /**
113
- * Convert a multiaddr into a SDP
114
- */
115
- function ma2sdp (ma: Multiaddr, ufrag: string): string {
116
- const { host, port } = ma.toOptions()
117
- const ipVersion = ipv(ma)
118
- const [CERTFP] = ma2Fingerprint(ma)
119
-
120
- return `v=0
121
- o=- 0 0 IN ${ipVersion} ${host}
122
- s=-
123
- c=IN ${ipVersion} ${host}
124
- t=0 0
125
- a=ice-lite
126
- m=application ${port} UDP/DTLS/SCTP webrtc-datachannel
127
- a=mid:0
128
- a=setup:passive
129
- a=ice-ufrag:${ufrag}
130
- a=ice-pwd:${ufrag}
131
- a=fingerprint:${CERTFP}
132
- a=sctp-port:5000
133
- a=max-message-size:${MAX_MESSAGE_SIZE}
134
- a=candidate:1467250027 1 UDP 1467250027 ${host} ${port} typ host\r\n`
135
- }
136
-
137
- /**
138
- * Create an answer SDP from a multiaddr
139
- */
140
- export function fromMultiAddr (ma: Multiaddr, ufrag: string): RTCSessionDescriptionInit {
141
- return {
142
- type: 'answer',
143
- sdp: ma2sdp(ma, ufrag)
144
- }
145
- }
146
-
147
- /**
148
- * Replace (munge) the ufrag and password values in a SDP
149
- */
150
- export function munge (desc: RTCSessionDescriptionInit, ufrag: string): RTCSessionDescriptionInit {
151
- if (desc.sdp === undefined) {
152
- throw new InvalidParametersError("Can't munge a missing SDP")
153
- }
154
-
155
- desc.sdp = desc.sdp
156
- .replace(/\na=ice-ufrag:[^\n]*\n/, '\na=ice-ufrag:' + ufrag + '\n')
157
- .replace(/\na=ice-pwd:[^\n]*\n/, '\na=ice-pwd:' + ufrag + '\n')
158
- return desc
159
- }
@@ -1,2 +0,0 @@
1
- const charset = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')
2
- export const genUfrag = (len: number): string => [...Array(len)].map(() => charset.at(Math.floor(Math.random() * charset.length))).join('')
File without changes
File without changes