privateAddress

tcmts.atproto.privateAddress · #7jptnogb · term · runs on the server

uses node:net

Whether an IP address is one only this machine or its own network reaches: unspecified, loopback, private, link-local, carrier-grade NAT, benchmarking, multicast or reserved, unique-local, or an IPv4 address mapped into IPv6 that is one.

import { isIP } from "node:net";

export function privateAddress(ip: string): boolean {
  const v4 = isIP(ip) === 4 ? ip : /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(ip)?.[1];
  if (v4) {
    const [a, b] = v4.split(".").map(Number) as [number, number, number, number];
    return (
      a === 0 ||
      a === 10 ||
      a === 127 ||
      (a === 100 && b >= 64 && b < 128) ||
      (a === 169 && b === 254) ||
      (a === 172 && b >= 16 && b < 32) ||
      (a === 192 && b === 168) ||
      (a === 192 && b === 0) ||
      (a === 198 && (b === 18 || b === 19)) ||
      a >= 224
    );
  }
  const v6 = ip.toLowerCase();
  return (
    v6 === "::" ||
    v6 === "::1" ||
    /^f[cd]/.test(v6) ||
    /^fe[89ab]/.test(v6) ||
    v6.startsWith("ff") ||
    v6.startsWith("::ffff:") ||
    v6.startsWith("64:ff9b:") ||
    v6.startsWith("2001:db8")
  );
}

used by