recker 1.0.15-next.7944604 → 1.0.15-next.99ff876

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.
Files changed (117) hide show
  1. package/README.md +10 -1
  2. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  3. package/dist/ai/providers/anthropic.js +4 -1
  4. package/dist/ai/providers/base.d.ts.map +1 -1
  5. package/dist/ai/providers/base.js +7 -2
  6. package/dist/ai/rate-limiter.d.ts.map +1 -1
  7. package/dist/ai/rate-limiter.js +4 -1
  8. package/dist/bench/generator.d.ts.map +1 -1
  9. package/dist/bench/generator.js +7 -3
  10. package/dist/bench/stats.d.ts.map +1 -1
  11. package/dist/bench/stats.js +43 -10
  12. package/dist/cache/memory-storage.d.ts.map +1 -1
  13. package/dist/cache/memory-storage.js +3 -2
  14. package/dist/cli/handler.js +14 -14
  15. package/dist/cli/index.js +602 -48
  16. package/dist/cli/presets.js +5 -5
  17. package/dist/cli/tui/ai-chat.js +10 -10
  18. package/dist/cli/tui/load-dashboard.d.ts.map +1 -1
  19. package/dist/cli/tui/load-dashboard.js +96 -55
  20. package/dist/cli/tui/scroll-buffer.d.ts +43 -0
  21. package/dist/cli/tui/scroll-buffer.d.ts.map +1 -0
  22. package/dist/cli/tui/scroll-buffer.js +162 -0
  23. package/dist/cli/tui/search-panel.d.ts +41 -0
  24. package/dist/cli/tui/search-panel.d.ts.map +1 -0
  25. package/dist/cli/tui/search-panel.js +419 -0
  26. package/dist/cli/tui/shell.d.ts +14 -0
  27. package/dist/cli/tui/shell.d.ts.map +1 -1
  28. package/dist/cli/tui/shell.js +424 -46
  29. package/dist/cli/tui/websocket.js +17 -17
  30. package/dist/core/client.d.ts.map +1 -1
  31. package/dist/core/client.js +18 -26
  32. package/dist/core/errors.d.ts +109 -1
  33. package/dist/core/errors.d.ts.map +1 -1
  34. package/dist/core/errors.js +214 -1
  35. package/dist/core/request-promise.d.ts.map +1 -1
  36. package/dist/core/request-promise.js +5 -6
  37. package/dist/core/response.d.ts.map +1 -1
  38. package/dist/core/response.js +5 -6
  39. package/dist/dns/index.d.ts +1 -0
  40. package/dist/dns/index.d.ts.map +1 -1
  41. package/dist/dns/index.js +1 -0
  42. package/dist/dns/propagation.d.ts +21 -0
  43. package/dist/dns/propagation.d.ts.map +1 -0
  44. package/dist/dns/propagation.js +169 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/mcp/client.d.ts.map +1 -1
  49. package/dist/mcp/client.js +10 -11
  50. package/dist/mcp/embeddings-loader.d.ts.map +1 -1
  51. package/dist/mcp/embeddings-loader.js +12 -2
  52. package/dist/mcp/geoip-loader.d.ts +11 -0
  53. package/dist/mcp/geoip-loader.d.ts.map +1 -0
  54. package/dist/mcp/geoip-loader.js +107 -0
  55. package/dist/mcp/ip-intel.d.ts +28 -0
  56. package/dist/mcp/ip-intel.d.ts.map +1 -0
  57. package/dist/mcp/ip-intel.js +209 -0
  58. package/dist/mcp/search/hybrid-search.d.ts.map +1 -1
  59. package/dist/mcp/search/hybrid-search.js +5 -1
  60. package/dist/mcp/search/math.d.ts.map +1 -1
  61. package/dist/mcp/search/math.js +5 -1
  62. package/dist/mcp/server.d.ts +4 -0
  63. package/dist/mcp/server.d.ts.map +1 -1
  64. package/dist/mcp/server.js +114 -1
  65. package/dist/plugins/compression.js +4 -2
  66. package/dist/plugins/har-player.d.ts.map +1 -1
  67. package/dist/plugins/har-player.js +8 -11
  68. package/dist/plugins/odata.d.ts.map +1 -1
  69. package/dist/plugins/odata.js +5 -2
  70. package/dist/protocols/ftp.d.ts.map +1 -1
  71. package/dist/protocols/ftp.js +69 -16
  72. package/dist/protocols/sftp.d.ts.map +1 -1
  73. package/dist/protocols/sftp.js +13 -3
  74. package/dist/protocols/telnet.d.ts.map +1 -1
  75. package/dist/protocols/telnet.js +25 -6
  76. package/dist/transport/base-udp.d.ts.map +1 -1
  77. package/dist/transport/base-udp.js +7 -4
  78. package/dist/transport/udp-response.d.ts.map +1 -1
  79. package/dist/transport/udp-response.js +10 -3
  80. package/dist/transport/udp.d.ts.map +1 -1
  81. package/dist/transport/udp.js +5 -1
  82. package/dist/transport/undici.d.ts.map +1 -1
  83. package/dist/transport/undici.js +75 -63
  84. package/dist/utils/agent-manager.d.ts +1 -0
  85. package/dist/utils/agent-manager.d.ts.map +1 -1
  86. package/dist/utils/agent-manager.js +11 -0
  87. package/dist/utils/client-pool.d.ts.map +1 -1
  88. package/dist/utils/client-pool.js +4 -1
  89. package/dist/utils/dns-toolkit.d.ts +88 -1
  90. package/dist/utils/dns-toolkit.d.ts.map +1 -1
  91. package/dist/utils/dns-toolkit.js +704 -6
  92. package/dist/utils/doh.d.ts.map +1 -1
  93. package/dist/utils/doh.js +13 -16
  94. package/dist/utils/download.d.ts.map +1 -1
  95. package/dist/utils/download.js +10 -11
  96. package/dist/utils/rdap.d.ts +9 -0
  97. package/dist/utils/rdap.d.ts.map +1 -1
  98. package/dist/utils/rdap.js +78 -9
  99. package/dist/utils/security-grader.d.ts +47 -0
  100. package/dist/utils/security-grader.d.ts.map +1 -0
  101. package/dist/utils/security-grader.js +637 -0
  102. package/dist/utils/sparkline.d.ts +18 -0
  103. package/dist/utils/sparkline.d.ts.map +1 -0
  104. package/dist/utils/sparkline.js +55 -0
  105. package/dist/utils/sse.d.ts.map +1 -1
  106. package/dist/utils/sse.js +5 -6
  107. package/dist/utils/system-metrics.d.ts +26 -0
  108. package/dist/utils/system-metrics.d.ts.map +1 -0
  109. package/dist/utils/system-metrics.js +81 -0
  110. package/dist/utils/tls-inspector.d.ts +6 -0
  111. package/dist/utils/tls-inspector.d.ts.map +1 -1
  112. package/dist/utils/tls-inspector.js +35 -1
  113. package/dist/webrtc/index.d.ts.map +1 -1
  114. package/dist/webrtc/index.js +21 -7
  115. package/dist/websocket/client.d.ts.map +1 -1
  116. package/dist/websocket/client.js +13 -16
  117. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,mBAwElH"}
1
+ {"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,mBA+DlH"}
package/dist/utils/doh.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { request } from 'undici';
2
- import { ReckerError } from '../core/errors.js';
2
+ import { ProtocolError, NotFoundError } from '../core/errors.js';
3
3
  const PROVIDERS = {
4
4
  cloudflare: 'https://1.1.1.1/dns-query',
5
5
  google: 'https://8.8.8.8/resolve',
@@ -17,29 +17,26 @@ export function createDoHLookup(provider = 'cloudflare') {
17
17
  headers: { 'Accept': 'application/dns-json' }
18
18
  });
19
19
  if (statusCode !== 200) {
20
- throw new ReckerError(`DoH request failed with status ${statusCode}`, undefined, undefined, [
21
- 'Verify the DNS-over-HTTPS endpoint URL.',
22
- 'Check network connectivity and TLS settings for the DoH provider.',
23
- 'Retry the request; some providers throttle bursts.'
24
- ]);
20
+ throw new ProtocolError(`DoH request failed with status ${statusCode}`, {
21
+ protocol: 'dns',
22
+ code: statusCode,
23
+ phase: 'doh-request',
24
+ retriable: statusCode >= 500 || statusCode === 429,
25
+ });
25
26
  }
26
27
  const data = await body.json();
27
28
  if (data.Status !== 0 || !data.Answer || data.Answer.length === 0) {
28
- return callback(new ReckerError(`DNS lookup failed for ${hostname}`, undefined, undefined, [
29
- 'Confirm the hostname is correct.',
30
- 'Check that the DoH provider is reachable.',
31
- 'Retry or fall back to system DNS if the provider is down.'
32
- ]), '', 4);
29
+ return callback(new NotFoundError(`DNS lookup failed for ${hostname}`, {
30
+ resource: hostname,
31
+ }), '', 4);
33
32
  }
34
33
  const record = data.Answer.find(r => r.type === 1);
35
34
  if (record) {
36
35
  return callback(null, record.data, 4);
37
36
  }
38
- callback(new ReckerError(`No A record found for ${hostname}`, undefined, undefined, [
39
- 'Verify the domain has an A record (or use AAAA for IPv6).',
40
- 'Check DNS propagation if the record was recently added.',
41
- 'Try an alternate resolver to rule out stale caches.'
42
- ]), '', 4);
37
+ callback(new NotFoundError(`No A record found for ${hostname}`, {
38
+ resource: `A:${hostname}`,
39
+ }), '', 4);
43
40
  }
44
41
  catch (err) {
45
42
  callback(err, '', 0);
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IAKpC,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAKhE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAK9B,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IAKpC,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAKhE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAK9B,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAuCzB"}
@@ -1,6 +1,6 @@
1
1
  import { createWriteStream, existsSync, statSync } from 'node:fs';
2
2
  import { pipeline } from 'node:stream/promises';
3
- import { ReckerError } from '../core/errors.js';
3
+ import { DownloadError, StreamError } from '../core/errors.js';
4
4
  export async function downloadToFile(client, url, destination, options = {}) {
5
5
  const resumeEnabled = options.resume === true;
6
6
  const existingSize = resumeEnabled && existsSync(destination) ? statSync(destination).size : 0;
@@ -15,11 +15,11 @@ export async function downloadToFile(client, url, destination, options = {}) {
15
15
  });
16
16
  const shouldAppend = resumeEnabled && existingSize > 0 && response.status === 206;
17
17
  if (resumeEnabled && existingSize > 0 && response.status === 416) {
18
- throw new ReckerError('Requested range not satisfiable for resume download.', undefined, response, [
19
- 'Verify the destination file size matches the server content.',
20
- 'Delete the local file and retry without resume.',
21
- 'Ensure the server supports Range requests for this resource.'
22
- ]);
18
+ throw new DownloadError('Requested range not satisfiable for resume download.', {
19
+ url,
20
+ statusCode: response.status,
21
+ retriable: false,
22
+ });
23
23
  }
24
24
  const bytesWritten = await streamToFile(response, destination, shouldAppend);
25
25
  return {
@@ -31,11 +31,10 @@ export async function downloadToFile(client, url, destination, options = {}) {
31
31
  async function streamToFile(response, destination, append) {
32
32
  const nodeStream = response.toNodeStream();
33
33
  if (!nodeStream) {
34
- throw new ReckerError('Response has no body to write', undefined, response, [
35
- 'Ensure the request returned a body (avoid HEAD/204).',
36
- 'Check upstream for empty responses or errors.',
37
- 'Retry the download if the connection was interrupted.'
38
- ]);
34
+ throw new StreamError('Response has no body to write', {
35
+ streamType: 'download',
36
+ retriable: true,
37
+ });
39
38
  }
40
39
  const writer = createWriteStream(destination, { flags: append ? 'a' : 'w' });
41
40
  await pipeline(nodeStream, writer);
@@ -1,6 +1,7 @@
1
1
  import { Client } from '../core/client.js';
2
2
  export interface RDAPResult {
3
3
  handle?: string;
4
+ ldhName?: string;
4
5
  status?: string[];
5
6
  events?: Array<{
6
7
  eventAction: string;
@@ -11,7 +12,15 @@ export interface RDAPResult {
11
12
  roles?: string[];
12
13
  vcardArray?: any[];
13
14
  }>;
15
+ nameservers?: Array<{
16
+ ldhName: string;
17
+ }>;
18
+ secureDNS?: {
19
+ delegationSigned: boolean;
20
+ };
14
21
  [key: string]: any;
15
22
  }
16
23
  export declare function rdap(client: Client, query: string): Promise<RDAPResult>;
24
+ export declare function supportsRDAP(tld: string): boolean;
25
+ export declare function getNoRDAPTLDs(): string[];
17
26
  //# sourceMappingURL=rdap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rdap.d.ts","sourceRoot":"","sources":["../../src/utils/rdap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAa3C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5E,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiC7E"}
1
+ {"version":3,"file":"rdap.d.ts","sourceRoot":"","sources":["../../src/utils/rdap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqC3C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE;QAAE,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AA4ED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+C7E;AAKD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAKD,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
@@ -1,32 +1,101 @@
1
+ import { NotFoundError, UnsupportedError } from '../core/errors.js';
2
+ const IANA_RDAP_BOOTSTRAP = 'https://data.iana.org/rdap/dns.json';
3
+ let ianaBootstrapCache = null;
4
+ let ianaBootstrapLastFetch = 0;
5
+ const IANA_CACHE_TTL = 24 * 60 * 60 * 1000;
1
6
  const RDAP_SERVERS = {
2
7
  'com': 'https://rdap.verisign.com/com/v1/',
3
8
  'net': 'https://rdap.verisign.com/net/v1/',
4
9
  'org': 'https://rdap.publicinterestregistry.net/rdap/org/',
5
- 'io': 'https://rdap.nic.io/domain/',
6
10
  'br': 'https://rdap.registro.br/',
7
- 'default': 'https://rdap.org/domain/'
11
+ 'dev': 'https://rdap.nic.google/',
12
+ 'app': 'https://rdap.nic.google/',
13
+ 'xyz': 'https://rdap.centralnic.com/xyz/',
14
+ 'info': 'https://rdap.afilias.net/rdap/info/',
15
+ 'me': 'https://rdap.nic.me/',
16
+ 'co': 'https://rdap.nic.co/',
17
+ 'uk': 'https://rdap.nominet.uk/uk/',
18
+ 'de': 'https://rdap.denic.de/',
19
+ 'eu': 'https://rdap.eurid.eu/',
20
+ 'nl': 'https://rdap.sidn.nl/',
21
+ 'au': 'https://rdap.auda.org.au/',
8
22
  };
23
+ const NO_RDAP_TLDS = new Set([
24
+ 'io', 'ai', 'gg', 'im', 'je', 'sh', 'ac', 'cx', 'gs', 'ms', 'nf', 'pn', 'tc', 'vg',
25
+ ]);
26
+ async function getIANABootstrap(client) {
27
+ const now = Date.now();
28
+ if (ianaBootstrapCache && (now - ianaBootstrapLastFetch) < IANA_CACHE_TTL) {
29
+ return ianaBootstrapCache;
30
+ }
31
+ try {
32
+ const data = await client.get(IANA_RDAP_BOOTSTRAP, { timeout: 5000 }).json();
33
+ const map = new Map();
34
+ for (const [tlds, servers] of data.services) {
35
+ const server = servers[0];
36
+ for (const tld of tlds) {
37
+ map.set(tld.toLowerCase(), server);
38
+ }
39
+ }
40
+ ianaBootstrapCache = map;
41
+ ianaBootstrapLastFetch = now;
42
+ return map;
43
+ }
44
+ catch {
45
+ return new Map();
46
+ }
47
+ }
48
+ async function getRDAPServer(client, tld) {
49
+ if (NO_RDAP_TLDS.has(tld)) {
50
+ return null;
51
+ }
52
+ if (RDAP_SERVERS[tld]) {
53
+ return RDAP_SERVERS[tld];
54
+ }
55
+ const bootstrap = await getIANABootstrap(client);
56
+ if (bootstrap.has(tld)) {
57
+ return bootstrap.get(tld);
58
+ }
59
+ return null;
60
+ }
9
61
  export async function rdap(client, query) {
10
- const isIp = /^\d+\.\d+\.\d+\.\d+$/.test(query);
62
+ const isIp = /^\d+\.\d+\.\d+\.\d+$/.test(query) || query.includes(':');
11
63
  let url;
12
64
  if (isIp) {
13
65
  url = `https://rdap.arin.net/registry/ip/${query}`;
14
66
  }
15
67
  else {
16
68
  const tld = query.split('.').pop()?.toLowerCase() || '';
17
- const base = RDAP_SERVERS[tld] || RDAP_SERVERS['default'];
18
- url = base.endsWith('/') ? `${base}domain/${query}` : `${base}/${query}`;
19
- if (base.includes('/domain/')) {
20
- url = `${base}${query}`;
69
+ const server = await getRDAPServer(client, tld);
70
+ if (!server) {
71
+ throw new UnsupportedError(`RDAP is not available for .${tld} domains. Use WHOIS instead: "rek whois ${query}"`, { feature: `rdap-${tld}` });
21
72
  }
73
+ const base = server.endsWith('/') ? server : `${server}/`;
74
+ url = `${base}domain/${query}`;
22
75
  }
23
76
  try {
24
- return await client.get(url, { followRedirects: true }).json();
77
+ const result = await client.get(url, {
78
+ followRedirects: true,
79
+ timeout: 10000,
80
+ headers: {
81
+ 'Accept': 'application/rdap+json, application/json',
82
+ }
83
+ }).json();
84
+ return result;
25
85
  }
26
86
  catch (error) {
27
87
  if (error.status === 404) {
28
- throw new Error(`RDAP entry not found for ${query}`);
88
+ throw new NotFoundError(`RDAP entry not found for ${query}`, {
89
+ resource: query,
90
+ });
29
91
  }
30
92
  throw error;
31
93
  }
32
94
  }
95
+ export function supportsRDAP(tld) {
96
+ const normalizedTld = tld.toLowerCase().replace(/^\./, '');
97
+ return !NO_RDAP_TLDS.has(normalizedTld);
98
+ }
99
+ export function getNoRDAPTLDs() {
100
+ return Array.from(NO_RDAP_TLDS);
101
+ }
@@ -0,0 +1,47 @@
1
+ export interface SecurityHeaderResult {
2
+ header: string;
3
+ value?: string;
4
+ status: 'pass' | 'warn' | 'fail';
5
+ score: number;
6
+ message: string;
7
+ recommendation?: string;
8
+ }
9
+ export interface CSPDirective {
10
+ name: string;
11
+ values: string[];
12
+ issues: string[];
13
+ severity: 'safe' | 'warn' | 'dangerous';
14
+ }
15
+ export interface CSPAnalysis {
16
+ raw: string;
17
+ directives: CSPDirective[];
18
+ issues: string[];
19
+ score: number;
20
+ hasUnsafeInline: boolean;
21
+ hasUnsafeEval: boolean;
22
+ hasWildcard: boolean;
23
+ missingDirectives: string[];
24
+ }
25
+ export interface SecurityReport {
26
+ grade: string;
27
+ score: number;
28
+ details: SecurityHeaderResult[];
29
+ csp?: CSPAnalysis;
30
+ summary: {
31
+ passed: number;
32
+ warnings: number;
33
+ failed: number;
34
+ };
35
+ }
36
+ export declare function analyzeCSP(cspValue: string): CSPAnalysis;
37
+ export declare function generateRecommendedCSP(options?: {
38
+ strictMode?: boolean;
39
+ allowInlineStyles?: boolean;
40
+ trustedDomains?: string[];
41
+ }): string;
42
+ export declare function analyzeSecurityHeaders(headers: Headers): SecurityReport;
43
+ export declare function quickSecurityCheck(headers: Headers): {
44
+ secure: boolean;
45
+ criticalIssues: string[];
46
+ };
47
+ //# sourceMappingURL=security-grader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-grader.d.ts","sourceRoot":"","sources":["../../src/utils/security-grader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AA2CD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAmHxD;AAKD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,MAAM,CAiCd;AAkeD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CA6DvE;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAgCA"}