@e9x/ipi
Version:
A free library/cli tool to get IP information.
56 lines (55 loc) • 2.01 kB
JavaScript
;
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;