chore: auto relay multiaddr update push

This commit is contained in:
Vasco Santos 2020-09-10 11:53:33 +02:00 committed by Vasco Santos
parent caf66ea143
commit 4d1fcdb3d2
5 changed files with 35 additions and 16 deletions

View File

@ -143,8 +143,8 @@ class AutoRelay {
try { try {
await this._transportManager.listen([multiaddr(listenAddr)]) await this._transportManager.listen([multiaddr(listenAddr)])
// TODO: push announce multiaddrs update // Announce multiaddrs update on listen success
// await this._libp2p.identifyService.pushToPeerStore() await this._libp2p.identifyService.pushToPeerStore()
} catch (err) { } catch (err) {
log.error(err) log.error(err)
this._listenRelays.delete(id) this._listenRelays.delete(id)

View File

@ -20,8 +20,8 @@ module.exports = (libp2p) => {
const deleted = listeningAddrs.delete(connection.remotePeer.toB58String()) const deleted = listeningAddrs.delete(connection.remotePeer.toB58String())
if (deleted) { if (deleted) {
// TODO push announce multiaddrs update // Announce multiaddrs update on listen success
// libp2p.identifyService.pushToPeerStore() libp2p.identifyService.pushToPeerStore()
} }
}) })

View File

@ -329,13 +329,30 @@ class IdentifyService {
* @returns {Uint8Array} * @returns {Uint8Array}
*/ */
async _getSelfPeerRecord () { async _getSelfPeerRecord () {
const selfSignedPeerRecord = this.peerStore.addressBook.getRawEnvelope(this.peerId) // Update self peer record if needed
await this._createOrUpdateSelfPeerRecord()
// TODO: support invalidation when dynamic multiaddrs are supported return this.peerStore.addressBook.getRawEnvelope(this.peerId)
if (selfSignedPeerRecord) { }
return selfSignedPeerRecord
/**
* Creates or updates the self peer record if it exists and is outdated.
* @return {Promise<void>}
*/
async _createOrUpdateSelfPeerRecord () {
const selfPeerRecordEnvelope = await this.peerStore.addressBook.getPeerRecord(this.peerId)
if (selfPeerRecordEnvelope) {
const peerRecord = PeerRecord.createFromProtobuf(selfPeerRecordEnvelope.payload)
const mIntersection = peerRecord.multiaddrs.filter((m) => this._libp2p.multiaddrs.some((newM) => m.equals(newM)))
if (mIntersection.length === this._libp2p.multiaddrs.length) {
// Same multiaddrs as already existing in the record, no need to proceed
return
}
} }
// Create / Update Peer record
try { try {
const peerRecord = new PeerRecord({ const peerRecord = new PeerRecord({
peerId: this.peerId, peerId: this.peerId,
@ -343,12 +360,9 @@ class IdentifyService {
}) })
const envelope = await Envelope.seal(peerRecord, this.peerId) const envelope = await Envelope.seal(peerRecord, this.peerId)
this.peerStore.addressBook.consumePeerRecord(envelope) this.peerStore.addressBook.consumePeerRecord(envelope)
return this.peerStore.addressBook.getRawEnvelope(this.peerId)
} catch (err) { } catch (err) {
log.error('failed to get self peer record') log.error('failed to create self peer record')
} }
return null
} }
} }

View File

@ -259,6 +259,7 @@ class Libp2p extends EventEmitter {
await this.peerStore.stop() await this.peerStore.stop()
await this.connectionManager.stop() await this.connectionManager.stop()
ping.unmount(this)
await Promise.all([ await Promise.all([
this.pubsub && this.pubsub.stop(), this.pubsub && this.pubsub.stop(),
this._dht && this._dht.stop(), this._dht && this._dht.stop(),
@ -267,7 +268,6 @@ class Libp2p extends EventEmitter {
await this.transportManager.close() await this.transportManager.close()
ping.unmount(this)
this.dialer.destroy() this.dialer.destroy()
} catch (err) { } catch (err) {
if (err) { if (err) {

View File

@ -259,6 +259,9 @@ describe('auto-relay', () => {
it('should not listen on a relayed address if peer disconnects', async () => { it('should not listen on a relayed address if peer disconnects', async () => {
const originalMultiaddrs1Length = relayLibp2p1.multiaddrs.length const originalMultiaddrs1Length = relayLibp2p1.multiaddrs.length
// Spy if identify push is fired on adding/removing listen addr
sinon.spy(relayLibp2p1.identifyService, 'pushToPeerStore')
// Discover one relay and connect // Discover one relay and connect
relayLibp2p1.peerStore.addressBook.add(relayLibp2p2.peerId, relayLibp2p2.multiaddrs) relayLibp2p1.peerStore.addressBook.add(relayLibp2p2.peerId, relayLibp2p2.multiaddrs)
await relayLibp2p1.dial(relayLibp2p2.peerId) await relayLibp2p1.dial(relayLibp2p2.peerId)
@ -268,8 +271,8 @@ describe('auto-relay', () => {
expect(autoRelay1._listenRelays.size).to.equal(1) expect(autoRelay1._listenRelays.size).to.equal(1)
expect(relayLibp2p1.multiaddrs[originalMultiaddrs1Length].getPeerId()).to.eql(relayLibp2p2.peerId.toB58String()) expect(relayLibp2p1.multiaddrs[originalMultiaddrs1Length].getPeerId()).to.eql(relayLibp2p2.peerId.toB58String())
// Spy if identify push is fired // Identify push for adding listen relay multiaddr
sinon.spy(relayLibp2p1.identifyService, 'pushToPeerStore') expect(relayLibp2p1.identifyService.pushToPeerStore.callCount).to.equal(1)
// Disconnect from peer used for relay // Disconnect from peer used for relay
await relayLibp2p1.hangUp(relayLibp2p2.peerId) await relayLibp2p1.hangUp(relayLibp2p2.peerId)
@ -277,7 +280,9 @@ describe('auto-relay', () => {
// Wait for removed listening on the relay // Wait for removed listening on the relay
await pWaitFor(() => relayLibp2p1.multiaddrs.length === originalMultiaddrs1Length) await pWaitFor(() => relayLibp2p1.multiaddrs.length === originalMultiaddrs1Length)
expect(autoRelay1._listenRelays.size).to.equal(0) expect(autoRelay1._listenRelays.size).to.equal(0)
// TODO: identify-push expect(relayLibp2p1.identifyService.pushToPeerStore.callCount).to.equal(1)
// Identify push for removing listen relay multiaddr
expect(relayLibp2p1.identifyService.pushToPeerStore.callCount).to.equal(2)
}) })
it('should try to listen on other connected peers relayed address if one used relay disconnects', async () => { it('should try to listen on other connected peers relayed address if one used relay disconnects', async () => {