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,5 +1,6 @@
1
1
  import { Socket } from 'node:net';
2
2
  import { EventEmitter } from 'node:events';
3
+ import { StateError, TimeoutError, ConnectionError } from '../core/errors.js';
3
4
  const IAC = 255;
4
5
  const CMD = {
5
6
  SE: 240,
@@ -209,7 +210,10 @@ export class Telnet extends EventEmitter {
209
210
  }
210
211
  getSocket() {
211
212
  if (!this.socket) {
212
- throw new Error('Not connected. Call connect() first.');
213
+ throw new StateError('Not connected. Call connect() first.', {
214
+ expectedState: 'connected',
215
+ actualState: 'disconnected',
216
+ });
213
217
  }
214
218
  return this.socket;
215
219
  }
@@ -414,7 +418,10 @@ export class Telnet extends EventEmitter {
414
418
  return new Promise((resolve, reject) => {
415
419
  const check = () => {
416
420
  if (Date.now() - start > timeout) {
417
- reject(new Error('Timeout waiting for prompt'));
421
+ reject(new TimeoutError(undefined, {
422
+ phase: 'response',
423
+ timeout,
424
+ }));
418
425
  return;
419
426
  }
420
427
  if (this.matchPattern(this.dataBuffer, this.config.shellPrompt)) {
@@ -429,7 +436,10 @@ export class Telnet extends EventEmitter {
429
436
  }
430
437
  write(data) {
431
438
  if (!this.socket || !this.connected) {
432
- throw new Error('Not connected');
439
+ throw new StateError('Not connected', {
440
+ expectedState: 'connected',
441
+ actualState: 'disconnected',
442
+ });
433
443
  }
434
444
  const buffer = typeof data === 'string' ? Buffer.from(data) : data;
435
445
  this.debug('Sending: %s', buffer.toString().replace(/\r\n/g, '\\r\\n'));
@@ -441,7 +451,10 @@ export class Telnet extends EventEmitter {
441
451
  const startBuffer = this.dataBuffer;
442
452
  const check = () => {
443
453
  if (Date.now() - start > timeout) {
444
- reject(new Error(`Timeout waiting for pattern: ${pattern}`));
454
+ reject(new TimeoutError(undefined, {
455
+ phase: 'response',
456
+ timeout,
457
+ }));
445
458
  return;
446
459
  }
447
460
  if (this.matchPattern(this.dataBuffer, pattern)) {
@@ -479,7 +492,10 @@ export class Telnet extends EventEmitter {
479
492
  }
480
493
  ensureConnected() {
481
494
  if (!this.connected || !this.socket) {
482
- throw new Error('Not connected to Telnet server. Call connect() first.');
495
+ throw new StateError('Not connected to Telnet server. Call connect() first.', {
496
+ expectedState: 'connected',
497
+ actualState: 'disconnected',
498
+ });
483
499
  }
484
500
  }
485
501
  cmdName(cmd) {
@@ -505,7 +521,10 @@ export async function telnet(config, operation) {
505
521
  try {
506
522
  const result = await client.connect();
507
523
  if (!result.success) {
508
- throw new Error(result.message || 'Failed to connect to Telnet server');
524
+ throw new ConnectionError(result.message || 'Failed to connect to Telnet server', {
525
+ host: config.host,
526
+ port: config.port,
527
+ });
509
528
  }
510
529
  return await operation(client);
511
530
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,CAQjE,CAAC;AAKF,8BAAsB,gBAAgB;IACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAEzC,OAAO,GAAE,uBAA4B;IAUjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,SAAS,CAAC,YAAY,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,KAAK,CAAC,MAAM;cAiBpD,aAAa,CAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAsClB,SAAS,CAAC,QAAQ,CAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAmFlB,SAAS,CAAC,cAAc,IAAI,UAAU;IAwCtC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;IAgBhE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAqB7E,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWhD,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,CAQjE,CAAC;AAKF,8BAAsB,gBAAgB;IACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAEzC,OAAO,GAAE,uBAA4B;IAUjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,SAAS,CAAC,YAAY,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,KAAK,CAAC,MAAM;cAiBpD,aAAa,CAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAsClB,SAAS,CAAC,QAAQ,CAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAmFlB,SAAS,CAAC,cAAc,IAAI,UAAU;IAwCtC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;IAgBhE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAqB7E,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAehD,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,6 +1,6 @@
1
1
  import dgram from 'node:dgram';
2
2
  import { AsyncLocalStorage } from 'node:async_hooks';
3
- import { TimeoutError, NetworkError } from '../core/errors.js';
3
+ import { TimeoutError, NetworkError, AbortError, ValidationError } from '../core/errors.js';
4
4
  export const udpRequestStorage = new AsyncLocalStorage();
5
5
  export const DEFAULT_UDP_OPTIONS = {
6
6
  timeout: 5000,
@@ -36,7 +36,7 @@ export class BaseUDPTransport {
36
36
  while (attempts < maxAttempts) {
37
37
  try {
38
38
  if (signal?.aborted) {
39
- throw new Error('Request aborted');
39
+ throw new AbortError('Request aborted');
40
40
  }
41
41
  const response = await this.sendOnce(socket, data, port, address, signal);
42
42
  return response;
@@ -102,7 +102,7 @@ export class BaseUDPTransport {
102
102
  return;
103
103
  resolved = true;
104
104
  cleanup();
105
- reject(new Error('Request aborted'));
105
+ reject(new AbortError('Request aborted'));
106
106
  }, { once: true });
107
107
  }
108
108
  socket.on('message', onMessage);
@@ -178,7 +178,10 @@ export class BaseUDPTransport {
178
178
  }
179
179
  validatePacketSize(data) {
180
180
  if (data.length > this.options.maxPacketSize) {
181
- throw new Error(`Packet size ${data.length} exceeds maximum ${this.options.maxPacketSize} bytes`);
181
+ throw new ValidationError(`Packet size ${data.length} exceeds maximum ${this.options.maxPacketSize} bytes`, {
182
+ field: 'packetSize',
183
+ value: data.length,
184
+ });
182
185
  }
183
186
  }
184
187
  sleep(ms) {
@@ -1 +1 @@
1
- {"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;IAGnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAO;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAQ;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAQ;IAC5B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAEX,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAoC1D,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,OAAO,IAAI,UAAU,CAExB;IAED,IAAI,UAAU,IAAI,aAAa,CAE9B;IAKK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAQzB,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;IAS/B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAQvB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAY5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,IAAI,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI;IAkBzC,KAAK,IAAI,kBAAkB;IAWpB,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;IAO/B,QAAQ,IAAI,cAAc,CAAC,aAAa,CAAC;IAczC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC;IAOjC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC;CAG5D;AAKD,qBAAa,oBAAqB,YAAW,WAAW;IACtD,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAGR;IAER,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAO;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAQ;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAQ;IAC5B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAEX,OAAO,GAAE,kBAAuB;IA8B5C,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,OAAO,IAAI,UAAU,CAExB;IAED,IAAI,UAAU,IAAI,aAAa,CAE9B;IAKD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBhC,QAAQ,IAAI,IAAI;IAYV,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAQzB,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;IAK/B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI;IAczC,KAAK,IAAI,oBAAoB;IAWtB,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;IAI/B,QAAQ,IAAI,cAAc,CAAC,aAAa,CAAC;IAezC,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC;IA6BjC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC;CAK5D"}
1
+ {"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { UnsupportedError, StreamError } from '../core/errors.js';
1
2
  export class UDPResponseWrapper {
2
3
  _buffer;
3
4
  _timings;
@@ -92,7 +93,9 @@ export class UDPResponseWrapper {
92
93
  });
93
94
  }
94
95
  async *sse() {
95
- throw new Error('SSE is not supported for UDP responses');
96
+ throw new UnsupportedError('SSE is not supported for UDP responses', {
97
+ feature: 'SSE',
98
+ });
96
99
  }
97
100
  async *download() {
98
101
  yield {
@@ -160,7 +163,9 @@ export class StreamingUDPResponse {
160
163
  }
161
164
  pushPacket(packet) {
162
165
  if (this._complete) {
163
- throw new Error('Cannot push to completed stream');
166
+ throw new StreamError('Cannot push to completed stream', {
167
+ streamType: 'udp',
168
+ });
164
169
  }
165
170
  const waiter = this._waiters.shift();
166
171
  if (waiter) {
@@ -227,7 +232,9 @@ export class StreamingUDPResponse {
227
232
  return cloned;
228
233
  }
229
234
  async *sse() {
230
- throw new Error('SSE is not supported for UDP responses');
235
+ throw new UnsupportedError('SSE is not supported for UDP responses', {
236
+ feature: 'SSE',
237
+ });
231
238
  }
232
239
  async *download() {
233
240
  let loaded = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;AA2CvF,qBAAa,SAAU,SAAQ,gBAAgB;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA0B;gBAErC,OAAO,GAAE,MAAW,EAAE,OAAO,GAAE,mBAAwB;IAuBnE,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,SAAS;IA0CjB,OAAO,CAAC,YAAY,CAAkB;IAKhC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAwFrD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B;AAsBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAEtE;AAKD,eAAO,MAAM,GAAG,EAAE,YAuGjB,CAAC;AAGF,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;AA4CvF,qBAAa,SAAU,SAAQ,gBAAgB;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA0B;gBAErC,OAAO,GAAE,MAAW,EAAE,OAAO,GAAE,mBAAwB;IAuBnE,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,SAAS;IA0CjB,OAAO,CAAC,YAAY,CAAkB;IAKhC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA2FrD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B;AAsBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAEtE;AAKD,eAAO,MAAM,GAAG,EAAE,YAuGjB,CAAC;AAGF,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import dgram from 'node:dgram';
2
2
  import { BaseUDPTransport, udpRequestStorage } from './base-udp.js';
3
3
  import { UDPResponseWrapper } from './udp-response.js';
4
+ import { ValidationError } from '../core/errors.js';
4
5
  const DEFAULT_OPTIONS = {
5
6
  timeout: 5000,
6
7
  retransmissions: 3,
@@ -84,7 +85,10 @@ export class UDPClient extends BaseUDPTransport {
84
85
  const { host, port, path } = this.parseUrl(fullUrl);
85
86
  this.log(`Dispatch to ${fullUrl}`);
86
87
  if (!host || !port) {
87
- throw new Error(`Invalid UDP URL: ${fullUrl}. Expected format: udp://host:port/path`);
88
+ throw new ValidationError(`Invalid UDP URL: ${fullUrl}. Expected format: udp://host:port/path`, {
89
+ field: 'url',
90
+ value: fullUrl,
91
+ });
88
92
  }
89
93
  let body;
90
94
  if (req.body === null || req.body === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"undici.d.ts","sourceRoot":"","sources":["../../src/transport/undici.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAW,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAgB,UAAU,EAAkD,MAAM,mBAAmB,CAAC;AAOxN,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAwNzD,UAAU,sBAAsB;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqDD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAK;IAElC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAU;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAmG3D,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;YA4U7C,YAAY;CAkQ3B"}
1
+ {"version":3,"file":"undici.d.ts","sourceRoot":"","sources":["../../src/transport/undici.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAW,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAgB,UAAU,EAAkD,MAAM,mBAAmB,CAAC;AAOxN,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAwNzD,UAAU,sBAAsB;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAMtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqDD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAC,cAAc,CAAK;IAElC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAU;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAmG3D,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;YA+U7C,YAAY;CAoQ3B"}
@@ -1,6 +1,6 @@
1
1
  import { request as undiciRequest, errors as undiciErrors, ProxyAgent, Agent, Client } from 'undici';
2
2
  import { HttpResponse } from '../core/response.js';
3
- import { NetworkError, TimeoutError, ReckerError } from '../core/errors.js';
3
+ import { NetworkError, TimeoutError, MaxSizeExceededError } from '../core/errors.js';
4
4
  import { performance } from 'perf_hooks';
5
5
  import { AsyncLocalStorage } from 'async_hooks';
6
6
  import { channel } from 'node:diagnostics_channel';
@@ -303,7 +303,7 @@ export class UndiciTransport {
303
303
  connectTimeout: timeouts.connectTimeout,
304
304
  headersTimeout: timeouts.headersTimeout,
305
305
  bodyTimeout: timeouts.bodyTimeout,
306
- maxRedirections: handleRedirectsManually ? 0 : this.options.maxRedirections,
306
+ maxRedirections: 0,
307
307
  };
308
308
  if (finalBody && (finalBody instanceof ReadableStream ||
309
309
  (typeof finalBody.pipe === 'function') ||
@@ -347,39 +347,49 @@ export class UndiciTransport {
347
347
  }
348
348
  const statusCode = undiciResponse.statusCode;
349
349
  const isRedirect = statusCode >= 300 && statusCode < 400;
350
- if (handleRedirectsManually && isRedirect && followRedirects && redirectCount < maxRedirects) {
350
+ if (isRedirect && followRedirects && redirectCount < maxRedirects) {
351
351
  const locationHeader = undiciResponse.headers['location'];
352
352
  const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader;
353
353
  if (location) {
354
354
  const nextUrl = new URL(location, currentUrl).toString();
355
- const responseHeaders = new Headers();
356
- for (const [key, value] of Object.entries(undiciResponse.headers)) {
357
- if (value !== undefined) {
358
- if (Array.isArray(value)) {
359
- value.forEach(v => responseHeaders.append(key, v));
360
- }
361
- else {
362
- responseHeaders.set(key, value);
355
+ if (handleRedirectsManually) {
356
+ const responseHeaders = new Headers();
357
+ for (const [key, value] of Object.entries(undiciResponse.headers)) {
358
+ if (value !== undefined) {
359
+ if (Array.isArray(value)) {
360
+ value.forEach(v => responseHeaders.append(key, v));
361
+ }
362
+ else {
363
+ responseHeaders.set(key, value);
364
+ }
363
365
  }
364
366
  }
367
+ const redirectInfo = {
368
+ from: currentUrl,
369
+ to: nextUrl,
370
+ status: statusCode,
371
+ headers: responseHeaders,
372
+ };
373
+ const hookResult = await req.beforeRedirect(redirectInfo);
374
+ if (hookResult === false) {
375
+ const finalResponse = req.onDownloadProgress
376
+ ? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
377
+ : undiciResponse;
378
+ return new HttpResponse(finalResponse, {
379
+ timings: requestContext.timings,
380
+ connection: requestContext.connection
381
+ });
382
+ }
383
+ if (typeof hookResult === 'string') {
384
+ currentUrl = hookResult;
385
+ }
386
+ else {
387
+ currentUrl = nextUrl;
388
+ }
365
389
  }
366
- const redirectInfo = {
367
- from: currentUrl,
368
- to: nextUrl,
369
- status: statusCode,
370
- headers: responseHeaders,
371
- };
372
- const hookResult = await req.beforeRedirect(redirectInfo);
373
- if (hookResult === false) {
374
- const finalResponse = req.onDownloadProgress
375
- ? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
376
- : undiciResponse;
377
- return new HttpResponse(finalResponse, {
378
- timings: requestContext.timings,
379
- connection: requestContext.connection
380
- });
390
+ else {
391
+ currentUrl = nextUrl;
381
392
  }
382
- currentUrl = typeof hookResult === 'string' ? hookResult : nextUrl;
383
393
  if (statusCode === 303 || ((statusCode === 301 || statusCode === 302) && currentMethod !== 'GET' && currentMethod !== 'HEAD')) {
384
394
  currentMethod = 'GET';
385
395
  currentBody = null;
@@ -437,11 +447,7 @@ export class UndiciTransport {
437
447
  }
438
448
  const code = error.code || error?.cause?.code;
439
449
  if (code === 'UND_ERR_HEADERS_OVERFLOW') {
440
- throw new ReckerError('Response headers exceeded the maximum allowed size', req, undefined, [
441
- 'Reduce response header size or adjust maxHeaderSize in agent configuration.',
442
- 'Check for runaway set-cookie or debug headers.',
443
- 'Verify upstream is not sending excessive headers.'
444
- ], false);
450
+ throw new MaxSizeExceededError(16 * 1024, undefined, req);
445
451
  }
446
452
  throw new NetworkError(error.message, code, req);
447
453
  }
@@ -518,7 +524,7 @@ export class UndiciTransport {
518
524
  connectTimeout: timeouts.connectTimeout,
519
525
  headersTimeout: timeouts.headersTimeout,
520
526
  bodyTimeout: timeouts.bodyTimeout,
521
- maxRedirections: handleRedirectsManually ? 0 : this.options.maxRedirections,
527
+ maxRedirections: 0,
522
528
  };
523
529
  if (finalBody && (finalBody instanceof ReadableStream ||
524
530
  (typeof finalBody.pipe === 'function') ||
@@ -562,39 +568,49 @@ export class UndiciTransport {
562
568
  }
563
569
  const statusCode = undiciResponse.statusCode;
564
570
  const isRedirect = statusCode >= 300 && statusCode < 400;
565
- if (handleRedirectsManually && isRedirect && followRedirects && redirectCount < maxRedirects) {
571
+ if (isRedirect && followRedirects && redirectCount < maxRedirects) {
566
572
  const locationHeader = undiciResponse.headers['location'];
567
573
  const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader;
568
574
  if (location) {
569
575
  const nextUrl = new URL(location, currentUrl).toString();
570
- const responseHeaders = new Headers();
571
- for (const [key, value] of Object.entries(undiciResponse.headers)) {
572
- if (value !== undefined) {
573
- if (Array.isArray(value)) {
574
- value.forEach(v => responseHeaders.append(key, v));
575
- }
576
- else {
577
- responseHeaders.set(key, value);
576
+ if (handleRedirectsManually) {
577
+ const responseHeaders = new Headers();
578
+ for (const [key, value] of Object.entries(undiciResponse.headers)) {
579
+ if (value !== undefined) {
580
+ if (Array.isArray(value)) {
581
+ value.forEach(v => responseHeaders.append(key, v));
582
+ }
583
+ else {
584
+ responseHeaders.set(key, value);
585
+ }
578
586
  }
579
587
  }
588
+ const redirectInfo = {
589
+ from: currentUrl,
590
+ to: nextUrl,
591
+ status: statusCode,
592
+ headers: responseHeaders,
593
+ };
594
+ const hookResult = await req.beforeRedirect(redirectInfo);
595
+ if (hookResult === false) {
596
+ const finalResponse = req.onDownloadProgress
597
+ ? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
598
+ : undiciResponse;
599
+ return new HttpResponse(finalResponse, {
600
+ timings: {},
601
+ connection: {}
602
+ });
603
+ }
604
+ if (typeof hookResult === 'string') {
605
+ currentUrl = hookResult;
606
+ }
607
+ else {
608
+ currentUrl = nextUrl;
609
+ }
580
610
  }
581
- const redirectInfo = {
582
- from: currentUrl,
583
- to: nextUrl,
584
- status: statusCode,
585
- headers: responseHeaders,
586
- };
587
- const hookResult = await req.beforeRedirect(redirectInfo);
588
- if (hookResult === false) {
589
- const finalResponse = req.onDownloadProgress
590
- ? wrapDownloadResponse(undiciResponse, req.onDownloadProgress)
591
- : undiciResponse;
592
- return new HttpResponse(finalResponse, {
593
- timings: {},
594
- connection: {}
595
- });
611
+ else {
612
+ currentUrl = nextUrl;
596
613
  }
597
- currentUrl = typeof hookResult === 'string' ? hookResult : nextUrl;
598
614
  if (statusCode === 303 || ((statusCode === 301 || statusCode === 302) && currentMethod !== 'GET' && currentMethod !== 'HEAD')) {
599
615
  currentMethod = 'GET';
600
616
  currentBody = null;
@@ -644,11 +660,7 @@ export class UndiciTransport {
644
660
  }
645
661
  const code = error.code || error?.cause?.code;
646
662
  if (code === 'UND_ERR_HEADERS_OVERFLOW') {
647
- throw new ReckerError('Response headers exceeded the maximum allowed size', req, undefined, [
648
- 'Reduce response header size or adjust maxHeaderSize in agent configuration.',
649
- 'Check for runaway set-cookie or debug headers.',
650
- 'Verify upstream is not sending excessive headers.'
651
- ], false);
663
+ throw new MaxSizeExceededError(16 * 1024, undefined, req);
652
664
  }
653
665
  throw new NetworkError(error.message, code, req);
654
666
  }
@@ -14,6 +14,7 @@ export declare class AgentManager {
14
14
  getAgentForDomain(domain: string, options?: Partial<AgentOptions>): Agent;
15
15
  getAgentForUrl(url: string): Agent;
16
16
  createBatchAgent(concurrency: number, requestCount: number, options?: Partial<AgentOptions>): Agent;
17
+ createStressTestAgent(concurrency: number): Agent;
17
18
  private createAgent;
18
19
  getStats(): AgentStats;
19
20
  closeDomainAgent(domain: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/utils/agent-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAoJ;gBAEvJ,OAAO,GAAE,YAAiB;IAsBtC,cAAc,IAAI,KAAK;IAavB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK;IAkBzE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAmBlC,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,KAAK;IAmCR,OAAO,CAAC,WAAW;IAyBnB,QAAQ,IAAI,UAAU;IAWhB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B;AAOD,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,KAAK,CAG7D;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AASD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAcxD"}
1
+ {"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/utils/agent-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAoJ;gBAEvJ,OAAO,GAAE,YAAiB;IAsBtC,cAAc,IAAI,KAAK;IAavB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK;IAkBzE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAmBlC,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,KAAK;IA4CR,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK;IAmBjD,OAAO,CAAC,WAAW;IAyBnB,QAAQ,IAAI,UAAU;IAWhB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B;AAOD,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,KAAK,CAG7D;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AASD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAcxD"}
@@ -61,6 +61,17 @@ export class AgentManager {
61
61
  };
62
62
  return this.createAgent(batchOptions);
63
63
  }
64
+ createStressTestAgent(concurrency) {
65
+ const pipelining = 10;
66
+ const connections = Math.min(Math.ceil(concurrency / pipelining), 100);
67
+ return this.createAgent({
68
+ connections,
69
+ pipelining,
70
+ keepAliveTimeout: 30000,
71
+ keepAliveMaxTimeout: 120000,
72
+ connectTimeout: 5000,
73
+ });
74
+ }
64
75
  createAgent(options) {
65
76
  return new Agent({
66
77
  connections: options.connections,
@@ -1 +1 @@
1
- {"version":3,"file":"client-pool.d.ts","sourceRoot":"","sources":["../../src/utils/client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAwB/D,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAM;IAQhE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiB5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,KAAK,IAAI,IAAI;IAOb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAmB1B,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,GACD,OAAO,CAAC,CAAC,EAAE,CAAC;CAchB;AAcD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAW3C,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,CAAM,GAAG,UAAU,CAK1G"}
1
+ {"version":3,"file":"client-pool.d.ts","sourceRoot":"","sources":["../../src/utils/client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAyB/D,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAM;IAQhE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAiB5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAO7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,KAAK,IAAI,IAAI;IAOb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAmB1B,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC,GACD,OAAO,CAAC,CAAC,EAAE,CAAC;CAgBhB;AAcD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAW3C,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,CAAM,GAAG,UAAU,CAK1G"}
@@ -1,4 +1,5 @@
1
1
  import { Client } from '../core/client.js';
2
+ import { UnsupportedError } from '../core/errors.js';
2
3
  export class ClientPool {
3
4
  pool = new Map();
4
5
  defaultOptions;
@@ -33,7 +34,9 @@ export class ClientPool {
33
34
  const client = this.get(baseUrl);
34
35
  const methodFn = client[method.toLowerCase()];
35
36
  if (typeof methodFn !== 'function') {
36
- throw new Error(`Unknown HTTP method: ${method}`);
37
+ throw new UnsupportedError(`Unknown HTTP method: ${method}`, {
38
+ feature: method,
39
+ });
37
40
  }
38
41
  return methodFn.call(client, path, options).json();
39
42
  });
@@ -1,13 +1,100 @@
1
+ export interface DigOptions {
2
+ server?: string;
3
+ short?: boolean;
4
+ type?: string;
5
+ reverse?: boolean;
6
+ }
7
+ export interface DigResult {
8
+ question: {
9
+ name: string;
10
+ type: string;
11
+ class: string;
12
+ };
13
+ answer: Array<{
14
+ name: string;
15
+ type: string;
16
+ class: string;
17
+ ttl: number;
18
+ data: string;
19
+ }>;
20
+ server: string;
21
+ queryTime: number;
22
+ when: Date;
23
+ }
1
24
  export interface DnsSecurityRecords {
2
25
  spf?: string[];
3
26
  dmarc?: string;
27
+ dkim?: string;
4
28
  caa?: {
5
29
  issue?: string[];
6
30
  issuewild?: string[];
7
31
  iodef?: string;
8
32
  };
9
- mx?: string[];
33
+ mx?: Array<{
34
+ priority: number;
35
+ exchange: string;
36
+ }>;
10
37
  txt?: string[];
11
38
  }
39
+ export interface DnsLookupResult {
40
+ type: string;
41
+ ttl?: number;
42
+ data: string | object;
43
+ }
44
+ export interface DnsHealthReport {
45
+ domain: string;
46
+ score: number;
47
+ grade: string;
48
+ checks: Array<{
49
+ name: string;
50
+ status: 'pass' | 'warn' | 'fail';
51
+ message: string;
52
+ details?: any;
53
+ }>;
54
+ }
55
+ export interface SpfValidation {
56
+ valid: boolean;
57
+ record?: string;
58
+ mechanisms: string[];
59
+ includes: string[];
60
+ lookupCount: number;
61
+ warnings: string[];
62
+ errors: string[];
63
+ }
64
+ export interface DmarcValidation {
65
+ valid: boolean;
66
+ record?: string;
67
+ policy: string;
68
+ subdomainPolicy?: string;
69
+ percentage: number;
70
+ rua?: string[];
71
+ ruf?: string[];
72
+ warnings: string[];
73
+ }
74
+ export declare function dnsLookup(domain: string, type?: string): Promise<DnsLookupResult[]>;
75
+ export declare function dnsLookupAll(domain: string): Promise<DnsLookupResult[]>;
76
+ export declare function reverseLookup(ip: string): Promise<string[]>;
12
77
  export declare function getSecurityRecords(domain: string): Promise<DnsSecurityRecords>;
78
+ export declare function validateSpf(domain: string): Promise<SpfValidation>;
79
+ export declare function validateDmarc(domain: string): Promise<DmarcValidation>;
80
+ export declare function checkDkim(domain: string, selector?: string): Promise<{
81
+ found: boolean;
82
+ record?: string;
83
+ publicKey?: string;
84
+ }>;
85
+ export declare function checkDnsHealth(domain: string): Promise<DnsHealthReport>;
86
+ export interface DmarcGeneratorOptions {
87
+ policy: 'none' | 'quarantine' | 'reject';
88
+ subdomainPolicy?: 'none' | 'quarantine' | 'reject';
89
+ percentage?: number;
90
+ aggregateReports?: string[];
91
+ forensicReports?: string[];
92
+ alignmentDkim?: 'relaxed' | 'strict';
93
+ alignmentSpf?: 'relaxed' | 'strict';
94
+ reportInterval?: number;
95
+ failureOptions?: string;
96
+ }
97
+ export declare function generateDmarc(options: DmarcGeneratorOptions): string;
98
+ export declare function dig(domain: string, options?: DigOptions): Promise<DigResult>;
99
+ export declare function formatDigOutput(result: DigResult, short?: boolean): string;
13
100
  //# sourceMappingURL=dns-toolkit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dns-toolkit.d.ts","sourceRoot":"","sources":["../../src/utils/dns-toolkit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+DpF"}
1
+ {"version":3,"file":"dns-toolkit.d.ts","sourceRoot":"","sources":["../../src/utils/dns-toolkit.ts"],"names":[],"mappings":"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"}