UNPKG

is-private-host

Version:

Check if a hostname or URL resolves to a private IP address

83 lines (74 loc) 2.44 kB
import type {LookupAddress} from 'node:dns' import {lookup} from 'node:dns/promises' import {isPrivateIP} from './isPrivateIP.js' /** * Resolve result for a given hostname * * @public */ export interface HostResolveInfo { isPrivate: boolean addresses: LookupAddress[] } /** * Determines if a the given hostname resolves to a "private" IP address * * @param hostname - Hostname to check * @returns Promise resolving to true if the hostname resolves to a private IP address, false otherwise * @public */ export async function isPrivateHost(hostname: string): Promise<boolean> /** * Determines if a the given hostname resolves to a "private" IP address * * @param hostname - Hostname to check * @param options - Options for the resolve operation * @returns Promise resolving to true if the hostname resolves to a private IP address, false otherwise * @public */ export async function isPrivateHost( hostname: string, options: Record<string, never>, ): Promise<boolean> /** * Determines if a the given hostname resolves to a "private" IP address * * @param hostname - Hostname to check * @param options - Options for the resolve operation * @returns Promise resolving to true if the hostname resolves to a private IP address, false otherwise * @public */ export async function isPrivateHost( hostname: string, options: {withResolveInfo: false}, ): Promise<boolean> /** * Determines if a the given hostname resolves to a "private" IP address * * @param hostname - Hostname to check * @param options - Options for the resolve operation * @returns Promise resolving to an object containing the resolve information * @public */ export async function isPrivateHost( hostname: string, options: {withResolveInfo: true}, ): Promise<HostResolveInfo> export async function isPrivateHost( hostname: string, options?: {withResolveInfo?: boolean}, ): Promise<boolean | HostResolveInfo> { try { const addresses = await lookup(hostname, { // Check both IPv4 and IPv6 records since we don't know which one will be used in the end all: true, }) const isPrivate = addresses.some(({address}) => isPrivateIP(address)) return options && options.withResolveInfo ? {isPrivate, addresses} : isPrivate } catch (error: unknown) { throw new Error( `Error resolving hostname "${hostname}": ${error instanceof Error ? error.message : error}`, {cause: error}, ) } }