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/src/proxy/main.js
CHANGED
|
@@ -238,7 +238,7 @@ function forwardToServer(req, url) {
|
|
|
238
238
|
const host = req.headers.get("host") || "";
|
|
239
239
|
const execute = async (lifecycle) => {
|
|
240
240
|
try {
|
|
241
|
-
const ctx = await profileProxyServerTimingPhase(proxyTiming, "proxy.resolve_request", () => proxyHandler.processRequest(req, { url }));
|
|
241
|
+
const ctx = await profileProxyServerTimingPhase(proxyTiming, "proxy.resolve_request", () => proxyHandler.processRequest(req, { url, timing: proxyTiming }));
|
|
242
242
|
return runWithProxyRequestContext({
|
|
243
243
|
requestId,
|
|
244
244
|
projectSlug: ctx.projectSlug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-token-resolution.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/proxy-token-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,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,+BAA+B;IAC9C,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,0BAA0B,CAAC;IACnC,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAC/C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzE;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"proxy-token-resolution.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/proxy-token-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,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,+BAA+B;IAC9C,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,0BAA0B,CAAC;IACnC,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAC/C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzE;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CA0DpC"}
|
|
@@ -14,9 +14,12 @@ export async function resolveProxyRequestToken(options) {
|
|
|
14
14
|
const useSignedInternalControlPlaneToken = options.allowSignedInternalControlPlaneToken &&
|
|
15
15
|
options.signedInternalControlPlaneRequest;
|
|
16
16
|
let token;
|
|
17
|
+
let tokenSource;
|
|
17
18
|
let tokenFetchError;
|
|
18
19
|
if (useSignedInternalControlPlaneToken) {
|
|
19
20
|
token = req.headers.get("x-token") ?? undefined;
|
|
21
|
+
if (token)
|
|
22
|
+
tokenSource = "signed-internal";
|
|
20
23
|
logger?.debug("Using signed control-plane token for internal request", {
|
|
21
24
|
pathname: url.pathname,
|
|
22
25
|
scope,
|
|
@@ -24,6 +27,7 @@ export async function resolveProxyRequestToken(options) {
|
|
|
24
27
|
}
|
|
25
28
|
else if (scope === "preview" && userToken) {
|
|
26
29
|
token = userToken;
|
|
30
|
+
tokenSource = "user";
|
|
27
31
|
logger?.debug("Using user auth token for preview");
|
|
28
32
|
}
|
|
29
33
|
if (!token && config.apiClientId && config.apiClientSecret) {
|
|
@@ -31,6 +35,7 @@ export async function resolveProxyRequestToken(options) {
|
|
|
31
35
|
if (projectSlug || customDomain) {
|
|
32
36
|
try {
|
|
33
37
|
token = await tokenManager.getToken(scope, projectSlug, customDomain);
|
|
38
|
+
tokenSource = "service";
|
|
34
39
|
}
|
|
35
40
|
catch (error) {
|
|
36
41
|
tokenFetchError = error;
|
|
@@ -45,7 +50,8 @@ export async function resolveProxyRequestToken(options) {
|
|
|
45
50
|
}
|
|
46
51
|
if (!token && config.apiToken) {
|
|
47
52
|
token = config.apiToken;
|
|
53
|
+
tokenSource = "static";
|
|
48
54
|
logger?.debug("Using static API token fallback");
|
|
49
55
|
}
|
|
50
|
-
return { token, userToken, tokenFetchError };
|
|
56
|
+
return { token, tokenSource, userToken, tokenFetchError };
|
|
51
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AA0BD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;YAIJ,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IAiGjC,OAAO,CAAC,uBAAuB;IAkCzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA2Q9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAsFzE,kBAAkB;YA2ClB,cAAc;IAW5B,OAAO,CAAC,uBAAuB;YAYjB,kBAAkB;IA8EhC,OAAO,CAAC,kBAAkB;YAQZ,uBAAuB;IAmBrC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -38,6 +38,7 @@ import { getReadyManifestForRender } from "../../release-assets/manifest-cache.j
|
|
|
38
38
|
import { createEsmCache, createModuleCache, loadModule } from "./module-loader/index.js";
|
|
39
39
|
import { getCSSImports, runWithCSSCollector, } from "../../modules/react-loader/css-import-collector.js";
|
|
40
40
|
import { assembleRenderResult } from "./render-result-assembly.js";
|
|
41
|
+
import { isMdxEsmExportMismatchError, recoverStaleMdxEsmPreviewCaches } from "../page-rendering.js";
|
|
41
42
|
// Extracted modules
|
|
42
43
|
import { EMPTY_LAYOUT_RESULT, isDotPath } from "./path-helpers.js";
|
|
43
44
|
import { cachePageCss, CSS_SSR_TIMEOUT_MS, getCachedPageCss, getPageCssCacheKey, } from "./css-cache.js";
|
|
@@ -251,7 +252,7 @@ export class RenderPipeline {
|
|
|
251
252
|
if (this.config.mode === "development") {
|
|
252
253
|
clearSSRModuleCacheForProject(projectId);
|
|
253
254
|
}
|
|
254
|
-
|
|
255
|
+
const renderOnce = () => withSpan("render.page", async () => {
|
|
255
256
|
const { result } = await runWithCSSCollector(async () => {
|
|
256
257
|
const pageResolveStart = performance.now();
|
|
257
258
|
const pageInfo = await withSpan("render.resolve_page", () => this.config.pageResolver.resolvePage(slug), { "render.slug": slug });
|
|
@@ -374,6 +375,32 @@ export class RenderPipeline {
|
|
|
374
375
|
"render.project_id": options?.projectId || this.config.projectDir,
|
|
375
376
|
"render.mode": this.config.mode,
|
|
376
377
|
});
|
|
378
|
+
try {
|
|
379
|
+
return await renderOnce();
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
if (isMdxEsmExportMismatchError(error)) {
|
|
383
|
+
const recovered = await recoverStaleMdxEsmPreviewCaches({
|
|
384
|
+
adapter: this.config.adapter,
|
|
385
|
+
projectId,
|
|
386
|
+
projectSlug,
|
|
387
|
+
contentSourceId: options?.contentSourceId,
|
|
388
|
+
slug,
|
|
389
|
+
pagePath: slug,
|
|
390
|
+
});
|
|
391
|
+
if (recovered) {
|
|
392
|
+
cacheResult = null;
|
|
393
|
+
renderPipelineLog.warn("Retrying page render after stale MDX ESM cache recovery", {
|
|
394
|
+
slug,
|
|
395
|
+
projectId,
|
|
396
|
+
projectSlug,
|
|
397
|
+
contentSourceId: options?.contentSourceId,
|
|
398
|
+
});
|
|
399
|
+
return await renderOnce();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
throw error;
|
|
403
|
+
}
|
|
377
404
|
}
|
|
378
405
|
/** Resolve page data for SPA client-side navigation without rendering HTML. */
|
|
379
406
|
async resolvePageData(slug, options) {
|
|
@@ -10,6 +10,16 @@ interface PreparedMDXPageBundles {
|
|
|
10
10
|
pageBundle: PageBundle;
|
|
11
11
|
serverModuleCode: string;
|
|
12
12
|
}
|
|
13
|
+
interface StaleMdxEsmRecoveryOptions {
|
|
14
|
+
adapter: RuntimeAdapter;
|
|
15
|
+
projectId?: string;
|
|
16
|
+
projectSlug?: string;
|
|
17
|
+
contentSourceId?: string;
|
|
18
|
+
slug: string;
|
|
19
|
+
pagePath: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function isMdxEsmExportMismatchError(error: unknown): boolean;
|
|
22
|
+
export declare function recoverStaleMdxEsmPreviewCaches(options: StaleMdxEsmRecoveryOptions): Promise<boolean>;
|
|
13
23
|
export declare function prepareMDXPageBundles(pageInfo: EntityInfo, projectDir: string, options?: {
|
|
14
24
|
precompiledModule?: string;
|
|
15
25
|
studioEmbed?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-rendering.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/page-rendering.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,YAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAa,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"page-rendering.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/page-rendering.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,YAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAa,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQrG,UAAU,aAAa;IACrB,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAInE;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAyBlB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,OAAO,CAAC,sBAAsB,CAAC,CA4CjC;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,UAAU,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,aAAa,EAC/B,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,SAAS,CAAC,EACvB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,aAAa,CAAC,CAyHxB"}
|
|
@@ -1,10 +1,38 @@
|
|
|
1
1
|
import { rendererLogger as logger } from "../utils/index.js";
|
|
2
2
|
import { RENDER_ERROR } from "../errors/error-registry.js";
|
|
3
3
|
import { mdxRenderer } from "../transforms/mdx/index.js";
|
|
4
|
+
import { clearMdxEsmCacheNamespace } from "../transforms/mdx/esm-module-loader/index.js";
|
|
4
5
|
import { getProjectReact } from "../react/index.js";
|
|
5
6
|
import { compileContent } from "../transforms/mdx/compiler/index.js";
|
|
6
7
|
import { ensureError, getErrorMessage } from "../errors/veryfront-error.js";
|
|
7
8
|
import { withSpan } from "../observability/tracing/otlp-setup.js";
|
|
9
|
+
export function isMdxEsmExportMismatchError(error) {
|
|
10
|
+
const message = getErrorMessage(error);
|
|
11
|
+
return /does not provide an export named/i.test(message) &&
|
|
12
|
+
/requested module|import/i.test(message);
|
|
13
|
+
}
|
|
14
|
+
export async function recoverStaleMdxEsmPreviewCaches(options) {
|
|
15
|
+
let recovered = false;
|
|
16
|
+
const refreshSourceSnapshot = options.adapter.fs.refreshSourceSnapshot;
|
|
17
|
+
if (typeof refreshSourceSnapshot === "function") {
|
|
18
|
+
await refreshSourceSnapshot.call(options.adapter.fs, "mdx-esm-export-mismatch");
|
|
19
|
+
recovered = true;
|
|
20
|
+
}
|
|
21
|
+
if (options.projectId && options.contentSourceId) {
|
|
22
|
+
await clearMdxEsmCacheNamespace(options.projectId, options.contentSourceId);
|
|
23
|
+
recovered = true;
|
|
24
|
+
}
|
|
25
|
+
if (recovered) {
|
|
26
|
+
logger.warn("Recovered stale MDX ESM preview caches, retrying render", {
|
|
27
|
+
slug: options.slug,
|
|
28
|
+
pagePath: options.pagePath,
|
|
29
|
+
projectId: options.projectId,
|
|
30
|
+
projectSlug: options.projectSlug,
|
|
31
|
+
contentSourceId: options.contentSourceId,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return recovered;
|
|
35
|
+
}
|
|
8
36
|
export async function prepareMDXPageBundles(pageInfo, projectDir, options) {
|
|
9
37
|
const { frontmatter, content, path } = pageInfo.entity;
|
|
10
38
|
const fmArg = frontmatter && Object.keys(frontmatter).length > 0 ? frontmatter : undefined;
|
|
@@ -35,8 +63,8 @@ export function handleMDXPage(pageInfo, slug, projectDir, mergedComponents, _com
|
|
|
35
63
|
precompiledModule: options?.precompiledModule,
|
|
36
64
|
studioEmbed: options?.studioEmbed,
|
|
37
65
|
});
|
|
38
|
-
|
|
39
|
-
|
|
66
|
+
const loadPageElement = async () => {
|
|
67
|
+
let collectedMetadata = {};
|
|
40
68
|
const mod = (await mdxRenderer.loadModuleESM(serverModuleCode, adapter, options?.projectId, projectDir, options?.projectSlug, options?.contentSourceId));
|
|
41
69
|
const MDXComp = mod.MDXContent || mod.default;
|
|
42
70
|
if (!MDXComp) {
|
|
@@ -80,8 +108,42 @@ export function handleMDXPage(pageInfo, slug, projectDir, mergedComponents, _com
|
|
|
80
108
|
const React = await getProjectReact();
|
|
81
109
|
const pageElement = React.createElement(MDXComp, { components: mergedComponents });
|
|
82
110
|
return { pageElement, pageBundle, collectedMetadata };
|
|
111
|
+
};
|
|
112
|
+
try {
|
|
113
|
+
return await loadPageElement();
|
|
83
114
|
}
|
|
84
115
|
catch (error) {
|
|
116
|
+
if (isMdxEsmExportMismatchError(error)) {
|
|
117
|
+
let recovered = false;
|
|
118
|
+
try {
|
|
119
|
+
recovered = await recoverStaleMdxEsmPreviewCaches({
|
|
120
|
+
adapter,
|
|
121
|
+
projectId: options?.projectId,
|
|
122
|
+
projectSlug: options?.projectSlug,
|
|
123
|
+
contentSourceId: options?.contentSourceId,
|
|
124
|
+
slug,
|
|
125
|
+
pagePath: path,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (recoveryError) {
|
|
129
|
+
logger.warn("Failed to recover stale MDX ESM preview caches", {
|
|
130
|
+
slug,
|
|
131
|
+
path,
|
|
132
|
+
error: getErrorMessage(recoveryError),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (recovered) {
|
|
136
|
+
try {
|
|
137
|
+
return await loadPageElement();
|
|
138
|
+
}
|
|
139
|
+
catch (retryError) {
|
|
140
|
+
throw RENDER_ERROR.create({
|
|
141
|
+
detail: `Failed to import MDX page via ESM after cache refresh: ${getErrorMessage(retryError)}`,
|
|
142
|
+
context: { slug, error: retryError, recoveredFrom: error },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
85
147
|
throw RENDER_ERROR.create({
|
|
86
148
|
detail: `Failed to import MDX page via ESM: ${getErrorMessage(error)}`,
|
|
87
149
|
context: { slug, error },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/security/http/response/cache-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/security/http/response/cache-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAuBjE"}
|
|
@@ -23,5 +23,8 @@ export function buildCacheControl(strategy) {
|
|
|
23
23
|
if (strategy.mustRevalidate) {
|
|
24
24
|
parts.push("must-revalidate");
|
|
25
25
|
}
|
|
26
|
+
if (typeof strategy.staleWhileRevalidate === "number") {
|
|
27
|
+
parts.push(`stale-while-revalidate=${strategy.staleWhileRevalidate}`);
|
|
28
|
+
}
|
|
26
29
|
return parts.join(", ");
|
|
27
30
|
}
|
|
@@ -10,6 +10,7 @@ export type CacheStrategy = "no-cache" | "no-store" | "short" | "medium" | "long
|
|
|
10
10
|
public?: boolean;
|
|
11
11
|
immutable?: boolean;
|
|
12
12
|
mustRevalidate?: boolean;
|
|
13
|
+
staleWhileRevalidate?: number;
|
|
13
14
|
};
|
|
14
15
|
export interface ResponseBuilderConfig {
|
|
15
16
|
securityConfig?: SecurityConfig | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/src/security/http/response/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,WAAW,GACX,MAAM,GACN;IACA,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/src/security/http/response/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,OAAO,GACP,QAAQ,GACR,MAAM,GACN,WAAW,GACX,MAAM,GACN;IACA,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEJ,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,oCAAoC,EAAE,cAAc,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-data-endpoint-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/module/page-data-endpoint-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"page-data-endpoint-handler.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/module/page-data-endpoint-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AA0EhE,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,cAAc,EACnB,qBAAqB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,eAAe,EAC/D,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,aAAa,EAC9C,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAC1C,OAAO,CAAC,aAAa,CAAC,CA6GxB"}
|
|
@@ -8,11 +8,44 @@ import { HTTP_GATEWAY_TIMEOUT } from "../../../../utils/constants/http.js";
|
|
|
8
8
|
import { serverLogger } from "../../../../utils/index.js";
|
|
9
9
|
import { Singleflight } from "../../../../utils/singleflight.js";
|
|
10
10
|
import { requestHasCacheSensitiveState } from "../../../../cache/request-cacheability.js";
|
|
11
|
+
import { getEnv } from "../../../../platform/compat/process.js";
|
|
11
12
|
const PAGE_DATA_TIMEOUT_MS = 25_000;
|
|
12
|
-
const PAGE_DATA_CACHE_TTL_MS = 60_000;
|
|
13
|
-
const
|
|
13
|
+
const PAGE_DATA_CACHE_TTL_MS = readPositiveIntegerEnv("VERYFRONT_PAGE_DATA_CACHE_TTL_MS", 60_000);
|
|
14
|
+
const PAGE_DATA_CACHE_STALE_MS = readPositiveIntegerEnv("VERYFRONT_PAGE_DATA_CACHE_STALE_MS", 30 * 60_000);
|
|
15
|
+
const PAGE_DATA_CACHE_MAX_ENTRIES = readPositiveIntegerEnv("VERYFRONT_PAGE_DATA_CACHE_MAX_ENTRIES", 500);
|
|
16
|
+
const PAGE_DATA_CACHE_MAX_AGE_SECONDS = Math.max(0, Math.floor(PAGE_DATA_CACHE_TTL_MS / 1000));
|
|
17
|
+
const PAGE_DATA_CACHE_STALE_SECONDS = Math.max(0, Math.floor(PAGE_DATA_CACHE_STALE_MS / 1000));
|
|
14
18
|
const pageDataCache = new Map();
|
|
15
19
|
const pageDataFlight = new Singleflight();
|
|
20
|
+
const RELEASE_PAGE_DATA_CACHE_POLICY = {
|
|
21
|
+
ttlMs: PAGE_DATA_CACHE_TTL_MS,
|
|
22
|
+
staleMs: PAGE_DATA_CACHE_STALE_MS,
|
|
23
|
+
maxAgeSeconds: PAGE_DATA_CACHE_MAX_AGE_SECONDS,
|
|
24
|
+
staleSeconds: PAGE_DATA_CACHE_STALE_SECONDS,
|
|
25
|
+
};
|
|
26
|
+
function readPositiveIntegerEnv(name, fallback) {
|
|
27
|
+
const raw = getEnv(name);
|
|
28
|
+
if (!raw)
|
|
29
|
+
return fallback;
|
|
30
|
+
const value = Number(raw);
|
|
31
|
+
if (!Number.isFinite(value) || value < 0)
|
|
32
|
+
return fallback;
|
|
33
|
+
return Math.floor(value);
|
|
34
|
+
}
|
|
35
|
+
function getPageDataCachePolicy(ctx) {
|
|
36
|
+
const environment = ctx.resolvedEnvironment ?? ctx.requestContext?.mode ?? "preview";
|
|
37
|
+
const isReleaseBackedProduction = environment === "production" && !!ctx.releaseId;
|
|
38
|
+
if (isReleaseBackedProduction)
|
|
39
|
+
return RELEASE_PAGE_DATA_CACHE_POLICY;
|
|
40
|
+
return {
|
|
41
|
+
...RELEASE_PAGE_DATA_CACHE_POLICY,
|
|
42
|
+
staleMs: 0,
|
|
43
|
+
staleSeconds: 0,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function isPageDataCacheEnabled() {
|
|
47
|
+
return PAGE_DATA_CACHE_MAX_ENTRIES > 0;
|
|
48
|
+
}
|
|
16
49
|
export function __clearPageDataEndpointCacheForTests() {
|
|
17
50
|
pageDataCache.clear();
|
|
18
51
|
}
|
|
@@ -24,13 +57,22 @@ export function handlePageDataEndpoint(req, pathname, ctx, createResponseBuilder
|
|
|
24
57
|
.replace(/\.json$/, "") || "";
|
|
25
58
|
const url = new URL(req.url);
|
|
26
59
|
const renderer = await getRendererForProject(ctx);
|
|
27
|
-
const cacheKey = requestHasCacheSensitiveState(req)
|
|
60
|
+
const cacheKey = !isPageDataCacheEnabled() || requestHasCacheSensitiveState(req)
|
|
28
61
|
? null
|
|
29
62
|
: buildPageDataCacheKey(ctx, slug, url);
|
|
63
|
+
const cachePolicy = cacheKey ? getPageDataCachePolicy(ctx) : null;
|
|
30
64
|
const payload = cacheKey
|
|
31
|
-
? await resolveCachedPageData(cacheKey, () => withTimeoutThrow(renderer.resolvePageData(slug, { request: req, url }), PAGE_DATA_TIMEOUT_MS, `resolvePageData for ${slug}`))
|
|
65
|
+
? await resolveCachedPageData(cacheKey, () => withTimeoutThrow(renderer.resolvePageData(slug, { request: req, url }), PAGE_DATA_TIMEOUT_MS, `resolvePageData for ${slug}`), cachePolicy)
|
|
32
66
|
: await resolveUncachedPageData(() => withTimeoutThrow(renderer.resolvePageData(slug, { request: req, url }), PAGE_DATA_TIMEOUT_MS, `resolvePageData for ${slug}`));
|
|
33
|
-
const cacheStrategy = cacheKey
|
|
67
|
+
const cacheStrategy = cacheKey
|
|
68
|
+
? {
|
|
69
|
+
maxAge: cachePolicy.maxAgeSeconds,
|
|
70
|
+
public: true,
|
|
71
|
+
...(cachePolicy.staleSeconds > 0
|
|
72
|
+
? { staleWhileRevalidate: cachePolicy.staleSeconds }
|
|
73
|
+
: {}),
|
|
74
|
+
}
|
|
75
|
+
: "no-cache";
|
|
34
76
|
const builder = createResponseBuilder(ctx).withCORS(req, ctx.securityConfig?.cors);
|
|
35
77
|
if (hasMatchingEtag(req, payload.etag)) {
|
|
36
78
|
return respond(builder.notModified(payload.etag));
|
|
@@ -78,25 +120,35 @@ export function handlePageDataEndpoint(req, pathname, ctx, createResponseBuilder
|
|
|
78
120
|
"module.pageData.projectSlug": ctx.projectSlug || "unknown",
|
|
79
121
|
});
|
|
80
122
|
}
|
|
81
|
-
async function resolveCachedPageData(cacheKey, resolve) {
|
|
123
|
+
async function resolveCachedPageData(cacheKey, resolve, cachePolicy) {
|
|
82
124
|
const cached = getCachedPageData(cacheKey);
|
|
83
|
-
if (cached) {
|
|
125
|
+
if (cached?.state === "fresh") {
|
|
84
126
|
markRequestProfilePhase("page_data.cache_hit");
|
|
85
|
-
return cached;
|
|
127
|
+
return cached.entry;
|
|
128
|
+
}
|
|
129
|
+
if (cached?.state === "stale") {
|
|
130
|
+
markRequestProfilePhase("page_data.cache_stale");
|
|
131
|
+
refreshStalePageData(cacheKey, resolve, cachePolicy);
|
|
132
|
+
return cached.entry;
|
|
86
133
|
}
|
|
87
134
|
markRequestProfilePhase("page_data.cache_miss");
|
|
88
135
|
return await pageDataFlight.do(cacheKey, async () => {
|
|
89
136
|
const concurrentCached = getCachedPageData(cacheKey);
|
|
90
|
-
if (concurrentCached) {
|
|
137
|
+
if (concurrentCached?.state === "fresh") {
|
|
91
138
|
markRequestProfilePhase("page_data.cache_hit_after_wait");
|
|
92
|
-
return concurrentCached;
|
|
139
|
+
return concurrentCached.entry;
|
|
140
|
+
}
|
|
141
|
+
if (concurrentCached?.state === "stale") {
|
|
142
|
+
markRequestProfilePhase("page_data.cache_stale_after_wait");
|
|
143
|
+
refreshStalePageData(cacheKey, resolve, cachePolicy);
|
|
144
|
+
return concurrentCached.entry;
|
|
93
145
|
}
|
|
94
|
-
const payload = await resolveUncachedPageData(resolve);
|
|
146
|
+
const payload = await resolveUncachedPageData(resolve, cachePolicy);
|
|
95
147
|
setCachedPageData(cacheKey, payload);
|
|
96
148
|
return payload;
|
|
97
149
|
});
|
|
98
150
|
}
|
|
99
|
-
async function resolveUncachedPageData(resolve) {
|
|
151
|
+
async function resolveUncachedPageData(resolve, cachePolicy = RELEASE_PAGE_DATA_CACHE_POLICY) {
|
|
100
152
|
const startedAt = performance.now();
|
|
101
153
|
const pageData = await resolve();
|
|
102
154
|
markRequestProfilePhase("page_data.resolve", performance.now() - startedAt);
|
|
@@ -107,20 +159,32 @@ async function resolveUncachedPageData(resolve) {
|
|
|
107
159
|
return {
|
|
108
160
|
body,
|
|
109
161
|
etag,
|
|
110
|
-
expiresAt: Date.now() +
|
|
162
|
+
expiresAt: Date.now() + cachePolicy.ttlMs,
|
|
163
|
+
staleUntil: Date.now() + cachePolicy.ttlMs + cachePolicy.staleMs,
|
|
111
164
|
};
|
|
112
165
|
}
|
|
113
166
|
function getCachedPageData(cacheKey) {
|
|
114
167
|
const entry = pageDataCache.get(cacheKey);
|
|
115
168
|
if (!entry)
|
|
116
169
|
return null;
|
|
117
|
-
|
|
118
|
-
|
|
170
|
+
const now = Date.now();
|
|
171
|
+
if (now <= entry.expiresAt) {
|
|
172
|
+
pageDataCache.delete(cacheKey);
|
|
173
|
+
pageDataCache.set(cacheKey, entry);
|
|
174
|
+
return { entry, state: "fresh" };
|
|
175
|
+
}
|
|
176
|
+
if (now <= entry.staleUntil) {
|
|
177
|
+
pageDataCache.delete(cacheKey);
|
|
178
|
+
pageDataCache.set(cacheKey, entry);
|
|
179
|
+
return { entry, state: "stale" };
|
|
180
|
+
}
|
|
119
181
|
pageDataCache.delete(cacheKey);
|
|
120
182
|
markRequestProfilePhase("page_data.cache_expired");
|
|
121
183
|
return null;
|
|
122
184
|
}
|
|
123
185
|
function setCachedPageData(cacheKey, entry) {
|
|
186
|
+
if (!isPageDataCacheEnabled())
|
|
187
|
+
return;
|
|
124
188
|
if (pageDataCache.size >= PAGE_DATA_CACHE_MAX_ENTRIES && !pageDataCache.has(cacheKey)) {
|
|
125
189
|
const oldestKey = pageDataCache.keys().next().value;
|
|
126
190
|
if (oldestKey)
|
|
@@ -128,6 +192,23 @@ function setCachedPageData(cacheKey, entry) {
|
|
|
128
192
|
}
|
|
129
193
|
pageDataCache.set(cacheKey, entry);
|
|
130
194
|
}
|
|
195
|
+
function refreshStalePageData(cacheKey, resolve, cachePolicy) {
|
|
196
|
+
void pageDataFlight.do(cacheKey, async () => {
|
|
197
|
+
const payload = await resolveUncachedPageData(resolve, cachePolicy);
|
|
198
|
+
setCachedPageData(cacheKey, payload);
|
|
199
|
+
return payload;
|
|
200
|
+
}).then(() => {
|
|
201
|
+
markRequestProfilePhase("page_data.refresh_background");
|
|
202
|
+
}, (error) => {
|
|
203
|
+
serverLogger.warn("[page-data] Background refresh failed", {
|
|
204
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
205
|
+
});
|
|
206
|
+
const stale = pageDataCache.get(cacheKey);
|
|
207
|
+
if (stale && Date.now() > stale.staleUntil) {
|
|
208
|
+
pageDataCache.delete(cacheKey);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
131
212
|
function buildPageDataCacheKey(ctx, slug, url) {
|
|
132
213
|
const projectKey = ctx.projectId ?? ctx.projectSlug ?? ctx.projectDir;
|
|
133
214
|
const environment = ctx.resolvedEnvironment ?? ctx.requestContext?.mode ?? "preview";
|
|
@@ -48,6 +48,7 @@ export declare function invalidateModulePaths(changedPaths: string[]): void;
|
|
|
48
48
|
*/
|
|
49
49
|
export declare function invalidateMdxEsmModule(cacheDir: string, filePath: string, projectDir?: string, reactVersion?: string): void;
|
|
50
50
|
export declare function clearESMDiskCache(): Promise<void>;
|
|
51
|
+
export declare function clearMdxEsmCacheNamespace(projectId: string, contentSourceId: string): Promise<void>;
|
|
51
52
|
export declare function clearHttpBundleCache(): Promise<void>;
|
|
52
53
|
/**
|
|
53
54
|
* Clear all local ESM caches (MDX-ESM disk cache, HTTP bundles, in-memory caches).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/mdx/esm-module-loader/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAI5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAK9D,eAAO,MAAM,kBAAkB,wBAE7B,CAAC;AA6IH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsBvF;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAQD,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAuBD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CA0ElE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,SAAwB,GACnC,IAAI,CAgBN;AAOD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAevD;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAc1D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIzD;AAmBD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,oDAAoD;AAC3E,eAAe,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EAChE,YAAY,SAAwB,GACnC,OAAO,CAAC,iBAAiB,CAAC,CA+J5B"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/mdx/esm-module-loader/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAI5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAK9D,eAAO,MAAM,kBAAkB,wBAE7B,CAAC;AA6IH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsBvF;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAQD,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAuBD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CA0ElE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,SAAwB,GACnC,IAAI,CAgBN;AAOD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAevD;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAc1D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIzD;AAmBD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,oDAAoD;AAC3E,eAAe,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EAChE,YAAY,SAAwB,GACnC,OAAO,CAAC,iBAAiB,CAAC,CA+J5B"}
|
|
@@ -347,6 +347,41 @@ export async function clearESMDiskCache() {
|
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
349
|
}
|
|
350
|
+
export async function clearMdxEsmCacheNamespace(projectId, contentSourceId) {
|
|
351
|
+
const cacheDir = join(getMdxEsmCacheDir(), encodeURIComponent(projectId), encodeURIComponent(contentSourceId));
|
|
352
|
+
modulePathCaches.delete(cacheDir);
|
|
353
|
+
modulePathCacheLoaded.delete(cacheDir);
|
|
354
|
+
for (const key of Array.from(verifiedModuleDeps.keys())) {
|
|
355
|
+
if (String(key).startsWith(cacheDir)) {
|
|
356
|
+
verifiedModuleDeps.delete(key);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
await getLocalFs().remove(cacheDir, { recursive: true });
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
if (!isNotFoundError(error)) {
|
|
364
|
+
logger.warn(`${LOG_PREFIX_MDX_LOADER} Failed to remove MDX-ESM cache namespace`, {
|
|
365
|
+
cacheDir,
|
|
366
|
+
error: error instanceof Error ? error.message : String(error),
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
try {
|
|
371
|
+
await getLocalFs().mkdir(cacheDir, { recursive: true });
|
|
372
|
+
logger.debug(`${LOG_PREFIX_MDX_LOADER} Cleared MDX-ESM cache namespace`, {
|
|
373
|
+
projectId,
|
|
374
|
+
contentSourceId,
|
|
375
|
+
cacheDir,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
logger.warn(`${LOG_PREFIX_MDX_LOADER} Failed to recreate MDX-ESM cache namespace`, {
|
|
380
|
+
cacheDir,
|
|
381
|
+
error: error instanceof Error ? error.message : String(error),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
350
385
|
export async function clearHttpBundleCache() {
|
|
351
386
|
const cacheDir = getHttpBundleCacheDir();
|
|
352
387
|
const fs = getLocalFs();
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module transforms/mdx/esm-module-loader
|
|
5
5
|
*/
|
|
6
|
-
export { clearESMDiskCache, clearModulePathCache, invalidateModulePaths } from "./cache/index.js";
|
|
6
|
+
export { clearESMDiskCache, clearMdxEsmCacheNamespace, clearModulePathCache, invalidateModulePaths, } from "./cache/index.js";
|
|
7
7
|
export { IS_TRUE_NODE, LOG_PREFIX_MDX_LOADER, LOG_PREFIX_MDX_RENDERER } from "./constants.js";
|
|
8
8
|
export { loadModuleESM } from "./loader.js";
|
|
9
9
|
export type { ESMLoaderContext, FSAdapter, ModuleFetcherContext } from "./types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/transforms/mdx/esm-module-loader/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGlG,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @module transforms/mdx/esm-module-loader
|
|
5
5
|
*/
|
|
6
6
|
// Cache exports
|
|
7
|
-
export { clearESMDiskCache, clearModulePathCache, invalidateModulePaths } from "./cache/index.js";
|
|
7
|
+
export { clearESMDiskCache, clearMdxEsmCacheNamespace, clearModulePathCache, invalidateModulePaths, } from "./cache/index.js";
|
|
8
8
|
// Constants exports
|
|
9
9
|
export { IS_TRUE_NODE, LOG_PREFIX_MDX_LOADER, LOG_PREFIX_MDX_RENDERER } from "./constants.js";
|
|
10
10
|
// Loader exports
|
|
@@ -55,6 +55,26 @@ export interface GCStats {
|
|
|
55
55
|
minorGCs: number;
|
|
56
56
|
lastGCDurationMs?: number;
|
|
57
57
|
}
|
|
58
|
+
export interface PendingRapidHeapGrowth {
|
|
59
|
+
baselineHeapUsedMB: number;
|
|
60
|
+
observedGrowthMB: number;
|
|
61
|
+
}
|
|
62
|
+
export interface RapidHeapGrowthEvaluationInput {
|
|
63
|
+
previousHeapUsedMB: number;
|
|
64
|
+
currentHeapUsedMB: number;
|
|
65
|
+
pending: PendingRapidHeapGrowth | undefined;
|
|
66
|
+
thresholdMB: number;
|
|
67
|
+
}
|
|
68
|
+
export interface RapidHeapGrowthEvaluation {
|
|
69
|
+
shouldWarn: boolean;
|
|
70
|
+
growthMB?: number;
|
|
71
|
+
observedGrowthMB?: number;
|
|
72
|
+
pending?: PendingRapidHeapGrowth;
|
|
73
|
+
}
|
|
74
|
+
export interface RapidHeapGrowthState {
|
|
75
|
+
lastHeapUsedMB: number;
|
|
76
|
+
pending: PendingRapidHeapGrowth | undefined;
|
|
77
|
+
}
|
|
58
78
|
export declare function registerCache(name: string, getStats: () => CacheStats): void;
|
|
59
79
|
export declare function unregisterCache(name: string): void;
|
|
60
80
|
export declare function getHeapStats(): HeapStats;
|
|
@@ -63,6 +83,8 @@ export declare function getMemorySnapshot(): MemorySnapshot;
|
|
|
63
83
|
export declare function getTopCacheStats(caches: CacheStats[], limit?: number): MonitoringCacheStats[];
|
|
64
84
|
export declare function getMemoryMonitoringLogContext(snapshot: MemorySnapshot, topCacheLimit?: number): MemoryMonitoringLogContext;
|
|
65
85
|
export declare function getMemoryMonitoringConfig(env: MemoryMonitoringEnv): MemoryMonitoringConfig;
|
|
86
|
+
export declare function getInitialRapidHeapGrowthState(initialHeapUsedMB: number): RapidHeapGrowthState;
|
|
87
|
+
export declare function getRapidHeapGrowthEvaluation(input: RapidHeapGrowthEvaluationInput): RapidHeapGrowthEvaluation;
|
|
66
88
|
export declare function getMemoryMonitoringState(): MemoryMonitoringState;
|
|
67
89
|
export declare function forceGC(): Promise<boolean>;
|
|
68
90
|
export declare function startMemoryMonitoring(intervalMs?: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/memory/profiler.ts"],"names":[],"mappings":"AAiBA,kEAAkE;AAClE,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAO5D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../../../src/src/utils/memory/profiler.ts"],"names":[],"mappings":"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"}
|