diff --git a/src/circuit/auto-relay.js b/src/circuit/auto-relay.js index 5617e94e..71e95131 100644 --- a/src/circuit/auto-relay.js +++ b/src/circuit/auto-relay.js @@ -143,8 +143,8 @@ class AutoRelay { try { await this._transportManager.listen([multiaddr(listenAddr)]) - // TODO: push announce multiaddrs update - // await this._libp2p.identifyService.pushToPeerStore() + // Announce multiaddrs update on listen success + await this._libp2p.identifyService.pushToPeerStore() } catch (err) { log.error(err) this._listenRelays.delete(id) diff --git a/src/circuit/listener.js b/src/circuit/listener.js index f8caff0b..59ca0cec 100644 --- a/src/circuit/listener.js +++ b/src/circuit/listener.js @@ -20,8 +20,8 @@ module.exports = (libp2p) => { const deleted = listeningAddrs.delete(connection.remotePeer.toB58String()) if (deleted) { - // TODO push announce multiaddrs update - // libp2p.identifyService.pushToPeerStore() + // Announce multiaddrs update on listen success + libp2p.identifyService.pushToPeerStore() } }) diff --git a/src/identify/index.js b/src/identify/index.js index d24ce0bf..3e3b01ab 100644 --- a/src/identify/index.js +++ b/src/identify/index.js @@ -329,13 +329,30 @@ class IdentifyService { * @returns {Uint8Array} */ 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 - if (selfSignedPeerRecord) { - return selfSignedPeerRecord + return this.peerStore.addressBook.getRawEnvelope(this.peerId) + } + + /** + * Creates or updates the self peer record if it exists and is outdated. + * @return {Promise} + */ + 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 { const peerRecord = new PeerRecord({ peerId: this.peerId, @@ -343,12 +360,9 @@ class IdentifyService { }) 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') + log.error('failed to create self peer record') } - return null } } diff --git a/src/index.js b/src/index.js index c6741709..8b89bddb 100644 --- a/src/index.js +++ b/src/index.js @@ -259,6 +259,7 @@ class Libp2p extends EventEmitter { await this.peerStore.stop() await this.connectionManager.stop() + ping.unmount(this) await Promise.all([ this.pubsub && this.pubsub.stop(), this._dht && this._dht.stop(), @@ -267,7 +268,6 @@ class Libp2p extends EventEmitter { await this.transportManager.close() - ping.unmount(this) this.dialer.destroy() } catch (err) { if (err) { diff --git a/test/relay/auto-relay.node.js b/test/relay/auto-relay.node.js index 2a4ba20d..96f94cd7 100644 --- a/test/relay/auto-relay.node.js +++ b/test/relay/auto-relay.node.js @@ -259,6 +259,9 @@ describe('auto-relay', () => { it('should not listen on a relayed address if peer disconnects', async () => { 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 relayLibp2p1.peerStore.addressBook.add(relayLibp2p2.peerId, relayLibp2p2.multiaddrs) await relayLibp2p1.dial(relayLibp2p2.peerId) @@ -268,8 +271,8 @@ describe('auto-relay', () => { expect(autoRelay1._listenRelays.size).to.equal(1) expect(relayLibp2p1.multiaddrs[originalMultiaddrs1Length].getPeerId()).to.eql(relayLibp2p2.peerId.toB58String()) - // Spy if identify push is fired - sinon.spy(relayLibp2p1.identifyService, 'pushToPeerStore') + // Identify push for adding listen relay multiaddr + expect(relayLibp2p1.identifyService.pushToPeerStore.callCount).to.equal(1) // Disconnect from peer used for relay await relayLibp2p1.hangUp(relayLibp2p2.peerId) @@ -277,7 +280,9 @@ describe('auto-relay', () => { // Wait for removed listening on the relay await pWaitFor(() => relayLibp2p1.multiaddrs.length === originalMultiaddrs1Length) 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 () => {