23 lines
951 B
JavaScript
23 lines
951 B
JavaScript
import IPCIDR from "ip-cidr";
|
|
import net from "node:net";
|
|
function normalizeIp(ip) {
|
|
let normalized = ip.split(",")[0]?.trim();
|
|
if (!normalized) return null;
|
|
if (normalized.startsWith("[") && normalized.includes("]")) {
|
|
normalized = normalized.slice(1, normalized.indexOf("]"));
|
|
}
|
|
if (net.isIP(normalized)) return normalized;
|
|
const ipv4WithPort = normalized.match(/^(\d{1,3}(?:\.\d{1,3}){3}):\d+$/);
|
|
if (ipv4WithPort && net.isIPv4(ipv4WithPort[1])) return ipv4WithPort[1];
|
|
return null;
|
|
}
|
|
export function getIpHash(ip) {
|
|
const normalized = normalizeIp(ip);
|
|
if (!normalized) return "ip-invalid";
|
|
// because a single person may control many IPv6 addresses,
|
|
// only a /64 subnet prefix of any IP will be taken into account.
|
|
// (this means for IPv4 the entire address is used)
|
|
const prefix = IPCIDR.createAddress(normalized).mask(64);
|
|
return `ip-${BigInt(`0b${prefix}`).toString(36)}`;
|
|
}
|