|
|
"use strict"; |
|
|
|
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { |
|
|
if (k2 === undefined) k2 = k; |
|
|
var desc = Object.getOwnPropertyDescriptor(m, k); |
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { |
|
|
desc = { enumerable: true, get: function() { return m[k]; } }; |
|
|
} |
|
|
Object.defineProperty(o, k2, desc); |
|
|
}) : (function(o, m, k, k2) { |
|
|
if (k2 === undefined) k2 = k; |
|
|
o[k2] = m[k]; |
|
|
})); |
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { |
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v }); |
|
|
}) : function(o, v) { |
|
|
o["default"] = v; |
|
|
}); |
|
|
var __importStar = (this && this.__importStar) || function (mod) { |
|
|
if (mod && mod.__esModule) return mod; |
|
|
var result = {}; |
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); |
|
|
__setModuleDefault(result, mod); |
|
|
return result; |
|
|
}; |
|
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
|
exports.Address4 = void 0; |
|
|
const common = __importStar(require("./common")); |
|
|
const constants = __importStar(require("./v4/constants")); |
|
|
const address_error_1 = require("./address-error"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Address4 { |
|
|
constructor(address) { |
|
|
this.groups = constants.GROUPS; |
|
|
this.parsedAddress = []; |
|
|
this.parsedSubnet = ''; |
|
|
this.subnet = '/32'; |
|
|
this.subnetMask = 32; |
|
|
this.v4 = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.isCorrect = common.isCorrect(constants.BITS); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.isInSubnet = common.isInSubnet; |
|
|
this.address = address; |
|
|
const subnet = constants.RE_SUBNET_STRING.exec(address); |
|
|
if (subnet) { |
|
|
this.parsedSubnet = subnet[0].replace('/', ''); |
|
|
this.subnetMask = parseInt(this.parsedSubnet, 10); |
|
|
this.subnet = `/${this.subnetMask}`; |
|
|
if (this.subnetMask < 0 || this.subnetMask > constants.BITS) { |
|
|
throw new address_error_1.AddressError('Invalid subnet mask.'); |
|
|
} |
|
|
address = address.replace(constants.RE_SUBNET_STRING, ''); |
|
|
} |
|
|
this.addressMinusSuffix = address; |
|
|
this.parsedAddress = this.parse(address); |
|
|
} |
|
|
static isValid(address) { |
|
|
try { |
|
|
|
|
|
new Address4(address); |
|
|
return true; |
|
|
} |
|
|
catch (e) { |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
parse(address) { |
|
|
const groups = address.split('.'); |
|
|
if (!address.match(constants.RE_ADDRESS)) { |
|
|
throw new address_error_1.AddressError('Invalid IPv4 address.'); |
|
|
} |
|
|
return groups; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
correctForm() { |
|
|
return this.parsedAddress.map((part) => parseInt(part, 10)).join('.'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static fromHex(hex) { |
|
|
const padded = hex.replace(/:/g, '').padStart(8, '0'); |
|
|
const groups = []; |
|
|
let i; |
|
|
for (i = 0; i < 8; i += 2) { |
|
|
const h = padded.slice(i, i + 2); |
|
|
groups.push(parseInt(h, 16)); |
|
|
} |
|
|
return new Address4(groups.join('.')); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static fromInteger(integer) { |
|
|
return Address4.fromHex(integer.toString(16)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static fromArpa(arpaFormAddress) { |
|
|
|
|
|
const leader = arpaFormAddress.replace(/(\.in-addr\.arpa)?\.$/, ''); |
|
|
const address = leader.split('.').reverse().join('.'); |
|
|
return new Address4(address); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
toHex() { |
|
|
return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
toArray() { |
|
|
return this.parsedAddress.map((part) => parseInt(part, 10)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
toGroup6() { |
|
|
const output = []; |
|
|
let i; |
|
|
for (i = 0; i < constants.GROUPS; i += 2) { |
|
|
output.push(`${common.stringToPaddedHex(this.parsedAddress[i])}${common.stringToPaddedHex(this.parsedAddress[i + 1])}`); |
|
|
} |
|
|
return output.join(':'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bigInt() { |
|
|
return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_startAddress() { |
|
|
return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
startAddress() { |
|
|
return Address4.fromBigInt(this._startAddress()); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
startAddressExclusive() { |
|
|
const adjust = BigInt('1'); |
|
|
return Address4.fromBigInt(this._startAddress() + adjust); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_endAddress() { |
|
|
return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endAddress() { |
|
|
return Address4.fromBigInt(this._endAddress()); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endAddressExclusive() { |
|
|
const adjust = BigInt('1'); |
|
|
return Address4.fromBigInt(this._endAddress() - adjust); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static fromBigInt(bigInt) { |
|
|
return Address4.fromHex(bigInt.toString(16)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mask(mask) { |
|
|
if (mask === undefined) { |
|
|
mask = this.subnetMask; |
|
|
} |
|
|
return this.getBitsBase2(0, mask); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getBitsBase2(start, end) { |
|
|
return this.binaryZeroPad().slice(start, end); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reverseForm(options) { |
|
|
if (!options) { |
|
|
options = {}; |
|
|
} |
|
|
const reversed = this.correctForm().split('.').reverse().join('.'); |
|
|
if (options.omitSuffix) { |
|
|
return reversed; |
|
|
} |
|
|
return `${reversed}.in-addr.arpa.`; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isMulticast() { |
|
|
return this.isInSubnet(new Address4('224.0.0.0/4')); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
binaryZeroPad() { |
|
|
return this.bigInt().toString(2).padStart(constants.BITS, '0'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
groupForV6() { |
|
|
const segments = this.parsedAddress; |
|
|
return this.address.replace(constants.RE_ADDRESS, `<span class="hover-group group-v4 group-6">${segments |
|
|
.slice(0, 2) |
|
|
.join('.')}</span>.<span class="hover-group group-v4 group-7">${segments |
|
|
.slice(2, 4) |
|
|
.join('.')}</span>`); |
|
|
} |
|
|
} |
|
|
exports.Address4 = Address4; |
|
|
|