libp2p 0.42.2-f6f73a21 → 0.43.0
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/README.md +1 -1
- package/dist/index.min.js +28 -28
- 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 +31 -6
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +37 -7
- 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 -68
- package/dist/src/circuit/index.js.map +1 -1
- package/dist/src/circuit/pb/index.d.ts +83 -43
- package/dist/src/circuit/pb/index.d.ts.map +1 -1
- package/dist/src/circuit/pb/index.js +363 -127
- package/dist/src/circuit/pb/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/server/reservation-store.d.ts +49 -0
- 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 +18 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.js +33 -0
- 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 +7 -0
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +87 -0
- 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 +13 -13
- package/dist/src/components.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +21 -25
- 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 +4 -4
- 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.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.js +13 -6
- 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 +9 -9
- 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 +5 -5
- 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 +9 -9
- 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/content-routing/utils.js +2 -2
- package/dist/src/content-routing/utils.js.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 +2 -2
- 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 +2 -2
- 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/dht/dummy-dht.js +12 -12
- package/dist/src/dht/dummy-dht.js.map +1 -1
- package/dist/src/errors.d.ts +2 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +6 -6
- package/dist/src/fetch/index.js.map +1 -1
- package/dist/src/fetch/pb/proto.d.ts +3 -3
- package/dist/src/fetch/pb/proto.d.ts.map +1 -1
- package/dist/src/fetch/pb/proto.js +4 -3
- package/dist/src/fetch/pb/proto.js.map +1 -1
- package/dist/src/get-peer.js +2 -2
- package/dist/src/get-peer.js.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 +19 -14
- package/dist/src/identify/index.js.map +1 -1
- package/dist/src/identify/pb/message.d.ts +2 -2
- package/dist/src/identify/pb/message.d.ts.map +1 -1
- package/dist/src/identify/pb/message.js +1 -0
- package/dist/src/identify/pb/message.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/insecure/pb/proto.d.ts +3 -3
- package/dist/src/insecure/pb/proto.d.ts.map +1 -1
- package/dist/src/insecure/pb/proto.js +4 -5
- package/dist/src/insecure/pb/proto.js.map +1 -1
- package/dist/src/libp2p.d.ts +6 -2
- package/dist/src/libp2p.d.ts.map +1 -1
- package/dist/src/libp2p.js +24 -26
- package/dist/src/libp2p.js.map +1 -1
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +5 -3
- 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/peer-routing.js +5 -5
- package/dist/src/peer-routing.js.map +1 -1
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +2 -2
- package/dist/src/ping/index.js.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/index.js +3 -3
- package/dist/src/pnet/index.js.map +1 -1
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/pubsub/dummy-pubsub.js +9 -9
- package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +4 -4
- package/dist/src/registrar.js.map +1 -1
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +8 -9
- 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 +38 -33
- package/dist/src/upgrader.js.map +1 -1
- package/dist/typedoc-urls.json +41 -0
- package/package.json +35 -30
- 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 +48 -7
- package/src/circuit/index.ts +17 -129
- package/src/circuit/pb/index.proto +57 -32
- package/src/circuit/pb/index.ts +448 -138
- 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/server/reservation-voucher.ts +51 -0
- 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 +108 -0
- package/src/components.ts +22 -21
- package/src/config.ts +21 -25
- package/src/connection/index.ts +10 -10
- package/src/connection-manager/auto-dialler.ts +4 -20
- package/src/connection-manager/dialer/dial-request.ts +13 -6
- package/src/connection-manager/dialer/index.ts +16 -15
- package/src/connection-manager/index.ts +18 -23
- 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 +18 -16
- package/src/content-routing/utils.ts +5 -5
- package/src/dht/dht-content-routing.ts +5 -4
- package/src/dht/dht-peer-routing.ts +5 -4
- package/src/dht/dummy-dht.ts +13 -13
- package/src/errors.ts +2 -1
- package/src/fetch/index.ts +13 -13
- package/src/fetch/pb/proto.ts +8 -7
- package/src/get-peer.ts +3 -3
- package/src/identify/index.ts +29 -24
- package/src/identify/pb/message.ts +3 -2
- package/src/index.ts +14 -7
- package/src/insecure/index.ts +2 -1
- package/src/insecure/pb/proto.ts +8 -9
- package/src/libp2p.ts +38 -37
- package/src/nat-manager.ts +11 -9
- package/src/peer-record-updater.ts +4 -4
- package/src/peer-routing.ts +9 -9
- package/src/ping/index.ts +6 -6
- package/src/pnet/crypto.ts +3 -3
- package/src/pnet/index.ts +3 -3
- package/src/pnet/key-generator.ts +1 -1
- package/src/pubsub/dummy-pubsub.ts +9 -9
- package/src/registrar.ts +12 -12
- package/src/transport-manager.ts +17 -18
- package/src/upgrader.ts +43 -42
- package/src/version.ts +1 -1
- package/dist/src/circuit/auto-relay.d.ts +0 -46
- package/dist/src/circuit/auto-relay.d.ts.map +0 -1
- package/dist/src/circuit/auto-relay.js +0 -220
- package/dist/src/circuit/auto-relay.js.map +0 -1
- package/dist/src/circuit/circuit/hop.d.ts +0 -42
- package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/hop.js +0 -142
- package/dist/src/circuit/circuit/hop.js.map +0 -1
- package/dist/src/circuit/circuit/stop.d.ts +0 -24
- package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stop.js +0 -51
- package/dist/src/circuit/circuit/stop.js.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.js +0 -59
- package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
- package/dist/src/circuit/circuit/utils.d.ts +0 -7
- package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
- package/dist/src/circuit/circuit/utils.js +0 -43
- package/dist/src/circuit/circuit/utils.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 -2
- package/dist/src/circuit/multicodec.d.ts.map +0 -1
- package/dist/src/circuit/multicodec.js +0 -2
- package/dist/src/circuit/multicodec.js.map +0 -1
- package/dist/src/circuit/transport.d.ts +0 -51
- package/dist/src/circuit/transport.d.ts.map +0 -1
- package/dist/src/circuit/transport.js +0 -223
- package/dist/src/circuit/transport.js.map +0 -1
- package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
- package/src/circuit/README.md +0 -111
- package/src/circuit/auto-relay.ts +0 -292
- package/src/circuit/circuit/hop.ts +0 -220
- package/src/circuit/circuit/stop.ts +0 -83
- package/src/circuit/circuit/stream-handler.ts +0 -87
- package/src/circuit/circuit/utils.ts +0 -44
- package/src/circuit/listener.ts +0 -83
- package/src/circuit/multicodec.ts +0 -2
- package/src/circuit/transport.ts +0 -278
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
|
-
import { CircuitRelay as CircuitPB } from '../pb/index.js'
|
|
3
|
-
import { RELAY_CODEC } from '../multicodec.js'
|
|
4
|
-
import { StreamHandler } from './stream-handler.js'
|
|
5
|
-
import { validateAddrs } from './utils.js'
|
|
6
|
-
import type { Connection } from '@libp2p/interface-connection'
|
|
7
|
-
import type { Duplex } from 'it-stream-types'
|
|
8
|
-
import type { AbortOptions } from '@libp2p/interfaces'
|
|
9
|
-
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
10
|
-
|
|
11
|
-
const log = logger('libp2p:circuit:stop')
|
|
12
|
-
|
|
13
|
-
export interface HandleStopOptions {
|
|
14
|
-
connection: Connection
|
|
15
|
-
request: CircuitPB
|
|
16
|
-
streamHandler: StreamHandler
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Handles incoming STOP requests
|
|
21
|
-
*/
|
|
22
|
-
export function handleStop (options: HandleStopOptions): Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array> | undefined {
|
|
23
|
-
const {
|
|
24
|
-
connection,
|
|
25
|
-
request,
|
|
26
|
-
streamHandler
|
|
27
|
-
} = options
|
|
28
|
-
|
|
29
|
-
// Validate the STOP request has the required input
|
|
30
|
-
try {
|
|
31
|
-
validateAddrs(request, streamHandler)
|
|
32
|
-
} catch (err: any) {
|
|
33
|
-
log.error('invalid stop request via peer %p %o', connection.remotePeer, err)
|
|
34
|
-
return
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// The request is valid
|
|
38
|
-
log('stop request is valid')
|
|
39
|
-
streamHandler.write({
|
|
40
|
-
type: CircuitPB.Type.STATUS,
|
|
41
|
-
code: CircuitPB.Status.SUCCESS
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
return streamHandler.rest()
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface StopOptions extends AbortOptions {
|
|
48
|
-
connection: Connection
|
|
49
|
-
request: CircuitPB
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Creates a STOP request
|
|
54
|
-
*/
|
|
55
|
-
export async function stop (options: StopOptions) {
|
|
56
|
-
const {
|
|
57
|
-
connection,
|
|
58
|
-
request,
|
|
59
|
-
signal
|
|
60
|
-
} = options
|
|
61
|
-
|
|
62
|
-
const stream = await connection.newStream(RELAY_CODEC, {
|
|
63
|
-
signal
|
|
64
|
-
})
|
|
65
|
-
log('starting stop request to %p', connection.remotePeer)
|
|
66
|
-
const streamHandler = new StreamHandler({ stream })
|
|
67
|
-
|
|
68
|
-
streamHandler.write(request)
|
|
69
|
-
const response = await streamHandler.read()
|
|
70
|
-
|
|
71
|
-
if (response == null) {
|
|
72
|
-
streamHandler.close()
|
|
73
|
-
return
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (response.code === CircuitPB.Status.SUCCESS) {
|
|
77
|
-
log('stop request to %p was successful', connection.remotePeer)
|
|
78
|
-
return streamHandler.rest()
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
log('stop request failed with code %d', response.code)
|
|
82
|
-
streamHandler.close()
|
|
83
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
|
-
import * as lp from 'it-length-prefixed'
|
|
3
|
-
import { Handshake, handshake } from 'it-handshake'
|
|
4
|
-
import { CircuitRelay } from '../pb/index.js'
|
|
5
|
-
import type { Stream } from '@libp2p/interface-connection'
|
|
6
|
-
import type { Source } from 'it-stream-types'
|
|
7
|
-
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
8
|
-
|
|
9
|
-
const log = logger('libp2p:circuit:stream-handler')
|
|
10
|
-
|
|
11
|
-
export interface StreamHandlerOptions {
|
|
12
|
-
/**
|
|
13
|
-
* A duplex iterable
|
|
14
|
-
*/
|
|
15
|
-
stream: Stream
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* max bytes length of message
|
|
19
|
-
*/
|
|
20
|
-
maxLength?: number
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class StreamHandler {
|
|
24
|
-
private readonly stream: Stream
|
|
25
|
-
private readonly shake: Handshake<Uint8ArrayList | Uint8Array>
|
|
26
|
-
private readonly decoder: Source<Uint8ArrayList>
|
|
27
|
-
|
|
28
|
-
constructor (options: StreamHandlerOptions) {
|
|
29
|
-
const { stream, maxLength = 4096 } = options
|
|
30
|
-
|
|
31
|
-
this.stream = stream
|
|
32
|
-
this.shake = handshake(this.stream)
|
|
33
|
-
this.decoder = lp.decode.fromReader(this.shake.reader, { maxDataLength: maxLength })
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Read and decode message
|
|
38
|
-
*/
|
|
39
|
-
async read () {
|
|
40
|
-
// @ts-expect-error FIXME is a source, needs to be a generator
|
|
41
|
-
const msg = await this.decoder.next()
|
|
42
|
-
|
|
43
|
-
if (msg.value != null) {
|
|
44
|
-
const value = CircuitRelay.decode(msg.value)
|
|
45
|
-
log('read message type', value.type)
|
|
46
|
-
return value
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
log('read received no value, closing stream')
|
|
50
|
-
// End the stream, we didn't get data
|
|
51
|
-
this.close()
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Encode and write array of buffers
|
|
56
|
-
*/
|
|
57
|
-
write (msg: CircuitRelay) {
|
|
58
|
-
log('write message type %s', msg.type)
|
|
59
|
-
this.shake.write(lp.encode.single(CircuitRelay.encode(msg)))
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Return the handshake rest stream and invalidate handler
|
|
64
|
-
*/
|
|
65
|
-
rest () {
|
|
66
|
-
this.shake.rest()
|
|
67
|
-
return this.shake.stream
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @param {CircuitRelay} msg - An unencoded CircuitRelay protobuf message
|
|
72
|
-
*/
|
|
73
|
-
end (msg: CircuitRelay) {
|
|
74
|
-
this.write(msg)
|
|
75
|
-
this.close()
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Close the stream
|
|
80
|
-
*/
|
|
81
|
-
close () {
|
|
82
|
-
log('closing the stream')
|
|
83
|
-
void this.rest().sink([]).catch(err => {
|
|
84
|
-
log.error(err)
|
|
85
|
-
})
|
|
86
|
-
}
|
|
87
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { multiaddr } from '@multiformats/multiaddr'
|
|
2
|
-
import { CircuitRelay } from '../pb/index.js'
|
|
3
|
-
import type { StreamHandler } from './stream-handler.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Write a response
|
|
7
|
-
*/
|
|
8
|
-
function writeResponse (streamHandler: StreamHandler, status: CircuitRelay.Status) {
|
|
9
|
-
streamHandler.write({
|
|
10
|
-
type: CircuitRelay.Type.STATUS,
|
|
11
|
-
code: status
|
|
12
|
-
})
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Validate incomming HOP/STOP message
|
|
17
|
-
*/
|
|
18
|
-
export function validateAddrs (msg: CircuitRelay, streamHandler: StreamHandler) {
|
|
19
|
-
try {
|
|
20
|
-
if (msg.dstPeer?.addrs != null) {
|
|
21
|
-
msg.dstPeer.addrs.forEach((addr) => {
|
|
22
|
-
return multiaddr(addr)
|
|
23
|
-
})
|
|
24
|
-
}
|
|
25
|
-
} catch (err: any) {
|
|
26
|
-
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
|
27
|
-
? CircuitRelay.Status.HOP_DST_MULTIADDR_INVALID
|
|
28
|
-
: CircuitRelay.Status.STOP_DST_MULTIADDR_INVALID)
|
|
29
|
-
throw err
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
if (msg.srcPeer?.addrs != null) {
|
|
34
|
-
msg.srcPeer.addrs.forEach((addr) => {
|
|
35
|
-
return multiaddr(addr)
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
} catch (err: any) {
|
|
39
|
-
writeResponse(streamHandler, msg.type === CircuitRelay.Type.HOP
|
|
40
|
-
? CircuitRelay.Status.HOP_SRC_MULTIADDR_INVALID
|
|
41
|
-
: CircuitRelay.Status.STOP_SRC_MULTIADDR_INVALID)
|
|
42
|
-
throw err
|
|
43
|
-
}
|
|
44
|
-
}
|
package/src/circuit/listener.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events'
|
|
2
|
-
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
|
|
3
|
-
import type { PeerStore } from '@libp2p/interface-peer-store'
|
|
4
|
-
import type { Listener } from '@libp2p/interface-transport'
|
|
5
|
-
import { peerIdFromString } from '@libp2p/peer-id'
|
|
6
|
-
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
7
|
-
import { multiaddr } from '@multiformats/multiaddr'
|
|
8
|
-
|
|
9
|
-
export interface ListenerOptions {
|
|
10
|
-
peerStore: PeerStore
|
|
11
|
-
connectionManager: ConnectionManager
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function createListener (options: ListenerOptions): Listener {
|
|
15
|
-
const listeningAddrs = new Map()
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Add swarm handler and listen for incoming connections
|
|
19
|
-
*/
|
|
20
|
-
async function listen (addr: Multiaddr): Promise<void> {
|
|
21
|
-
const addrString = addr.toString().split('/p2p-circuit').find(a => a !== '')
|
|
22
|
-
const ma = multiaddr(addrString)
|
|
23
|
-
|
|
24
|
-
const relayPeerStr = ma.getPeerId()
|
|
25
|
-
|
|
26
|
-
if (relayPeerStr == null) {
|
|
27
|
-
throw new Error('Could not determine relay peer from multiaddr')
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const relayPeerId = peerIdFromString(relayPeerStr)
|
|
31
|
-
|
|
32
|
-
await options.peerStore.addressBook.add(relayPeerId, [ma])
|
|
33
|
-
|
|
34
|
-
const relayConn = await options.connectionManager.openConnection(relayPeerId)
|
|
35
|
-
const relayedAddr = relayConn.remoteAddr.encapsulate('/p2p-circuit')
|
|
36
|
-
|
|
37
|
-
listeningAddrs.set(relayConn.remotePeer.toString(), relayedAddr)
|
|
38
|
-
listener.dispatchEvent(new CustomEvent('listening'))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Get fixed up multiaddrs
|
|
43
|
-
*
|
|
44
|
-
* NOTE: This method will grab the peers multiaddrs and expand them such that:
|
|
45
|
-
*
|
|
46
|
-
* a) If it's an existing /p2p-circuit address for a specific relay i.e.
|
|
47
|
-
* `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit` this method will expand the
|
|
48
|
-
* address to `/ip4/0.0.0.0/tcp/0/ipfs/QmRelay/p2p-circuit/ipfs/QmPeer` where
|
|
49
|
-
* `QmPeer` is this peers id
|
|
50
|
-
* b) If it's not a /p2p-circuit address, it will encapsulate the address as a /p2p-circuit
|
|
51
|
-
* addr, such when dialing over a relay with this address, it will create the circuit using
|
|
52
|
-
* the encapsulated transport address. This is useful when for example, a peer should only
|
|
53
|
-
* be dialed over TCP rather than any other transport
|
|
54
|
-
*
|
|
55
|
-
* @returns {Multiaddr[]}
|
|
56
|
-
*/
|
|
57
|
-
function getAddrs () {
|
|
58
|
-
const addrs = []
|
|
59
|
-
for (const addr of listeningAddrs.values()) {
|
|
60
|
-
addrs.push(addr)
|
|
61
|
-
}
|
|
62
|
-
return addrs
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const listener: Listener = Object.assign(new EventEmitter(), {
|
|
66
|
-
close: async () => await Promise.resolve(),
|
|
67
|
-
listen,
|
|
68
|
-
getAddrs
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
// Remove listeningAddrs when a peer disconnects
|
|
72
|
-
options.connectionManager.addEventListener('peer:disconnect', (evt) => {
|
|
73
|
-
const { detail: connection } = evt
|
|
74
|
-
const deleted = listeningAddrs.delete(connection.remotePeer.toString())
|
|
75
|
-
|
|
76
|
-
if (deleted) {
|
|
77
|
-
// Announce listen addresses change
|
|
78
|
-
listener.dispatchEvent(new CustomEvent('close'))
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
return listener
|
|
83
|
-
}
|
package/src/circuit/transport.ts
DELETED
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
|
-
import errCode from 'err-code'
|
|
3
|
-
import * as mafmt from '@multiformats/mafmt'
|
|
4
|
-
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
5
|
-
import { multiaddr } from '@multiformats/multiaddr'
|
|
6
|
-
import { CircuitRelay as CircuitPB } from './pb/index.js'
|
|
7
|
-
import { codes } from '../errors.js'
|
|
8
|
-
import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
|
|
9
|
-
import { RELAY_CODEC } from './multicodec.js'
|
|
10
|
-
import { createListener } from './listener.js'
|
|
11
|
-
import { handleCanHop, handleHop, hop } from './circuit/hop.js'
|
|
12
|
-
import { handleStop } from './circuit/stop.js'
|
|
13
|
-
import { StreamHandler } from './circuit/stream-handler.js'
|
|
14
|
-
import { symbol, Upgrader } from '@libp2p/interface-transport'
|
|
15
|
-
import { peerIdFromString } from '@libp2p/peer-id'
|
|
16
|
-
import type { AbortOptions } from '@libp2p/interfaces'
|
|
17
|
-
import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar'
|
|
18
|
-
import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interface-transport'
|
|
19
|
-
import type { Connection } from '@libp2p/interface-connection'
|
|
20
|
-
import type { RelayConfig } from './index.js'
|
|
21
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
22
|
-
import { TimeoutController } from 'timeout-abort-controller'
|
|
23
|
-
import { setMaxListeners } from 'events'
|
|
24
|
-
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
25
|
-
import type { Duplex } from 'it-stream-types'
|
|
26
|
-
import type { Startable } from '@libp2p/interfaces/startable'
|
|
27
|
-
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
|
|
28
|
-
import type { PeerId } from '@libp2p/interface-peer-id'
|
|
29
|
-
import type { PeerStore } from '@libp2p/interface-peer-store'
|
|
30
|
-
import type { AddressManager } from '@libp2p/interface-address-manager'
|
|
31
|
-
|
|
32
|
-
const log = logger('libp2p:circuit')
|
|
33
|
-
|
|
34
|
-
export interface CircuitComponents {
|
|
35
|
-
peerId: PeerId
|
|
36
|
-
peerStore: PeerStore
|
|
37
|
-
registrar: Registrar
|
|
38
|
-
connectionManager: ConnectionManager
|
|
39
|
-
upgrader: Upgrader
|
|
40
|
-
addressManager: AddressManager
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export class Circuit implements Transport, Startable {
|
|
44
|
-
private handler?: ConnectionHandler
|
|
45
|
-
private readonly components: CircuitComponents
|
|
46
|
-
private readonly _init: RelayConfig
|
|
47
|
-
private _started: boolean
|
|
48
|
-
|
|
49
|
-
constructor (components: CircuitComponents, init: RelayConfig) {
|
|
50
|
-
this._init = init
|
|
51
|
-
this.components = components
|
|
52
|
-
this._started = false
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
isStarted () {
|
|
56
|
-
return this._started
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async start (): Promise<void> {
|
|
60
|
-
if (this._started) {
|
|
61
|
-
return
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
this._started = true
|
|
65
|
-
|
|
66
|
-
await this.components.registrar.handle(RELAY_CODEC, (data) => {
|
|
67
|
-
void this._onProtocol(data).catch(err => {
|
|
68
|
-
log.error(err)
|
|
69
|
-
})
|
|
70
|
-
}, { ...this._init })
|
|
71
|
-
.catch(err => {
|
|
72
|
-
log.error(err)
|
|
73
|
-
})
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async stop () {
|
|
77
|
-
await this.components.registrar.unhandle(RELAY_CODEC)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
hopEnabled () {
|
|
81
|
-
return true
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
hopActive () {
|
|
85
|
-
return true
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
get [symbol] (): true {
|
|
89
|
-
return true
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
get [Symbol.toStringTag] () {
|
|
93
|
-
return 'libp2p/circuit-relay-v1'
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async _onProtocol (data: IncomingStreamData) {
|
|
97
|
-
const { connection, stream } = data
|
|
98
|
-
const controller = new TimeoutController(this._init.hop.timeout)
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
// fails on node < 15.4
|
|
102
|
-
setMaxListeners?.(Infinity, controller.signal)
|
|
103
|
-
} catch {}
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
const source = abortableDuplex(stream, controller.signal)
|
|
107
|
-
const streamHandler = new StreamHandler({
|
|
108
|
-
stream: {
|
|
109
|
-
...stream,
|
|
110
|
-
...source
|
|
111
|
-
}
|
|
112
|
-
})
|
|
113
|
-
const request = await streamHandler.read()
|
|
114
|
-
|
|
115
|
-
if (request == null) {
|
|
116
|
-
log('request was invalid, could not read from stream')
|
|
117
|
-
streamHandler.write({
|
|
118
|
-
type: CircuitPB.Type.STATUS,
|
|
119
|
-
code: CircuitPB.Status.MALFORMED_MESSAGE
|
|
120
|
-
})
|
|
121
|
-
streamHandler.close()
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
let virtualConnection: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array> | undefined
|
|
126
|
-
|
|
127
|
-
switch (request.type) {
|
|
128
|
-
case CircuitPB.Type.CAN_HOP: {
|
|
129
|
-
log('received CAN_HOP request from %p', connection.remotePeer)
|
|
130
|
-
await handleCanHop({ circuit: this, connection, streamHandler })
|
|
131
|
-
break
|
|
132
|
-
}
|
|
133
|
-
case CircuitPB.Type.HOP: {
|
|
134
|
-
log('received HOP request from %p', connection.remotePeer)
|
|
135
|
-
await handleHop({
|
|
136
|
-
connection,
|
|
137
|
-
request,
|
|
138
|
-
streamHandler,
|
|
139
|
-
circuit: this,
|
|
140
|
-
connectionManager: this.components.connectionManager
|
|
141
|
-
})
|
|
142
|
-
break
|
|
143
|
-
}
|
|
144
|
-
case CircuitPB.Type.STOP: {
|
|
145
|
-
log('received STOP request from %p', connection.remotePeer)
|
|
146
|
-
virtualConnection = await handleStop({
|
|
147
|
-
connection,
|
|
148
|
-
request,
|
|
149
|
-
streamHandler
|
|
150
|
-
})
|
|
151
|
-
break
|
|
152
|
-
}
|
|
153
|
-
default: {
|
|
154
|
-
log('Request of type %s not supported', request.type)
|
|
155
|
-
streamHandler.write({
|
|
156
|
-
type: CircuitPB.Type.STATUS,
|
|
157
|
-
code: CircuitPB.Status.MALFORMED_MESSAGE
|
|
158
|
-
})
|
|
159
|
-
streamHandler.close()
|
|
160
|
-
return
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (virtualConnection != null) {
|
|
165
|
-
const remoteAddr = connection.remoteAddr
|
|
166
|
-
.encapsulate('/p2p-circuit')
|
|
167
|
-
.encapsulate(multiaddr(request.dstPeer?.addrs[0]))
|
|
168
|
-
const localAddr = multiaddr(request.srcPeer?.addrs[0])
|
|
169
|
-
const maConn = streamToMaConnection({
|
|
170
|
-
stream: virtualConnection,
|
|
171
|
-
remoteAddr,
|
|
172
|
-
localAddr
|
|
173
|
-
})
|
|
174
|
-
const type = request.type === CircuitPB.Type.HOP ? 'relay' : 'inbound'
|
|
175
|
-
log('new %s connection %s', type, maConn.remoteAddr)
|
|
176
|
-
|
|
177
|
-
const conn = await this.components.upgrader.upgradeInbound(maConn)
|
|
178
|
-
log('%s connection %s upgraded', type, maConn.remoteAddr)
|
|
179
|
-
|
|
180
|
-
if (this.handler != null) {
|
|
181
|
-
this.handler(conn)
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
} finally {
|
|
185
|
-
controller.clear()
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Dial a peer over a relay
|
|
191
|
-
*/
|
|
192
|
-
async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
|
|
193
|
-
// Check the multiaddr to see if it contains a relay and a destination peer
|
|
194
|
-
const addrs = ma.toString().split('/p2p-circuit')
|
|
195
|
-
const relayAddr = multiaddr(addrs[0])
|
|
196
|
-
const destinationAddr = multiaddr(addrs[addrs.length - 1])
|
|
197
|
-
const relayId = relayAddr.getPeerId()
|
|
198
|
-
const destinationId = destinationAddr.getPeerId()
|
|
199
|
-
|
|
200
|
-
if (relayId == null || destinationId == null) {
|
|
201
|
-
const errMsg = 'Circuit relay dial failed as addresses did not have peer id'
|
|
202
|
-
log.error(errMsg)
|
|
203
|
-
throw errCode(new Error(errMsg), codes.ERR_RELAYED_DIAL)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const relayPeer = peerIdFromString(relayId)
|
|
207
|
-
const destinationPeer = peerIdFromString(destinationId)
|
|
208
|
-
|
|
209
|
-
let disconnectOnFailure = false
|
|
210
|
-
const relayConnections = this.components.connectionManager.getConnections(relayPeer)
|
|
211
|
-
let relayConnection = relayConnections[0]
|
|
212
|
-
|
|
213
|
-
if (relayConnection == null) {
|
|
214
|
-
await this.components.peerStore.addressBook.add(relayPeer, [relayAddr])
|
|
215
|
-
relayConnection = await this.components.connectionManager.openConnection(relayPeer, options)
|
|
216
|
-
disconnectOnFailure = true
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
const virtualConnection = await hop({
|
|
221
|
-
...options,
|
|
222
|
-
connection: relayConnection,
|
|
223
|
-
request: {
|
|
224
|
-
type: CircuitPB.Type.HOP,
|
|
225
|
-
srcPeer: {
|
|
226
|
-
id: this.components.peerId.toBytes(),
|
|
227
|
-
addrs: this.components.addressManager.getAddresses().map(addr => addr.bytes)
|
|
228
|
-
},
|
|
229
|
-
dstPeer: {
|
|
230
|
-
id: destinationPeer.toBytes(),
|
|
231
|
-
addrs: [multiaddr(destinationAddr).bytes]
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
const localAddr = relayAddr.encapsulate(`/p2p-circuit/p2p/${this.components.peerId.toString()}`)
|
|
237
|
-
const maConn = streamToMaConnection({
|
|
238
|
-
stream: virtualConnection,
|
|
239
|
-
remoteAddr: ma,
|
|
240
|
-
localAddr
|
|
241
|
-
})
|
|
242
|
-
log('new outbound connection %s', maConn.remoteAddr)
|
|
243
|
-
|
|
244
|
-
return await this.components.upgrader.upgradeOutbound(maConn)
|
|
245
|
-
} catch (err: any) {
|
|
246
|
-
log.error('Circuit relay dial failed', err)
|
|
247
|
-
disconnectOnFailure && await relayConnection.close()
|
|
248
|
-
throw err
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Create a listener
|
|
254
|
-
*/
|
|
255
|
-
createListener (options: CreateListenerOptions): Listener {
|
|
256
|
-
// Called on successful HOP and STOP requests
|
|
257
|
-
this.handler = options.handler
|
|
258
|
-
|
|
259
|
-
return createListener({
|
|
260
|
-
connectionManager: this.components.connectionManager,
|
|
261
|
-
peerStore: this.components.peerStore
|
|
262
|
-
})
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Filter check for all Multiaddrs that this transport can dial on
|
|
267
|
-
*
|
|
268
|
-
* @param {Multiaddr[]} multiaddrs
|
|
269
|
-
* @returns {Multiaddr[]}
|
|
270
|
-
*/
|
|
271
|
-
filter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
272
|
-
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
|
|
273
|
-
|
|
274
|
-
return multiaddrs.filter((ma) => {
|
|
275
|
-
return mafmt.Circuit.matches(ma)
|
|
276
|
-
})
|
|
277
|
-
}
|
|
278
|
-
}
|