@push.rocks/smartnetwork 4.9.0 → 4.10.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/dist_rust/rustnetwork_linux_amd64 +0 -0
- package/dist_rust/rustnetwork_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/smartnetwork.classes.domainintelligence.d.ts +13 -58
- package/dist_ts/smartnetwork.classes.domainintelligence.js +45 -319
- package/dist_ts/smartnetwork.classes.ipintelligence.d.ts +3 -34
- package/dist_ts/smartnetwork.classes.ipintelligence.js +18 -281
- package/dist_ts/smartnetwork.plugins.d.ts +2 -1
- package/dist_ts/smartnetwork.plugins.js +3 -2
- package/package.json +5 -4
- package/readme.md +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartnetwork.classes.domainintelligence.ts +48 -341
- package/ts/smartnetwork.classes.ipintelligence.ts +19 -310
- package/ts/smartnetwork.plugins.ts +2 -1
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartnetwork',
|
|
6
|
-
version: '4.
|
|
6
|
+
version: '4.10.0',
|
|
7
7
|
description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDhGQUE4RjtDQUM1RyxDQUFBIn0=
|
|
@@ -53,14 +53,14 @@ export interface IDomainIntelligenceOptions {
|
|
|
53
53
|
dnsClient?: TSmartdnsClient;
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* DomainIntelligence performs RDAP lookups for domain names
|
|
57
|
-
*
|
|
56
|
+
* DomainIntelligence performs RDAP lookups for domain names via
|
|
57
|
+
* @push.rocks/smartwhois, which resolves the correct registry RDAP endpoint
|
|
58
|
+
* per TLD through the IANA DNS bootstrap.
|
|
58
59
|
*/
|
|
59
60
|
export declare class DomainIntelligence {
|
|
60
61
|
private readonly logger;
|
|
61
62
|
private readonly timeout;
|
|
62
|
-
private
|
|
63
|
-
private bootstrapPromise;
|
|
63
|
+
private readonly rdapClient;
|
|
64
64
|
private readonly sharedDnsClient;
|
|
65
65
|
constructor(options?: IDomainIntelligenceOptions);
|
|
66
66
|
/**
|
|
@@ -75,51 +75,22 @@ export declare class DomainIntelligence {
|
|
|
75
75
|
*/
|
|
76
76
|
getIntelligence(domain: string): Promise<IDomainIntelligenceResult>;
|
|
77
77
|
/**
|
|
78
|
-
* Run the full RDAP lookup flow for a pre-normalized domain
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
78
|
+
* Run the full RDAP lookup flow for a pre-normalized domain via the
|
|
79
|
+
* smartwhois RdapClient. Returns the parsed RDAP fields (as a full
|
|
80
|
+
* IDomainIntelligenceResult) or null if any step fails, the TLD has no
|
|
81
|
+
* RDAP support, or the registry reports the domain as not registered.
|
|
82
82
|
*/
|
|
83
83
|
private queryRdapLayer;
|
|
84
|
+
/**
|
|
85
|
+
* Map a smartwhois RDAP domain record onto the IDomainIntelligenceResult
|
|
86
|
+
* shape (RDAP fields only; DNS enrichment fields stay null here).
|
|
87
|
+
*/
|
|
88
|
+
private mapRdapRecord;
|
|
84
89
|
/**
|
|
85
90
|
* Normalize a domain to lowercased ASCII punycode form. Returns null for
|
|
86
91
|
* obviously invalid input.
|
|
87
92
|
*/
|
|
88
93
|
private normalizeDomain;
|
|
89
|
-
/**
|
|
90
|
-
* Extract the TLD as the last dot-separated label.
|
|
91
|
-
*/
|
|
92
|
-
private extractTld;
|
|
93
|
-
/**
|
|
94
|
-
* Load and cache the IANA DNS bootstrap file.
|
|
95
|
-
*/
|
|
96
|
-
private ensureBootstrap;
|
|
97
|
-
/**
|
|
98
|
-
* Find the RDAP base URL for a given TLD via direct lookup.
|
|
99
|
-
*/
|
|
100
|
-
private matchTld;
|
|
101
|
-
/**
|
|
102
|
-
* Perform the RDAP HTTP query for a domain.
|
|
103
|
-
*/
|
|
104
|
-
private queryRdap;
|
|
105
|
-
private parseRdapResponse;
|
|
106
|
-
/**
|
|
107
|
-
* Pull registration / expiration / last changed timestamps from an
|
|
108
|
-
* RDAP `events` array.
|
|
109
|
-
*/
|
|
110
|
-
private extractEvents;
|
|
111
|
-
/**
|
|
112
|
-
* Extract registrar identity (name, IANA ID) and a nested abuse contact.
|
|
113
|
-
*/
|
|
114
|
-
private extractRegistrar;
|
|
115
|
-
/**
|
|
116
|
-
* Extract registrant org/country from entities array.
|
|
117
|
-
*/
|
|
118
|
-
private extractRegistrant;
|
|
119
|
-
/**
|
|
120
|
-
* Map an RDAP nameservers[] array to a list of lowercased ldhName strings.
|
|
121
|
-
*/
|
|
122
|
-
private extractNameservers;
|
|
123
94
|
/**
|
|
124
95
|
* Run DNS record lookups for the given domain using smartdns. Queries
|
|
125
96
|
* NS/A/AAAA/MX/TXT/SOA in parallel via Promise.allSettled — failures in
|
|
@@ -150,21 +121,5 @@ export declare class DomainIntelligence {
|
|
|
150
121
|
* value as the exchange with priority=null so the result is still useful.
|
|
151
122
|
*/
|
|
152
123
|
private parseMxRecords;
|
|
153
|
-
/**
|
|
154
|
-
* Extract the 'fn' (formatted name) from an entity's vcardArray
|
|
155
|
-
*/
|
|
156
|
-
private extractVcardFn;
|
|
157
|
-
/**
|
|
158
|
-
* Extract email from an entity's vcardArray
|
|
159
|
-
*/
|
|
160
|
-
private extractVcardEmail;
|
|
161
|
-
/**
|
|
162
|
-
* Extract telephone number from an entity's vcardArray
|
|
163
|
-
*/
|
|
164
|
-
private extractVcardTel;
|
|
165
|
-
/**
|
|
166
|
-
* Extract country from an entity's vcardArray address field
|
|
167
|
-
*/
|
|
168
|
-
private extractVcardCountry;
|
|
169
124
|
}
|
|
170
125
|
export {};
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { domainToASCII } from 'node:url';
|
|
2
2
|
import * as plugins from './smartnetwork.plugins.js';
|
|
3
3
|
import { getLogger } from './logging.js';
|
|
4
|
-
// IANA bootstrap for domain RDAP
|
|
5
|
-
const IANA_BOOTSTRAP_DNS_URL = 'https://data.iana.org/rdap/dns.json';
|
|
6
4
|
const DEFAULT_TIMEOUT = 5000;
|
|
7
5
|
/**
|
|
8
6
|
* Build an empty result object with all fields nulled.
|
|
@@ -32,17 +30,20 @@ function emptyResult(domain = null) {
|
|
|
32
30
|
};
|
|
33
31
|
}
|
|
34
32
|
/**
|
|
35
|
-
* DomainIntelligence performs RDAP lookups for domain names
|
|
36
|
-
*
|
|
33
|
+
* DomainIntelligence performs RDAP lookups for domain names via
|
|
34
|
+
* @push.rocks/smartwhois, which resolves the correct registry RDAP endpoint
|
|
35
|
+
* per TLD through the IANA DNS bootstrap.
|
|
37
36
|
*/
|
|
38
37
|
export class DomainIntelligence {
|
|
39
38
|
constructor(options) {
|
|
40
39
|
this.logger = getLogger();
|
|
41
|
-
// Bootstrap cache: tld (lowercased) -> RDAP base URL (without trailing slash)
|
|
42
|
-
this.bootstrapEntries = null;
|
|
43
|
-
this.bootstrapPromise = null;
|
|
44
40
|
this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
45
41
|
this.sharedDnsClient = options?.dnsClient ?? null;
|
|
42
|
+
this.rdapClient = new plugins.smartwhois.RdapClient({
|
|
43
|
+
requestTimeoutMs: this.timeout,
|
|
44
|
+
totalTimeoutMs: this.timeout,
|
|
45
|
+
userAgent: '@push.rocks/smartnetwork',
|
|
46
|
+
});
|
|
46
47
|
}
|
|
47
48
|
/**
|
|
48
49
|
* Get comprehensive domain intelligence. Runs RDAP and DNS lookups in
|
|
@@ -86,25 +87,46 @@ export class DomainIntelligence {
|
|
|
86
87
|
}
|
|
87
88
|
return result;
|
|
88
89
|
}
|
|
89
|
-
// ─── RDAP Layer (
|
|
90
|
+
// ─── RDAP Layer (delegated to @push.rocks/smartwhois) ───────────────
|
|
90
91
|
/**
|
|
91
|
-
* Run the full RDAP lookup flow for a pre-normalized domain
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
92
|
+
* Run the full RDAP lookup flow for a pre-normalized domain via the
|
|
93
|
+
* smartwhois RdapClient. Returns the parsed RDAP fields (as a full
|
|
94
|
+
* IDomainIntelligenceResult) or null if any step fails, the TLD has no
|
|
95
|
+
* RDAP support, or the registry reports the domain as not registered.
|
|
95
96
|
*/
|
|
96
97
|
async queryRdapLayer(domain) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (!rdapData)
|
|
98
|
+
try {
|
|
99
|
+
const rdapRecord = await this.rdapClient.lookupDomain(domain);
|
|
100
|
+
if (!rdapRecord || !rdapRecord.isRegistered)
|
|
101
|
+
return null;
|
|
102
|
+
return this.mapRdapRecord(domain, rdapRecord);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
this.logger.debug?.(`RDAP query failed for ${domain}: ${err.message}`);
|
|
106
106
|
return null;
|
|
107
|
-
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Map a smartwhois RDAP domain record onto the IDomainIntelligenceResult
|
|
111
|
+
* shape (RDAP fields only; DNS enrichment fields stay null here).
|
|
112
|
+
*/
|
|
113
|
+
mapRdapRecord(domain, record) {
|
|
114
|
+
const result = emptyResult(domain);
|
|
115
|
+
result.handle = record.handle ?? null;
|
|
116
|
+
result.status = record.statuses && record.statuses.length > 0 ? record.statuses : null;
|
|
117
|
+
result.registrationDate = record.createdDate ?? null;
|
|
118
|
+
result.expirationDate = record.expiryDate ?? null;
|
|
119
|
+
result.lastChangedDate = record.updatedDate ?? null;
|
|
120
|
+
result.registrarName = record.registrar ?? null;
|
|
121
|
+
result.registrarIanaId = record.registrarIanaId ?? null;
|
|
122
|
+
result.registrantOrg = record.registrantOrg ?? null;
|
|
123
|
+
result.registrantCountry = record.registrantCountry ?? null;
|
|
124
|
+
result.abuseEmail = record.abuseEmail ?? null;
|
|
125
|
+
result.abusePhone = record.abusePhone ?? null;
|
|
126
|
+
result.nameservers =
|
|
127
|
+
record.nameservers && record.nameservers.length > 0 ? record.nameservers : null;
|
|
128
|
+
result.dnssec = record.dnssec ?? null;
|
|
129
|
+
return result;
|
|
108
130
|
}
|
|
109
131
|
// ─── Normalization & TLD extraction ─────────────────────────────────
|
|
110
132
|
/**
|
|
@@ -134,221 +156,6 @@ export class DomainIntelligence {
|
|
|
134
156
|
return null;
|
|
135
157
|
return ascii;
|
|
136
158
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Extract the TLD as the last dot-separated label.
|
|
139
|
-
*/
|
|
140
|
-
extractTld(domain) {
|
|
141
|
-
const idx = domain.lastIndexOf('.');
|
|
142
|
-
if (idx < 0 || idx === domain.length - 1)
|
|
143
|
-
return null;
|
|
144
|
-
return domain.slice(idx + 1);
|
|
145
|
-
}
|
|
146
|
-
// ─── Bootstrap Subsystem ────────────────────────────────────────────
|
|
147
|
-
/**
|
|
148
|
-
* Load and cache the IANA DNS bootstrap file.
|
|
149
|
-
*/
|
|
150
|
-
async ensureBootstrap() {
|
|
151
|
-
if (this.bootstrapEntries)
|
|
152
|
-
return;
|
|
153
|
-
if (this.bootstrapPromise) {
|
|
154
|
-
await this.bootstrapPromise;
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
this.bootstrapPromise = (async () => {
|
|
158
|
-
try {
|
|
159
|
-
const controller = new AbortController();
|
|
160
|
-
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
161
|
-
try {
|
|
162
|
-
const response = await fetch(IANA_BOOTSTRAP_DNS_URL, {
|
|
163
|
-
signal: controller.signal,
|
|
164
|
-
headers: { 'User-Agent': '@push.rocks/smartnetwork' },
|
|
165
|
-
});
|
|
166
|
-
if (!response.ok)
|
|
167
|
-
throw new Error(`HTTP ${response.status}`);
|
|
168
|
-
const data = (await response.json());
|
|
169
|
-
const entries = new Map();
|
|
170
|
-
for (const [tlds, urls] of data.services) {
|
|
171
|
-
const baseUrl = urls[0]; // first URL is preferred
|
|
172
|
-
if (!baseUrl)
|
|
173
|
-
continue;
|
|
174
|
-
const cleanBase = baseUrl.replace(/\/$/, ''); // strip trailing slash
|
|
175
|
-
for (const tld of tlds) {
|
|
176
|
-
entries.set(tld.toLowerCase(), cleanBase);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
this.bootstrapEntries = entries;
|
|
180
|
-
}
|
|
181
|
-
finally {
|
|
182
|
-
clearTimeout(timeoutId);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
catch (err) {
|
|
186
|
-
this.logger.debug?.(`Failed to load DNS RDAP bootstrap: ${err.message}`);
|
|
187
|
-
this.bootstrapEntries = new Map(); // empty = all RDAP lookups will skip
|
|
188
|
-
}
|
|
189
|
-
})();
|
|
190
|
-
await this.bootstrapPromise;
|
|
191
|
-
this.bootstrapPromise = null;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Find the RDAP base URL for a given TLD via direct lookup.
|
|
195
|
-
*/
|
|
196
|
-
matchTld(tld) {
|
|
197
|
-
if (!this.bootstrapEntries || this.bootstrapEntries.size === 0)
|
|
198
|
-
return null;
|
|
199
|
-
return this.bootstrapEntries.get(tld.toLowerCase()) ?? null;
|
|
200
|
-
}
|
|
201
|
-
// ─── RDAP Query ─────────────────────────────────────────────────────
|
|
202
|
-
/**
|
|
203
|
-
* Perform the RDAP HTTP query for a domain.
|
|
204
|
-
*/
|
|
205
|
-
async queryRdap(domain, baseUrl) {
|
|
206
|
-
const controller = new AbortController();
|
|
207
|
-
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
208
|
-
try {
|
|
209
|
-
const response = await fetch(`${baseUrl}/domain/${encodeURIComponent(domain)}`, {
|
|
210
|
-
signal: controller.signal,
|
|
211
|
-
headers: {
|
|
212
|
-
'Accept': 'application/rdap+json',
|
|
213
|
-
'User-Agent': '@push.rocks/smartnetwork',
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
if (!response.ok)
|
|
217
|
-
return null;
|
|
218
|
-
return await response.json();
|
|
219
|
-
}
|
|
220
|
-
catch (err) {
|
|
221
|
-
this.logger.debug?.(`RDAP query failed for ${domain}: ${err.message}`);
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
finally {
|
|
225
|
-
clearTimeout(timeoutId);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// ─── RDAP Response Parsing ──────────────────────────────────────────
|
|
229
|
-
parseRdapResponse(domain, data) {
|
|
230
|
-
const result = emptyResult(domain);
|
|
231
|
-
if (typeof data.handle === 'string')
|
|
232
|
-
result.handle = data.handle;
|
|
233
|
-
if (Array.isArray(data.status) && data.status.length > 0) {
|
|
234
|
-
result.status = data.status.filter((s) => typeof s === 'string');
|
|
235
|
-
}
|
|
236
|
-
// Events: registration / expiration / last changed
|
|
237
|
-
if (Array.isArray(data.events)) {
|
|
238
|
-
const events = this.extractEvents(data.events);
|
|
239
|
-
result.registrationDate = events.registration;
|
|
240
|
-
result.expirationDate = events.expiration;
|
|
241
|
-
result.lastChangedDate = events.lastChanged;
|
|
242
|
-
}
|
|
243
|
-
// Registrar (sponsor) and registrant from entities
|
|
244
|
-
if (Array.isArray(data.entities)) {
|
|
245
|
-
const registrar = this.extractRegistrar(data.entities);
|
|
246
|
-
result.registrarName = registrar.name;
|
|
247
|
-
result.registrarIanaId = registrar.ianaId;
|
|
248
|
-
result.abuseEmail = registrar.abuseEmail;
|
|
249
|
-
result.abusePhone = registrar.abusePhone;
|
|
250
|
-
const registrant = this.extractRegistrant(data.entities);
|
|
251
|
-
result.registrantOrg = registrant.org;
|
|
252
|
-
result.registrantCountry = registrant.country;
|
|
253
|
-
}
|
|
254
|
-
// Nameservers
|
|
255
|
-
if (Array.isArray(data.nameservers)) {
|
|
256
|
-
result.nameservers = this.extractNameservers(data.nameservers);
|
|
257
|
-
}
|
|
258
|
-
// DNSSEC: secureDNS.delegationSigned
|
|
259
|
-
if (data.secureDNS && typeof data.secureDNS.delegationSigned === 'boolean') {
|
|
260
|
-
result.dnssec = data.secureDNS.delegationSigned;
|
|
261
|
-
}
|
|
262
|
-
return result;
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Pull registration / expiration / last changed timestamps from an
|
|
266
|
-
* RDAP `events` array.
|
|
267
|
-
*/
|
|
268
|
-
extractEvents(events) {
|
|
269
|
-
let registration = null;
|
|
270
|
-
let expiration = null;
|
|
271
|
-
let lastChanged = null;
|
|
272
|
-
for (const ev of events) {
|
|
273
|
-
const action = typeof ev?.eventAction === 'string' ? ev.eventAction.toLowerCase() : '';
|
|
274
|
-
const date = typeof ev?.eventDate === 'string' ? ev.eventDate : null;
|
|
275
|
-
if (!date)
|
|
276
|
-
continue;
|
|
277
|
-
if (action === 'registration')
|
|
278
|
-
registration = date;
|
|
279
|
-
else if (action === 'expiration')
|
|
280
|
-
expiration = date;
|
|
281
|
-
else if (action === 'last changed')
|
|
282
|
-
lastChanged = date;
|
|
283
|
-
}
|
|
284
|
-
return { registration, expiration, lastChanged };
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Extract registrar identity (name, IANA ID) and a nested abuse contact.
|
|
288
|
-
*/
|
|
289
|
-
extractRegistrar(entities) {
|
|
290
|
-
let name = null;
|
|
291
|
-
let ianaId = null;
|
|
292
|
-
let abuseEmail = null;
|
|
293
|
-
let abusePhone = null;
|
|
294
|
-
for (const entity of entities) {
|
|
295
|
-
const roles = Array.isArray(entity?.roles) ? entity.roles : [];
|
|
296
|
-
if (!roles.includes('registrar'))
|
|
297
|
-
continue;
|
|
298
|
-
name = this.extractVcardFn(entity);
|
|
299
|
-
// IANA Registrar ID lives in publicIds[]
|
|
300
|
-
if (Array.isArray(entity.publicIds)) {
|
|
301
|
-
for (const pid of entity.publicIds) {
|
|
302
|
-
if (pid && typeof pid === 'object' && pid.type === 'IANA Registrar ID') {
|
|
303
|
-
const parsed = parseInt(String(pid.identifier), 10);
|
|
304
|
-
if (!isNaN(parsed))
|
|
305
|
-
ianaId = parsed;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// Abuse contact: nested entity with role "abuse"
|
|
310
|
-
if (Array.isArray(entity.entities)) {
|
|
311
|
-
for (const sub of entity.entities) {
|
|
312
|
-
const subRoles = Array.isArray(sub?.roles) ? sub.roles : [];
|
|
313
|
-
if (subRoles.includes('abuse')) {
|
|
314
|
-
if (!abuseEmail)
|
|
315
|
-
abuseEmail = this.extractVcardEmail(sub);
|
|
316
|
-
if (!abusePhone)
|
|
317
|
-
abusePhone = this.extractVcardTel(sub);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
break; // first registrar wins
|
|
322
|
-
}
|
|
323
|
-
return { name, ianaId, abuseEmail, abusePhone };
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Extract registrant org/country from entities array.
|
|
327
|
-
*/
|
|
328
|
-
extractRegistrant(entities) {
|
|
329
|
-
for (const entity of entities) {
|
|
330
|
-
const roles = Array.isArray(entity?.roles) ? entity.roles : [];
|
|
331
|
-
if (!roles.includes('registrant'))
|
|
332
|
-
continue;
|
|
333
|
-
const org = this.extractVcardFn(entity);
|
|
334
|
-
const country = this.extractVcardCountry(entity);
|
|
335
|
-
return { org, country };
|
|
336
|
-
}
|
|
337
|
-
return { org: null, country: null };
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Map an RDAP nameservers[] array to a list of lowercased ldhName strings.
|
|
341
|
-
*/
|
|
342
|
-
extractNameservers(nameservers) {
|
|
343
|
-
const out = [];
|
|
344
|
-
for (const ns of nameservers) {
|
|
345
|
-
const ldh = ns?.ldhName;
|
|
346
|
-
if (typeof ldh === 'string' && ldh.length > 0) {
|
|
347
|
-
out.push(ldh.toLowerCase());
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
return out.length > 0 ? out : null;
|
|
351
|
-
}
|
|
352
159
|
// ─── DNS Layer ──────────────────────────────────────────────────────
|
|
353
160
|
/**
|
|
354
161
|
* Run DNS record lookups for the given domain using smartdns. Queries
|
|
@@ -457,86 +264,5 @@ export class DomainIntelligence {
|
|
|
457
264
|
}
|
|
458
265
|
return out.length > 0 ? out : null;
|
|
459
266
|
}
|
|
460
|
-
// ─── vCard helpers (duplicated from IpIntelligence) ─────────────────
|
|
461
|
-
/**
|
|
462
|
-
* Extract the 'fn' (formatted name) from an entity's vcardArray
|
|
463
|
-
*/
|
|
464
|
-
extractVcardFn(entity) {
|
|
465
|
-
if (!entity?.vcardArray || !Array.isArray(entity.vcardArray))
|
|
466
|
-
return null;
|
|
467
|
-
const properties = entity.vcardArray[1];
|
|
468
|
-
if (!Array.isArray(properties))
|
|
469
|
-
return null;
|
|
470
|
-
for (const prop of properties) {
|
|
471
|
-
if (Array.isArray(prop) && prop[0] === 'fn') {
|
|
472
|
-
return prop[3] || null;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
return null;
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Extract email from an entity's vcardArray
|
|
479
|
-
*/
|
|
480
|
-
extractVcardEmail(entity) {
|
|
481
|
-
if (!entity?.vcardArray || !Array.isArray(entity.vcardArray))
|
|
482
|
-
return null;
|
|
483
|
-
const properties = entity.vcardArray[1];
|
|
484
|
-
if (!Array.isArray(properties))
|
|
485
|
-
return null;
|
|
486
|
-
for (const prop of properties) {
|
|
487
|
-
if (Array.isArray(prop) && prop[0] === 'email') {
|
|
488
|
-
return prop[3] || null;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
return null;
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Extract telephone number from an entity's vcardArray
|
|
495
|
-
*/
|
|
496
|
-
extractVcardTel(entity) {
|
|
497
|
-
if (!entity?.vcardArray || !Array.isArray(entity.vcardArray))
|
|
498
|
-
return null;
|
|
499
|
-
const properties = entity.vcardArray[1];
|
|
500
|
-
if (!Array.isArray(properties))
|
|
501
|
-
return null;
|
|
502
|
-
for (const prop of properties) {
|
|
503
|
-
if (Array.isArray(prop) && prop[0] === 'tel') {
|
|
504
|
-
// tel value can be a string or a uri like "tel:+1.5555555555"
|
|
505
|
-
const value = prop[3];
|
|
506
|
-
if (typeof value === 'string') {
|
|
507
|
-
return value.startsWith('tel:') ? value.slice(4) : value;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
return null;
|
|
512
|
-
}
|
|
513
|
-
/**
|
|
514
|
-
* Extract country from an entity's vcardArray address field
|
|
515
|
-
*/
|
|
516
|
-
extractVcardCountry(entity) {
|
|
517
|
-
if (!entity?.vcardArray || !Array.isArray(entity.vcardArray))
|
|
518
|
-
return null;
|
|
519
|
-
const properties = entity.vcardArray[1];
|
|
520
|
-
if (!Array.isArray(properties))
|
|
521
|
-
return null;
|
|
522
|
-
for (const prop of properties) {
|
|
523
|
-
if (Array.isArray(prop) && prop[0] === 'adr') {
|
|
524
|
-
// The label parameter often contains the full address with country at the end
|
|
525
|
-
const label = prop[1]?.label;
|
|
526
|
-
if (typeof label === 'string') {
|
|
527
|
-
const lines = label.split('\n');
|
|
528
|
-
const lastLine = lines[lines.length - 1]?.trim();
|
|
529
|
-
if (lastLine && lastLine.length > 1)
|
|
530
|
-
return lastLine;
|
|
531
|
-
}
|
|
532
|
-
// Also check the structured value (7-element array, last element is country)
|
|
533
|
-
const value = prop[3];
|
|
534
|
-
if (Array.isArray(value) && value.length >= 7 && value[6]) {
|
|
535
|
-
return value[6];
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
return null;
|
|
540
|
-
}
|
|
541
267
|
}
|
|
542
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRuZXR3b3JrLmNsYXNzZXMuZG9tYWluaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRuZXR3b3JrLmNsYXNzZXMuZG9tYWluaW50ZWxsaWdlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBc0V6QyxpQ0FBaUM7QUFDakMsTUFBTSxzQkFBc0IsR0FBRyxxQ0FBcUMsQ0FBQztBQUNyRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFFN0I7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxTQUF3QixJQUFJO0lBQy9DLE9BQU87UUFDTCxNQUFNO1FBQ04sTUFBTSxFQUFFLElBQUk7UUFDWixNQUFNLEVBQUUsSUFBSTtRQUNaLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsY0FBYyxFQUFFLElBQUk7UUFDcEIsZUFBZSxFQUFFLElBQUk7UUFDckIsYUFBYSxFQUFFLElBQUk7UUFDbkIsZUFBZSxFQUFFLElBQUk7UUFDckIsYUFBYSxFQUFFLElBQUk7UUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixVQUFVLEVBQUUsSUFBSTtRQUNoQixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixNQUFNLEVBQUUsSUFBSTtRQUNaLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsWUFBWSxFQUFFLElBQUk7UUFDbEIsWUFBWSxFQUFFLElBQUk7UUFDbEIsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtRQUNoQixTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFXN0IsWUFBWSxPQUFv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
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRuZXR3b3JrLmNsYXNzZXMuZG9tYWluaW50ZWxsaWdlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRuZXR3b3JrLmNsYXNzZXMuZG9tYWluaW50ZWxsaWdlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBc0V6QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFFN0I7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxTQUF3QixJQUFJO0lBQy9DLE9BQU87UUFDTCxNQUFNO1FBQ04sTUFBTSxFQUFFLElBQUk7UUFDWixNQUFNLEVBQUUsSUFBSTtRQUNaLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsY0FBYyxFQUFFLElBQUk7UUFDcEIsZUFBZSxFQUFFLElBQUk7UUFDckIsYUFBYSxFQUFFLElBQUk7UUFDbkIsZUFBZSxFQUFFLElBQUk7UUFDckIsYUFBYSxFQUFFLElBQUk7UUFDbkIsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixVQUFVLEVBQUUsSUFBSTtRQUNoQixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixNQUFNLEVBQUUsSUFBSTtRQUNaLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsWUFBWSxFQUFFLElBQUk7UUFDbEIsWUFBWSxFQUFFLElBQUk7UUFDbEIsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtRQUNoQixTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBVTdCLFlBQVksT0FBb0M7UUFUL0IsV0FBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBVXBDLElBQUksQ0FB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
|
|
@@ -36,7 +36,7 @@ export interface IIpIntelligenceOptions {
|
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* IpIntelligence provides IP address intelligence by combining three data sources:
|
|
39
|
-
* - RDAP (direct to RIRs) for registration/org data
|
|
39
|
+
* - RDAP (direct to RIRs, via @push.rocks/smartwhois) for registration/org data
|
|
40
40
|
* - Team Cymru DNS for ASN
|
|
41
41
|
* - MaxMind GeoLite2 (in-memory MMDB) for geolocation
|
|
42
42
|
*/
|
|
@@ -48,8 +48,7 @@ export declare class IpIntelligence {
|
|
|
48
48
|
private asnReader;
|
|
49
49
|
private lastFetchTime;
|
|
50
50
|
private refreshPromise;
|
|
51
|
-
private
|
|
52
|
-
private bootstrapPromise;
|
|
51
|
+
private readonly rdapClient;
|
|
53
52
|
private readonly sharedDnsClient;
|
|
54
53
|
constructor(options?: IIpIntelligenceOptions);
|
|
55
54
|
/**
|
|
@@ -58,31 +57,9 @@ export declare class IpIntelligence {
|
|
|
58
57
|
*/
|
|
59
58
|
getIntelligence(ip: string): Promise<IIpIntelligenceResult>;
|
|
60
59
|
/**
|
|
61
|
-
*
|
|
62
|
-
*/
|
|
63
|
-
private ensureBootstrap;
|
|
64
|
-
/**
|
|
65
|
-
* Find the RDAP base URL for a given IP via longest-prefix match
|
|
66
|
-
*/
|
|
67
|
-
private matchRir;
|
|
68
|
-
/**
|
|
69
|
-
* Query RDAP for registration data
|
|
60
|
+
* Query RDAP for registration data via the smartwhois RdapClient (IPv4 and IPv6).
|
|
70
61
|
*/
|
|
71
62
|
private queryRdap;
|
|
72
|
-
private parseRdapNetworkInfo;
|
|
73
|
-
private extractRdapCidrs;
|
|
74
|
-
/**
|
|
75
|
-
* Extract the 'fn' (formatted name) from an entity's vcardArray
|
|
76
|
-
*/
|
|
77
|
-
private extractVcardFn;
|
|
78
|
-
/**
|
|
79
|
-
* Extract email from an entity's vcardArray
|
|
80
|
-
*/
|
|
81
|
-
private extractVcardEmail;
|
|
82
|
-
/**
|
|
83
|
-
* Extract country from an entity's vcardArray address field
|
|
84
|
-
*/
|
|
85
|
-
private extractVcardCountry;
|
|
86
63
|
/**
|
|
87
64
|
* Query Team Cymru DNS for ASN information.
|
|
88
65
|
* Query format: reversed.ip.origin.asn.cymru.com TXT
|
|
@@ -106,12 +83,4 @@ export declare class IpIntelligence {
|
|
|
106
83
|
* Query MaxMind for geo + ASN data
|
|
107
84
|
*/
|
|
108
85
|
private queryMaxMind;
|
|
109
|
-
/**
|
|
110
|
-
* Convert an IPv4 address string to a 32-bit unsigned number
|
|
111
|
-
*/
|
|
112
|
-
private ipToNumber;
|
|
113
|
-
private ipv4RangeToCidrs;
|
|
114
|
-
private ipv4ToBigInt;
|
|
115
|
-
private numberToIpv4;
|
|
116
|
-
private powerOfTwoExponent;
|
|
117
86
|
}
|