UNPKG

@chainsafe/netmask

Version:

Typescript implementation of netmask filtering

85 lines 2.03 kB
import { IPv4Len, IPv6Len } from "./ip.js"; export function allFF(a, from, to) { let i = 0; for (const e of a) { if (i < from) continue; if (i > to) break; if (e !== 0xff) return false; i++; } return true; } export function deepEqual(a, b, from, to) { let i = 0; for (const e of a) { if (i < from) continue; if (i > to) break; if (e !== b[i]) return false; i++; } return true; } /*** * Returns long ip format */ export function ipToString(ip) { switch (ip.length) { case IPv4Len: { return ip.join("."); } case IPv6Len: { const result = []; for (let i = 0; i < ip.length; i++) { if (i % 2 === 0) { result.push(ip[i].toString(16).padStart(2, "0") + ip[i + 1].toString(16).padStart(2, "0")); } } return result.join(":"); } default: { throw new Error("Invalid ip length"); } } } /** * If mask is a sequence of 1 bits followed by 0 bits, return number of 1 bits else -1 */ export function simpleMaskLength(mask) { let ones = 0; // eslint-disable-next-line prefer-const for (let [index, byte] of mask.entries()) { if (byte === 0xff) { ones += 8; continue; } while ((byte & 0x80) != 0) { ones++; byte = byte << 1; } if ((byte & 0x80) != 0) { return -1; } for (let i = index + 1; i < mask.length; i++) { if (mask[i] != 0) { return -1; } } break; } return ones; } export function maskToHex(mask) { let hex = "0x"; for (const byte of mask) { hex += (byte >> 4).toString(16) + (byte & 0x0f).toString(16); } return hex; } //# sourceMappingURL=util.js.map