UNPKG

ip-subnet

Version:

A library of IP Subnetting utility functions

64 lines (63 loc) 1.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CIDR = void 0; const ip_1 = require("./ip"); class CIDR { constructor(networkAddress, prefixLength) { if (prefixLength > 0 && prefixLength <= 32) { this._prefixLength = prefixLength; this._netMask = this.calculateNetMask(prefixLength); this._networkAddress = networkAddress.getNetworkAddress(this._netMask); } else { throw new Error(`Invalid prefix length: ${prefixLength}. It should be between 0-32`); } } toString() { return `${this.networkAddress}/${this.prefixLength}`; } calculateOctetMask(bitsUsed) { let octetMask = 0; if (bitsUsed !== 0) { for (let i = 1; i <= bitsUsed; i++) { octetMask += Math.pow(2, 8 - i); } } return octetMask; } calculateNetMask(prefixLength) { const netMask = []; for (let i = 0; i < 4; i++) { let bitsUsed = 8; if (prefixLength === 0) { netMask.push(0); continue; } if (this._prefixLength < 8) { bitsUsed = prefixLength; } netMask.push(this.calculateOctetMask(bitsUsed)); prefixLength -= bitsUsed; } return new ip_1.IP(netMask.join('.')); } get netMask() { return this._netMask; } get networkAddress() { return this._networkAddress; } get prefixLength() { return this._prefixLength; } static parse(cidr) { const c = cidr.split('/'); const prefixLength = +c[1]; const ipAddress = new ip_1.IP(c[0]); if (c.length !== 2 || isNaN(prefixLength) || prefixLength < 0 || prefixLength > 32) { throw new Error(`Invalid CIDR: ${cidr}`); } return new CIDR(ipAddress, prefixLength); } } exports.CIDR = CIDR;