cidrv4Merge(cidrs: readonly Cidrv4[]): Cidrv4[]
Merges IPv4 CIDR blocks into the minimal covering set.
Takes an array of possibly overlapping, adjacent, or redundant CIDR blocks and returns the minimal set of non-overlapping CIDR prefix blocks covering the exact same address space.
The result matches the dialect of the inputs. When they disagree, it is in MaskedCidrv4 form (ADR 0006).
Compact a firewall allowlist
Compact a firewall allowlist
import { assertEquals } from "@std/assert"; import { cidrv4Merge, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const rules = [ parseCidrv4("10.0.1.0/24"), parseCidrv4("10.0.0.0/24"), parseCidrv4("10.0.0.128/25"), ]; const compacted = cidrv4Merge(rules); assertEquals(compacted.map(stringifyCidrv4), ["10.0.0.0/23"]);
Aggregate routes
Aggregate routes
import { assertEquals } from "@std/assert"; import { cidrv4Merge, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const routes = [ parseCidrv4("198.51.100.0/25"), parseCidrv4("198.51.100.128/26"), parseCidrv4("198.51.100.192/26"), parseCidrv4("203.0.113.0/24"), ]; assertEquals(cidrv4Merge(routes).map(stringifyCidrv4), [ "198.51.100.0/24", "203.0.113.0/24", ]);
Masked blocks merge to masked blocks
Masked blocks merge to masked blocks
import { assertEquals } from "@std/assert"; import { cidrv4Merge, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const halves = [ { address: 167772160, mask: 0xFFFFFF80 }, { address: 167772288, mask: 0xFFFFFF80 }, ]; assertEquals(cidrv4Merge(halves).map(stringifyCidrv4), ["10.0.0.0/255.255.255.0"]);
cidrs: readonly Cidrv4[]
The CIDR blocks to merge
Cidrv4[]
Minimal set of non-overlapping CIDR blocks, sorted by address