A library that enables the usage of MaxmindDB geoIP databases by using the Rust library in a WebAssembly module
Uses the Rust MaxmindDB library to create a WASM binary that lets you query MaxMind databases directly in JavaScript/TypeScript.
- Node.js
- Deno
- Bun
- [/] Browser (tests are flaky, so not certain)
- [?] Cloudflare Workers (have not been able to get them to work locally, you can see the tests here)
npm install maxminddb-wasm
# or
pnpm add maxminddb-wasm
Deno (jsr)
import { Maxmind } from "jsr:@josh-hemphill/maxminddb-wasm/bundler";
import { readFile } from 'node:fs/promises';
import { Maxmind } from 'maxminddb-wasm/node-module';
const dbFile = await readFile('./GeoLite2-City.mmdb');
const maxmind = new Maxmind(dbFile);
const result = maxmind.lookup_city('8.8.8.8');
console.log(result);
import { Maxmind } from "jsr:@josh-hemphill/maxminddb-wasm/bundler";
const dbFile = await Deno.readFile('./GeoLite2-City.mmdb');
const maxmind = new Maxmind(dbFile);
const result = maxmind.lookup_city('8.8.8.8');
console.log(result);
import { Maxmind } from 'maxminddb-wasm/browser';
// Fetch the database file
const response = await fetch('/GeoLite2-City.mmdb');
const dbFile = new Uint8Array(await response.arrayBuffer());
const maxmind = new Maxmind(dbFile);
const result = maxmind.lookup_city('8.8.8.8');
import { Maxmind } from 'maxminddb-wasm/browser';
export default {
async fetch(request, env) {
const maxmind = new Maxmind(new Uint8Array(env.MAXMIND_DB));
const ip = request.headers.get('cf-connecting-ip');
const result = maxmind.lookup_city(ip);
return new Response(JSON.stringify(result));
}
};
import { Maxmind } from 'maxminddb-wasm/node-module';
const dbFile = await Bun.file('./GeoLite2-City.mmdb').arrayBuffer();
const maxmind = new Maxmind(new Uint8Array(dbFile));
const result = maxmind.lookup_city('8.8.8.8');
new Maxmind(dbFile: Uint8Array)
Creates a new Maxmind instance with the provided database file.
Looks up city information for the given IP address.
Looks up network prefix information for the given IP address.
Read-only property that returns database metadata.
interface CityResponse {
city?: CityRecord;
continent?: ContinentRecord;
country?: CountryRecord;
location?: LocationRecord;
}
interface CityRecord {
geoname_id?: number;
names?: Record<string, string>;
}
interface ContinentRecord {
code?: string;
geoname_id?: number;
names?: Record<string, string>;
}
interface CountryRecord {
geoname_id?: number;
iso_code?: string;
names?: Record<string, string>;
}
interface LocationRecord {
latitude?: number;
longitude?: number;
time_zone?: string;
}
interface PrefixResponse {
city: CityResponse;
prefix_length: number;
}
interface Metadata {
binary_format_major_version: number;
binary_format_minor_version: number;
build_epoch: number;
database_type: string;
description: Record<string, string>;
ip_version: number;
languages: string[];
node_count: number;
record_size: number;
}
For running the automated build (which includes compiling the rust wasm) you'll need the following tools installed:
Once you have all the necessary tools installed, you can just run pnpm build
Under tests/*
, there are tests for each platform that can be run with the pnpm test
command. On first run, it will download the test database from the Maxmind github repo.