UNPKG

libp2p

Version:

JavaScript implementation of libp2p, a modular peer to peer network stack

88 lines 2.92 kB
import { isNetworkAddress } from '@libp2p/utils/multiaddr/is-network-address'; import { isPrivate } from '@libp2p/utils/multiaddr/is-private'; export const defaultValues = { maxObservedAddresses: 10 }; export class TransportAddresses { log; addresses; maxObservedAddresses; constructor(components, init = {}) { this.log = components.logger.forComponent('libp2p:address-manager:observed-addresses'); this.addresses = new Map(); this.maxObservedAddresses = init.maxObservedAddresses ?? defaultValues.maxObservedAddresses; } get(multiaddr, ttl) { if (isPrivate(multiaddr)) { return { multiaddr, verified: true, type: 'transport', expires: Date.now() + ttl, lastVerified: Date.now() }; } const key = this.toKey(multiaddr); let metadata = this.addresses.get(key); if (metadata == null) { metadata = { verified: !isNetworkAddress(multiaddr), expires: 0 }; this.addresses.set(key, metadata); } return { multiaddr, verified: metadata.verified, type: 'transport', expires: metadata.expires, lastVerified: metadata.lastVerified }; } has(ma) { const key = this.toKey(ma); return this.addresses.has(key); } remove(ma) { const key = this.toKey(ma); const startingConfidence = this.addresses.get(key)?.verified ?? false; this.log('removing observed address %a', ma); this.addresses.delete(key); return startingConfidence; } confirm(ma, ttl) { const key = this.toKey(ma); const metadata = this.addresses.get(key) ?? { verified: false, expires: 0, lastVerified: 0 }; const startingConfidence = metadata.verified; metadata.verified = true; metadata.expires = Date.now() + ttl; metadata.lastVerified = Date.now(); this.addresses.set(key, metadata); return startingConfidence; } unconfirm(ma, ttl) { const key = this.toKey(ma); const metadata = this.addresses.get(key) ?? { verified: false, expires: 0 }; const startingConfidence = metadata.verified; metadata.verified = false; metadata.expires = Date.now() + ttl; this.addresses.set(key, metadata); return startingConfidence; } toKey(ma) { if (isNetworkAddress(ma)) { // only works for dns/ip based addresses const options = ma.toOptions(); return `${options.host}-${options.port}-${options.transport}`; } return ma.toString(); } } //# sourceMappingURL=transport-addresses.js.map