libp2p 0.42.2-593deefe → 0.42.2-5e63ee2d
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 +30 -30
- package/dist/src/address-manager/index.d.ts +1 -10
- package/dist/src/address-manager/index.d.ts.map +1 -1
- package/dist/src/address-manager/index.js +46 -29
- package/dist/src/address-manager/index.js.map +1 -1
- package/dist/src/autonat/constants.d.ts +4 -0
- package/dist/src/autonat/constants.d.ts.map +1 -0
- package/dist/src/autonat/constants.js +4 -0
- package/dist/src/autonat/constants.js.map +1 -0
- package/dist/src/autonat/index.d.ts +64 -0
- package/dist/src/autonat/index.d.ts.map +1 -0
- package/dist/src/autonat/index.js +417 -0
- package/dist/src/autonat/index.js.map +1 -0
- package/dist/src/autonat/pb/index.d.ts +57 -0
- package/dist/src/autonat/pb/index.d.ts.map +1 -0
- package/dist/src/autonat/pb/index.js +250 -0
- package/dist/src/autonat/pb/index.js.map +1 -0
- package/dist/src/circuit/constants.d.ts +29 -3
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +32 -5
- package/dist/src/circuit/constants.js.map +1 -1
- package/dist/src/circuit/index.d.ts +16 -61
- package/dist/src/circuit/index.d.ts.map +1 -1
- package/dist/src/circuit/index.js +2 -1
- package/dist/src/circuit/index.js.map +1 -1
- package/dist/src/circuit/server/advert-service.d.ts +43 -0
- package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
- package/dist/src/circuit/server/advert-service.js +69 -0
- package/dist/src/circuit/server/advert-service.js.map +1 -0
- package/dist/src/circuit/server/index.d.ts +60 -0
- package/dist/src/circuit/server/index.d.ts.map +1 -0
- package/dist/src/circuit/server/index.js +287 -0
- package/dist/src/circuit/server/index.js.map +1 -0
- package/dist/src/circuit/{reservation-store.d.ts → server/reservation-store.d.ts} +17 -10
- package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-store.js +57 -0
- package/dist/src/circuit/server/reservation-store.js.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
- package/dist/src/circuit/{reservation-voucher.js → server/reservation-voucher.js} +1 -1
- package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
- package/dist/src/circuit/transport/discovery.d.ts +45 -0
- package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
- package/dist/src/circuit/transport/discovery.js +82 -0
- package/dist/src/circuit/transport/discovery.js.map +1 -0
- package/dist/src/circuit/transport/index.d.ts +33 -0
- package/dist/src/circuit/transport/index.d.ts.map +1 -0
- package/dist/src/circuit/transport/index.js +225 -0
- package/dist/src/circuit/transport/index.js.map +1 -0
- package/dist/src/circuit/transport/listener.d.ts +9 -0
- package/dist/src/circuit/transport/listener.d.ts.map +1 -0
- package/dist/src/circuit/transport/listener.js +76 -0
- package/dist/src/circuit/transport/listener.js.map +1 -0
- package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
- package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/transport/reservation-store.js +165 -0
- package/dist/src/circuit/transport/reservation-store.js.map +1 -0
- package/dist/src/circuit/utils.d.ts +4 -2
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +75 -102
- package/dist/src/circuit/utils.js.map +1 -1
- package/dist/src/components.d.ts +2 -1
- package/dist/src/components.d.ts.map +1 -1
- package/dist/src/components.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +17 -20
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection/index.d.ts +2 -2
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/index.js +1 -1
- package/dist/src/connection/index.js.map +1 -1
- package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
- package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dialler.js +0 -9
- package/dist/src/connection-manager/auto-dialler.js.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.js +1 -1
- package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
- package/dist/src/connection-manager/dialer/index.d.ts +2 -1
- package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/index.js +3 -3
- package/dist/src/connection-manager/dialer/index.js.map +1 -1
- package/dist/src/connection-manager/index.d.ts +0 -4
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +1 -1
- package/dist/src/connection-manager/index.js.map +1 -1
- package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
- package/dist/src/connection-manager/latency-monitor.js +1 -1
- package/dist/src/connection-manager/latency-monitor.js.map +1 -1
- package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
- package/dist/src/content-routing/index.d.ts +6 -4
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +1 -1
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/content-routing/utils.d.ts +3 -3
- package/dist/src/content-routing/utils.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.d.ts +2 -1
- package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.js.map +1 -1
- package/dist/src/dht/dht-peer-routing.d.ts +3 -2
- package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-peer-routing.js.map +1 -1
- package/dist/src/dht/dummy-dht.d.ts +1 -1
- package/dist/src/dht/dummy-dht.d.ts.map +1 -1
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/identify/index.d.ts +3 -1
- package/dist/src/identify/index.d.ts.map +1 -1
- package/dist/src/identify/index.js +12 -7
- package/dist/src/identify/index.js.map +1 -1
- package/dist/src/index.d.ts +13 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/insecure/index.d.ts.map +1 -1
- package/dist/src/insecure/index.js.map +1 -1
- package/dist/src/libp2p.d.ts +6 -4
- package/dist/src/libp2p.d.ts.map +1 -1
- package/dist/src/libp2p.js +19 -28
- package/dist/src/libp2p.js.map +1 -1
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +3 -1
- package/dist/src/nat-manager.js.map +1 -1
- package/dist/src/peer-record-updater.d.ts.map +1 -1
- package/dist/src/peer-routing.d.ts.map +1 -1
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/pnet/crypto.d.ts +1 -1
- package/dist/src/pnet/crypto.d.ts.map +1 -1
- package/dist/src/pnet/crypto.js +1 -1
- package/dist/src/pnet/crypto.js.map +1 -1
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +1 -1
- package/dist/src/transport-manager.js.map +1 -1
- package/dist/src/upgrader.d.ts +2 -1
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +19 -14
- package/dist/src/upgrader.js.map +1 -1
- package/package.json +23 -18
- package/src/address-manager/index.ts +62 -35
- package/src/autonat/constants.ts +4 -0
- package/src/autonat/index.ts +567 -0
- package/src/autonat/pb/index.proto +35 -0
- package/src/autonat/pb/index.ts +320 -0
- package/src/circuit/constants.ts +40 -5
- package/src/circuit/index.ts +17 -67
- package/src/circuit/server/advert-service.ts +108 -0
- package/src/circuit/server/index.ts +421 -0
- package/src/circuit/server/reservation-store.ts +111 -0
- package/src/circuit/{reservation-voucher.ts → server/reservation-voucher.ts} +3 -3
- package/src/circuit/transport/discovery.ts +127 -0
- package/src/circuit/transport/index.ts +325 -0
- package/src/circuit/transport/listener.ts +99 -0
- package/src/circuit/transport/reservation-store.ts +249 -0
- package/src/circuit/utils.ts +78 -115
- package/src/components.ts +9 -8
- package/src/config.ts +17 -20
- package/src/connection/index.ts +7 -7
- package/src/connection-manager/auto-dialler.ts +4 -20
- package/src/connection-manager/dialer/dial-request.ts +1 -1
- package/src/connection-manager/dialer/index.ts +10 -9
- package/src/connection-manager/index.ts +14 -19
- package/src/connection-manager/latency-monitor.ts +9 -9
- package/src/connection-manager/visibility-change-emitter.ts +4 -4
- package/src/content-routing/index.ts +10 -8
- package/src/content-routing/utils.ts +3 -3
- package/src/dht/dht-content-routing.ts +3 -2
- package/src/dht/dht-peer-routing.ts +3 -2
- package/src/dht/dummy-dht.ts +1 -1
- package/src/fetch/index.ts +7 -7
- package/src/identify/index.ts +22 -17
- package/src/index.ts +14 -7
- package/src/insecure/index.ts +2 -1
- package/src/libp2p.ts +33 -41
- package/src/nat-manager.ts +9 -7
- package/src/peer-record-updater.ts +4 -4
- package/src/peer-routing.ts +4 -4
- package/src/ping/index.ts +4 -4
- package/src/pnet/crypto.ts +3 -3
- package/src/pnet/key-generator.ts +1 -1
- package/src/registrar.ts +8 -8
- package/src/transport-manager.ts +10 -10
- package/src/upgrader.ts +20 -19
- package/src/version.ts +1 -1
- package/dist/src/circuit/client.d.ts +0 -81
- package/dist/src/circuit/client.d.ts.map +0 -1
- package/dist/src/circuit/client.js +0 -285
- package/dist/src/circuit/client.js.map +0 -1
- package/dist/src/circuit/hop.d.ts +0 -23
- package/dist/src/circuit/hop.d.ts.map +0 -1
- package/dist/src/circuit/hop.js +0 -167
- package/dist/src/circuit/hop.js.map +0 -1
- package/dist/src/circuit/interfaces.d.ts +0 -27
- package/dist/src/circuit/interfaces.d.ts.map +0 -1
- package/dist/src/circuit/interfaces.js +0 -2
- package/dist/src/circuit/interfaces.js.map +0 -1
- package/dist/src/circuit/listener.d.ts +0 -9
- package/dist/src/circuit/listener.d.ts.map +0 -1
- package/dist/src/circuit/listener.js +0 -62
- package/dist/src/circuit/listener.js.map +0 -1
- package/dist/src/circuit/multicodec.d.ts +0 -3
- package/dist/src/circuit/multicodec.d.ts.map +0 -1
- package/dist/src/circuit/multicodec.js +0 -3
- package/dist/src/circuit/multicodec.js.map +0 -1
- package/dist/src/circuit/relay.d.ts +0 -34
- package/dist/src/circuit/relay.d.ts.map +0 -1
- package/dist/src/circuit/relay.js +0 -61
- package/dist/src/circuit/relay.js.map +0 -1
- package/dist/src/circuit/reservation-store.d.ts.map +0 -1
- package/dist/src/circuit/reservation-store.js +0 -59
- package/dist/src/circuit/reservation-store.js.map +0 -1
- package/dist/src/circuit/reservation-voucher.d.ts.map +0 -1
- package/dist/src/circuit/reservation-voucher.js.map +0 -1
- package/dist/src/circuit/stop.d.ts +0 -19
- package/dist/src/circuit/stop.d.ts.map +0 -1
- package/dist/src/circuit/stop.js +0 -67
- package/dist/src/circuit/stop.js.map +0 -1
- package/dist/src/circuit/transport.d.ts +0 -66
- package/dist/src/circuit/transport.d.ts.map +0 -1
- package/dist/src/circuit/transport.js +0 -238
- package/dist/src/circuit/transport.js.map +0 -1
- package/src/circuit/client.ts +0 -381
- package/src/circuit/hop.ts +0 -210
- package/src/circuit/interfaces.ts +0 -28
- package/src/circuit/listener.ts +0 -83
- package/src/circuit/multicodec.ts +0 -3
- package/src/circuit/relay.ts +0 -87
- package/src/circuit/reservation-store.ts +0 -106
- package/src/circuit/stop.ts +0 -92
- package/src/circuit/transport.ts +0 -313
- /package/dist/src/circuit/{reservation-voucher.d.ts → server/reservation-voucher.d.ts} +0 -0
package/src/circuit/utils.ts
CHANGED
|
@@ -5,140 +5,101 @@ import type { Uint8ArrayList } from 'uint8arraylist'
|
|
|
5
5
|
import type { Limit } from './pb/index.js'
|
|
6
6
|
import { logger } from '@libp2p/logger'
|
|
7
7
|
import type { Stream } from '@libp2p/interface-connection'
|
|
8
|
+
import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT } from './constants.js'
|
|
9
|
+
import { abortableSource } from 'abortable-iterator'
|
|
10
|
+
import anySignal from 'any-signal'
|
|
8
11
|
|
|
9
|
-
const log = logger('libp2p:circuit:
|
|
12
|
+
const log = logger('libp2p:circuit-relay:utils')
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
})
|
|
14
|
+
async function * countStreamBytes (source: Source<Uint8Array | Uint8ArrayList>, limit: { remaining: bigint }): AsyncGenerator<Uint8Array | Uint8ArrayList, void, unknown> {
|
|
15
|
+
for await (const buf of source) {
|
|
16
|
+
const len = BigInt(buf.byteLength)
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if ((limit.remaining - len) < 0) {
|
|
19
|
+
// this is a safe downcast since len is guarantee to be in the range for a number
|
|
20
|
+
const remaining = Number(limit.remaining)
|
|
21
|
+
limit.remaining = 0n
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
doRelay(source, destination)
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const dataLimit = limit.data ?? 0n
|
|
29
|
-
const durationLimit = limit.duration ?? 0
|
|
30
|
-
const src = durationLimitDuplex(dataLimitDuplex(source, dataLimit), durationLimit)
|
|
31
|
-
const dst = durationLimitDuplex(dataLimitDuplex(destination, dataLimit), durationLimit)
|
|
32
|
-
|
|
33
|
-
doRelay(src, dst)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const dataLimitSource = (stream: Stream, limit: bigint): Stream => {
|
|
37
|
-
if (limit === 0n) {
|
|
38
|
-
return stream
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const source = stream.source
|
|
42
|
-
|
|
43
|
-
stream.source = (async function * (): Source<Uint8ArrayList> {
|
|
44
|
-
let total = 0n
|
|
45
|
-
|
|
46
|
-
for await (const buf of source) {
|
|
47
|
-
const len = BigInt(buf.byteLength)
|
|
48
|
-
if (total + len > limit) {
|
|
49
|
-
// this is a safe downcast since len is guarantee to be in the range for a number
|
|
50
|
-
const remaining = Number(limit - total)
|
|
51
|
-
try {
|
|
52
|
-
if (remaining !== 0) {
|
|
53
|
-
yield buf
|
|
54
|
-
}
|
|
55
|
-
} finally {
|
|
56
|
-
stream.abort(new Error('data limit exceeded'))
|
|
23
|
+
try {
|
|
24
|
+
if (remaining !== 0) {
|
|
25
|
+
yield buf.subarray(0, remaining)
|
|
57
26
|
}
|
|
58
|
-
|
|
27
|
+
} catch (err: any) {
|
|
28
|
+
log.error(err)
|
|
59
29
|
}
|
|
60
30
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
total += len
|
|
31
|
+
throw new Error('data limit exceeded')
|
|
64
32
|
}
|
|
65
|
-
})()
|
|
66
33
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const dataLimitSink = (stream: Stream, limit: bigint): Stream => {
|
|
71
|
-
if (limit === 0n) {
|
|
72
|
-
return stream
|
|
34
|
+
limit.remaining -= len
|
|
35
|
+
yield buf
|
|
73
36
|
}
|
|
37
|
+
}
|
|
74
38
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
for await (const buf of source) {
|
|
82
|
-
const len = BigInt(buf.byteLength)
|
|
83
|
-
if (total + len > limit) {
|
|
84
|
-
// this is a safe downcast since len is guarantee to be in the range for a number
|
|
85
|
-
const remaining = Number(limit - total)
|
|
86
|
-
try {
|
|
87
|
-
if (remaining !== 0) {
|
|
88
|
-
yield buf.subarray(0, remaining)
|
|
89
|
-
}
|
|
90
|
-
} finally {
|
|
91
|
-
stream.abort(new Error('data limit exceeded'))
|
|
92
|
-
}
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
total += len
|
|
97
|
-
yield buf
|
|
98
|
-
}
|
|
99
|
-
})())
|
|
39
|
+
const doRelay = (src: Stream, dst: Stream, abortSignal: AbortSignal, limit: Required<Limit>): void => {
|
|
40
|
+
function abortStreams (err: Error): void {
|
|
41
|
+
src.abort(err)
|
|
42
|
+
dst.abort(err)
|
|
43
|
+
clearTimeout(timeout)
|
|
100
44
|
}
|
|
101
45
|
|
|
102
|
-
|
|
103
|
-
|
|
46
|
+
const abortController = new AbortController()
|
|
47
|
+
const signal = anySignal([abortSignal, abortController.signal])
|
|
104
48
|
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
49
|
+
const timeout = setTimeout(() => {
|
|
50
|
+
abortController.abort()
|
|
51
|
+
}, limit.duration)
|
|
108
52
|
|
|
109
|
-
|
|
110
|
-
|
|
53
|
+
let srcDstFinished = false
|
|
54
|
+
let dstSrcFinished = false
|
|
111
55
|
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
return stream
|
|
56
|
+
const dataLimit = {
|
|
57
|
+
remaining: limit.data
|
|
115
58
|
}
|
|
116
59
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
for await (const buf of source) {
|
|
131
|
-
if (timedOut) {
|
|
132
|
-
return
|
|
60
|
+
queueMicrotask(() => {
|
|
61
|
+
void dst.sink(countStreamBytes(abortableSource(src.source, signal, {
|
|
62
|
+
abortMessage: 'duration limit exceeded'
|
|
63
|
+
}), dataLimit))
|
|
64
|
+
.catch(err => {
|
|
65
|
+
log.error('error while relaying streams src -> dst', err)
|
|
66
|
+
abortStreams(err)
|
|
67
|
+
})
|
|
68
|
+
.finally(() => {
|
|
69
|
+
srcDstFinished = true
|
|
70
|
+
|
|
71
|
+
if (dstSrcFinished) {
|
|
72
|
+
clearTimeout(timeout)
|
|
133
73
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
} finally {
|
|
137
|
-
clearTimeout(timeout)
|
|
138
|
-
}
|
|
139
|
-
})()
|
|
74
|
+
})
|
|
75
|
+
})
|
|
140
76
|
|
|
141
|
-
|
|
77
|
+
queueMicrotask(() => {
|
|
78
|
+
void src.sink(countStreamBytes(abortableSource(dst.source, signal, {
|
|
79
|
+
abortMessage: 'duration limit exceeded'
|
|
80
|
+
}), dataLimit))
|
|
81
|
+
.catch(err => {
|
|
82
|
+
log.error('error while relaying streams dst -> src', err)
|
|
83
|
+
abortStreams(err)
|
|
84
|
+
})
|
|
85
|
+
.finally(() => {
|
|
86
|
+
dstSrcFinished = true
|
|
87
|
+
|
|
88
|
+
if (srcDstFinished) {
|
|
89
|
+
clearTimeout(timeout)
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function createLimitedRelay (source: Stream, destination: Stream, abortSignal: AbortSignal, limit?: Limit): void {
|
|
96
|
+
const dataLimit = limit?.data ?? BigInt(DEFAULT_DATA_LIMIT)
|
|
97
|
+
const durationLimit = limit?.duration ?? DEFAULT_DURATION_LIMIT
|
|
98
|
+
|
|
99
|
+
doRelay(source, destination, abortSignal, {
|
|
100
|
+
data: dataLimit,
|
|
101
|
+
duration: durationLimit
|
|
102
|
+
})
|
|
142
103
|
}
|
|
143
104
|
|
|
144
105
|
/**
|
|
@@ -151,7 +112,9 @@ export async function namespaceToCid (namespace: string): Promise<CID> {
|
|
|
151
112
|
return CID.createV0(hash)
|
|
152
113
|
}
|
|
153
114
|
|
|
154
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* returns number of ms between now and expiration time
|
|
117
|
+
*/
|
|
155
118
|
export function getExpiration (expireTime: bigint): number {
|
|
156
119
|
return Number(expireTime) - new Date().getTime()
|
|
157
120
|
}
|
package/src/components.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import errCode from 'err-code'
|
|
2
|
-
import type {
|
|
2
|
+
import type { ConnectionProtector } from '@libp2p/interface-connection'
|
|
3
3
|
import type { ContentRouting } from '@libp2p/interface-content-routing'
|
|
4
4
|
import type { AddressManager } from '@libp2p/interface-address-manager'
|
|
5
5
|
import { isStartable, Startable } from '@libp2p/interfaces/startable'
|
|
@@ -13,6 +13,7 @@ import type { Datastore } from 'interface-datastore'
|
|
|
13
13
|
import type { PubSub } from '@libp2p/interface-pubsub'
|
|
14
14
|
import type { DualDHT } from '@libp2p/interface-dht'
|
|
15
15
|
import type { ConnectionManager, Dialer } from '@libp2p/interface-connection-manager'
|
|
16
|
+
import type { ConnectionGater } from '@libp2p/interface-connection-gater'
|
|
16
17
|
|
|
17
18
|
export interface Components {
|
|
18
19
|
peerId: PeerId
|
|
@@ -90,11 +91,11 @@ export class DefaultComponents implements Components, Startable {
|
|
|
90
91
|
this._dialer = init.dialer
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
isStarted () {
|
|
94
|
+
isStarted (): boolean {
|
|
94
95
|
return this._started
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
async beforeStart () {
|
|
98
|
+
async beforeStart (): Promise<void> {
|
|
98
99
|
await Promise.all(
|
|
99
100
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
100
101
|
if (startable.beforeStart != null) {
|
|
@@ -104,7 +105,7 @@ export class DefaultComponents implements Components, Startable {
|
|
|
104
105
|
)
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
async start () {
|
|
108
|
+
async start (): Promise<void> {
|
|
108
109
|
await Promise.all(
|
|
109
110
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
110
111
|
await startable.start()
|
|
@@ -114,7 +115,7 @@ export class DefaultComponents implements Components, Startable {
|
|
|
114
115
|
this._started = true
|
|
115
116
|
}
|
|
116
117
|
|
|
117
|
-
async afterStart () {
|
|
118
|
+
async afterStart (): Promise<void> {
|
|
118
119
|
await Promise.all(
|
|
119
120
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
120
121
|
if (startable.afterStart != null) {
|
|
@@ -124,7 +125,7 @@ export class DefaultComponents implements Components, Startable {
|
|
|
124
125
|
)
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
async beforeStop () {
|
|
128
|
+
async beforeStop (): Promise<void> {
|
|
128
129
|
await Promise.all(
|
|
129
130
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
130
131
|
if (startable.beforeStop != null) {
|
|
@@ -134,7 +135,7 @@ export class DefaultComponents implements Components, Startable {
|
|
|
134
135
|
)
|
|
135
136
|
}
|
|
136
137
|
|
|
137
|
-
async stop () {
|
|
138
|
+
async stop (): Promise<void> {
|
|
138
139
|
await Promise.all(
|
|
139
140
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
140
141
|
await startable.stop()
|
|
@@ -144,7 +145,7 @@ export class DefaultComponents implements Components, Startable {
|
|
|
144
145
|
this._started = false
|
|
145
146
|
}
|
|
146
147
|
|
|
147
|
-
async afterStop () {
|
|
148
|
+
async afterStop (): Promise<void> {
|
|
148
149
|
await Promise.all(
|
|
149
150
|
Object.values(this).filter(obj => isStartable(obj)).map(async (startable: Startable) => {
|
|
150
151
|
if (startable.afterStop != null) {
|
package/src/config.ts
CHANGED
|
@@ -2,7 +2,6 @@ import mergeOptions from 'merge-options'
|
|
|
2
2
|
import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
|
|
3
3
|
import * as Constants from './constants.js'
|
|
4
4
|
import { AGENT_VERSION } from './identify/consts.js'
|
|
5
|
-
import * as RelayConstants from './circuit/constants.js'
|
|
6
5
|
import { publicAddressesFirst } from '@libp2p/utils/address-sort'
|
|
7
6
|
import { FaultTolerance } from '@libp2p/interface-transport'
|
|
8
7
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
@@ -22,7 +21,6 @@ const DefaultConfig: Partial<Libp2pInit> = {
|
|
|
22
21
|
connectionManager: {
|
|
23
22
|
maxConnections: 300,
|
|
24
23
|
minConnections: 50,
|
|
25
|
-
autoDial: true,
|
|
26
24
|
autoDialInterval: 10000,
|
|
27
25
|
maxParallelDials: Constants.MAX_PARALLEL_DIALS,
|
|
28
26
|
maxDialsPerPeer: Constants.MAX_PER_PEER_DIALS,
|
|
@@ -49,22 +47,6 @@ const DefaultConfig: Partial<Libp2pInit> = {
|
|
|
49
47
|
ttl: 7200,
|
|
50
48
|
keepAlive: true
|
|
51
49
|
},
|
|
52
|
-
relay: {
|
|
53
|
-
enabled: true,
|
|
54
|
-
advertise: {
|
|
55
|
-
bootDelay: RelayConstants.ADVERTISE_BOOT_DELAY,
|
|
56
|
-
enabled: false,
|
|
57
|
-
ttl: RelayConstants.ADVERTISE_TTL
|
|
58
|
-
},
|
|
59
|
-
hop: {
|
|
60
|
-
enabled: false,
|
|
61
|
-
timeout: 30000
|
|
62
|
-
},
|
|
63
|
-
reservationManager: {
|
|
64
|
-
enabled: false,
|
|
65
|
-
maxReservations: 2
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
50
|
identify: {
|
|
69
51
|
protocolPrefix: 'ipfs',
|
|
70
52
|
host: {
|
|
@@ -75,11 +57,18 @@ const DefaultConfig: Partial<Libp2pInit> = {
|
|
|
75
57
|
maxInboundStreams: 1,
|
|
76
58
|
maxOutboundStreams: 1,
|
|
77
59
|
maxPushIncomingStreams: 1,
|
|
78
|
-
maxPushOutgoingStreams: 1
|
|
60
|
+
maxPushOutgoingStreams: 1,
|
|
61
|
+
maxObservedAddresses: 10
|
|
79
62
|
},
|
|
80
63
|
ping: {
|
|
81
64
|
protocolPrefix: 'ipfs',
|
|
82
|
-
|
|
65
|
+
// See https://github.com/libp2p/specs/blob/d4b5fb0152a6bb86cfd9ea/ping/ping.md?plain=1#L38-L43
|
|
66
|
+
// The dialing peer MUST NOT keep more than one outbound stream for the ping protocol per peer.
|
|
67
|
+
// The listening peer SHOULD accept at most two streams per peer since cross-stream behavior is
|
|
68
|
+
// non-linear and stream writes occur asynchronously. The listening peer may perceive the
|
|
69
|
+
// dialing peer closing and opening the wrong streams (for instance, closing stream B and
|
|
70
|
+
// opening stream A even though the dialing peer is opening stream B and closing stream A).
|
|
71
|
+
maxInboundStreams: 2,
|
|
83
72
|
maxOutboundStreams: 1,
|
|
84
73
|
timeout: 10000
|
|
85
74
|
},
|
|
@@ -88,6 +77,14 @@ const DefaultConfig: Partial<Libp2pInit> = {
|
|
|
88
77
|
maxInboundStreams: 1,
|
|
89
78
|
maxOutboundStreams: 1,
|
|
90
79
|
timeout: 10000
|
|
80
|
+
},
|
|
81
|
+
autonat: {
|
|
82
|
+
protocolPrefix: 'libp2p',
|
|
83
|
+
maxInboundStreams: 1,
|
|
84
|
+
maxOutboundStreams: 1,
|
|
85
|
+
timeout: 30000,
|
|
86
|
+
startupDelay: 5000,
|
|
87
|
+
refreshInterval: 60000
|
|
91
88
|
}
|
|
92
89
|
}
|
|
93
90
|
|
package/src/connection/index.ts
CHANGED
|
@@ -87,18 +87,18 @@ export class ConnectionImpl implements Connection {
|
|
|
87
87
|
this._closing = false
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
get [Symbol.toStringTag] () {
|
|
90
|
+
get [Symbol.toStringTag] (): 'Connection' {
|
|
91
91
|
return 'Connection'
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
get [symbol] () {
|
|
94
|
+
get [symbol] (): true {
|
|
95
95
|
return true
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
/**
|
|
99
99
|
* Get all the streams of the muxer
|
|
100
100
|
*/
|
|
101
|
-
get streams () {
|
|
101
|
+
get streams (): Stream[] {
|
|
102
102
|
return this._getStreams()
|
|
103
103
|
}
|
|
104
104
|
|
|
@@ -128,21 +128,21 @@ export class ConnectionImpl implements Connection {
|
|
|
128
128
|
/**
|
|
129
129
|
* Add a stream when it is opened to the registry
|
|
130
130
|
*/
|
|
131
|
-
addStream (stream: Stream) {
|
|
131
|
+
addStream (stream: Stream): void {
|
|
132
132
|
stream.stat.direction = 'inbound'
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
/**
|
|
136
136
|
* Remove stream registry after it is closed
|
|
137
137
|
*/
|
|
138
|
-
removeStream (id: string) {
|
|
138
|
+
removeStream (id: string): void {
|
|
139
139
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
/**
|
|
143
143
|
* Close the connection
|
|
144
144
|
*/
|
|
145
|
-
async close () {
|
|
145
|
+
async close (): Promise<void> {
|
|
146
146
|
if (this.stat.status === CLOSED || this._closing) {
|
|
147
147
|
return
|
|
148
148
|
}
|
|
@@ -151,7 +151,7 @@ export class ConnectionImpl implements Connection {
|
|
|
151
151
|
|
|
152
152
|
// close all streams - this can throw if we're not multiplexed
|
|
153
153
|
try {
|
|
154
|
-
this.streams.forEach(s => s.close())
|
|
154
|
+
this.streams.forEach(s => { s.close() })
|
|
155
155
|
} catch (err) {
|
|
156
156
|
log.error(err)
|
|
157
157
|
}
|
|
@@ -10,11 +10,6 @@ import type { PeerStore } from '@libp2p/interface-peer-store'
|
|
|
10
10
|
const log = logger('libp2p:connection-manager:auto-dialler')
|
|
11
11
|
|
|
12
12
|
export interface AutoDiallerInit {
|
|
13
|
-
/**
|
|
14
|
-
* Should preemptively guarantee connections are above the low watermark
|
|
15
|
-
*/
|
|
16
|
-
enabled?: boolean
|
|
17
|
-
|
|
18
13
|
/**
|
|
19
14
|
* The minimum number of connections to avoid pruning
|
|
20
15
|
*/
|
|
@@ -33,7 +28,6 @@ export interface AutoDiallerComponents {
|
|
|
33
28
|
}
|
|
34
29
|
|
|
35
30
|
const defaultOptions: Partial<AutoDiallerInit> = {
|
|
36
|
-
enabled: true,
|
|
37
31
|
minConnections: 0,
|
|
38
32
|
autoDialInterval: 10000
|
|
39
33
|
}
|
|
@@ -58,19 +52,14 @@ export class AutoDialler implements Startable {
|
|
|
58
52
|
log('options: %j', this.options)
|
|
59
53
|
}
|
|
60
54
|
|
|
61
|
-
isStarted () {
|
|
55
|
+
isStarted (): boolean {
|
|
62
56
|
return this.running
|
|
63
57
|
}
|
|
64
58
|
|
|
65
59
|
/**
|
|
66
60
|
* Starts the auto dialer
|
|
67
61
|
*/
|
|
68
|
-
async start () {
|
|
69
|
-
if (!this.options.enabled) {
|
|
70
|
-
log('not enabled')
|
|
71
|
-
return
|
|
72
|
-
}
|
|
73
|
-
|
|
62
|
+
async start (): Promise<void> {
|
|
74
63
|
this.running = true
|
|
75
64
|
|
|
76
65
|
void this._autoDial().catch(err => {
|
|
@@ -83,12 +72,7 @@ export class AutoDialler implements Startable {
|
|
|
83
72
|
/**
|
|
84
73
|
* Stops the auto dialler
|
|
85
74
|
*/
|
|
86
|
-
async stop () {
|
|
87
|
-
if (!this.options.enabled) {
|
|
88
|
-
log('not enabled')
|
|
89
|
-
return
|
|
90
|
-
}
|
|
91
|
-
|
|
75
|
+
async stop (): Promise<void> {
|
|
92
76
|
this.running = false
|
|
93
77
|
|
|
94
78
|
if (this.autoDialTimeout != null) {
|
|
@@ -98,7 +82,7 @@ export class AutoDialler implements Startable {
|
|
|
98
82
|
log('stopped')
|
|
99
83
|
}
|
|
100
84
|
|
|
101
|
-
async _autoDial () {
|
|
85
|
+
async _autoDial (): Promise<void> {
|
|
102
86
|
if (this.autoDialTimeout != null) {
|
|
103
87
|
this.autoDialTimeout.clear()
|
|
104
88
|
}
|
|
@@ -138,7 +138,7 @@ export class DialRequest {
|
|
|
138
138
|
c.abort()
|
|
139
139
|
}
|
|
140
140
|
})
|
|
141
|
-
tokens.forEach(token => this.dialer.releaseToken(token)) // release tokens back to the dialer
|
|
141
|
+
tokens.forEach(token => { this.dialer.releaseToken(token) }) // release tokens back to the dialer
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
}
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
MAX_PER_PEER_DIALS,
|
|
15
15
|
MAX_ADDRS_TO_DIAL
|
|
16
16
|
} from '../../constants.js'
|
|
17
|
-
import type { Connection
|
|
17
|
+
import type { Connection } from '@libp2p/interface-connection'
|
|
18
18
|
import type { AbortOptions } from '@libp2p/interfaces'
|
|
19
19
|
import type { Startable } from '@libp2p/interfaces/startable'
|
|
20
20
|
import { isPeerId, PeerId } from '@libp2p/interface-peer-id'
|
|
@@ -23,6 +23,7 @@ import type { AddressSorter, PeerStore } from '@libp2p/interface-peer-store'
|
|
|
23
23
|
import type { Metrics } from '@libp2p/interface-metrics'
|
|
24
24
|
import type { Dialer } from '@libp2p/interface-connection-manager'
|
|
25
25
|
import type { TransportManager } from '@libp2p/interface-transport'
|
|
26
|
+
import type { ConnectionGater } from '@libp2p/interface-connection-gater'
|
|
26
27
|
|
|
27
28
|
const log = logger('libp2p:dialer')
|
|
28
29
|
|
|
@@ -116,18 +117,18 @@ export class DefaultDialer implements Startable, Dialer {
|
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
119
|
|
|
119
|
-
isStarted () {
|
|
120
|
+
isStarted (): boolean {
|
|
120
121
|
return this.started
|
|
121
122
|
}
|
|
122
123
|
|
|
123
|
-
async start () {
|
|
124
|
+
async start (): Promise<void> {
|
|
124
125
|
this.started = true
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
/**
|
|
128
129
|
* Clears any pending dials
|
|
129
130
|
*/
|
|
130
|
-
async stop () {
|
|
131
|
+
async stop (): Promise<void> {
|
|
131
132
|
this.started = false
|
|
132
133
|
|
|
133
134
|
for (const dial of this.pendingDials.values()) {
|
|
@@ -163,7 +164,7 @@ export class DefaultDialer implements Startable, Dialer {
|
|
|
163
164
|
await this.components.peerStore.addressBook.add(peerId, [multiaddr])
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
if (await this.components.connectionGater.denyDialPeer(peerId)) {
|
|
167
|
+
if ((await this.components.connectionGater.denyDialPeer?.(peerId)) === true) {
|
|
167
168
|
throw errCode(new Error('The dial request is blocked by gater.allowDialPeer'), codes.ERR_PEER_DIAL_INTERCEPTED)
|
|
168
169
|
}
|
|
169
170
|
}
|
|
@@ -298,9 +299,9 @@ export class DefaultDialer implements Startable, Dialer {
|
|
|
298
299
|
|
|
299
300
|
return (await Promise.all(
|
|
300
301
|
addresses.map(async address => {
|
|
301
|
-
const deny = await this.components.connectionGater.denyDialMultiaddr(peer, address.multiaddr)
|
|
302
|
+
const deny = await this.components.connectionGater.denyDialMultiaddr?.(peer, address.multiaddr)
|
|
302
303
|
|
|
303
|
-
if (deny) {
|
|
304
|
+
if (deny === true) {
|
|
304
305
|
return false
|
|
305
306
|
}
|
|
306
307
|
|
|
@@ -366,14 +367,14 @@ export class DefaultDialer implements Startable, Dialer {
|
|
|
366
367
|
return pendingDial
|
|
367
368
|
}
|
|
368
369
|
|
|
369
|
-
getTokens (num: number) {
|
|
370
|
+
getTokens (num: number): number[] {
|
|
370
371
|
const total = Math.min(num, this.maxDialsPerPeer, this.tokens.length)
|
|
371
372
|
const tokens = this.tokens.splice(0, total)
|
|
372
373
|
log('%d tokens request, returning %d, %d remaining', num, total, this.tokens.length)
|
|
373
374
|
return tokens
|
|
374
375
|
}
|
|
375
376
|
|
|
376
|
-
releaseToken (token: number) {
|
|
377
|
+
releaseToken (token: number): void {
|
|
377
378
|
// Guard against duplicate releases
|
|
378
379
|
if (this.tokens.includes(token)) {
|
|
379
380
|
return
|