ip-address is a library for validating and manipulating IPv4 and IPv6 addresses in JavaScript and TypeScript.
npm install ip-addressimport { Address4, Address6 } from 'ip-address';
// Validation
Address4.isValid('192.168.1.1'); // true
Address6.isValid('2001:db8::1'); // true
Address6.isValid('not an address'); // false
// Parsing (throws AddressError on invalid input)
const v4 = new Address4('192.168.1.1/24');
const v6 = new Address6('2001:db8::1/64');
// Subnet membership
const host = new Address4('192.168.1.42');
const network = new Address4('192.168.1.0/24');
host.isInSubnet(network); // true
// Subnet range
network.startAddress().correctForm(); // '192.168.1.0'
network.endAddress().correctForm(); // '192.168.1.255'
// Strict network-address check (host bits must be zero).
// isValid() accepts CIDRs with host bits set β '192.168.1.5/24' is a valid
// host-with-subnet, but it isn't a network address.
const cidr = new Address4('192.168.1.5/24');
Address4.isValid('192.168.1.5/24'); // true
cidr.correctForm() === cidr.startAddress().correctForm(); // false
// Address properties
const link = new Address6('fe80::1');
link.isLinkLocal(); // true
link.isMulticast(); // false
link.isLoopback(); // false
new Address4('192.168.1.1').isPrivate(); // true (RFC 1918)
new Address6('fc00::1').isULA(); // true (RFC 4193)
// Numeric and byte representations
v4.bigInt(); // 3232235777n
v4.toArray(); // [192, 168, 1, 1]
v6.canonicalForm(); // '2001:0db8:0000:0000:0000:0000:0000:0001'
// Embedded IPv4 + Teredo
const teredo = new Address6('2001:0:ce49:7601:e866:efff:62c3:fffe');
teredo.inspectTeredo().client4; // '157.60.0.1'
// Parse host + port from a URL
Address6.fromURL('http://[2001:db8::1]:8080/').port; // 8080- Written in TypeScript with full type definitions; usable from CommonJS and ESM
- Zero runtime dependencies
- Parses all standard IPv4 and IPv6 notations, including subnets and zones
- Parses IPv6 hosts (and ports) from URLs via
Address6.fromURL(url) - Subnet membership checks (
isInSubnet) and range queries (startAddress/endAddress) - Special-property checks: private (RFC 1918) / ULA (RFC 4193), loopback, link-local, multicast, broadcast, unspecified, CGNAT, documentation, Teredo, 6to4, v4-in-v6
- Decodes Teredo and 6to4 tunneling information
- Conversions: canonical/correct form, hex, binary, decimal, byte arrays, BigInt,
in-addr.arpa/ip6.arpa - Runs in Node.js and the browser
- Thousands of test cases
A few terms used throughout the API can be confusing if you haven't worked deeply with IPv6 before:
- Correct form β the shortest valid representation, per RFC 5952: leading zeros stripped, the longest run of zero groups collapsed to
::, and hex digits lowercased (e.g.2001:db8::1). This is what most software displays. - Canonical form β the fully expanded representation: all 8 groups, each padded to 4 hex digits, no
::collapsing (e.g.2001:0db8:0000:0000:0000:0000:0000:0001). Useful for sorting and byte-exact comparison. - Subnet β the network portion of an address expressed as a CIDR prefix length (e.g.
/24for IPv4,/64for IPv6).startAddress()/endAddress()return the bounds of the subnet's range. - Zone β the IPv6 scope identifier appended after
%, used to disambiguate link-local addresses across interfaces (e.g.fe80::1%eth0). - v4-in-v6 β mixed notation that embeds an IPv4 address as the last 32 bits of an IPv6 address, e.g.
::ffff:192.168.0.1. Used for IPv4-mapped IPv6 addresses. - Teredo β a tunneling protocol that encodes an IPv4 endpoint, port, and flags inside a
2001::/32IPv6 address.inspectTeredo()decodes those fields. - 6to4 β a tunneling protocol that embeds an IPv4 address as the second 16 bits of a
2002::/16IPv6 address.inspect6to4()decodes the embedded v4 address.
Constructor
new AddressError(message: string, parseMessage?: string): AddressError
Properties
parseMessage: stringβ src
Represents an IPv4 address
Constructor
new Address4(address: string): Address4
Static methods
static isValid(address: string): booleanβ Returns true if the given string is a valid IPv4 address (with optional CIDR subnet), false otherwise. Host bits in the subnet portion are allowed (e.g.192.168.1.5/24is valid); for strict network-address validation comparecorrectForm()tostartAddress().correctForm(), or usenetworkForm(). srcstatic fromAddressAndMask(address: string, mask: string): Address4β Construct anAddress4from an address and a dotted-decimal subnet mask given as separate strings (e.g. as returned by Node'sos.networkInterfaces()). ThrowsAddressErrorif the mask is non-contiguous (e.g.255.0.255.0). srcstatic fromAddressAndWildcardMask(address: string, wildcardMask: string): Address4β Construct anAddress4from an address and a Cisco-style wildcard mask given as separate strings (e.g.0.0.0.255for a/24). The wildcard mask is the bitwise inverse of the subnet mask. ThrowsAddressErrorif the mask is non-contiguous (e.g.0.255.0.255). srcstatic fromWildcard(input: string): Address4β Construct anAddress4from a wildcard pattern with trailing*octets. The number of trailing wildcards determines the prefix length: each*represents 8 bits. Only trailing whole-octet wildcards are supported. Partial-octet wildcards (e.g.192.168.0.1*) and interior wildcards (e.g.192.*.0.1) throwAddressError. srcstatic fromHex(hex: string): Address4β Converts a hex string to an IPv4 address object. Accepts 8 hex digits with optional:separators (e.g.'7f000001'or'7f:00:00:01'). ThrowsAddressErrorfor any other length or for non-hex characters. srcstatic fromInteger(integer: number): Address4β Converts an integer into a IPv4 address object. The integer must be a non-negative safe integer in the range[0, 2**32 - 1]; otherwiseAddressErroris thrown. srcstatic fromArpa(arpaFormAddress: string): Address4β Return an address from in-addr.arpa form srcstatic fromBigInt(bigInt: bigint): Address4β Converts a BigInt to a v4 address object. The value must be in the range[0, 2**32 - 1]; otherwiseAddressErroris thrown. srcstatic fromByteArray(bytes: number[]): Address4β Convert a byte array to an Address4 object. To convert from a Node.jsBuffer, spread it:Address4.fromByteArray([...buf]). srcstatic fromUnsignedByteArray(bytes: number[]): Address4β Convert an unsigned byte array to an Address4 object src
Instance methods
parse(address: string): string[]β Parses an IPv4 address string into its four octet groups and stores the result onthis.parsedAddress. Called automatically by the constructor; you typically don't need to call it directly. ThrowsAddressErrorif the input is not a valid IPv4 address. srccorrectForm(): stringβ Returns the address in correct form: octets joined with.and any leading zeros stripped (e.g.192.168.1.1). For IPv4 this matches the canonical dotted-decimal representation. srctoHex(): stringβ Converts an IPv4 address object to a hex string srctoArray(): number[]β Converts an IPv4 address object to an array of bytes. To get a Node.jsBuffer, wrap the result:Buffer.from(address.toArray()). srctoGroup6(): stringβ Converts an IPv4 address object to an IPv6 address group srcbigInt(): bigintβ Returns the address as abigintsrcstartAddress(): Address4β The first address in the range given by this address' subnet. Often referred to as the Network Address. srcstartAddressExclusive(): Address4β The first host address in the range given by this address's subnet ie the first address after the Network Address srcendAddress(): Address4β The last address in the range given by this address' subnet Often referred to as the Broadcast srcendAddressExclusive(): Address4β The last host address in the range given by this address's subnet ie the last address prior to the Broadcast Address srcsubnetMaskAddress(): Address4β The dotted-decimal form of the subnet mask, e.g.255.255.240.0for a/20. Returns anAddress4; call.correctForm()for the string. srcwildcardMask(): Address4β The Cisco-style wildcard mask, e.g.0.0.0.255for a/24. This is the bitwise inverse ofsubnetMaskAddress(). Returns anAddress4; call.correctForm()for the string. srcnetworkForm(): stringβ The network address in CIDR string form, e.g.192.168.1.0/24for192.168.1.5/24. For an address with no explicit subnet the prefix is/32, e.g.networkForm()on192.168.1.5returns192.168.1.5/32. srcmask(mask?: number): stringβ Returns the first n bits of the address, defaulting to the subnet mask srcgetBitsBase2(start: number, end: number): stringβ Returns the bits in the given range as a base-2 string srcreverseForm(options?: ReverseFormOptions): stringβ Return the reversed ip6.arpa form of the address srcisMulticast(): booleanβ Returns true if the given address is a multicast address srcisPrivate(): booleanβ Returns true if the address is in one of the RFC 1918 private address ranges (10.0.0.0/8,172.16.0.0/12,192.168.0.0/16). srcisLoopback(): booleanβ Returns true if the address is in the loopback range127.0.0.0/8(RFC 1122). srcisLinkLocal(): booleanβ Returns true if the address is in the link-local range169.254.0.0/16(RFC 3927). srcisUnspecified(): booleanβ Returns true if the address is the unspecified address0.0.0.0. srcisBroadcast(): booleanβ Returns true if the address is the limited broadcast address255.255.255.255(RFC 919). srcisCGNAT(): booleanβ Returns true if the address is in the carrier-grade NAT range100.64.0.0/10(RFC 6598). srcbinaryZeroPad(): stringβ Returns a zero-padded base-2 string representation of the address srcgroupForV6(): stringβ Groups an IPv4 address for inclusion at the end of an IPv6 address src
Properties
address: stringβ srcaddressMinusSuffix: stringβ srcgroups: numberβ srcparsedAddress: string[]β srcparsedSubnet: stringβ srcsubnet: stringβ srcsubnetMask: numberβ srcv4: booleanβ srcisCorrect: (this: Address4 | Address6) => booleanβ Returns true if the address is correct, false otherwise srcisInSubnet: (this: Address4 | Address6, address: Address4 | Address6) => booleanβ Returns true if the given address is in the subnet of the current address src
Represents an IPv6 address
Constructor
new Address6(address: string, optionalGroups?: number): Address6
Static methods
static isValid(address: string): booleanβ Returns true if the given string is a valid IPv6 address (with optional CIDR subnet and zone identifier), false otherwise. Host bits in the subnet portion are allowed (e.g.2001:db8::1/32is valid); for strict network-address validation comparecorrectForm()tostartAddress().correctForm(), or usenetworkForm(). srcstatic fromBigInt(bigInt: bigint): Address6β Convert a BigInt to a v6 address object. The value must be in the range[0, 2**128 - 1]; otherwiseAddressErroris thrown. srcstatic fromURL(url: string): { error: string; address: null; port: null } | { error?: undefined; address: Address6; port: number | null }β Parse a URL (with optional bracketed host and port) into an address and port. Returns either{ address, port }on success or{ error, address: null, port: null }if the URL could not be parsed. Ports are returned as numbers (ornullif absent or out of range). srcstatic fromAddressAndMask(address: string, mask: string): Address6β Construct anAddress6from an address and a hex subnet mask given as separate strings (e.g. as returned by Node'sos.networkInterfaces()). ThrowsAddressErrorif the mask is non-contiguous (e.g.ffff::ffff). srcstatic fromAddressAndWildcardMask(address: string, wildcardMask: string): Address6β Construct anAddress6from an address and a Cisco-style wildcard mask given as separate strings (e.g.::ffff:ffff:ffff:fffffor a/64). The wildcard mask is the bitwise inverse of the subnet mask. ThrowsAddressErrorif the mask is non-contiguous. srcstatic fromWildcard(input: string): Address6β Construct anAddress6from a wildcard pattern with trailing*groups. The number of trailing wildcards determines the prefix length: each*represents 16 bits.::is expanded to zero groups (not wildcards) before evaluating trailing wildcards. Only trailing whole-group wildcards are supported. Partial-group wildcards (e.g.2001:db8::0*) and interior wildcards (e.g.*::1) throwAddressError. srcstatic fromAddress4(address: string): Address6β Create an IPv6-mapped address given an IPv4 address srcstatic fromArpa(arpaFormAddress: string): Address6β Return an address from ip6.arpa form srcstatic fromAddress4Nat64(address: string, prefix: string): Address6β Embed an IPv4 address into a NAT64 IPv6 address using the encoding defined by RFC 6052. The default prefix is the well-known prefix64:ff9b::/96. The prefix length must be one of 32, 40, 48, 56, 64, or 96; for prefixes shorter than /64 the IPv4 octets are split around the reserved bits 64β71. srcstatic fromByteArray(bytes: any[]): Address6β Convert a byte array to an Address6 object. To convert from a Node.jsBuffer, spread it:Address6.fromByteArray([...buf]). srcstatic fromUnsignedByteArray(bytes: any[]): Address6β Convert an unsigned byte array to an Address6 object. To convert from a Node.jsBuffer, spread it:Address6.fromUnsignedByteArray([...buf]). src
Instance methods
microsoftTranscription(): stringβ Return the Microsoft UNC transcription of the address srcmask(mask?: number): stringβ Return the first n bits of the address, defaulting to the subnet mask srcpossibleSubnets(subnetSize?: number): stringβ Return the number of possible subnets of a given size in the address srcstartAddress(): Address6β The first address in the range given by this address' subnet Often referred to as the Network Address. srcstartAddressExclusive(): Address6β The first host address in the range given by this address's subnet ie the first address after the Network Address srcendAddress(): Address6β The last address in the range given by this address' subnet Often referred to as the Broadcast srcendAddressExclusive(): Address6β The last host address in the range given by this address's subnet ie the last address prior to the Broadcast Address srcsubnetMaskAddress(): Address6β The hex form of the subnet mask, e.g.ffff:ffff:ffff:ffff::for a/64. Returns anAddress6; call.correctForm()for the string. srcwildcardMask(): Address6β The Cisco-style wildcard mask, e.g.::ffff:ffff:ffff:fffffor a/64. This is the bitwise inverse ofsubnetMaskAddress(). Returns anAddress6; call.correctForm()for the string. srcnetworkForm(): stringβ The network address in CIDR string form, e.g.2001:db8::/32for2001:db8::1/32. For an address with no explicit subnet the prefix is/128, e.g.networkForm()on2001:db8::1returns2001:db8::1/128. srcgetScope(): stringβ Return the scope of the address. The 4-bit scope field (RFC 4291 Β§2.7) is only defined for multicast addresses; for unicast addresses the scope is derived from the address type per RFC 4007 Β§6. srcgetType(): stringβ Return the type of the address srcgetBits(start: number, end: number): bigintβ Return the bits in the given range as a BigInt srcgetBitsBase2(start: number, end: number): stringβ Return the bits in the given range as a base-2 string srcgetBitsBase16(start: number, end: number): stringβ Return the bits in the given range as a base-16 string srcgetBitsPastSubnet(): stringβ Return the bits that are set past the subnet mask length srcreverseForm(options?: ReverseFormOptions): stringβ Return the reversed ip6.arpa form of the address srccorrectForm(): stringβ Returns the address in correct form, per RFC 5952: leading zeros stripped, the longest run of zero groups collapsed to::, and hex digits lowercased (e.g.2001:db8::1). This is the recommended form for display. srcbinaryZeroPad(): stringβ Return a zero-padded base-2 string representation of the address srcparse4in6(address: string): stringβ Parses a v4-in-v6 string (e.g.::ffff:192.168.0.1) by extracting the trailing IPv4 address intothis.address4/this.parsedAddress4and returning the address with the v4 portion converted to two v6 groups. Used internally byparse(). srcparse(address: string): string[]β Parses an IPv6 address string into its 8 hexadecimal groups (expanding any::elision and any trailing v4-in-v6 portion) and stores the result onthis.parsedAddress. Called automatically by the constructor; you typically don't need to call it directly. ThrowsAddressErrorif the input is malformed. srccanonicalForm(): stringβ Returns the canonical (fully expanded) form of the address: all 8 groups, each padded to 4 hex digits, with no::collapsing (e.g.2001:0db8:0000:0000:0000:0000:0000:0001). Useful for sorting and byte-exact comparison. srcdecimal(): stringβ Return the decimal form of the address srcbigInt(): bigintβ Return the address as a BigInt srcto4(): Address4β Return the last two groups of this address as an IPv4 address string. If this address carries a CIDR prefix that covers the trailing 32 bits (i.e.subnetMask >= 96), the resultingAddress4inherits the corresponding v4 prefix (subnetMask - 96); otherwise it defaults to/32. srcto4in6(): stringβ Return the v4-in-v6 form of the address srcinspectTeredo(): TeredoPropertiesβ Decodes the Teredo tunneling fields embedded in this address. Returns the Teredo prefix, server IPv4, client IPv4, raw flag bits, cone-NAT flag, UDP port, and Microsoft-format flag breakdown (reserved, universal/local, group/individual, nonce). Only meaningful for addresses in2001::/32. srcinspect6to4(): SixToFourPropertiesβ Decodes the 6to4 tunneling fields embedded in this address. Returns the 6to4 prefix and the embedded IPv4 gateway address. Only meaningful for addresses in2002::/16. srcto6to4(): Address6 | nullβ Return a v6 6to4 address from a v6 v4inv6 address srctoAddress4Nat64(prefix: string): Address4 | nullβ Extract the embedded IPv4 address from a NAT64 IPv6 address using the encoding defined by RFC 6052. The default prefix is the well-known prefix64:ff9b::/96. Returnsnullif this address is not contained within the given prefix. srctoByteArray(): number[]β Return a byte array. To get a Node.jsBuffer, wrap the result:Buffer.from(address.toByteArray()). srctoUnsignedByteArray(): number[]β Return an unsigned byte array. To get a Node.jsBuffer, wrap the result:Buffer.from(address.toUnsignedByteArray()). srcisCanonical(): booleanβ Returns true if the address is in the canonical form, false otherwise srcisLinkLocal(): booleanβ Returns true if the address is a link local address, false otherwise srcisMulticast(): booleanβ Returns true if the address is a multicast address, false otherwise srcis4(): booleanβ Returns true if the address was written in v4-in-v6 dotted-quad notation (e.g.::ffff:127.0.0.1), false otherwise. This is a notation-level flag and does not reflect whether the address bits lie in the IPv4-mapped (::ffff:0:0/96) subnet β for that, see isMapped4. srcisMapped4(): booleanβ Returns true if the address is an IPv4-mapped IPv6 address in::ffff:0:0/96(RFC 4291 Β§2.5.5.2), false otherwise. Unlike is4, this checks the underlying address bits rather than the textual notation, so::ffff:127.0.0.1and::ffff:7f00:1both return true. srcisTeredo(): booleanβ Returns true if the address is a Teredo address, false otherwise srcis6to4(): booleanβ Returns true if the address is a 6to4 address, false otherwise srcisLoopback(): booleanβ Returns true if the address is a loopback address, false otherwise srcisULA(): booleanβ Returns true if the address is a Unique Local Address infc00::/7(RFC 4193). ULAs are the IPv6 equivalent of IPv4 RFC 1918 private addresses. srcisUnspecified(): booleanβ Returns true if the address is the unspecified address::. srcisDocumentation(): booleanβ Returns true if the address is in the documentation prefix2001:db8::/32(RFC 3849). srchref(optionalPort?: string | number): stringβ Returns the address as an HTTP URL with the host bracketed, e.g.http://[2001:db8::1]/. IfoptionalPortis provided it is appended, e.g.http://[2001:db8::1]:8080/. srclink(options?: { className?: string; prefix?: string; v4?: boolean }): stringβ Returns an HTML<a>element whosehrefencodes the address in a URL hash fragment (default prefix/#address=). Useful for linking between pages of an address-inspector UI. srcgroup(): stringβ Groups an address srcregularExpressionString(this: Address6, substringSearch: boolean): stringβ Generate a regular expression string that can be used to find or validate all variations of this address srcregularExpression(this: Address6, substringSearch: boolean): RegExpβ Generate a regular expression that can be used to find or validate all variations of this address. src
Properties
address4: Address4β srcaddress: stringβ srcaddressMinusSuffix: stringβ srcelidedGroups: numberβ srcelisionBegin: numberβ srcelisionEnd: numberβ srcgroups: numberβ srcparsedAddress4: stringβ srcparsedAddress: string[]β srcparsedSubnet: stringβ srcsubnet: stringβ srcsubnetMask: numberβ srcv4: booleanβ srczone: stringβ srcisInSubnet: (this: Address4 | Address6, address: Address4 | Address6) => booleanβ Returns true if the given address is in the subnet of the current address srcisCorrect: (this: Address4 | Address6) => booleanβ Returns true if the address is correct, false otherwise src
ip-address is downloaded ~66 million times per week, mostly via the Node proxy/agent ecosystem. The dependency chain runs through a handful of widely-used packages:
- socks (~53M weekly) β SOCKS4/5 client for Node; depends on
ip-addressdirectly. The single biggest source of downloads. - socks-proxy-agent (~57M weekly) β
http.Agentfor SOCKS proxies; depends onsocks. Bundled by virtually every CLI that respectsHTTPS_PROXY. - npm and pnpm β both bundle
socks-proxy-agentthrough their HTTP fetch stack (make-fetch-happenβ@npmcli/agent), so every Node install on the planet pulls inip-addressas a transitive dependency. - Puppeteer β
@puppeteer/browsersusesproxy-agentfor browser-binary downloads, which routes throughsocks-proxy-agentβsocksβip-address. - proxy-agent (~28M weekly) and pac-proxy-agent (~27M weekly) β auto-detecting proxy agents (HTTP/HTTPS/SOCKS/PAC) used widely in scraping, headless-browser, and CI tooling.
- cacache (~44M weekly) β npm's content-addressable cache; pulls in the same fetch stack.
Beyond the proxy chain, ip-address has been used by Juniper Networks' Contrail, Ably's proxy-protocol implementation, Rackspace's serialization framework, IPFS, and the SwitchyOmega Chrome extension, among many others.