ip-subnet
Version:
A library of IP Subnetting utility functions
64 lines (63 loc) • 1.99 kB
JavaScript
;
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;