Files
utools/backend/maxmind.js
2025-03-29 18:34:12 +01:00

56 lines
2.1 KiB
JavaScript

// backend/maxmind.js
const geoip = require('@maxmind/geoip2-node');
const pino = require('pino');
const Sentry = require("@sentry/node");
// Minimaler Logger für dieses Modul
const logger = pino({ level: process.env.LOG_LEVEL || 'info' });
let cityReaderInstance = null;
let asnReaderInstance = null;
async function initializeMaxMind() {
if (cityReaderInstance && asnReaderInstance) {
logger.debug('MaxMind databases already loaded.');
return { cityReader: cityReaderInstance, asnReader: asnReaderInstance };
}
try {
logger.info('Loading MaxMind databases...');
const cityDbPath = process.env.GEOIP_CITY_DB || './data/GeoLite2-City.mmdb';
const asnDbPath = process.env.GEOIP_ASN_DB || './data/GeoLite2-ASN.mmdb';
logger.info({ cityDbPath, asnDbPath }, 'Database paths');
// Verwende Promise.all für paralleles Laden
const [cityReader, asnReader] = await Promise.all([
geoip.Reader.open(cityDbPath),
geoip.Reader.open(asnDbPath)
]);
cityReaderInstance = cityReader;
asnReaderInstance = asnReader;
logger.info('MaxMind databases loaded successfully.');
return { cityReader: cityReaderInstance, asnReader: asnReaderInstance };
} catch (error) {
logger.fatal({ error: error.message, stack: error.stack }, 'Could not initialize MaxMind databases.');
Sentry.captureException(error);
// Wirf den Fehler weiter, damit der Serverstart fehlschlägt
throw error;
}
}
// Funktion zum Abrufen der Reader (stellt sicher, dass sie initialisiert wurden)
function getMaxMindReaders() {
if (!cityReaderInstance || !asnReaderInstance) {
// Dieser Fall sollte im normalen Betrieb nicht auftreten, da initialize() beim Serverstart aufgerufen wird.
logger.error('MaxMind readers accessed before initialization!');
throw new Error('MaxMind readers not initialized. Call initializeMaxMind() first.');
}
return { cityReader: cityReaderInstance, asnReader: asnReaderInstance };
}
module.exports = {
initializeMaxMind,
getMaxMindReaders,
};