1
1
import { logger } from '@libp2p/logger'
2
2
import { CustomEvent , EventEmitter } from '@libp2p/interfaces/events'
3
3
import type { Startable } from '@libp2p/interfaces/startable'
4
- import { Multiaddr } from '@multiformats/multiaddr'
4
+ import { multiaddr } from '@multiformats/multiaddr'
5
5
import { Peer as PBPeer } from './peer.js'
6
6
import { peerIdFromKeys } from '@libp2p/peer-id'
7
7
import type { PeerDiscovery , PeerDiscoveryEvents } from '@libp2p/interface-peer-discovery'
8
- import { Components , Initializable } from '@libp2p/components'
9
- import type { Message } from '@libp2p/interface-pubsub'
8
+ import type { Message , PubSub } from '@libp2p/interface-pubsub'
10
9
import type { PeerInfo } from '@libp2p/interface-peer-info'
11
10
import { symbol } from '@libp2p/interface-peer-discovery'
11
+ import type { AddressManager } from '@libp2p/interface-address-manager'
12
+ import type { PeerId } from '@libp2p/interface-peer-id'
12
13
13
14
const log = logger ( 'libp2p:discovery:pubsub' )
14
15
export const TOPIC = '_peer-discovery._p2p._pubsub'
@@ -30,17 +31,23 @@ export interface PubsubPeerDiscoveryInit {
30
31
listenOnly ?: boolean
31
32
}
32
33
34
+ export interface PubSubPeerDiscoveryComponents {
35
+ peerId : PeerId
36
+ pubsub : PubSub
37
+ addressManager : AddressManager
38
+ }
39
+
33
40
/**
34
41
* A Peer Discovery Service that leverages libp2p Pubsub to find peers.
35
42
*/
36
- export class PubSubPeerDiscovery extends EventEmitter < PeerDiscoveryEvents > implements PeerDiscovery , Startable , Initializable {
43
+ export class PubSubPeerDiscovery extends EventEmitter < PeerDiscoveryEvents > implements PeerDiscovery , Startable {
37
44
private readonly interval : number
38
45
private readonly listenOnly : boolean
39
46
private readonly topics : string [ ]
40
47
private intervalId ?: ReturnType < typeof setInterval >
41
- private components : Components = new Components ( )
48
+ private readonly components : PubSubPeerDiscoveryComponents
42
49
43
- constructor ( init : PubsubPeerDiscoveryInit = { } ) {
50
+ constructor ( components : PubSubPeerDiscoveryComponents , init : PubsubPeerDiscoveryInit = { } ) {
44
51
super ( )
45
52
46
53
const {
@@ -49,6 +56,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
49
56
listenOnly
50
57
} = init
51
58
59
+ this . components = components
52
60
this . interval = interval ?? 10000
53
61
this . listenOnly = listenOnly ?? false
54
62
@@ -70,10 +78,6 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
70
78
return '@libp2p/pubsub-peer-discovery'
71
79
}
72
80
73
- init ( components : Components ) {
74
- this . components = components
75
- }
76
-
77
81
isStarted ( ) {
78
82
return this . intervalId != null
79
83
}
@@ -91,7 +95,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
91
95
return
92
96
}
93
97
94
- const pubsub = this . components . getPubSub ( )
98
+ const pubsub = this . components . pubsub
95
99
96
100
if ( pubsub == null ) {
97
101
throw new Error ( 'PubSub not configured' )
@@ -118,7 +122,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
118
122
}
119
123
120
124
beforeStop ( ) {
121
- const pubsub = this . components . getPubSub ( )
125
+ const pubsub = this . components . pubsub
122
126
123
127
if ( pubsub == null ) {
124
128
throw new Error ( 'PubSub not configured' )
@@ -144,19 +148,19 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
144
148
* Performs a broadcast via Pubsub publish
145
149
*/
146
150
_broadcast ( ) {
147
- const peerId = this . components . getPeerId ( )
151
+ const peerId = this . components . peerId
148
152
149
153
if ( peerId . publicKey == null ) {
150
154
throw new Error ( 'PeerId was missing public key' )
151
155
}
152
156
153
157
const peer = {
154
158
publicKey : peerId . publicKey ,
155
- addrs : this . components . getAddressManager ( ) . getAddresses ( ) . map ( ma => ma . bytes )
159
+ addrs : this . components . addressManager . getAddresses ( ) . map ( ma => ma . bytes )
156
160
}
157
161
158
162
const encodedPeer = PBPeer . encode ( peer )
159
- const pubsub = this . components . getPubSub ( )
163
+ const pubsub = this . components . pubsub
160
164
161
165
if ( pubsub == null ) {
162
166
throw new Error ( 'PubSub not configured' )
@@ -186,7 +190,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
186
190
187
191
void peerIdFromKeys ( peer . publicKey ) . then ( peerId => {
188
192
// Ignore if we received our own response
189
- if ( peerId . equals ( this . components . getPeerId ( ) ) ) {
193
+ if ( peerId . equals ( this . components . peerId ) ) {
190
194
return
191
195
}
192
196
@@ -195,7 +199,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
195
199
this . dispatchEvent ( new CustomEvent < PeerInfo > ( 'peer' , {
196
200
detail : {
197
201
id : peerId ,
198
- multiaddrs : peer . addrs . map ( b => new Multiaddr ( b ) ) ,
202
+ multiaddrs : peer . addrs . map ( b => multiaddr ( b ) ) ,
199
203
protocols : [ ]
200
204
}
201
205
} ) )
@@ -204,3 +208,7 @@ export class PubSubPeerDiscovery extends EventEmitter<PeerDiscoveryEvents> imple
204
208
} )
205
209
}
206
210
}
211
+
212
+ export function pubsubPeerDiscovery ( init : PubsubPeerDiscoveryInit = { } ) : ( components : PubSubPeerDiscoveryComponents ) => PeerDiscovery {
213
+ return ( components : PubSubPeerDiscoveryComponents ) => new PubSubPeerDiscovery ( components , init )
214
+ }
0 commit comments