@@ -10,6 +10,7 @@ import { createEd25519PeerId } from '@libp2p/peer-id-factory'
10
10
import delay from 'delay'
11
11
import { EventEmitter } from '@libp2p/interfaces/events'
12
12
import type { Libp2pEvents } from '@libp2p/interface-libp2p'
13
+ import { RecordEnvelope , PeerRecord } from '@libp2p/peer-record'
13
14
14
15
const addr1 = multiaddr ( '/ip4/127.0.0.1/tcp/8000' )
15
16
@@ -162,4 +163,101 @@ describe('PersistentPeerStore', () => {
162
163
. that . does . not . have . key ( name )
163
164
} )
164
165
} )
166
+
167
+ describe ( 'peer record' , ( ) => {
168
+ it ( 'consumes a peer record, creating a peer' , async ( ) => {
169
+ const peerRecord = new PeerRecord ( {
170
+ peerId,
171
+ multiaddrs : [
172
+ multiaddr ( '/ip4/127.0.0.1/tcp/1234' )
173
+ ]
174
+ } )
175
+ const signedPeerRecord = await RecordEnvelope . seal ( peerRecord , peerId )
176
+
177
+ await expect ( peerStore . has ( peerId ) ) . to . eventually . be . false ( )
178
+ await peerStore . consumePeerRecord ( signedPeerRecord . marshal ( ) )
179
+ await expect ( peerStore . has ( peerId ) ) . to . eventually . be . true ( )
180
+
181
+ const peer = await peerStore . get ( peerId )
182
+ expect ( peer . addresses . map ( ( { multiaddr, isCertified } ) => ( {
183
+ isCertified,
184
+ multiaddr : multiaddr . toString ( )
185
+ } ) ) ) . to . deep . equal ( [ {
186
+ isCertified : true ,
187
+ multiaddr : '/ip4/127.0.0.1/tcp/1234'
188
+ } ] )
189
+ } )
190
+
191
+ it ( 'overwrites old addresses with those from a peer record' , async ( ) => {
192
+ await peerStore . patch ( peerId , {
193
+ multiaddrs : [
194
+ multiaddr ( '/ip4/127.0.0.1/tcp/1234' )
195
+ ]
196
+ } )
197
+
198
+ const peerRecord = new PeerRecord ( {
199
+ peerId,
200
+ multiaddrs : [
201
+ multiaddr ( '/ip4/127.0.0.1/tcp/4567' )
202
+ ]
203
+ } )
204
+ const signedPeerRecord = await RecordEnvelope . seal ( peerRecord , peerId )
205
+
206
+ await peerStore . consumePeerRecord ( signedPeerRecord . marshal ( ) )
207
+
208
+ await expect ( peerStore . has ( peerId ) ) . to . eventually . be . true ( )
209
+
210
+ const peer = await peerStore . get ( peerId )
211
+ expect ( peer . addresses . map ( ( { multiaddr, isCertified } ) => ( {
212
+ isCertified,
213
+ multiaddr : multiaddr . toString ( )
214
+ } ) ) ) . to . deep . equal ( [ {
215
+ isCertified : true ,
216
+ multiaddr : '/ip4/127.0.0.1/tcp/4567'
217
+ } ] )
218
+ } )
219
+
220
+ it ( 'ignores older peer records' , async ( ) => {
221
+ const oldSignedPeerRecord = await RecordEnvelope . seal ( new PeerRecord ( {
222
+ peerId,
223
+ multiaddrs : [
224
+ multiaddr ( '/ip4/127.0.0.1/tcp/1234' )
225
+ ] ,
226
+ seqNumber : 1n
227
+ } ) , peerId )
228
+
229
+ const newSignedPeerRecord = await RecordEnvelope . seal ( new PeerRecord ( {
230
+ peerId,
231
+ multiaddrs : [
232
+ multiaddr ( '/ip4/127.0.0.1/tcp/4567' )
233
+ ] ,
234
+ seqNumber : 2n
235
+ } ) , peerId )
236
+
237
+ await expect ( peerStore . consumePeerRecord ( newSignedPeerRecord . marshal ( ) ) ) . to . eventually . equal ( true )
238
+ await expect ( peerStore . consumePeerRecord ( oldSignedPeerRecord . marshal ( ) ) ) . to . eventually . equal ( false )
239
+
240
+ const peer = await peerStore . get ( peerId )
241
+ expect ( peer . addresses . map ( ( { multiaddr, isCertified } ) => ( {
242
+ isCertified,
243
+ multiaddr : multiaddr . toString ( )
244
+ } ) ) ) . to . deep . equal ( [ {
245
+ isCertified : true ,
246
+ multiaddr : '/ip4/127.0.0.1/tcp/4567'
247
+ } ] )
248
+ } )
249
+
250
+ it ( 'ignores record for unexpected peer' , async ( ) => {
251
+ const signedPeerRecord = await RecordEnvelope . seal ( new PeerRecord ( {
252
+ peerId,
253
+ multiaddrs : [
254
+ multiaddr ( '/ip4/127.0.0.1/tcp/4567' )
255
+ ]
256
+ } ) , peerId )
257
+
258
+ await expect ( peerStore . has ( peerId ) ) . to . eventually . be . false ( )
259
+ await expect ( peerStore . consumePeerRecord ( signedPeerRecord . marshal ( ) , otherPeerId ) ) . to . eventually . equal ( false )
260
+ await expect ( peerStore . has ( peerId ) ) . to . eventually . be . false ( )
261
+ } )
262
+ } )
165
263
} )
0 commit comments