geo: try resolve within node_modules

This commit is contained in:
Carl-Gerhard Lindesvärd
2025-12-10 21:02:44 +01:00
parent 9ccca322e5
commit 56bd1197a6

View File

@@ -1,4 +1,5 @@
import { readFile } from 'node:fs/promises'; import { readFile } from 'node:fs/promises';
import { createRequire } from 'node:module';
import path from 'node:path'; import path from 'node:path';
import { dirname } from 'node:path'; import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
@@ -29,11 +30,35 @@ async function loadDatabase(): Promise<ReaderModel | null> {
console.log('GeoLite2-City.mmdb loaded (local)', dbPathLocal); console.log('GeoLite2-City.mmdb loaded (local)', dbPathLocal);
return Reader.openBuffer(dbBuffer); return Reader.openBuffer(dbBuffer);
} catch { } catch {
console.error('GeoLite2-City.mmdb not found', { dbPath, dbPathLocal }); // Try node_modules resolution (for Vercel/serverless environments)
try {
const require = createRequire(import.meta.url);
// Resolve the package entry point, then find package.json relative to it
const packageEntry = require.resolve('@openpanel/geo');
let packageDir = path.dirname(packageEntry);
// Walk up to find package.json (package entry might be in src/ or dist/)
for (let i = 0; i < 3; i++) {
try {
await readFile(path.join(packageDir, 'package.json'));
break; // Found package.json
} catch {
packageDir = path.dirname(packageDir);
}
}
const nodeModulesPath = path.join(packageDir, filename);
const dbBuffer = await readFile(nodeModulesPath);
console.log(
'GeoLite2-City.mmdb loaded (node_modules)',
nodeModulesPath,
);
return Reader.openBuffer(dbBuffer);
} catch {
console.error('GeoLite2-City.mmdb not found (node_modules)');
return null; return null;
} }
} }
} }
}
function getReader(): Promise<ReaderModel | null> { function getReader(): Promise<ReaderModel | null> {
if (!readerPromise) { if (!readerPromise) {