@chainsafe/netmask
Version:
Typescript implementation of netmask filtering
53 lines • 1.5 kB
JavaScript
import { parseIP } from "@chainsafe/is-ip/parse";
import { allFF, deepEqual } from "./util.js";
export const IPv4Len = 4;
export const IPv6Len = 16;
export const maxIPv6Octet = parseInt("0xFFFF", 16);
export const ipv4Prefix = new Uint8Array([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255,
]);
export function maskIp(ip, mask) {
if (mask.length === IPv6Len && ip.length === IPv4Len && allFF(mask, 0, 11)) {
mask = mask.slice(12);
}
if (mask.length === IPv4Len &&
ip.length === IPv6Len &&
deepEqual(ip, ipv4Prefix, 0, 11)) {
ip = ip.slice(12);
}
const n = ip.length;
if (n != mask.length) {
throw new Error("Failed to mask ip");
}
const out = new Uint8Array(n);
for (let i = 0; i < n; i++) {
out[i] = ip[i] & mask[i];
}
return out;
}
export function containsIp(net, ip) {
if (typeof ip === "string") {
ip = parseIP(ip);
}
if (ip == null)
throw new Error("Invalid ip");
if (ip.length !== net.network.length) {
return false;
}
for (let i = 0; i < ip.length; i++) {
if ((net.network[i] & net.mask[i]) !== (ip[i] & net.mask[i])) {
return false;
}
}
return true;
}
export function iPv4FromIPv6(ip) {
if (!isIPv4mappedIPv6(ip)) {
throw new Error("Must have 0xffff prefix");
}
return ip.slice(12);
}
export function isIPv4mappedIPv6(ip) {
return deepEqual(ip, ipv4Prefix, 0, 11);
}
//# sourceMappingURL=ip.js.map