@libp2p/webrtc 7.0.1-aa5ba42d0 → 7.0.1-b927d5921

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.
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,gBAAgB,CAAC;IAC3G,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,4BAA4B,GAAU,IAAI,iBAAiB,EAAE,QAAQ,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAyD9J,CAAA;AAuBD,wBAAgB,aAAa,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAcpD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,gBAAgB,CAAC;IAC3G,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,4BAA4B,GAAU,IAAI,iBAAiB,EAAE,QAAQ,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,qBAAqB,KAAG,OAAO,CAAC,IAAI,CA+D9J,CAAA;AA4BD,wBAAgB,aAAa,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAcpD"}
@@ -1,12 +1,13 @@
1
1
  import { ConnectionFailedError, InvalidMessageError, InvalidMultiaddrError } from '@libp2p/interface';
2
2
  import { peerIdFromString } from '@libp2p/peer-id';
3
3
  import { CustomProgressEvent } from 'progress-events';
4
+ import { raceSignal } from 'race-signal';
4
5
  import { RTCIceCandidate } from "../webrtc/index.js";
5
6
  import { Message } from "./pb/message.js";
6
7
  export const readCandidatesUntilConnected = async (pc, stream, options) => {
8
+ const connectedPromise = Promise.withResolvers();
9
+ resolveOnConnected(pc, connectedPromise);
7
10
  try {
8
- const connectedPromise = Promise.withResolvers();
9
- resolveOnConnected(pc, connectedPromise);
10
11
  // read candidates until we are connected or we reach the end of the stream
11
12
  while (true) {
12
13
  // if we connect, stop trying to read from the stream
@@ -46,9 +47,16 @@ export const readCandidatesUntilConnected = async (pc, stream, options) => {
46
47
  }
47
48
  }
48
49
  catch (err) {
49
- options.log.error('%s error parsing ICE candidate - %e', options.direction, err);
50
- if (options.signal?.aborted === true && pc.connectionState !== 'connected') {
51
- throw err;
50
+ options.log.error('%s error reading ICE candidates - %e', options.direction, err);
51
+ // the signaling stream can end just before the peer connection connects
52
+ if (pc.connectionState !== 'connected') {
53
+ try {
54
+ await raceSignal(connectedPromise.promise, options.signal);
55
+ }
56
+ catch {
57
+ options.signal?.throwIfAborted();
58
+ throw err;
59
+ }
52
60
  }
53
61
  }
54
62
  };
@@ -57,6 +65,10 @@ function resolveOnConnected(pc, promise) {
57
65
  promise.resolve();
58
66
  return;
59
67
  }
68
+ if (pc.connectionState === 'failed' || pc.connectionState === 'closed') {
69
+ promise.reject(new ConnectionFailedError(`RTCPeerConnection connection state was "${pc.connectionState}"`));
70
+ return;
71
+ }
60
72
  pc.onconnectionstatechange = (_) => {
61
73
  switch (pc.connectionState) {
62
74
  case 'connected':
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/webrtc",
3
- "version": "7.0.1-aa5ba42d0",
3
+ "version": "7.0.1-b927d5921",
4
4
  "description": "A libp2p transport using WebRTC connections",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-webrtc#readme",
@@ -46,13 +46,13 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@chainsafe/is-ip": "^2.1.0",
49
- "@libp2p/crypto": "5.2.0-aa5ba42d0",
50
- "@libp2p/interface": "3.4.0-aa5ba42d0",
51
- "@libp2p/interface-internal": "3.2.1-aa5ba42d0",
52
- "@libp2p/keychain": "6.1.10-aa5ba42d0",
53
- "@libp2p/noise": "17.0.6-aa5ba42d0",
54
- "@libp2p/peer-id": "6.0.18-aa5ba42d0",
55
- "@libp2p/utils": "7.4.4-aa5ba42d0",
49
+ "@libp2p/crypto": "5.2.0-b927d5921",
50
+ "@libp2p/interface": "3.4.0-b927d5921",
51
+ "@libp2p/interface-internal": "3.2.1-b927d5921",
52
+ "@libp2p/keychain": "6.1.10-b927d5921",
53
+ "@libp2p/noise": "17.0.6-b927d5921",
54
+ "@libp2p/peer-id": "6.0.18-b927d5921",
55
+ "@libp2p/utils": "7.4.4-b927d5921",
56
56
  "@multiformats/multiaddr": "^13.0.3",
57
57
  "@multiformats/multiaddr-matcher": "^3.0.2",
58
58
  "@peculiar/webcrypto": "^1.5.0",
@@ -79,7 +79,7 @@
79
79
  "uint8arrays": "^6.1.1"
80
80
  },
81
81
  "devDependencies": {
82
- "@libp2p/logger": "6.2.16-aa5ba42d0",
82
+ "@libp2p/logger": "6.2.16-b927d5921",
83
83
  "@types/sinon": "^22.0.0",
84
84
  "aegir": "^48.1.1",
85
85
  "any-signal": "^4.1.1",
@@ -1,6 +1,7 @@
1
1
  import { ConnectionFailedError, InvalidMessageError, InvalidMultiaddrError } from '@libp2p/interface'
2
2
  import { peerIdFromString } from '@libp2p/peer-id'
3
3
  import { CustomProgressEvent } from 'progress-events'
4
+ import { raceSignal } from 'race-signal'
4
5
  import { RTCIceCandidate } from '../webrtc/index.ts'
5
6
  import { Message } from './pb/message.ts'
6
7
  import type { WebRTCDialEvents } from './transport.ts'
@@ -16,10 +17,10 @@ export interface ReadCandidatesOptions extends AbortOptions, LoggerOptions, Prog
16
17
  }
17
18
 
18
19
  export const readCandidatesUntilConnected = async (pc: RTCPeerConnection, stream: MessageStream<Message, Stream>, options: ReadCandidatesOptions): Promise<void> => {
19
- try {
20
- const connectedPromise = Promise.withResolvers<void>()
21
- resolveOnConnected(pc, connectedPromise)
20
+ const connectedPromise = Promise.withResolvers<void>()
21
+ resolveOnConnected(pc, connectedPromise)
22
22
 
23
+ try {
23
24
  // read candidates until we are connected or we reach the end of the stream
24
25
  while (true) {
25
26
  // if we connect, stop trying to read from the stream
@@ -66,10 +67,16 @@ export const readCandidatesUntilConnected = async (pc: RTCPeerConnection, stream
66
67
  }
67
68
  }
68
69
  } catch (err) {
69
- options.log.error('%s error parsing ICE candidate - %e', options.direction, err)
70
+ options.log.error('%s error reading ICE candidates - %e', options.direction, err)
70
71
 
71
- if (options.signal?.aborted === true && pc.connectionState !== 'connected') {
72
- throw err
72
+ // the signaling stream can end just before the peer connection connects
73
+ if (pc.connectionState !== 'connected') {
74
+ try {
75
+ await raceSignal(connectedPromise.promise, options.signal)
76
+ } catch {
77
+ options.signal?.throwIfAborted()
78
+ throw err
79
+ }
73
80
  }
74
81
  }
75
82
  }
@@ -80,6 +87,11 @@ function resolveOnConnected (pc: RTCPeerConnection, promise: DeferredPromise<voi
80
87
  return
81
88
  }
82
89
 
90
+ if (pc.connectionState === 'failed' || pc.connectionState === 'closed') {
91
+ promise.reject(new ConnectionFailedError(`RTCPeerConnection connection state was "${pc.connectionState}"`))
92
+ return
93
+ }
94
+
83
95
  pc.onconnectionstatechange = (_) => {
84
96
  switch (pc.connectionState) {
85
97
  case 'connected':