diff --git a/lib/plugin-hub-client.js b/lib/plugin-hub-client.js index 166c27c..79d5123 100644 --- a/lib/plugin-hub-client.js +++ b/lib/plugin-hub-client.js @@ -8,6 +8,7 @@ const { ErrorDuplex } = require('./utils') const HUBS_SUBDOMAIN = 'hubs' /** + * @typedef {`/${string}/${string}/${string}/${string}/${string}/${string}`} HubMultiaddr * @typedef {ReturnType} PPPPPNet * @typedef {ReturnType} PPPPPSet * @typedef {import('ppppp-net').Info} Info @@ -52,76 +53,77 @@ function initHubClient(peer, config) { fn.apply(this, args) }) - return { - /** - * @param {`/${string}`} multiaddr - * @param {CB} cb - */ - addHub(multiaddr, cb) { - peer.set.add(HUBS_SUBDOMAIN, multiaddr, (err, _) => { + /** + * @param {HubMultiaddr} multiaddr + * @param {CB} cb + */ + function addHub(multiaddr, cb) { + peer.set.add(HUBS_SUBDOMAIN, multiaddr, (err, _) => { + // prettier-ignore + if (err) return cb(new Error('Failed to add Hub to my Set feed', {cause: err})) + peer.net.connect(multiaddr, (err, rpc) => { // prettier-ignore - if (err) return cb(new Error('Failed to add Hub to my Set feed', {cause: err})) - peer.net.connect(multiaddr, (err, rpc) => { - // prettier-ignore - if (err) return cb(new Error('Failed to connect to Hub after adding it to my Set feed', {cause: err})) - cb(null, void 0) - }) + if (err) return cb(new Error('Failed to connect to Hub after adding it to my Set feed', {cause: err})) + cb(null, void 0) }) - }, + }) + } - /** - * @param {number} amount - * @param {CB>} cb - */ - getHubs(amount, cb) { - const source = peer.net.peers() - source(null, (err, peers) => { - if (err === true || !peers) return cb(null, []) - // prettier-ignore - if (err) return cb(new Error('Failed to get hubs', { cause: err })) - // @ts-ignore - const infoMap = /**@type {Map<`/${string}`, Info>}*/ (new Map(peers)) - const multiaddrs = /**@type {Array<`/${string}`>}*/ ( - peer.set.values(HUBS_SUBDOMAIN) - ) - const hubs = [] - for (const multiaddr of multiaddrs) { - const stats = infoMap.get(multiaddr)?.stats ?? { failure: 1 } - hubs.push({ multiaddr, stats }) - } - hubs.sort((a, b) => (a.stats.failure ?? 1) - (b.stats.failure ?? 1)) - hubs.splice(amount) - const returnable = hubs.map((h) => h.multiaddr) - cb(null, returnable) - }) - }, - - /** - * @param {string} origin - * @returns {import('pull-stream').Duplex} - */ - connect(origin) { + /** + * @param {number} amount + * @param {CB>} cb + */ + function getHubs(amount, cb) { + const source = peer.net.peers() + source(null, (err, peers) => { + if (err === true || !peers) return cb(null, []) + // prettier-ignore + if (err) return cb(new Error('Failed to get hubs', { cause: err })) // @ts-ignore - const hub = this.shse.pubkey - debug('received hubClient.connect(%s) via hub %s', origin, hub) - if (hubs.has(hub) && origin) { - debug('connect() will resolve because handler exists') - const handler = hubs.get(hub).handler - const [ins, outs] = DuplexPair() - handler(ins, origin) - return outs - } else { - return ErrorDuplex(`Could not connect to ${origin} via ${hub}`) + const infoMap = new Map(peers) + const multiaddrs = peer.set.values(HUBS_SUBDOMAIN) + const hubs = [] + for (const multiaddr of multiaddrs) { + const stats = infoMap.get(multiaddr)?.stats ?? { failure: 1 } + hubs.push({ multiaddr, stats }) } - }, + hubs.sort((a, b) => (a.stats.failure ?? 1) - (b.stats.failure ?? 1)) + hubs.splice(amount) + const returnable = hubs.map((h) => h.multiaddr) + cb(null, returnable) + }) + } - // Internal method, needed for api-plugin.ts - getHubsMap() { - return hubs - }, + /** + * @param {string} origin + * @returns {import('pull-stream').Duplex} + */ + function connect(origin) { + // @ts-ignore + const hub = this.shse.pubkey + debug('received hubClient.connect(%s) via hub %s', origin, hub) + if (hubs.has(hub) && origin) { + debug('connect() will resolve because handler exists') + const handler = hubs.get(hub).handler + const [ins, outs] = DuplexPair() + handler(ins, origin) + return outs + } else { + return ErrorDuplex(`Could not connect to ${origin} via ${hub}`) + } + } + // Internal method + function getHubsMap() { + return hubs + } + + return { + addHub, + getHubs, + connect, + getHubsMap, discoveredAttendants, - // underscore so other modules IN THIS LIBRARY can use it _notifyDiscoveredAttendant, }