get-client-ip
Version:
📍 A Lightweight Utility for Extracting the Real Client IP Address from Incoming HTTP Requests
69 lines (66 loc) • 1.94 kB
JavaScript
;
var net = require('net');
// src/index.ts
function $isIP(ip) {
return typeof ip === "string" && net.isIP(ip) !== 0;
}
var LOOKUP_HEADERS = [
"x-client-ip",
"x-forwarded-for",
"forwarded-for",
"x-forwarded",
"x-real-ip",
"cf-connecting-ip",
"true-client-ip",
"x-cluster-client-ip",
"fastly-client-ip",
"x-appengine-user-ip",
"cf-pseudo-ipv4"
];
function $extractIpFromHeaders(req) {
if ($isIP(req.ip)) return [req.ip];
if (!req.headers) return null;
if ($isIP(req.headers.forwarded)) return [req.headers.forwarded];
for (let i = 0; i < LOOKUP_HEADERS.length; i++) {
const ip = req.headers[LOOKUP_HEADERS[i]];
if (!ip) continue;
if (Array.isArray(ip)) {
const filteredIps = ip.filter((item) => $isIP(item.trim()));
if (filteredIps.length > 0) return filteredIps.map((item) => item.trim());
}
if (typeof ip === "string") {
if ($isIP(ip.trim())) return [ip.trim()];
if (!ip.includes(",")) continue;
const filteredIps = ip.split(",").filter((ip2) => $isIP(ip2.trim()));
if (filteredIps.length > 0) {
return filteredIps.map((item) => item.trim());
}
}
}
return null;
}
function getClientIp(req, res, next) {
if (!req) throw new Error("Request is undefined");
const ips = $extractIpFromHeaders(req);
if (ips && ips.length > 0) {
req.clientIp = ips[0];
req.clientIps = ips;
next?.();
return ips[0];
}
if ($isIP(req.socket.remoteAddress)) {
req.clientIp = req.socket.remoteAddress;
req.clientIps = [req.socket.remoteAddress];
next?.();
return req.socket.remoteAddress;
}
if ($isIP(req.connection.remoteAddress)) {
req.clientIp = req.connection.remoteAddress;
req.clientIps = [req.connection.remoteAddress];
next?.();
return req.connection.remoteAddress;
}
}
exports.getClientIp = getClientIp;
//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map