mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-06-26 07:21:36 +00:00
chore: create signed peer record on new listen addresses in transport manager
This commit is contained in:
committed by
Vasco Santos
parent
7b93ece7f2
commit
43eda43f06
@ -21,7 +21,7 @@ module.exports = (libp2p) => {
|
||||
|
||||
if (deleted) {
|
||||
// Announce listen addresses change
|
||||
listener.emit('listening')
|
||||
listener.emit('close')
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -64,11 +64,6 @@ class IdentifyService {
|
||||
*/
|
||||
this.connectionManager = libp2p.connectionManager
|
||||
|
||||
/**
|
||||
* @property {TransportManager}
|
||||
*/
|
||||
this.transportManager = libp2p.transportManager
|
||||
|
||||
/**
|
||||
* @property {PeerId}
|
||||
*/
|
||||
@ -96,10 +91,11 @@ class IdentifyService {
|
||||
this.identify(connection).catch(log.error)
|
||||
})
|
||||
|
||||
// When new addresses are used for listening, update self peer record
|
||||
this.transportManager.on('listening', async () => {
|
||||
await this._createSelfPeerRecord()
|
||||
this.pushToPeerStore()
|
||||
// When self multiaddrs change, trigger identify-push
|
||||
this.peerStore.on('change:multiaddrs', ({ peerId }) => {
|
||||
if (peerId.toString() === this.peerId.toString()) {
|
||||
this.pushToPeerStore()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -110,7 +106,7 @@ class IdentifyService {
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async push (connections) {
|
||||
const signedPeerRecord = await this._getSelfPeerRecord()
|
||||
const signedPeerRecord = await this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||
const listenAddrs = this._libp2p.multiaddrs.map((ma) => ma.bytes)
|
||||
const protocols = Array.from(this._protocols.keys())
|
||||
|
||||
@ -260,7 +256,7 @@ class IdentifyService {
|
||||
publicKey = this.peerId.pubKey.bytes
|
||||
}
|
||||
|
||||
const signedPeerRecord = await this._getSelfPeerRecord()
|
||||
const signedPeerRecord = await this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||
|
||||
const message = Message.encode({
|
||||
protocolVersion: this._host.protocolVersion,
|
||||
@ -330,40 +326,6 @@ class IdentifyService {
|
||||
// Update the protocols
|
||||
this.peerStore.protoBook.set(id, message.protocols)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get self signed peer record raw envelope.
|
||||
* @return {Promise<Uint8Array>}
|
||||
*/
|
||||
_getSelfPeerRecord () {
|
||||
const selfSignedPeerRecord = this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||
|
||||
if (selfSignedPeerRecord) {
|
||||
return selfSignedPeerRecord
|
||||
}
|
||||
|
||||
return this._createSelfPeerRecord()
|
||||
}
|
||||
|
||||
/**
|
||||
* Create self signed peer record raw envelope.
|
||||
* @return {Uint8Array}
|
||||
*/
|
||||
async _createSelfPeerRecord () {
|
||||
try {
|
||||
const peerRecord = new PeerRecord({
|
||||
peerId: this.peerId,
|
||||
multiaddrs: this._libp2p.multiaddrs
|
||||
})
|
||||
const envelope = await Envelope.seal(peerRecord, this.peerId)
|
||||
this.peerStore.addressBook.consumePeerRecord(envelope)
|
||||
|
||||
return this.peerStore.addressBook.getRawEnvelope(this.peerId)
|
||||
} catch (err) {
|
||||
log.error('failed to get self peer record')
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.IdentifyService = IdentifyService
|
||||
|
@ -1,6 +1,5 @@
|
||||
'use strict'
|
||||
|
||||
const { EventEmitter } = require('events')
|
||||
const pSettle = require('p-settle')
|
||||
const { codes } = require('./errors')
|
||||
const errCode = require('err-code')
|
||||
@ -8,11 +7,10 @@ const debug = require('debug')
|
||||
const log = debug('libp2p:transports')
|
||||
log.error = debug('libp2p:transports:error')
|
||||
|
||||
/**
|
||||
* Responsible for managing the transports and their listeners.
|
||||
* @fires TransportManager#listening Emitted when listening addresses change.
|
||||
*/
|
||||
class TransportManager extends EventEmitter {
|
||||
const Envelope = require('./record/envelope')
|
||||
const PeerRecord = require('./record/peer-record')
|
||||
|
||||
class TransportManager {
|
||||
/**
|
||||
* @class
|
||||
* @param {object} options
|
||||
@ -21,8 +19,6 @@ class TransportManager extends EventEmitter {
|
||||
* @param {boolean} [options.faultTolerance = FAULT_TOLERANCE.FATAL_ALL] - Address listen error tolerance.
|
||||
*/
|
||||
constructor ({ libp2p, upgrader, faultTolerance = FAULT_TOLERANCE.FATAL_ALL }) {
|
||||
super()
|
||||
|
||||
this.libp2p = libp2p
|
||||
this.upgrader = upgrader
|
||||
this._transports = new Map()
|
||||
@ -73,6 +69,7 @@ class TransportManager extends EventEmitter {
|
||||
while (listeners.length) {
|
||||
const listener = listeners.pop()
|
||||
listener.removeAllListeners('listening')
|
||||
listener.removeAllListeners('close')
|
||||
tasks.push(listener.close())
|
||||
}
|
||||
}
|
||||
@ -166,8 +163,9 @@ class TransportManager extends EventEmitter {
|
||||
const listener = transport.createListener(this._listenerOptions.get(key), this.onConnection)
|
||||
this._listeners.get(key).push(listener)
|
||||
|
||||
// Track listen events
|
||||
listener.on('listening', () => this.emit('listening'))
|
||||
// Track listen/close events
|
||||
listener.on('listening', () => this._createSelfPeerRecord())
|
||||
listener.on('close', () => this._createSelfPeerRecord())
|
||||
|
||||
// We need to attempt to listen on everything
|
||||
tasks.push(listener.listen(addr))
|
||||
@ -214,6 +212,7 @@ class TransportManager extends EventEmitter {
|
||||
// Close any running listeners
|
||||
for (const listener of this._listeners.get(key)) {
|
||||
listener.removeAllListeners('listening')
|
||||
listener.removeAllListeners('close')
|
||||
await listener.close()
|
||||
}
|
||||
}
|
||||
@ -236,6 +235,26 @@ class TransportManager extends EventEmitter {
|
||||
|
||||
await Promise.all(tasks)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create self signed peer record raw envelope.
|
||||
* @return {Uint8Array}
|
||||
*/
|
||||
async _createSelfPeerRecord () {
|
||||
try {
|
||||
const peerRecord = new PeerRecord({
|
||||
peerId: this.libp2p.peerId,
|
||||
multiaddrs: this.libp2p.multiaddrs
|
||||
})
|
||||
const envelope = await Envelope.seal(peerRecord, this.libp2p.peerId)
|
||||
this.libp2p.peerStore.addressBook.consumePeerRecord(envelope)
|
||||
|
||||
return this.libp2p.peerStore.addressBook.getRawEnvelope(this.libp2p.peerId)
|
||||
} catch (err) {
|
||||
log.error('failed to get self peer record')
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user