@libp2p/circuit-relay-v2 2.1.3-e99e8f448 → 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,10 @@
1
- import { KEEP_ALIVE, TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
1
+ import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
2
2
  import { PeerMap } from '@libp2p/peer-collections';
3
3
  import { createBloomFilter } from '@libp2p/utils/filters';
4
4
  import { PeerQueue } from '@libp2p/utils/peer-queue';
5
5
  import { multiaddr } from '@multiformats/multiaddr';
6
6
  import { pbStream } from 'it-protobuf-stream';
7
- import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
8
- import { DEFAULT_MAX_RESERVATION_QUEUE_LENGTH, DEFAULT_RESERVATION_COMPLETION_TIMEOUT, DEFAULT_RESERVATION_CONCURRENCY, RELAY_TAG, RELAY_V2_HOP_CODEC } from '../constants.js';
7
+ import { DEFAULT_MAX_RESERVATION_QUEUE_LENGTH, DEFAULT_RESERVATION_COMPLETION_TIMEOUT, DEFAULT_RESERVATION_CONCURRENCY, KEEP_ALIVE_TAG, RELAY_TAG, RELAY_V2_HOP_CODEC } from '../constants.js';
9
8
  import { HopMessage, Status } from '../pb/index.js';
10
9
  import { getExpirationMilliseconds } from '../utils.js';
11
10
  // allow refreshing a relay reservation if it will expire in the next 10 minutes
@@ -48,11 +47,19 @@ export class ReservationStore extends TypedEventEmitter {
48
47
  metricName: 'libp2p_relay_reservation_queue',
49
48
  metrics: components.metrics
50
49
  });
51
- // When a peer disconnects, if we had a reservation on that peer
52
- // remove the reservation and multiaddr and maybe trigger search
53
- // for new relays
54
- this.events.addEventListener('peer:disconnect', (evt) => {
55
- this.#removeRelay(evt.detail);
50
+ // reservations are only valid while we are still connected to the relay.
51
+ // if we had a reservation opened via that connection, remove it and maybe
52
+ // trigger a search for new relays
53
+ this.events.addEventListener('connection:close', (evt) => {
54
+ const reservation = [...this.reservations.values()]
55
+ .find(reservation => reservation.connection === evt.detail.id);
56
+ if (reservation == null) {
57
+ return;
58
+ }
59
+ this.#removeReservation(evt.detail.remotePeer, reservation)
60
+ .catch(err => {
61
+ this.log('could not remove relay %p - %e', evt.detail, err);
62
+ });
56
63
  });
57
64
  }
58
65
  isStarted() {
@@ -62,10 +69,32 @@ export class ReservationStore extends TypedEventEmitter {
62
69
  this.started = true;
63
70
  }
64
71
  afterStart() {
65
- if (this.reservations.size < this.maxDiscoveredRelays) {
66
- this.log('not enough relays %d/%d', this.reservations.size, this.maxDiscoveredRelays);
67
- this.safeDispatchEvent('relay:not-enough-relays', {});
68
- }
72
+ // remove old relay tags
73
+ void Promise.resolve()
74
+ .then(async () => {
75
+ const relayPeers = await this.peerStore.all({
76
+ filters: [(peer) => {
77
+ return peer.tags.has(RELAY_TAG);
78
+ }]
79
+ });
80
+ this.log('removing tag from %d old relays', relayPeers.length);
81
+ // remove old relay tag and redial
82
+ await Promise.all(relayPeers.map(async (peer) => {
83
+ await this.peerStore.merge(peer.id, {
84
+ tags: {
85
+ [RELAY_TAG]: undefined,
86
+ [KEEP_ALIVE_TAG]: undefined
87
+ }
88
+ });
89
+ }));
90
+ if (this.reservations.size < this.maxDiscoveredRelays) {
91
+ this.log('not enough relays %d/%d', this.reservations.size, this.maxDiscoveredRelays);
92
+ this.safeDispatchEvent('relay:not-enough-relays', {});
93
+ }
94
+ })
95
+ .catch(err => {
96
+ this.log.error(err);
97
+ });
69
98
  }
70
99
  stop() {
71
100
  this.reserveQueue.clear();
@@ -83,34 +112,34 @@ export class ReservationStore extends TypedEventEmitter {
83
112
  */
84
113
  async addRelay(peerId, type) {
85
114
  if (this.peerId.equals(peerId)) {
86
- this.log('not trying to use self as relay');
115
+ this.log.trace('not trying to use self as relay');
87
116
  return;
88
117
  }
89
118
  if (this.reserveQueue.size > this.maxReservationQueueLength) {
90
- this.log('not adding potential relay peer %p as the queue is full', peerId);
119
+ this.log.trace('not adding potential relay peer %p as the queue is full', peerId);
91
120
  return;
92
121
  }
93
122
  if (this.reserveQueue.has(peerId)) {
94
- this.log('potential relay peer %p is already in the reservation queue', peerId);
123
+ this.log.trace('potential relay peer %p is already in the reservation queue', peerId);
95
124
  return;
96
125
  }
97
126
  if (this.relayFilter.has(peerId.toMultihash().bytes)) {
98
- this.log('potential relay peer %p has failed previously, not trying again', peerId);
127
+ this.log.trace('potential relay peer %p has failed previously, not trying again', peerId);
99
128
  return;
100
129
  }
101
- this.log('try to reserve relay slot with %p', peerId);
130
+ this.log.trace('try to reserve relay slot with %p', peerId);
102
131
  await this.reserveQueue.add(async () => {
103
132
  const start = Date.now();
104
133
  try {
105
134
  // allow refresh of an existing reservation if it is about to expire
106
135
  const existingReservation = this.reservations.get(peerId);
107
136
  if (existingReservation != null) {
108
- if (getExpirationMilliseconds(existingReservation.reservation.expire) > REFRESH_WINDOW) {
109
- this.log('already have reservation on relay peer %p and it expires in more than 10 minutes', peerId);
137
+ if (this.connectionManager.getConnections(peerId).map(conn => conn.id).includes(existingReservation.connection) && getExpirationMilliseconds(existingReservation.reservation.expire) > REFRESH_WINDOW) {
138
+ this.log('already have relay reservation with %p but we are still connected and it does not expire soon', peerId);
110
139
  return;
111
140
  }
112
- clearTimeout(existingReservation.timeout);
113
- this.reservations.delete(peerId);
141
+ this.log('already have relay reservation with %p but the original connection is no longer open', peerId);
142
+ await this.#removeReservation(peerId, existingReservation);
114
143
  }
115
144
  if (type === 'discovered' && [...this.reservations.values()].reduce((acc, curr) => {
116
145
  if (curr.type === 'discovered') {
@@ -118,7 +147,7 @@ export class ReservationStore extends TypedEventEmitter {
118
147
  }
119
148
  return acc;
120
149
  }, 0) >= this.maxDiscoveredRelays) {
121
- this.log('already have enough discovered relays');
150
+ this.log.trace('already have enough discovered relays');
122
151
  return;
123
152
  }
124
153
  const signal = AbortSignal.timeout(this.reservationCompletionTimeout);
@@ -147,7 +176,8 @@ export class ReservationStore extends TypedEventEmitter {
147
176
  this.reservations.set(peerId, {
148
177
  timeout,
149
178
  reservation,
150
- type
179
+ type,
180
+ connection: connection.id
151
181
  });
152
182
  // ensure we don't close the connection to the relay
153
183
  await this.peerStore.merge(peerId, {
@@ -156,7 +186,7 @@ export class ReservationStore extends TypedEventEmitter {
156
186
  value: 1,
157
187
  ttl: expiration
158
188
  },
159
- [KEEP_ALIVE]: {
189
+ [KEEP_ALIVE_TAG]: {
160
190
  value: 1,
161
191
  ttl: expiration
162
192
  }
@@ -193,6 +223,11 @@ export class ReservationStore extends TypedEventEmitter {
193
223
  reservationCount() {
194
224
  return this.reservations.size;
195
225
  }
226
+ async cancelReservations() {
227
+ await Promise.all([...this.reservations.entries()].map(async ([peerId, reservation]) => {
228
+ await this.#removeReservation(peerId, reservation);
229
+ }));
230
+ }
196
231
  async #createReservation(connection, options) {
197
232
  options.signal?.throwIfAborted();
198
233
  this.log('requesting reservation from %p', connection.remotePeer);
@@ -213,21 +248,22 @@ export class ReservationStore extends TypedEventEmitter {
213
248
  await stream.close(options);
214
249
  }
215
250
  }
216
- if (response.status === Status.OK && (response.reservation != null)) {
251
+ if (response.status === Status.OK && response.reservation != null) {
217
252
  // check that the returned relay has the relay address - this can be
218
253
  // omitted when requesting a reservation from a go-libp2p relay we
219
254
  // already have a reservation on
220
- let hasRelayAddress = false;
221
- const relayAddressBytes = connection.remoteAddr.bytes;
255
+ const addresses = new Set();
256
+ addresses.add(connection.remoteAddr.toString());
222
257
  for (const buf of response.reservation.addrs) {
223
- if (uint8ArrayEquals(relayAddressBytes, buf)) {
224
- hasRelayAddress = true;
225
- break;
258
+ let ma = multiaddr(buf);
259
+ if (ma.getPeerId() == null) {
260
+ ma = ma.encapsulate(`/p2p/${connection.remotePeer}`);
226
261
  }
262
+ // TODO: workaround for https://github.com/libp2p/go-libp2p/issues/3003
263
+ ma = multiaddr(ma.toString().replace(`/p2p/${connection.remotePeer}/p2p/${connection.remotePeer}`, `/p2p/${connection.remotePeer}`));
264
+ addresses.add(ma.toString());
227
265
  }
228
- if (!hasRelayAddress) {
229
- response.reservation.addrs.push(relayAddressBytes);
230
- }
266
+ response.reservation.addrs = [...addresses].map(str => multiaddr(str).bytes);
231
267
  return response.reservation;
232
268
  }
233
269
  const errMsg = `reservation failed with status ${response.status ?? 'undefined'}`;
@@ -237,14 +273,17 @@ export class ReservationStore extends TypedEventEmitter {
237
273
  /**
238
274
  * Remove listen relay
239
275
  */
240
- #removeRelay(peerId) {
241
- const existingReservation = this.reservations.get(peerId);
242
- if (existingReservation == null) {
243
- return;
244
- }
245
- this.log('connection to relay %p closed, removing reservation from local store', peerId);
246
- clearTimeout(existingReservation.timeout);
276
+ async #removeReservation(peerId, reservation) {
277
+ this.log('removing relay reservation with %p from local store', peerId);
278
+ clearTimeout(reservation.timeout);
247
279
  this.reservations.delete(peerId);
280
+ // untag the relay
281
+ await this.peerStore.merge(peerId, {
282
+ tags: {
283
+ [RELAY_TAG]: undefined,
284
+ [KEEP_ALIVE_TAG]: undefined
285
+ }
286
+ });
248
287
  this.safeDispatchEvent('relay:removed', { detail: peerId });
249
288
  if (this.reservations.size < this.maxDiscoveredRelays) {
250
289
  this.log('not enough relays %d/%d', this.reservations.size, this.maxDiscoveredRelays);
@@ -1 +1 @@
1
- {"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reservation-store.js","sourceRoot":"","sources":["../../../src/transport/reservation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,oCAAoC,EAAE,sCAAsC,EAAE,+BAA+B,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC9L,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAMvD,gFAAgF;AAChF,MAAM,cAAc,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;AAEvC,4DAA4D;AAC5D,MAAM,eAAe,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvC,oEAAoE;AACpE,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAA;AAgErC,MAAM,OAAO,gBAAiB,SAAQ,iBAAyC;IAC5D,MAAM,CAAQ;IACd,iBAAiB,CAAmB;IACpC,gBAAgB,CAAkB;IAClC,SAAS,CAAW;IACpB,MAAM,CAAgC;IACtC,YAAY,CAAW;IACvB,YAAY,CAAqB;IACjC,mBAAmB,CAAQ;IAC3B,yBAAyB,CAAQ;IACjC,4BAA4B,CAAQ;IAC7C,OAAO,CAAS;IACP,GAAG,CAAQ;IACX,WAAW,CAAQ;IAEpC,YAAa,UAAsC,EAAE,IAA2B;QAC9E,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,kDAAkD,CAAC,CAAA;QAC7F,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAA;QACrD,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAA;QACnD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAA;QACrC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,EAAE,CAAA;QACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,EAAE,cAAc,IAAI,CAAC,CAAA;QACpD,IAAI,CAAC,yBAAyB,GAAG,IAAI,EAAE,yBAAyB,IAAI,oCAAoC,CAAA;QACxG,IAAI,CAAC,4BAA4B,GAAG,IAAI,EAAE,4BAA4B,IAAI,sCAAsC,CAAA;QAChH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAEzC,2DAA2D;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,SAAS,CAAC;YAChC,WAAW,EAAE,IAAI,EAAE,sBAAsB,IAAI,+BAA+B;YAC5E,UAAU,EAAE,gCAAgC;YAC5C,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC,CAAA;QAEF,yEAAyE;QACzE,0EAA0E;QAC1E,kCAAkC;QAClC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE;YACvD,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;iBAChD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAEhE,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBACxB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC;iBACxD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,UAAU;QACR,wBAAwB;QACxB,KAAK,OAAO,CAAC,OAAO,EAAE;aACnB,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,UAAU,GAAW,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBAClD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;wBACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBACjC,CAAC,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;YAE9D,kCAAkC;YAClC,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;oBAClC,IAAI,EAAE;wBACJ,CAAC,SAAS,CAAC,EAAE,SAAS;wBACtB,CAAC,cAAc,CAAC,EAAE,SAAS;qBAC5B;iBACF,CAAC,CAAA;YACJ,CAAC,CAAC,CACH,CAAA;YAED,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACtD,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;gBACrF,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAA;YACvD,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,YAAY,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAE,MAAc,EAAE,IAAe;QAC7C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yDAAyD,EAAE,MAAM,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6DAA6D,EAAE,MAAM,CAAC,CAAA;YACrF,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iEAAiE,EAAE,MAAM,CAAC,CAAA;YACzF,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAA;QAE3D,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAExB,IAAI,CAAC;gBACH,oEAAoE;gBACpE,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBAEzD,IAAI,mBAAmB,IAAI,IAAI,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;wBACtM,IAAI,CAAC,GAAG,CAAC,+FAA+F,EAAE,MAAM,CAAC,CAAA;wBACjH,OAAM;oBACR,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,sFAAsF,EAAE,MAAM,CAAC,CAAA;oBACxG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;gBAC5D,CAAC;gBAED,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;oBAChF,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAC/B,GAAG,EAAE,CAAA;oBACP,CAAC;oBAED,OAAO,GAAG,CAAA;gBACZ,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;oBACvD,OAAM;gBACR,CAAC;gBAED,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;gBACrE,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAEjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,MAAM,EAAE;oBACrE,MAAM;iBACP,CAAC,CAAA;gBAEF,IAAI,UAAU,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/D,IAAI,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;oBAC5D,OAAM;gBACR,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;oBAC5D,MAAM;iBACP,CAAC,CAAA;gBAEF,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,MAAM,CAAC,CAAA;gBAExD,MAAM,UAAU,GAAG,yBAAyB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;gBAEhE,mEAAmE;gBACnE,gEAAgE;gBAChE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,eAAe,EAAE,mBAAmB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gBAElH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBACtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBAC1E,CAAC,CAAC,CAAA;gBACJ,CAAC,EAAE,eAAe,CAAC,CAAA;gBAEnB,qDAAqD;gBACrD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE;oBAC5B,OAAO;oBACP,WAAW;oBACX,IAAI;oBACJ,UAAU,EAAE,UAAU,CAAC,EAAE;iBAC1B,CAAC,CAAA;gBAEF,oDAAoD;gBACpD,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;oBACjC,IAAI,EAAE;wBACJ,CAAC,SAAS,CAAC,EAAE;4BACX,KAAK,EAAE,CAAC;4BACR,GAAG,EAAE,UAAU;yBAChB;wBACD,CAAC,cAAc,CAAC,EAAE;4BAChB,KAAK,EAAE,CAAC;4BACR,GAAG,EAAE,UAAU;yBAChB;qBACF;iBACF,CAAC,CAAA;gBAEF,uEAAuE;gBACvE,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;gBAExF,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,EAAE;oBAClD,MAAM,EAAE,MAAM;iBACf,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAA;gBAE1F,8CAA8C;gBAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBAEjD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;oBACxB,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;gBACnC,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAEhC,4BAA4B;gBAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAA;YAClD,CAAC;QACH,CAAC,EAAE;YACD,MAAM;SACP,CAAC,CAAA;IACJ,CAAC;IAED,cAAc,CAAE,MAAc;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAED,cAAc,CAAE,MAAc;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IACnD,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE;YACnE,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACpD,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAE,UAAsB,EAAE,OAAqB;QACrE,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAEhC,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;QACnC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAE9D,IAAI,QAAoB,CAAA;QAExB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACjB,MAAM,GAAG,CAAA;QACX,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAClE,oEAAoE;YACpE,kEAAkE;YAClE,gCAAgC;YAChC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;YACnC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;YAE/C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC7C,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;gBAEvB,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;oBAC3B,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;gBACtD,CAAC;gBAED,uEAAuE;gBACvE,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAClC,QAAQ,UAAU,CAAC,UAAU,QAAQ,UAAU,CAAC,UAAU,EAAE,EAC5D,QAAQ,UAAU,CAAC,UAAU,EAAE,CAChC,CAAC,CAAA;gBAEF,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC9B,CAAC;YAED,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;YAE5E,OAAO,QAAQ,CAAC,WAAW,CAAA;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,kCAAkC,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAA;QACjF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAEtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAE,MAAc,EAAE,WAAuB;QAC/D,IAAI,CAAC,GAAG,CAAC,qDAAqD,EAAE,MAAM,CAAC,CAAA;QACvE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEhC,kBAAkB;QAClB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;YACjC,IAAI,EAAE;gBACJ,CAAC,SAAS,CAAC,EAAE,SAAS;gBACtB,CAAC,cAAc,CAAC,EAAE,SAAS;aAC5B;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAE3D,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACtD,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;YACrF,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ {
2
+ "codec": "https://libp2p.github.io/js-libp2p/functions/_libp2p_circuit_relay_v2.Limit.codec.html",
3
+ "decode": "https://libp2p.github.io/js-libp2p/functions/_libp2p_circuit_relay_v2.Limit.decode.html",
4
+ "encode": "https://libp2p.github.io/js-libp2p/functions/_libp2p_circuit_relay_v2.Limit.encode.html",
5
+ "CircuitRelayServerComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayServerComponents.html",
6
+ "CircuitRelayServerInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayServerInit.html",
7
+ "CircuitRelayService": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayService.html",
8
+ ".:CircuitRelayService": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayService.html",
9
+ "CircuitRelayServiceEvents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayServiceEvents.html",
10
+ ".:CircuitRelayServiceEvents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayServiceEvents.html",
11
+ "CircuitRelayTransportComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayTransportComponents.html",
12
+ "CircuitRelayTransportInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.CircuitRelayTransportInit.html",
13
+ "Limit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.Limit-1.html",
14
+ "RelayDiscoveryComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.RelayDiscoveryComponents.html",
15
+ "RelayReservation": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.RelayReservation.html",
16
+ ".:RelayReservation": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.RelayReservation.html",
17
+ "ServerReservationStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.ServerReservationStoreInit.html",
18
+ "TransportReservationStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_circuit_relay_v2.TransportReservationStoreInit.html",
19
+ "RELAY_V2_HOP_CODEC": "https://libp2p.github.io/js-libp2p/variables/_libp2p_circuit_relay_v2.RELAY_V2_HOP_CODEC.html",
20
+ "RELAY_V2_STOP_CODEC": "https://libp2p.github.io/js-libp2p/variables/_libp2p_circuit_relay_v2.RELAY_V2_STOP_CODEC.html",
21
+ "circuitRelayServer": "https://libp2p.github.io/js-libp2p/functions/_libp2p_circuit_relay_v2.circuitRelayServer.html",
22
+ "circuitRelayTransport": "https://libp2p.github.io/js-libp2p/functions/_libp2p_circuit_relay_v2.circuitRelayTransport.html"
23
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/circuit-relay-v2",
3
- "version": "2.1.3-e99e8f448",
3
+ "version": "2.1.4",
4
4
  "description": "Implementation of Circuit Relay v2",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-circuit-relay-v2#readme",
@@ -52,19 +52,18 @@
52
52
  "doc-check": "aegir doc-check"
53
53
  },
54
54
  "dependencies": {
55
- "@libp2p/interface": "2.1.2-e99e8f448",
56
- "@libp2p/interface-internal": "2.0.7-e99e8f448",
57
- "@libp2p/peer-collections": "6.0.7-e99e8f448",
58
- "@libp2p/peer-id": "5.0.4-e99e8f448",
59
- "@libp2p/peer-record": "8.0.7-e99e8f448",
60
- "@libp2p/utils": "6.1.0-e99e8f448",
55
+ "@libp2p/interface": "^2.1.3",
56
+ "@libp2p/interface-internal": "^2.0.8",
57
+ "@libp2p/peer-collections": "^6.0.8",
58
+ "@libp2p/peer-id": "^5.0.5",
59
+ "@libp2p/peer-record": "^8.0.8",
60
+ "@libp2p/utils": "^6.1.1",
61
61
  "@multiformats/mafmt": "^12.1.6",
62
62
  "@multiformats/multiaddr": "^12.2.3",
63
63
  "any-signal": "^4.1.1",
64
64
  "it-protobuf-stream": "^1.1.3",
65
65
  "it-stream-types": "^2.0.1",
66
66
  "multiformats": "^13.1.0",
67
- "p-defer": "^4.0.1",
68
67
  "progress-events": "^1.0.0",
69
68
  "protons-runtime": "^5.4.0",
70
69
  "race-signal": "^1.0.2",
@@ -72,9 +71,9 @@
72
71
  "uint8arrays": "^5.1.0"
73
72
  },
74
73
  "devDependencies": {
75
- "@libp2p/crypto": "5.0.4-e99e8f448",
76
- "@libp2p/interface-compliance-tests": "6.1.5-e99e8f448",
77
- "@libp2p/logger": "5.1.0-e99e8f448",
74
+ "@libp2p/crypto": "^5.0.5",
75
+ "@libp2p/interface-compliance-tests": "^6.1.6",
76
+ "@libp2p/logger": "^5.1.1",
78
77
  "aegir": "^44.0.1",
79
78
  "delay": "^6.0.0",
80
79
  "it-drain": "^3.0.7",
package/src/constants.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { KEEP_ALIVE } from '@libp2p/interface'
2
+
1
3
  const second = 1000
2
4
  const minute = 60 * second
3
5
 
@@ -27,9 +29,9 @@ export const DEFAULT_MAX_RESERVATION_TTL = 2 * 60 * minute
27
29
  export const DEFAULT_RESERVATION_CONCURRENCY = 1
28
30
 
29
31
  /**
30
- * How long to wait for a reservation attempt to finsih
32
+ * How long to wait for a reservation attempt to finish
31
33
  */
32
- export const DEFAULT_RESERVATION_COMPLETION_TIMEOUT = 1000
34
+ export const DEFAULT_RESERVATION_COMPLETION_TIMEOUT = 2000
33
35
 
34
36
  /**
35
37
  * How long to let the reservation attempt queue to grow
@@ -40,6 +42,9 @@ export const RELAY_SOURCE_TAG = 'circuit-relay-source'
40
42
 
41
43
  export const RELAY_TAG = 'circuit-relay-relay'
42
44
 
45
+ export const KEEP_ALIVE_TAG = `${KEEP_ALIVE}-circuit-relay`
46
+ export const KEEP_ALIVE_SOURCE_TAG = `${KEEP_ALIVE}-circuit-relay-source`
47
+
43
48
  // circuit v2 connection limits
44
49
  // https://github.com/libp2p/go-libp2p/blob/master/p2p/protocol/circuitv2/relay/resources.go#L61-L66
45
50
 
package/src/index.ts CHANGED
@@ -64,10 +64,10 @@ export interface CircuitRelayService extends TypedEventEmitter<CircuitRelayServi
64
64
 
65
65
  export { circuitRelayServer } from './server/index.js'
66
66
  export type { CircuitRelayServerInit, CircuitRelayServerComponents } from './server/index.js'
67
- export type { ReservationStoreInit } from './server/reservation-store.js'
67
+ export type { ReservationStoreInit as ServerReservationStoreInit } from './server/reservation-store.js'
68
68
  export { circuitRelayTransport } from './transport/index.js'
69
69
  export type { RelayDiscoveryComponents } from './transport/discovery.js'
70
- export type { RelayStoreInit } from './transport/reservation-store.js'
70
+ export type { ReservationStoreInit as TransportReservationStoreInit } from './transport/reservation-store.js'
71
71
  export type { CircuitRelayTransportInit, CircuitRelayTransportComponents } from './transport/index.js'
72
72
 
73
73
  export {
@@ -4,10 +4,10 @@ import { RecordEnvelope } from '@libp2p/peer-record'
4
4
  import { type Multiaddr, multiaddr } from '@multiformats/multiaddr'
5
5
  import { pbStream, type ProtobufStream } from 'it-protobuf-stream'
6
6
  import * as Digest from 'multiformats/hashes/digest'
7
- import pDefer from 'p-defer'
8
7
  import {
9
8
  CIRCUIT_PROTO_CODE,
10
9
  DEFAULT_HOP_TIMEOUT,
10
+ KEEP_ALIVE_SOURCE_TAG,
11
11
  MAX_CONNECTIONS,
12
12
  RELAY_SOURCE_TAG,
13
13
  RELAY_V2_HOP_CODEC,
@@ -18,7 +18,7 @@ import { createLimitedRelay } from '../utils.js'
18
18
  import { ReservationStore, type ReservationStoreInit } from './reservation-store.js'
19
19
  import { ReservationVoucherRecord } from './reservation-voucher.js'
20
20
  import type { CircuitRelayService, RelayReservation } from '../index.js'
21
- import type { ComponentLogger, Logger, Connection, Stream, ConnectionGater, PeerId, PeerStore, Startable, PrivateKey, Metrics } from '@libp2p/interface'
21
+ import type { ComponentLogger, Logger, Connection, Stream, ConnectionGater, PeerId, PeerStore, Startable, PrivateKey, Metrics, AbortOptions } from '@libp2p/interface'
22
22
  import type { AddressManager, ConnectionManager, IncomingStreamData, Registrar } from '@libp2p/interface-internal'
23
23
  import type { PeerMap } from '@libp2p/peer-collections'
24
24
 
@@ -175,17 +175,13 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
175
175
  async onHop ({ connection, stream }: IncomingStreamData): Promise<void> {
176
176
  this.log('received circuit v2 hop protocol stream from %p', connection.remotePeer)
177
177
 
178
- const hopTimeoutPromise = pDefer<HopMessage>()
179
- const timeout = setTimeout(() => {
180
- hopTimeoutPromise.reject('timed out')
181
- }, this.hopTimeout)
178
+ const options = {
179
+ signal: AbortSignal.timeout(this.hopTimeout)
180
+ }
182
181
  const pbstr = pbStream(stream)
183
182
 
184
183
  try {
185
- const request: HopMessage = await Promise.race([
186
- pbstr.pb(HopMessage).read(),
187
- hopTimeoutPromise.promise
188
- ])
184
+ const request: HopMessage = await pbstr.pb(HopMessage).read(options)
189
185
 
190
186
  if (request?.type == null) {
191
187
  throw new Error('request was invalid, could not read from stream')
@@ -193,31 +189,26 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
193
189
 
194
190
  this.log('received', request.type)
195
191
 
196
- await Promise.race([
197
- this.handleHopProtocol({
198
- connection,
199
- stream: pbstr,
200
- request
201
- }),
202
- hopTimeoutPromise.promise
203
- ])
192
+ await this.handleHopProtocol({
193
+ connection,
194
+ stream: pbstr,
195
+ request
196
+ }, options)
204
197
  } catch (err: any) {
205
198
  this.log.error('error while handling hop', err)
206
199
  await pbstr.pb(HopMessage).write({
207
200
  type: HopMessage.Type.STATUS,
208
201
  status: Status.MALFORMED_MESSAGE
209
- })
202
+ }, options)
210
203
  stream.abort(err)
211
- } finally {
212
- clearTimeout(timeout)
213
204
  }
214
205
  }
215
206
 
216
- async handleHopProtocol ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
207
+ async handleHopProtocol ({ stream, request, connection }: HopProtocolOptions, options: AbortOptions): Promise<void> {
217
208
  this.log('received hop message')
218
209
  switch (request.type) {
219
- case HopMessage.Type.RESERVE: await this.handleReserve({ stream, request, connection }); break
220
- case HopMessage.Type.CONNECT: await this.handleConnect({ stream, request, connection }); break
210
+ case HopMessage.Type.RESERVE: await this.handleReserve({ stream, request, connection }, options); break
211
+ case HopMessage.Type.CONNECT: await this.handleConnect({ stream, request, connection }, options); break
221
212
  default: {
222
213
  this.log.error('invalid hop request type %s via peer %p', request.type, connection.remotePeer)
223
214
  await stream.pb(HopMessage).write({ type: HopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE })
@@ -225,37 +216,38 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
225
216
  }
226
217
  }
227
218
 
228
- async handleReserve ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
219
+ async handleReserve ({ stream, connection }: HopProtocolOptions, options: AbortOptions): Promise<void> {
229
220
  const hopstr = stream.pb(HopMessage)
230
221
  this.log('hop reserve request from %p', connection.remotePeer)
231
222
 
232
223
  if (isRelayAddr(connection.remoteAddr)) {
233
224
  this.log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer)
234
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
225
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options)
235
226
  return
236
227
  }
237
228
 
238
229
  if ((await this.connectionGater.denyInboundRelayReservation?.(connection.remotePeer)) === true) {
239
230
  this.log.error('reservation for %p denied by connection gater', connection.remotePeer)
240
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
231
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options)
241
232
  return
242
233
  }
243
234
 
244
235
  const result = this.reservationStore.reserve(connection.remotePeer, connection.remoteAddr)
245
236
 
246
- if (result.status !== Status.OK) {
247
- await hopstr.write({ type: HopMessage.Type.STATUS, status: result.status })
248
- return
249
- }
250
-
251
237
  try {
238
+ if (result.status !== Status.OK) {
239
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: result.status }, options)
240
+ return
241
+ }
242
+
252
243
  // tag relay target peer
253
244
  // result.expire is non-null if `ReservationStore.reserve` returns with status == OK
254
245
  if (result.expire != null) {
255
246
  const ttl = (result.expire * 1000) - Date.now()
256
247
  await this.peerStore.merge(connection.remotePeer, {
257
248
  tags: {
258
- [RELAY_SOURCE_TAG]: { value: 1, ttl }
249
+ [RELAY_SOURCE_TAG]: { value: 1, ttl },
250
+ [KEEP_ALIVE_SOURCE_TAG]: { value: 1, ttl }
259
251
  }
260
252
  })
261
253
  }
@@ -265,11 +257,22 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
265
257
  status: Status.OK,
266
258
  reservation: await this.makeReservation(connection.remotePeer, BigInt(result.expire ?? 0)),
267
259
  limit: this.reservationStore.get(connection.remotePeer)?.limit
268
- })
260
+ }, options)
269
261
  this.log('sent confirmation response to %s', connection.remotePeer)
270
262
  } catch (err) {
271
- this.log.error('failed to send confirmation response to %p', connection.remotePeer, err)
263
+ this.log.error('failed to send confirmation response to %p - %e', connection.remotePeer, err)
272
264
  this.reservationStore.removeReservation(connection.remotePeer)
265
+
266
+ try {
267
+ await this.peerStore.merge(connection.remotePeer, {
268
+ tags: {
269
+ [RELAY_SOURCE_TAG]: undefined,
270
+ [KEEP_ALIVE_SOURCE_TAG]: undefined
271
+ }
272
+ })
273
+ } catch (err) {
274
+ this.log.error('failed to untag relay source peer %p - %e', connection.remotePeer, err)
275
+ }
273
276
  }
274
277
  }
275
278
 
@@ -300,12 +303,12 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
300
303
  }
301
304
  }
302
305
 
303
- async handleConnect ({ stream, request, connection }: HopProtocolOptions): Promise<void> {
306
+ async handleConnect ({ stream, request, connection }: HopProtocolOptions, options: AbortOptions): Promise<void> {
304
307
  const hopstr = stream.pb(HopMessage)
305
308
 
306
309
  if (isRelayAddr(connection.remoteAddr)) {
307
310
  this.log.error('relay reservation over circuit connection denied for peer: %p', connection.remotePeer)
308
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
311
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options)
309
312
  return
310
313
  }
311
314
 
@@ -323,19 +326,19 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
323
326
  dstPeer = peerIdFromMultihash(Digest.decode(request.peer.id))
324
327
  } catch (err) {
325
328
  this.log.error('invalid hop connect request via peer %p %s', connection.remotePeer, err)
326
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE })
329
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE }, options)
327
330
  return
328
331
  }
329
332
 
330
333
  if (!this.reservationStore.hasReservation(dstPeer)) {
331
334
  this.log.error('hop connect denied for destination peer %p not having a reservation for %p with status %s', dstPeer, connection.remotePeer, Status.NO_RESERVATION)
332
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION })
335
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION }, options)
333
336
  return
334
337
  }
335
338
 
336
339
  if ((await this.connectionGater.denyOutboundRelayedConnection?.(connection.remotePeer, dstPeer)) === true) {
337
340
  this.log.error('hop connect for %p to %p denied by connection gater', connection.remotePeer, dstPeer)
338
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED })
341
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.PERMISSION_DENIED }, options)
339
342
  return
340
343
  }
341
344
 
@@ -343,7 +346,7 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
343
346
 
344
347
  if (connections.length === 0) {
345
348
  this.log('hop connect denied for destination peer %p not having a connection for %p as there is no destination connection', dstPeer, connection.remotePeer)
346
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION })
349
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.NO_RESERVATION }, options)
347
350
  return
348
351
  }
349
352
 
@@ -360,11 +363,11 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
360
363
  },
361
364
  limit
362
365
  }
363
- })
366
+ }, options)
364
367
 
365
368
  if (destinationStream == null) {
366
369
  this.log.error('failed to open stream to destination peer %p', destinationConnection?.remotePeer)
367
- await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.CONNECTION_FAILED })
370
+ await hopstr.write({ type: HopMessage.Type.STATUS, status: Status.CONNECTION_FAILED }, options)
368
371
  return
369
372
  }
370
373
 
@@ -372,7 +375,7 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
372
375
  type: HopMessage.Type.STATUS,
373
376
  status: Status.OK,
374
377
  limit
375
- })
378
+ }, options)
376
379
  const sourceStream = stream.unwrap()
377
380
 
378
381
  this.log('connection from %p to %p established - merging streams', connection.remotePeer, dstPeer)
@@ -385,29 +388,27 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
385
388
  /**
386
389
  * Send a STOP request to the target peer that the dialing peer wants to contact
387
390
  */
388
- async stopHop ({
389
- connection,
390
- request
391
- }: StopOptions): Promise<Stream | undefined> {
391
+ async stopHop ({ connection, request }: StopOptions, options: AbortOptions): Promise<Stream | undefined> {
392
392
  this.log('starting circuit relay v2 stop request to %s', connection.remotePeer)
393
393
  const stream = await connection.newStream([RELAY_V2_STOP_CODEC], {
394
394
  maxOutboundStreams: this.maxOutboundStopStreams,
395
- runOnLimitedConnection: true
395
+ runOnLimitedConnection: true,
396
+ ...options
396
397
  })
397
398
  const pbstr = pbStream(stream)
398
399
  const stopstr = pbstr.pb(StopMessage)
399
- await stopstr.write(request)
400
+ await stopstr.write(request, options)
400
401
  let response
401
402
 
402
403
  try {
403
- response = await stopstr.read()
404
+ response = await stopstr.read(options)
404
405
  } catch (err) {
405
406
  this.log.error('error parsing stop message response from %p', connection.remotePeer)
406
407
  }
407
408
 
408
409
  if (response == null) {
409
410
  this.log.error('could not read response from %p', connection.remotePeer)
410
- await stream.close()
411
+ await stream.close(options)
411
412
  return
412
413
  }
413
414
 
@@ -417,7 +418,7 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
417
418
  }
418
419
 
419
420
  this.log('stop request failed with code %d', response.status)
420
- await stream.close()
421
+ await stream.close(options)
421
422
  }
422
423
 
423
424
  get reservations (): PeerMap<RelayReservation> {