@stacksjs/whois 0.59.10 → 0.61.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/index.js +52 -54
- package/package.json +3 -3
- package/src/index.ts +98 -112
- package/src/servers.ts +206 -206
- package/dist/index.d.ts +0 -151
- package/dist/parameters.d.ts +0 -5
- package/dist/servers.d.ts +0 -319
package/dist/index.js
CHANGED
|
@@ -338,7 +338,7 @@ async function findWhoIsServer(tld) {
|
|
|
338
338
|
if (res.ok) {
|
|
339
339
|
const body = await res.text();
|
|
340
340
|
const server = body.match(/whois:\s+(.*)\s+/);
|
|
341
|
-
if (server)
|
|
341
|
+
if (server?.[1])
|
|
342
342
|
return server[1];
|
|
343
343
|
}
|
|
344
344
|
} catch (err) {
|
|
@@ -349,16 +349,16 @@ async function findWhoIsServer(tld) {
|
|
|
349
349
|
var shallowCopy = function(obj) {
|
|
350
350
|
if (Array.isArray(obj)) {
|
|
351
351
|
return obj.slice();
|
|
352
|
-
}
|
|
352
|
+
}
|
|
353
|
+
if (typeof obj === "object" && obj !== null) {
|
|
353
354
|
const copy = {};
|
|
354
355
|
for (const key in obj) {
|
|
355
356
|
if (Object.prototype.hasOwnProperty.call(obj, key))
|
|
356
357
|
copy[key] = shallowCopy(obj[key]);
|
|
357
358
|
}
|
|
358
359
|
return copy;
|
|
359
|
-
} else {
|
|
360
|
-
return obj;
|
|
361
360
|
}
|
|
361
|
+
return obj;
|
|
362
362
|
};
|
|
363
363
|
var getWhoIsServer = function(tld) {
|
|
364
364
|
return servers_default[tld];
|
|
@@ -410,43 +410,42 @@ async function tcpWhois(domain, queryOptions, server, port, encoding, proxy) {
|
|
|
410
410
|
reject(e);
|
|
411
411
|
}
|
|
412
412
|
});
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
};
|
|
426
|
-
if (proxy.username && proxy.password) {
|
|
427
|
-
options.proxy.userId = proxy.username;
|
|
428
|
-
options.proxy.password = proxy.password;
|
|
413
|
+
}
|
|
414
|
+
const options = {
|
|
415
|
+
proxy: {
|
|
416
|
+
host: proxy.ip,
|
|
417
|
+
port: proxy.port,
|
|
418
|
+
type: proxy.type === ProxyType.SOCKS5 ? 5 : 4
|
|
419
|
+
},
|
|
420
|
+
command: "connect",
|
|
421
|
+
destination: {
|
|
422
|
+
host: server,
|
|
423
|
+
port
|
|
429
424
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
425
|
+
};
|
|
426
|
+
if (proxy.username && proxy.password) {
|
|
427
|
+
options.proxy.userId = proxy.username;
|
|
428
|
+
options.proxy.password = proxy.password;
|
|
429
|
+
}
|
|
430
|
+
return new Promise((resolve, reject) => {
|
|
431
|
+
SocksClient.createConnection(options, (err, info) => {
|
|
432
|
+
if (err) {
|
|
433
|
+
reject(err);
|
|
434
|
+
} else {
|
|
435
|
+
if (!info)
|
|
436
|
+
reject(new Error("No socket info received!"));
|
|
437
|
+
if (queryOptions !== "") {
|
|
438
|
+
info?.socket.write(encoder.encode(`${queryOptions} ${domain}\r\n`));
|
|
434
439
|
} else {
|
|
435
|
-
|
|
436
|
-
reject(new Error("No socket info received!"));
|
|
437
|
-
if (queryOptions !== "") {
|
|
438
|
-
info?.socket.write(encoder.encode(`${queryOptions} ${domain}\r\n`));
|
|
439
|
-
} else {
|
|
440
|
-
info?.socket.write(encoder.encode(`${domain}\r\n`));
|
|
441
|
-
}
|
|
442
|
-
info?.socket.on("data", (data) => {
|
|
443
|
-
resolve(decoder.decode(data));
|
|
444
|
-
});
|
|
445
|
-
info?.socket.resume();
|
|
440
|
+
info?.socket.write(encoder.encode(`${domain}\r\n`));
|
|
446
441
|
}
|
|
447
|
-
|
|
442
|
+
info?.socket.on("data", (data) => {
|
|
443
|
+
resolve(decoder.decode(data));
|
|
444
|
+
});
|
|
445
|
+
info?.socket.resume();
|
|
446
|
+
}
|
|
448
447
|
});
|
|
449
|
-
}
|
|
448
|
+
});
|
|
450
449
|
}
|
|
451
450
|
async function whois(domain, parse = false, options = null) {
|
|
452
451
|
let tld;
|
|
@@ -490,23 +489,22 @@ async function whois(domain, parse = false, options = null) {
|
|
|
490
489
|
_raw: rawData,
|
|
491
490
|
parsedData
|
|
492
491
|
};
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
}
|
|
492
|
+
}
|
|
493
|
+
let outputData = null;
|
|
494
|
+
if (options?.parseData)
|
|
495
|
+
outputData = shallowCopy(options.parseData);
|
|
496
|
+
try {
|
|
497
|
+
const parsedData = WhoIsParser.parseData(rawData, outputData);
|
|
498
|
+
return {
|
|
499
|
+
_raw: rawData,
|
|
500
|
+
parsedData
|
|
501
|
+
};
|
|
502
|
+
} catch (err) {
|
|
503
|
+
console.error("Error in parsing WhoIs data!", err);
|
|
504
|
+
return {
|
|
505
|
+
_raw: rawData,
|
|
506
|
+
parsedData: null
|
|
507
|
+
};
|
|
510
508
|
}
|
|
511
509
|
} catch (err) {
|
|
512
510
|
return {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/whois",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.61.0",
|
|
5
5
|
"description": "Easily get whois info.",
|
|
6
6
|
"author": "Chris Breuer",
|
|
7
7
|
"license": "MIT",
|
|
@@ -49,11 +49,11 @@
|
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"node-fetch": "^3.3.2",
|
|
52
|
-
"socks": "^2.8.
|
|
52
|
+
"socks": "^2.8.3"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"node-fetch": "^3.3.2",
|
|
56
|
-
"socks": "^2.8.
|
|
56
|
+
"socks": "^2.8.3"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@stacksjs/development": "latest"
|
package/src/index.ts
CHANGED
|
@@ -21,11 +21,9 @@ async function findWhoIsServer(tld: string): Promise<string> {
|
|
|
21
21
|
if (res.ok) {
|
|
22
22
|
const body = await res.text()
|
|
23
23
|
const server = body.match(/whois:\s+(.*)\s+/)
|
|
24
|
-
if (server)
|
|
25
|
-
return server[1]!
|
|
24
|
+
if (server?.[1]) return server[1]
|
|
26
25
|
}
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
26
|
+
} catch (err) {
|
|
29
27
|
console.error('Error in getting WhoIs server data from IANA', err)
|
|
30
28
|
}
|
|
31
29
|
|
|
@@ -37,22 +35,20 @@ async function findWhoIsServer(tld: string): Promise<string> {
|
|
|
37
35
|
* @param obj Object which needs to be copied
|
|
38
36
|
* @returns A copy of the object
|
|
39
37
|
*/
|
|
40
|
-
|
|
41
|
-
function shallowCopy<T extends any>(obj: T): T {
|
|
38
|
+
function shallowCopy<T>(obj: T): T {
|
|
42
39
|
if (Array.isArray(obj)) {
|
|
43
40
|
return obj.slice() as T // Clone the array
|
|
44
41
|
}
|
|
45
|
-
|
|
42
|
+
|
|
43
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
46
44
|
const copy: any = {}
|
|
47
45
|
for (const key in obj) {
|
|
48
|
-
if (Object.prototype.hasOwnProperty.call(obj, key))
|
|
49
|
-
copy[key] = shallowCopy(obj[key])
|
|
46
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) copy[key] = shallowCopy(obj[key])
|
|
50
47
|
}
|
|
51
48
|
return copy as T
|
|
52
49
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
50
|
+
|
|
51
|
+
return obj // For primitive values, return as is
|
|
56
52
|
}
|
|
57
53
|
|
|
58
54
|
/**
|
|
@@ -79,8 +75,7 @@ function getTLD(domain: string): keyof typeof SERVERS {
|
|
|
79
75
|
|
|
80
76
|
while (true) {
|
|
81
77
|
const domainData = domainStr.split('.')
|
|
82
|
-
if (domainData.length < 2)
|
|
83
|
-
break
|
|
78
|
+
if (domainData.length < 2) break
|
|
84
79
|
|
|
85
80
|
const tldCheck = domainData.slice(1).join('.') as keyof typeof SERVERS
|
|
86
81
|
const server = SERVERS[tldCheck]
|
|
@@ -91,10 +86,8 @@ function getTLD(domain: string): keyof typeof SERVERS {
|
|
|
91
86
|
domainStr = tldCheck
|
|
92
87
|
}
|
|
93
88
|
|
|
94
|
-
if (tld)
|
|
95
|
-
return tld
|
|
89
|
+
if (tld) return tld
|
|
96
90
|
|
|
97
|
-
// eslint-disable-next-line no-console
|
|
98
91
|
console.debug('TLD is not found in server list. Returning last element after split as TLD!')
|
|
99
92
|
|
|
100
93
|
const domainData = domain.split('.')
|
|
@@ -227,27 +220,22 @@ export class WhoIsParser {
|
|
|
227
220
|
if (letter === '\n' || (lastLetter === ':' && letter === ' ')) {
|
|
228
221
|
if (lastStr.trim() in outputData) {
|
|
229
222
|
lastField = lastStr.trim()
|
|
230
|
-
}
|
|
231
|
-
else if (lastField !== null) {
|
|
223
|
+
} else if (lastField !== null) {
|
|
232
224
|
const x = lastStr.trim()
|
|
233
225
|
if (x !== '') {
|
|
234
226
|
const obj = outputData[lastField]
|
|
235
|
-
if (Array.isArray(obj))
|
|
236
|
-
|
|
237
|
-
else
|
|
238
|
-
outputData[lastField] = x
|
|
227
|
+
if (Array.isArray(obj)) obj.push(x)
|
|
228
|
+
else outputData[lastField] = x
|
|
239
229
|
|
|
240
230
|
lastField = null
|
|
241
231
|
}
|
|
242
232
|
}
|
|
243
233
|
lastStr = ''
|
|
244
|
-
}
|
|
245
|
-
else if (letter !== ':') {
|
|
234
|
+
} else if (letter !== ':') {
|
|
246
235
|
lastStr = lastStr + letter
|
|
247
236
|
}
|
|
248
237
|
lastLetter = letter as string
|
|
249
|
-
if (lastStr === 'Record maintained by' || lastStr === '>>>')
|
|
250
|
-
break
|
|
238
|
+
if (lastStr === 'Record maintained by' || lastStr === '>>>') break
|
|
251
239
|
}
|
|
252
240
|
|
|
253
241
|
return outputData
|
|
@@ -268,7 +256,7 @@ export class WhoIsParser {
|
|
|
268
256
|
'Updated Date': '',
|
|
269
257
|
'Registry Expiry Date': '',
|
|
270
258
|
'Domain Status': [],
|
|
271
|
-
|
|
259
|
+
Registrar: '',
|
|
272
260
|
}
|
|
273
261
|
}
|
|
274
262
|
|
|
@@ -289,7 +277,14 @@ export class WhoIsParser {
|
|
|
289
277
|
* @param proxy {@link ProxyData}
|
|
290
278
|
* @returns The {string} WhoIs response for the query. Empty string is returned for errors
|
|
291
279
|
*/
|
|
292
|
-
export async function tcpWhois(
|
|
280
|
+
export async function tcpWhois(
|
|
281
|
+
domain: string,
|
|
282
|
+
queryOptions: string,
|
|
283
|
+
server: string,
|
|
284
|
+
port: number,
|
|
285
|
+
encoding: string,
|
|
286
|
+
proxy: ProxyData | null,
|
|
287
|
+
): Promise<string> {
|
|
293
288
|
const decoder = new TextDecoder(encoding)
|
|
294
289
|
const encoder = new TextEncoder()
|
|
295
290
|
|
|
@@ -298,10 +293,8 @@ export async function tcpWhois(domain: string, queryOptions: string, server: str
|
|
|
298
293
|
return new Promise((resolve, reject) => {
|
|
299
294
|
try {
|
|
300
295
|
socket.connect({ port, host: server }, () => {
|
|
301
|
-
if (queryOptions !== '')
|
|
302
|
-
|
|
303
|
-
else
|
|
304
|
-
socket.write(encoder.encode(`${domain}\r\n`))
|
|
296
|
+
if (queryOptions !== '') socket.write(encoder.encode(`${queryOptions} ${domain}\r\n`))
|
|
297
|
+
else socket.write(encoder.encode(`${domain}\r\n`))
|
|
305
298
|
})
|
|
306
299
|
|
|
307
300
|
socket.on('data', (data) => {
|
|
@@ -311,62 +304,53 @@ export async function tcpWhois(domain: string, queryOptions: string, server: str
|
|
|
311
304
|
socket.on('error', (error) => {
|
|
312
305
|
reject(error)
|
|
313
306
|
})
|
|
314
|
-
}
|
|
315
|
-
catch (e) {
|
|
307
|
+
} catch (e) {
|
|
316
308
|
reject(e)
|
|
317
309
|
}
|
|
318
310
|
})
|
|
319
311
|
}
|
|
320
|
-
else {
|
|
321
|
-
const options: SocksClientOptions = {
|
|
322
|
-
proxy: {
|
|
323
|
-
host: proxy.ip,
|
|
324
|
-
port: proxy.port,
|
|
325
|
-
type: proxy.type === ProxyType.SOCKS5 ? 5 : 4,
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
command: 'connect',
|
|
329
|
-
|
|
330
|
-
destination: {
|
|
331
|
-
host: server,
|
|
332
|
-
port,
|
|
333
|
-
},
|
|
334
|
-
}
|
|
335
312
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
313
|
+
const options: SocksClientOptions = {
|
|
314
|
+
proxy: {
|
|
315
|
+
host: proxy.ip,
|
|
316
|
+
port: proxy.port,
|
|
317
|
+
type: proxy.type === ProxyType.SOCKS5 ? 5 : 4,
|
|
318
|
+
},
|
|
340
319
|
|
|
341
|
-
|
|
342
|
-
SocksClient.createConnection(options, (err, info) => {
|
|
343
|
-
if (err) {
|
|
344
|
-
reject(err)
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
if (!info)
|
|
348
|
-
reject(new Error('No socket info received!'))
|
|
349
|
-
|
|
350
|
-
if (queryOptions !== '') {
|
|
351
|
-
info?.socket.write(
|
|
352
|
-
encoder.encode(`${queryOptions} ${domain}\r\n`),
|
|
353
|
-
)
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
info?.socket.write(
|
|
357
|
-
encoder.encode(`${domain}\r\n`),
|
|
358
|
-
)
|
|
359
|
-
}
|
|
320
|
+
command: 'connect',
|
|
360
321
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
322
|
+
destination: {
|
|
323
|
+
host: server,
|
|
324
|
+
port,
|
|
325
|
+
},
|
|
326
|
+
}
|
|
364
327
|
|
|
365
|
-
|
|
328
|
+
if (proxy.username && proxy.password) {
|
|
329
|
+
options.proxy.userId = proxy.username
|
|
330
|
+
options.proxy.password = proxy.password
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return new Promise((resolve, reject) => {
|
|
334
|
+
SocksClient.createConnection(options, (err, info) => {
|
|
335
|
+
if (err) {
|
|
336
|
+
reject(err)
|
|
337
|
+
} else {
|
|
338
|
+
if (!info) reject(new Error('No socket info received!'))
|
|
339
|
+
|
|
340
|
+
if (queryOptions !== '') {
|
|
341
|
+
info?.socket.write(encoder.encode(`${queryOptions} ${domain}\r\n`))
|
|
342
|
+
} else {
|
|
343
|
+
info?.socket.write(encoder.encode(`${domain}\r\n`))
|
|
366
344
|
}
|
|
367
|
-
|
|
345
|
+
|
|
346
|
+
info?.socket.on('data', (data) => {
|
|
347
|
+
resolve(decoder.decode(data))
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
info?.socket.resume()
|
|
351
|
+
}
|
|
368
352
|
})
|
|
369
|
-
}
|
|
353
|
+
})
|
|
370
354
|
}
|
|
371
355
|
|
|
372
356
|
/**
|
|
@@ -377,7 +361,11 @@ export async function tcpWhois(domain: string, queryOptions: string, server: str
|
|
|
377
361
|
* @param options {@link WhoIsOptions}
|
|
378
362
|
* @returns {@link WhoIsResponse} Returns a {@link WhoIsResponse} object which contains the raw text and parsed data (if parse is true)
|
|
379
363
|
*/
|
|
380
|
-
export async function whois(
|
|
364
|
+
export async function whois(
|
|
365
|
+
domain: string,
|
|
366
|
+
parse = false,
|
|
367
|
+
options: WhoIsOptions | null = null,
|
|
368
|
+
): Promise<WhoIsResponse> {
|
|
381
369
|
let tld: string
|
|
382
370
|
let port = 43
|
|
383
371
|
let server = ''
|
|
@@ -387,8 +375,7 @@ export async function whois(domain: string, parse: boolean = false, options: Who
|
|
|
387
375
|
if (!options) {
|
|
388
376
|
tld = getTLD(domain)
|
|
389
377
|
proxy = null
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
378
|
+
} else {
|
|
392
379
|
tld = options.tld ? options.tld : getTLD(domain)
|
|
393
380
|
encoding = options.encoding ? options.encoding : 'utf-8'
|
|
394
381
|
proxy = options.proxy ? options.proxy : null
|
|
@@ -399,18 +386,15 @@ export async function whois(domain: string, parse: boolean = false, options: Who
|
|
|
399
386
|
if (server === '') {
|
|
400
387
|
let serverData = getWhoIsServer(tld as keyof typeof SERVERS)
|
|
401
388
|
if (!serverData) {
|
|
402
|
-
// eslint-disable-next-line no-console
|
|
403
389
|
console.debug(`No WhoIs server found for TLD: ${tld}! Attempting IANA WhoIs database for server!`)
|
|
404
390
|
serverData = await findWhoIsServer(tld)
|
|
405
391
|
if (!serverData) {
|
|
406
|
-
// eslint-disable-next-line no-console
|
|
407
392
|
console.debug('WhoIs server could not be found!')
|
|
408
393
|
return {
|
|
409
394
|
_raw: '',
|
|
410
395
|
parsedData: null,
|
|
411
396
|
}
|
|
412
397
|
}
|
|
413
|
-
// eslint-disable-next-line no-console
|
|
414
398
|
console.debug(`WhoIs sever found for ${tld}: ${server}`)
|
|
415
399
|
}
|
|
416
400
|
|
|
@@ -429,28 +413,24 @@ export async function whois(domain: string, parse: boolean = false, options: Who
|
|
|
429
413
|
parsedData,
|
|
430
414
|
}
|
|
431
415
|
}
|
|
432
|
-
else {
|
|
433
|
-
let outputData: any | null = null
|
|
434
|
-
if (options && options.parseData)
|
|
435
|
-
outputData = shallowCopy(options.parseData)
|
|
436
416
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
417
|
+
let outputData: any | null = null
|
|
418
|
+
if (options?.parseData) outputData = shallowCopy(options.parseData)
|
|
419
|
+
|
|
420
|
+
try {
|
|
421
|
+
const parsedData = WhoIsParser.parseData(rawData, outputData)
|
|
422
|
+
return {
|
|
423
|
+
_raw: rawData,
|
|
424
|
+
parsedData,
|
|
443
425
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
426
|
+
} catch (err) {
|
|
427
|
+
console.error('Error in parsing WhoIs data!', err)
|
|
428
|
+
return {
|
|
429
|
+
_raw: rawData,
|
|
430
|
+
parsedData: null,
|
|
450
431
|
}
|
|
451
432
|
}
|
|
452
|
-
}
|
|
453
|
-
catch (err) {
|
|
433
|
+
} catch (err) {
|
|
454
434
|
return {
|
|
455
435
|
_raw: '',
|
|
456
436
|
parsedData: null,
|
|
@@ -474,23 +454,29 @@ export function lookup(domain: string, options: WhoIsOptions | null = null): Pro
|
|
|
474
454
|
* @param options {@link WhoIsOptions}
|
|
475
455
|
* @returns Array of {@link WhoIsResponse} for all the domains. Order is not guaranteed
|
|
476
456
|
*/
|
|
477
|
-
export async function batchWhois(
|
|
457
|
+
export async function batchWhois(
|
|
458
|
+
domains: string[],
|
|
459
|
+
parallel = false,
|
|
460
|
+
threads = 1,
|
|
461
|
+
parse = false,
|
|
462
|
+
options: WhoIsOptions | null = null,
|
|
463
|
+
): Promise<WhoIsResponse[]> {
|
|
478
464
|
let response: WhoIsResponse[] = []
|
|
479
465
|
|
|
480
466
|
if (parallel) {
|
|
481
|
-
if (threads > domains.length)
|
|
482
|
-
threads = domains.length
|
|
467
|
+
if (threads > domains.length) threads = domains.length
|
|
483
468
|
|
|
484
469
|
for (let i = 0; i < domains.length; i += threads) {
|
|
485
470
|
const batch = domains.slice(i, i + threads)
|
|
486
|
-
response = await Promise.all(
|
|
487
|
-
|
|
488
|
-
|
|
471
|
+
response = await Promise.all(
|
|
472
|
+
batch.map(async (domain) => {
|
|
473
|
+
return await whois(domain, parse, options)
|
|
474
|
+
}),
|
|
475
|
+
)
|
|
489
476
|
}
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
477
|
+
} else {
|
|
492
478
|
for (let i = 0; i < domains.length; i++) {
|
|
493
|
-
const res = await whois(domains[i]
|
|
479
|
+
const res = await whois(domains[i] as string, parse, options)
|
|
494
480
|
response.push(res)
|
|
495
481
|
}
|
|
496
482
|
}
|