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.
- package/CHANGELOG.md +60 -0
- package/README.md +11 -9
- package/dist/application/client/RDAPClient.d.ts +13 -0
- package/dist/application/client/RDAPClient.d.ts.map +1 -1
- package/dist/application/client/RDAPClient.js +40 -1
- package/dist/application/client/RDAPClient.js.map +1 -1
- package/dist/application/deduplication/QueryDeduplicator.d.ts +20 -0
- package/dist/application/deduplication/QueryDeduplicator.d.ts.map +1 -0
- package/dist/application/deduplication/QueryDeduplicator.js +46 -0
- package/dist/application/deduplication/QueryDeduplicator.js.map +1 -0
- package/dist/application/hooks/MiddlewareHooks.d.ts +48 -0
- package/dist/application/hooks/MiddlewareHooks.d.ts.map +1 -0
- package/dist/application/hooks/MiddlewareHooks.js +46 -0
- package/dist/application/hooks/MiddlewareHooks.js.map +1 -0
- package/dist/application/services/QueryOrchestrator.d.ts +11 -0
- package/dist/application/services/QueryOrchestrator.d.ts.map +1 -1
- package/dist/application/services/QueryOrchestrator.js +254 -38
- package/dist/application/services/QueryOrchestrator.js.map +1 -1
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +227 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/cache/CacheManager.d.ts.map +1 -1
- package/dist/infrastructure/cache/CacheManager.js +8 -1
- package/dist/infrastructure/cache/CacheManager.js.map +1 -1
- package/dist/infrastructure/cache/RedisCache.d.ts +35 -0
- package/dist/infrastructure/cache/RedisCache.d.ts.map +1 -0
- package/dist/infrastructure/cache/RedisCache.js +75 -0
- package/dist/infrastructure/cache/RedisCache.js.map +1 -0
- package/dist/infrastructure/cache/index.d.ts +1 -0
- package/dist/infrastructure/cache/index.d.ts.map +1 -1
- package/dist/infrastructure/cache/index.js +3 -1
- package/dist/infrastructure/cache/index.js.map +1 -1
- package/dist/infrastructure/http/BootstrapDiscovery.d.ts.map +1 -1
- package/dist/infrastructure/http/BootstrapDiscovery.js +5 -2
- package/dist/infrastructure/http/BootstrapDiscovery.js.map +1 -1
- package/dist/infrastructure/http/ConnectionPool.d.ts +1 -1
- package/dist/infrastructure/http/ConnectionPool.d.ts.map +1 -1
- package/dist/infrastructure/http/ConnectionPool.js +9 -4
- package/dist/infrastructure/http/ConnectionPool.js.map +1 -1
- package/dist/infrastructure/http/Fetcher.d.ts +2 -0
- package/dist/infrastructure/http/Fetcher.d.ts.map +1 -1
- package/dist/infrastructure/http/Fetcher.js +12 -4
- package/dist/infrastructure/http/Fetcher.js.map +1 -1
- package/dist/infrastructure/http/Normalizer.d.ts.map +1 -1
- package/dist/infrastructure/http/Normalizer.js +16 -9
- package/dist/infrastructure/http/Normalizer.js.map +1 -1
- package/dist/infrastructure/logging/AuditLogger.d.ts +114 -0
- package/dist/infrastructure/logging/AuditLogger.d.ts.map +1 -0
- package/dist/infrastructure/logging/AuditLogger.js +195 -0
- package/dist/infrastructure/logging/AuditLogger.js.map +1 -0
- package/dist/infrastructure/logging/Logger.d.ts.map +1 -1
- package/dist/infrastructure/logging/Logger.js +29 -5
- package/dist/infrastructure/logging/Logger.js.map +1 -1
- package/dist/infrastructure/monitoring/MetricsCollector.d.ts +37 -0
- package/dist/infrastructure/monitoring/MetricsCollector.d.ts.map +1 -1
- package/dist/infrastructure/monitoring/MetricsCollector.js +186 -6
- package/dist/infrastructure/monitoring/MetricsCollector.js.map +1 -1
- package/dist/infrastructure/security/PIIRedactor.d.ts.map +1 -1
- package/dist/infrastructure/security/PIIRedactor.js +9 -2
- package/dist/infrastructure/security/PIIRedactor.js.map +1 -1
- package/dist/infrastructure/security/SSRFProtection.d.ts.map +1 -1
- package/dist/infrastructure/security/SSRFProtection.js +7 -4
- package/dist/infrastructure/security/SSRFProtection.js.map +1 -1
- package/dist/infrastructure/validation/ResponseValidator.d.ts +38 -0
- package/dist/infrastructure/validation/ResponseValidator.d.ts.map +1 -0
- package/dist/infrastructure/validation/ResponseValidator.js +200 -0
- package/dist/infrastructure/validation/ResponseValidator.js.map +1 -0
- package/dist/shared/constants/rdap.constants.d.ts +1 -1
- package/dist/shared/constants/rdap.constants.d.ts.map +1 -1
- package/dist/shared/constants/rdap.constants.js +1 -1
- package/dist/shared/constants/rdap.constants.js.map +1 -1
- package/dist/shared/errors/base.error.d.ts +8 -0
- package/dist/shared/errors/base.error.d.ts.map +1 -1
- package/dist/shared/errors/base.error.js +30 -1
- package/dist/shared/errors/base.error.js.map +1 -1
- package/dist/shared/types/options.d.ts +21 -2
- package/dist/shared/types/options.d.ts.map +1 -1
- package/dist/shared/types/options.js +6 -1
- package/dist/shared/types/options.js.map +1 -1
- package/dist/shared/utils/helpers/index.d.ts +1 -1
- package/dist/shared/utils/helpers/index.d.ts.map +1 -1
- package/dist/shared/utils/helpers/index.js +2 -1
- package/dist/shared/utils/helpers/index.js.map +1 -1
- package/dist/shared/utils/helpers/runtime.d.ts +1 -0
- package/dist/shared/utils/helpers/runtime.d.ts.map +1 -1
- package/dist/shared/utils/helpers/runtime.js +11 -1
- package/dist/shared/utils/helpers/runtime.js.map +1 -1
- package/dist/shared/utils/validators/config-validation.d.ts +3 -0
- package/dist/shared/utils/validators/config-validation.d.ts.map +1 -0
- package/dist/shared/utils/validators/config-validation.js +97 -0
- package/dist/shared/utils/validators/config-validation.js.map +1 -0
- package/dist/shared/utils/validators/index.d.ts +1 -0
- package/dist/shared/utils/validators/index.d.ts.map +1 -1
- package/dist/shared/utils/validators/index.js +3 -1
- package/dist/shared/utils/validators/index.js.map +1 -1
- 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
|
[](https://www.npmjs.com/package/rdapify)
|
|
6
8
|
[](LICENSE)
|
|
7
9
|
[](SECURITY.md)
|
|
@@ -148,7 +150,7 @@ logs.forEach((log) => {
|
|
|
148
150
|
client.destroy();
|
|
149
151
|
```
|
|
150
152
|
|
|
151
|
-
### With Authentication & Proxy (v0.1.
|
|
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.
|
|
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.
|
|
239
|
-
- **Proxy Support** (v0.1.
|
|
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.
|
|
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.
|
|
249
|
-
- **Retry Strategies** (v0.1.
|
|
250
|
-
- **Query Prioritization** (v0.1.
|
|
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.
|
|
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;
|
|
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:
|
|
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":";;;AAKA,sDAA0D;AAC1D,oDAAoF;AACpF,uEAAoE;AACpE,6EAA0E;AAC1E,4DAA4E;AAC5E,uFAAoF;AACpF,gEAA6D;
|
|
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;
|
|
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"}
|