
Research
Two Malicious Rust Crates Impersonate Popular Logger to Steal Wallet Keys
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
@trap_stevo/geotide
Advanced tools
Fuses IP intelligence, reverse geocoding, and radio/Wi-Fi triangulation into a single, real-time, precision-crafted API. Trace a single packet’s origin, map a million connections, or power real-time location-aware apps with elegance, accuracy, and streami
The ultimate event-driven, precision-powered geolocation engine — from IP to doorstep, in real-time.
Fuses IP intelligence, reverse geocoding, and radio/Wi-Fi triangulation into a single, real-time, precision-crafted API.
Trace a single packet’s origin, map a million connections, or power real-time location-aware apps with elegance, accuracy, and streaming insight.
ipwhois
, ipapi
, ipinfo
, ipgeolocation
) with scoring and failoverRequirement | Version |
---|---|
Node.js | ≥ 19.x |
npm | ≥ 9.x (recommended) |
OS | Windows, macOS, Linux |
Method | Signature | Returns | Description | Async? |
---|---|---|---|---|
lookup(ip) | lookup(ip: string) | Promise<GeoResult | null> | Resolves a public IP into normalized location metadata. Uses provider race + scoring + TTL cache. | Yes |
lookupMany(ips, opts?) | lookupMany(ips: string[], opts?: { concurrency?: number }) | Promise<(GeoResult | null)[]> | Batch IP lookup with bounded concurrency (default = maxConcurrency ). | Yes |
reverse(lat, lon, opts?) | reverse(lat: number, lon: number, opts?: { deadlineMs?: number, cacheTtlMs?: number }) | Promise<ReverseResult | null> | Reverse-geocodes coordinates to a human address by racing Mapbox/Google/Nominatim with caching. | Yes |
getClientIP(req) | getClientIP(req: IncomingMessage | Express.Request) | string | null | Extracts the client's IP from HTTP request headers and connection info, supporting proxies and IPv6 normalization. | No |
on(event, handler) | on(event: GeoTideEvent, handler: (payload: any) => void) | this | Subscribe to real-time events (telemetry, results, cache hits, health). | No |
off(event, handler) | off(event: GeoTideEvent, handler: Function) | this | Unsubscribe a previously registered listener. | No |
type GeoResult = {
source: string; // provider name
ip: string;
city: string | null;
region: string | null;
country: string | null;
org: string | null;
isp: string | null;
loc: string | null; // "lat,lon"
timezone: string | null;
postal: string | null;
flag: string | null; // emoji when available
continent: string | null;
confidence: number; // 0..1
};
type ReverseResult = {
provider: string; // provider name
formatted: string;
components: any;
lat: number;
lon: number;
};
Event | Payload | Description |
---|---|---|
lookup:start | { ip } | A lookup has started. |
lookup:cache_hit | { ip, result } | Result served from cache. |
lookup:result | { ip, result } | Fresh lookup result returned. |
provider:success | { provider, ip, durationMs, score } | A provider returned data successfully. |
provider:fail | { provider, ip, error } | A provider failed. |
provider:unhealthy | { provider, reason } | Provider marked temporarily unhealthy. |
reverse:start | { lat, lon } | Reverse geocoding started. |
reverse:cache_hit | { lat, lon, result } | Reverse geocoding served from cache. |
reverse:result | { lat, lon, result } | Fresh reverse geocoding result returned. |
npm install @trap_stevo/geotide
const GeoTide = require("@trap_stevo/geotide");
const geo = new GeoTide({ enableGeoDebug : true });
const result = await geo.lookup("203.0.113.42");
console.log(result);
// {
// source: 'ipwhois',
// ip: '203.0.113.42',
// city: 'Sample City',
// region: 'Sample Region',
// country: 'Sample Country',
// org: 'Sample ISP Org',
// isp: 'Sample ISP',
// loc: '37.4221,-122.0841',
// timezone: 'America/Los_Angeles',
// postal: '94043',
// flag: '🌍',
// continent: 'North America',
// confidence: 1
// }
const results = await geo.lookupMany([
"203.0.113.42",
"8.8.8.8"
]);
console.log(results);
const address = await geo.reverse(40.712776, -74.005974);
console.log(address.formatted);
// "Example Building, 123 Example Street, Sample City, NY, United States"
geo.on("lookup:result", ({ ip, result }) => {
console.log(`[GeoTide] ${ip} → ${result.city}, ${result.country}`);
});
See License in LICENSE.md
🌊 GeoTide — The Pulse of the Planet, in Real-Time.
From the ocean of IPs to the pinpoint of a doorstep, GeoTide flows with accuracy, speed, and live awareness.
FAQs
Fuses IP intelligence, reverse geocoding, and radio/Wi-Fi triangulation into a single, real-time, precision-crafted API. Trace a single packet’s origin, map a million connections, or power real-time location-aware apps with elegance, accuracy, and streami
We found that @trap_stevo/geotide demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.