mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 15:58:38 +01:00
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import fs from 'fs';
|
|
|
|
const ipsData = JSON.parse(fs.readFileSync('./dist/ipv4-db.json', 'utf8'));
|
|
const countriesData = JSON.parse(fs.readFileSync('./dist/countries-db.json', 'utf8'));
|
|
|
|
function inRange(ip: string, cidr: string) {
|
|
const [subnet, mask] = cidr.split('/');
|
|
const ipBytes = ip.split('.').map(Number);
|
|
const subnetBytes = subnet.split('.').map(Number);
|
|
|
|
const ipInt = (ipBytes[0] << 24) | (ipBytes[1] << 16) | (ipBytes[2] << 8) | ipBytes[3];
|
|
const subnetInt = (subnetBytes[0] << 24) | (subnetBytes[1] << 16) | (subnetBytes[2] << 8) | subnetBytes[3];
|
|
|
|
const maskInt = 0xffffffff << (32 - parseInt(mask));
|
|
|
|
return (ipInt & maskInt) === (subnetInt & maskInt);
|
|
}
|
|
|
|
function getCountryFromId(id: number) {
|
|
for (const country of countriesData) {
|
|
if (country[0] == id) {
|
|
return country;
|
|
}
|
|
}
|
|
}
|
|
|
|
export function lookup(ip: string) {
|
|
try {
|
|
const startPiece = parseInt(ip.split('.')[0]);
|
|
for (const target of ipsData) {
|
|
const matchingStartPiece = target[0] == startPiece;
|
|
if (!matchingStartPiece) continue;
|
|
if (!inRange(ip, target[1])) continue;
|
|
const country = getCountryFromId(target[2]);
|
|
return [country[1], country[2]];
|
|
}
|
|
return ['??', '??'];
|
|
} catch (ex) {
|
|
console.error('ERROR DURING LOOKUP', ex);
|
|
return ['??', '??'];
|
|
}
|
|
} |