From 61563bbbb221e0f56e86270a77539861e6343b64 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Tue, 31 Mar 2020 16:58:07 +0200 Subject: [PATCH] chore: deprecate old peer-store api BREAKING CHANGE: the peer-store api changed. Check the API docs for the new specification. --- package.json | 4 +- src/peer-store/address-book.js | 10 ++- src/peer-store/index.js | 98 +++------------------------- src/peer-store/proto-book.js | 10 ++- test/peer-store/address-book.spec.js | 53 ++++++++------- test/peer-store/proto-book.spec.js | 47 +++++++------ 6 files changed, 77 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index 9c49accc87..b70db723f2 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "cids": "^0.8.0", "delay": "^4.3.0", "dirty-chai": "^2.0.1", - "interop-libp2p": "~0.0.1", + "interop-libp2p": "libp2p/interop#chore/update-libp2p-daemon-with-peerstore", "it-concat": "^1.0.0", "it-pair": "^1.0.0", "it-pushable": "^1.4.0", @@ -93,7 +93,7 @@ "libp2p-delegated-peer-routing": "^0.4.0", "libp2p-floodsub": "^0.20.0", "libp2p-gossipsub": "^0.2.0", - "libp2p-kad-dht": "^0.18.2", + "libp2p-kad-dht": "libp2p/js-libp2p-kad-dht#chore/use-new-peer-store-api", "libp2p-mdns": "^0.13.0", "libp2p-mplex": "^0.9.1", "libp2p-secio": "^0.12.1", diff --git a/src/peer-store/address-book.js b/src/peer-store/address-book.js index 6a08277f41..7d237739df 100644 --- a/src/peer-store/address-book.js +++ b/src/peer-store/address-book.js @@ -28,7 +28,7 @@ class AddressBook extends Book { /** * @constructor - * @param {EventEmitter} peerStore + * @param {PeerStore} peerStore */ constructor (peerStore) { /** @@ -80,6 +80,7 @@ class AddressBook extends Book { } this.data.set(id, multiaddrInfos) + this._setPeerId(peerId) log(`stored provided multiaddrs for ${id}`) // TODO: Remove peerInfo and its usage on peer-info deprecate @@ -133,6 +134,7 @@ class AddressBook extends Book { return this.data } + this._setPeerId(peerId) this.data.set(id, multiaddrInfos) log(`added provided multiaddrs for ${id}`) @@ -183,6 +185,12 @@ class AddressBook extends Book { return multiaddrInfos } + _setPeerId (peerId) { + if (!this._ps.peerIds.get(peerId)) { + this._ps.peerIds.set(peerId.toString(), peerId) + } + } + /** * Get the known multiaddrs for a given peer. All returned multiaddrs * will include the encapsulated `PeerId` of the peer. diff --git a/src/peer-store/index.js b/src/peer-store/index.js index 597b69e178..30ed7e94bb 100644 --- a/src/peer-store/index.js +++ b/src/peer-store/index.js @@ -43,97 +43,13 @@ class PeerStore extends EventEmitter { * ProtoBook containing a map of peerIdStr to supported protocols. */ this.protoBook = new ProtoBook(this) - } - - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Stores the peerInfo of a new peer on each book. - * @param {PeerInfo} peerInfo - * @param {object} [options] - * @param {boolean} [options.replace = true] - * @return {PeerInfo} - */ - put (peerInfo, options) { - const multiaddrs = peerInfo.multiaddrs.toArray() - const protocols = Array.from(peerInfo.protocols || new Set()) - - this.addressBook.set(peerInfo.id, multiaddrs, options) - this.protoBook.set(peerInfo.id, protocols, options) - - const peer = this.find(peerInfo.id) - const pInfo = new PeerInfo(peerInfo.id) - - if (!peer) { - return pInfo - } - - peer.protocols.forEach((p) => pInfo.protocols.add(p)) - peer.multiaddrInfos.forEach((mi) => pInfo.multiaddrs.add(mi.multiaddr)) - - return pInfo - } - - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Get the info of the given id. - * @param {peerId} peerId - * @returns {PeerInfo} - */ - get (peerId) { - const peer = this.find(peerId) - - const pInfo = new PeerInfo(peerId) - peer.protocols.forEach((p) => pInfo.protocols.add(p)) - peer.multiaddrInfos.forEach((mi) => pInfo.multiaddrs.add(mi.multiaddr)) - - return pInfo - } - - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Has the info to the given id. - * @param {PeerId} peerId - * @returns {boolean} - */ - has (peerId) { - return Boolean(this.find(peerId)) - } - - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Removes the peer provided. - * @param {PeerId} peerId - * @returns {boolean} true if found and removed - */ - remove (peerId) { - return this.delete(peerId) - } - - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Completely replaces the existing peers metadata with the given `peerInfo` - * @param {PeerInfo} peerInfo - * @returns {void} - */ - replace (peerInfo) { - this.put(peerInfo) - } - // TODO: Temporary adapter for modules using PeerStore - // This should be removed under a breaking change - /** - * Returns the known multiaddrs for a given `PeerInfo`. All returned multiaddrs - * will include the encapsulated `PeerId` of the peer. - * @param {PeerInfo} peerInfo - * @returns {Array} - */ - multiaddrsForPeer (peerInfo) { - return this.addressBook.getMultiaddrsForPeer(peerInfo.id) + /** + * TODO: this should only exist until we have the key-book + * Map known peers to their peer-id. + * @type {Map} + */ + this.peerIds = new Map() } /** @@ -204,6 +120,7 @@ class PeerStore extends EventEmitter { throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS) } + const id = this.peerIds.get(peerId.toString()) const multiaddrInfos = this.addressBook.get(peerId) const protocols = this.protoBook.get(peerId) @@ -212,6 +129,7 @@ class PeerStore extends EventEmitter { } return { + id: id || peerId, multiaddrInfos: multiaddrInfos || [], protocols: protocols || [] } diff --git a/src/peer-store/proto-book.js b/src/peer-store/proto-book.js index 8a35303119..bb64451cd6 100644 --- a/src/peer-store/proto-book.js +++ b/src/peer-store/proto-book.js @@ -22,7 +22,7 @@ const { class ProtoBook extends Book { /** * @constructor - * @param {EventEmitter} peerStore + * @param {PeerStore} peerStore */ constructor (peerStore) { /** @@ -71,6 +71,7 @@ class ProtoBook extends Book { } this.data.set(id, newSet) + this._setPeerId(peerId) log(`stored provided protocols for ${id}`) // TODO: Remove peerInfo and its usage on peer-info deprecate @@ -118,6 +119,7 @@ class ProtoBook extends Book { protocols = [...newSet] this.data.set(id, newSet) + this._setPeerId(peerId) log(`added provided protocols for ${id}`) // TODO: Remove peerInfo and its usage on peer-info deprecate @@ -132,6 +134,12 @@ class ProtoBook extends Book { return this.data } + + _setPeerId (peerId) { + if (!this._ps.peerIds.get(peerId)) { + this._ps.peerIds.set(peerId.toString(), peerId) + } + } } module.exports = ProtoBook diff --git a/test/peer-store/address-book.spec.js b/test/peer-store/address-book.spec.js index 1ec11eb742..fba8d72c64 100644 --- a/test/peer-store/address-book.spec.js +++ b/test/peer-store/address-book.spec.js @@ -5,11 +5,10 @@ const chai = require('chai') chai.use(require('dirty-chai')) const { expect } = chai -const { EventEmitter } = require('events') const pDefer = require('p-defer') const multiaddr = require('multiaddr') -const AddressBook = require('../../src/peer-store/address-book') +const PeerStore = require('../../src/peer-store') const peerUtils = require('../utils/creators/peer') const { @@ -30,15 +29,15 @@ describe('addressBook', () => { }) describe('addressBook.set', () => { - let ee, ab + let peerStore, ab beforeEach(() => { - ee = new EventEmitter() - ab = new AddressBook(ee) + peerStore = new PeerStore() + ab = peerStore.addressBook }) afterEach(() => { - ee.removeAllListeners() + peerStore.removeAllListeners() }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -63,7 +62,7 @@ describe('addressBook', () => { const defer = pDefer() const supportedMultiaddrs = [addr1, addr2] - ee.once('change:multiaddrs', ({ peerId, multiaddrs }) => { + peerStore.once('change:multiaddrs', ({ peerId, multiaddrs }) => { expect(peerId).to.exist() expect(multiaddrs).to.eql(supportedMultiaddrs) defer.resolve() @@ -84,7 +83,7 @@ describe('addressBook', () => { const supportedMultiaddrsB = [addr2] let changeCounter = 0 - ee.on('change:multiaddrs', () => { + peerStore.on('change:multiaddrs', () => { changeCounter++ if (changeCounter > 1) { defer.resolve() @@ -109,7 +108,7 @@ describe('addressBook', () => { const supportedMultiaddrs = [addr1, addr2] let changeCounter = 0 - ee.on('change:multiaddrs', () => { + peerStore.on('change:multiaddrs', () => { changeCounter++ if (changeCounter > 1) { defer.reject() @@ -132,15 +131,15 @@ describe('addressBook', () => { }) describe('addressBook.add', () => { - let ee, ab + let peerStore, ab beforeEach(() => { - ee = new EventEmitter() - ab = new AddressBook(ee) + peerStore = new PeerStore() + ab = peerStore.addressBook }) afterEach(() => { - ee.removeAllListeners() + peerStore.removeAllListeners() }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -169,7 +168,7 @@ describe('addressBook', () => { const finalMultiaddrs = supportedMultiaddrsA.concat(supportedMultiaddrsB) let changeTrigger = 2 - ee.on('change:multiaddrs', ({ multiaddrs }) => { + peerStore.on('change:multiaddrs', ({ multiaddrs }) => { changeTrigger-- if (changeTrigger === 0 && arraysAreEqual(multiaddrs, finalMultiaddrs)) { defer.resolve() @@ -199,7 +198,7 @@ describe('addressBook', () => { const finalMultiaddrs = supportedMultiaddrsA.concat(supportedMultiaddrsB) let changeCounter = 0 - ee.on('change:multiaddrs', () => { + peerStore.on('change:multiaddrs', () => { changeCounter++ if (changeCounter > 1) { defer.resolve() @@ -225,7 +224,7 @@ describe('addressBook', () => { const supportedMultiaddrsB = [addr2] let changeCounter = 0 - ee.on('change:multiaddrs', () => { + peerStore.on('change:multiaddrs', () => { changeCounter++ if (changeCounter > 1) { defer.reject() @@ -248,11 +247,11 @@ describe('addressBook', () => { }) describe('addressBook.get', () => { - let ee, ab + let peerStore, ab beforeEach(() => { - ee = new EventEmitter() - ab = new AddressBook(ee) + peerStore = new PeerStore() + ab = peerStore.addressBook }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -279,11 +278,11 @@ describe('addressBook', () => { }) describe('addressBook.getMultiaddrsForPeer', () => { - let ee, ab + let peerStore, ab beforeEach(() => { - ee = new EventEmitter() - ab = new AddressBook(ee) + peerStore = new PeerStore() + ab = peerStore.addressBook }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -311,11 +310,11 @@ describe('addressBook', () => { }) describe('addressBook.delete', () => { - let ee, ab + let peerStore, ab beforeEach(() => { - ee = new EventEmitter() - ab = new AddressBook(ee) + peerStore = new PeerStore() + ab = peerStore.addressBook }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -327,7 +326,7 @@ describe('addressBook', () => { it('returns false if no records exist for the peer and no event is emitted', () => { const defer = pDefer() - ee.on('change:multiaddrs', () => { + peerStore.on('change:multiaddrs', () => { defer.reject() }) @@ -350,7 +349,7 @@ describe('addressBook', () => { ab.set(peerId, supportedMultiaddrs) // Listen after set - ee.on('change:multiaddrs', ({ multiaddrs }) => { + peerStore.on('change:multiaddrs', ({ multiaddrs }) => { expect(multiaddrs.length).to.eql(0) defer.resolve() }) diff --git a/test/peer-store/proto-book.spec.js b/test/peer-store/proto-book.spec.js index 7985dfe1dc..d153698aa6 100644 --- a/test/peer-store/proto-book.spec.js +++ b/test/peer-store/proto-book.spec.js @@ -5,10 +5,9 @@ const chai = require('chai') chai.use(require('dirty-chai')) const { expect } = chai -const { EventEmitter } = require('events') const pDefer = require('p-defer') -const ProtoBook = require('../../src/peer-store/proto-book') +const PeerStore = require('../../src/peer-store') const peerUtils = require('../utils/creators/peer') const { @@ -25,15 +24,15 @@ describe('protoBook', () => { }) describe('protoBook.set', () => { - let ee, pb + let peerStore, pb beforeEach(() => { - ee = new EventEmitter() - pb = new ProtoBook(ee) + peerStore = new PeerStore() + pb = peerStore.protoBook }) afterEach(() => { - ee.removeAllListeners() + peerStore.removeAllListeners() }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -52,7 +51,7 @@ describe('protoBook', () => { const defer = pDefer() const supportedProtocols = ['protocol1', 'protocol2'] - ee.once('change:protocols', ({ peerId, protocols }) => { + peerStore.once('change:protocols', ({ peerId, protocols }) => { expect(peerId).to.exist() expect(protocols).to.have.deep.members(supportedProtocols) defer.resolve() @@ -72,7 +71,7 @@ describe('protoBook', () => { const supportedProtocolsB = ['protocol2'] let changeCounter = 0 - ee.on('change:protocols', () => { + peerStore.on('change:protocols', () => { changeCounter++ if (changeCounter > 1) { defer.resolve() @@ -96,7 +95,7 @@ describe('protoBook', () => { const supportedProtocols = ['protocol1', 'protocol2'] let changeCounter = 0 - ee.on('change:protocols', () => { + peerStore.on('change:protocols', () => { changeCounter++ if (changeCounter > 1) { defer.reject() @@ -119,15 +118,15 @@ describe('protoBook', () => { }) describe('protoBook.add', () => { - let ee, pb + let peerStore, pb beforeEach(() => { - ee = new EventEmitter() - pb = new ProtoBook(ee) + peerStore = new PeerStore() + pb = peerStore.protoBook }) afterEach(() => { - ee.removeAllListeners() + peerStore.removeAllListeners() }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -150,7 +149,7 @@ describe('protoBook', () => { const finalProtocols = supportedProtocolsA.concat(supportedProtocolsB) let changeTrigger = 2 - ee.on('change:protocols', ({ protocols }) => { + peerStore.on('change:protocols', ({ protocols }) => { changeTrigger-- if (changeTrigger === 0 && arraysAreEqual(protocols, finalProtocols)) { defer.resolve() @@ -178,7 +177,7 @@ describe('protoBook', () => { const finalProtocols = supportedProtocolsA.concat(supportedProtocolsB) let changeCounter = 0 - ee.on('change:protocols', () => { + peerStore.on('change:protocols', () => { changeCounter++ if (changeCounter > 1) { defer.resolve() @@ -203,7 +202,7 @@ describe('protoBook', () => { const supportedProtocolsB = ['protocol2'] let changeCounter = 0 - ee.on('change:protocols', () => { + peerStore.on('change:protocols', () => { changeCounter++ if (changeCounter > 1) { defer.reject() @@ -226,11 +225,11 @@ describe('protoBook', () => { }) describe('protoBook.get', () => { - let ee, pb + let peerStore, pb beforeEach(() => { - ee = new EventEmitter() - pb = new ProtoBook(ee) + peerStore = new PeerStore() + pb = peerStore.protoBook }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -256,11 +255,11 @@ describe('protoBook', () => { }) describe('protoBook.delete', () => { - let ee, pb + let peerStore, pb beforeEach(() => { - ee = new EventEmitter() - pb = new ProtoBook(ee) + peerStore = new PeerStore() + pb = peerStore.protoBook }) it('throwns invalid parameters error if invalid PeerId is provided', () => { @@ -272,7 +271,7 @@ describe('protoBook', () => { it('returns false if no records exist for the peer and no event is emitted', () => { const defer = pDefer() - ee.on('change:protocols', () => { + peerStore.on('change:protocols', () => { defer.reject() }) @@ -295,7 +294,7 @@ describe('protoBook', () => { pb.set(peerId, supportedProtocols) // Listen after set - ee.on('change:protocols', ({ protocols }) => { + peerStore.on('change:protocols', ({ protocols }) => { expect(protocols.length).to.eql(0) defer.resolve() })