| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // src/utils/ipaddr.ts
- var expandIPv6 = (ipV6) => {
- const sections = ipV6.split(":");
- if (IPV4_REGEX.test(sections.at(-1))) {
- sections.splice(
- -1,
- 1,
- ...convertIPv6BinaryToString(convertIPv4ToBinary(sections.at(-1))).substring(2).split(":")
- // => ['7f00', '0001']
- );
- }
- for (let i = 0; i < sections.length; i++) {
- const node = sections[i];
- if (node !== "") {
- sections[i] = node.padStart(4, "0");
- } else {
- sections[i + 1] === "" && sections.splice(i + 1, 1);
- sections[i] = new Array(8 - sections.length + 1).fill("0000").join(":");
- }
- }
- return sections.join(":");
- };
- var IPV4_OCTET_PART = "(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])";
- var IPV4_REGEX = new RegExp(`^(?:${IPV4_OCTET_PART}\\.){3}${IPV4_OCTET_PART}$`);
- var distinctRemoteAddr = (remoteAddr) => {
- if (IPV4_REGEX.test(remoteAddr)) {
- return "IPv4";
- }
- if (remoteAddr.includes(":")) {
- return "IPv6";
- }
- };
- var convertIPv4ToBinary = (ipv4) => {
- const parts = ipv4.split(".");
- let result = 0n;
- for (let i = 0; i < 4; i++) {
- result <<= 8n;
- result += BigInt(parts[i]);
- }
- return result;
- };
- var convertIPv6ToBinary = (ipv6) => {
- const sections = expandIPv6(ipv6).split(":");
- let result = 0n;
- for (let i = 0; i < 8; i++) {
- result <<= 16n;
- result += BigInt(parseInt(sections[i], 16));
- }
- return result;
- };
- var convertIPv4BinaryToString = (ipV4) => {
- const sections = [];
- for (let i = 0; i < 4; i++) {
- sections.push(ipV4 >> BigInt(8 * (3 - i)) & 0xffn);
- }
- return sections.join(".");
- };
- var isIPv4MappedIPv6 = (ipv6binary) => ipv6binary >> 32n === 0xffffn;
- var convertIPv4MappedIPv6ToIPv4 = (ipv6binary) => ipv6binary & 0xffffffffn;
- var convertIPv6BinaryToString = (ipV6) => {
- if (isIPv4MappedIPv6(ipV6)) {
- return `::ffff:${convertIPv4BinaryToString(convertIPv4MappedIPv6ToIPv4(ipV6))}`;
- }
- const sections = [];
- for (let i = 0; i < 8; i++) {
- sections.push((ipV6 >> BigInt(16 * (7 - i)) & 0xffffn).toString(16));
- }
- let currentZeroStart = -1;
- let maxZeroStart = -1;
- let maxZeroEnd = -1;
- for (let i = 0; i < 8; i++) {
- if (sections[i] === "0") {
- if (currentZeroStart === -1) {
- currentZeroStart = i;
- }
- } else {
- if (currentZeroStart > -1) {
- if (i - currentZeroStart > maxZeroEnd - maxZeroStart) {
- maxZeroStart = currentZeroStart;
- maxZeroEnd = i;
- }
- currentZeroStart = -1;
- }
- }
- }
- if (currentZeroStart > -1) {
- if (8 - currentZeroStart > maxZeroEnd - maxZeroStart) {
- maxZeroStart = currentZeroStart;
- maxZeroEnd = 8;
- }
- }
- if (maxZeroStart !== -1) {
- sections.splice(maxZeroStart, maxZeroEnd - maxZeroStart, ":");
- }
- return sections.join(":").replace(/:{2,}/g, "::");
- };
- export {
- convertIPv4BinaryToString,
- convertIPv4MappedIPv6ToIPv4,
- convertIPv4ToBinary,
- convertIPv6BinaryToString,
- convertIPv6ToBinary,
- distinctRemoteAddr,
- expandIPv6,
- isIPv4MappedIPv6
- };
|