rdapify 0.1.0-alpha.4 → 0.1.1
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 +86 -0
- package/README.md +209 -46
- package/dist/{client → application/client}/RDAPClient.d.ts +3 -2
- package/dist/application/client/RDAPClient.d.ts.map +1 -0
- package/dist/application/client/RDAPClient.js +109 -0
- package/dist/application/client/RDAPClient.js.map +1 -0
- package/dist/application/client/index.d.ts +2 -0
- package/dist/application/client/index.d.ts.map +1 -0
- package/dist/application/client/index.js +6 -0
- package/dist/application/client/index.js.map +1 -0
- package/dist/application/services/QueryOrchestrator.d.ts +23 -0
- package/dist/application/services/QueryOrchestrator.d.ts.map +1 -0
- package/dist/application/services/QueryOrchestrator.js +59 -0
- package/dist/application/services/QueryOrchestrator.js.map +1 -0
- package/dist/application/services/index.d.ts +2 -0
- package/dist/application/services/index.d.ts.map +1 -0
- package/dist/application/services/index.js +6 -0
- package/dist/application/services/index.js.map +1 -0
- package/dist/core/ports/bootstrap.port.d.ts +8 -0
- package/dist/core/ports/bootstrap.port.d.ts.map +1 -0
- package/dist/core/ports/bootstrap.port.js +3 -0
- package/dist/core/ports/bootstrap.port.js.map +1 -0
- package/dist/core/ports/cache.port.d.ts +10 -0
- package/dist/core/ports/cache.port.d.ts.map +1 -0
- package/dist/core/ports/cache.port.js +3 -0
- package/dist/core/ports/cache.port.js.map +1 -0
- package/dist/core/ports/fetcher.port.d.ts +5 -0
- package/dist/core/ports/fetcher.port.d.ts.map +1 -0
- package/dist/core/ports/fetcher.port.js +3 -0
- package/dist/core/ports/fetcher.port.js.map +1 -0
- package/dist/core/ports/index.d.ts +6 -0
- package/dist/core/ports/index.d.ts.map +1 -0
- package/dist/core/ports/index.js +9 -0
- package/dist/core/ports/index.js.map +1 -0
- package/dist/core/ports/normalizer.port.d.ts +5 -0
- package/dist/core/ports/normalizer.port.d.ts.map +1 -0
- package/dist/core/ports/normalizer.port.js +3 -0
- package/dist/core/ports/normalizer.port.js.map +1 -0
- package/dist/core/ports/pii-redactor.port.d.ts +6 -0
- package/dist/core/ports/pii-redactor.port.d.ts.map +1 -0
- package/dist/core/ports/pii-redactor.port.js +3 -0
- package/dist/core/ports/pii-redactor.port.js.map +1 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{cache → infrastructure/cache}/CacheManager.d.ts +2 -2
- package/dist/infrastructure/cache/CacheManager.d.ts.map +1 -0
- package/dist/{cache → infrastructure/cache}/CacheManager.js +1 -1
- package/dist/infrastructure/cache/CacheManager.js.map +1 -0
- package/dist/{cache → infrastructure/cache}/InMemoryCache.d.ts +1 -1
- package/dist/infrastructure/cache/InMemoryCache.d.ts.map +1 -0
- package/dist/infrastructure/cache/InMemoryCache.js.map +1 -0
- package/dist/infrastructure/cache/index.d.ts +3 -0
- package/dist/infrastructure/cache/index.d.ts.map +1 -0
- package/dist/infrastructure/cache/index.js +8 -0
- package/dist/infrastructure/cache/index.js.map +1 -0
- package/dist/infrastructure/http/BootstrapDiscovery.d.ts.map +1 -0
- package/dist/{fetcher → infrastructure/http}/BootstrapDiscovery.js +2 -2
- package/dist/infrastructure/http/BootstrapDiscovery.js.map +1 -0
- package/dist/{fetcher → infrastructure/http}/Fetcher.d.ts +3 -3
- package/dist/infrastructure/http/Fetcher.d.ts.map +1 -0
- package/dist/{fetcher → infrastructure/http}/Fetcher.js +2 -2
- package/dist/infrastructure/http/Fetcher.js.map +1 -0
- package/dist/{normalizer → infrastructure/http}/Normalizer.d.ts +1 -1
- package/dist/infrastructure/http/Normalizer.d.ts.map +1 -0
- package/dist/{normalizer → infrastructure/http}/Normalizer.js +1 -1
- package/dist/infrastructure/http/Normalizer.js.map +1 -0
- package/dist/infrastructure/http/index.d.ts +4 -0
- package/dist/infrastructure/http/index.d.ts.map +1 -0
- package/dist/infrastructure/http/index.js +10 -0
- package/dist/infrastructure/http/index.js.map +1 -0
- package/dist/{normalizer → infrastructure/security}/PIIRedactor.d.ts +2 -2
- package/dist/infrastructure/security/PIIRedactor.d.ts.map +1 -0
- package/dist/infrastructure/security/PIIRedactor.js.map +1 -0
- package/dist/{fetcher → infrastructure/security}/SSRFProtection.d.ts +1 -1
- package/dist/infrastructure/security/SSRFProtection.d.ts.map +1 -0
- package/dist/{fetcher → infrastructure/security}/SSRFProtection.js +2 -2
- package/dist/infrastructure/security/SSRFProtection.js.map +1 -0
- package/dist/infrastructure/security/index.d.ts +3 -0
- package/dist/infrastructure/security/index.d.ts.map +1 -0
- package/dist/infrastructure/security/index.js +8 -0
- package/dist/infrastructure/security/index.js.map +1 -0
- package/dist/shared/constants/http.constants.d.ts +26 -0
- package/dist/shared/constants/http.constants.d.ts.map +1 -0
- package/dist/shared/constants/http.constants.js +29 -0
- package/dist/shared/constants/http.constants.js.map +1 -0
- package/dist/shared/constants/index.d.ts +3 -0
- package/dist/shared/constants/index.d.ts.map +1 -0
- package/dist/shared/constants/index.js +6 -0
- package/dist/shared/constants/index.js.map +1 -0
- package/dist/shared/constants/rdap.constants.d.ts +9 -0
- package/dist/shared/constants/rdap.constants.d.ts.map +1 -0
- package/dist/shared/constants/rdap.constants.js +21 -0
- package/dist/shared/constants/rdap.constants.js.map +1 -0
- package/dist/shared/errors/base.error.d.ts +39 -0
- package/dist/shared/errors/base.error.d.ts.map +1 -0
- package/dist/shared/errors/base.error.js +91 -0
- package/dist/shared/errors/base.error.js.map +1 -0
- package/dist/shared/errors/index.d.ts +2 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/errors/index.js +5 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/types/entities.d.ts +50 -0
- package/dist/shared/types/entities.d.ts.map +1 -0
- package/dist/shared/types/entities.js +3 -0
- package/dist/shared/types/entities.js.map +1 -0
- package/dist/shared/types/enums.d.ts +10 -0
- package/dist/shared/types/enums.d.ts.map +1 -0
- package/dist/shared/types/enums.js +3 -0
- package/dist/shared/types/enums.js.map +1 -0
- package/dist/shared/types/errors.d.ts.map +1 -0
- package/dist/shared/types/errors.js.map +1 -0
- package/dist/shared/types/index.d.ts +4 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/{types → shared/types}/index.js.map +1 -1
- package/dist/shared/types/options.d.ts.map +1 -0
- package/dist/shared/types/options.js.map +1 -0
- package/dist/shared/types/responses.d.ts +76 -0
- package/dist/shared/types/responses.d.ts.map +1 -0
- package/dist/shared/types/responses.js +3 -0
- package/dist/shared/types/responses.js.map +1 -0
- package/dist/shared/utils/helpers/async.d.ts +9 -0
- package/dist/shared/utils/helpers/async.d.ts.map +1 -0
- package/dist/shared/utils/helpers/async.js +47 -0
- package/dist/shared/utils/helpers/async.js.map +1 -0
- package/dist/shared/utils/helpers/cache.d.ts +2 -0
- package/dist/shared/utils/helpers/cache.d.ts.map +1 -0
- package/dist/shared/utils/helpers/cache.js +7 -0
- package/dist/shared/utils/helpers/cache.js.map +1 -0
- package/dist/shared/utils/helpers/format.d.ts +3 -0
- package/dist/shared/utils/helpers/format.d.ts.map +1 -0
- package/dist/shared/utils/helpers/format.js +22 -0
- package/dist/shared/utils/helpers/format.js.map +1 -0
- package/dist/shared/utils/helpers/http.d.ts +2 -0
- package/dist/shared/utils/helpers/http.d.ts.map +1 -0
- package/dist/shared/utils/helpers/http.js +17 -0
- package/dist/shared/utils/helpers/http.js.map +1 -0
- package/dist/shared/utils/helpers/index.d.ts +8 -0
- package/dist/shared/utils/helpers/index.d.ts.map +1 -0
- package/dist/shared/utils/helpers/index.js +29 -0
- package/dist/shared/utils/helpers/index.js.map +1 -0
- package/dist/shared/utils/helpers/object.d.ts +3 -0
- package/dist/shared/utils/helpers/object.d.ts.map +1 -0
- package/dist/shared/utils/helpers/object.js +24 -0
- package/dist/shared/utils/helpers/object.js.map +1 -0
- package/dist/shared/utils/helpers/runtime.d.ts +6 -0
- package/dist/shared/utils/helpers/runtime.d.ts.map +1 -0
- package/dist/shared/utils/helpers/runtime.js +33 -0
- package/dist/shared/utils/helpers/runtime.js.map +1 -0
- package/dist/shared/utils/helpers/string.d.ts +4 -0
- package/dist/shared/utils/helpers/string.d.ts.map +1 -0
- package/dist/shared/utils/helpers/string.js +29 -0
- package/dist/shared/utils/helpers/string.js.map +1 -0
- package/dist/shared/utils/validators/asn.d.ts +3 -0
- package/dist/shared/utils/validators/asn.d.ts.map +1 -0
- package/dist/shared/utils/validators/asn.js +30 -0
- package/dist/shared/utils/validators/asn.js.map +1 -0
- package/dist/shared/utils/validators/domain.d.ts +3 -0
- package/dist/shared/utils/validators/domain.d.ts.map +1 -0
- package/dist/shared/utils/validators/domain.js +34 -0
- package/dist/shared/utils/validators/domain.js.map +1 -0
- package/dist/shared/utils/validators/index.d.ts +5 -0
- package/dist/shared/utils/validators/index.d.ts.map +1 -0
- package/dist/shared/utils/validators/index.js +19 -0
- package/dist/shared/utils/validators/index.js.map +1 -0
- package/dist/shared/utils/validators/ip.d.ts +5 -0
- package/dist/shared/utils/validators/ip.d.ts.map +1 -0
- package/dist/shared/utils/validators/ip.js +55 -0
- package/dist/shared/utils/validators/ip.js.map +1 -0
- package/dist/shared/utils/validators/network.d.ts +4 -0
- package/dist/shared/utils/validators/network.d.ts.map +1 -0
- package/dist/shared/utils/validators/network.js +48 -0
- package/dist/shared/utils/validators/network.js.map +1 -0
- package/package.json +11 -7
- package/dist/cache/CacheManager.d.ts.map +0 -1
- package/dist/cache/CacheManager.js.map +0 -1
- package/dist/cache/InMemoryCache.d.ts.map +0 -1
- package/dist/cache/InMemoryCache.js.map +0 -1
- package/dist/client/RDAPClient.d.ts.map +0 -1
- package/dist/client/RDAPClient.js +0 -138
- package/dist/client/RDAPClient.js.map +0 -1
- package/dist/fetcher/BootstrapDiscovery.d.ts.map +0 -1
- package/dist/fetcher/BootstrapDiscovery.js.map +0 -1
- package/dist/fetcher/Fetcher.d.ts.map +0 -1
- package/dist/fetcher/Fetcher.js.map +0 -1
- package/dist/fetcher/SSRFProtection.d.ts.map +0 -1
- package/dist/fetcher/SSRFProtection.js.map +0 -1
- package/dist/normalizer/Normalizer.d.ts.map +0 -1
- package/dist/normalizer/Normalizer.js.map +0 -1
- package/dist/normalizer/PIIRedactor.d.ts.map +0 -1
- package/dist/normalizer/PIIRedactor.js.map +0 -1
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/errors.js.map +0 -1
- package/dist/types/index.d.ts +0 -131
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/options.d.ts.map +0 -1
- package/dist/types/options.js.map +0 -1
- package/dist/utils/helpers.d.ts +0 -23
- package/dist/utils/helpers.d.ts.map +0 -1
- package/dist/utils/helpers.js +0 -161
- package/dist/utils/helpers.js.map +0 -1
- package/dist/utils/validators.d.ts +0 -12
- package/dist/utils/validators.d.ts.map +0 -1
- package/dist/utils/validators.js +0 -156
- package/dist/utils/validators.js.map +0 -1
- /package/dist/{cache → infrastructure/cache}/InMemoryCache.js +0 -0
- /package/dist/{fetcher → infrastructure/http}/BootstrapDiscovery.d.ts +0 -0
- /package/dist/{normalizer → infrastructure/security}/PIIRedactor.js +0 -0
- /package/dist/{types → shared/types}/errors.d.ts +0 -0
- /package/dist/{types → shared/types}/errors.js +0 -0
- /package/dist/{types → shared/types}/index.js +0 -0
- /package/dist/{types → shared/types}/options.d.ts +0 -0
- /package/dist/{types → shared/types}/options.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,92 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2025-01-25
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Initial public release of RDAPify
|
|
14
|
+
- Core RDAP client with domain, IP, and ASN query support
|
|
15
|
+
- Automatic RDAP server discovery via IANA Bootstrap
|
|
16
|
+
- SSRF protection with proper CIDR matching for IPv4 and IPv6
|
|
17
|
+
- PII redaction for GDPR/CCPA compliance
|
|
18
|
+
- In-memory caching with configurable TTL
|
|
19
|
+
- Data normalization for consistent response format
|
|
20
|
+
- Comprehensive TypeScript types and interfaces
|
|
21
|
+
- Input validation for domains, IPs, and ASNs
|
|
22
|
+
- Retry logic with configurable backoff strategies
|
|
23
|
+
- Interactive playground for testing RDAP queries
|
|
24
|
+
- Playground API proxy server with Express
|
|
25
|
+
- Comprehensive community health files (SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SUPPORT.md)
|
|
26
|
+
- Issue templates (bug report, feature request, question)
|
|
27
|
+
- Pull request template with comprehensive checklist
|
|
28
|
+
- Funding configuration for GitHub Sponsors and Open Collective
|
|
29
|
+
- Organization profile with professional presentation
|
|
30
|
+
|
|
31
|
+
### Infrastructure
|
|
32
|
+
- CI/CD workflows for Node.js 16, 18, and 20
|
|
33
|
+
- CodeQL security analysis (weekly scans)
|
|
34
|
+
- Dependabot for automated dependency updates
|
|
35
|
+
- Dependency review for pull requests
|
|
36
|
+
- Automated testing and linting
|
|
37
|
+
- GitHub Actions for release automation
|
|
38
|
+
|
|
39
|
+
### Security
|
|
40
|
+
- SSRF protection blocks private IPs, localhost, and internal domains
|
|
41
|
+
- Certificate validation enforced (HTTPS only)
|
|
42
|
+
- Proper CIDR matching using ipaddr.js library
|
|
43
|
+
- Input validation prevents injection attacks
|
|
44
|
+
- Automated security scanning with CodeQL
|
|
45
|
+
- Secret scanning configuration
|
|
46
|
+
- Dependabot security updates
|
|
47
|
+
|
|
48
|
+
### Documentation
|
|
49
|
+
- Comprehensive README with examples
|
|
50
|
+
- API documentation
|
|
51
|
+
- Security policy
|
|
52
|
+
- Contributing guidelines
|
|
53
|
+
- Code of conduct
|
|
54
|
+
- Support resources
|
|
55
|
+
|
|
56
|
+
### Testing
|
|
57
|
+
- 146+ unit and integration tests
|
|
58
|
+
- Mocked fixtures for reliable testing
|
|
59
|
+
- Coverage reporting
|
|
60
|
+
|
|
61
|
+
## [0.1.0-alpha.4] - 2025-01-25
|
|
62
|
+
|
|
63
|
+
### Added
|
|
64
|
+
- Dependabot configuration for automated dependency updates
|
|
65
|
+
- Enhanced CI/CD workflows with multi-version Node.js testing (Node.js 16, 18, 20)
|
|
66
|
+
- CodeQL security analysis workflow (weekly scans)
|
|
67
|
+
- Dependency review workflow for pull requests
|
|
68
|
+
- Interactive playground for testing RDAP queries
|
|
69
|
+
- Playground API proxy server with Express
|
|
70
|
+
- Comprehensive community health files (SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SUPPORT.md)
|
|
71
|
+
- Issue templates (bug report, feature request, question)
|
|
72
|
+
- Pull request template with comprehensive checklist
|
|
73
|
+
- Funding configuration for GitHub Sponsors and Open Collective
|
|
74
|
+
- Organization profile with professional presentation
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
- Improved CI workflow to test on multiple Node.js versions
|
|
78
|
+
- Simplified CodeQL configuration
|
|
79
|
+
- Updated organization profile with professional presentation
|
|
80
|
+
- Enhanced documentation structure
|
|
81
|
+
- Improved .gitignore to exclude .kiro directory
|
|
82
|
+
|
|
83
|
+
### Security
|
|
84
|
+
- Added automated security scanning with CodeQL
|
|
85
|
+
- Enabled dependency review for pull requests
|
|
86
|
+
- Configured Dependabot for security updates
|
|
87
|
+
- Set up weekly security scans
|
|
88
|
+
|
|
89
|
+
### Infrastructure
|
|
90
|
+
- Added CI/CD workflows for automated testing
|
|
91
|
+
- Configured Dependabot for dependency management
|
|
92
|
+
- Set up CodeQL for security analysis
|
|
93
|
+
|
|
8
94
|
## [0.1.0-alpha.2] - 2026-01-22
|
|
9
95
|
|
|
10
96
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# RDAPify - Unified, Secure, High-Performance RDAP Client for Enterprise Applications
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **🎉 STABLE RELEASE**: This is v0.1.0 — the first stable public release with production-ready core functionality. See [What's Ready](#-whats-ready-in-v010) below.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/rdapify)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](SECURITY.md)
|
|
8
|
+
[](https://rdapify.com)
|
|
9
|
+
[](https://github.com/rdapify/RDAPify)
|
|
8
10
|
|
|
9
11
|
**RDAPify** unifies RDAP queries across all global registries (Verisign, ARIN, RIPE, APNIC, LACNIC) with robust security protection, exceptional performance, and an integrated developer experience. This isn't just another RDAP client — it's a complete platform for processing registration data securely.
|
|
10
12
|
|
|
@@ -27,7 +29,7 @@ RDAPify intelligently addresses these challenges:
|
|
|
27
29
|
- ✅ **Data Normalization**: Consistent response regardless of source registry
|
|
28
30
|
- ✅ **SSRF Protection**: Prevent attacks on internal infrastructure
|
|
29
31
|
- ✅ **Exceptional Performance**: Smart caching, parallel processing, memory optimization
|
|
30
|
-
- ✅ **
|
|
32
|
+
- ✅ **Node.js Compatibility**: Verified working on Node.js (target: 16+; Bun, Deno, Cloudflare Workers: untested)
|
|
31
33
|
- ✅ **GDPR-ready**: Built-in tools for automatically redacting personal data
|
|
32
34
|
|
|
33
35
|
## 📦 Quick Installation
|
|
@@ -41,26 +43,23 @@ yarn add rdapify
|
|
|
41
43
|
|
|
42
44
|
# Using pnpm
|
|
43
45
|
pnpm add rdapify
|
|
46
|
+
```
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
**Experimental (untested):**
|
|
49
|
+
```bash
|
|
50
|
+
# Using Bun (untested)
|
|
46
51
|
bun add rdapify
|
|
47
52
|
```
|
|
48
53
|
|
|
49
54
|
## ⚡ Get Started in 30 Seconds
|
|
50
55
|
|
|
56
|
+
### Basic Usage
|
|
57
|
+
|
|
51
58
|
```typescript
|
|
52
59
|
import { RDAPClient } from 'rdapify';
|
|
53
60
|
|
|
54
|
-
// Create a
|
|
55
|
-
const client = new RDAPClient(
|
|
56
|
-
cache: true, // Automatic caching (1 hour TTL)
|
|
57
|
-
redactPII: true, // Automatically redact personal information
|
|
58
|
-
retry: {
|
|
59
|
-
// Smart retries for transient failures
|
|
60
|
-
maxAttempts: 3,
|
|
61
|
-
backoff: 'exponential',
|
|
62
|
-
},
|
|
63
|
-
});
|
|
61
|
+
// Create a client with default settings
|
|
62
|
+
const client = new RDAPClient();
|
|
64
63
|
|
|
65
64
|
// Query a domain
|
|
66
65
|
const result = await client.domain('example.com');
|
|
@@ -75,7 +74,29 @@ console.log({
|
|
|
75
74
|
});
|
|
76
75
|
```
|
|
77
76
|
|
|
78
|
-
|
|
77
|
+
### With Security & Performance Options
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { RDAPClient } from 'rdapify';
|
|
81
|
+
|
|
82
|
+
// Create a secure client with optimized defaults
|
|
83
|
+
const client = new RDAPClient({
|
|
84
|
+
cache: true, // Automatic caching (1 hour TTL)
|
|
85
|
+
redactPII: true, // Automatically redact personal information
|
|
86
|
+
retry: {
|
|
87
|
+
// Smart retries for transient failures
|
|
88
|
+
maxAttempts: 3,
|
|
89
|
+
backoff: 'exponential',
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Query domain, IP, or ASN
|
|
94
|
+
const domain = await client.domain('example.com');
|
|
95
|
+
const ip = await client.ip('8.8.8.8');
|
|
96
|
+
const asn = await client.asn('AS15169');
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Example Output:**
|
|
79
100
|
|
|
80
101
|
```json
|
|
81
102
|
{
|
|
@@ -100,21 +121,23 @@ console.log({
|
|
|
100
121
|
|
|
101
122
|
### ⚡ Exceptional Performance
|
|
102
123
|
|
|
103
|
-
- **
|
|
104
|
-
- **
|
|
124
|
+
- **Smart Caching**: In-memory LRU cache with configurable TTL (Redis support planned)
|
|
125
|
+
- **Batch Processing**: Process multiple queries efficiently
|
|
105
126
|
- **Registry Discovery**: Automatic IANA Bootstrap for finding the correct registry
|
|
106
|
-
- **Offline Mode**: Work with cached data during network outages
|
|
107
|
-
- **
|
|
127
|
+
- **Offline Mode**: Work with cached data during network outages (planned)
|
|
128
|
+
- **Optimized Parsing**: Fast JSONPath-based normalization
|
|
108
129
|
|
|
109
130
|
### 🧩 Seamless Integration
|
|
110
131
|
|
|
111
132
|
- **Full TypeScript Support**: Strongly typed with embedded documentation
|
|
112
|
-
- **
|
|
113
|
-
- **Interactive CLI**: For quick queries and testing
|
|
114
|
-
- **Web Playground**: Try the library directly in your browser
|
|
115
|
-
- **Pre-built Templates**: For AWS Lambda, Azure Functions, Kubernetes, and more
|
|
133
|
+
- **Node.js Support**: Verified working (target: Node.js 16+; other runtimes untested)
|
|
134
|
+
- **Interactive CLI**: For quick queries and testing (planned)
|
|
135
|
+
- **Web Playground**: Try the library directly in your browser (planned)
|
|
136
|
+
- **Pre-built Templates**: For AWS Lambda, Azure Functions, Kubernetes, and more (planned)
|
|
137
|
+
|
|
138
|
+
### 📊 Advanced Analytics (Planned)
|
|
116
139
|
|
|
117
|
-
|
|
140
|
+
Future releases will include:
|
|
118
141
|
|
|
119
142
|
- **Customizable Dashboards**: Track critical domains and assets
|
|
120
143
|
- **Automated Reports**: Schedule expiration alerts and important changes
|
|
@@ -155,15 +178,16 @@ Read our [Security Whitepaper](security/whitepaper.md) for deeper technical deta
|
|
|
155
178
|
|
|
156
179
|
## 📚 Documentation
|
|
157
180
|
|
|
158
|
-
RDAPify provides comprehensive documentation:
|
|
181
|
+
RDAPify provides comprehensive documentation in the repository:
|
|
159
182
|
|
|
160
|
-
- **[Getting Started](docs/getting_started/)** - Installation and first query
|
|
161
|
-
- **[API Reference](docs/api_reference/)** - Complete TypeScript documentation
|
|
162
|
-
- **[Core Concepts](docs/core_concepts/)** - RDAP fundamentals and
|
|
163
|
-
- **[Security Guide](docs/security/)** - SSRF protection and
|
|
164
|
-
- **[Guides](docs/guides/)** - Error handling, caching, performance
|
|
183
|
+
- **[Getting Started](docs/getting_started/)** - Installation, quick start, and first query
|
|
184
|
+
- **[API Reference](docs/api_reference/)** - Complete TypeScript API documentation
|
|
185
|
+
- **[Core Concepts](docs/core_concepts/)** - RDAP fundamentals, architecture, and normalization
|
|
186
|
+
- **[Security Guide](docs/security/)** - SSRF protection, PII redaction, and best practices
|
|
187
|
+
- **[Guides](docs/guides/)** - Error handling, caching strategies, and performance optimization
|
|
188
|
+
- **[Examples](examples/)** - Real-world code examples and use cases
|
|
165
189
|
|
|
166
|
-
> **Note**: Full documentation site
|
|
190
|
+
> **Note**: Full documentation site is planned for future release. For now, browse the [docs/](docs/) directory in the repository.
|
|
167
191
|
|
|
168
192
|
## 🌐 Interactive Playground
|
|
169
193
|
|
|
@@ -177,11 +201,22 @@ RDAPify provides comprehensive documentation:
|
|
|
177
201
|
|
|
178
202
|
RDAPify is an open source project. Get help or contribute:
|
|
179
203
|
|
|
180
|
-
|
|
181
|
-
- **[GitHub
|
|
204
|
+
### 🐛 Bug Reports & Feature Requests
|
|
205
|
+
- **[GitHub Issues](https://github.com/rdapify/RDAPify/issues)** - Report bugs or request features
|
|
206
|
+
|
|
207
|
+
### 💬 Questions & Discussions
|
|
208
|
+
- **[GitHub Discussions](https://github.com/rdapify/RDAPify/discussions)** - Ask questions, share ideas, and show what you've built
|
|
209
|
+
|
|
210
|
+
### 📧 Direct Contact
|
|
211
|
+
- **General inquiries**: contact@rdapify.com
|
|
212
|
+
- **Security issues**: security@rdapify.com (see [SECURITY.md](SECURITY.md))
|
|
213
|
+
- **Support**: support@rdapify.com
|
|
214
|
+
|
|
215
|
+
### 🤝 Contributing
|
|
182
216
|
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Contribution guidelines
|
|
217
|
+
- **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** - Community standards
|
|
183
218
|
|
|
184
|
-
> **
|
|
219
|
+
> **Enterprise Support**: For SLA-backed support, consulting, or custom features, contact enterprise@rdapify.com
|
|
185
220
|
|
|
186
221
|
## 🤝 Contributing
|
|
187
222
|
|
|
@@ -196,11 +231,11 @@ Start by reading our [Contribution Guide](CONTRIBUTING.md) and [Code of Conduct]
|
|
|
196
231
|
|
|
197
232
|
## 🚧 Project Status
|
|
198
233
|
|
|
199
|
-
**Current Release**: v0.1.0
|
|
234
|
+
**Current Release**: v0.1.0 (Stable)
|
|
200
235
|
|
|
201
|
-
### ✅ What's Ready in v0.1.0
|
|
236
|
+
### ✅ What's Ready in v0.1.0
|
|
202
237
|
|
|
203
|
-
Core functionality is
|
|
238
|
+
Core functionality is production-ready and fully tested:
|
|
204
239
|
|
|
205
240
|
- ✅ **RDAP Client**: Domain, IP, and ASN queries with automatic bootstrap discovery
|
|
206
241
|
- ✅ **SSRF Protection**: Blocks private IPs, localhost, link-local, with proper CIDR matching (IPv4/IPv6)
|
|
@@ -210,22 +245,99 @@ Core functionality is implemented and tested:
|
|
|
210
245
|
- ✅ **Error Handling**: Structured errors with retry logic (exponential backoff)
|
|
211
246
|
- ✅ **TypeScript Support**: Full type definitions and strict mode
|
|
212
247
|
- ✅ **Test Coverage**: 146 tests passing (unit + integration with mocked fixtures)
|
|
213
|
-
- ✅ **Node.js Support**:
|
|
248
|
+
- ✅ **Node.js Support**: Verified working (CommonJS + ESM imports functional)
|
|
214
249
|
|
|
215
|
-
### 🔄
|
|
250
|
+
### 🔄 Planned Features
|
|
216
251
|
|
|
217
|
-
These features are
|
|
252
|
+
These features are planned for future releases:
|
|
218
253
|
|
|
219
|
-
- ⏳ **Redis/External Cache**:
|
|
220
|
-
- ⏳ **CLI Tool**:
|
|
221
|
-
- ⏳ **Interactive Playground**:
|
|
222
|
-
- ⏳ **Bun/Deno/Cloudflare Workers**:
|
|
223
|
-
- ⏳ **Advanced Analytics**: Dashboard and reporting features
|
|
224
|
-
- ⏳ **Geo-distributed Caching**:
|
|
254
|
+
- ⏳ **Redis/External Cache**: External cache adapters coming in v0.2.0
|
|
255
|
+
- ⏳ **CLI Tool**: Command-line interface planned
|
|
256
|
+
- ⏳ **Interactive Playground**: Web-based testing environment
|
|
257
|
+
- ⏳ **Bun/Deno/Cloudflare Workers**: Additional runtime support
|
|
258
|
+
- ⏳ **Advanced Analytics**: Dashboard and reporting features
|
|
259
|
+
- ⏳ **Geo-distributed Caching**: Multi-region cache support
|
|
225
260
|
|
|
226
261
|
### 📋 Roadmap to v0.2.0
|
|
227
262
|
|
|
228
263
|
- Redis cache adapter
|
|
264
|
+
- CLI tool
|
|
265
|
+
- Rate limiting improvements
|
|
266
|
+
- Batch processing optimization
|
|
267
|
+
|
|
268
|
+
See [ROADMAP.md](ROADMAP.md) for the complete roadmap.
|
|
269
|
+
|
|
270
|
+
## 🏗️ Code Architecture
|
|
271
|
+
|
|
272
|
+
RDAPify follows a clean, modular architecture with clear separation of concerns:
|
|
273
|
+
|
|
274
|
+
### Source Structure (`/src`)
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
src/
|
|
278
|
+
├── client/ # Client orchestration layer
|
|
279
|
+
│ ├── RDAPClient.ts # Main client (242 LOC)
|
|
280
|
+
│ └── QueryOrchestrator.ts # Query pattern extraction (169 LOC)
|
|
281
|
+
│
|
|
282
|
+
├── fetcher/ # HTTP and registry discovery
|
|
283
|
+
│ ├── Fetcher.ts # HTTP client (196 LOC)
|
|
284
|
+
│ ├── BootstrapDiscovery.ts # IANA bootstrap (224 LOC)
|
|
285
|
+
│ └── SSRFProtection.ts # Security validation (219 LOC)
|
|
286
|
+
│
|
|
287
|
+
├── normalizer/ # Data transformation
|
|
288
|
+
│ ├── Normalizer.ts # Response normalization (239 LOC)
|
|
289
|
+
│ └── PIIRedactor.ts # Privacy protection (140 LOC)
|
|
290
|
+
│
|
|
291
|
+
├── cache/ # Caching layer
|
|
292
|
+
│ ├── CacheManager.ts # Cache orchestration (188 LOC)
|
|
293
|
+
│ └── InMemoryCache.ts # LRU implementation (185 LOC)
|
|
294
|
+
│
|
|
295
|
+
├── types/ # TypeScript definitions
|
|
296
|
+
│ ├── enums.ts # Type aliases (87 LOC)
|
|
297
|
+
│ ├── entities.ts # Entity interfaces (74 LOC)
|
|
298
|
+
│ ├── responses.ts # Response types (100 LOC)
|
|
299
|
+
│ ├── errors.ts # Error classes (154 LOC)
|
|
300
|
+
│ ├── options.ts # Configuration types (201 LOC)
|
|
301
|
+
│ └── index.ts # Barrel export (36 LOC)
|
|
302
|
+
│
|
|
303
|
+
└── utils/ # Utilities
|
|
304
|
+
├── validators/ # Input validation
|
|
305
|
+
│ ├── domain.ts # Domain validation (55 LOC)
|
|
306
|
+
│ ├── ip.ts # IP validation (86 LOC)
|
|
307
|
+
│ ├── asn.ts # ASN validation (42 LOC)
|
|
308
|
+
│ └── network.ts # Network utilities (76 LOC)
|
|
309
|
+
│
|
|
310
|
+
└── helpers/ # Helper functions
|
|
311
|
+
├── async.ts # Async utilities (77 LOC)
|
|
312
|
+
├── string.ts # String manipulation (38 LOC)
|
|
313
|
+
├── object.ts # Object utilities (33 LOC)
|
|
314
|
+
├── cache.ts # Cache helpers (11 LOC)
|
|
315
|
+
├── http.ts # HTTP utilities (25 LOC)
|
|
316
|
+
├── format.ts # Formatting (27 LOC)
|
|
317
|
+
└── runtime.ts # Runtime detection (47 LOC)
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Key Design Principles
|
|
321
|
+
|
|
322
|
+
1. **Modular Architecture**: Each file has a single, clear responsibility
|
|
323
|
+
2. **Small Files**: All files <250 LOC for easy maintenance
|
|
324
|
+
3. **Type Safety**: Strict TypeScript with explicit types throughout
|
|
325
|
+
4. **Testability**: 146 tests with >90% coverage
|
|
326
|
+
5. **Security First**: SSRF protection and PII redaction built-in
|
|
327
|
+
6. **Performance**: Smart caching and optimized parsing
|
|
328
|
+
|
|
329
|
+
### Recent Improvements (Phase 2 Refactoring)
|
|
330
|
+
|
|
331
|
+
- ✅ Extracted QueryOrchestrator from RDAPClient (-29% LOC)
|
|
332
|
+
- ✅ Split validators into focused modules (-87% in main file)
|
|
333
|
+
- ✅ Split helpers into focused modules (-80% in main file)
|
|
334
|
+
- ✅ Split types into enums, entities, responses (-87% in main file)
|
|
335
|
+
- ✅ 712 lines of duplication eliminated
|
|
336
|
+
- ✅ 100% backward compatible (re-export shims)
|
|
337
|
+
|
|
338
|
+
See [REFACTOR_STATUS.md](REFACTOR_STATUS.md) for detailed refactoring progress.
|
|
339
|
+
|
|
340
|
+
### 📋 Roadmap to v0.2.0 (Continued)
|
|
229
341
|
- CLI tool with interactive mode
|
|
230
342
|
- Bun/Deno runtime compatibility testing
|
|
231
343
|
- Live integration tests (optional via LIVE_TESTS=1)
|
|
@@ -234,6 +346,44 @@ These features are documented but not yet implemented:
|
|
|
234
346
|
|
|
235
347
|
**Want to contribute?** Check out our [CONTRIBUTING.md](CONTRIBUTING.md) and [ROADMAP.md](ROADMAP.md)!
|
|
236
348
|
|
|
349
|
+
## 🔍 Version Verification
|
|
350
|
+
|
|
351
|
+
RDAPify intentionally does **not** export `./package.json` in the package exports for security and API surface minimization. Attempting to import it will throw an expected error:
|
|
352
|
+
|
|
353
|
+
```javascript
|
|
354
|
+
// ❌ This will throw ERR_PACKAGE_PATH_NOT_EXPORTED (expected behavior)
|
|
355
|
+
const pkg = require('rdapify/package.json');
|
|
356
|
+
// Error: Package subpath './package.json' is not defined by "exports"
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Safe Version Verification Methods
|
|
360
|
+
|
|
361
|
+
**Method 1: Using npm (recommended)**
|
|
362
|
+
```bash
|
|
363
|
+
npm ls rdapify
|
|
364
|
+
# Output: rdapify@0.1.0
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Method 2: Programmatic check via require.resolve**
|
|
368
|
+
```javascript
|
|
369
|
+
const fs = require('fs');
|
|
370
|
+
const path = require('path');
|
|
371
|
+
|
|
372
|
+
const entry = require.resolve('rdapify');
|
|
373
|
+
const pkgPath = path.join(path.dirname(entry), '..', 'package.json');
|
|
374
|
+
const version = JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version;
|
|
375
|
+
|
|
376
|
+
console.log('rdapify version:', version);
|
|
377
|
+
// Output: 0.1.0
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Method 3: Check installed version in package.json**
|
|
381
|
+
```bash
|
|
382
|
+
cat node_modules/rdapify/package.json | grep version
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
This design decision prevents accidental exposure of internal package metadata and maintains a minimal public API surface.
|
|
386
|
+
|
|
237
387
|
## 🏢 Early Adopters & Feedback
|
|
238
388
|
|
|
239
389
|
We're looking for early adopters and beta testers! If you're interested in:
|
|
@@ -241,8 +391,21 @@ We're looking for early adopters and beta testers! If you're interested in:
|
|
|
241
391
|
- Testing the library in your environment
|
|
242
392
|
- Providing feedback on the API design
|
|
243
393
|
- Contributing to the codebase
|
|
394
|
+
- Reporting bugs or suggesting features
|
|
395
|
+
|
|
396
|
+
**Get involved**:
|
|
397
|
+
- 🌐 Visit our website: [rdapify.com](https://rdapify.com)
|
|
398
|
+
- 🐛 Open a [GitHub Issue](https://github.com/rdapify/RDAPify/issues) for bugs or feature requests
|
|
399
|
+
- 💬 Start a [GitHub Discussion](https://github.com/rdapify/RDAPify/discussions) for questions or ideas
|
|
400
|
+
- 📖 Read the [Documentation](https://rdapify.com/docs)
|
|
401
|
+
- 🤝 Check out [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines
|
|
402
|
+
|
|
403
|
+
### Known Issues & Limitations
|
|
244
404
|
|
|
245
|
-
|
|
405
|
+
- Only in-memory caching available (Redis adapter planned for v0.2.0)
|
|
406
|
+
- No CLI tool yet (programmatic API only)
|
|
407
|
+
- Bun/Deno/Cloudflare Workers compatibility not yet tested
|
|
408
|
+
- Live RDAP server tests disabled by default (use `LIVE_TESTS=1` to enable)
|
|
246
409
|
|
|
247
410
|
## 📜 License
|
|
248
411
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { DomainResponse, IPResponse, ASNResponse } from '
|
|
2
|
-
import type { RDAPClientOptions } from '
|
|
1
|
+
import type { DomainResponse, IPResponse, ASNResponse } from '../../shared/types';
|
|
2
|
+
import type { RDAPClientOptions } from '../../shared/types/options';
|
|
3
3
|
export declare class RDAPClient {
|
|
4
4
|
private readonly options;
|
|
5
5
|
private readonly cache;
|
|
@@ -8,6 +8,7 @@ export declare class RDAPClient {
|
|
|
8
8
|
private readonly bootstrap;
|
|
9
9
|
private readonly normalizer;
|
|
10
10
|
private readonly piiRedactor;
|
|
11
|
+
private readonly orchestrator;
|
|
11
12
|
constructor(options?: RDAPClientOptions);
|
|
12
13
|
domain(domain: string): Promise<DomainResponse>;
|
|
13
14
|
ip(ip: string): Promise<IPResponse>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RDAPClient.d.ts","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlF,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,4BAA4B,CAAC;AAkBpC,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;gBAErC,OAAO,GAAE,iBAAsB;IA2ErC,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;CAGzC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RDAPClient = void 0;
|
|
4
|
+
const cache_1 = require("../../infrastructure/cache");
|
|
5
|
+
const http_1 = require("../../infrastructure/http");
|
|
6
|
+
const http_2 = require("../../infrastructure/http");
|
|
7
|
+
const security_1 = require("../../infrastructure/security");
|
|
8
|
+
const http_3 = require("../../infrastructure/http");
|
|
9
|
+
const security_2 = require("../../infrastructure/security");
|
|
10
|
+
const errors_1 = require("../../shared/errors");
|
|
11
|
+
const options_1 = require("../../shared/types/options");
|
|
12
|
+
const helpers_1 = require("../../shared/utils/helpers");
|
|
13
|
+
const services_1 = require("../services");
|
|
14
|
+
class RDAPClient {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = this.normalizeOptions(options);
|
|
17
|
+
const ssrfOptions = typeof this.options.ssrfProtection === 'boolean'
|
|
18
|
+
? { enabled: this.options.ssrfProtection }
|
|
19
|
+
: this.options.ssrfProtection;
|
|
20
|
+
this.ssrfProtection = new security_1.SSRFProtection(ssrfOptions);
|
|
21
|
+
this.fetcher = new http_2.Fetcher({
|
|
22
|
+
timeout: typeof this.options.timeout === 'number'
|
|
23
|
+
? {
|
|
24
|
+
request: this.options.timeout,
|
|
25
|
+
connect: this.options.timeout,
|
|
26
|
+
dns: this.options.timeout,
|
|
27
|
+
}
|
|
28
|
+
: this.options.timeout,
|
|
29
|
+
userAgent: this.options.userAgent,
|
|
30
|
+
headers: this.options.headers,
|
|
31
|
+
followRedirects: this.options.followRedirects,
|
|
32
|
+
maxRedirects: this.options.maxRedirects,
|
|
33
|
+
ssrfProtection: this.ssrfProtection,
|
|
34
|
+
});
|
|
35
|
+
this.bootstrap = new http_1.BootstrapDiscovery(this.options.bootstrapUrl, this.fetcher);
|
|
36
|
+
const cacheOptions = typeof this.options.cache === 'boolean'
|
|
37
|
+
? this.options.cache
|
|
38
|
+
? options_1.DEFAULT_OPTIONS.cache
|
|
39
|
+
: { strategy: 'none' }
|
|
40
|
+
: this.options.cache;
|
|
41
|
+
this.cache = new cache_1.CacheManager(cacheOptions);
|
|
42
|
+
this.normalizer = new http_3.Normalizer();
|
|
43
|
+
const privacyOptions = typeof this.options.privacy === 'boolean'
|
|
44
|
+
? { redactPII: this.options.privacy }
|
|
45
|
+
: this.options.privacy;
|
|
46
|
+
this.piiRedactor = new security_2.PIIRedactor(privacyOptions);
|
|
47
|
+
this.orchestrator = new services_1.QueryOrchestrator({
|
|
48
|
+
cache: this.cache,
|
|
49
|
+
bootstrap: this.bootstrap,
|
|
50
|
+
fetcher: this.fetcher,
|
|
51
|
+
normalizer: this.normalizer,
|
|
52
|
+
piiRedactor: this.piiRedactor,
|
|
53
|
+
includeRaw: this.options.includeRaw,
|
|
54
|
+
fetchWithRetry: this.fetchWithRetry.bind(this),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async domain(domain) {
|
|
58
|
+
return this.orchestrator.queryDomain(domain);
|
|
59
|
+
}
|
|
60
|
+
async ip(ip) {
|
|
61
|
+
return this.orchestrator.queryIP(ip);
|
|
62
|
+
}
|
|
63
|
+
async asn(asn) {
|
|
64
|
+
return this.orchestrator.queryASN(asn);
|
|
65
|
+
}
|
|
66
|
+
async fetchWithRetry(url) {
|
|
67
|
+
const retryOptions = typeof this.options.retry === 'boolean'
|
|
68
|
+
? this.options.retry
|
|
69
|
+
? options_1.DEFAULT_OPTIONS.retry
|
|
70
|
+
: { maxAttempts: 1 }
|
|
71
|
+
: this.options.retry;
|
|
72
|
+
let lastError;
|
|
73
|
+
for (let attempt = 1; attempt <= (retryOptions.maxAttempts || 1); attempt++) {
|
|
74
|
+
try {
|
|
75
|
+
return await this.fetcher.fetch(url);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
lastError = error;
|
|
79
|
+
if (error instanceof errors_1.ValidationError) {
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
if (attempt < (retryOptions.maxAttempts || 1)) {
|
|
83
|
+
const delay = (0, helpers_1.calculateBackoff)(attempt, retryOptions.backoff || 'exponential', retryOptions.initialDelay || 1000, retryOptions.maxDelay || 10000);
|
|
84
|
+
await (0, helpers_1.sleep)(delay);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw lastError;
|
|
90
|
+
}
|
|
91
|
+
normalizeOptions(options) {
|
|
92
|
+
return (0, helpers_1.deepMerge)(options_1.DEFAULT_OPTIONS, options);
|
|
93
|
+
}
|
|
94
|
+
async clearCache() {
|
|
95
|
+
await this.cache.clear();
|
|
96
|
+
this.bootstrap.clearCache();
|
|
97
|
+
}
|
|
98
|
+
async getStats() {
|
|
99
|
+
return {
|
|
100
|
+
cache: await this.cache.getStats(),
|
|
101
|
+
bootstrap: this.bootstrap.getCacheStats(),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
getConfig() {
|
|
105
|
+
return { ...this.options };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.RDAPClient = RDAPClient;
|
|
109
|
+
//# sourceMappingURL=RDAPClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RDAPClient.js","sourceRoot":"","sources":["../../../src/application/client/RDAPClient.ts"],"names":[],"mappings":";;;AAKA,sDAA0D;AAC1D,oDAA+D;AAC/D,oDAAoD;AACpD,4DAA+D;AAC/D,oDAAuD;AACvD,4DAA4D;AAE5D,gDAAsD;AACtD,wDAA6D;AAM7D,wDAAgF;AAChF,0CAAgD;AAgBhD,MAAa,UAAU;IAUrB,YAAY,UAA6B,EAAE;QAEzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAG9C,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;YAC9C,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,yBAAc,CAAC,WAAW,CAAC,CAAC;QAGtD,IAAI,CAAC,OAAO,GAAG,IAAI,cAAO,CAAC;YACzB,OAAO,EACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ;gBACtC,CAAC,CAAC;oBACE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;oBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;oBAC7B,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;iBAC1B;gBACH,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAC1B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;YAC7C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QAGH,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAGjF,MAAM,YAAY,GAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;YACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;gBAClB,CAAC,CAAE,yBAAe,CAAC,KAAsB;gBACzC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAe,EAAE;YACjC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,oBAAY,CAAC,YAAY,CAAC,CAAC;QAG5C,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAU,EAAE,CAAC;QAGnC,MAAM,cAAc,GAClB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;YACvC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,sBAAW,CAAC,cAAc,CAAC,CAAC;QAGnD,IAAI,CAAC,YAAY,GAAG,IAAI,4BAAiB,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IAeD,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAeD,KAAK,CAAC,EAAE,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAcD,KAAK,CAAC,GAAG,CAAC,GAAoB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAKO,KAAK,CAAC,cAAc,CAAC,GAAW;QACtC,MAAM,YAAY,GAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;YACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;gBAClB,CAAC,CAAE,yBAAe,CAAC,KAAsB;gBACzC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;YACtB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEzB,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5E,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAG3B,IAAI,KAAK,YAAY,wBAAe,EAAE,CAAC;oBACrC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAGD,IAAI,OAAO,GAAG,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC9C,MAAM,KAAK,GAAG,IAAA,0BAAgB,EAC5B,OAAO,EACP,YAAY,CAAC,OAAO,IAAI,aAAa,EACrC,YAAY,CAAC,YAAY,IAAI,IAAI,EACjC,YAAY,CAAC,QAAQ,IAAI,KAAK,CAC/B,CAAC;oBAEF,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC;IAClB,CAAC;IAKO,gBAAgB,CAAC,OAA0B;QACjD,OAAO,IAAA,mBAAS,EAAC,yBAAe,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAKD,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAKD,KAAK,CAAC,QAAQ;QAWZ,OAAO;YACL,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAClC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;SAC1C,CAAC;IACJ,CAAC;IAKD,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AA7MD,gCA6MC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/application/client/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RDAPClient = void 0;
|
|
4
|
+
var RDAPClient_1 = require("./RDAPClient");
|
|
5
|
+
Object.defineProperty(exports, "RDAPClient", { enumerable: true, get: function () { return RDAPClient_1.RDAPClient; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/application/client/index.ts"],"names":[],"mappings":";;;AAKA,2CAA0C;AAAjC,wGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CacheManager } from '../../infrastructure/cache';
|
|
2
|
+
import type { BootstrapDiscovery } from '../../infrastructure/http';
|
|
3
|
+
import type { Fetcher } from '../../infrastructure/http';
|
|
4
|
+
import type { Normalizer } from '../../infrastructure/http';
|
|
5
|
+
import type { PIIRedactor } from '../../infrastructure/security';
|
|
6
|
+
import type { DomainResponse, IPResponse, ASNResponse } from '../../shared/types';
|
|
7
|
+
export interface QueryOrchestratorConfig {
|
|
8
|
+
cache: CacheManager;
|
|
9
|
+
bootstrap: BootstrapDiscovery;
|
|
10
|
+
fetcher: Fetcher;
|
|
11
|
+
normalizer: Normalizer;
|
|
12
|
+
piiRedactor: PIIRedactor;
|
|
13
|
+
includeRaw: boolean;
|
|
14
|
+
fetchWithRetry: (url: string) => Promise<any>;
|
|
15
|
+
}
|
|
16
|
+
export declare class QueryOrchestrator {
|
|
17
|
+
private readonly config;
|
|
18
|
+
constructor(config: QueryOrchestratorConfig);
|
|
19
|
+
queryDomain(domain: string): Promise<DomainResponse>;
|
|
20
|
+
queryIP(ip: string): Promise<IPResponse>;
|
|
21
|
+
queryASN(asn: string | number): Promise<ASNResponse>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=QueryOrchestrator.d.ts.map
|
|
@@ -0,0 +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,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,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;CAC/C;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;IAwCpD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2CxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC3D"}
|