libp2p 0.46.8 → 0.46.9-10cbc8fa
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.
- package/dist/index.min.js +22 -22
- package/dist/src/autonat/index.d.ts.map +1 -1
- package/dist/src/autonat/index.js +18 -9
- package/dist/src/autonat/index.js.map +1 -1
- package/dist/src/circuit-relay/transport/reservation-store.js +1 -1
- package/dist/src/circuit-relay/transport/reservation-store.js.map +1 -1
- package/dist/src/circuit-relay/utils.d.ts.map +1 -1
- package/dist/src/circuit-relay/utils.js +14 -7
- package/dist/src/circuit-relay/utils.js.map +1 -1
- package/dist/src/config.js +2 -2
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection-manager/auto-dial.d.ts +2 -0
- package/dist/src/connection-manager/auto-dial.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dial.js +19 -2
- package/dist/src/connection-manager/auto-dial.js.map +1 -1
- package/dist/src/connection-manager/constants.defaults.d.ts +4 -0
- package/dist/src/connection-manager/constants.defaults.d.ts.map +1 -1
- package/dist/src/connection-manager/constants.defaults.js +4 -0
- package/dist/src/connection-manager/constants.defaults.js.map +1 -1
- package/dist/src/connection-manager/dial-queue.js +2 -2
- package/dist/src/connection-manager/dial-queue.js.map +1 -1
- package/dist/src/connection-manager/index.d.ts +7 -0
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +2 -2
- package/dist/src/connection-manager/index.js.map +1 -1
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +7 -3
- package/dist/src/fetch/index.js.map +1 -1
- package/dist/src/identify/consts.d.ts +1 -1
- package/dist/src/identify/consts.d.ts.map +1 -1
- package/dist/src/libp2p.js +1 -1
- package/dist/src/libp2p.js.map +1 -1
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +7 -3
- package/dist/src/ping/index.js.map +1 -1
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +5 -4
- package/dist/src/upgrader.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.d.ts.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/package.json +21 -22
- package/src/autonat/index.ts +20 -7
- package/src/circuit-relay/transport/reservation-store.ts +1 -1
- package/src/circuit-relay/utils.ts +18 -7
- package/src/config.ts +2 -2
- package/src/connection-manager/auto-dial.ts +22 -2
- package/src/connection-manager/constants.defaults.ts +5 -0
- package/src/connection-manager/dial-queue.ts +2 -2
- package/src/connection-manager/index.ts +10 -2
- package/src/fetch/index.ts +8 -3
- package/src/libp2p.ts +1 -1
- package/src/ping/index.ts +8 -3
- package/src/upgrader.ts +8 -5
- package/src/version.ts +1 -1
- package/dist/typedoc-urls.json +0 -58
package/src/autonat/index.ts
CHANGED
|
@@ -20,17 +20,18 @@
|
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
import { setMaxListeners } from 'events'
|
|
23
|
+
import { CodeError } from '@libp2p/interface/errors'
|
|
23
24
|
import { logger } from '@libp2p/logger'
|
|
24
25
|
import { peerIdFromBytes } from '@libp2p/peer-id'
|
|
25
26
|
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
|
|
26
27
|
import { multiaddr, protocols } from '@multiformats/multiaddr'
|
|
27
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
28
28
|
import first from 'it-first'
|
|
29
29
|
import * as lp from 'it-length-prefixed'
|
|
30
30
|
import map from 'it-map'
|
|
31
31
|
import parallel from 'it-parallel'
|
|
32
32
|
import { pipe } from 'it-pipe'
|
|
33
33
|
import isPrivateIp from 'private-ip'
|
|
34
|
+
import { codes } from '../errors.js'
|
|
34
35
|
import {
|
|
35
36
|
MAX_INBOUND_STREAMS,
|
|
36
37
|
MAX_OUTBOUND_STREAMS,
|
|
@@ -155,6 +156,12 @@ class DefaultAutoNATService implements Startable {
|
|
|
155
156
|
async handleIncomingAutonatStream (data: IncomingStreamData): Promise<void> {
|
|
156
157
|
const signal = AbortSignal.timeout(this.timeout)
|
|
157
158
|
|
|
159
|
+
const onAbort = (): void => {
|
|
160
|
+
data.stream.abort(new CodeError('handleIncomingAutonatStream timeout', codes.ERR_TIMEOUT))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
164
|
+
|
|
158
165
|
// this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
|
|
159
166
|
// appearing in the console
|
|
160
167
|
try {
|
|
@@ -166,11 +173,10 @@ class DefaultAutoNATService implements Startable {
|
|
|
166
173
|
.map(ma => ma.toOptions().host)
|
|
167
174
|
|
|
168
175
|
try {
|
|
169
|
-
const source = abortableDuplex(data.stream, signal)
|
|
170
176
|
const self = this
|
|
171
177
|
|
|
172
178
|
await pipe(
|
|
173
|
-
|
|
179
|
+
data.stream,
|
|
174
180
|
(source) => lp.decode(source),
|
|
175
181
|
async function * (stream) {
|
|
176
182
|
const buf = await first(stream)
|
|
@@ -379,12 +385,12 @@ class DefaultAutoNATService implements Startable {
|
|
|
379
385
|
})
|
|
380
386
|
},
|
|
381
387
|
(source) => lp.encode(source),
|
|
382
|
-
// pipe to the stream, not the abortable source other wise we
|
|
383
|
-
// can't tell the remote when a dial timed out..
|
|
384
388
|
data.stream
|
|
385
389
|
)
|
|
386
390
|
} catch (err) {
|
|
387
391
|
log.error('error handling incoming autonat stream', err)
|
|
392
|
+
} finally {
|
|
393
|
+
signal.removeEventListener('abort', onAbort)
|
|
388
394
|
}
|
|
389
395
|
}
|
|
390
396
|
|
|
@@ -453,6 +459,8 @@ class DefaultAutoNATService implements Startable {
|
|
|
453
459
|
const networkSegments: string[] = []
|
|
454
460
|
|
|
455
461
|
const verifyAddress = async (peer: PeerInfo): Promise<Message.DialResponse | undefined> => {
|
|
462
|
+
let onAbort = (): void => {}
|
|
463
|
+
|
|
456
464
|
try {
|
|
457
465
|
log('asking %p to verify multiaddr', peer.id)
|
|
458
466
|
|
|
@@ -463,12 +471,15 @@ class DefaultAutoNATService implements Startable {
|
|
|
463
471
|
const stream = await connection.newStream(this.protocol, {
|
|
464
472
|
signal
|
|
465
473
|
})
|
|
466
|
-
|
|
474
|
+
|
|
475
|
+
onAbort = () => { stream.abort(new CodeError('verifyAddress timeout', codes.ERR_TIMEOUT)) }
|
|
476
|
+
|
|
477
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
467
478
|
|
|
468
479
|
const buf = await pipe(
|
|
469
480
|
[request],
|
|
470
481
|
(source) => lp.encode(source),
|
|
471
|
-
|
|
482
|
+
stream,
|
|
472
483
|
(source) => lp.decode(source),
|
|
473
484
|
async (stream) => first(stream)
|
|
474
485
|
)
|
|
@@ -510,6 +521,8 @@ class DefaultAutoNATService implements Startable {
|
|
|
510
521
|
return response.dialResponse
|
|
511
522
|
} catch (err) {
|
|
512
523
|
log.error('error asking remote to verify multiaddr', err)
|
|
524
|
+
} finally {
|
|
525
|
+
signal.removeEventListener('abort', onAbort)
|
|
513
526
|
}
|
|
514
527
|
}
|
|
515
528
|
|
|
@@ -261,7 +261,7 @@ export class ReservationStore extends EventEmitter<ReservationStoreEvents> imple
|
|
|
261
261
|
options.signal?.throwIfAborted()
|
|
262
262
|
|
|
263
263
|
log('requesting reservation from %p', connection.remotePeer)
|
|
264
|
-
const stream = await connection.newStream(RELAY_V2_HOP_CODEC)
|
|
264
|
+
const stream = await connection.newStream(RELAY_V2_HOP_CODEC, options)
|
|
265
265
|
const pbstr = pbStream(stream)
|
|
266
266
|
const hopstr = pbstr.pb(HopMessage)
|
|
267
267
|
await hopstr.write({ type: HopMessage.Type.RESERVE }, options)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { CodeError } from '@libp2p/interface/errors'
|
|
1
2
|
import { logger } from '@libp2p/logger'
|
|
2
|
-
import { abortableSource } from 'abortable-iterator'
|
|
3
3
|
import { anySignal } from 'any-signal'
|
|
4
4
|
import { CID } from 'multiformats/cid'
|
|
5
5
|
import { sha256 } from 'multiformats/hashes/sha2'
|
|
6
|
+
import { codes } from '../errors.js'
|
|
6
7
|
import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT } from './constants.js'
|
|
7
8
|
import type { Limit } from './pb/index.js'
|
|
8
9
|
import type { Stream } from '@libp2p/interface/connection'
|
|
@@ -58,9 +59,13 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
|
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
queueMicrotask(() => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
62
|
+
const onAbort = (): void => {
|
|
63
|
+
dst.abort(new CodeError('duration limit exceeded', codes.ERR_TIMEOUT))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
67
|
+
|
|
68
|
+
void dst.sink(countStreamBytes(src.source, dataLimit))
|
|
64
69
|
.catch(err => {
|
|
65
70
|
log.error('error while relaying streams src -> dst', err)
|
|
66
71
|
abortStreams(err)
|
|
@@ -69,6 +74,7 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
|
|
|
69
74
|
srcDstFinished = true
|
|
70
75
|
|
|
71
76
|
if (dstSrcFinished) {
|
|
77
|
+
signal.removeEventListener('abort', onAbort)
|
|
72
78
|
signal.clear()
|
|
73
79
|
clearTimeout(timeout)
|
|
74
80
|
}
|
|
@@ -76,9 +82,13 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
|
|
|
76
82
|
})
|
|
77
83
|
|
|
78
84
|
queueMicrotask(() => {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
85
|
+
const onAbort = (): void => {
|
|
86
|
+
src.abort(new CodeError('duration limit exceeded', codes.ERR_TIMEOUT))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
90
|
+
|
|
91
|
+
void src.sink(countStreamBytes(dst.source, dataLimit))
|
|
82
92
|
.catch(err => {
|
|
83
93
|
log.error('error while relaying streams dst -> src', err)
|
|
84
94
|
abortStreams(err)
|
|
@@ -87,6 +97,7 @@ const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Requ
|
|
|
87
97
|
dstSrcFinished = true
|
|
88
98
|
|
|
89
99
|
if (srcDstFinished) {
|
|
100
|
+
signal.removeEventListener('abort', onAbort)
|
|
90
101
|
signal.clear()
|
|
91
102
|
clearTimeout(timeout)
|
|
92
103
|
}
|
package/src/config.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors'
|
|
2
2
|
import { FaultTolerance } from '@libp2p/interface/transport'
|
|
3
|
-
import {
|
|
3
|
+
import { defaultAddressSort } from '@libp2p/utils/address-sort'
|
|
4
4
|
import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
|
|
5
5
|
import mergeOptions from 'merge-options'
|
|
6
6
|
import { codes, messages } from './errors.js'
|
|
@@ -19,7 +19,7 @@ const DefaultConfig: Partial<Libp2pInit> = {
|
|
|
19
19
|
resolvers: {
|
|
20
20
|
dnsaddr: dnsaddrResolver
|
|
21
21
|
},
|
|
22
|
-
addressSorter:
|
|
22
|
+
addressSorter: defaultAddressSort
|
|
23
23
|
},
|
|
24
24
|
transportManager: {
|
|
25
25
|
faultTolerance: FaultTolerance.FATAL_ALL
|
|
@@ -2,7 +2,7 @@ import { logger } from '@libp2p/logger'
|
|
|
2
2
|
import { PeerMap, PeerSet } from '@libp2p/peer-collections'
|
|
3
3
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
4
4
|
import { PeerJobQueue } from '../utils/peer-job-queue.js'
|
|
5
|
-
import { AUTO_DIAL_CONCURRENCY, AUTO_DIAL_INTERVAL, AUTO_DIAL_MAX_QUEUE_LENGTH, AUTO_DIAL_PEER_RETRY_THRESHOLD, AUTO_DIAL_PRIORITY, LAST_DIAL_FAILURE_KEY, MIN_CONNECTIONS } from './constants.js'
|
|
5
|
+
import { AUTO_DIAL_CONCURRENCY, AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE, AUTO_DIAL_INTERVAL, AUTO_DIAL_MAX_QUEUE_LENGTH, AUTO_DIAL_PEER_RETRY_THRESHOLD, AUTO_DIAL_PRIORITY, LAST_DIAL_FAILURE_KEY, MIN_CONNECTIONS } from './constants.js'
|
|
6
6
|
import type { Libp2pEvents } from '@libp2p/interface'
|
|
7
7
|
import type { EventEmitter } from '@libp2p/interface/events'
|
|
8
8
|
import type { PeerStore } from '@libp2p/interface/peer-store'
|
|
@@ -18,6 +18,7 @@ interface AutoDialInit {
|
|
|
18
18
|
autoDialPriority?: number
|
|
19
19
|
autoDialInterval?: number
|
|
20
20
|
autoDialPeerRetryThreshold?: number
|
|
21
|
+
autoDialDiscoveredPeersDebounce?: number
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
interface AutoDialComponents {
|
|
@@ -32,7 +33,8 @@ const defaultOptions = {
|
|
|
32
33
|
autoDialConcurrency: AUTO_DIAL_CONCURRENCY,
|
|
33
34
|
autoDialPriority: AUTO_DIAL_PRIORITY,
|
|
34
35
|
autoDialInterval: AUTO_DIAL_INTERVAL,
|
|
35
|
-
autoDialPeerRetryThreshold: AUTO_DIAL_PEER_RETRY_THRESHOLD
|
|
36
|
+
autoDialPeerRetryThreshold: AUTO_DIAL_PEER_RETRY_THRESHOLD,
|
|
37
|
+
autoDialDiscoveredPeersDebounce: AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export class AutoDial implements Startable {
|
|
@@ -44,6 +46,7 @@ export class AutoDial implements Startable {
|
|
|
44
46
|
private readonly autoDialIntervalMs: number
|
|
45
47
|
private readonly autoDialMaxQueueLength: number
|
|
46
48
|
private readonly autoDialPeerRetryThresholdMs: number
|
|
49
|
+
private readonly autoDialDiscoveredPeersDebounce: number
|
|
47
50
|
private autoDialInterval?: ReturnType<typeof setInterval>
|
|
48
51
|
private started: boolean
|
|
49
52
|
private running: boolean
|
|
@@ -61,6 +64,7 @@ export class AutoDial implements Startable {
|
|
|
61
64
|
this.autoDialIntervalMs = init.autoDialInterval ?? defaultOptions.autoDialInterval
|
|
62
65
|
this.autoDialMaxQueueLength = init.maxQueueLength ?? defaultOptions.maxQueueLength
|
|
63
66
|
this.autoDialPeerRetryThresholdMs = init.autoDialPeerRetryThreshold ?? defaultOptions.autoDialPeerRetryThreshold
|
|
67
|
+
this.autoDialDiscoveredPeersDebounce = init.autoDialDiscoveredPeersDebounce ?? defaultOptions.autoDialDiscoveredPeersDebounce
|
|
64
68
|
this.started = false
|
|
65
69
|
this.running = false
|
|
66
70
|
this.queue = new PeerJobQueue({
|
|
@@ -77,6 +81,22 @@ export class AutoDial implements Startable {
|
|
|
77
81
|
log.error(err)
|
|
78
82
|
})
|
|
79
83
|
})
|
|
84
|
+
|
|
85
|
+
// sometimes peers are discovered in quick succession so add a small
|
|
86
|
+
// debounce to ensure all eligible peers are autodialed
|
|
87
|
+
let debounce: ReturnType<typeof setTimeout>
|
|
88
|
+
|
|
89
|
+
// when new peers are discovered, dial them if we don't have
|
|
90
|
+
// enough connections
|
|
91
|
+
components.events.addEventListener('peer:discovery', () => {
|
|
92
|
+
clearTimeout(debounce)
|
|
93
|
+
debounce = setTimeout(() => {
|
|
94
|
+
this.autoDial()
|
|
95
|
+
.catch(err => {
|
|
96
|
+
log.error(err)
|
|
97
|
+
})
|
|
98
|
+
}, this.autoDialDiscoveredPeersDebounce)
|
|
99
|
+
})
|
|
80
100
|
}
|
|
81
101
|
|
|
82
102
|
isStarted (): boolean {
|
|
@@ -38,6 +38,11 @@ export const AUTO_DIAL_MAX_QUEUE_LENGTH = 100
|
|
|
38
38
|
*/
|
|
39
39
|
export const AUTO_DIAL_PEER_RETRY_THRESHOLD = 1000 * 60
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* @see https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.ConnectionManagerInit.html#autoDialDiscoveredPeersDebounce
|
|
43
|
+
*/
|
|
44
|
+
export const AUTO_DIAL_DISCOVERED_PEERS_DEBOUNCE = 10
|
|
45
|
+
|
|
41
46
|
/**
|
|
42
47
|
* @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#inboundConnectionThreshold
|
|
43
48
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { setMaxListeners } from 'events'
|
|
2
2
|
import { AbortError, CodeError } from '@libp2p/interface/errors'
|
|
3
3
|
import { logger } from '@libp2p/logger'
|
|
4
|
-
import {
|
|
4
|
+
import { defaultAddressSort } from '@libp2p/utils/address-sort'
|
|
5
5
|
import { type Multiaddr, type Resolver, resolvers } from '@multiformats/multiaddr'
|
|
6
6
|
import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
|
|
7
7
|
import { type ClearableSignal, anySignal } from 'any-signal'
|
|
@@ -51,7 +51,7 @@ interface DialerInit {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
const defaultOptions = {
|
|
54
|
-
addressSorter:
|
|
54
|
+
addressSorter: defaultAddressSort,
|
|
55
55
|
maxParallelDials: MAX_PARALLEL_DIALS,
|
|
56
56
|
maxPeerAddrsToDial: MAX_PEER_ADDRS_TO_DIAL,
|
|
57
57
|
maxParallelDialsPerPeer: MAX_PARALLEL_DIALS_PER_PEER,
|
|
@@ -2,7 +2,7 @@ import { CodeError } from '@libp2p/interface/errors'
|
|
|
2
2
|
import { KEEP_ALIVE } from '@libp2p/interface/peer-store/tags'
|
|
3
3
|
import { logger } from '@libp2p/logger'
|
|
4
4
|
import { PeerMap } from '@libp2p/peer-collections'
|
|
5
|
-
import {
|
|
5
|
+
import { defaultAddressSort } from '@libp2p/utils/address-sort'
|
|
6
6
|
import { type Multiaddr, type Resolver, multiaddr } from '@multiformats/multiaddr'
|
|
7
7
|
import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
|
|
8
8
|
import { RateLimiterMemory } from 'rate-limiter-flexible'
|
|
@@ -72,6 +72,14 @@ export interface ConnectionManagerInit {
|
|
|
72
72
|
*/
|
|
73
73
|
autoDialPeerRetryThreshold?: number
|
|
74
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Newly discovered peers may be auto-dialed to increase the number of open
|
|
77
|
+
* connections, but they can be discovered in quick succession so add a small
|
|
78
|
+
* delay before attempting to dial them in case more peers have been
|
|
79
|
+
* discovered. (default: 10ms)
|
|
80
|
+
*/
|
|
81
|
+
autoDialDiscoveredPeersDebounce?: number
|
|
82
|
+
|
|
75
83
|
/**
|
|
76
84
|
* Sort the known addresses of a peer before trying to dial, By default public
|
|
77
85
|
* addresses will be dialled before private (e.g. loopback or LAN) addresses.
|
|
@@ -246,7 +254,7 @@ export class DefaultConnectionManager implements ConnectionManager, Startable {
|
|
|
246
254
|
transportManager: components.transportManager,
|
|
247
255
|
connectionGater: components.connectionGater
|
|
248
256
|
}, {
|
|
249
|
-
addressSorter: init.addressSorter ??
|
|
257
|
+
addressSorter: init.addressSorter ?? defaultAddressSort,
|
|
250
258
|
maxParallelDials: init.maxParallelDials ?? MAX_PARALLEL_DIALS,
|
|
251
259
|
maxPeerAddrsToDial: init.maxPeerAddrsToDial ?? MAX_PEER_ADDRS_TO_DIAL,
|
|
252
260
|
dialTimeout: init.dialTimeout ?? DIAL_TIMEOUT,
|
package/src/fetch/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { setMaxListeners } from 'events'
|
|
2
2
|
import { CodeError } from '@libp2p/interface/errors'
|
|
3
3
|
import { logger } from '@libp2p/logger'
|
|
4
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
5
4
|
import first from 'it-first'
|
|
6
5
|
import * as lp from 'it-length-prefixed'
|
|
7
6
|
import { pipe } from 'it-pipe'
|
|
@@ -140,6 +139,7 @@ class DefaultFetchService implements Startable, FetchService {
|
|
|
140
139
|
const connection = await this.components.connectionManager.openConnection(peer, options)
|
|
141
140
|
let signal = options.signal
|
|
142
141
|
let stream: Stream | undefined
|
|
142
|
+
let onAbort = (): void => {}
|
|
143
143
|
|
|
144
144
|
// create a timeout if no abort signal passed
|
|
145
145
|
if (signal == null) {
|
|
@@ -157,15 +157,19 @@ class DefaultFetchService implements Startable, FetchService {
|
|
|
157
157
|
signal
|
|
158
158
|
})
|
|
159
159
|
|
|
160
|
+
onAbort = () => {
|
|
161
|
+
stream?.abort(new CodeError('fetch timeout', codes.ERR_TIMEOUT))
|
|
162
|
+
}
|
|
163
|
+
|
|
160
164
|
// make stream abortable
|
|
161
|
-
|
|
165
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
162
166
|
|
|
163
167
|
log('fetch %s', key)
|
|
164
168
|
|
|
165
169
|
const result = await pipe(
|
|
166
170
|
[FetchRequest.encode({ identifier: key })],
|
|
167
171
|
(source) => lp.encode(source),
|
|
168
|
-
|
|
172
|
+
stream,
|
|
169
173
|
(source) => lp.decode(source),
|
|
170
174
|
async function (source) {
|
|
171
175
|
const buf = await first(source)
|
|
@@ -200,6 +204,7 @@ class DefaultFetchService implements Startable, FetchService {
|
|
|
200
204
|
|
|
201
205
|
return result ?? null
|
|
202
206
|
} finally {
|
|
207
|
+
signal.removeEventListener('abort', onAbort)
|
|
203
208
|
if (stream != null) {
|
|
204
209
|
await stream.close()
|
|
205
210
|
}
|
package/src/libp2p.ts
CHANGED
|
@@ -105,7 +105,7 @@ export class Libp2pNode<T extends ServiceMap = Record<string, unknown>> extends
|
|
|
105
105
|
protocols: evt.detail.peer.protocols
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
components.events.safeDispatchEvent('peer:discovery', { detail: peerInfo })
|
|
109
109
|
}
|
|
110
110
|
})
|
|
111
111
|
|
package/src/ping/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { randomBytes } from '@libp2p/crypto'
|
|
2
2
|
import { CodeError } from '@libp2p/interface/errors'
|
|
3
3
|
import { logger } from '@libp2p/logger'
|
|
4
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
5
4
|
import first from 'it-first'
|
|
6
5
|
import { pipe } from 'it-pipe'
|
|
7
6
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
@@ -108,6 +107,7 @@ class DefaultPingService implements Startable, PingService {
|
|
|
108
107
|
const data = randomBytes(PING_LENGTH)
|
|
109
108
|
const connection = await this.components.connectionManager.openConnection(peer, options)
|
|
110
109
|
let stream: Stream | undefined
|
|
110
|
+
let onAbort = (): void => {}
|
|
111
111
|
|
|
112
112
|
options.signal = options.signal ?? AbortSignal.timeout(this.timeout)
|
|
113
113
|
|
|
@@ -117,12 +117,16 @@ class DefaultPingService implements Startable, PingService {
|
|
|
117
117
|
runOnTransientConnection: this.runOnTransientConnection
|
|
118
118
|
})
|
|
119
119
|
|
|
120
|
+
onAbort = () => {
|
|
121
|
+
stream?.abort(new CodeError('ping timeout', codes.ERR_TIMEOUT))
|
|
122
|
+
}
|
|
123
|
+
|
|
120
124
|
// make stream abortable
|
|
121
|
-
|
|
125
|
+
options.signal.addEventListener('abort', onAbort, { once: true })
|
|
122
126
|
|
|
123
127
|
const result = await pipe(
|
|
124
128
|
[data],
|
|
125
|
-
|
|
129
|
+
stream,
|
|
126
130
|
async (source) => first(source)
|
|
127
131
|
)
|
|
128
132
|
|
|
@@ -146,6 +150,7 @@ class DefaultPingService implements Startable, PingService {
|
|
|
146
150
|
|
|
147
151
|
throw err
|
|
148
152
|
} finally {
|
|
153
|
+
options.signal.removeEventListener('abort', onAbort)
|
|
149
154
|
if (stream != null) {
|
|
150
155
|
await stream.close()
|
|
151
156
|
}
|
package/src/upgrader.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { CodeError } from '@libp2p/interface/errors'
|
|
|
3
3
|
import { logger } from '@libp2p/logger'
|
|
4
4
|
import * as mss from '@libp2p/multistream-select'
|
|
5
5
|
import { peerIdFromString } from '@libp2p/peer-id'
|
|
6
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
7
6
|
import { createConnection } from './connection/index.js'
|
|
8
7
|
import { INBOUND_UPGRADE_TIMEOUT } from './connection-manager/constants.js'
|
|
9
8
|
import { codes } from './errors.js'
|
|
@@ -165,16 +164,18 @@ export class DefaultUpgrader implements Upgrader {
|
|
|
165
164
|
|
|
166
165
|
const signal = AbortSignal.timeout(this.inboundUpgradeTimeout)
|
|
167
166
|
|
|
167
|
+
const onAbort = (): void => {
|
|
168
|
+
maConn.abort(new CodeError('inbound upgrade timeout', codes.ERR_TIMEOUT))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
172
|
+
|
|
168
173
|
try {
|
|
169
174
|
// fails on node < 15.4
|
|
170
175
|
setMaxListeners?.(Infinity, signal)
|
|
171
176
|
} catch { }
|
|
172
177
|
|
|
173
178
|
try {
|
|
174
|
-
const abortableStream = abortableDuplex(maConn, signal)
|
|
175
|
-
maConn.source = abortableStream.source
|
|
176
|
-
maConn.sink = abortableStream.sink
|
|
177
|
-
|
|
178
179
|
if ((await this.components.connectionGater.denyInboundConnection?.(maConn)) === true) {
|
|
179
180
|
throw new CodeError('The multiaddr connection is blocked by gater.acceptConnection', codes.ERR_CONNECTION_INTERCEPTED)
|
|
180
181
|
}
|
|
@@ -255,6 +256,8 @@ export class DefaultUpgrader implements Upgrader {
|
|
|
255
256
|
transient: opts?.transient
|
|
256
257
|
})
|
|
257
258
|
} finally {
|
|
259
|
+
signal.removeEventListener('abort', onAbort)
|
|
260
|
+
|
|
258
261
|
this.components.connectionManager.afterUpgradeInbound()
|
|
259
262
|
}
|
|
260
263
|
}
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '0.46.
|
|
1
|
+
export const version = '0.46.9-10cbc8fa'
|
|
2
2
|
export const name = 'libp2p'
|
package/dist/typedoc-urls.json
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"AutoNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.autonat.AutoNATComponents.html",
|
|
3
|
-
"AutoNATServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.autonat.AutoNATServiceInit.html",
|
|
4
|
-
"autoNATService": "https://libp2p.github.io/js-libp2p/functions/libp2p.autonat.autoNATService.html",
|
|
5
|
-
"codec": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.codec.html",
|
|
6
|
-
"decode": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.decode.html",
|
|
7
|
-
"encode": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.unknown.Limit.encode.html",
|
|
8
|
-
"Limit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.unknown.Limit-1.html",
|
|
9
|
-
"CircuitRelayService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.CircuitRelayService.html",
|
|
10
|
-
"CircuitRelayServiceEvents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.CircuitRelayServiceEvents.html",
|
|
11
|
-
"RelayReservation": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.circuit_relay.RelayReservation.html",
|
|
12
|
-
"circuitRelayServer": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.circuitRelayServer.html",
|
|
13
|
-
"circuitRelayTransport": "https://libp2p.github.io/js-libp2p/functions/libp2p.circuit_relay.circuitRelayTransport.html",
|
|
14
|
-
"FetchService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchService.html",
|
|
15
|
-
"FetchServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchServiceComponents.html",
|
|
16
|
-
"FetchServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.FetchServiceInit.html",
|
|
17
|
-
"HandleMessageOptions": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.HandleMessageOptions.html",
|
|
18
|
-
"LookupFunction": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.fetch.LookupFunction.html",
|
|
19
|
-
"fetchService": "https://libp2p.github.io/js-libp2p/functions/libp2p.fetch.fetchService-1.html",
|
|
20
|
-
"Identify": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.unknown.Identify-1.html",
|
|
21
|
-
"IdentifyService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyService.html",
|
|
22
|
-
"IdentifyServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyServiceComponents.html",
|
|
23
|
-
"IdentifyServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.identify.IdentifyServiceInit.html",
|
|
24
|
-
"Message": "https://libp2p.github.io/js-libp2p/variables/libp2p.identify.Message.html",
|
|
25
|
-
"multicodecs": "https://libp2p.github.io/js-libp2p/variables/libp2p.identify.multicodecs.html",
|
|
26
|
-
"identifyService": "https://libp2p.github.io/js-libp2p/functions/libp2p.identify.identifyService-1.html",
|
|
27
|
-
"AddressFilter": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.AddressFilter.html",
|
|
28
|
-
"AddressManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.AddressManagerInit.html",
|
|
29
|
-
"Components": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.Components.html",
|
|
30
|
-
"ConnectionManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.ConnectionManagerInit.html",
|
|
31
|
-
"TransportManagerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.unknown.TransportManagerInit.html",
|
|
32
|
-
"Libp2pInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.index.Libp2pInit.html",
|
|
33
|
-
"Libp2pOptions": "https://libp2p.github.io/js-libp2p/types/libp2p.index.Libp2pOptions.html",
|
|
34
|
-
"ServiceFactoryMap": "https://libp2p.github.io/js-libp2p/types/libp2p.index.ServiceFactoryMap.html",
|
|
35
|
-
"createLibp2p": "https://libp2p.github.io/js-libp2p/functions/libp2p.index.createLibp2p.html",
|
|
36
|
-
"plaintext": "https://libp2p.github.io/js-libp2p/functions/libp2p.insecure.plaintext.html",
|
|
37
|
-
"PingService": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingService.html",
|
|
38
|
-
"PingServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingServiceComponents.html",
|
|
39
|
-
"PingServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.ping.PingServiceInit.html",
|
|
40
|
-
"pingService": "https://libp2p.github.io/js-libp2p/functions/libp2p.ping.pingService-1.html",
|
|
41
|
-
"ProtectorInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.pnet.ProtectorInit.html",
|
|
42
|
-
"generateKey": "https://libp2p.github.io/js-libp2p/functions/libp2p.pnet.generateKey.html",
|
|
43
|
-
"preSharedKey": "https://libp2p.github.io/js-libp2p/functions/libp2p.pnet.preSharedKey.html",
|
|
44
|
-
"UPnPNAT": "https://libp2p.github.io/js-libp2p/classes/libp2p.upnp_nat.unknown.UPnPNAT.html",
|
|
45
|
-
"AdvertServiceComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.AdvertServiceComponents.html",
|
|
46
|
-
"AdvertServiceInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.AdvertServiceInit.html",
|
|
47
|
-
"CircuitRelayServerComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayServerComponents.html",
|
|
48
|
-
"CircuitRelayServerInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayServerInit.html",
|
|
49
|
-
"CircuitRelayTransportComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayTransportComponents.html",
|
|
50
|
-
"CircuitRelayTransportInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.CircuitRelayTransportInit.html",
|
|
51
|
-
"RelayDiscoveryComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.RelayDiscoveryComponents.html",
|
|
52
|
-
"RelayStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.RelayStoreInit.html",
|
|
53
|
-
"ReservationStoreInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.unknown.ReservationStoreInit.html",
|
|
54
|
-
"PMPOptions": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.PMPOptions.html",
|
|
55
|
-
"UPnPNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.UPnPNATComponents.html",
|
|
56
|
-
"UPnPNATInit": "https://libp2p.github.io/js-libp2p/interfaces/libp2p.upnp_nat.UPnPNATInit.html",
|
|
57
|
-
"uPnPNATService": "https://libp2p.github.io/js-libp2p/functions/libp2p.upnp_nat.uPnPNATService.html"
|
|
58
|
-
}
|