@push.rocks/smartnetwork 4.4.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 +38 -32
- package/dist_ts/smartnetwork.classes.smartnetwork.js +129 -159
- 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 +8 -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 +152 -175
- package/ts/smartnetwork.plugins.ts +8 -12
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import * as plugins from './smartnetwork.plugins.js';
|
|
2
|
+
import { getLogger } from './logging.js';
|
|
3
|
+
// CDN URLs for GeoLite2 MMDB files (served via jsDelivr from npm packages)
|
|
4
|
+
const CITY_MMDB_URL = 'https://cdn.jsdelivr.net/npm/@ip-location-db/geolite2-city-mmdb/geolite2-city-ipv4.mmdb';
|
|
5
|
+
const ASN_MMDB_URL = 'https://cdn.jsdelivr.net/npm/@ip-location-db/geolite2-asn-mmdb/geolite2-asn-ipv4.mmdb';
|
|
6
|
+
// IANA bootstrap for RDAP
|
|
7
|
+
const IANA_BOOTSTRAP_IPV4_URL = 'https://data.iana.org/rdap/ipv4.json';
|
|
8
|
+
const DEFAULT_DB_MAX_AGE = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
9
|
+
const DEFAULT_TIMEOUT = 5000;
|
|
10
|
+
/**
|
|
11
|
+
* IpIntelligence provides IP address intelligence by combining three data sources:
|
|
12
|
+
* - RDAP (direct to RIRs) for registration/org data
|
|
13
|
+
* - Team Cymru DNS for ASN
|
|
14
|
+
* - MaxMind GeoLite2 (in-memory MMDB) for geolocation
|
|
15
|
+
*/
|
|
16
|
+
export class IpIntelligence {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.logger = getLogger();
|
|
19
|
+
// MaxMind readers (lazily initialized)
|
|
20
|
+
this.cityReader = null;
|
|
21
|
+
this.asnReader = null;
|
|
22
|
+
this.lastFetchTime = 0;
|
|
23
|
+
this.refreshPromise = null;
|
|
24
|
+
// RDAP bootstrap cache
|
|
25
|
+
this.bootstrapEntries = null;
|
|
26
|
+
this.bootstrapPromise = null;
|
|
27
|
+
this.dbMaxAge = options?.dbMaxAge ?? DEFAULT_DB_MAX_AGE;
|
|
28
|
+
this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get comprehensive IP intelligence for the given IP address.
|
|
32
|
+
* Runs RDAP, Team Cymru DNS, and MaxMind lookups in parallel.
|
|
33
|
+
*/
|
|
34
|
+
async getIntelligence(ip) {
|
|
35
|
+
const result = {
|
|
36
|
+
asn: null,
|
|
37
|
+
asnOrg: null,
|
|
38
|
+
registrantOrg: null,
|
|
39
|
+
registrantCountry: null,
|
|
40
|
+
networkRange: null,
|
|
41
|
+
abuseContact: null,
|
|
42
|
+
country: null,
|
|
43
|
+
countryCode: null,
|
|
44
|
+
city: null,
|
|
45
|
+
latitude: null,
|
|
46
|
+
longitude: null,
|
|
47
|
+
accuracyRadius: null,
|
|
48
|
+
timezone: null,
|
|
49
|
+
};
|
|
50
|
+
// Run all three layers in parallel
|
|
51
|
+
const [rdapResult, cymruResult, maxmindResult] = await Promise.allSettled([
|
|
52
|
+
this.queryRdap(ip),
|
|
53
|
+
this.queryTeamCymru(ip),
|
|
54
|
+
this.queryMaxMind(ip),
|
|
55
|
+
]);
|
|
56
|
+
// Merge RDAP results
|
|
57
|
+
if (rdapResult.status === 'fulfilled' && rdapResult.value) {
|
|
58
|
+
const rdap = rdapResult.value;
|
|
59
|
+
result.registrantOrg = rdap.registrantOrg;
|
|
60
|
+
result.registrantCountry = rdap.registrantCountry;
|
|
61
|
+
result.networkRange = rdap.networkRange;
|
|
62
|
+
result.abuseContact = rdap.abuseContact;
|
|
63
|
+
}
|
|
64
|
+
// Merge Team Cymru results (primary for ASN)
|
|
65
|
+
if (cymruResult.status === 'fulfilled' && cymruResult.value) {
|
|
66
|
+
const cymru = cymruResult.value;
|
|
67
|
+
result.asn = cymru.asn;
|
|
68
|
+
}
|
|
69
|
+
// Merge MaxMind results
|
|
70
|
+
if (maxmindResult.status === 'fulfilled' && maxmindResult.value) {
|
|
71
|
+
const mm = maxmindResult.value;
|
|
72
|
+
result.country = mm.country;
|
|
73
|
+
result.countryCode = mm.countryCode;
|
|
74
|
+
result.city = mm.city;
|
|
75
|
+
result.latitude = mm.latitude;
|
|
76
|
+
result.longitude = mm.longitude;
|
|
77
|
+
result.accuracyRadius = mm.accuracyRadius;
|
|
78
|
+
result.timezone = mm.timezone;
|
|
79
|
+
// Use MaxMind ASN as fallback if Team Cymru failed
|
|
80
|
+
if (result.asn === null && mm.asn !== null) {
|
|
81
|
+
result.asn = mm.asn;
|
|
82
|
+
}
|
|
83
|
+
if (mm.asnOrg) {
|
|
84
|
+
result.asnOrg = mm.asnOrg;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// If we got ASN from Team Cymru but not org, and MaxMind didn't provide org either,
|
|
88
|
+
// the asnOrg remains null (we don't do an additional lookup)
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
// ─── RDAP Subsystem ─────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Load and cache the IANA RDAP bootstrap file
|
|
94
|
+
*/
|
|
95
|
+
async ensureBootstrap() {
|
|
96
|
+
if (this.bootstrapEntries)
|
|
97
|
+
return;
|
|
98
|
+
if (this.bootstrapPromise) {
|
|
99
|
+
await this.bootstrapPromise;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.bootstrapPromise = (async () => {
|
|
103
|
+
try {
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(IANA_BOOTSTRAP_IPV4_URL, {
|
|
108
|
+
signal: controller.signal,
|
|
109
|
+
headers: { 'User-Agent': '@push.rocks/smartnetwork' },
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok)
|
|
112
|
+
throw new Error(`HTTP ${response.status}`);
|
|
113
|
+
const data = await response.json();
|
|
114
|
+
const entries = [];
|
|
115
|
+
for (const [prefixes, urls] of data.services) {
|
|
116
|
+
const baseUrl = urls[0]; // first URL is preferred
|
|
117
|
+
for (const prefix of prefixes) {
|
|
118
|
+
const [network, bits] = prefix.split('/');
|
|
119
|
+
entries.push({
|
|
120
|
+
prefix,
|
|
121
|
+
prefixNum: this.ipToNumber(network),
|
|
122
|
+
maskBits: parseInt(bits, 10),
|
|
123
|
+
baseUrl: baseUrl.replace(/\/$/, ''), // strip trailing slash
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Sort by mask bits descending for longest-prefix match
|
|
128
|
+
entries.sort((a, b) => b.maskBits - a.maskBits);
|
|
129
|
+
this.bootstrapEntries = entries;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
clearTimeout(timeoutId);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
this.logger.debug?.(`Failed to load RDAP bootstrap: ${err.message}`);
|
|
137
|
+
this.bootstrapEntries = []; // empty = all RDAP lookups will skip
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
await this.bootstrapPromise;
|
|
141
|
+
this.bootstrapPromise = null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Find the RDAP base URL for a given IP via longest-prefix match
|
|
145
|
+
*/
|
|
146
|
+
matchRir(ip) {
|
|
147
|
+
if (!this.bootstrapEntries || this.bootstrapEntries.length === 0)
|
|
148
|
+
return null;
|
|
149
|
+
const ipNum = this.ipToNumber(ip);
|
|
150
|
+
for (const entry of this.bootstrapEntries) {
|
|
151
|
+
const mask = (0xFFFFFFFF << (32 - entry.maskBits)) >>> 0;
|
|
152
|
+
if ((ipNum & mask) === (entry.prefixNum & mask)) {
|
|
153
|
+
return entry.baseUrl;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Query RDAP for registration data
|
|
160
|
+
*/
|
|
161
|
+
async queryRdap(ip) {
|
|
162
|
+
await this.ensureBootstrap();
|
|
163
|
+
const baseUrl = this.matchRir(ip);
|
|
164
|
+
if (!baseUrl)
|
|
165
|
+
return null;
|
|
166
|
+
const controller = new AbortController();
|
|
167
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
168
|
+
try {
|
|
169
|
+
const response = await fetch(`${baseUrl}/ip/${ip}`, {
|
|
170
|
+
signal: controller.signal,
|
|
171
|
+
headers: {
|
|
172
|
+
'Accept': 'application/rdap+json',
|
|
173
|
+
'User-Agent': '@push.rocks/smartnetwork',
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
if (!response.ok)
|
|
177
|
+
return null;
|
|
178
|
+
const data = await response.json();
|
|
179
|
+
let registrantOrg = null;
|
|
180
|
+
let registrantCountry = data.country || null;
|
|
181
|
+
let abuseContact = null;
|
|
182
|
+
// Parse network range
|
|
183
|
+
let networkRange = null;
|
|
184
|
+
if (data.cidr0_cidrs && data.cidr0_cidrs.length > 0) {
|
|
185
|
+
const cidr = data.cidr0_cidrs[0];
|
|
186
|
+
networkRange = `${cidr.v4prefix || cidr.v6prefix}/${cidr.length}`;
|
|
187
|
+
}
|
|
188
|
+
else if (data.startAddress && data.endAddress) {
|
|
189
|
+
networkRange = `${data.startAddress} - ${data.endAddress}`;
|
|
190
|
+
}
|
|
191
|
+
// Parse entities
|
|
192
|
+
if (data.entities && Array.isArray(data.entities)) {
|
|
193
|
+
for (const entity of data.entities) {
|
|
194
|
+
const roles = entity.roles || [];
|
|
195
|
+
if (roles.includes('registrant') || roles.includes('administrative')) {
|
|
196
|
+
const orgName = this.extractVcardFn(entity);
|
|
197
|
+
if (orgName)
|
|
198
|
+
registrantOrg = orgName;
|
|
199
|
+
// Try to get country from registrant address if not at top level
|
|
200
|
+
if (!registrantCountry) {
|
|
201
|
+
registrantCountry = this.extractVcardCountry(entity);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (roles.includes('abuse')) {
|
|
205
|
+
abuseContact = this.extractVcardEmail(entity);
|
|
206
|
+
// Check nested entities for abuse contact
|
|
207
|
+
if (!abuseContact && entity.entities) {
|
|
208
|
+
for (const subEntity of entity.entities) {
|
|
209
|
+
const subRoles = subEntity.roles || [];
|
|
210
|
+
if (subRoles.includes('abuse')) {
|
|
211
|
+
abuseContact = this.extractVcardEmail(subEntity);
|
|
212
|
+
if (abuseContact)
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return { registrantOrg, registrantCountry, networkRange, abuseContact };
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
this.logger.debug?.(`RDAP query failed for ${ip}: ${err.message}`);
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
clearTimeout(timeoutId);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Extract the 'fn' (formatted name) from an entity's vcardArray
|
|
232
|
+
*/
|
|
233
|
+
extractVcardFn(entity) {
|
|
234
|
+
if (!entity.vcardArray || !Array.isArray(entity.vcardArray))
|
|
235
|
+
return null;
|
|
236
|
+
const properties = entity.vcardArray[1];
|
|
237
|
+
if (!Array.isArray(properties))
|
|
238
|
+
return null;
|
|
239
|
+
for (const prop of properties) {
|
|
240
|
+
if (Array.isArray(prop) && prop[0] === 'fn') {
|
|
241
|
+
return prop[3] || null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Extract email from an entity's vcardArray
|
|
248
|
+
*/
|
|
249
|
+
extractVcardEmail(entity) {
|
|
250
|
+
if (!entity.vcardArray || !Array.isArray(entity.vcardArray))
|
|
251
|
+
return null;
|
|
252
|
+
const properties = entity.vcardArray[1];
|
|
253
|
+
if (!Array.isArray(properties))
|
|
254
|
+
return null;
|
|
255
|
+
for (const prop of properties) {
|
|
256
|
+
if (Array.isArray(prop) && prop[0] === 'email') {
|
|
257
|
+
return prop[3] || null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Extract country from an entity's vcardArray address field
|
|
264
|
+
*/
|
|
265
|
+
extractVcardCountry(entity) {
|
|
266
|
+
if (!entity.vcardArray || !Array.isArray(entity.vcardArray))
|
|
267
|
+
return null;
|
|
268
|
+
const properties = entity.vcardArray[1];
|
|
269
|
+
if (!Array.isArray(properties))
|
|
270
|
+
return null;
|
|
271
|
+
for (const prop of properties) {
|
|
272
|
+
if (Array.isArray(prop) && prop[0] === 'adr') {
|
|
273
|
+
// The label parameter often contains the full address with country at the end
|
|
274
|
+
const label = prop[1]?.label;
|
|
275
|
+
if (typeof label === 'string') {
|
|
276
|
+
const lines = label.split('\n');
|
|
277
|
+
const lastLine = lines[lines.length - 1]?.trim();
|
|
278
|
+
if (lastLine && lastLine.length > 1)
|
|
279
|
+
return lastLine;
|
|
280
|
+
}
|
|
281
|
+
// Also check the structured value (7-element array, last element is country)
|
|
282
|
+
const value = prop[3];
|
|
283
|
+
if (Array.isArray(value) && value.length >= 7 && value[6]) {
|
|
284
|
+
return value[6];
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
// ─── Team Cymru DNS Subsystem ───────────────────────────────────────
|
|
291
|
+
/**
|
|
292
|
+
* Query Team Cymru DNS for ASN information.
|
|
293
|
+
* Query format: reversed.ip.origin.asn.cymru.com TXT
|
|
294
|
+
* Response: "ASN | prefix | CC | rir | date"
|
|
295
|
+
*/
|
|
296
|
+
async queryTeamCymru(ip) {
|
|
297
|
+
try {
|
|
298
|
+
const reversed = ip.split('.').reverse().join('.');
|
|
299
|
+
const queryName = `${reversed}.origin.asn.cymru.com`;
|
|
300
|
+
const dnsClient = new plugins.smartdns.dnsClientMod.Smartdns({
|
|
301
|
+
strategy: 'prefer-system',
|
|
302
|
+
allowDohFallback: true,
|
|
303
|
+
timeoutMs: this.timeout,
|
|
304
|
+
});
|
|
305
|
+
const records = await dnsClient.getRecordsTxt(queryName);
|
|
306
|
+
if (!records || records.length === 0)
|
|
307
|
+
return null;
|
|
308
|
+
// Parse the first TXT record: "13335 | 1.1.1.0/24 | AU | apnic | 2011-08-11"
|
|
309
|
+
const txt = records[0].value || records[0].data;
|
|
310
|
+
if (!txt)
|
|
311
|
+
return null;
|
|
312
|
+
const parts = txt.split('|').map((s) => s.trim());
|
|
313
|
+
if (parts.length < 3)
|
|
314
|
+
return null;
|
|
315
|
+
const asn = parseInt(parts[0], 10);
|
|
316
|
+
if (isNaN(asn))
|
|
317
|
+
return null;
|
|
318
|
+
return {
|
|
319
|
+
asn,
|
|
320
|
+
prefix: parts[1] || '',
|
|
321
|
+
country: parts[2] || '',
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
this.logger.debug?.(`Team Cymru DNS query failed for ${ip}: ${err.message}`);
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// ─── MaxMind GeoLite2 Subsystem ─────────────────────────────────────
|
|
330
|
+
/**
|
|
331
|
+
* Ensure MMDB readers are initialized. Downloads on first call,
|
|
332
|
+
* triggers background refresh if stale.
|
|
333
|
+
*/
|
|
334
|
+
async ensureReaders() {
|
|
335
|
+
if (this.cityReader && this.asnReader) {
|
|
336
|
+
// Check if refresh needed
|
|
337
|
+
if (Date.now() - this.lastFetchTime > this.dbMaxAge && !this.refreshPromise) {
|
|
338
|
+
this.refreshPromise = this.downloadAndInitReaders()
|
|
339
|
+
.catch((err) => this.logger.debug?.(`Background MMDB refresh failed: ${err.message}`))
|
|
340
|
+
.finally(() => { this.refreshPromise = null; });
|
|
341
|
+
}
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
// First time: blocking download
|
|
345
|
+
if (this.refreshPromise) {
|
|
346
|
+
await this.refreshPromise;
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
this.refreshPromise = this.downloadAndInitReaders();
|
|
350
|
+
await this.refreshPromise;
|
|
351
|
+
this.refreshPromise = null;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Download MMDB files from CDN and create Reader instances
|
|
355
|
+
*/
|
|
356
|
+
async downloadAndInitReaders() {
|
|
357
|
+
const [cityBuffer, asnBuffer] = await Promise.all([
|
|
358
|
+
this.fetchBuffer(CITY_MMDB_URL),
|
|
359
|
+
this.fetchBuffer(ASN_MMDB_URL),
|
|
360
|
+
]);
|
|
361
|
+
this.cityReader = new plugins.maxmind.Reader(cityBuffer);
|
|
362
|
+
this.asnReader = new plugins.maxmind.Reader(asnBuffer);
|
|
363
|
+
this.lastFetchTime = Date.now();
|
|
364
|
+
this.logger.info?.('MaxMind MMDB databases loaded into memory');
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Fetch a URL and return the response as a Buffer
|
|
368
|
+
*/
|
|
369
|
+
async fetchBuffer(url) {
|
|
370
|
+
const response = await fetch(url, {
|
|
371
|
+
headers: { 'User-Agent': '@push.rocks/smartnetwork' },
|
|
372
|
+
});
|
|
373
|
+
if (!response.ok) {
|
|
374
|
+
throw new Error(`Failed to fetch ${url}: HTTP ${response.status}`);
|
|
375
|
+
}
|
|
376
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
377
|
+
return Buffer.from(arrayBuffer);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Query MaxMind for geo + ASN data
|
|
381
|
+
*/
|
|
382
|
+
async queryMaxMind(ip) {
|
|
383
|
+
try {
|
|
384
|
+
await this.ensureReaders();
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
this.logger.debug?.(`Failed to initialize MaxMind readers: ${err.message}`);
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
if (!this.cityReader || !this.asnReader)
|
|
391
|
+
return null;
|
|
392
|
+
let country = null;
|
|
393
|
+
let countryCode = null;
|
|
394
|
+
let city = null;
|
|
395
|
+
let latitude = null;
|
|
396
|
+
let longitude = null;
|
|
397
|
+
let accuracyRadius = null;
|
|
398
|
+
let timezone = null;
|
|
399
|
+
let asn = null;
|
|
400
|
+
let asnOrg = null;
|
|
401
|
+
// City lookup
|
|
402
|
+
try {
|
|
403
|
+
const cityResult = this.cityReader.get(ip);
|
|
404
|
+
if (cityResult) {
|
|
405
|
+
country = cityResult.country?.names?.en || null;
|
|
406
|
+
countryCode = cityResult.country?.iso_code || null;
|
|
407
|
+
city = cityResult.city?.names?.en || null;
|
|
408
|
+
latitude = cityResult.location?.latitude ?? null;
|
|
409
|
+
longitude = cityResult.location?.longitude ?? null;
|
|
410
|
+
accuracyRadius = cityResult.location?.accuracy_radius ?? null;
|
|
411
|
+
timezone = cityResult.location?.time_zone || null;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
this.logger.debug?.(`MaxMind city lookup failed for ${ip}: ${err.message}`);
|
|
416
|
+
}
|
|
417
|
+
// ASN lookup
|
|
418
|
+
try {
|
|
419
|
+
const asnResult = this.asnReader.get(ip);
|
|
420
|
+
if (asnResult) {
|
|
421
|
+
asn = asnResult.autonomous_system_number ?? null;
|
|
422
|
+
asnOrg = asnResult.autonomous_system_organization || null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (err) {
|
|
426
|
+
this.logger.debug?.(`MaxMind ASN lookup failed for ${ip}: ${err.message}`);
|
|
427
|
+
}
|
|
428
|
+
return { country, countryCode, city, latitude, longitude, accuracyRadius, timezone, asn, asnOrg };
|
|
429
|
+
}
|
|
430
|
+
// ─── Utilities ──────────────────────────────────────────────────────
|
|
431
|
+
/**
|
|
432
|
+
* Convert an IPv4 address string to a 32-bit unsigned number
|
|
433
|
+
*/
|
|
434
|
+
ipToNumber(ip) {
|
|
435
|
+
const parts = ip.split('.');
|
|
436
|
+
return (((parseInt(parts[0], 10) << 24) |
|
|
437
|
+
(parseInt(parts[1], 10) << 16) |
|
|
438
|
+
(parseInt(parts[2], 10) << 8) |
|
|
439
|
+
parseInt(parts[3], 10)) >>> 0);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRuZXR3b3JrLmNsYXNzZXMuaXBpbnRlbGxpZ2VuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydG5ldHdvcmsuY2xhc3Nlcy5pcGludGVsbGlnZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUF1Q3pDLDJFQUEyRTtBQUMzRSxNQUFNLGFBQWEsR0FBRyx5RkFBeUYsQ0FBQztBQUNoSCxNQUFNLFlBQVksR0FBRyx1RkFBdUYsQ0FBQztBQUU3RywwQkFBMEI7QUFDMUIsTUFBTSx1QkFBdUIsR0FBRyxzQ0FBc0MsQ0FBQztBQUV2RSxNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTO0FBQzdELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztBQVk3Qjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBZXpCLFlBQVksT0FBZ0M7UUFkM0IsV0FBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBSXRDLHVDQUF1QztRQUMvQixlQUFVLEdBQWdDLElBQUksQ0FBQztRQUMvQyxjQUFTLEdBQStCLElBQUksQ0FBQztRQUM3QyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixtQkFBYyxHQUF5QixJQUFJLENBQUM7UUFFcEQsdUJBQXVCO1FBQ2YscUJBQWdCLEdBQTZCLElBQUksQ0FBQztRQUNsRCxxQkFBZ0IsR0FBeUIsSUFBSSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFL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
|
|
@@ -133,4 +133,4 @@ export class PublicIp {
|
|
|
133
133
|
return ipv6Regex.test(ip) || ipv6CompressedRegex.test(ip);
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRuZXR3b3JrLmNsYXNzZXMucHVibGljaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydG5ldHdvcmsuY2xhc3Nlcy5wdWJsaWNpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBWXpDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxRQUFRO0lBMkJuQixZQUFZLE9BQThCO1FBMUJ6QixhQUFRLEdBQWdCO1lBQ3ZDO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLEtBQUssRUFBRSxtQ0FBbUM7Z0JBQzFDLEtBQUssRUFBRSxvQ0FBb0M7YUFDNUM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsS0FBSyxFQUFFLHFCQUFxQjtnQkFDNUIsS0FBSyxFQUFFLHFCQUFxQjthQUM3QjtZQUNEO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLEtBQUssRUFBRSx3QkFBd0I7YUFDaEM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLDRCQUE0QjtnQkFDbkMsS0FBSyxFQUFFLDRCQUE0QjthQUNwQztTQUNGLENBQUM7UUFHZSxXQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFHcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYTtRQUN4QixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7Z0JBQUUsU0FBUztZQUU3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9FLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLGlCQUFpQixPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzNELE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQywyQkFBMkIsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNuRixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUMvRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztnQkFBRSxTQUFTO1lBRTdCLElBQUksQ0FBQztnQkFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsaUJBQWlCLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0QsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLDJCQUEyQixPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFlBQVk7UUFDdkIsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3JCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUM5QixHQUFXLEVBQ1gsYUFBd0M7UUFFeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtnQkFDekIsT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRSwwQkFBMEI7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFN0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO2dCQUFTLENBQUM7WUFDVCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxFQUFVO1FBQzVCLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdEIsTUFBTSxTQUFTLEdBQUcseUJBQXlCLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvQixPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxFQUFVO1FBQzVCLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdEIscUVBQXFFO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLDRDQUE0QyxDQUFDO1FBQy9ELE1BQU0sbUJBQW1CLEdBQUcsMEVBQTBFLENBQUM7UUFFdkcsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command map for the rustnetwork IPC binary.
|
|
3
|
+
* Each key maps to { params, result } defining the typed IPC protocol.
|
|
4
|
+
*/
|
|
5
|
+
type TNetworkCommands = {
|
|
6
|
+
healthPing: {
|
|
7
|
+
params: Record<string, never>;
|
|
8
|
+
result: {
|
|
9
|
+
pong: boolean;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
ping: {
|
|
13
|
+
params: {
|
|
14
|
+
host: string;
|
|
15
|
+
count?: number;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
};
|
|
18
|
+
result: {
|
|
19
|
+
alive: boolean;
|
|
20
|
+
times: (number | null)[];
|
|
21
|
+
min: number | null;
|
|
22
|
+
max: number | null;
|
|
23
|
+
avg: number | null;
|
|
24
|
+
stddev: number | null;
|
|
25
|
+
packetLoss: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
traceroute: {
|
|
29
|
+
params: {
|
|
30
|
+
host: string;
|
|
31
|
+
maxHops?: number;
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
};
|
|
34
|
+
result: {
|
|
35
|
+
hops: Array<{
|
|
36
|
+
ttl: number;
|
|
37
|
+
ip: string;
|
|
38
|
+
rtt: number | null;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
tcpPortCheck: {
|
|
43
|
+
params: {
|
|
44
|
+
host: string;
|
|
45
|
+
port: number;
|
|
46
|
+
timeoutMs?: number;
|
|
47
|
+
};
|
|
48
|
+
result: {
|
|
49
|
+
isOpen: boolean;
|
|
50
|
+
latencyMs: number | null;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
isLocalPortFree: {
|
|
54
|
+
params: {
|
|
55
|
+
port: number;
|
|
56
|
+
};
|
|
57
|
+
result: {
|
|
58
|
+
free: boolean;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
defaultGateway: {
|
|
62
|
+
params: Record<string, never>;
|
|
63
|
+
result: {
|
|
64
|
+
interfaceName: string;
|
|
65
|
+
addresses: Array<{
|
|
66
|
+
family: string;
|
|
67
|
+
address: string;
|
|
68
|
+
}>;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Singleton bridge to the rustnetwork binary.
|
|
74
|
+
* Manages the IPC lifecycle for network diagnostics operations.
|
|
75
|
+
*/
|
|
76
|
+
export declare class RustNetworkBridge {
|
|
77
|
+
private static instance;
|
|
78
|
+
static getInstance(): RustNetworkBridge;
|
|
79
|
+
private bridge;
|
|
80
|
+
private constructor();
|
|
81
|
+
/**
|
|
82
|
+
* Spawn the Rust binary and wait for it to be ready.
|
|
83
|
+
*/
|
|
84
|
+
start(): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Kill the Rust binary.
|
|
87
|
+
*/
|
|
88
|
+
stop(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Ensure the bridge is running before sending a command.
|
|
91
|
+
*/
|
|
92
|
+
private ensureRunning;
|
|
93
|
+
ping(host: string, count?: number, timeoutMs?: number): Promise<TNetworkCommands['ping']['result']>;
|
|
94
|
+
traceroute(host: string, maxHops?: number, timeoutMs?: number): Promise<TNetworkCommands['traceroute']['result']>;
|
|
95
|
+
tcpPortCheck(host: string, port: number, timeoutMs?: number): Promise<TNetworkCommands['tcpPortCheck']['result']>;
|
|
96
|
+
isLocalPortFree(port: number): Promise<TNetworkCommands['isLocalPortFree']['result']>;
|
|
97
|
+
defaultGateway(): Promise<TNetworkCommands['defaultGateway']['result']>;
|
|
98
|
+
healthPing(): Promise<TNetworkCommands['healthPing']['result']>;
|
|
99
|
+
}
|
|
100
|
+
export {};
|