@bleedingdev/modern-js-server-core 3.2.0-ultramodern.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/cjs/adapters/node/helper/index.js +55 -0
- package/dist/cjs/adapters/node/helper/loadCache.js +58 -0
- package/dist/cjs/adapters/node/helper/loadConfig.js +78 -0
- package/dist/cjs/adapters/node/helper/loadEnv.js +66 -0
- package/dist/cjs/adapters/node/helper/loadPlugin.js +47 -0
- package/dist/cjs/adapters/node/helper/utils.js +39 -0
- package/dist/cjs/adapters/node/hono.js +95 -0
- package/dist/cjs/adapters/node/index.js +87 -0
- package/dist/cjs/adapters/node/node.js +180 -0
- package/dist/cjs/adapters/node/plugins/index.js +72 -0
- package/dist/cjs/adapters/node/plugins/nodeServer.js +43 -0
- package/dist/cjs/adapters/node/plugins/resource.js +206 -0
- package/dist/cjs/adapters/node/plugins/static.js +379 -0
- package/dist/cjs/constants.js +77 -0
- package/dist/cjs/context.js +41 -0
- package/dist/cjs/helper.js +45 -0
- package/dist/cjs/hono.js +46 -0
- package/dist/cjs/index.js +247 -0
- package/dist/cjs/plugins/compat/hooks.js +80 -0
- package/dist/cjs/plugins/compat/index.js +64 -0
- package/dist/cjs/plugins/contractGateAutopilot.js +158 -0
- package/dist/cjs/plugins/contractGateSnapshotStore.js +239 -0
- package/dist/cjs/plugins/default.js +61 -0
- package/dist/cjs/plugins/favicon.js +48 -0
- package/dist/cjs/plugins/index.js +157 -0
- package/dist/cjs/plugins/log.js +92 -0
- package/dist/cjs/plugins/mfCache.js +78 -0
- package/dist/cjs/plugins/middlewares.js +49 -0
- package/dist/cjs/plugins/monitors.js +192 -0
- package/dist/cjs/plugins/processedBy.js +50 -0
- package/dist/cjs/plugins/render/csrRscRender.js +74 -0
- package/dist/cjs/plugins/render/dataHandler.js +53 -0
- package/dist/cjs/plugins/render/index.js +158 -0
- package/dist/cjs/plugins/render/inject.js +92 -0
- package/dist/cjs/plugins/render/render.js +273 -0
- package/dist/cjs/plugins/render/renderRscHandler.js +72 -0
- package/dist/cjs/plugins/render/serverActionHandler.js +47 -0
- package/dist/cjs/plugins/render/ssrCache.js +198 -0
- package/dist/cjs/plugins/render/ssrRender.js +96 -0
- package/dist/cjs/plugins/render/utils.js +49 -0
- package/dist/cjs/plugins/route.js +68 -0
- package/dist/cjs/plugins/telemetry.js +1283 -0
- package/dist/cjs/serverBase.js +176 -0
- package/dist/cjs/types/config/bff.js +18 -0
- package/dist/cjs/types/config/dev.js +18 -0
- package/dist/cjs/types/config/html.js +18 -0
- package/dist/cjs/types/config/index.js +93 -0
- package/dist/cjs/types/config/output.js +18 -0
- package/dist/cjs/types/config/security.js +18 -0
- package/dist/cjs/types/config/server.js +18 -0
- package/dist/cjs/types/config/share.js +18 -0
- package/dist/cjs/types/config/source.js +18 -0
- package/dist/cjs/types/config/tools.js +18 -0
- package/dist/cjs/types/index.js +79 -0
- package/dist/cjs/types/plugins/base.js +18 -0
- package/dist/cjs/types/plugins/index.js +58 -0
- package/dist/cjs/types/plugins/plugin.js +18 -0
- package/dist/cjs/types/render.js +18 -0
- package/dist/cjs/types/requestHandler.js +18 -0
- package/dist/cjs/types/server.js +18 -0
- package/dist/cjs/utils/entry.js +40 -0
- package/dist/cjs/utils/env.js +51 -0
- package/dist/cjs/utils/error.js +93 -0
- package/dist/cjs/utils/index.js +114 -0
- package/dist/cjs/utils/middlewareCollector.js +63 -0
- package/dist/cjs/utils/publicDir.js +92 -0
- package/dist/cjs/utils/request.js +86 -0
- package/dist/cjs/utils/serverConfig.js +43 -0
- package/dist/cjs/utils/storage.js +69 -0
- package/dist/cjs/utils/transformStream.js +65 -0
- package/dist/cjs/utils/warmup.js +40 -0
- package/dist/esm/adapters/node/helper/index.mjs +5 -0
- package/dist/esm/adapters/node/helper/loadCache.mjs +14 -0
- package/dist/esm/adapters/node/helper/loadConfig.mjs +31 -0
- package/dist/esm/adapters/node/helper/loadEnv.mjs +22 -0
- package/dist/esm/adapters/node/helper/loadPlugin.mjs +13 -0
- package/dist/esm/adapters/node/helper/utils.mjs +5 -0
- package/dist/esm/adapters/node/hono.mjs +55 -0
- package/dist/esm/adapters/node/index.mjs +4 -0
- package/dist/esm/adapters/node/node.mjs +130 -0
- package/dist/esm/adapters/node/plugins/index.mjs +3 -0
- package/dist/esm/adapters/node/plugins/nodeServer.mjs +9 -0
- package/dist/esm/adapters/node/plugins/resource.mjs +138 -0
- package/dist/esm/adapters/node/plugins/static.mjs +329 -0
- package/dist/esm/constants.mjs +28 -0
- package/dist/esm/context.mjs +4 -0
- package/dist/esm/helper.mjs +11 -0
- package/dist/esm/hono.mjs +2 -0
- package/dist/esm/index.mjs +12 -0
- package/dist/esm/plugins/compat/hooks.mjs +40 -0
- package/dist/esm/plugins/compat/index.mjs +27 -0
- package/dist/esm/plugins/contractGateAutopilot.mjs +124 -0
- package/dist/esm/plugins/contractGateSnapshotStore.mjs +180 -0
- package/dist/esm/plugins/default.mjs +27 -0
- package/dist/esm/plugins/favicon.mjs +14 -0
- package/dist/esm/plugins/index.mjs +11 -0
- package/dist/esm/plugins/log.mjs +58 -0
- package/dist/esm/plugins/mfCache.mjs +35 -0
- package/dist/esm/plugins/middlewares.mjs +15 -0
- package/dist/esm/plugins/monitors.mjs +149 -0
- package/dist/esm/plugins/processedBy.mjs +16 -0
- package/dist/esm/plugins/render/csrRscRender.mjs +40 -0
- package/dist/esm/plugins/render/dataHandler.mjs +19 -0
- package/dist/esm/plugins/render/index.mjs +84 -0
- package/dist/esm/plugins/render/inject.mjs +55 -0
- package/dist/esm/plugins/render/render.mjs +230 -0
- package/dist/esm/plugins/render/renderRscHandler.mjs +38 -0
- package/dist/esm/plugins/render/serverActionHandler.mjs +13 -0
- package/dist/esm/plugins/render/ssrCache.mjs +158 -0
- package/dist/esm/plugins/render/ssrRender.mjs +62 -0
- package/dist/esm/plugins/render/utils.mjs +15 -0
- package/dist/esm/plugins/route.mjs +34 -0
- package/dist/esm/plugins/telemetry.mjs +1195 -0
- package/dist/esm/rslib-runtime.mjs +18 -0
- package/dist/esm/serverBase.mjs +139 -0
- package/dist/esm/types/config/bff.mjs +0 -0
- package/dist/esm/types/config/dev.mjs +0 -0
- package/dist/esm/types/config/html.mjs +0 -0
- package/dist/esm/types/config/index.mjs +6 -0
- package/dist/esm/types/config/output.mjs +0 -0
- package/dist/esm/types/config/security.mjs +0 -0
- package/dist/esm/types/config/server.mjs +0 -0
- package/dist/esm/types/config/share.mjs +0 -0
- package/dist/esm/types/config/source.mjs +0 -0
- package/dist/esm/types/config/tools.mjs +0 -0
- package/dist/esm/types/index.mjs +4 -0
- package/dist/esm/types/plugins/base.mjs +0 -0
- package/dist/esm/types/plugins/index.mjs +1 -0
- package/dist/esm/types/plugins/plugin.mjs +0 -0
- package/dist/esm/types/render.mjs +0 -0
- package/dist/esm/types/requestHandler.mjs +0 -0
- package/dist/esm/types/server.mjs +0 -0
- package/dist/esm/utils/entry.mjs +3 -0
- package/dist/esm/utils/env.mjs +14 -0
- package/dist/esm/utils/error.mjs +53 -0
- package/dist/esm/utils/index.mjs +9 -0
- package/dist/esm/utils/middlewareCollector.mjs +26 -0
- package/dist/esm/utils/publicDir.mjs +33 -0
- package/dist/esm/utils/request.mjs +40 -0
- package/dist/esm/utils/serverConfig.mjs +9 -0
- package/dist/esm/utils/storage.mjs +35 -0
- package/dist/esm/utils/transformStream.mjs +28 -0
- package/dist/esm/utils/warmup.mjs +6 -0
- package/dist/esm-node/adapters/node/helper/index.mjs +6 -0
- package/dist/esm-node/adapters/node/helper/loadCache.mjs +15 -0
- package/dist/esm-node/adapters/node/helper/loadConfig.mjs +32 -0
- package/dist/esm-node/adapters/node/helper/loadEnv.mjs +23 -0
- package/dist/esm-node/adapters/node/helper/loadPlugin.mjs +14 -0
- package/dist/esm-node/adapters/node/helper/utils.mjs +6 -0
- package/dist/esm-node/adapters/node/hono.mjs +56 -0
- package/dist/esm-node/adapters/node/index.mjs +5 -0
- package/dist/esm-node/adapters/node/node.mjs +131 -0
- package/dist/esm-node/adapters/node/plugins/index.mjs +4 -0
- package/dist/esm-node/adapters/node/plugins/nodeServer.mjs +10 -0
- package/dist/esm-node/adapters/node/plugins/resource.mjs +139 -0
- package/dist/esm-node/adapters/node/plugins/static.mjs +330 -0
- package/dist/esm-node/constants.mjs +29 -0
- package/dist/esm-node/context.mjs +5 -0
- package/dist/esm-node/helper.mjs +12 -0
- package/dist/esm-node/hono.mjs +3 -0
- package/dist/esm-node/index.mjs +13 -0
- package/dist/esm-node/plugins/compat/hooks.mjs +41 -0
- package/dist/esm-node/plugins/compat/index.mjs +28 -0
- package/dist/esm-node/plugins/contractGateAutopilot.mjs +125 -0
- package/dist/esm-node/plugins/contractGateSnapshotStore.mjs +182 -0
- package/dist/esm-node/plugins/default.mjs +28 -0
- package/dist/esm-node/plugins/favicon.mjs +15 -0
- package/dist/esm-node/plugins/index.mjs +12 -0
- package/dist/esm-node/plugins/log.mjs +59 -0
- package/dist/esm-node/plugins/mfCache.mjs +36 -0
- package/dist/esm-node/plugins/middlewares.mjs +16 -0
- package/dist/esm-node/plugins/monitors.mjs +150 -0
- package/dist/esm-node/plugins/processedBy.mjs +17 -0
- package/dist/esm-node/plugins/render/csrRscRender.mjs +41 -0
- package/dist/esm-node/plugins/render/dataHandler.mjs +20 -0
- package/dist/esm-node/plugins/render/index.mjs +85 -0
- package/dist/esm-node/plugins/render/inject.mjs +56 -0
- package/dist/esm-node/plugins/render/render.mjs +231 -0
- package/dist/esm-node/plugins/render/renderRscHandler.mjs +39 -0
- package/dist/esm-node/plugins/render/serverActionHandler.mjs +14 -0
- package/dist/esm-node/plugins/render/ssrCache.mjs +159 -0
- package/dist/esm-node/plugins/render/ssrRender.mjs +63 -0
- package/dist/esm-node/plugins/render/utils.mjs +16 -0
- package/dist/esm-node/plugins/route.mjs +35 -0
- package/dist/esm-node/plugins/telemetry.mjs +1196 -0
- package/dist/esm-node/rslib-runtime.mjs +19 -0
- package/dist/esm-node/serverBase.mjs +140 -0
- package/dist/esm-node/types/config/bff.mjs +1 -0
- package/dist/esm-node/types/config/dev.mjs +1 -0
- package/dist/esm-node/types/config/html.mjs +1 -0
- package/dist/esm-node/types/config/index.mjs +7 -0
- package/dist/esm-node/types/config/output.mjs +1 -0
- package/dist/esm-node/types/config/security.mjs +1 -0
- package/dist/esm-node/types/config/server.mjs +1 -0
- package/dist/esm-node/types/config/share.mjs +1 -0
- package/dist/esm-node/types/config/source.mjs +1 -0
- package/dist/esm-node/types/config/tools.mjs +1 -0
- package/dist/esm-node/types/index.mjs +5 -0
- package/dist/esm-node/types/plugins/base.mjs +1 -0
- package/dist/esm-node/types/plugins/index.mjs +2 -0
- package/dist/esm-node/types/plugins/plugin.mjs +1 -0
- package/dist/esm-node/types/render.mjs +1 -0
- package/dist/esm-node/types/requestHandler.mjs +1 -0
- package/dist/esm-node/types/server.mjs +1 -0
- package/dist/esm-node/utils/entry.mjs +4 -0
- package/dist/esm-node/utils/env.mjs +15 -0
- package/dist/esm-node/utils/error.mjs +54 -0
- package/dist/esm-node/utils/index.mjs +10 -0
- package/dist/esm-node/utils/middlewareCollector.mjs +27 -0
- package/dist/esm-node/utils/publicDir.mjs +34 -0
- package/dist/esm-node/utils/request.mjs +41 -0
- package/dist/esm-node/utils/serverConfig.mjs +10 -0
- package/dist/esm-node/utils/storage.mjs +36 -0
- package/dist/esm-node/utils/transformStream.mjs +29 -0
- package/dist/esm-node/utils/warmup.mjs +7 -0
- package/dist/types/adapters/node/helper/index.d.ts +6 -0
- package/dist/types/adapters/node/helper/loadCache.d.ts +2 -0
- package/dist/types/adapters/node/helper/loadConfig.d.ts +3 -0
- package/dist/types/adapters/node/helper/loadEnv.d.ts +3 -0
- package/dist/types/adapters/node/helper/loadPlugin.d.ts +3 -0
- package/dist/types/adapters/node/helper/utils.d.ts +21 -0
- package/dist/types/adapters/node/hono.d.ts +19 -0
- package/dist/types/adapters/node/index.d.ts +5 -0
- package/dist/types/adapters/node/node.d.ts +17 -0
- package/dist/types/adapters/node/plugins/index.d.ts +3 -0
- package/dist/types/adapters/node/plugins/nodeServer.d.ts +6 -0
- package/dist/types/adapters/node/plugins/resource.d.ts +11 -0
- package/dist/types/adapters/node/plugins/static.d.ts +25 -0
- package/dist/types/constants.d.ts +26 -0
- package/dist/types/context.d.ts +3 -0
- package/dist/types/helper.d.ts +10 -0
- package/dist/types/hono.d.ts +3 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/plugins/compat/hooks.d.ts +8 -0
- package/dist/types/plugins/compat/index.d.ts +3 -0
- package/dist/types/plugins/contractGateAutopilot.d.ts +35 -0
- package/dist/types/plugins/contractGateSnapshotStore.d.ts +57 -0
- package/dist/types/plugins/default.d.ts +7 -0
- package/dist/types/plugins/favicon.d.ts +2 -0
- package/dist/types/plugins/index.d.ts +11 -0
- package/dist/types/plugins/log.d.ts +2 -0
- package/dist/types/plugins/mfCache.d.ts +12 -0
- package/dist/types/plugins/middlewares.d.ts +2 -0
- package/dist/types/plugins/monitors.d.ts +6 -0
- package/dist/types/plugins/processedBy.d.ts +2 -0
- package/dist/types/plugins/render/csrRscRender.d.ts +2 -0
- package/dist/types/plugins/render/dataHandler.d.ts +5 -0
- package/dist/types/plugins/render/index.d.ts +3 -0
- package/dist/types/plugins/render/inject.d.ts +7 -0
- package/dist/types/plugins/render/render.d.ts +16 -0
- package/dist/types/plugins/render/renderRscHandler.d.ts +2 -0
- package/dist/types/plugins/render/serverActionHandler.d.ts +2 -0
- package/dist/types/plugins/render/ssrCache.d.ts +18 -0
- package/dist/types/plugins/render/ssrRender.d.ts +26 -0
- package/dist/types/plugins/render/utils.d.ts +3 -0
- package/dist/types/plugins/route.d.ts +2 -0
- package/dist/types/plugins/telemetry.d.ts +309 -0
- package/dist/types/serverBase.d.ts +38 -0
- package/dist/types/types/config/bff.d.ts +142 -0
- package/dist/types/types/config/dev.d.ts +4 -0
- package/dist/types/types/config/html.d.ts +15 -0
- package/dist/types/types/config/index.d.ts +35 -0
- package/dist/types/types/config/output.d.ts +20 -0
- package/dist/types/types/config/security.d.ts +4 -0
- package/dist/types/types/config/server.d.ts +402 -0
- package/dist/types/types/config/share.d.ts +3 -0
- package/dist/types/types/config/source.d.ts +7 -0
- package/dist/types/types/config/tools.d.ts +2 -0
- package/dist/types/types/index.d.ts +4 -0
- package/dist/types/types/plugins/base.d.ts +57 -0
- package/dist/types/types/plugins/index.d.ts +2 -0
- package/dist/types/types/plugins/plugin.d.ts +31 -0
- package/dist/types/types/render.d.ts +24 -0
- package/dist/types/types/requestHandler.d.ts +48 -0
- package/dist/types/types/server.d.ts +67 -0
- package/dist/types/utils/entry.d.ts +3 -0
- package/dist/types/utils/env.d.ts +2 -0
- package/dist/types/utils/error.d.ts +8 -0
- package/dist/types/utils/index.d.ts +9 -0
- package/dist/types/utils/middlewareCollector.d.ts +12 -0
- package/dist/types/utils/publicDir.d.ts +40 -0
- package/dist/types/utils/request.d.ts +17 -0
- package/dist/types/utils/serverConfig.d.ts +8 -0
- package/dist/types/utils/storage.d.ts +5 -0
- package/dist/types/utils/transformStream.d.ts +5 -0
- package/dist/types/utils/warmup.d.ts +1 -0
- package/package.json +103 -0
- package/rslib.config.mts +4 -0
- package/rstest.config.mts +7 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { createMemoryStorage } from "@modern-js/runtime-utils/storer";
|
|
3
|
+
import { X_RENDER_CACHE } from "../../constants.mjs";
|
|
4
|
+
import { createTransformStream, getPathname } from "../../utils/index.mjs";
|
|
5
|
+
const removeTailSlash = (s)=>s.replace(/\/+$/, '');
|
|
6
|
+
const ZERO_RENDER_LEVEL = /"renderLevel":0/;
|
|
7
|
+
const NO_SSR_CACHE = /<meta\s+[^>]*name=["']no-ssr-cache["'][^>]*>/i;
|
|
8
|
+
async function processCache({ request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus }) {
|
|
9
|
+
const response = await requestHandler(request, requestHandlerOptions);
|
|
10
|
+
const { onError } = requestHandlerOptions;
|
|
11
|
+
const nonCacheableStatusCodes = [
|
|
12
|
+
204,
|
|
13
|
+
305,
|
|
14
|
+
404,
|
|
15
|
+
405,
|
|
16
|
+
500,
|
|
17
|
+
501,
|
|
18
|
+
502,
|
|
19
|
+
503,
|
|
20
|
+
504
|
|
21
|
+
];
|
|
22
|
+
if (nonCacheableStatusCodes.includes(response.status)) return response;
|
|
23
|
+
const decoder = new TextDecoder();
|
|
24
|
+
if (response.body) {
|
|
25
|
+
const stream = createTransformStream();
|
|
26
|
+
const reader = response.body.getReader();
|
|
27
|
+
const writer = stream.writable.getWriter();
|
|
28
|
+
let html = '';
|
|
29
|
+
const push = ()=>reader.read().then(({ done, value })=>{
|
|
30
|
+
if (done) {
|
|
31
|
+
const match = ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html);
|
|
32
|
+
if (match) return void writer.close();
|
|
33
|
+
const current = Date.now();
|
|
34
|
+
const cache = {
|
|
35
|
+
val: html,
|
|
36
|
+
cursor: current
|
|
37
|
+
};
|
|
38
|
+
container.set(key, JSON.stringify(cache), {
|
|
39
|
+
ttl
|
|
40
|
+
}).catch(()=>{
|
|
41
|
+
if (onError) onError(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
42
|
+
else console.error(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
43
|
+
});
|
|
44
|
+
writer.close();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const content = decoder.decode(value);
|
|
48
|
+
html += content;
|
|
49
|
+
writer.write(value);
|
|
50
|
+
push();
|
|
51
|
+
});
|
|
52
|
+
push();
|
|
53
|
+
cacheStatus && response.headers.set(X_RENDER_CACHE, cacheStatus);
|
|
54
|
+
return new Response(stream.readable, {
|
|
55
|
+
status: response.status,
|
|
56
|
+
headers: response.headers
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return response;
|
|
60
|
+
}
|
|
61
|
+
const CACHE_NAMESPACE = '__ssr__cache';
|
|
62
|
+
const storage = createMemoryStorage(CACHE_NAMESPACE);
|
|
63
|
+
function computedKey(req, cacheControl) {
|
|
64
|
+
const pathname = getPathname(req);
|
|
65
|
+
const { customKey } = cacheControl;
|
|
66
|
+
const defaultKey = '/' === pathname ? pathname : removeTailSlash(pathname);
|
|
67
|
+
if (!customKey) return defaultKey;
|
|
68
|
+
if ('string' == typeof customKey) return customKey;
|
|
69
|
+
return customKey(defaultKey);
|
|
70
|
+
}
|
|
71
|
+
function shouldUseCache(request) {
|
|
72
|
+
const url = new URL(request.url);
|
|
73
|
+
const hasRSCAction = request.headers.has('x-rsc-action');
|
|
74
|
+
const hasRSCTree = request.headers.has('x-rsc-tree');
|
|
75
|
+
const hasLoaderQuery = url.searchParams.has('__loader');
|
|
76
|
+
return !(hasRSCAction || hasRSCTree || hasLoaderQuery);
|
|
77
|
+
}
|
|
78
|
+
function matchCacheControl(cacheOption, req) {
|
|
79
|
+
if (!cacheOption || !req) return;
|
|
80
|
+
{
|
|
81
|
+
if (isCacheControl(cacheOption)) return cacheOption;
|
|
82
|
+
if (isCacheOptionProvider(cacheOption)) return cacheOption(req);
|
|
83
|
+
const url = req.url;
|
|
84
|
+
const options = Object.entries(cacheOption);
|
|
85
|
+
for (const [key, option] of options)if ('*' === key || new RegExp(key).test(url)) if ('function' == typeof option) return option(req);
|
|
86
|
+
else return option;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
function isCacheOptionProvider(option) {
|
|
90
|
+
return 'function' == typeof option;
|
|
91
|
+
}
|
|
92
|
+
function isCacheControl(option) {
|
|
93
|
+
return 'object' == typeof option && null !== option && 'maxAge' in option;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function getCacheResult(request, options) {
|
|
97
|
+
const { cacheControl, container = storage, requestHandler, requestHandlerOptions } = options;
|
|
98
|
+
const { onError } = requestHandlerOptions;
|
|
99
|
+
const key = computedKey(request, cacheControl);
|
|
100
|
+
let value;
|
|
101
|
+
try {
|
|
102
|
+
value = await container.get(key);
|
|
103
|
+
} catch (_) {
|
|
104
|
+
if (onError) onError(`[render-cache] get cache failed, key: ${key}`);
|
|
105
|
+
else console.error(`[render-cache] get cache failed, key: ${key}`);
|
|
106
|
+
value = void 0;
|
|
107
|
+
}
|
|
108
|
+
const { maxAge, staleWhileRevalidate } = cacheControl;
|
|
109
|
+
const ttl = maxAge + staleWhileRevalidate;
|
|
110
|
+
if (!value) return processCache({
|
|
111
|
+
key,
|
|
112
|
+
request,
|
|
113
|
+
requestHandler,
|
|
114
|
+
requestHandlerOptions,
|
|
115
|
+
ttl,
|
|
116
|
+
container,
|
|
117
|
+
cacheStatus: 'miss'
|
|
118
|
+
});
|
|
119
|
+
{
|
|
120
|
+
const cache = JSON.parse(value);
|
|
121
|
+
const interval = Date.now() - cache.cursor;
|
|
122
|
+
if (interval <= maxAge) {
|
|
123
|
+
const cacheStatus = 'hit';
|
|
124
|
+
return new Response(cache.val, {
|
|
125
|
+
headers: {
|
|
126
|
+
[X_RENDER_CACHE]: cacheStatus
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
|
|
131
|
+
key,
|
|
132
|
+
request,
|
|
133
|
+
requestHandler,
|
|
134
|
+
requestHandlerOptions,
|
|
135
|
+
ttl,
|
|
136
|
+
container,
|
|
137
|
+
cacheStatus: 'expired'
|
|
138
|
+
});
|
|
139
|
+
{
|
|
140
|
+
processCache({
|
|
141
|
+
key,
|
|
142
|
+
request,
|
|
143
|
+
requestHandler,
|
|
144
|
+
requestHandlerOptions,
|
|
145
|
+
ttl,
|
|
146
|
+
container
|
|
147
|
+
}).then(async (response)=>{
|
|
148
|
+
await response.text();
|
|
149
|
+
});
|
|
150
|
+
const cacheStatus = 'stale';
|
|
151
|
+
return new Response(cache.val, {
|
|
152
|
+
headers: {
|
|
153
|
+
[X_RENDER_CACHE]: cacheStatus
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export { getCacheResult, matchCacheControl, shouldUseCache };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
import { X_MODERNJS_RENDER } from "../../constants.mjs";
|
|
4
|
+
import { getPathname, parseHeaders } from "../../utils/index.mjs";
|
|
5
|
+
import { getCacheResult, matchCacheControl, shouldUseCache } from "./ssrCache.mjs";
|
|
6
|
+
import { createRequestHandlerConfig } from "./utils.mjs";
|
|
7
|
+
const SERVER_RUNTIME_ENTRY = 'requestHandler';
|
|
8
|
+
async function ssrRender(request, { routeInfo, html, config: userConfig, staticGenerate, nodeReq, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, monitors, cacheConfig, onError, onTiming, reporter }) {
|
|
9
|
+
const { entryName } = routeInfo;
|
|
10
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
11
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
12
|
+
const headers = parseHeaders(request);
|
|
13
|
+
if (nodeReq) {
|
|
14
|
+
for(const key in nodeReq.headers)if (!headers[key]) headers[key] = nodeReq.headers[key];
|
|
15
|
+
}
|
|
16
|
+
const renderBundle = serverManifest.renderBundles?.[entryName || MAIN_ENTRY_NAME];
|
|
17
|
+
if (!renderBundle) throw new Error(`Can't find renderBundle ${entryName || MAIN_ENTRY_NAME}`);
|
|
18
|
+
const requestHandler = await renderBundle[SERVER_RUNTIME_ENTRY];
|
|
19
|
+
const config = createRequestHandlerConfig(userConfig);
|
|
20
|
+
const requestHandlerOptions = {
|
|
21
|
+
resource: {
|
|
22
|
+
route: routeInfo,
|
|
23
|
+
loadableStats,
|
|
24
|
+
routeManifest,
|
|
25
|
+
htmlTemplate: html,
|
|
26
|
+
entryName: entryName || MAIN_ENTRY_NAME
|
|
27
|
+
},
|
|
28
|
+
params,
|
|
29
|
+
loaderContext,
|
|
30
|
+
config,
|
|
31
|
+
rscSSRManifest,
|
|
32
|
+
rscClientManifest,
|
|
33
|
+
rscServerManifest,
|
|
34
|
+
locals,
|
|
35
|
+
staticGenerate,
|
|
36
|
+
monitors,
|
|
37
|
+
onError,
|
|
38
|
+
onTiming,
|
|
39
|
+
reporter
|
|
40
|
+
};
|
|
41
|
+
const cacheControl = await matchCacheControl(cacheConfig?.strategy, nodeReq || new IncomingMessgeProxy(request));
|
|
42
|
+
let response;
|
|
43
|
+
response = cacheControl && shouldUseCache(request) ? await getCacheResult(request, {
|
|
44
|
+
cacheControl,
|
|
45
|
+
container: cacheConfig?.container,
|
|
46
|
+
requestHandler: requestHandler,
|
|
47
|
+
requestHandlerOptions
|
|
48
|
+
}) : await requestHandler(request, requestHandlerOptions);
|
|
49
|
+
response.headers.set(X_MODERNJS_RENDER, 'server');
|
|
50
|
+
response.headers.set('content-type', 'text/html; charset=UTF-8');
|
|
51
|
+
return response;
|
|
52
|
+
}
|
|
53
|
+
class IncomingMessgeProxy {
|
|
54
|
+
constructor(req){
|
|
55
|
+
this.headers = {};
|
|
56
|
+
req.headers.forEach((value, key)=>{
|
|
57
|
+
this.headers[key] = value;
|
|
58
|
+
});
|
|
59
|
+
this.method = req.method;
|
|
60
|
+
this.url = getPathname(req);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export { ssrRender };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
function createRequestHandlerConfig(userConfig) {
|
|
3
|
+
const { output, server, security, html, source } = userConfig;
|
|
4
|
+
return {
|
|
5
|
+
ssr: server?.ssr,
|
|
6
|
+
ssrByEntries: server?.ssrByEntries,
|
|
7
|
+
nonce: security?.nonce,
|
|
8
|
+
inlineScripts: output?.inlineScripts,
|
|
9
|
+
inlineStyles: output?.inlineStyles,
|
|
10
|
+
crossorigin: html?.crossorigin,
|
|
11
|
+
scriptLoading: html?.scriptLoading,
|
|
12
|
+
useJsonScript: server?.useJsonScript,
|
|
13
|
+
enableAsyncEntry: source?.enableAsyncEntry
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export { createRequestHandlerConfig };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
import { sortRoutes } from "../utils/index.mjs";
|
|
4
|
+
function injectRoute(route) {
|
|
5
|
+
return async (c, next)=>{
|
|
6
|
+
if (route && !c.get('route')) c.set('route', route);
|
|
7
|
+
await next();
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function getPageRoutes(routes) {
|
|
11
|
+
return routes.filter((route)=>route.entryName).sort(sortRoutes);
|
|
12
|
+
}
|
|
13
|
+
const injectRoutePlugin = ()=>({
|
|
14
|
+
name: '@modern-js/plugin-inject-route',
|
|
15
|
+
setup (api) {
|
|
16
|
+
api.onPrepare(()=>{
|
|
17
|
+
const { middlewares, routes } = api.getServerContext();
|
|
18
|
+
if (!routes) return;
|
|
19
|
+
const pageRoutes = getPageRoutes(routes);
|
|
20
|
+
for (const route of pageRoutes){
|
|
21
|
+
const { urlPath: originUrlPath, entryName = MAIN_ENTRY_NAME } = route;
|
|
22
|
+
const urlPath = originUrlPath.endsWith('/') ? `${originUrlPath}*` : `${originUrlPath}/*`;
|
|
23
|
+
middlewares.push({
|
|
24
|
+
name: 'inject-route-info',
|
|
25
|
+
path: urlPath,
|
|
26
|
+
handler: injectRoute({
|
|
27
|
+
entryName,
|
|
28
|
+
urlPath: originUrlPath
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
export { injectRoutePlugin };
|