UNPKG

get-client-ip

Version:

Get your client IP address more easily

113 lines (105 loc) 3.28 kB
'use strict'; var net = require('net'); var isValidIP = function (ip) { return net.isIP(ip) === 4 || net.isIP(ip) === 6; }; var handleArray = function (results) { if (!results) return null; if (!Array.isArray(results)) return null; if (results.length === 0) return null; var ips = results.filter(function (ip) { return typeof ip === "string" && isValidIP(ip.trim()); }); if (ips.length > 0) { console.log("ips", ips); return ips[0].trim(); } return null; }; var handleResults = function (results) { if (!results) return null; if (Array.isArray(results)) { var ip = handleArray(results); if (ip) return ip; } if (typeof results === "string") { if (results.includes(",")) { var ip = handleArray(results.split(",")); if (ip) return ip; } if (isValidIP(results)) return results; } return null; }; var 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", ]; var getIPFromHeaders = function (req) { //Validate headers if (!("headers" in req)) return null; if (!req.headers) return null; if (typeof req.headers !== "object") return null; var headers = req.headers; //looking for the first IP header req.headers.forwarded if (headers.forwarded && typeof headers.forwarded === "string") { var ip = handleResults(headers.forwarded); if (ip) return ip; } //Looking through each custom header and returns the valid one for (var _i = 0, customHeaders_1 = customHeaders; _i < customHeaders_1.length; _i++) { var customHeader = customHeaders_1[_i]; if (headers[customHeader]) { var ip = handleResults(headers[customHeader]); if (ip) return ip; } } return null; }; var getClientIp = function (request) { //Validate request if (!request) return null; if (typeof request !== "object") return null; var req = request; //Getting IP from headers var 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; }; module.exports = getClientIp;