@push.rocks/smartregistry 2.2.2 → 2.3.0
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/cargo/classes.cargoregistry.d.ts +7 -1
- package/dist_ts/cargo/classes.cargoregistry.js +42 -4
- package/dist_ts/cargo/classes.cargoupstream.d.ts +44 -0
- package/dist_ts/cargo/classes.cargoupstream.js +129 -0
- package/dist_ts/cargo/index.d.ts +1 -0
- package/dist_ts/cargo/index.js +2 -1
- package/dist_ts/classes.smartregistry.js +8 -8
- package/dist_ts/composer/classes.composerregistry.d.ts +7 -1
- package/dist_ts/composer/classes.composerregistry.js +34 -3
- package/dist_ts/composer/classes.composerupstream.d.ts +40 -0
- package/dist_ts/composer/classes.composerupstream.js +159 -0
- package/dist_ts/composer/index.d.ts +1 -0
- package/dist_ts/composer/index.js +2 -1
- package/dist_ts/core/interfaces.core.d.ts +3 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/maven/classes.mavenregistry.d.ts +12 -1
- package/dist_ts/maven/classes.mavenregistry.js +69 -4
- package/dist_ts/maven/classes.mavenupstream.d.ts +45 -0
- package/dist_ts/maven/classes.mavenupstream.js +153 -0
- package/dist_ts/maven/index.d.ts +1 -0
- package/dist_ts/maven/index.js +2 -1
- package/dist_ts/npm/classes.npmregistry.d.ts +3 -1
- package/dist_ts/npm/classes.npmregistry.js +55 -6
- package/dist_ts/npm/classes.npmupstream.d.ts +51 -0
- package/dist_ts/npm/classes.npmupstream.js +206 -0
- package/dist_ts/npm/index.d.ts +1 -0
- package/dist_ts/npm/index.js +2 -1
- package/dist_ts/oci/classes.ociregistry.d.ts +4 -1
- package/dist_ts/oci/classes.ociregistry.js +78 -17
- package/dist_ts/oci/classes.ociupstream.d.ts +62 -0
- package/dist_ts/oci/classes.ociupstream.js +206 -0
- package/dist_ts/oci/index.d.ts +1 -0
- package/dist_ts/oci/index.js +2 -1
- package/dist_ts/plugins.d.ts +4 -1
- package/dist_ts/plugins.js +6 -2
- package/dist_ts/pypi/classes.pypiregistry.d.ts +7 -1
- package/dist_ts/pypi/classes.pypiregistry.js +60 -4
- package/dist_ts/pypi/classes.pypiupstream.d.ts +48 -0
- package/dist_ts/pypi/classes.pypiupstream.js +165 -0
- package/dist_ts/pypi/index.d.ts +1 -0
- package/dist_ts/pypi/index.js +2 -1
- package/dist_ts/rubygems/classes.rubygemsregistry.d.ts +7 -1
- package/dist_ts/rubygems/classes.rubygemsregistry.js +35 -4
- package/dist_ts/rubygems/classes.rubygemsupstream.d.ts +47 -0
- package/dist_ts/rubygems/classes.rubygemsupstream.js +184 -0
- package/dist_ts/rubygems/index.d.ts +1 -0
- package/dist_ts/rubygems/index.js +2 -1
- package/dist_ts/upstream/classes.baseupstream.d.ts +112 -0
- package/dist_ts/upstream/classes.baseupstream.js +409 -0
- package/dist_ts/upstream/classes.circuitbreaker.d.ts +111 -0
- package/dist_ts/upstream/classes.circuitbreaker.js +192 -0
- package/dist_ts/upstream/classes.upstreamcache.d.ts +123 -0
- package/dist_ts/upstream/classes.upstreamcache.js +328 -0
- package/dist_ts/upstream/index.d.ts +6 -0
- package/dist_ts/upstream/index.js +7 -0
- package/dist_ts/upstream/interfaces.upstream.d.ts +169 -0
- package/dist_ts/upstream/interfaces.upstream.js +23 -0
- package/package.json +4 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/cargo/classes.cargoregistry.ts +48 -3
- package/ts/cargo/classes.cargoupstream.ts +159 -0
- package/ts/cargo/index.ts +1 -0
- package/ts/classes.smartregistry.ts +49 -7
- package/ts/composer/classes.composerregistry.ts +39 -2
- package/ts/composer/classes.composerupstream.ts +200 -0
- package/ts/composer/index.ts +1 -0
- package/ts/core/interfaces.core.ts +3 -0
- package/ts/index.ts +3 -0
- package/ts/maven/classes.mavenregistry.ts +84 -3
- package/ts/maven/classes.mavenupstream.ts +220 -0
- package/ts/maven/index.ts +1 -0
- package/ts/npm/classes.npmregistry.ts +61 -5
- package/ts/npm/classes.npmupstream.ts +260 -0
- package/ts/npm/index.ts +1 -0
- package/ts/oci/classes.ociregistry.ts +89 -17
- package/ts/oci/classes.ociupstream.ts +263 -0
- package/ts/oci/index.ts +1 -0
- package/ts/plugins.ts +7 -1
- package/ts/pypi/classes.pypiregistry.ts +68 -3
- package/ts/pypi/classes.pypiupstream.ts +211 -0
- package/ts/pypi/index.ts +1 -0
- package/ts/rubygems/classes.rubygemsregistry.ts +40 -3
- package/ts/rubygems/classes.rubygemsupstream.ts +230 -0
- package/ts/rubygems/index.ts +1 -0
- package/ts/upstream/classes.baseupstream.ts +521 -0
- package/ts/upstream/classes.circuitbreaker.ts +238 -0
- package/ts/upstream/classes.upstreamcache.ts +423 -0
- package/ts/upstream/index.ts +11 -0
- package/ts/upstream/interfaces.upstream.ts +195 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { TRegistryProtocol } from '../core/interfaces.core.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Scope rule for routing requests to specific upstreams.
|
|
5
|
+
* Uses glob patterns for flexible matching.
|
|
6
|
+
*/
|
|
7
|
+
export interface IUpstreamScopeRule {
|
|
8
|
+
/** Glob pattern (e.g., "@company/*", "com.example.*", "library/*") */
|
|
9
|
+
pattern: string;
|
|
10
|
+
/** Whether matching resources should be included or excluded */
|
|
11
|
+
action: 'include' | 'exclude';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Authentication configuration for an upstream registry.
|
|
16
|
+
* Supports multiple auth strategies.
|
|
17
|
+
*/
|
|
18
|
+
export interface IUpstreamAuthConfig {
|
|
19
|
+
/** Authentication type */
|
|
20
|
+
type: 'none' | 'basic' | 'bearer' | 'api-key';
|
|
21
|
+
/** Username for basic auth */
|
|
22
|
+
username?: string;
|
|
23
|
+
/** Password for basic auth */
|
|
24
|
+
password?: string;
|
|
25
|
+
/** Token for bearer or api-key auth */
|
|
26
|
+
token?: string;
|
|
27
|
+
/** Custom header name for api-key auth (default: 'Authorization') */
|
|
28
|
+
headerName?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Cache configuration for upstream content.
|
|
33
|
+
*/
|
|
34
|
+
export interface IUpstreamCacheConfig {
|
|
35
|
+
/** Whether caching is enabled */
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
/** Default TTL in seconds for mutable content (default: 300 = 5 min) */
|
|
38
|
+
defaultTtlSeconds: number;
|
|
39
|
+
/** TTL in seconds for immutable/content-addressable content (default: 2592000 = 30 days) */
|
|
40
|
+
immutableTtlSeconds: number;
|
|
41
|
+
/** Whether to serve stale content while revalidating in background */
|
|
42
|
+
staleWhileRevalidate: boolean;
|
|
43
|
+
/** Maximum age in seconds for stale content (default: 3600 = 1 hour) */
|
|
44
|
+
staleMaxAgeSeconds: number;
|
|
45
|
+
/** TTL in seconds for negative cache entries (404s) (default: 60 = 1 min) */
|
|
46
|
+
negativeCacheTtlSeconds: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Resilience configuration for upstream requests.
|
|
51
|
+
*/
|
|
52
|
+
export interface IUpstreamResilienceConfig {
|
|
53
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
54
|
+
timeoutMs: number;
|
|
55
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
56
|
+
maxRetries: number;
|
|
57
|
+
/** Initial retry delay in milliseconds (default: 1000) */
|
|
58
|
+
retryDelayMs: number;
|
|
59
|
+
/** Maximum retry delay in milliseconds (default: 30000) */
|
|
60
|
+
retryMaxDelayMs: number;
|
|
61
|
+
/** Number of failures before circuit breaker opens (default: 5) */
|
|
62
|
+
circuitBreakerThreshold: number;
|
|
63
|
+
/** Time in milliseconds before circuit breaker attempts reset (default: 30000) */
|
|
64
|
+
circuitBreakerResetMs: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Configuration for a single upstream registry.
|
|
69
|
+
*/
|
|
70
|
+
export interface IUpstreamRegistryConfig {
|
|
71
|
+
/** Unique identifier for this upstream */
|
|
72
|
+
id: string;
|
|
73
|
+
/** Human-readable name */
|
|
74
|
+
name: string;
|
|
75
|
+
/** Base URL of the upstream registry (e.g., "https://registry.npmjs.org") */
|
|
76
|
+
url: string;
|
|
77
|
+
/** Priority for routing (lower = higher priority, 1 = first) */
|
|
78
|
+
priority: number;
|
|
79
|
+
/** Whether this upstream is enabled */
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
/** Scope rules for routing (empty = match all) */
|
|
82
|
+
scopeRules?: IUpstreamScopeRule[];
|
|
83
|
+
/** Authentication configuration */
|
|
84
|
+
auth: IUpstreamAuthConfig;
|
|
85
|
+
/** Cache configuration overrides */
|
|
86
|
+
cache?: Partial<IUpstreamCacheConfig>;
|
|
87
|
+
/** Resilience configuration overrides */
|
|
88
|
+
resilience?: Partial<IUpstreamResilienceConfig>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Protocol-level upstream configuration.
|
|
93
|
+
* Configures upstream behavior for a specific protocol (npm, oci, etc.)
|
|
94
|
+
*/
|
|
95
|
+
export interface IProtocolUpstreamConfig {
|
|
96
|
+
/** Whether upstream is enabled for this protocol */
|
|
97
|
+
enabled: boolean;
|
|
98
|
+
/** List of upstream registries, ordered by priority */
|
|
99
|
+
upstreams: IUpstreamRegistryConfig[];
|
|
100
|
+
/** Protocol-level cache configuration defaults */
|
|
101
|
+
cache?: Partial<IUpstreamCacheConfig>;
|
|
102
|
+
/** Protocol-level resilience configuration defaults */
|
|
103
|
+
resilience?: Partial<IUpstreamResilienceConfig>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Result of an upstream fetch operation.
|
|
108
|
+
*/
|
|
109
|
+
export interface IUpstreamResult {
|
|
110
|
+
/** Whether the fetch was successful (2xx status) */
|
|
111
|
+
success: boolean;
|
|
112
|
+
/** HTTP status code */
|
|
113
|
+
status: number;
|
|
114
|
+
/** Response headers */
|
|
115
|
+
headers: Record<string, string>;
|
|
116
|
+
/** Response body (Buffer for binary, object for JSON) */
|
|
117
|
+
body?: Buffer | any;
|
|
118
|
+
/** ID of the upstream that served the request */
|
|
119
|
+
upstreamId: string;
|
|
120
|
+
/** Whether the response was served from cache */
|
|
121
|
+
fromCache: boolean;
|
|
122
|
+
/** Request latency in milliseconds */
|
|
123
|
+
latencyMs: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Circuit breaker state.
|
|
128
|
+
*/
|
|
129
|
+
export type TCircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Context for an upstream fetch request.
|
|
133
|
+
*/
|
|
134
|
+
export interface IUpstreamFetchContext {
|
|
135
|
+
/** Protocol type */
|
|
136
|
+
protocol: TRegistryProtocol;
|
|
137
|
+
/** Resource identifier (package name, artifact name, etc.) */
|
|
138
|
+
resource: string;
|
|
139
|
+
/** Type of resource being fetched (packument, tarball, manifest, blob, etc.) */
|
|
140
|
+
resourceType: string;
|
|
141
|
+
/** Original request path */
|
|
142
|
+
path: string;
|
|
143
|
+
/** HTTP method */
|
|
144
|
+
method: string;
|
|
145
|
+
/** Request headers */
|
|
146
|
+
headers: Record<string, string>;
|
|
147
|
+
/** Query parameters */
|
|
148
|
+
query: Record<string, string>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Cache entry stored in the upstream cache.
|
|
153
|
+
*/
|
|
154
|
+
export interface ICacheEntry {
|
|
155
|
+
/** Cached data */
|
|
156
|
+
data: Buffer;
|
|
157
|
+
/** Content type of the cached data */
|
|
158
|
+
contentType: string;
|
|
159
|
+
/** Original response headers */
|
|
160
|
+
headers: Record<string, string>;
|
|
161
|
+
/** When the entry was cached */
|
|
162
|
+
cachedAt: Date;
|
|
163
|
+
/** When the entry expires */
|
|
164
|
+
expiresAt?: Date;
|
|
165
|
+
/** ETag for conditional requests */
|
|
166
|
+
etag?: string;
|
|
167
|
+
/** ID of the upstream that provided the data */
|
|
168
|
+
upstreamId: string;
|
|
169
|
+
/** Whether the entry is stale but still usable */
|
|
170
|
+
stale?: boolean;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Default cache configuration values.
|
|
175
|
+
*/
|
|
176
|
+
export const DEFAULT_CACHE_CONFIG: IUpstreamCacheConfig = {
|
|
177
|
+
enabled: true,
|
|
178
|
+
defaultTtlSeconds: 300, // 5 minutes
|
|
179
|
+
immutableTtlSeconds: 2592000, // 30 days
|
|
180
|
+
staleWhileRevalidate: true,
|
|
181
|
+
staleMaxAgeSeconds: 3600, // 1 hour
|
|
182
|
+
negativeCacheTtlSeconds: 60, // 1 minute
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Default resilience configuration values.
|
|
187
|
+
*/
|
|
188
|
+
export const DEFAULT_RESILIENCE_CONFIG: IUpstreamResilienceConfig = {
|
|
189
|
+
timeoutMs: 30000,
|
|
190
|
+
maxRetries: 3,
|
|
191
|
+
retryDelayMs: 1000,
|
|
192
|
+
retryMaxDelayMs: 30000,
|
|
193
|
+
circuitBreakerThreshold: 5,
|
|
194
|
+
circuitBreakerResetMs: 30000,
|
|
195
|
+
};
|