@push.rocks/smartnetwork 4.3.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{npmextra.json → .smartconfig.json} +17 -5
- package/dist_rust/rustnetwork_linux_amd64 +0 -0
- package/dist_rust/rustnetwork_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/helpers/stats.js +1 -1
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/smartnetwork.classes.cloudflarespeed.js +32 -11
- package/dist_ts/smartnetwork.classes.ipintelligence.d.ts +101 -0
- package/dist_ts/smartnetwork.classes.ipintelligence.js +442 -0
- package/dist_ts/smartnetwork.classes.publicip.js +1 -1
- package/dist_ts/smartnetwork.classes.rustbridge.d.ts +100 -0
- package/dist_ts/smartnetwork.classes.rustbridge.js +98 -0
- package/dist_ts/smartnetwork.classes.smartnetwork.d.ts +40 -32
- package/dist_ts/smartnetwork.classes.smartnetwork.js +132 -152
- package/dist_ts/smartnetwork.plugins.d.ts +7 -10
- package/dist_ts/smartnetwork.plugins.js +9 -13
- package/package.json +19 -18
- package/readme.hints.md +60 -34
- package/readme.md +22 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers/stats.ts +1 -1
- package/ts/index.ts +3 -0
- package/ts/smartnetwork.classes.cloudflarespeed.ts +32 -16
- package/ts/smartnetwork.classes.ipintelligence.ts +542 -0
- package/ts/smartnetwork.classes.publicip.ts +2 -2
- package/ts/smartnetwork.classes.rustbridge.ts +181 -0
- package/ts/smartnetwork.classes.smartnetwork.ts +156 -164
- package/ts/smartnetwork.plugins.ts +8 -12
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as plugins from './smartnetwork.plugins.js';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function getPlatformSuffix() {
|
|
5
|
+
const platform = process.platform;
|
|
6
|
+
const arch = process.arch;
|
|
7
|
+
const platformMap = {
|
|
8
|
+
linux: 'linux',
|
|
9
|
+
darwin: 'macos',
|
|
10
|
+
win32: 'windows',
|
|
11
|
+
};
|
|
12
|
+
const archMap = {
|
|
13
|
+
x64: 'amd64',
|
|
14
|
+
arm64: 'arm64',
|
|
15
|
+
};
|
|
16
|
+
const p = platformMap[platform];
|
|
17
|
+
const a = archMap[arch];
|
|
18
|
+
if (p && a) {
|
|
19
|
+
return `${p}_${a}`;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Singleton bridge to the rustnetwork binary.
|
|
25
|
+
* Manages the IPC lifecycle for network diagnostics operations.
|
|
26
|
+
*/
|
|
27
|
+
export class RustNetworkBridge {
|
|
28
|
+
static { this.instance = null; }
|
|
29
|
+
static getInstance() {
|
|
30
|
+
if (!RustNetworkBridge.instance) {
|
|
31
|
+
RustNetworkBridge.instance = new RustNetworkBridge();
|
|
32
|
+
}
|
|
33
|
+
return RustNetworkBridge.instance;
|
|
34
|
+
}
|
|
35
|
+
constructor() {
|
|
36
|
+
const packageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
37
|
+
const platformSuffix = getPlatformSuffix();
|
|
38
|
+
const localPaths = [];
|
|
39
|
+
// Platform-specific cross-compiled binary
|
|
40
|
+
if (platformSuffix) {
|
|
41
|
+
localPaths.push(path.join(packageDir, 'dist_rust', `rustnetwork_${platformSuffix}`));
|
|
42
|
+
}
|
|
43
|
+
// Native build without suffix
|
|
44
|
+
localPaths.push(path.join(packageDir, 'dist_rust', 'rustnetwork'));
|
|
45
|
+
// Local dev paths
|
|
46
|
+
localPaths.push(path.join(packageDir, 'rust', 'target', 'release', 'rustnetwork'));
|
|
47
|
+
localPaths.push(path.join(packageDir, 'rust', 'target', 'debug', 'rustnetwork'));
|
|
48
|
+
this.bridge = new plugins.smartrust.RustBridge({
|
|
49
|
+
binaryName: 'rustnetwork',
|
|
50
|
+
cliArgs: ['--management'],
|
|
51
|
+
requestTimeoutMs: 30_000,
|
|
52
|
+
readyTimeoutMs: 10_000,
|
|
53
|
+
localPaths,
|
|
54
|
+
searchSystemPath: false,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Spawn the Rust binary and wait for it to be ready.
|
|
59
|
+
*/
|
|
60
|
+
async start() {
|
|
61
|
+
const ok = await this.bridge.spawn();
|
|
62
|
+
if (!ok) {
|
|
63
|
+
throw new Error('Failed to spawn rustnetwork binary');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Kill the Rust binary.
|
|
68
|
+
*/
|
|
69
|
+
async stop() {
|
|
70
|
+
this.bridge.kill();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Ensure the bridge is running before sending a command.
|
|
74
|
+
*/
|
|
75
|
+
async ensureRunning() {
|
|
76
|
+
// The bridge will throw if not spawned — we just call start() if not yet running
|
|
77
|
+
}
|
|
78
|
+
// ===== Command wrappers =====
|
|
79
|
+
async ping(host, count, timeoutMs) {
|
|
80
|
+
return this.bridge.sendCommand('ping', { host, count, timeoutMs });
|
|
81
|
+
}
|
|
82
|
+
async traceroute(host, maxHops, timeoutMs) {
|
|
83
|
+
return this.bridge.sendCommand('traceroute', { host, maxHops, timeoutMs });
|
|
84
|
+
}
|
|
85
|
+
async tcpPortCheck(host, port, timeoutMs) {
|
|
86
|
+
return this.bridge.sendCommand('tcpPortCheck', { host, port, timeoutMs });
|
|
87
|
+
}
|
|
88
|
+
async isLocalPortFree(port) {
|
|
89
|
+
return this.bridge.sendCommand('isLocalPortFree', { port });
|
|
90
|
+
}
|
|
91
|
+
async defaultGateway() {
|
|
92
|
+
return this.bridge.sendCommand('defaultGateway', {});
|
|
93
|
+
}
|
|
94
|
+
async healthPing() {
|
|
95
|
+
return this.bridge.sendCommand('healthPing', {});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRuZXR3b3JrLmNsYXNzZXMucnVzdGJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0bmV0d29yay5jbGFzc2VzLnJ1c3RicmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBOEN6QyxTQUFTLGlCQUFpQjtJQUN4QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFFMUIsTUFBTSxXQUFXLEdBQTJCO1FBQzFDLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87UUFDZixLQUFLLEVBQUUsU0FBUztLQUNqQixDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLEdBQUcsRUFBRSxPQUFPO1FBQ1osS0FBSyxFQUFFLE9BQU87S0FDZixDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7YUFDYixhQUFRLEdBQTZCLElBQUksQ0FBQztJQUVsRCxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsaUJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUlEO1FBQ0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUM1QyxJQUFJLENBQ0wsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBRWhDLDBDQUEwQztRQUMxQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGVBQWUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCw4QkFBOEI7UUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNuRSxrQkFBa0I7UUFDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ25GLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUVqRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQW1CO1lBQy9ELFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUN6QixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLGNBQWMsRUFBRSxNQUFNO1lBQ3RCLFVBQVU7WUFDVixnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsYUFBYTtRQUN6QixpRkFBaUY7SUFDbkYsQ0FBQztJQUVELCtCQUErQjtJQUV4QixLQUFLLENBQUMsSUFBSSxDQUNmLElBQVksRUFDWixLQUFjLEVBQ2QsU0FBa0I7UUFFbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQ3JCLElBQVksRUFDWixPQUFnQixFQUNoQixTQUFrQjtRQUVsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FDdkIsSUFBWSxFQUNaLElBQVksRUFDWixTQUFrQjtRQUVsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FDMUIsSUFBWTtRQUVaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN6QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsRUFBMkIsQ0FBQyxDQUFDO0lBQzVFLENBQUMifQ==
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import * as plugins from './smartnetwork.plugins.js';
|
|
2
|
-
|
|
3
|
-
* SmartNetwork simplifies actions within the network
|
|
4
|
-
*/
|
|
2
|
+
import { type IIpIntelligenceResult } from './smartnetwork.classes.ipintelligence.js';
|
|
5
3
|
/**
|
|
6
4
|
* Configuration options for SmartNetwork
|
|
7
5
|
*/
|
|
@@ -23,7 +21,13 @@ export interface Hop {
|
|
|
23
21
|
export interface IFindFreePortOptions {
|
|
24
22
|
/** If true, selects a random available port within the range instead of the first one */
|
|
25
23
|
randomize?: boolean;
|
|
24
|
+
/** Array of port numbers to exclude from the search */
|
|
25
|
+
exclude?: number[];
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* SmartNetwork simplifies actions within the network.
|
|
29
|
+
* Uses a Rust binary for system-dependent operations (ping, traceroute, port scanning, gateway detection).
|
|
30
|
+
*/
|
|
27
31
|
export declare class SmartNetwork {
|
|
28
32
|
/** Static registry for external plugins */
|
|
29
33
|
static pluginsRegistry: Map<string, any>;
|
|
@@ -33,10 +37,25 @@ export declare class SmartNetwork {
|
|
|
33
37
|
static unregisterPlugin(name: string): void;
|
|
34
38
|
private options;
|
|
35
39
|
private cache;
|
|
40
|
+
private rustBridge;
|
|
41
|
+
private bridgeStarted;
|
|
42
|
+
private ipIntelligence;
|
|
36
43
|
constructor(options?: SmartNetworkOptions);
|
|
37
44
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
45
|
+
* Start the Rust binary bridge. Must be called before using ping, traceroute,
|
|
46
|
+
* port scanning, or gateway operations. Safe to call multiple times.
|
|
47
|
+
*/
|
|
48
|
+
start(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Stop the Rust binary bridge.
|
|
51
|
+
*/
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Ensure the Rust bridge is running before sending commands.
|
|
55
|
+
*/
|
|
56
|
+
private ensureBridge;
|
|
57
|
+
/**
|
|
58
|
+
* Get network speed via Cloudflare speed test (pure TS, no Rust needed).
|
|
40
59
|
*/
|
|
41
60
|
getSpeed(opts?: {
|
|
42
61
|
parallelStreams?: number;
|
|
@@ -65,36 +84,16 @@ export declare class SmartNetwork {
|
|
|
65
84
|
timeout?: number;
|
|
66
85
|
count?: number;
|
|
67
86
|
}): Promise<any>;
|
|
68
|
-
/**
|
|
69
|
-
* returns a promise with a boolean answer
|
|
70
|
-
* note: false also resolves with false as argument
|
|
71
|
-
* @param port
|
|
72
|
-
*/
|
|
73
87
|
/**
|
|
74
88
|
* Check if a local port is unused (both IPv4 and IPv6)
|
|
75
89
|
*/
|
|
76
90
|
isLocalPortUnused(port: number): Promise<boolean>;
|
|
77
91
|
/**
|
|
78
92
|
* Find the first available port within a given range
|
|
79
|
-
* @param startPort The start of the port range (inclusive)
|
|
80
|
-
* @param endPort The end of the port range (inclusive)
|
|
81
|
-
* @param options Optional configuration for port selection behavior
|
|
82
|
-
* @returns The first available port number (or random if options.randomize is true), or null if no ports are available
|
|
83
93
|
*/
|
|
84
94
|
findFreePort(startPort: number, endPort: number, options?: IFindFreePortOptions): Promise<number | null>;
|
|
85
|
-
/**
|
|
86
|
-
* checks wether a remote port is available
|
|
87
|
-
* @param domainArg
|
|
88
|
-
*/
|
|
89
|
-
/**
|
|
90
|
-
* Check if a remote port is available
|
|
91
|
-
* @param target host or "host:port"
|
|
92
|
-
* @param opts options including port, protocol (only tcp), retries and timeout
|
|
93
|
-
*/
|
|
94
95
|
/**
|
|
95
96
|
* Check if a remote port is available
|
|
96
|
-
* @param target host or "host:port"
|
|
97
|
-
* @param portOrOpts either a port number (deprecated) or options object
|
|
98
97
|
*/
|
|
99
98
|
isRemotePortAvailable(target: string, portOrOpts?: number | {
|
|
100
99
|
port?: number;
|
|
@@ -103,22 +102,25 @@ export declare class SmartNetwork {
|
|
|
103
102
|
retries?: number;
|
|
104
103
|
}): Promise<boolean>;
|
|
105
104
|
/**
|
|
106
|
-
* List network interfaces (gateways)
|
|
105
|
+
* List network interfaces (gateways) — pure TS, no Rust needed.
|
|
107
106
|
*/
|
|
108
107
|
getGateways(): Promise<Record<string, plugins.os.NetworkInterfaceInfo[]>>;
|
|
108
|
+
/**
|
|
109
|
+
* Get the default gateway interface and its addresses.
|
|
110
|
+
*/
|
|
109
111
|
getDefaultGateway(): Promise<{
|
|
110
112
|
ipv4: plugins.os.NetworkInterfaceInfo;
|
|
111
113
|
ipv6: plugins.os.NetworkInterfaceInfo;
|
|
112
|
-
}>;
|
|
114
|
+
} | null>;
|
|
113
115
|
/**
|
|
114
|
-
* Lookup public IPv4 and IPv6
|
|
116
|
+
* Lookup public IPv4 and IPv6 — pure TS, no Rust needed.
|
|
115
117
|
*/
|
|
116
118
|
getPublicIps(): Promise<{
|
|
117
119
|
v4: string | null;
|
|
118
120
|
v6: string | null;
|
|
119
121
|
}>;
|
|
120
122
|
/**
|
|
121
|
-
* Resolve DNS records (A, AAAA, MX)
|
|
123
|
+
* Resolve DNS records (A, AAAA, MX) — uses smartdns, no Rust needed.
|
|
122
124
|
*/
|
|
123
125
|
resolveDns(host: string): Promise<{
|
|
124
126
|
A: string[];
|
|
@@ -129,23 +131,29 @@ export declare class SmartNetwork {
|
|
|
129
131
|
}[];
|
|
130
132
|
}>;
|
|
131
133
|
/**
|
|
132
|
-
* Perform a simple HTTP/HTTPS endpoint health check
|
|
134
|
+
* Perform a simple HTTP/HTTPS endpoint health check — pure TS.
|
|
133
135
|
*/
|
|
134
136
|
checkEndpoint(urlString: string, opts?: {
|
|
135
137
|
timeout?: number;
|
|
138
|
+
rejectUnauthorized?: boolean;
|
|
136
139
|
}): Promise<{
|
|
137
140
|
status: number;
|
|
138
141
|
headers: Record<string, string>;
|
|
139
142
|
rtt: number;
|
|
140
143
|
}>;
|
|
141
144
|
/**
|
|
142
|
-
* Perform a traceroute: hop-by-hop latency using the
|
|
143
|
-
* Falls back to a single-hop stub if traceroute is unavailable or errors.
|
|
145
|
+
* Perform a traceroute: hop-by-hop latency using the Rust binary.
|
|
144
146
|
*/
|
|
145
147
|
traceroute(host: string, opts?: {
|
|
146
148
|
maxHops?: number;
|
|
147
149
|
timeout?: number;
|
|
148
150
|
}): Promise<Hop[]>;
|
|
151
|
+
/**
|
|
152
|
+
* Get IP intelligence: ASN, organization, geolocation, and RDAP registration data.
|
|
153
|
+
* Combines RDAP (RIRs), Team Cymru DNS, and MaxMind GeoLite2 — all run in parallel.
|
|
154
|
+
* Pure TS, no Rust needed.
|
|
155
|
+
*/
|
|
156
|
+
getIpIntelligence(ip: string): Promise<IIpIntelligenceResult>;
|
|
149
157
|
/**
|
|
150
158
|
* Internal caching helper
|
|
151
159
|
*/
|