diff --git a/src/peer-store/address-book.js b/src/peer-store/address-book.js index 516d908f..e23fc6dc 100644 --- a/src/peer-store/address-book.js +++ b/src/peer-store/address-book.js @@ -33,11 +33,11 @@ const Envelope = require('../record/envelope') * * @typedef {Object} Entry * @property {Address[]} addresses peer Addresses. - * @property {CertifiedRecord} record certified peer record. + * @property {CertifiedRecord} [record] certified peer record. */ /** - * @extends {Book} + * @extends {Book} */ class AddressBook extends Book { /** @@ -56,12 +56,13 @@ class AddressBook extends Book { peerStore, eventName: 'change:multiaddrs', eventProperty: 'multiaddrs', - eventTransformer: (data) => { - if (!data.addresses) { + eventTransformer: (entry) => { + if (!entry || !entry.addresses) { return [] } - return data.addresses.map((address) => address.multiaddr) - } + return entry.addresses.map((address) => address.multiaddr) + }, + getTransformer: (entry) => entry && entry.addresses ? [...entry.addresses] : undefined }) /** @@ -263,23 +264,6 @@ class AddressBook extends Book { return this } - /** - * Get the known data of a provided peer. - * - * @override - * @param {PeerId} peerId - * @returns {Address[]|undefined} - */ - get (peerId) { - if (!PeerId.isPeerId(peerId)) { - throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS) - } - - const entry = this.data.get(peerId.toB58String()) - - return entry && entry.addresses ? [...entry.addresses] : undefined - } - /** * Transforms received multiaddrs into Address. * diff --git a/src/peer-store/book.js b/src/peer-store/book.js index 42bb749f..727e74a8 100644 --- a/src/peer-store/book.js +++ b/src/peer-store/book.js @@ -14,7 +14,7 @@ const passthrough = data => data */ /** - * @template T + * @template Data, GetData, EventData */ class Book { /** @@ -25,18 +25,20 @@ class Book { * @param {PeerStore} properties.peerStore - PeerStore instance. * @param {string} properties.eventName - Name of the event to emit by the PeerStore. * @param {string} properties.eventProperty - Name of the property to emit by the PeerStore. - * @param {(data: T) => T[]} [properties.eventTransformer] - Transformer function of the provided data for being emitted. + * @param {(data: Data | undefined) => EventData | undefined} [properties.eventTransformer] - Transformer function of the provided data for being emitted. + * @param {(data: Data | undefined) => GetData | undefined} [properties.getTransformer] - Transformer function of the provided data for being returned on get. */ - constructor ({ peerStore, eventName, eventProperty, eventTransformer = passthrough }) { + constructor ({ peerStore, eventName, eventProperty, eventTransformer = passthrough, getTransformer = passthrough }) { this._ps = peerStore this.eventName = eventName this.eventProperty = eventProperty this.eventTransformer = eventTransformer + this.getTransformer = getTransformer /** * Map known peers to their data. * - * @type {Map} + * @type {Map} */ this.data = new Map() } @@ -45,7 +47,7 @@ class Book { * Set known data of a provided peer. * * @param {PeerId} peerId - * @param {T[]|T} data + * @param {unknown} data */ set (peerId, data) { throw errcode(new Error('set must be implemented by the subclass'), 'ERR_NOT_IMPLEMENTED') @@ -56,7 +58,7 @@ class Book { * * @protected * @param {PeerId} peerId - peerId of the data to store - * @param {T} data - data to store. + * @param {Data} data - data to store. * @param {Object} [options] - storing options. * @param {boolean} [options.emit = true] - emit the provided data. * @returns {void} @@ -76,7 +78,7 @@ class Book { * * @protected * @param {PeerId} peerId - * @param {any} [data] + * @param {Data | undefined} [data] */ _emit (peerId, data) { this._ps.emit(this.eventName, { @@ -90,7 +92,7 @@ class Book { * Returns `undefined` if there is no available data for the given peer. * * @param {PeerId} peerId - * @returns {T[]|T|undefined} + * @returns {GetData | undefined} */ get (peerId) { if (!PeerId.isPeerId(peerId)) { @@ -99,8 +101,7 @@ class Book { const rec = this.data.get(peerId.toB58String()) - // @ts-ignore - return rec ? [...rec] : undefined + return this.getTransformer(rec) } /** @@ -118,7 +119,7 @@ class Book { return false } - this._emit(peerId, []) + this._emit(peerId, undefined) return true } diff --git a/src/peer-store/key-book.js b/src/peer-store/key-book.js index 356c8186..ba92b87a 100644 --- a/src/peer-store/key-book.js +++ b/src/peer-store/key-book.js @@ -20,7 +20,7 @@ const { */ /** - * @extends {Book} + * @extends {Book} */ class KeyBook extends Book { /** @@ -34,7 +34,8 @@ class KeyBook extends Book { peerStore, eventName: 'change:pubkey', eventProperty: 'pubkey', - eventTransformer: (data) => data.pubKey + eventTransformer: (data) => data && data.pubKey, + getTransformer: (data) => data && data.pubKey }) /** @@ -74,23 +75,6 @@ class KeyBook extends Book { return this } - - /** - * Get Public key of the given PeerId, if stored. - * - * @override - * @param {PeerId} peerId - * @returns {PublicKey | undefined} - */ - get (peerId) { - if (!PeerId.isPeerId(peerId)) { - throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS) - } - - const rec = this.data.get(peerId.toB58String()) - - return rec ? rec.pubKey : undefined - } } module.exports = KeyBook diff --git a/src/peer-store/metadata-book.js b/src/peer-store/metadata-book.js index d497bb2f..4008ed54 100644 --- a/src/peer-store/metadata-book.js +++ b/src/peer-store/metadata-book.js @@ -10,17 +10,23 @@ const uint8ArrayEquals = require('uint8arrays/equals') const PeerId = require('peer-id') const Book = require('./book') - const { codes: { ERR_INVALID_PARAMETERS } } = require('../errors') +const eventName = 'change:metadata' +const eventProperty = 'metadata' + /** * @typedef {import('./')} PeerStore */ /** - * @extends {Book} + * @typedef {Map} Metadata + */ + +/** + * @extends {Book} * * @fires MetadataBook#change:metadata */ @@ -39,14 +45,14 @@ class MetadataBook extends Book { */ super({ peerStore, - eventName: 'change:metadata', - eventProperty: 'metadata' + eventName, + eventProperty }) /** * Map known peers to their known protocols. * - * @type {Map>} + * @type {Map} */ this.data = new Map() } @@ -99,20 +105,6 @@ class MetadataBook extends Book { emit && this._emit(peerId, key) } - /** - * Get the known data of a provided peer. - * - * @param {PeerId} peerId - * @returns {Map|undefined} - */ - get (peerId) { - if (!PeerId.isPeerId(peerId)) { - throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS) - } - - return this.data.get(peerId.toB58String()) - } - /** * Get specific metadata value, if it exists * @@ -167,7 +159,10 @@ class MetadataBook extends Book { return false } - this._emit(peerId, key) + this._ps.emit(eventName, { + peerId, + [eventProperty]: key + }) return true } diff --git a/src/peer-store/proto-book.js b/src/peer-store/proto-book.js index 5c17b137..f02ba94e 100644 --- a/src/peer-store/proto-book.js +++ b/src/peer-store/proto-book.js @@ -17,8 +17,21 @@ const { * @typedef {import('./')} PeerStore */ +// @extends {Book} + /** - * @extends {Book} + * @param {Set | undefined} set + * @returns {string[] | undefined} + */ +const transformSetToArray = (set) => { + if (!set) { + return undefined + } + return Array.from(set) +} + +/** + * @extends {Book, string[], string[]>} * * @fires ProtoBook#change:protocols */ @@ -39,7 +52,8 @@ class ProtoBook extends Book { peerStore, eventName: 'change:protocols', eventProperty: 'protocols', - eventTransformer: (data) => Array.from(data) + eventTransformer: (data) => transformSetToArray(data) || [], + getTransformer: (data) => transformSetToArray(data) }) /**