UNPKG

@e9x/ipi

Version:

A free library/cli tool to get IP information.

56 lines (55 loc) 2.01 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const conditionIP_js_1 = __importDefault(require("./conditionIP.js")); const ipi_databases_1 = require("@e9x/ipi-databases"); const better_sqlite3_1 = __importDefault(require("better-sqlite3")); const ip2location_nodejs_1 = require("ip2location-nodejs"); const ipaddr_js_1 = __importDefault(require("ipaddr.js")); const splitIP = (ip) => { if (ip.kind() === "ipv4") return [...ip.toByteArray()]; return [ ...new Uint32Array(new Uint8Array(ip.toByteArray().reverse()).buffer).reverse(), ]; }; const il = new ip2location_nodejs_1.IP2Location(); const asnDB = new better_sqlite3_1.default(ipi_databases_1.ip2asnPath, { readonly: true }); il.open(ipi_databases_1.ip2locationPath); const select = asnDB.prepare(`SELECT description,id FROM asn WHERE version = :version AND ${conditionIP_js_1.default} LIMIT 1;`); /** * * Returns information about the IP * @param ip IP address * @returns If successful, IP information, otherwise undefined. */ const ipInfo = (ip) => { const parsedIP = ipaddr_js_1.default.parse(ip); const split = splitIP(parsedIP); const data = select.get({ version: parsedIP.kind() === "ipv4" ? 4 : 6, ip1: split[0], ip2: split[1], ip3: split[2], ip4: split[3], }); if (!data) return; // not routed const geoData = il.getAll(parsedIP.toString()); return { success: true, asn: data.id, asd: data.description, city: geoData.city, region: geoData.region, zipCode: geoData.zipCode, timezone: geoData.timeZone, latitude: Number(geoData.latitude), longitude: Number(geoData.longitude), countryLong: geoData.countryLong, countryShort: geoData.countryShort, }; }; exports.default = ipInfo;