veryfront 0.1.815 → 0.1.818
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/esm/deno.js +1 -1
- package/esm/src/html/hydration-script-builder/templates/router.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/templates/router.js +32 -5
- package/esm/src/platform/adapters/base.d.ts +2 -0
- package/esm/src/platform/adapters/base.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/cache/file-cache.d.ts +1 -0
- package/esm/src/platform/adapters/fs/cache/file-cache.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/cache/file-cache.js +10 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +37 -0
- package/esm/src/platform/adapters/fs/veryfront/types.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/types.d.ts.map +1 -1
- package/esm/src/proxy/handler.d.ts +2 -0
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +225 -31
- package/esm/src/proxy/main.js +1 -1
- package/esm/src/proxy/proxy-token-resolution.d.ts +1 -0
- package/esm/src/proxy/proxy-token-resolution.d.ts.map +1 -1
- package/esm/src/proxy/proxy-token-resolution.js +7 -1
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +28 -1
- package/esm/src/rendering/page-rendering.d.ts +10 -0
- package/esm/src/rendering/page-rendering.d.ts.map +1 -1
- package/esm/src/rendering/page-rendering.js +64 -2
- package/esm/src/security/http/response/cache-handler.d.ts.map +1 -1
- package/esm/src/security/http/response/cache-handler.js +3 -0
- package/esm/src/security/http/response/types.d.ts +1 -0
- package/esm/src/security/http/response/types.d.ts.map +1 -1
- package/esm/src/server/handlers/request/module/page-data-endpoint-handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/module/page-data-endpoint-handler.js +96 -15
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/cache/index.js +35 -0
- package/esm/src/transforms/mdx/esm-module-loader/index.d.ts +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/index.js +1 -1
- package/esm/src/utils/memory/profiler.d.ts +22 -0
- package/esm/src/utils/memory/profiler.d.ts.map +1 -1
- package/esm/src/utils/memory/profiler.js +48 -3
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cAmvB3B,CAAC"}
|
|
@@ -33,6 +33,7 @@ export const getRouterScript = () => `
|
|
|
33
33
|
const MAX_RETRIES = 2;
|
|
34
34
|
const MAX_CACHE_SIZE = 50;
|
|
35
35
|
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
36
|
+
const BACKGROUND_REFRESH_INTERVAL_MS = 30 * 1000;
|
|
36
37
|
const PREFETCH_DELAY_MS = 100;
|
|
37
38
|
const MAX_PREFETCH_PATHS = 100;
|
|
38
39
|
|
|
@@ -126,6 +127,8 @@ export const getRouterScript = () => `
|
|
|
126
127
|
// LRU Cache with TTL (single Map to prevent sync issues)
|
|
127
128
|
// ============================================
|
|
128
129
|
const pageDataCache = new Map();
|
|
130
|
+
const pendingPageDataFetches = new Map();
|
|
131
|
+
const backgroundRefreshTimestamps = new Map();
|
|
129
132
|
|
|
130
133
|
function getCachedPageData(path) {
|
|
131
134
|
const entry = pageDataCache.get(path);
|
|
@@ -134,13 +137,17 @@ export const getRouterScript = () => `
|
|
|
134
137
|
if (Date.now() - entry.timestamp < CACHE_TTL_MS) return entry.data;
|
|
135
138
|
|
|
136
139
|
pageDataCache.delete(path);
|
|
140
|
+
backgroundRefreshTimestamps.delete(path);
|
|
137
141
|
return null;
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
function setCachedPageData(path, data) {
|
|
141
145
|
if (pageDataCache.size >= MAX_CACHE_SIZE) {
|
|
142
146
|
const oldest = pageDataCache.keys().next().value;
|
|
143
|
-
if (oldest)
|
|
147
|
+
if (oldest) {
|
|
148
|
+
pageDataCache.delete(oldest);
|
|
149
|
+
backgroundRefreshTimestamps.delete(oldest);
|
|
150
|
+
}
|
|
144
151
|
}
|
|
145
152
|
|
|
146
153
|
pageDataCache.set(path, { data, timestamp: Date.now() });
|
|
@@ -291,13 +298,33 @@ export const getRouterScript = () => `
|
|
|
291
298
|
return data;
|
|
292
299
|
}
|
|
293
300
|
|
|
301
|
+
function fetchPageDataDeduped(path) {
|
|
302
|
+
const pending = pendingPageDataFetches.get(path);
|
|
303
|
+
if (pending) return pending;
|
|
304
|
+
|
|
305
|
+
const refreshPromise = fetchPageDataFresh(path, null).finally(() => {
|
|
306
|
+
pendingPageDataFetches.delete(path);
|
|
307
|
+
});
|
|
308
|
+
pendingPageDataFetches.set(path, refreshPromise);
|
|
309
|
+
return refreshPromise;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function refreshPageDataInBackground(path) {
|
|
313
|
+
const lastRefreshAt = backgroundRefreshTimestamps.get(path) || 0;
|
|
314
|
+
const now = Date.now();
|
|
315
|
+
if (now - lastRefreshAt < BACKGROUND_REFRESH_INTERVAL_MS) return;
|
|
316
|
+
|
|
317
|
+
backgroundRefreshTimestamps.set(path, now);
|
|
318
|
+
fetchPageDataDeduped(path).catch((error) => {
|
|
319
|
+
logBackgroundFetchFailure('Stale page data refresh', path, error);
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
294
323
|
async function fetchPageDataForNavigation(path, signal) {
|
|
295
324
|
const cached = getCachedPageData(path);
|
|
296
325
|
if (cached) {
|
|
297
326
|
log('Using cached page data:', path);
|
|
298
|
-
|
|
299
|
-
logBackgroundFetchFailure('Stale page data refresh', path, error);
|
|
300
|
-
});
|
|
327
|
+
refreshPageDataInBackground(path);
|
|
301
328
|
return cached;
|
|
302
329
|
}
|
|
303
330
|
|
|
@@ -306,7 +333,7 @@ export const getRouterScript = () => `
|
|
|
306
333
|
|
|
307
334
|
async function fetchPageDataForPrefetch(path) {
|
|
308
335
|
if (getCachedPageData(path)) return;
|
|
309
|
-
return
|
|
336
|
+
return fetchPageDataDeduped(path)
|
|
310
337
|
.then((data) => preloadModulesForPageData(data, path))
|
|
311
338
|
.catch((error) => {
|
|
312
339
|
logBackgroundFetchFailure('Page data prefetch', path, error);
|
|
@@ -117,6 +117,8 @@ export interface FileSystemAdapter {
|
|
|
117
117
|
watch(paths: string | string[], options?: WatchOptions): FileWatcher;
|
|
118
118
|
/** Resolve a file path with extension fallback (e.g., pages/test → pages/test.mdx) */
|
|
119
119
|
resolveFile?(basePath: string, options?: ResolveFileOptions): Promise<string | null>;
|
|
120
|
+
/** Refresh remote source snapshots when a preview render detects stale cached content. */
|
|
121
|
+
refreshSourceSnapshot?(reason?: string): Promise<void>;
|
|
120
122
|
}
|
|
121
123
|
export interface ResolveFileOptions {
|
|
122
124
|
allowPagesPrefix?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/adapters/base.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/adapters/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,7 @@ export declare class FileCache {
|
|
|
60
60
|
private setToFallback;
|
|
61
61
|
has(key: string): boolean;
|
|
62
62
|
delete(key: string): boolean;
|
|
63
|
+
deleteAsync(key: string): Promise<boolean>;
|
|
63
64
|
deleteByPrefix(prefix: string): number;
|
|
64
65
|
deleteByPrefixAsync(prefix: string): Promise<number>;
|
|
65
66
|
deleteByPrefixAndSuffix(prefix: string, suffix: string): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkC3E;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,OAAO,GAAE,gBAAqB;IAc1C,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IA4BlC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAmChD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBnC;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,mEAAmE;IACnE,OAAO,CAAC,aAAa;IAWrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAezB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAqBtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAsB/D,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB7E,KAAK,IAAI,IAAI;IAOb,KAAK,IAAI,UAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAazC,YAAY,IAAI,MAAM;IAetB,OAAO,CAAC,qBAAqB;CAoB9B"}
|
|
1
|
+
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/cache/file-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkC3E;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEP,OAAO,GAAE,gBAAqB;IAc1C,OAAO,CAAC,UAAU;IAKlB;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IA4BlC;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAmChD;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBnC;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,mEAAmE;IACnE,OAAO,CAAC,aAAa;IAWrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAezB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM5B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAqBtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAsB/D,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB7E,KAAK,IAAI,IAAI;IAOb,KAAK,IAAI,UAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAazC,YAAY,IAAI,MAAM;IAetB,OAAO,CAAC,qBAAqB;CAoB9B"}
|
|
@@ -242,6 +242,16 @@ export class FileCache {
|
|
|
242
242
|
this.fallbackMemoryUsed -= entry.size;
|
|
243
243
|
return this.fallbackCache.delete(key);
|
|
244
244
|
}
|
|
245
|
+
deleteAsync(key) {
|
|
246
|
+
return withSpan("platform.fs.cache.deleteAsync", async () => {
|
|
247
|
+
const deletedFromFallback = this.delete(key);
|
|
248
|
+
const backend = this.getBackend();
|
|
249
|
+
if (backend) {
|
|
250
|
+
await backend.del(key);
|
|
251
|
+
}
|
|
252
|
+
return deletedFromFallback;
|
|
253
|
+
}, { "cache.key": key });
|
|
254
|
+
}
|
|
245
255
|
deleteByPrefix(prefix) {
|
|
246
256
|
let count = 0;
|
|
247
257
|
for (const key of this.fallbackCache.keys()) {
|
|
@@ -39,6 +39,7 @@ export declare class VeryfrontFSAdapter implements FSAdapter {
|
|
|
39
39
|
private isPersistentCacheInvalidated;
|
|
40
40
|
private shouldBackgroundPregenerateStyles;
|
|
41
41
|
private scheduleFileListWarmup;
|
|
42
|
+
refreshSourceSnapshot(reason?: string): Promise<void>;
|
|
42
43
|
getPokeMetrics(): {
|
|
43
44
|
received: number;
|
|
44
45
|
invalidationsTriggered: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EACd,SAAS,EACT,eAAe,EAEf,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAoDnE,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B,kFAAkF;IAClF,OAAO,CAAC,oBAAoB,CAA6B;IACzD,0EAA0E;IAC1E,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,OAAO,CAAC,WAAW,CAAC,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAmB;IAEpC,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAAuB;IAE5C,+CAA+C;IAC/C,OAAO,CAAC,aAAa,CAAgB;IACrC,iGAAiG;IACjG,OAAO,CAAC,cAAc,CAAuC;IAC7D,mFAAmF;IACnF,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,qBAAqB;YAMf,sBAAsB;gBA4BxB,MAAM,EAAE,eAAe;IAmI7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyJjC,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,iCAAiC;IAOzC,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -377,6 +377,43 @@ export class VeryfrontFSAdapter {
|
|
|
377
377
|
this.fileListWarmupKey = effectiveCacheKey;
|
|
378
378
|
this.readOps.setFileListReadyPromise(warmupPromise);
|
|
379
379
|
}
|
|
380
|
+
async refreshSourceSnapshot(reason = "manual-refresh") {
|
|
381
|
+
await this.ensureInitialized();
|
|
382
|
+
if (!this.contentContext) {
|
|
383
|
+
logger.debug("Skipping source snapshot refresh without content context", {
|
|
384
|
+
reason,
|
|
385
|
+
projectSlug: this.projectSlug,
|
|
386
|
+
});
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const cacheKey = buildFileListCacheKey(this.contentContext);
|
|
390
|
+
const refreshContext = this.contentContext;
|
|
391
|
+
this.fileListWarmupPromise = null;
|
|
392
|
+
this.fileListWarmupKey = null;
|
|
393
|
+
this.readOps.clearFileListIndex();
|
|
394
|
+
this.statOps.clearIndex();
|
|
395
|
+
this.dirOps.clearTree();
|
|
396
|
+
await this.cache.deleteAsync(cacheKey);
|
|
397
|
+
const files = await fetchFileListForContext(this.client, refreshContext);
|
|
398
|
+
await this.cache.setAsync(cacheKey, files);
|
|
399
|
+
const fileSummary = summarizeFileList(files);
|
|
400
|
+
if (fileSummary.sourceFilesWithContent > 0 && this.shouldBackgroundPregenerateStyles()) {
|
|
401
|
+
this.triggerCSSPregeneration(files).catch(() => {
|
|
402
|
+
// Error already logged in triggerCSSPregeneration
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
logger.info("Refreshed source snapshot", {
|
|
406
|
+
reason,
|
|
407
|
+
cacheKey,
|
|
408
|
+
projectSlug: this.projectSlug,
|
|
409
|
+
sourceType: refreshContext.sourceType,
|
|
410
|
+
branch: refreshContext.branch,
|
|
411
|
+
environmentName: refreshContext.environmentName,
|
|
412
|
+
releaseId: refreshContext.releaseId,
|
|
413
|
+
totalFiles: fileSummary.totalFiles,
|
|
414
|
+
filesWithContent: fileSummary.filesWithContent,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
380
417
|
getPokeMetrics() {
|
|
381
418
|
return this.wsManager.getPokeMetrics();
|
|
382
419
|
}
|
|
@@ -26,6 +26,7 @@ export interface FSAdapter {
|
|
|
26
26
|
initialize?(): Promise<void>;
|
|
27
27
|
shutdown?(): Promise<void>;
|
|
28
28
|
resolveFile?(basePath: string, options?: ResolveFileOptions): Promise<string | null>;
|
|
29
|
+
refreshSourceSnapshot?(reason?: string): Promise<void>;
|
|
29
30
|
}
|
|
30
31
|
export interface ContextualFSAdapter extends FSAdapter {
|
|
31
32
|
setRequestToken?(token: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;IACrD,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;KACpB,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAElF,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ParsedDomain } from "../server/utils/domain-parser.js";
|
|
2
2
|
import type { TokenCache } from "./cache/types.js";
|
|
3
|
+
import { type ProxyServerTiming } from "./server-timing.js";
|
|
3
4
|
export { __resetCachedAuthProviderForTests } from "./proxy-access-control.js";
|
|
4
5
|
export declare const INTERNAL_PROXY_HEADERS: readonly ["x-token", "x-project-slug", "x-environment", "x-environment-id", "x-content-source-id", "x-forwarded-host", "x-project-path", "x-project-id", "x-release-id", "x-branch-id", "x-branch-name"];
|
|
5
6
|
export interface ProxyConfig {
|
|
@@ -45,6 +46,7 @@ export interface ProxyHandlerOptions {
|
|
|
45
46
|
}
|
|
46
47
|
export interface ProxyRequestOptions {
|
|
47
48
|
url?: URL;
|
|
49
|
+
timing?: ProxyServerTiming;
|
|
48
50
|
}
|
|
49
51
|
export declare function createProxyHandler(options: ProxyHandlerOptions): {
|
|
50
52
|
processRequest: (req: Request, options?: ProxyRequestOptions) => Promise<ProxyContext>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAenD,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAE9E,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"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"}
|
package/esm/src/proxy/handler.js
CHANGED
|
@@ -2,10 +2,12 @@ import { TokenManager } from "./token-manager.js";
|
|
|
2
2
|
import { parseProjectDomain } from "../server/utils/domain-parser.js";
|
|
3
3
|
import { injectContext, ProxySpanNames, withSpan } from "./tracing.js";
|
|
4
4
|
import { computeContentSourceId } from "../cache/keys.js";
|
|
5
|
+
import { getEnv } from "../platform/compat/process.js";
|
|
5
6
|
import { checkProtectedProxyAccess } from "./proxy-access-control.js";
|
|
6
7
|
import { createLocalProjectResolver } from "./local-project-resolver.js";
|
|
7
8
|
import { isMissingCustomDomainProjectError, resolveProxyRequestToken, } from "./proxy-token-resolution.js";
|
|
8
9
|
import { createProjectNotFoundProxyContext, createProxyErrorContext, createReleaseNotFoundProxyContext, } from "./proxy-error-context.js";
|
|
10
|
+
import { profileProxyServerTimingPhase } from "./server-timing.js";
|
|
9
11
|
export { __resetCachedAuthProviderForTests } from "./proxy-access-control.js";
|
|
10
12
|
export const INTERNAL_PROXY_HEADERS = [
|
|
11
13
|
"x-token",
|
|
@@ -41,6 +43,18 @@ function isSignedInternalControlPlaneRequest(req, url) {
|
|
|
41
43
|
}
|
|
42
44
|
return !!req.headers.get("x-token");
|
|
43
45
|
}
|
|
46
|
+
const DEFAULT_PROXY_ROUTING_CACHE_TTL_MS = 60_000;
|
|
47
|
+
const DEFAULT_PROXY_ROUTING_CACHE_MAX_ENTRIES = 1_000;
|
|
48
|
+
function readNonNegativeIntegerEnv(name, fallback) {
|
|
49
|
+
const raw = getEnv(name);
|
|
50
|
+
if (!raw)
|
|
51
|
+
return fallback;
|
|
52
|
+
const value = Number(raw);
|
|
53
|
+
return Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;
|
|
54
|
+
}
|
|
55
|
+
function normalizeProjectLookupKey(lookupKey) {
|
|
56
|
+
return lookupKey.trim().replace(/:\d+$/, "").toLowerCase();
|
|
57
|
+
}
|
|
44
58
|
async function lookupProjectByDomain(domain, apiBaseUrl, token, logger) {
|
|
45
59
|
return withSpan(ProxySpanNames.PROXY_DOMAIN_LOOKUP, async () => {
|
|
46
60
|
const domainWithoutPort = domain.replace(/:\d+$/, "");
|
|
@@ -84,6 +98,93 @@ async function lookupProjectByDomain(domain, apiBaseUrl, token, logger) {
|
|
|
84
98
|
}
|
|
85
99
|
}, { "proxy.domain": domain });
|
|
86
100
|
}
|
|
101
|
+
async function lookupProjectRoutingMetadata(lookupKey, apiBaseUrl, token, logger) {
|
|
102
|
+
return withSpan(ProxySpanNames.PROXY_DOMAIN_LOOKUP, async () => {
|
|
103
|
+
const normalizedLookupKey = normalizeProjectLookupKey(lookupKey);
|
|
104
|
+
const url = `${apiBaseUrl}/projects/-/proxy-routing/${encodeURIComponent(normalizedLookupKey)}`;
|
|
105
|
+
const urlObj = new URL(url);
|
|
106
|
+
logger?.debug("Looking up project proxy routing metadata", { lookupKey, url });
|
|
107
|
+
const headers = new Headers({
|
|
108
|
+
Authorization: `Bearer ${token}`,
|
|
109
|
+
Accept: "application/json",
|
|
110
|
+
});
|
|
111
|
+
injectContext(headers);
|
|
112
|
+
try {
|
|
113
|
+
const response = await withSpan(ProxySpanNames.HTTP_CLIENT_FETCH, () => fetch(url, { headers }), {
|
|
114
|
+
"http.method": "GET",
|
|
115
|
+
"http.url": url,
|
|
116
|
+
"http.host": urlObj.host,
|
|
117
|
+
"proxy.routing_lookup": normalizedLookupKey,
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
await response.body?.cancel();
|
|
121
|
+
if (response.status !== 404) {
|
|
122
|
+
logger?.error("Proxy routing metadata API error", undefined, {
|
|
123
|
+
lookupKey,
|
|
124
|
+
status: response.status,
|
|
125
|
+
statusText: response.statusText,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const result = (await response.json());
|
|
131
|
+
logger?.debug("Proxy routing metadata lookup successful", {
|
|
132
|
+
lookupKey,
|
|
133
|
+
projectSlug: result.slug,
|
|
134
|
+
environments: result.environments?.map((e) => e.name),
|
|
135
|
+
});
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
logger?.error("Proxy routing metadata lookup failed", error, { lookupKey });
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}, { "proxy.lookup_key": lookupKey });
|
|
143
|
+
}
|
|
144
|
+
async function lookupProjectAccessMetadata(lookupKey, apiBaseUrl, token, includeUsers, logger) {
|
|
145
|
+
return withSpan(ProxySpanNames.PROXY_DOMAIN_LOOKUP, async () => {
|
|
146
|
+
const normalizedLookupKey = normalizeProjectLookupKey(lookupKey);
|
|
147
|
+
const url = `${apiBaseUrl}/projects/-/proxy-access/${encodeURIComponent(normalizedLookupKey)}?include_users=${includeUsers ? "true" : "false"}`;
|
|
148
|
+
const urlObj = new URL(url);
|
|
149
|
+
logger?.debug("Looking up project proxy access metadata", { lookupKey, includeUsers, url });
|
|
150
|
+
const headers = new Headers({
|
|
151
|
+
Authorization: `Bearer ${token}`,
|
|
152
|
+
Accept: "application/json",
|
|
153
|
+
});
|
|
154
|
+
injectContext(headers);
|
|
155
|
+
try {
|
|
156
|
+
const response = await withSpan(ProxySpanNames.HTTP_CLIENT_FETCH, () => fetch(url, { headers }), {
|
|
157
|
+
"http.method": "GET",
|
|
158
|
+
"http.url": url,
|
|
159
|
+
"http.host": urlObj.host,
|
|
160
|
+
"proxy.access_lookup": normalizedLookupKey,
|
|
161
|
+
});
|
|
162
|
+
if (!response.ok) {
|
|
163
|
+
await response.body?.cancel();
|
|
164
|
+
if (response.status !== 404) {
|
|
165
|
+
logger?.error("Proxy access metadata API error", undefined, {
|
|
166
|
+
lookupKey,
|
|
167
|
+
status: response.status,
|
|
168
|
+
statusText: response.statusText,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const result = (await response.json());
|
|
174
|
+
logger?.debug("Proxy access metadata lookup successful", {
|
|
175
|
+
lookupKey,
|
|
176
|
+
projectSlug: result.slug,
|
|
177
|
+
environments: result.environments?.map((e) => e.name),
|
|
178
|
+
userCount: result.users?.length ?? 0,
|
|
179
|
+
});
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
logger?.error("Proxy access metadata lookup failed", error, { lookupKey });
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}, { "proxy.lookup_key": lookupKey });
|
|
187
|
+
}
|
|
87
188
|
function getRequestHost(req, url) {
|
|
88
189
|
return req.headers.get("host") ?? url.host;
|
|
89
190
|
}
|
|
@@ -106,6 +207,76 @@ export function createProxyHandler(options) {
|
|
|
106
207
|
previewApiClientId: config.previewApiClientId,
|
|
107
208
|
previewApiClientSecret: config.previewApiClientSecret,
|
|
108
209
|
}, { cache });
|
|
210
|
+
const routingCacheTtlMs = readNonNegativeIntegerEnv("VERYFRONT_PROXY_ROUTING_CACHE_TTL_MS", DEFAULT_PROXY_ROUTING_CACHE_TTL_MS);
|
|
211
|
+
const routingCacheMaxEntries = readNonNegativeIntegerEnv("VERYFRONT_PROXY_ROUTING_CACHE_MAX_ENTRIES", DEFAULT_PROXY_ROUTING_CACHE_MAX_ENTRIES);
|
|
212
|
+
const routingLookupCache = new Map();
|
|
213
|
+
const routingLookupInflight = new Map();
|
|
214
|
+
async function resolveProjectLookup(lookupKey, token, timing) {
|
|
215
|
+
return await profileProxyServerTimingPhase(timing ?? { enabled: false, startedAt: 0, phases: new Map() }, "proxy.project_lookup", () => lookupProjectByDomain(lookupKey, config.apiBaseUrl, token, logger));
|
|
216
|
+
}
|
|
217
|
+
function getCachedRoutingLookup(cacheKey) {
|
|
218
|
+
if (routingCacheTtlMs <= 0 || routingCacheMaxEntries <= 0) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const cached = routingLookupCache.get(cacheKey);
|
|
222
|
+
if (!cached) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
if (cached.expiresAt <= Date.now()) {
|
|
226
|
+
routingLookupCache.delete(cacheKey);
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
routingLookupCache.delete(cacheKey);
|
|
230
|
+
routingLookupCache.set(cacheKey, cached);
|
|
231
|
+
return cached.value;
|
|
232
|
+
}
|
|
233
|
+
function setCachedRoutingLookup(cacheKey, value) {
|
|
234
|
+
if (routingCacheTtlMs <= 0 || routingCacheMaxEntries <= 0) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (!routingLookupCache.has(cacheKey)) {
|
|
238
|
+
while (routingLookupCache.size >= routingCacheMaxEntries) {
|
|
239
|
+
const oldestKey = routingLookupCache.keys().next().value;
|
|
240
|
+
if (!oldestKey)
|
|
241
|
+
break;
|
|
242
|
+
routingLookupCache.delete(oldestKey);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
routingLookupCache.set(cacheKey, {
|
|
246
|
+
value,
|
|
247
|
+
expiresAt: Date.now() + routingCacheTtlMs,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
async function resolveProjectRoutingLookup(lookupKey, token, timing) {
|
|
251
|
+
const cacheKey = normalizeProjectLookupKey(lookupKey);
|
|
252
|
+
return await profileProxyServerTimingPhase(timing ?? { enabled: false, startedAt: 0, phases: new Map() }, "proxy.routing_lookup", async () => {
|
|
253
|
+
const cached = getCachedRoutingLookup(cacheKey);
|
|
254
|
+
if (cached) {
|
|
255
|
+
logger?.debug("Proxy routing metadata cache hit", { lookupKey });
|
|
256
|
+
return cached;
|
|
257
|
+
}
|
|
258
|
+
const existingLookup = routingLookupInflight.get(cacheKey);
|
|
259
|
+
if (existingLookup) {
|
|
260
|
+
logger?.debug("Proxy routing metadata lookup joined in-flight request", { lookupKey });
|
|
261
|
+
return await existingLookup;
|
|
262
|
+
}
|
|
263
|
+
const lookupPromise = lookupProjectRoutingMetadata(lookupKey, config.apiBaseUrl, token, logger)
|
|
264
|
+
.then((result) => {
|
|
265
|
+
if (result) {
|
|
266
|
+
setCachedRoutingLookup(cacheKey, result);
|
|
267
|
+
}
|
|
268
|
+
return result;
|
|
269
|
+
})
|
|
270
|
+
.finally(() => {
|
|
271
|
+
routingLookupInflight.delete(cacheKey);
|
|
272
|
+
});
|
|
273
|
+
routingLookupInflight.set(cacheKey, lookupPromise);
|
|
274
|
+
return await lookupPromise;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
async function resolveProjectAccessLookup(lookupKey, token, includeUsers, timing) {
|
|
278
|
+
return await profileProxyServerTimingPhase(timing ?? { enabled: false, startedAt: 0, phases: new Map() }, "proxy.access_lookup", () => lookupProjectAccessMetadata(lookupKey, config.apiBaseUrl, token, includeUsers, logger));
|
|
279
|
+
}
|
|
109
280
|
function validateConfig() {
|
|
110
281
|
const missing = [];
|
|
111
282
|
if (!config.apiClientId)
|
|
@@ -114,8 +285,8 @@ export function createProxyHandler(options) {
|
|
|
114
285
|
missing.push("VERYFRONT_PROXY_API_CLIENT_SECRET");
|
|
115
286
|
return missing;
|
|
116
287
|
}
|
|
117
|
-
async function
|
|
118
|
-
const lookupResult = await
|
|
288
|
+
async function resolveFullProjectLookupAndProtection(req, url, token, userToken, lookupKey, envMatcher, timing, logContext) {
|
|
289
|
+
const lookupResult = await resolveProjectLookup(lookupKey, token, timing);
|
|
119
290
|
if (!lookupResult)
|
|
120
291
|
return { projectId: undefined, releaseId: undefined };
|
|
121
292
|
const matchingEnv = lookupResult.environments?.find(envMatcher);
|
|
@@ -134,10 +305,45 @@ export function createProxyHandler(options) {
|
|
|
134
305
|
return { error: protectionError };
|
|
135
306
|
return {
|
|
136
307
|
projectId: lookupResult.id,
|
|
308
|
+
projectSlug: lookupResult.slug,
|
|
137
309
|
releaseId: matchingEnv?.active_release_id ?? undefined,
|
|
138
310
|
environmentId: matchingEnv?.id,
|
|
139
311
|
};
|
|
140
312
|
}
|
|
313
|
+
async function resolveProjectMetadataAndProtection(req, url, token, userToken, lookupKey, envMatcher, timing, logContext) {
|
|
314
|
+
return await profileProxyServerTimingPhase(timing ?? { enabled: false, startedAt: 0, phases: new Map() }, "proxy.project_lookup", async () => {
|
|
315
|
+
const routingResult = await resolveProjectRoutingLookup(lookupKey, token, timing);
|
|
316
|
+
if (!routingResult) {
|
|
317
|
+
return await resolveFullProjectLookupAndProtection(req, url, token, userToken, lookupKey, envMatcher, undefined, logContext);
|
|
318
|
+
}
|
|
319
|
+
const accessResult = await resolveProjectAccessLookup(lookupKey, token, !!userToken, timing);
|
|
320
|
+
if (!accessResult || accessResult.id !== routingResult.id) {
|
|
321
|
+
routingLookupCache.delete(normalizeProjectLookupKey(lookupKey));
|
|
322
|
+
return await resolveFullProjectLookupAndProtection(req, url, token, userToken, lookupKey, envMatcher, undefined, logContext);
|
|
323
|
+
}
|
|
324
|
+
const routingEnv = routingResult.environments?.find(envMatcher);
|
|
325
|
+
const accessEnv = accessResult.environments?.find(envMatcher);
|
|
326
|
+
const protectionError = await checkProtectedProxyAccess({
|
|
327
|
+
req,
|
|
328
|
+
url,
|
|
329
|
+
matchingEnv: accessEnv,
|
|
330
|
+
userToken,
|
|
331
|
+
users: accessResult.users,
|
|
332
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
333
|
+
logger,
|
|
334
|
+
logContext,
|
|
335
|
+
isSignedInternalControlPlaneRequest: isSignedInternalControlPlaneRequest(req, url),
|
|
336
|
+
});
|
|
337
|
+
if (protectionError)
|
|
338
|
+
return { error: protectionError };
|
|
339
|
+
return {
|
|
340
|
+
projectId: routingResult.id,
|
|
341
|
+
projectSlug: routingResult.slug,
|
|
342
|
+
releaseId: routingEnv?.active_release_id ?? undefined,
|
|
343
|
+
environmentId: routingEnv?.id,
|
|
344
|
+
};
|
|
345
|
+
});
|
|
346
|
+
}
|
|
141
347
|
async function processRequest(req, options = {}) {
|
|
142
348
|
const url = options.url ?? new URL(req.url);
|
|
143
349
|
const rawHost = getRequestHost(req, url);
|
|
@@ -232,51 +438,39 @@ export function createProxyHandler(options) {
|
|
|
232
438
|
token,
|
|
233
439
|
});
|
|
234
440
|
}
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
441
|
+
const normalizedHost = host.toLowerCase().replace(/:\d+$/, "");
|
|
442
|
+
const resolved = await resolveProjectMetadataAndProtection(req, url, token, userToken, host, (env) => env.domains?.some((d) => d.toLowerCase() === normalizedHost) ?? false, options.timing, { domain: host });
|
|
443
|
+
if ("error" in resolved) {
|
|
238
444
|
return createProxyErrorContext(base, {
|
|
239
|
-
status:
|
|
240
|
-
message:
|
|
445
|
+
status: resolved.error.status,
|
|
446
|
+
message: resolved.error.message,
|
|
241
447
|
token,
|
|
448
|
+
redirectUrl: resolved.error.redirectUrl,
|
|
242
449
|
});
|
|
243
450
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const normalizedHost = host.toLowerCase().replace(/:\d+$/, "");
|
|
247
|
-
const matchingEnv = lookupResult.environments?.find((env) => env.domains?.some((d) => d.toLowerCase() === normalizedHost));
|
|
248
|
-
releaseId = matchingEnv?.active_release_id ?? undefined;
|
|
249
|
-
environmentId = matchingEnv?.id;
|
|
250
|
-
const protectionError = await checkProtectedProxyAccess({
|
|
251
|
-
req,
|
|
252
|
-
url,
|
|
253
|
-
matchingEnv,
|
|
254
|
-
userToken,
|
|
255
|
-
users: lookupResult.users,
|
|
256
|
-
apiBaseUrl: config.apiBaseUrl,
|
|
257
|
-
logger,
|
|
258
|
-
logContext: { domain: host },
|
|
259
|
-
isSignedInternalControlPlaneRequest: isSignedInternalControlPlaneRequest(req, url),
|
|
260
|
-
});
|
|
261
|
-
if (protectionError) {
|
|
451
|
+
if (!resolved.projectId || !resolved.projectSlug) {
|
|
452
|
+
logger?.info("Custom domain not found", { domain: host });
|
|
262
453
|
return createProxyErrorContext(base, {
|
|
263
|
-
status:
|
|
264
|
-
message:
|
|
454
|
+
status: 404,
|
|
455
|
+
message: `No project configured for domain: ${host}`,
|
|
265
456
|
token,
|
|
266
|
-
redirectUrl: protectionError.redirectUrl,
|
|
267
457
|
});
|
|
268
458
|
}
|
|
459
|
+
projectSlug = resolved.projectSlug;
|
|
460
|
+
projectId = resolved.projectId;
|
|
461
|
+
releaseId = resolved.releaseId;
|
|
462
|
+
environmentId = resolved.environmentId;
|
|
269
463
|
logger?.info("Resolved custom domain to project", {
|
|
270
464
|
domain: host,
|
|
271
465
|
projectSlug,
|
|
272
466
|
projectId,
|
|
273
467
|
releaseId,
|
|
274
|
-
|
|
468
|
+
environmentId,
|
|
275
469
|
});
|
|
276
470
|
}
|
|
277
471
|
else if (projectSlug && scope === "production" && token && parsedDomain.environment) {
|
|
278
472
|
const targetEnv = parsedDomain.environment.toLowerCase();
|
|
279
|
-
const resolved = await
|
|
473
|
+
const resolved = await resolveProjectMetadataAndProtection(req, url, token, userToken, projectSlug, (env) => env.name.toLowerCase() === targetEnv, options.timing, { projectSlug });
|
|
280
474
|
if ("error" in resolved) {
|
|
281
475
|
return createProxyErrorContext(base, {
|
|
282
476
|
status: resolved.error.status,
|
|
@@ -308,7 +502,7 @@ export function createProxyHandler(options) {
|
|
|
308
502
|
else if (projectSlug && scope === "preview" && token) {
|
|
309
503
|
// Preview uses branch-based content (no releaseId needed), but must
|
|
310
504
|
// still enforce the environment's `protected` flag like other scopes.
|
|
311
|
-
const resolved = await
|
|
505
|
+
const resolved = await resolveProjectMetadataAndProtection(req, url, token, userToken, projectSlug, (env) => env.name.toLowerCase() === "preview", options.timing, { projectSlug });
|
|
312
506
|
if ("error" in resolved) {
|
|
313
507
|
return createProxyErrorContext(base, {
|
|
314
508
|
status: resolved.error.status,
|