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/relay.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
|
-
import { codes } from '../errors.js'
|
|
3
|
-
import {
|
|
4
|
-
setDelayedInterval,
|
|
5
|
-
clearDelayedInterval
|
|
6
|
-
// @ts-expect-error set-delayed-interval does not export types
|
|
7
|
-
} from 'set-delayed-interval'
|
|
8
|
-
import { namespaceToCid } from './utils.js'
|
|
9
|
-
import {
|
|
10
|
-
RELAY_RENDEZVOUS_NS
|
|
11
|
-
} from './constants.js'
|
|
12
|
-
import type { AddressSorter } from '@libp2p/interface-peer-store'
|
|
13
|
-
import type { Startable } from '@libp2p/interfaces/startable'
|
|
14
|
-
import type { Components } from '../components.js'
|
|
15
|
-
import type { HopConfig, RelayAdvertiseConfig } from './index.js'
|
|
16
|
-
|
|
17
|
-
const log = logger('libp2p:circuit:relay')
|
|
18
|
-
|
|
19
|
-
export interface RelayInit {
|
|
20
|
-
addressSorter?: AddressSorter
|
|
21
|
-
maxListeners?: number
|
|
22
|
-
hop: HopConfig
|
|
23
|
-
advertise: RelayAdvertiseConfig
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class Relay implements Startable {
|
|
27
|
-
private readonly components: Components
|
|
28
|
-
private readonly init: RelayInit
|
|
29
|
-
private timeout?: any
|
|
30
|
-
private started: boolean
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Creates an instance of Relay
|
|
34
|
-
*/
|
|
35
|
-
constructor (components: Components, init: RelayInit) {
|
|
36
|
-
this.components = components
|
|
37
|
-
this.started = false
|
|
38
|
-
this.init = init
|
|
39
|
-
this._advertiseService = this._advertiseService.bind(this)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
isStarted () {
|
|
43
|
-
return this.started
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Start Relay service
|
|
48
|
-
*/
|
|
49
|
-
async start () {
|
|
50
|
-
// Advertise service if HOP enabled and advertising enabled
|
|
51
|
-
if (this.init.hop.enabled === true && this.init.advertise.enabled === true) {
|
|
52
|
-
this.timeout = setDelayedInterval(
|
|
53
|
-
this._advertiseService, this.init.advertise.ttl, this.init.advertise.bootDelay
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
this.started = true
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Stop Relay service
|
|
62
|
-
*/
|
|
63
|
-
async stop () {
|
|
64
|
-
try {
|
|
65
|
-
clearDelayedInterval(this.timeout)
|
|
66
|
-
} catch (err) { }
|
|
67
|
-
|
|
68
|
-
this.started = false
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Advertise hop relay service in the network.
|
|
73
|
-
*/
|
|
74
|
-
async _advertiseService () {
|
|
75
|
-
try {
|
|
76
|
-
const cid = await namespaceToCid(RELAY_RENDEZVOUS_NS)
|
|
77
|
-
await this.components.contentRouting.provide(cid)
|
|
78
|
-
} catch (err: any) {
|
|
79
|
-
if (err.code === codes.ERR_NO_ROUTERS_AVAILABLE) {
|
|
80
|
-
log.error('a content router, such as a DHT, must be provided in order to advertise the relay service', err)
|
|
81
|
-
await this.stop()
|
|
82
|
-
} else {
|
|
83
|
-
log.error('could not advertise service: ', err)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { Limit, Status } from './pb/index.js'
|
|
2
|
-
import type { ReservationStore as IReservationStore, ReservationStatus, Reservation } from './interfaces.js'
|
|
3
|
-
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
4
|
-
import type { PeerId } from '@libp2p/interface-peer-id'
|
|
5
|
-
import type { Startable } from '@libp2p/interfaces/startable'
|
|
6
|
-
import { PeerMap } from '@libp2p/peer-collections'
|
|
7
|
-
import type { RecursivePartial } from '@libp2p/interfaces'
|
|
8
|
-
import { DEFAULT_DATA_LIMIT, DEFAULT_DURATION_LIMIT } from './constants.js'
|
|
9
|
-
|
|
10
|
-
export interface ReservationStoreInit {
|
|
11
|
-
/*
|
|
12
|
-
* maximum number of reservations allowed, default: 15
|
|
13
|
-
*/
|
|
14
|
-
maxReservations: number
|
|
15
|
-
/*
|
|
16
|
-
* interval after which stale reservations are cleared, default: 300s
|
|
17
|
-
*/
|
|
18
|
-
reservationClearInterval: number
|
|
19
|
-
/*
|
|
20
|
-
* apply default relay limits to a new reservation, default: true
|
|
21
|
-
*/
|
|
22
|
-
applyDefaultLimit: boolean
|
|
23
|
-
/**
|
|
24
|
-
* reservation ttl, default: 2 hours
|
|
25
|
-
*/
|
|
26
|
-
reservationTtl: number
|
|
27
|
-
/**
|
|
28
|
-
* The maximum time a relayed connection can be open for
|
|
29
|
-
*/
|
|
30
|
-
defaultDurationLimit?: number
|
|
31
|
-
/**
|
|
32
|
-
* The maximum amount of data allowed to be transferred over a relayed connection
|
|
33
|
-
*/
|
|
34
|
-
defaultDataLimit?: bigint
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export type ReservationStoreOptions = RecursivePartial<ReservationStoreInit>
|
|
38
|
-
|
|
39
|
-
export class ReservationStore implements IReservationStore, Startable {
|
|
40
|
-
private readonly reservations = new PeerMap<Reservation>()
|
|
41
|
-
private _started = false;
|
|
42
|
-
private interval: any
|
|
43
|
-
private readonly init: ReservationStoreInit
|
|
44
|
-
|
|
45
|
-
constructor (options?: ReservationStoreOptions) {
|
|
46
|
-
this.init = {
|
|
47
|
-
maxReservations: options?.maxReservations ?? 15,
|
|
48
|
-
reservationClearInterval: options?.reservationClearInterval ?? 300 * 1000,
|
|
49
|
-
applyDefaultLimit: options?.applyDefaultLimit !== false,
|
|
50
|
-
reservationTtl: options?.reservationTtl ?? 2 * 60 * 60 * 1000,
|
|
51
|
-
defaultDurationLimit: options?.defaultDurationLimit ?? DEFAULT_DURATION_LIMIT,
|
|
52
|
-
defaultDataLimit: options?.defaultDataLimit ?? DEFAULT_DATA_LIMIT
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
isStarted () {
|
|
57
|
-
return this._started
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
start () {
|
|
61
|
-
if (this._started) {
|
|
62
|
-
return
|
|
63
|
-
}
|
|
64
|
-
this._started = true
|
|
65
|
-
this.interval = setInterval(
|
|
66
|
-
() => {
|
|
67
|
-
const now = (new Date()).getTime()
|
|
68
|
-
this.reservations.forEach((r, k) => {
|
|
69
|
-
if (r.expire.getTime() < now) {
|
|
70
|
-
this.reservations.delete(k)
|
|
71
|
-
}
|
|
72
|
-
})
|
|
73
|
-
},
|
|
74
|
-
this.init.reservationClearInterval
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
stop () {
|
|
79
|
-
clearInterval(this.interval)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
reserve (peer: PeerId, addr: Multiaddr, limit?: Limit): { status: ReservationStatus, expire?: number } {
|
|
83
|
-
if (this.reservations.size >= this.init.maxReservations && !this.reservations.has(peer)) {
|
|
84
|
-
return { status: Status.RESERVATION_REFUSED }
|
|
85
|
-
}
|
|
86
|
-
const expire = new Date(Date.now() + this.init.reservationTtl)
|
|
87
|
-
let checkedLimit: Limit | undefined
|
|
88
|
-
if (this.init.applyDefaultLimit) {
|
|
89
|
-
checkedLimit = limit ?? { data: this.init.defaultDataLimit, duration: this.init.defaultDurationLimit }
|
|
90
|
-
}
|
|
91
|
-
this.reservations.set(peer, { addr, expire, limit: checkedLimit })
|
|
92
|
-
return { status: Status.OK, expire: expire.getTime() }
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
removeReservation (peer: PeerId): void {
|
|
96
|
-
this.reservations.delete(peer)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
hasReservation (dst: PeerId): boolean {
|
|
100
|
-
return this.reservations.has(dst)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
get (peer: PeerId): Reservation | undefined {
|
|
104
|
-
return this.reservations.get(peer)
|
|
105
|
-
}
|
|
106
|
-
}
|
package/src/circuit/stop.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { Status, StopMessage } from './pb/index.js'
|
|
3
|
-
import type { Connection, Stream } from '@libp2p/interface-connection'
|
|
4
|
-
|
|
5
|
-
import { logger } from '@libp2p/logger'
|
|
6
|
-
import { RELAY_V2_STOP_CODEC } from './multicodec.js'
|
|
7
|
-
import { multiaddr } from '@multiformats/multiaddr'
|
|
8
|
-
import { pbStream, ProtobufStream } from 'it-pb-stream'
|
|
9
|
-
|
|
10
|
-
const log = logger('libp2p:circuit:v2:stop')
|
|
11
|
-
|
|
12
|
-
export interface HandleStopOptions {
|
|
13
|
-
connection: Connection
|
|
14
|
-
request: StopMessage
|
|
15
|
-
pbstr: ProtobufStream<Stream>
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const isValidStop = (request: StopMessage): boolean => {
|
|
19
|
-
if (request.peer == null) {
|
|
20
|
-
return false
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
request.peer.addrs.forEach(multiaddr)
|
|
24
|
-
} catch (_err) {
|
|
25
|
-
return false
|
|
26
|
-
}
|
|
27
|
-
return true
|
|
28
|
-
}
|
|
29
|
-
export async function handleStop ({
|
|
30
|
-
connection,
|
|
31
|
-
request,
|
|
32
|
-
pbstr
|
|
33
|
-
}: HandleStopOptions) {
|
|
34
|
-
const stopstr = pbstr.pb(StopMessage)
|
|
35
|
-
log('new circuit relay v2 stop stream from %s', connection.remotePeer)
|
|
36
|
-
// Validate the STOP request has the required input
|
|
37
|
-
if (request.type !== StopMessage.Type.CONNECT) {
|
|
38
|
-
log.error('invalid stop connect request via peer %s', connection.remotePeer)
|
|
39
|
-
stopstr.write({ type: StopMessage.Type.STATUS, status: Status.UNEXPECTED_MESSAGE })
|
|
40
|
-
return
|
|
41
|
-
}
|
|
42
|
-
if (!isValidStop(request)) {
|
|
43
|
-
log.error('invalid stop connect request via peer %s', connection.remotePeer)
|
|
44
|
-
stopstr.write({ type: StopMessage.Type.STATUS, status: Status.MALFORMED_MESSAGE })
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// TODO: go-libp2p marks connection transient if there is limit field present in request.
|
|
49
|
-
// Cannot find any reference to transient connections in js-libp2p
|
|
50
|
-
|
|
51
|
-
stopstr.write({ type: StopMessage.Type.STATUS, status: Status.OK })
|
|
52
|
-
return pbstr.unwrap()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface StopOptions {
|
|
56
|
-
connection: Connection
|
|
57
|
-
request: StopMessage
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Creates a STOP request
|
|
62
|
-
*
|
|
63
|
-
*/
|
|
64
|
-
export async function stop ({
|
|
65
|
-
connection,
|
|
66
|
-
request
|
|
67
|
-
}: StopOptions): Promise<Stream | undefined> {
|
|
68
|
-
const stream = await connection.newStream([RELAY_V2_STOP_CODEC])
|
|
69
|
-
log('starting circuit relay v2 stop request to %s', connection.remotePeer)
|
|
70
|
-
const pbstr = pbStream(stream)
|
|
71
|
-
const stopstr = pbstr.pb(StopMessage)
|
|
72
|
-
stopstr.write(request)
|
|
73
|
-
let response
|
|
74
|
-
try {
|
|
75
|
-
response = await stopstr.read()
|
|
76
|
-
} catch (err) {
|
|
77
|
-
log.error('error parsing stop message response from %s', connection.remotePeer)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (response == null) {
|
|
81
|
-
log.error('could not read response from %s', connection.remotePeer)
|
|
82
|
-
stream.close()
|
|
83
|
-
return
|
|
84
|
-
}
|
|
85
|
-
if (response.status === Status.OK) {
|
|
86
|
-
log('stop request to %s was successful', connection.remotePeer)
|
|
87
|
-
return pbstr.unwrap()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
log('stop request failed with code %d', response.status)
|
|
91
|
-
stream.close()
|
|
92
|
-
}
|
package/src/circuit/transport.ts
DELETED
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
import * as CircuitV2 from './pb/index.js'
|
|
2
|
-
import { ReservationStore } from './reservation-store.js'
|
|
3
|
-
import { logger } from '@libp2p/logger'
|
|
4
|
-
import createError from 'err-code'
|
|
5
|
-
import * as mafmt from '@multiformats/mafmt'
|
|
6
|
-
import { multiaddr } from '@multiformats/multiaddr'
|
|
7
|
-
import { codes } from '../errors.js'
|
|
8
|
-
import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
|
|
9
|
-
import { RELAY_V2_HOP_CODEC, RELAY_V2_STOP_CODEC } from './multicodec.js'
|
|
10
|
-
import { createListener } from './listener.js'
|
|
11
|
-
import { symbol, TransportManager, Upgrader } from '@libp2p/interface-transport'
|
|
12
|
-
import { peerIdFromString } from '@libp2p/peer-id'
|
|
13
|
-
import type { AbortOptions } from '@libp2p/interfaces'
|
|
14
|
-
import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar'
|
|
15
|
-
import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interface-transport'
|
|
16
|
-
import type { Connection, Stream } from '@libp2p/interface-connection'
|
|
17
|
-
import type { RelayConfig } from './index.js'
|
|
18
|
-
import type { PeerId } from '@libp2p/interface-peer-id'
|
|
19
|
-
import { handleHopProtocol } from './hop.js'
|
|
20
|
-
import { handleStop } from './stop.js'
|
|
21
|
-
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
22
|
-
import type { PeerStore } from '@libp2p/interface-peer-store'
|
|
23
|
-
import type { Startable } from '@libp2p/interfaces/dist/src/startable'
|
|
24
|
-
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
|
|
25
|
-
import type { AddressManager } from '@libp2p/interface-address-manager'
|
|
26
|
-
import { pbStream } from 'it-pb-stream'
|
|
27
|
-
import pDefer from 'p-defer'
|
|
28
|
-
|
|
29
|
-
const log = logger('libp2p:circuit')
|
|
30
|
-
|
|
31
|
-
export interface CircuitOptions {
|
|
32
|
-
limit?: number
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface CircuitComponents {
|
|
36
|
-
peerId: PeerId
|
|
37
|
-
peerStore: PeerStore
|
|
38
|
-
registrar: Registrar
|
|
39
|
-
connectionManager: ConnectionManager
|
|
40
|
-
upgrader: Upgrader
|
|
41
|
-
addressManager: AddressManager
|
|
42
|
-
transportManager: TransportManager
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
interface ConnectOptions {
|
|
46
|
-
stream: Stream
|
|
47
|
-
connection: Connection
|
|
48
|
-
destinationPeer: PeerId
|
|
49
|
-
destinationAddr: Multiaddr
|
|
50
|
-
relayAddr: Multiaddr
|
|
51
|
-
ma: Multiaddr
|
|
52
|
-
disconnectOnFailure: boolean
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export class Circuit implements Transport, Startable {
|
|
56
|
-
private handler?: ConnectionHandler
|
|
57
|
-
private readonly components: CircuitComponents
|
|
58
|
-
private readonly reservationStore: ReservationStore
|
|
59
|
-
private readonly _init: RelayConfig
|
|
60
|
-
private _started: boolean
|
|
61
|
-
|
|
62
|
-
constructor (components: CircuitComponents, options: RelayConfig) {
|
|
63
|
-
this.components = components
|
|
64
|
-
this._init = options
|
|
65
|
-
this.reservationStore = new ReservationStore({
|
|
66
|
-
defaultDataLimit: options.hop?.limit?.data,
|
|
67
|
-
defaultDurationLimit: options.hop?.limit?.duration
|
|
68
|
-
})
|
|
69
|
-
this._started = false
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
isStarted () {
|
|
73
|
-
return this._started
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async start (): Promise<void> {
|
|
77
|
-
if (this._started) {
|
|
78
|
-
return
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
this._started = true
|
|
82
|
-
|
|
83
|
-
// only handle hop if enabled
|
|
84
|
-
if (this._init.hop.enabled === true) {
|
|
85
|
-
void this.components.registrar.handle(RELAY_V2_HOP_CODEC, (data) => {
|
|
86
|
-
void this.onHop(data).catch(err => {
|
|
87
|
-
log.error(err)
|
|
88
|
-
})
|
|
89
|
-
})
|
|
90
|
-
.catch(err => {
|
|
91
|
-
log.error(err)
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
void this.components.registrar.handle(RELAY_V2_STOP_CODEC, (data) => {
|
|
96
|
-
void this.onStop(data).catch(err => {
|
|
97
|
-
log.error(err)
|
|
98
|
-
})
|
|
99
|
-
})
|
|
100
|
-
.catch(err => {
|
|
101
|
-
log.error(err)
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
if (this._init.hop.enabled === true) {
|
|
105
|
-
void this.reservationStore.start()
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async stop () {
|
|
110
|
-
if (this._init.hop.enabled === true) {
|
|
111
|
-
this.reservationStore.stop()
|
|
112
|
-
await this.components.registrar.unhandle(RELAY_V2_HOP_CODEC)
|
|
113
|
-
}
|
|
114
|
-
await this.components.registrar.unhandle(RELAY_V2_STOP_CODEC)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
get [symbol] (): true {
|
|
118
|
-
return true
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
get [Symbol.toStringTag] () {
|
|
122
|
-
return 'libp2p/circuit-relay-v2'
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
async onHop ({ connection, stream }: IncomingStreamData) {
|
|
126
|
-
log('received circuit v2 hop protocol stream from %s', connection.remotePeer)
|
|
127
|
-
|
|
128
|
-
const hopTimeoutPromise = pDefer()
|
|
129
|
-
const timeout = setTimeout(() => {
|
|
130
|
-
hopTimeoutPromise.reject('timed out')
|
|
131
|
-
}, this._init.hop.timeout)
|
|
132
|
-
const pbstr = pbStream(stream)
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
const request: CircuitV2.HopMessage = await Promise.race([
|
|
136
|
-
pbstr.pb(CircuitV2.HopMessage).read(),
|
|
137
|
-
hopTimeoutPromise.promise as any
|
|
138
|
-
])
|
|
139
|
-
|
|
140
|
-
if (request?.type == null) {
|
|
141
|
-
throw new Error('request was invalid, could not read from stream')
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
await Promise.race([
|
|
145
|
-
handleHopProtocol({
|
|
146
|
-
connection,
|
|
147
|
-
stream: pbstr,
|
|
148
|
-
connectionManager: this.components.connectionManager,
|
|
149
|
-
relayPeer: this.components.peerId,
|
|
150
|
-
relayAddrs: this.components.addressManager.getListenAddrs(),
|
|
151
|
-
reservationStore: this.reservationStore,
|
|
152
|
-
peerStore: this.components.peerStore,
|
|
153
|
-
request
|
|
154
|
-
}),
|
|
155
|
-
hopTimeoutPromise.promise
|
|
156
|
-
])
|
|
157
|
-
} catch (_err) {
|
|
158
|
-
pbstr.pb(CircuitV2.HopMessage).write({
|
|
159
|
-
type: CircuitV2.HopMessage.Type.STATUS,
|
|
160
|
-
status: CircuitV2.Status.MALFORMED_MESSAGE
|
|
161
|
-
})
|
|
162
|
-
stream.abort(_err as Error)
|
|
163
|
-
} finally {
|
|
164
|
-
clearTimeout(timeout)
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
async onStop ({ connection, stream }: IncomingStreamData) {
|
|
169
|
-
const pbstr = pbStream(stream)
|
|
170
|
-
const request = await pbstr.readPB(CircuitV2.StopMessage)
|
|
171
|
-
log('received circuit v2 stop protocol request from %s', connection.remotePeer)
|
|
172
|
-
if (request?.type === undefined) {
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const mStream = await handleStop({
|
|
177
|
-
connection,
|
|
178
|
-
pbstr,
|
|
179
|
-
request
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
if (mStream != null) {
|
|
183
|
-
const remoteAddr = multiaddr(request.peer?.addrs?.[0])
|
|
184
|
-
const localAddr = this.components.transportManager.getAddrs()[0]
|
|
185
|
-
const maConn = streamToMaConnection({
|
|
186
|
-
stream: mStream as any,
|
|
187
|
-
remoteAddr,
|
|
188
|
-
localAddr
|
|
189
|
-
})
|
|
190
|
-
log('new inbound connection %s', maConn.remoteAddr)
|
|
191
|
-
const conn = await this.components.upgrader.upgradeInbound(maConn)
|
|
192
|
-
log('%s connection %s upgraded', 'inbound', maConn.remoteAddr)
|
|
193
|
-
this.handler?.(conn)
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Dial a peer over a relay
|
|
199
|
-
*/
|
|
200
|
-
async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
|
|
201
|
-
// Check the multiaddr to see if it contains a relay and a destination peer
|
|
202
|
-
const addrs = ma.toString().split('/p2p-circuit')
|
|
203
|
-
const relayAddr = multiaddr(addrs[0])
|
|
204
|
-
const destinationAddr = multiaddr(addrs[addrs.length - 1])
|
|
205
|
-
const relayId = relayAddr.getPeerId()
|
|
206
|
-
const destinationId = destinationAddr.getPeerId()
|
|
207
|
-
|
|
208
|
-
if (relayId == null || destinationId == null) {
|
|
209
|
-
const errMsg = 'Circuit relay dial failed as addresses did not have peer id'
|
|
210
|
-
log.error(errMsg)
|
|
211
|
-
throw createError(new Error(errMsg), codes.ERR_RELAYED_DIAL)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const relayPeer = peerIdFromString(relayId)
|
|
215
|
-
const destinationPeer = peerIdFromString(destinationId)
|
|
216
|
-
|
|
217
|
-
let disconnectOnFailure = false
|
|
218
|
-
const relayConnections = this.components.connectionManager.getConnections(relayPeer)
|
|
219
|
-
let relayConnection = relayConnections[0]
|
|
220
|
-
|
|
221
|
-
if (relayConnection == null) {
|
|
222
|
-
await this.components.peerStore.addressBook.add(relayPeer, [relayAddr])
|
|
223
|
-
relayConnection = await this.components.connectionManager.openConnection(relayPeer, options)
|
|
224
|
-
disconnectOnFailure = true
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
const stream = await relayConnection.newStream([RELAY_V2_HOP_CODEC])
|
|
229
|
-
return await this.connectV2({
|
|
230
|
-
stream,
|
|
231
|
-
connection: relayConnection,
|
|
232
|
-
destinationPeer,
|
|
233
|
-
destinationAddr,
|
|
234
|
-
relayAddr,
|
|
235
|
-
ma,
|
|
236
|
-
disconnectOnFailure
|
|
237
|
-
})
|
|
238
|
-
} catch (err: any) {
|
|
239
|
-
log.error('Circuit relay dial failed', err)
|
|
240
|
-
disconnectOnFailure && await relayConnection.close()
|
|
241
|
-
throw err
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
async connectV2 (
|
|
246
|
-
{
|
|
247
|
-
stream, connection, destinationPeer,
|
|
248
|
-
destinationAddr, relayAddr, ma,
|
|
249
|
-
disconnectOnFailure
|
|
250
|
-
}: ConnectOptions
|
|
251
|
-
) {
|
|
252
|
-
try {
|
|
253
|
-
const pbstr = pbStream(stream)
|
|
254
|
-
const hopstr = pbstr.pb(CircuitV2.HopMessage)
|
|
255
|
-
hopstr.write({
|
|
256
|
-
type: CircuitV2.HopMessage.Type.CONNECT,
|
|
257
|
-
peer: {
|
|
258
|
-
id: destinationPeer.toBytes(),
|
|
259
|
-
addrs: [multiaddr(destinationAddr).bytes]
|
|
260
|
-
}
|
|
261
|
-
})
|
|
262
|
-
|
|
263
|
-
const status = await hopstr.read()
|
|
264
|
-
if (status.status !== CircuitV2.Status.OK) {
|
|
265
|
-
throw createError(new Error(`failed to connect via relay with status ${status?.status?.toString() ?? 'undefined'}`), codes.ERR_HOP_REQUEST_FAILED)
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// TODO: do something with limit and transient connection
|
|
269
|
-
|
|
270
|
-
let localAddr = relayAddr
|
|
271
|
-
localAddr = localAddr.encapsulate(`/p2p-circuit/p2p/${this.components.peerId.toString()}`)
|
|
272
|
-
const maConn = streamToMaConnection({
|
|
273
|
-
stream: pbstr.unwrap(),
|
|
274
|
-
remoteAddr: ma,
|
|
275
|
-
localAddr
|
|
276
|
-
})
|
|
277
|
-
log('new outbound connection %s', maConn.remoteAddr)
|
|
278
|
-
const conn = await this.components.upgrader.upgradeOutbound(maConn)
|
|
279
|
-
return conn
|
|
280
|
-
} catch (err) {
|
|
281
|
-
log.error('Circuit relay dial failed', err)
|
|
282
|
-
disconnectOnFailure && await connection.close()
|
|
283
|
-
throw err
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Create a listener
|
|
289
|
-
*/
|
|
290
|
-
createListener (options: CreateListenerOptions): Listener {
|
|
291
|
-
// Called on successful HOP and STOP requests
|
|
292
|
-
this.handler = options.handler
|
|
293
|
-
|
|
294
|
-
return createListener({
|
|
295
|
-
connectionManager: this.components.connectionManager,
|
|
296
|
-
peerStore: this.components.peerStore
|
|
297
|
-
})
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Filter check for all Multiaddrs that this transport can dial on
|
|
302
|
-
*
|
|
303
|
-
* @param {Multiaddr[]} multiaddrs
|
|
304
|
-
* @returns {Multiaddr[]}
|
|
305
|
-
*/
|
|
306
|
-
filter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
307
|
-
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
|
|
308
|
-
|
|
309
|
-
return multiaddrs.filter((ma) => {
|
|
310
|
-
return mafmt.Circuit.matches(ma)
|
|
311
|
-
})
|
|
312
|
-
}
|
|
313
|
-
}
|
|
File without changes
|