UNPKG

get-client-ip

Version:

Get your client IP address more easily

110 lines (103 loc) 3.14 kB
import { isIP } from 'net'; const isValidIP = (ip) => isIP(ip) === 4 || isIP(ip) === 6; const handleArray = (results) => { if (!results) return null; if (!Array.isArray(results)) return null; if (results.length === 0) return null; const ips = results.filter((ip) => typeof ip === "string" && isValidIP(ip.trim())); if (ips.length > 0) { console.log("ips", ips); return ips[0].trim(); } return null; }; const handleResults = (results) => { if (!results) return null; if (Array.isArray(results)) { const ip = handleArray(results); if (ip) return ip; } if (typeof results === "string") { if (results.includes(",")) { const ip = handleArray(results.split(",")); if (ip) return ip; } if (isValidIP(results)) return results; } return null; }; const customHeaders = [ "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", ]; const getIPFromHeaders = (req) => { //Validate headers if (!("headers" in req)) return null; if (!req.headers) return null; if (typeof req.headers !== "object") return null; const { headers } = req; //looking for the first IP header req.headers.forwarded if (headers.forwarded && typeof headers.forwarded === "string") { const ip = handleResults(headers.forwarded); if (ip) return ip; } //Looking through each custom header and returns the valid one for (const customHeader of customHeaders) { if (headers[customHeader]) { const ip = handleResults(headers[customHeader]); if (ip) return ip; } } return null; }; const getClientIp = (request) => { //Validate request if (!request) return null; if (typeof request !== "object") return null; const req = request; //Getting IP from headers const ip = getIPFromHeaders(req); if (ip) return ip; //Getting IP from socket if (req.socket && req.socket.remoteAddress && typeof req.socket.remoteAddress === "string") { if (isValidIP(req.socket.remoteAddress)) return req.socket.remoteAddress; } if (req.info && req.info.remoteAddress && typeof req.info.remoteAddress === "string") { if (isValidIP(req.info.remoteAddress)) return req.info.remoteAddress; } if (req.requestContext && req.requestContext.identity && req.requestContext.identity.sourceIp && typeof req.requestContext.identity.sourceIp === "string") { if (isValidIP(req.requestContext.identity.sourceIp)) return req.requestContext.identity.sourceIp; } return null; }; export { getClientIp as default };