libp2p
Version:
JavaScript implementation of libp2p, a modular peer to peer network stack
60 lines (49 loc) • 1.57 kB
text/typescript
import { RecursionLimitError } from '../../errors.ts'
import { MAX_RECURSIVE_DEPTH } from '../constants.defaults.ts'
import type { MultiaddrResolveOptions, MultiaddrResolver } from '@libp2p/interface'
import type { Multiaddr } from '@multiformats/multiaddr'
export interface ResolveOptions extends MultiaddrResolveOptions {
/**
* When resolving DNSADDR Multiaddrs that resolve to other DNSADDR Multiaddrs,
* limit how many times we will recursively resolve them.
*
* @default 32
*/
maxRecursiveDepth?: number
/**
* The current recursive depth
*
* @default 0
*/
depth?: number
}
/**
* Recursively resolve multiaddrs
*/
export async function resolveMultiaddr (address: Multiaddr, resolvers: Record<string, MultiaddrResolver>, options: ResolveOptions): Promise<Multiaddr[]> {
const depth = options.depth ?? 0
if (depth > (options.maxRecursiveDepth ?? MAX_RECURSIVE_DEPTH)) {
throw new RecursionLimitError('Max recursive depth reached')
}
let resolved = false
const output: Multiaddr[] = []
for (const resolver of Object.values(resolvers)) {
if (resolver.canResolve(address)) {
resolved = true
const addresses = await resolver.resolve(address, options)
for (const address of addresses) {
output.push(
...(await resolveMultiaddr(address, resolvers, {
...options,
depth: depth + 1
}))
)
}
}
}
if (resolved === false) {
output.push(address)
}
return output
}
export { dnsaddrResolver } from './dnsaddr.js'