veryfront 0.0.82 → 0.0.83
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/README.md +15 -1
- package/esm/deno.js +1 -1
- package/esm/proxy/cache/index.d.ts +41 -0
- package/esm/proxy/cache/index.d.ts.map +1 -0
- package/esm/proxy/cache/index.js +75 -0
- package/esm/proxy/cache/memory-cache.d.ts +18 -0
- package/esm/proxy/cache/memory-cache.d.ts.map +1 -0
- package/esm/proxy/cache/memory-cache.js +100 -0
- package/esm/proxy/cache/redis-cache.d.ts +27 -0
- package/esm/proxy/cache/redis-cache.d.ts.map +1 -0
- package/esm/proxy/cache/redis-cache.js +183 -0
- package/esm/proxy/cache/resilient-cache.d.ts +44 -0
- package/esm/proxy/cache/resilient-cache.d.ts.map +1 -0
- package/esm/proxy/cache/resilient-cache.js +178 -0
- package/esm/proxy/cache/types.d.ts +65 -0
- package/esm/proxy/cache/types.d.ts.map +1 -0
- package/esm/proxy/cache/types.js +7 -0
- package/esm/proxy/handler.d.ts +81 -0
- package/esm/proxy/handler.d.ts.map +1 -0
- package/esm/proxy/handler.js +417 -0
- package/esm/proxy/logger.d.ts +29 -0
- package/esm/proxy/logger.d.ts.map +1 -0
- package/esm/proxy/logger.js +258 -0
- package/esm/proxy/oauth-client.d.ts +15 -0
- package/esm/proxy/oauth-client.d.ts.map +1 -0
- package/esm/proxy/oauth-client.js +52 -0
- package/esm/proxy/token-manager.d.ts +59 -0
- package/esm/proxy/token-manager.d.ts.map +1 -0
- package/esm/proxy/token-manager.js +125 -0
- package/esm/proxy/tracing.d.ts +39 -0
- package/esm/proxy/tracing.d.ts.map +1 -0
- package/esm/proxy/tracing.js +194 -0
- package/esm/src/cache/backend.d.ts +2 -0
- package/esm/src/cache/backend.d.ts.map +1 -1
- package/esm/src/cache/backend.js +2 -0
- package/esm/src/cache/cache-key-builder.d.ts +0 -4
- package/esm/src/cache/cache-key-builder.d.ts.map +1 -1
- package/esm/src/cache/cache-key-builder.js +0 -6
- package/esm/src/cache/multi-tier.d.ts +0 -29
- package/esm/src/cache/multi-tier.d.ts.map +1 -1
- package/esm/src/cache/multi-tier.js +0 -26
- package/esm/src/cli/app/actions.d.ts +26 -0
- package/esm/src/cli/app/actions.d.ts.map +1 -0
- package/esm/src/cli/app/actions.js +152 -0
- package/esm/src/cli/app/components/inline-input.d.ts +35 -0
- package/esm/src/cli/app/components/inline-input.d.ts.map +1 -0
- package/esm/src/cli/app/components/inline-input.js +220 -0
- package/esm/src/cli/app/components/list-select.d.ts +69 -0
- package/esm/src/cli/app/components/list-select.d.ts.map +1 -0
- package/esm/src/cli/app/components/list-select.js +137 -0
- package/esm/src/cli/app/index.d.ts +45 -0
- package/esm/src/cli/app/index.d.ts.map +1 -0
- package/esm/src/cli/app/index.js +1252 -0
- package/esm/src/cli/app/state.d.ts +122 -0
- package/esm/src/cli/app/state.d.ts.map +1 -0
- package/esm/src/cli/app/state.js +232 -0
- package/esm/src/cli/app/views/dashboard.d.ts +19 -0
- package/esm/src/cli/app/views/dashboard.d.ts.map +1 -0
- package/esm/src/cli/app/views/dashboard.js +178 -0
- package/esm/src/cli/index/command-router.d.ts.map +1 -1
- package/esm/src/cli/index/command-router.js +9 -39
- package/esm/src/cli/index/start-handler.d.ts +3 -0
- package/esm/src/cli/index/start-handler.d.ts.map +1 -0
- package/esm/src/cli/index/start-handler.js +145 -0
- package/esm/src/cli/mcp/index.d.ts +11 -0
- package/esm/src/cli/mcp/index.d.ts.map +1 -0
- package/esm/src/cli/mcp/index.js +10 -0
- package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts +2 -0
- package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts.map +1 -1
- package/esm/src/middleware/builtin/security/redis-rate-limit.js +23 -9
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts +10 -0
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.js +30 -42
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +34 -13
- package/esm/src/platform/adapters/fs/cache/file-cache.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/cache/file-cache.js +9 -3
- package/esm/src/server/context/cache-invalidation.d.ts.map +1 -1
- package/esm/src/server/context/cache-invalidation.js +4 -0
- package/esm/src/server/handlers/dev/dashboard/api.js +4 -0
- package/esm/src/server/handlers/dev/projects/ui-handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/projects/ui-handler.js +6 -0
- package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache.js +139 -64
- package/esm/src/utils/index.d.ts +1 -1
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +1 -1
- package/package.json +2 -1
- package/src/deno.js +1 -1
- package/src/proxy/cache/index.ts +93 -0
- package/src/proxy/cache/memory-cache.ts +120 -0
- package/src/proxy/cache/redis-cache.ts +203 -0
- package/src/proxy/cache/resilient-cache.ts +205 -0
- package/src/proxy/cache/types.ts +72 -0
- package/src/proxy/handler.ts +593 -0
- package/src/proxy/logger.ts +329 -0
- package/src/proxy/oauth-client.ts +91 -0
- package/src/proxy/token-manager.ts +174 -0
- package/src/proxy/tracing.ts +237 -0
- package/src/src/cache/backend.ts +3 -0
- package/src/src/cache/cache-key-builder.ts +0 -9
- package/src/src/cache/multi-tier.ts +0 -41
- package/src/src/cli/app/actions.ts +190 -0
- package/src/src/cli/app/components/inline-input.ts +255 -0
- package/src/src/cli/app/components/list-select.ts +215 -0
- package/src/src/cli/app/index.ts +1471 -0
- package/src/src/cli/app/state.ts +385 -0
- package/src/src/cli/app/views/dashboard.ts +212 -0
- package/src/src/cli/index/command-router.ts +9 -40
- package/src/src/cli/index/start-handler.ts +195 -0
- package/src/src/cli/mcp/index.ts +11 -0
- package/src/src/middleware/builtin/security/redis-rate-limit.ts +24 -11
- package/src/src/modules/react-loader/ssr-module-loader/cache/redis.ts +36 -50
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +38 -14
- package/src/src/platform/adapters/fs/cache/file-cache.ts +9 -3
- package/src/src/server/context/cache-invalidation.ts +4 -0
- package/src/src/server/handlers/dev/dashboard/api.ts +2 -0
- package/src/src/server/handlers/dev/projects/ui-handler.ts +6 -0
- package/src/src/transforms/esm/http-cache.ts +148 -73
- package/src/src/utils/index.ts +0 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient Token Cache
|
|
3
|
+
*
|
|
4
|
+
* Wraps a primary cache (Redis) with a fallback cache (Memory).
|
|
5
|
+
* Automatically falls back to memory cache when Redis operations fail.
|
|
6
|
+
* Provides graceful degradation instead of hard failures.
|
|
7
|
+
*/
|
|
8
|
+
import { proxyLogger } from "../logger.js";
|
|
9
|
+
import { withSpan } from "../tracing.js";
|
|
10
|
+
const CIRCUIT_OPEN_DURATION_MS = 30_000; // 30 seconds
|
|
11
|
+
const FAILURE_THRESHOLD = 3; // failures before circuit opens
|
|
12
|
+
const logger = proxyLogger.child({ module: "cache" });
|
|
13
|
+
export class ResilientCache {
|
|
14
|
+
primary;
|
|
15
|
+
fallback;
|
|
16
|
+
usingFallback = false;
|
|
17
|
+
failureCount = 0;
|
|
18
|
+
circuitOpenedAt = null;
|
|
19
|
+
constructor(primary, fallback) {
|
|
20
|
+
this.primary = primary;
|
|
21
|
+
this.fallback = fallback;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if we should try primary again after circuit was opened.
|
|
25
|
+
*/
|
|
26
|
+
shouldTryPrimary() {
|
|
27
|
+
if (!this.usingFallback)
|
|
28
|
+
return true;
|
|
29
|
+
// If circuit was opened, check if enough time has passed
|
|
30
|
+
if (this.circuitOpenedAt) {
|
|
31
|
+
const elapsed = Date.now() - this.circuitOpenedAt;
|
|
32
|
+
if (elapsed >= CIRCUIT_OPEN_DURATION_MS) {
|
|
33
|
+
logger.info("[ResilientCache] Circuit half-open, trying primary again");
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Record a successful primary operation - reset failure state.
|
|
41
|
+
*/
|
|
42
|
+
recordSuccess() {
|
|
43
|
+
if (this.usingFallback) {
|
|
44
|
+
logger.info("[ResilientCache] Primary recovered, switching back from fallback");
|
|
45
|
+
this.usingFallback = false;
|
|
46
|
+
this.failureCount = 0;
|
|
47
|
+
this.circuitOpenedAt = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Record a primary failure - may trigger fallback.
|
|
52
|
+
*/
|
|
53
|
+
recordFailure(error) {
|
|
54
|
+
this.failureCount++;
|
|
55
|
+
logger.warn(`[ResilientCache] Primary cache error (${this.failureCount}/${FAILURE_THRESHOLD}):`, { error: error instanceof Error ? error.message : error });
|
|
56
|
+
if (this.failureCount >= FAILURE_THRESHOLD && !this.usingFallback) {
|
|
57
|
+
logger.warn("[ResilientCache] Opening circuit, switching to fallback cache");
|
|
58
|
+
this.usingFallback = true;
|
|
59
|
+
this.circuitOpenedAt = Date.now();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async get(key) {
|
|
63
|
+
return withSpan("cache.resilient.get", async () => {
|
|
64
|
+
// Try primary if circuit allows
|
|
65
|
+
if (this.shouldTryPrimary()) {
|
|
66
|
+
try {
|
|
67
|
+
const result = await this.primary.get(key);
|
|
68
|
+
this.recordSuccess();
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
this.recordFailure(error);
|
|
73
|
+
// Don't return here - try fallback
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Use fallback
|
|
77
|
+
return this.fallback.get(key);
|
|
78
|
+
}, { "cache.key": key, "cache.usingFallback": this.usingFallback });
|
|
79
|
+
}
|
|
80
|
+
async set(key, entry) {
|
|
81
|
+
return withSpan("cache.resilient.set", async () => {
|
|
82
|
+
// Always try to set in fallback (local cache)
|
|
83
|
+
await this.fallback.set(key, entry);
|
|
84
|
+
// Try primary if circuit allows
|
|
85
|
+
if (this.shouldTryPrimary()) {
|
|
86
|
+
try {
|
|
87
|
+
await this.primary.set(key, entry);
|
|
88
|
+
this.recordSuccess();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.recordFailure(error);
|
|
92
|
+
// Fallback already set above, no need to retry
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}, { "cache.key": key, "cache.usingFallback": this.usingFallback });
|
|
96
|
+
}
|
|
97
|
+
async delete(key) {
|
|
98
|
+
return withSpan("cache.resilient.delete", async () => {
|
|
99
|
+
// Delete from both
|
|
100
|
+
await this.fallback.delete(key);
|
|
101
|
+
if (this.shouldTryPrimary()) {
|
|
102
|
+
try {
|
|
103
|
+
await this.primary.delete(key);
|
|
104
|
+
this.recordSuccess();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.recordFailure(error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, { "cache.key": key });
|
|
111
|
+
}
|
|
112
|
+
async clear() {
|
|
113
|
+
return withSpan("cache.resilient.clear", async () => {
|
|
114
|
+
await this.fallback.clear();
|
|
115
|
+
if (this.shouldTryPrimary()) {
|
|
116
|
+
try {
|
|
117
|
+
await this.primary.clear();
|
|
118
|
+
this.recordSuccess();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
this.recordFailure(error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async has(key) {
|
|
127
|
+
return withSpan("cache.resilient.has", async () => {
|
|
128
|
+
if (this.shouldTryPrimary()) {
|
|
129
|
+
try {
|
|
130
|
+
const result = await this.primary.has(key);
|
|
131
|
+
this.recordSuccess();
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
this.recordFailure(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return this.fallback.has(key);
|
|
139
|
+
}, { "cache.key": key });
|
|
140
|
+
}
|
|
141
|
+
async stats() {
|
|
142
|
+
return withSpan("cache.resilient.stats", async () => {
|
|
143
|
+
const fallbackStats = await this.fallback.stats();
|
|
144
|
+
if (this.shouldTryPrimary()) {
|
|
145
|
+
try {
|
|
146
|
+
const primaryStats = await this.primary.stats();
|
|
147
|
+
this.recordSuccess();
|
|
148
|
+
return {
|
|
149
|
+
...primaryStats,
|
|
150
|
+
type: this.usingFallback ? "memory" : "redis",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
this.recordFailure(error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
...fallbackStats,
|
|
159
|
+
type: "memory",
|
|
160
|
+
};
|
|
161
|
+
}, { "cache.usingFallback": this.usingFallback });
|
|
162
|
+
}
|
|
163
|
+
async close() {
|
|
164
|
+
return withSpan("cache.resilient.close", async () => {
|
|
165
|
+
await Promise.all([this.primary.close(), this.fallback.close()]);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get current resilience status for debugging/health checks.
|
|
170
|
+
*/
|
|
171
|
+
getStatus() {
|
|
172
|
+
return {
|
|
173
|
+
usingFallback: this.usingFallback,
|
|
174
|
+
failureCount: this.failureCount,
|
|
175
|
+
circuitOpenedAt: this.circuitOpenedAt,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Cache Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstraction for storing OAuth tokens with TTL support.
|
|
5
|
+
* Implementations: MemoryCache, RedisCache
|
|
6
|
+
*/
|
|
7
|
+
export interface TokenCacheEntry {
|
|
8
|
+
token: string;
|
|
9
|
+
expiresAt: number;
|
|
10
|
+
scope: "preview" | "production";
|
|
11
|
+
projectSlug?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TokenCache {
|
|
14
|
+
/**
|
|
15
|
+
* Get a cached token entry.
|
|
16
|
+
*/
|
|
17
|
+
get(key: string): Promise<TokenCacheEntry | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Set a token entry with automatic TTL based on expiresAt.
|
|
20
|
+
*/
|
|
21
|
+
set(key: string, entry: TokenCacheEntry): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Delete a specific token entry.
|
|
24
|
+
*/
|
|
25
|
+
delete(key: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Clear all cached tokens.
|
|
28
|
+
*/
|
|
29
|
+
clear(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a key exists in cache.
|
|
32
|
+
*/
|
|
33
|
+
has(key: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Get cache statistics.
|
|
36
|
+
*/
|
|
37
|
+
stats(): Promise<CacheStats>;
|
|
38
|
+
/**
|
|
39
|
+
* Close any connections (for Redis).
|
|
40
|
+
*/
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export interface CacheStats {
|
|
44
|
+
hits: number;
|
|
45
|
+
misses: number;
|
|
46
|
+
size: number;
|
|
47
|
+
type: "memory" | "redis";
|
|
48
|
+
}
|
|
49
|
+
export interface MemoryCacheOptions {
|
|
50
|
+
maxSize?: number;
|
|
51
|
+
cleanupInterval?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface RedisCacheOptions {
|
|
54
|
+
url: string;
|
|
55
|
+
prefix?: string;
|
|
56
|
+
connectTimeout?: number;
|
|
57
|
+
}
|
|
58
|
+
export type CacheOptions = {
|
|
59
|
+
type: "memory";
|
|
60
|
+
options?: MemoryCacheOptions;
|
|
61
|
+
} | {
|
|
62
|
+
type: "redis";
|
|
63
|
+
options: RedisCacheOptions;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/proxy/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,YAAY,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAElD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE7B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy Handler - Core Logic
|
|
3
|
+
*
|
|
4
|
+
* Extracted proxy logic that can be used in:
|
|
5
|
+
* - Split mode: Standalone proxy server (proxy/main.ts)
|
|
6
|
+
* - Combined mode: Request interceptor in renderer process
|
|
7
|
+
*
|
|
8
|
+
* Handles:
|
|
9
|
+
* - Domain parsing (subdomain to project slug)
|
|
10
|
+
* - OAuth token management
|
|
11
|
+
* - Local project detection
|
|
12
|
+
* - User auth token extraction from cookies
|
|
13
|
+
*/
|
|
14
|
+
import * as dntShim from "../_dnt.shims.js";
|
|
15
|
+
import { type ParsedDomain } from "../src/server/utils/domain-parser.js";
|
|
16
|
+
import type { TokenCache } from "./cache/types.js";
|
|
17
|
+
export interface ProxyConfig {
|
|
18
|
+
apiBaseUrl: string;
|
|
19
|
+
clientId: string;
|
|
20
|
+
clientSecret: string;
|
|
21
|
+
previewClientId: string;
|
|
22
|
+
previewClientSecret: string;
|
|
23
|
+
apiToken?: string;
|
|
24
|
+
localProjects?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export interface ProxyContext {
|
|
27
|
+
token?: string;
|
|
28
|
+
projectSlug?: string;
|
|
29
|
+
projectId?: string;
|
|
30
|
+
releaseId?: string;
|
|
31
|
+
branchId?: string;
|
|
32
|
+
branchName?: string;
|
|
33
|
+
environment: "preview" | "production";
|
|
34
|
+
contentSourceId: string;
|
|
35
|
+
localPath?: string;
|
|
36
|
+
host: string;
|
|
37
|
+
parsedDomain: ParsedDomain;
|
|
38
|
+
isLocalProject: boolean;
|
|
39
|
+
/** Error if request cannot be processed (e.g., custom domain not found) */
|
|
40
|
+
error?: {
|
|
41
|
+
status: number;
|
|
42
|
+
message: string;
|
|
43
|
+
redirectUrl?: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export interface ProxyLogger {
|
|
47
|
+
debug: (msg: string, extra?: Record<string, unknown>) => void;
|
|
48
|
+
info: (msg: string, extra?: Record<string, unknown>) => void;
|
|
49
|
+
warn: (msg: string, extra?: Record<string, unknown>) => void;
|
|
50
|
+
error: (msg: string, error?: Error, extra?: Record<string, unknown>) => void;
|
|
51
|
+
}
|
|
52
|
+
export interface ProxyHandlerOptions {
|
|
53
|
+
config: ProxyConfig;
|
|
54
|
+
cache?: TokenCache;
|
|
55
|
+
logger?: ProxyLogger;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a proxy handler that processes requests and returns context.
|
|
59
|
+
*
|
|
60
|
+
* This is the core proxy logic, usable in both split and combined modes.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createProxyHandler(options: ProxyHandlerOptions): {
|
|
63
|
+
processRequest: (req: dntShim.Request) => Promise<ProxyContext>;
|
|
64
|
+
getTokenForApi: (req: dntShim.Request) => Promise<string | undefined>;
|
|
65
|
+
getStats: () => Promise<{
|
|
66
|
+
hits: number;
|
|
67
|
+
misses: number;
|
|
68
|
+
size: number;
|
|
69
|
+
type: string;
|
|
70
|
+
}>;
|
|
71
|
+
close: () => Promise<void>;
|
|
72
|
+
validateConfig: () => string[];
|
|
73
|
+
localProjects: Record<string, string>;
|
|
74
|
+
};
|
|
75
|
+
export type ProxyHandler = ReturnType<typeof createProxyHandler>;
|
|
76
|
+
/**
|
|
77
|
+
* Inject proxy context into request headers for the renderer.
|
|
78
|
+
* Used by both split mode (proxy/main.ts) and combined mode (scripts/server.ts).
|
|
79
|
+
*/
|
|
80
|
+
export declare function injectContextHeaders(req: dntShim.Request, ctx: ProxyContext): dntShim.Request;
|
|
81
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,sCAAsC,CAAC;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA0FnD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAiBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BAkF1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA8PvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAzQrD,MAAM,EAAE;;EAmUpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAsB7F"}
|