rdapify 0.1.2 → 0.1.6

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 (101) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +11 -9
  3. package/dist/application/client/RDAPClient.d.ts +13 -0
  4. package/dist/application/client/RDAPClient.d.ts.map +1 -1
  5. package/dist/application/client/RDAPClient.js +40 -1
  6. package/dist/application/client/RDAPClient.js.map +1 -1
  7. package/dist/application/deduplication/QueryDeduplicator.d.ts +20 -0
  8. package/dist/application/deduplication/QueryDeduplicator.d.ts.map +1 -0
  9. package/dist/application/deduplication/QueryDeduplicator.js +46 -0
  10. package/dist/application/deduplication/QueryDeduplicator.js.map +1 -0
  11. package/dist/application/hooks/MiddlewareHooks.d.ts +48 -0
  12. package/dist/application/hooks/MiddlewareHooks.d.ts.map +1 -0
  13. package/dist/application/hooks/MiddlewareHooks.js +46 -0
  14. package/dist/application/hooks/MiddlewareHooks.js.map +1 -0
  15. package/dist/application/services/QueryOrchestrator.d.ts +11 -0
  16. package/dist/application/services/QueryOrchestrator.d.ts.map +1 -1
  17. package/dist/application/services/QueryOrchestrator.js +254 -38
  18. package/dist/application/services/QueryOrchestrator.js.map +1 -1
  19. package/dist/cli/index.d.ts +3 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +227 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/index.d.ts +10 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +15 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/infrastructure/cache/CacheManager.d.ts.map +1 -1
  28. package/dist/infrastructure/cache/CacheManager.js +8 -1
  29. package/dist/infrastructure/cache/CacheManager.js.map +1 -1
  30. package/dist/infrastructure/cache/RedisCache.d.ts +35 -0
  31. package/dist/infrastructure/cache/RedisCache.d.ts.map +1 -0
  32. package/dist/infrastructure/cache/RedisCache.js +75 -0
  33. package/dist/infrastructure/cache/RedisCache.js.map +1 -0
  34. package/dist/infrastructure/cache/index.d.ts +1 -0
  35. package/dist/infrastructure/cache/index.d.ts.map +1 -1
  36. package/dist/infrastructure/cache/index.js +3 -1
  37. package/dist/infrastructure/cache/index.js.map +1 -1
  38. package/dist/infrastructure/http/BootstrapDiscovery.d.ts.map +1 -1
  39. package/dist/infrastructure/http/BootstrapDiscovery.js +5 -2
  40. package/dist/infrastructure/http/BootstrapDiscovery.js.map +1 -1
  41. package/dist/infrastructure/http/ConnectionPool.d.ts +1 -1
  42. package/dist/infrastructure/http/ConnectionPool.d.ts.map +1 -1
  43. package/dist/infrastructure/http/ConnectionPool.js +9 -4
  44. package/dist/infrastructure/http/ConnectionPool.js.map +1 -1
  45. package/dist/infrastructure/http/Fetcher.d.ts +2 -0
  46. package/dist/infrastructure/http/Fetcher.d.ts.map +1 -1
  47. package/dist/infrastructure/http/Fetcher.js +12 -4
  48. package/dist/infrastructure/http/Fetcher.js.map +1 -1
  49. package/dist/infrastructure/http/Normalizer.d.ts.map +1 -1
  50. package/dist/infrastructure/http/Normalizer.js +16 -9
  51. package/dist/infrastructure/http/Normalizer.js.map +1 -1
  52. package/dist/infrastructure/logging/AuditLogger.d.ts +114 -0
  53. package/dist/infrastructure/logging/AuditLogger.d.ts.map +1 -0
  54. package/dist/infrastructure/logging/AuditLogger.js +195 -0
  55. package/dist/infrastructure/logging/AuditLogger.js.map +1 -0
  56. package/dist/infrastructure/logging/Logger.d.ts.map +1 -1
  57. package/dist/infrastructure/logging/Logger.js +29 -5
  58. package/dist/infrastructure/logging/Logger.js.map +1 -1
  59. package/dist/infrastructure/monitoring/MetricsCollector.d.ts +37 -0
  60. package/dist/infrastructure/monitoring/MetricsCollector.d.ts.map +1 -1
  61. package/dist/infrastructure/monitoring/MetricsCollector.js +186 -6
  62. package/dist/infrastructure/monitoring/MetricsCollector.js.map +1 -1
  63. package/dist/infrastructure/security/PIIRedactor.d.ts.map +1 -1
  64. package/dist/infrastructure/security/PIIRedactor.js +9 -2
  65. package/dist/infrastructure/security/PIIRedactor.js.map +1 -1
  66. package/dist/infrastructure/security/SSRFProtection.d.ts.map +1 -1
  67. package/dist/infrastructure/security/SSRFProtection.js +7 -4
  68. package/dist/infrastructure/security/SSRFProtection.js.map +1 -1
  69. package/dist/infrastructure/validation/ResponseValidator.d.ts +38 -0
  70. package/dist/infrastructure/validation/ResponseValidator.d.ts.map +1 -0
  71. package/dist/infrastructure/validation/ResponseValidator.js +200 -0
  72. package/dist/infrastructure/validation/ResponseValidator.js.map +1 -0
  73. package/dist/shared/constants/rdap.constants.d.ts +1 -1
  74. package/dist/shared/constants/rdap.constants.d.ts.map +1 -1
  75. package/dist/shared/constants/rdap.constants.js +1 -1
  76. package/dist/shared/constants/rdap.constants.js.map +1 -1
  77. package/dist/shared/errors/base.error.d.ts +8 -0
  78. package/dist/shared/errors/base.error.d.ts.map +1 -1
  79. package/dist/shared/errors/base.error.js +30 -1
  80. package/dist/shared/errors/base.error.js.map +1 -1
  81. package/dist/shared/types/options.d.ts +21 -2
  82. package/dist/shared/types/options.d.ts.map +1 -1
  83. package/dist/shared/types/options.js +6 -1
  84. package/dist/shared/types/options.js.map +1 -1
  85. package/dist/shared/utils/helpers/index.d.ts +1 -1
  86. package/dist/shared/utils/helpers/index.d.ts.map +1 -1
  87. package/dist/shared/utils/helpers/index.js +2 -1
  88. package/dist/shared/utils/helpers/index.js.map +1 -1
  89. package/dist/shared/utils/helpers/runtime.d.ts +1 -0
  90. package/dist/shared/utils/helpers/runtime.d.ts.map +1 -1
  91. package/dist/shared/utils/helpers/runtime.js +11 -1
  92. package/dist/shared/utils/helpers/runtime.js.map +1 -1
  93. package/dist/shared/utils/validators/config-validation.d.ts +3 -0
  94. package/dist/shared/utils/validators/config-validation.d.ts.map +1 -0
  95. package/dist/shared/utils/validators/config-validation.js +97 -0
  96. package/dist/shared/utils/validators/config-validation.js.map +1 -0
  97. package/dist/shared/utils/validators/index.d.ts +1 -0
  98. package/dist/shared/utils/validators/index.d.ts.map +1 -1
  99. package/dist/shared/utils/validators/index.js +3 -1
  100. package/dist/shared/utils/validators/index.js.map +1 -1
  101. package/package.json +4 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.3] - 2026-03-12
11
+
12
+ ### Fixed
13
+
14
+ - **Normalizer.ts**: Added defensive null checks for nameserver extraction
15
+ - Handle null/undefined nameservers array entries
16
+ - Filter out empty string nameserver names
17
+ - Prevent crashes on malformed nameserver data
18
+
19
+ - **Normalizer.ts**: Added defensive null checks for registrar extraction
20
+ - Validate vcardArray length before accessing elements
21
+ - Validate fnField array length before accessing index 3
22
+ - Handle missing registrar name gracefully
23
+
24
+ - **BootstrapDiscovery.ts**: Added NaN validation for ASN range parsing
25
+ - Skip malformed ASN range patterns that parse to NaN
26
+ - Prevent silent failures in ASN discovery
27
+
28
+ - **Fetcher.ts**: Added URL validation for redirects
29
+ - Catch and report invalid redirect URLs
30
+ - Prevent SSRF bypass through malformed redirect URLs
31
+
32
+ - **ConnectionPool.ts**: Added timeout for connection acquisition
33
+ - Prevent infinite wait when all connections are in use
34
+ - Add configurable timeout parameter to acquire()
35
+ - Default timeout of 5 seconds
36
+
37
+ - **PIIRedactor.ts**: Improved deep copy with structuredClone
38
+ - Use structuredClone for proper deep copying
39
+ - Handle Date, Map, Set, and circular references
40
+ - Fallback to JSON.parse for non-serializable values
41
+
42
+ - **SSRFProtection.ts**: Added IPv6 bracket handling
43
+ - Strip brackets from IPv6 addresses before validation
44
+ - Support both bracketed and non-bracketed IPv6 formats
45
+
46
+ - **MetricsCollector.ts**: Added division by zero protection
47
+ - Guard against division by zero in avgResponseTime calculation
48
+ - Return 0 for empty metrics instead of Infinity
49
+
50
+ ### Security
51
+
52
+ - **SSRFProtection.ts**: Improved IPv6 zone ID handling
53
+ - Extract zone ID before IP validation
54
+ - Validate IP without zone ID for SSRF checks
55
+
56
+ ### Performance
57
+
58
+ - **ConnectionPool.ts**: Added timeout parameter to acquire()
59
+ - Prevent deadlocks in high-concurrency scenarios
60
+ - Allow configurable timeout per request
61
+
62
+ ### Testing
63
+
64
+ - Added 15+ new test cases for edge cases
65
+ - Added tests for Normalizer defensive checks
66
+ - Added tests for ConnectionPool timeout handling
67
+ - Added tests for MetricsCollector edge cases
68
+ - Added tests for SSRFProtection IPv6 handling
69
+
10
70
  ## [0.1.2] - 2026-01-27
11
71
 
12
72
  ### Added
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  > **🎉 LATEST RELEASE**: v0.1.2 — Production-ready with interactive playground, advanced features including authentication, proxy support, compression, retry strategies, and comprehensive monitoring. See [What's New in v0.1.2](#-whats-new-in-v012) below.
4
4
 
5
+ > **⚠️ UPGRADE NOTICE**: If you're using v0.1.0 or v0.1.1, please upgrade to v0.1.2 for new features and bug fixes. **No breaking changes** - seamless upgrade! See [Migration Guide](./MIGRATION_TO_0.1.2.md) or simply run: `npm install rdapify@latest`
6
+
5
7
  [![npm version](https://img.shields.io/npm/v/rdapify?style=flat-square)](https://www.npmjs.com/package/rdapify)
6
8
  [![License](https://img.shields.io/npm/l/rdapify?style=flat-square)](LICENSE)
7
9
  [![Security](https://img.shields.io/badge/security-SSRF%20Protected-brightgreen?style=flat-square)](SECURITY.md)
@@ -148,7 +150,7 @@ logs.forEach((log) => {
148
150
  client.destroy();
149
151
  ```
150
152
 
151
- ### With Authentication & Proxy (v0.1.3+)
153
+ ### With Authentication & Proxy (v0.1.2+)
152
154
 
153
155
  ```typescript
154
156
  import { RDAPClient, AuthenticationManager, ProxyManager } from 'rdapify';
@@ -180,7 +182,7 @@ const proxyUrl = proxy.shouldBypass('example.com')
180
182
  : proxy.getProxyUrl();
181
183
  ```
182
184
 
183
- ### With Advanced Features (v0.1.3+)
185
+ ### With Advanced Features (v0.1.2+)
184
186
 
185
187
  ```typescript
186
188
  import {
@@ -235,19 +237,19 @@ const compression = new CompressionManager({
235
237
  - **Certificate Validation**: Reject insecure connections to RDAP servers
236
238
  - **Rate Limiting**: Prevent service blocking due to excessive requests
237
239
  - **Secure Data Handling**: PII redaction according to GDPR/CCPA requirements
238
- - **Authentication Support** (v0.1.3+): Basic, Bearer Token, API Key, OAuth2
239
- - **Proxy Support** (v0.1.3+): HTTP/HTTPS/SOCKS4/SOCKS5 with authentication
240
+ - **Authentication Support** (v0.1.2+): Basic, Bearer Token, API Key, OAuth2
241
+ - **Proxy Support** (v0.1.2+): HTTP/HTTPS/SOCKS4/SOCKS5 with authentication
240
242
  - **Full Audit Trail**: Track all critical operations for compliance purposes
241
243
 
242
244
  ### ⚡ Exceptional Performance
243
245
 
244
246
  - **Smart Caching**: In-memory LRU cache with configurable TTL
245
- - **Persistent Cache** (v0.1.3+): File-based cache that survives restarts
247
+ - **Persistent Cache** (v0.1.2+): File-based cache that survives restarts
246
248
  - **Connection Pooling** (v0.1.2+): HTTP connection reuse for 30-40% performance improvement
247
249
  - **Batch Processing**: Process multiple queries efficiently (5-10x faster)
248
- - **Response Compression** (v0.1.3+): gzip/brotli support for 60-80% bandwidth reduction
249
- - **Retry Strategies** (v0.1.3+): Circuit breaker with exponential backoff
250
- - **Query Prioritization** (v0.1.3+): High/normal/low priority queue
250
+ - **Response Compression** (v0.1.2+): gzip/brotli support for 60-80% bandwidth reduction
251
+ - **Retry Strategies** (v0.1.2+): Circuit breaker with exponential backoff
252
+ - **Query Prioritization** (v0.1.2+): High/normal/low priority queue
251
253
  - **Registry Discovery**: Automatic IANA Bootstrap for finding the correct registry
252
254
  - **Optimized Parsing**: Fast JSONPath-based normalization
253
255
 
@@ -264,7 +266,7 @@ const compression = new CompressionManager({
264
266
 
265
267
  - **Full TypeScript Support**: Strongly typed with embedded documentation
266
268
  - **Node.js Support**: Verified working (target: Node.js 20+)
267
- - **Enhanced Validation** (v0.1.3+): IDN domains, IPv6 zones, ASN ranges
269
+ - **Enhanced Validation** (v0.1.2+): IDN domains, IPv6 zones, ASN ranges
268
270
  - **Interactive CLI**: For quick queries and testing (planned)
269
271
  - **Web Playground**: Try the library directly in your browser (planned)
270
272
  - **Pre-built Templates**: For AWS Lambda, Azure Functions, Kubernetes, and more (planned)
@@ -3,6 +3,8 @@ import { Logger } from '../../infrastructure/logging/Logger';
3
3
  import type { DomainResponse, IPResponse, ASNResponse } from '../../shared/types';
4
4
  import type { RDAPClientOptions } from '../../shared/types/options';
5
5
  import { BatchProcessor } from '../services/BatchProcessor';
6
+ import { MiddlewareManager } from '../hooks/MiddlewareHooks';
7
+ import type { MiddlewareOptions } from '../hooks/MiddlewareHooks';
6
8
  export declare class RDAPClient {
7
9
  private readonly options;
8
10
  private readonly cache;
@@ -17,6 +19,10 @@ export declare class RDAPClient {
17
19
  private readonly connectionPool;
18
20
  private readonly metricsCollector;
19
21
  private readonly logger;
22
+ private readonly middlewareManager;
23
+ private readonly queryDeduplicator;
24
+ private readonly debugEnabled;
25
+ private readonly debugLogger?;
20
26
  constructor(options?: RDAPClientOptions);
21
27
  domain(domain: string): Promise<DomainResponse>;
22
28
  ip(ip: string): Promise<IPResponse>;
@@ -45,6 +51,13 @@ export declare class RDAPClient {
45
51
  idleConnections: number;
46
52
  hosts: number;
47
53
  };
54
+ use(hooks: Partial<MiddlewareOptions>): this;
55
+ getMiddlewareManager(): MiddlewareManager;
56
+ getDeduplicatorStats(): {
57
+ enabled: boolean;
58
+ inflight: number;
59
+ windowMs: number;
60
+ };
48
61
  getLogger(): Logger;
49
62
  getLogs(count?: number): import("../../infrastructure/logging/Logger").LogEntry[];
50
63
  clearAll(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"RDAPClient.d.ts","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlF,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAgB5D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBACpB,OAAO,GAAE,iBAAsB;IA8GrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB/C,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAOvC,cAAc;IA0C5B,OAAO,CAAC,gBAAgB;IAOlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,QAAQ,IAAI,OAAO,CAAC;QACxB,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,OAAO,CAAC;YACjB,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,SAAS,EAAE;YACT,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,EAAE,CAAC;SACjB,CAAC;KACH,CAAC;IAUF,SAAS,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAOxC,cAAc,IAAI,WAAW;IAO7B,iBAAiB,IAAI,cAAc;IAOnC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM;IAOzB,sBAAsB;;;;;;IAOtB,SAAS,IAAI,MAAM;IAOnB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM;IAOhB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"RDAPClient.d.ts","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlF,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAyClE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAK3B;gBACU,OAAO,GAAE,iBAAsB;IAkJrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB/C,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAOvC,cAAc;IA0C5B,OAAO,CAAC,gBAAgB;IAOlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,QAAQ,IAAI,OAAO,CAAC;QACxB,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,OAAO,CAAC;YACjB,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,SAAS,EAAE;YACT,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,EAAE,CAAC;SACjB,CAAC;KACH,CAAC;IAUF,SAAS,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAOxC,cAAc,IAAI,WAAW;IAO7B,iBAAiB,IAAI,cAAc;IAOnC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM;IAOzB,sBAAsB;;;;;;IActB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAQ5C,oBAAoB,IAAI,iBAAiB;IAOzC,oBAAoB;;;;;IAOpB,SAAS,IAAI,MAAM;IAOnB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM;IAOhB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B,OAAO,IAAI,IAAI;CAIhB"}
@@ -13,6 +13,8 @@ const options_1 = require("../../shared/types/options");
13
13
  const helpers_1 = require("../../shared/utils/helpers");
14
14
  const services_1 = require("../services");
15
15
  const BatchProcessor_1 = require("../services/BatchProcessor");
16
+ const MiddlewareHooks_1 = require("../hooks/MiddlewareHooks");
17
+ const QueryDeduplicator_1 = require("../deduplication/QueryDeduplicator");
16
18
  class RDAPClient {
17
19
  constructor(options = {}) {
18
20
  this.options = this.normalizeOptions(options);
@@ -33,6 +35,15 @@ class RDAPClient {
33
35
  followRedirects: this.options.followRedirects,
34
36
  maxRedirects: this.options.maxRedirects,
35
37
  ssrfProtection: this.ssrfProtection,
38
+ logRedirect: (fromUrl, toUrl) => {
39
+ this.logger?.warn(`Redirect: ${fromUrl} → ${toUrl}`);
40
+ if (this.debugEnabled && this.debugLogger) {
41
+ this.debugLogger.debug('Redirect occurred', {
42
+ fromUrl,
43
+ toUrl,
44
+ });
45
+ }
46
+ },
36
47
  });
37
48
  this.bootstrap = new http_1.BootstrapDiscovery(this.options.bootstrapUrl, this.fetcher);
38
49
  const cacheOptions = typeof this.options.cache === 'boolean'
@@ -60,12 +71,26 @@ class RDAPClient {
60
71
  enabled: true,
61
72
  maxMetrics: 10000,
62
73
  });
74
+ const validLogLevels = ['debug', 'info', 'warn', 'error'];
75
+ const configuredLevel = this.options.logging?.level;
76
+ const logLevel = configuredLevel && validLogLevels.includes(configuredLevel)
77
+ ? configuredLevel
78
+ : 'info';
63
79
  this.logger = new Logger_1.Logger({
64
- level: this.options.logging?.level || 'info',
80
+ level: logLevel,
65
81
  enabled: true,
66
82
  logRequests: true,
67
83
  logResponses: true,
68
84
  });
85
+ const debugOptions = this.options.debug;
86
+ this.debugEnabled = typeof debugOptions === 'boolean' ? debugOptions : debugOptions?.enabled ?? false;
87
+ this.debugLogger = typeof debugOptions === 'object' && debugOptions?.logger ? debugOptions.logger : undefined;
88
+ const middlewareOpts = this.options.middleware;
89
+ this.middlewareManager = new MiddlewareHooks_1.MiddlewareManager(middlewareOpts);
90
+ const dedupOpts = this.options.deduplication;
91
+ this.queryDeduplicator = new QueryDeduplicator_1.QueryDeduplicator(typeof dedupOpts === 'boolean'
92
+ ? { enabled: dedupOpts }
93
+ : dedupOpts);
69
94
  this.batchProcessor = new BatchProcessor_1.BatchProcessor(this);
70
95
  this.orchestrator = new services_1.QueryOrchestrator({
71
96
  cache: this.cache,
@@ -78,6 +103,10 @@ class RDAPClient {
78
103
  rateLimiter: this.rateLimiter,
79
104
  metricsCollector: this.metricsCollector,
80
105
  logger: this.logger,
106
+ debugEnabled: this.debugEnabled,
107
+ debugLogger: this.debugLogger,
108
+ middleware: this.middlewareManager,
109
+ deduplicator: this.queryDeduplicator,
81
110
  });
82
111
  }
83
112
  async domain(domain) {
@@ -142,6 +171,16 @@ class RDAPClient {
142
171
  getConnectionPoolStats() {
143
172
  return this.connectionPool.getStats();
144
173
  }
174
+ use(hooks) {
175
+ this.middlewareManager.use(hooks);
176
+ return this;
177
+ }
178
+ getMiddlewareManager() {
179
+ return this.middlewareManager;
180
+ }
181
+ getDeduplicatorStats() {
182
+ return this.queryDeduplicator.getStats();
183
+ }
145
184
  getLogger() {
146
185
  return this.logger;
147
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RDAPClient.js","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RDAPClient.js","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface DeduplicatorOptions {
2
+ windowMs?: number;
3
+ enabled?: boolean;
4
+ }
5
+ export declare class QueryDeduplicator {
6
+ private readonly inflight;
7
+ private readonly windowMs;
8
+ private readonly enabled;
9
+ constructor(options?: DeduplicatorOptions);
10
+ deduplicate<T>(key: string, fn: () => Promise<T>): Promise<T>;
11
+ getInflightCount(): number;
12
+ getInflightKeys(): string[];
13
+ clear(): void;
14
+ getStats(): {
15
+ enabled: boolean;
16
+ inflight: number;
17
+ windowMs: number;
18
+ };
19
+ }
20
+ //# sourceMappingURL=QueryDeduplicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryDeduplicator.d.ts","sourceRoot":"","sources":["../../../src/application/deduplication/QueryDeduplicator.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,CAAC,EAAE,mBAAmB;IAiBzC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAwB7D,gBAAgB,IAAI,MAAM;IAK1B,eAAe,IAAI,MAAM,EAAE;IAK3B,KAAK,IAAI,IAAI;IAIb,QAAQ,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAOrE"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryDeduplicator = void 0;
4
+ class QueryDeduplicator {
5
+ constructor(options) {
6
+ this.inflight = new Map();
7
+ this.windowMs = options?.windowMs ?? 100;
8
+ this.enabled = options?.enabled ?? true;
9
+ }
10
+ deduplicate(key, fn) {
11
+ if (!this.enabled) {
12
+ return fn();
13
+ }
14
+ const existing = this.inflight.get(key);
15
+ if (existing !== undefined) {
16
+ return existing;
17
+ }
18
+ const promise = fn().finally(() => {
19
+ setTimeout(() => {
20
+ if (this.inflight.get(key) === promise) {
21
+ this.inflight.delete(key);
22
+ }
23
+ }, this.windowMs);
24
+ });
25
+ this.inflight.set(key, promise);
26
+ return promise;
27
+ }
28
+ getInflightCount() {
29
+ return this.inflight.size;
30
+ }
31
+ getInflightKeys() {
32
+ return Array.from(this.inflight.keys());
33
+ }
34
+ clear() {
35
+ this.inflight.clear();
36
+ }
37
+ getStats() {
38
+ return {
39
+ enabled: this.enabled,
40
+ inflight: this.inflight.size,
41
+ windowMs: this.windowMs,
42
+ };
43
+ }
44
+ }
45
+ exports.QueryDeduplicator = QueryDeduplicator;
46
+ //# sourceMappingURL=QueryDeduplicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryDeduplicator.js","sourceRoot":"","sources":["../../../src/application/deduplication/QueryDeduplicator.ts"],"names":[],"mappings":";;;AAkBA,MAAa,iBAAiB;IAK5B,YAAY,OAA6B;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAC1C,CAAC;IAaD,WAAW,CAAI,GAAW,EAAE,EAAoB;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAsB,CAAC;QAChC,CAAC;QAED,MAAM,OAAO,GAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAE5C,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAGD,gBAAgB;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAGD,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAGD,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,QAAQ;QACN,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF;AAnED,8CAmEC"}
@@ -0,0 +1,48 @@
1
+ import type { RDAPResponse } from '../../shared/types/responses';
2
+ export interface QueryContext {
3
+ queryType: 'domain' | 'ip' | 'asn';
4
+ query: string;
5
+ normalized: string;
6
+ startTime: number;
7
+ cached?: boolean;
8
+ serverUrl?: string;
9
+ attempt?: number;
10
+ }
11
+ export interface QueryResultContext extends QueryContext {
12
+ duration: number;
13
+ result?: RDAPResponse;
14
+ error?: Error;
15
+ fromCache: boolean;
16
+ }
17
+ export interface HookFn<T = void> {
18
+ (context: T): Promise<void> | void;
19
+ }
20
+ export interface MiddlewareOptions {
21
+ beforeQuery?: HookFn<QueryContext>;
22
+ afterQuery?: HookFn<QueryResultContext>;
23
+ onError?: HookFn<QueryResultContext>;
24
+ onCacheHit?: HookFn<QueryContext>;
25
+ onCacheMiss?: HookFn<QueryContext>;
26
+ onRetry?: HookFn<QueryContext & {
27
+ attempt: number;
28
+ delay: number;
29
+ }>;
30
+ }
31
+ export declare class MiddlewareManager {
32
+ private hooks;
33
+ constructor(hooks?: MiddlewareOptions);
34
+ private safeRun;
35
+ runBeforeQuery(ctx: QueryContext): Promise<void>;
36
+ runAfterQuery(ctx: QueryResultContext): Promise<void>;
37
+ runOnError(ctx: QueryResultContext): Promise<void>;
38
+ runOnCacheHit(ctx: QueryContext): Promise<void>;
39
+ runOnCacheMiss(ctx: QueryContext): Promise<void>;
40
+ runOnRetry(ctx: QueryContext & {
41
+ attempt: number;
42
+ delay: number;
43
+ }): Promise<void>;
44
+ use(hooks: Partial<MiddlewareOptions>): void;
45
+ clear(): void;
46
+ getRegisteredHooks(): string[];
47
+ }
48
+ //# sourceMappingURL=MiddlewareHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MiddlewareHooks.d.ts","sourceRoot":"","sources":["../../../src/application/hooks/MiddlewareHooks.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAKjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAKD,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,IAAI;IAC9B,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpC;AAKD,MAAM,WAAW,iBAAiB;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEnC,UAAU,CAAC,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAExC,OAAO,CAAC,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAErC,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAElC,WAAW,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEnC,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAoB;gBAErB,KAAK,CAAC,EAAE,iBAAiB;YAMvB,OAAO;IAcf,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,aAAa,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,UAAU,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,CACd,GAAG,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GACrD,OAAO,CAAC,IAAI,CAAC;IAUhB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAK5C,KAAK,IAAI,IAAI;IAKb,kBAAkB,IAAI,MAAM,EAAE;CAK/B"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MiddlewareManager = void 0;
4
+ class MiddlewareManager {
5
+ constructor(hooks) {
6
+ this.hooks = hooks ?? {};
7
+ }
8
+ async safeRun(fn, ctx) {
9
+ if (!fn)
10
+ return;
11
+ try {
12
+ await fn(ctx);
13
+ }
14
+ catch {
15
+ }
16
+ }
17
+ async runBeforeQuery(ctx) {
18
+ await this.safeRun(this.hooks.beforeQuery, ctx);
19
+ }
20
+ async runAfterQuery(ctx) {
21
+ await this.safeRun(this.hooks.afterQuery, ctx);
22
+ }
23
+ async runOnError(ctx) {
24
+ await this.safeRun(this.hooks.onError, ctx);
25
+ }
26
+ async runOnCacheHit(ctx) {
27
+ await this.safeRun(this.hooks.onCacheHit, ctx);
28
+ }
29
+ async runOnCacheMiss(ctx) {
30
+ await this.safeRun(this.hooks.onCacheMiss, ctx);
31
+ }
32
+ async runOnRetry(ctx) {
33
+ await this.safeRun(this.hooks.onRetry, ctx);
34
+ }
35
+ use(hooks) {
36
+ this.hooks = { ...this.hooks, ...hooks };
37
+ }
38
+ clear() {
39
+ this.hooks = {};
40
+ }
41
+ getRegisteredHooks() {
42
+ return Object.keys(this.hooks).filter((k) => this.hooks[k] !== undefined);
43
+ }
44
+ }
45
+ exports.MiddlewareManager = MiddlewareManager;
46
+ //# sourceMappingURL=MiddlewareHooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MiddlewareHooks.js","sourceRoot":"","sources":["../../../src/application/hooks/MiddlewareHooks.ts"],"names":[],"mappings":";;;AA2DA,MAAa,iBAAiB;IAG5B,YAAY,KAAyB;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;IAC3B,CAAC;IAIO,KAAK,CAAC,OAAO,CACnB,EAAyB,EACzB,GAAM;QAEN,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;IAID,KAAK,CAAC,cAAc,CAAC,GAAiB;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAuB;QACzC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAuB;QACtC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAiB;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAiB;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,GAAsD;QAEtD,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAQD,GAAG,CAAC,KAAiC;QACnC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3C,CAAC;IAGD,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAGD,kBAAkB;QAChB,OAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAoC,CAAC,MAAM,CACvE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CACnC,CAAC;IACJ,CAAC;CACF;AAtED,8CAsEC"}
@@ -5,6 +5,8 @@ import type { PIIRedactor } from '../../infrastructure/security';
5
5
  import type { MetricsCollector } from '../../infrastructure/monitoring/MetricsCollector';
6
6
  import type { Logger } from '../../infrastructure/logging/Logger';
7
7
  import type { DomainResponse, IPResponse, ASNResponse } from '../../shared/types';
8
+ import type { MiddlewareManager } from '../hooks/MiddlewareHooks';
9
+ import type { QueryDeduplicator } from '../deduplication/QueryDeduplicator';
8
10
  export interface QueryOrchestratorConfig {
9
11
  cache: CacheManager;
10
12
  bootstrap: BootstrapDiscovery;
@@ -16,6 +18,15 @@ export interface QueryOrchestratorConfig {
16
18
  rateLimiter?: RateLimiter;
17
19
  metricsCollector?: MetricsCollector;
18
20
  logger?: Logger;
21
+ middleware?: MiddlewareManager;
22
+ deduplicator?: QueryDeduplicator;
23
+ debugEnabled: boolean;
24
+ debugLogger?: {
25
+ debug: (message: string, metadata?: Record<string, unknown>) => void;
26
+ info: (message: string, metadata?: Record<string, unknown>) => void;
27
+ warn: (message: string, metadata?: Record<string, unknown>) => void;
28
+ error: (message: string, metadata?: Record<string, unknown>) => void;
29
+ };
19
30
  }
20
31
  export declare class QueryOrchestrator {
21
32
  private readonly config;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/application/services/QueryOrchestrator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAclF,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAErC,MAAM,EAAE,uBAAuB;IAOrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAwGpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2GxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAqG3D"}
1
+ {"version":3,"file":"QueryOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/application/services/QueryOrchestrator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAK5E,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IAEpB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACrE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACpE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACpE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KACtE,CAAC;CACH;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAErC,MAAM,EAAE,uBAAuB;IAOrC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkMpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqMxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA+L3D"}