@stacksjs/whois 0.59.11 → 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 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
- } else if (typeof obj === "object" && obj !== null) {
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
- } else {
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
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
- return new Promise((resolve, reject) => {
431
- SocksClient.createConnection(options, (err, info) => {
432
- if (err) {
433
- reject(err);
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
- if (!info)
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
- } else {
494
- let outputData = null;
495
- if (options && options.parseData)
496
- outputData = shallowCopy(options.parseData);
497
- try {
498
- const parsedData = WhoIsParser.parseData(rawData, outputData);
499
- return {
500
- _raw: rawData,
501
- parsedData
502
- };
503
- } catch (err) {
504
- console.error("Error in parsing WhoIs data!", err);
505
- return {
506
- _raw: rawData,
507
- parsedData: null
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.59.11",
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.1"
52
+ "socks": "^2.8.3"
53
53
  },
54
54
  "dependencies": {
55
55
  "node-fetch": "^3.3.2",
56
- "socks": "^2.8.1"
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
- // eslint-disable-next-line ts/no-unnecessary-type-constraint
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
- else if (typeof obj === 'object' && obj !== null) {
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
- else {
54
- return obj // For primitive values, return as is
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
- obj.push(x)
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
- 'Registrar': '',
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(domain: string, queryOptions: string, server: string, port: number, encoding: string, proxy: ProxyData | null): Promise<string> {
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
- socket.write(encoder.encode(`${queryOptions} ${domain}\r\n`))
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
- if (proxy.username && proxy.password) {
337
- options.proxy.userId = proxy.username
338
- options.proxy.password = proxy.password
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
- return new Promise((resolve, reject) => {
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
- info?.socket.on('data', (data) => {
362
- resolve(decoder.decode(data))
363
- })
322
+ destination: {
323
+ host: server,
324
+ port,
325
+ },
326
+ }
364
327
 
365
- info?.socket.resume()
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(domain: string, parse: boolean = false, options: WhoIsOptions | null = null): Promise<WhoIsResponse> {
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
- try {
438
- const parsedData = WhoIsParser.parseData(rawData, outputData)
439
- return {
440
- _raw: rawData,
441
- parsedData,
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
- catch (err) {
445
- console.error('Error in parsing WhoIs data!', err)
446
- return {
447
- _raw: rawData,
448
- parsedData: null,
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(domains: string[], parallel: boolean = false, threads: number = 1, parse: boolean = false, options: WhoIsOptions | null = null): Promise<WhoIsResponse[]> {
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(batch.map(async (domain) => {
487
- return await whois(domain, parse, options)
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]!, parse, options)
479
+ const res = await whois(domains[i] as string, parse, options)
494
480
  response.push(res)
495
481
  }
496
482
  }