@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,150 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { time } from "@modern-js/runtime-utils/time";
|
|
3
|
+
import { SERVER_TIMING, ServerTimings } from "../constants.mjs";
|
|
4
|
+
function createMonitors() {
|
|
5
|
+
const coreMonitors = [];
|
|
6
|
+
const log = (level, message, args)=>{
|
|
7
|
+
const event = {
|
|
8
|
+
type: 'log',
|
|
9
|
+
payload: {
|
|
10
|
+
level,
|
|
11
|
+
message,
|
|
12
|
+
args
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
16
|
+
};
|
|
17
|
+
const mointors = {
|
|
18
|
+
push (monitor) {
|
|
19
|
+
coreMonitors.push(monitor);
|
|
20
|
+
},
|
|
21
|
+
error (message, ...args) {
|
|
22
|
+
log('error', message, args);
|
|
23
|
+
},
|
|
24
|
+
warn (message, ...args) {
|
|
25
|
+
log('warn', message, args);
|
|
26
|
+
},
|
|
27
|
+
debug (message, ...args) {
|
|
28
|
+
log('debug', message, args);
|
|
29
|
+
},
|
|
30
|
+
info (message, ...args) {
|
|
31
|
+
log('info', message, args);
|
|
32
|
+
},
|
|
33
|
+
trace (message, ...args) {
|
|
34
|
+
log('trace', message, args);
|
|
35
|
+
},
|
|
36
|
+
timing (name, dur, desc, tags, ...args) {
|
|
37
|
+
const event = {
|
|
38
|
+
type: 'timing',
|
|
39
|
+
payload: {
|
|
40
|
+
name,
|
|
41
|
+
dur,
|
|
42
|
+
desc,
|
|
43
|
+
tags,
|
|
44
|
+
args
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
48
|
+
},
|
|
49
|
+
counter (name, tags, ...args) {
|
|
50
|
+
const event = {
|
|
51
|
+
type: 'counter',
|
|
52
|
+
payload: {
|
|
53
|
+
name,
|
|
54
|
+
args,
|
|
55
|
+
tags
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return mointors;
|
|
62
|
+
}
|
|
63
|
+
const initMonitorsPlugin = ()=>({
|
|
64
|
+
name: '@modern-js/init-mointor',
|
|
65
|
+
setup (api) {
|
|
66
|
+
api.onPrepare(()=>{
|
|
67
|
+
const { middlewares } = api.getServerContext();
|
|
68
|
+
middlewares.push({
|
|
69
|
+
name: 'init-monitor',
|
|
70
|
+
handler: async (c, next)=>{
|
|
71
|
+
if (!c.get('monitors')) {
|
|
72
|
+
const monitors = createMonitors();
|
|
73
|
+
c.set('monitors', monitors);
|
|
74
|
+
}
|
|
75
|
+
return next();
|
|
76
|
+
},
|
|
77
|
+
order: 'pre'
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
const injectloggerPlugin = (inputLogger)=>({
|
|
83
|
+
name: '@modern-js/inject-logger',
|
|
84
|
+
setup (api) {
|
|
85
|
+
const logger = inputLogger;
|
|
86
|
+
api.onPrepare(()=>{
|
|
87
|
+
const { middlewares } = api.getServerContext();
|
|
88
|
+
middlewares.push({
|
|
89
|
+
name: 'inject-logger',
|
|
90
|
+
handler: async (c, next)=>{
|
|
91
|
+
const pathname = c.req.path;
|
|
92
|
+
const loggerMonitor = (event)=>{
|
|
93
|
+
if ('log' === event.type) {
|
|
94
|
+
const { level, message, args } = event.payload;
|
|
95
|
+
if ('trace' === level) logger.info(message, ...args || []);
|
|
96
|
+
else logger[level](message, ...args || []);
|
|
97
|
+
}
|
|
98
|
+
if ('timing' === event.type) {
|
|
99
|
+
const { name, dur, desc } = event.payload;
|
|
100
|
+
if (desc) logger.debug(`%s Debug - ${name}, cost: %s, req.url = %s `, desc, dur, pathname);
|
|
101
|
+
else logger.debug(`Debug - ${name}, cost: %s, req.url = %s`, dur, pathname);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const monitors = c.get('monitors');
|
|
105
|
+
monitors?.push(loggerMonitor);
|
|
106
|
+
return next();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
const injectServerTiming = ()=>({
|
|
113
|
+
name: '@modern-js/inject-server-timing',
|
|
114
|
+
setup (api) {
|
|
115
|
+
api.onPrepare(()=>{
|
|
116
|
+
const { middlewares, metaName } = api.getServerContext();
|
|
117
|
+
middlewares.push({
|
|
118
|
+
name: 'inject-server-timing',
|
|
119
|
+
handler: async (c, next)=>{
|
|
120
|
+
const serverTimings = [];
|
|
121
|
+
const timingMonitor = (event)=>{
|
|
122
|
+
if ('timing' === event.type) serverTimings.push(event.payload);
|
|
123
|
+
};
|
|
124
|
+
const monitors = c.get('monitors');
|
|
125
|
+
monitors?.push(timingMonitor);
|
|
126
|
+
await next();
|
|
127
|
+
serverTimings.forEach((serverTiming)=>{
|
|
128
|
+
const { name, desc, dur } = serverTiming;
|
|
129
|
+
const _name = `bd-${metaName}-${name}`;
|
|
130
|
+
const value = `${_name};${desc ? `decs="${desc}";` : ''} dur=${dur}`;
|
|
131
|
+
c.header(SERVER_TIMING, value, {
|
|
132
|
+
append: true
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
function requestLatencyMiddleware() {
|
|
141
|
+
return async (c, next)=>{
|
|
142
|
+
const monitors = c.get('monitors');
|
|
143
|
+
if (!monitors) return void await next();
|
|
144
|
+
const getCost = time();
|
|
145
|
+
await next();
|
|
146
|
+
const cost = getCost();
|
|
147
|
+
monitors.timing(ServerTimings.SERVER_HANDLE_REQUEST, cost);
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
export { initMonitorsPlugin, injectServerTiming, injectloggerPlugin, requestLatencyMiddleware };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
const processedByPlugin = ()=>({
|
|
3
|
+
name: '@modern-js/plugin-processed',
|
|
4
|
+
setup (api) {
|
|
5
|
+
api.onPrepare(()=>{
|
|
6
|
+
const { middlewares } = api.getServerContext();
|
|
7
|
+
middlewares.push({
|
|
8
|
+
name: 'processed-by',
|
|
9
|
+
handler: async (c, next)=>{
|
|
10
|
+
await next();
|
|
11
|
+
c.header('X-Processed-By', 'Modern.js');
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
export { processedByPlugin };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
import { createRequestHandlerConfig } from "./utils.mjs";
|
|
4
|
+
const csrRscRender = async (req, options)=>{
|
|
5
|
+
const { routeInfo, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, reporter, monitors, onError, onTiming, staticGenerate, html } = options;
|
|
6
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
7
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
8
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
9
|
+
const config = createRequestHandlerConfig(options.config);
|
|
10
|
+
const requestHandlerOptions = {
|
|
11
|
+
resource: {
|
|
12
|
+
route: routeInfo,
|
|
13
|
+
loadableStats,
|
|
14
|
+
routeManifest,
|
|
15
|
+
entryName: routeInfo.entryName || MAIN_ENTRY_NAME
|
|
16
|
+
},
|
|
17
|
+
config,
|
|
18
|
+
params,
|
|
19
|
+
loaderContext,
|
|
20
|
+
html,
|
|
21
|
+
rscSSRManifest,
|
|
22
|
+
rscClientManifest,
|
|
23
|
+
rscServerManifest,
|
|
24
|
+
locals,
|
|
25
|
+
staticGenerate,
|
|
26
|
+
monitors,
|
|
27
|
+
onError,
|
|
28
|
+
onTiming,
|
|
29
|
+
reporter: reporter
|
|
30
|
+
};
|
|
31
|
+
if (!serverBundle) return new Response('Cannot find server bundle for RSC', {
|
|
32
|
+
status: 500
|
|
33
|
+
});
|
|
34
|
+
const renderRscStreamHandler = await serverBundle.renderRscStreamHandler;
|
|
35
|
+
if (!renderRscStreamHandler) return new Response('Cannot find render handler for RSC', {
|
|
36
|
+
status: 500
|
|
37
|
+
});
|
|
38
|
+
const response = await renderRscStreamHandler(req, requestHandlerOptions);
|
|
39
|
+
return response;
|
|
40
|
+
};
|
|
41
|
+
export { csrRscRender };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
const dataHandler = async (request, { routeInfo, serverRoutes, monitors, onError, onTiming, serverManifest, loaderContext })=>{
|
|
4
|
+
const serverLoaderModule = serverManifest?.loaderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
5
|
+
if (!serverLoaderModule) return;
|
|
6
|
+
const { routes, handleRequest } = serverLoaderModule;
|
|
7
|
+
const response = await handleRequest({
|
|
8
|
+
request,
|
|
9
|
+
serverRoutes,
|
|
10
|
+
context: {
|
|
11
|
+
monitors,
|
|
12
|
+
loaderContext
|
|
13
|
+
},
|
|
14
|
+
onTiming,
|
|
15
|
+
onError,
|
|
16
|
+
routes
|
|
17
|
+
});
|
|
18
|
+
return response;
|
|
19
|
+
};
|
|
20
|
+
export { dataHandler };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { getLoaderCtx } from "../../helper.mjs";
|
|
3
|
+
import { sortRoutes } from "../../utils/index.mjs";
|
|
4
|
+
import { requestLatencyMiddleware } from "../monitors.mjs";
|
|
5
|
+
export * from "./inject.mjs";
|
|
6
|
+
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
7
|
+
function escapeRegexSpecialChars(path) {
|
|
8
|
+
return path.replace(/[()[\]{}*+?.^$|\\]/g, '\\$&');
|
|
9
|
+
}
|
|
10
|
+
const renderPlugin = ()=>({
|
|
11
|
+
name: '@modern-js/plugin-render',
|
|
12
|
+
setup (api) {
|
|
13
|
+
api.onPrepare(async ()=>{
|
|
14
|
+
const { middlewares, routes, render, renderMiddlewares } = api.getServerContext();
|
|
15
|
+
if (!routes) return;
|
|
16
|
+
const pageRoutes = getPageRoutes(routes);
|
|
17
|
+
middlewares.push({
|
|
18
|
+
name: 'page-latency',
|
|
19
|
+
handler: requestLatencyMiddleware()
|
|
20
|
+
});
|
|
21
|
+
for (const route of pageRoutes){
|
|
22
|
+
const { urlPath: originUrlPath } = route;
|
|
23
|
+
const isDynamic = DYNAMIC_ROUTE_REG.test(originUrlPath);
|
|
24
|
+
const escapedPath = isDynamic ? originUrlPath : escapeRegexSpecialChars(originUrlPath);
|
|
25
|
+
const urlPath = escapedPath.endsWith('/') ? `${escapedPath}*` : `${escapedPath}/*`;
|
|
26
|
+
renderMiddlewares?.forEach((m)=>{
|
|
27
|
+
middlewares.push({
|
|
28
|
+
name: m.name,
|
|
29
|
+
path: urlPath,
|
|
30
|
+
handler: m.handler
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
render && middlewares.push({
|
|
34
|
+
name: "render",
|
|
35
|
+
path: urlPath,
|
|
36
|
+
handler: createRenderHandler(render)
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
function getPageRoutes(routes) {
|
|
43
|
+
return routes.filter((route)=>!route.isApi).sort(sortRoutes);
|
|
44
|
+
}
|
|
45
|
+
function createRenderHandler(render) {
|
|
46
|
+
return async (c, _)=>{
|
|
47
|
+
const reporter = c.get('reporter');
|
|
48
|
+
const monitors = c.get('monitors');
|
|
49
|
+
const templates = c.get('templates') || {};
|
|
50
|
+
const serverManifest = c.get('serverManifest') || {};
|
|
51
|
+
const rscServerManifest = c.get('rscServerManifest');
|
|
52
|
+
const rscClientManifest = c.get('rscClientManifest');
|
|
53
|
+
const rscSSRManifest = c.get('rscSSRManifest');
|
|
54
|
+
const locals = c.get('locals');
|
|
55
|
+
c.get('metrics');
|
|
56
|
+
const matchPathname = c.get('matchPathname');
|
|
57
|
+
const matchEntryName = c.get('matchEntryName');
|
|
58
|
+
const loaderContext = getLoaderCtx(c);
|
|
59
|
+
const contextForceCSR = c.get('forceCSR');
|
|
60
|
+
const request = c.req.raw;
|
|
61
|
+
const nodeReq = c.env.node?.req;
|
|
62
|
+
const res = await render(request, {
|
|
63
|
+
nodeReq,
|
|
64
|
+
monitors,
|
|
65
|
+
templates,
|
|
66
|
+
serverManifest,
|
|
67
|
+
rscServerManifest,
|
|
68
|
+
rscClientManifest,
|
|
69
|
+
rscSSRManifest,
|
|
70
|
+
loaderContext,
|
|
71
|
+
locals,
|
|
72
|
+
matchPathname,
|
|
73
|
+
matchEntryName,
|
|
74
|
+
contextForceCSR,
|
|
75
|
+
reporter
|
|
76
|
+
});
|
|
77
|
+
const { body, status, headers } = res;
|
|
78
|
+
const headersData = {};
|
|
79
|
+
headers.forEach((v, k)=>{
|
|
80
|
+
headersData[k] = v;
|
|
81
|
+
});
|
|
82
|
+
return c.body(body, status, headersData);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export { renderPlugin };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { createRender } from "./render.mjs";
|
|
3
|
+
const injectRenderHandlerPlugin = ({ staticGenerate, cacheConfig })=>({
|
|
4
|
+
name: '@modern-js/plugin-inject-render',
|
|
5
|
+
setup (api) {
|
|
6
|
+
api.onPrepare(async ()=>{
|
|
7
|
+
const { distDirectory: pwd, routes, metaName } = api.getServerContext();
|
|
8
|
+
const config = api.getServerConfig();
|
|
9
|
+
const hooks = api.getHooks();
|
|
10
|
+
if (!routes) return;
|
|
11
|
+
const onFallback = async (reason, error)=>{
|
|
12
|
+
await hooks.fallback.call({
|
|
13
|
+
reason,
|
|
14
|
+
error
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
const getRenderHandlerOptions = {
|
|
18
|
+
pwd: pwd,
|
|
19
|
+
routes,
|
|
20
|
+
config,
|
|
21
|
+
metaName,
|
|
22
|
+
cacheConfig: cacheConfig,
|
|
23
|
+
staticGenerate,
|
|
24
|
+
onFallback
|
|
25
|
+
};
|
|
26
|
+
const render = await getRenderHandler(getRenderHandlerOptions);
|
|
27
|
+
api.updateServerContext({
|
|
28
|
+
render,
|
|
29
|
+
getRenderOptions: getRenderHandlerOptions
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
async function getRenderHandler({ pwd, routes, config, cacheConfig, metaName, staticGenerate, onFallback }) {
|
|
35
|
+
const ssrConfig = config.server?.ssr;
|
|
36
|
+
const ssrByEntries = config.server?.ssrByEntries;
|
|
37
|
+
const forceCSR = 'object' == typeof ssrConfig ? ssrConfig.forceCSR : false;
|
|
38
|
+
const forceCSRMap = new Map();
|
|
39
|
+
if (ssrByEntries) Object.entries(ssrByEntries).forEach(([entryName, ssrConfig])=>{
|
|
40
|
+
forceCSRMap.set(entryName, 'object' == typeof ssrConfig ? ssrConfig.forceCSR ?? false : false);
|
|
41
|
+
});
|
|
42
|
+
const render = createRender({
|
|
43
|
+
routes,
|
|
44
|
+
pwd,
|
|
45
|
+
config,
|
|
46
|
+
staticGenerate,
|
|
47
|
+
cacheConfig,
|
|
48
|
+
forceCSR,
|
|
49
|
+
forceCSRMap,
|
|
50
|
+
nonce: config.security?.nonce,
|
|
51
|
+
metaName: metaName || 'modern-js',
|
|
52
|
+
onFallback
|
|
53
|
+
});
|
|
54
|
+
return render;
|
|
55
|
+
}
|
|
56
|
+
export { getRenderHandler, injectRenderHandlerPlugin };
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { cutNameByHyphen } from "@modern-js/utils/universal";
|
|
3
|
+
import { TrieRouter } from "hono/router/trie-router";
|
|
4
|
+
import { X_MODERNJS_RENDER } from "../../constants.mjs";
|
|
5
|
+
import { ErrorDigest, createErrorHtml, getPathname, getRuntimeEnv, parseHeaders, parseQuery, sortRoutes, uniqueKeyByRoute } from "../../utils/index.mjs";
|
|
6
|
+
import { csrRscRender } from "./csrRscRender.mjs";
|
|
7
|
+
import { dataHandler } from "./dataHandler.mjs";
|
|
8
|
+
import { renderRscHandler } from "./renderRscHandler.mjs";
|
|
9
|
+
import { serverActionHandler } from "./serverActionHandler.mjs";
|
|
10
|
+
import { ssrRender } from "./ssrRender.mjs";
|
|
11
|
+
import { __webpack_require__ } from "../../rslib-runtime.mjs";
|
|
12
|
+
import * as __rspack_external__modern_js_runtime_utils_router_2aa8d96f from "@modern-js/runtime-utils/router";
|
|
13
|
+
__webpack_require__.add({
|
|
14
|
+
"@modern-js/runtime-utils/router" (module) {
|
|
15
|
+
module.exports = __rspack_external__modern_js_runtime_utils_router_2aa8d96f;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
19
|
+
function getRouter(routes) {
|
|
20
|
+
const dynamicRoutes = [];
|
|
21
|
+
const normalRoutes = [];
|
|
22
|
+
routes.forEach((route)=>{
|
|
23
|
+
if (DYNAMIC_ROUTE_REG.test(route.urlPath)) dynamicRoutes.push(route);
|
|
24
|
+
else normalRoutes.push(route);
|
|
25
|
+
});
|
|
26
|
+
const finalRoutes = [
|
|
27
|
+
...normalRoutes.sort(sortRoutes),
|
|
28
|
+
...dynamicRoutes.sort(sortRoutes)
|
|
29
|
+
];
|
|
30
|
+
const router = new TrieRouter();
|
|
31
|
+
for (const route of finalRoutes){
|
|
32
|
+
const { urlPath: originUrlPath } = route;
|
|
33
|
+
const urlPath = originUrlPath.endsWith('/') ? `${originUrlPath}*` : `${originUrlPath}/*`;
|
|
34
|
+
router.add('*', urlPath, route);
|
|
35
|
+
}
|
|
36
|
+
return router;
|
|
37
|
+
}
|
|
38
|
+
function matchRoute(router, pathname, entryName) {
|
|
39
|
+
const matched = router.match('*', pathname);
|
|
40
|
+
const matchedRoutes = matched[0];
|
|
41
|
+
if (entryName && matchedRoutes.length > 1) {
|
|
42
|
+
for (const [route, params] of matchedRoutes)if (route.entryName === entryName) return [
|
|
43
|
+
route,
|
|
44
|
+
params
|
|
45
|
+
];
|
|
46
|
+
return [
|
|
47
|
+
void 0,
|
|
48
|
+
{}
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
{
|
|
52
|
+
const result = matchedRoutes[0];
|
|
53
|
+
if (!result) return [
|
|
54
|
+
void 0,
|
|
55
|
+
{}
|
|
56
|
+
];
|
|
57
|
+
return [
|
|
58
|
+
result[0],
|
|
59
|
+
result[1]
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function getHeadersWithoutCookie(headers) {
|
|
64
|
+
const _headers = {
|
|
65
|
+
...headers,
|
|
66
|
+
cookie: void 0
|
|
67
|
+
};
|
|
68
|
+
delete _headers.cookie;
|
|
69
|
+
return _headers;
|
|
70
|
+
}
|
|
71
|
+
async function createRender({ routes, pwd, metaName, staticGenerate, cacheConfig, forceCSR, forceCSRMap, config, onFallback }) {
|
|
72
|
+
const router = getRouter(routes);
|
|
73
|
+
return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, contextForceCSR, reporter })=>{
|
|
74
|
+
const forMatchpathname = matchPathname ?? getPathname(req);
|
|
75
|
+
const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
|
|
76
|
+
const framework = cutNameByHyphen(metaName || 'modern-js');
|
|
77
|
+
const fallbackHeader = `x-${framework}-ssr-fallback`;
|
|
78
|
+
let fallbackReason = null;
|
|
79
|
+
const fallbackWrapper = async (reason, error)=>{
|
|
80
|
+
fallbackReason = reason;
|
|
81
|
+
return onFallback?.(reason, error);
|
|
82
|
+
};
|
|
83
|
+
if (!routeInfo) return new Response(createErrorHtml(404), {
|
|
84
|
+
status: 404,
|
|
85
|
+
headers: {
|
|
86
|
+
'content-type': 'text/html; charset=UTF-8'
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const html = templates[uniqueKeyByRoute(routeInfo)];
|
|
90
|
+
if (!html) return new Response(createErrorHtml(404), {
|
|
91
|
+
status: 404,
|
|
92
|
+
headers: {
|
|
93
|
+
'content-type': 'text/html; charset=UTF-8'
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
const finalForceCSR = routeInfo.entryName ? forceCSRMap?.get(routeInfo.entryName) ?? forceCSR : forceCSR;
|
|
97
|
+
const renderMode = await getRenderMode(req, fallbackHeader, routeInfo.isSSR, finalForceCSR, nodeReq, fallbackWrapper, contextForceCSR);
|
|
98
|
+
const headerData = parseHeaders(req);
|
|
99
|
+
const onError = (e, key)=>{
|
|
100
|
+
monitors?.error(`SSR Error - ${key || (e instanceof Error ? e.name : e)}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, forMatchpathname, getHeadersWithoutCookie(headerData));
|
|
101
|
+
};
|
|
102
|
+
const onTiming = (name, dur)=>{
|
|
103
|
+
monitors?.timing(name, dur, 'SSR');
|
|
104
|
+
};
|
|
105
|
+
const renderOptions = {
|
|
106
|
+
pwd,
|
|
107
|
+
html,
|
|
108
|
+
routeInfo,
|
|
109
|
+
staticGenerate: staticGenerate || false,
|
|
110
|
+
config,
|
|
111
|
+
nodeReq,
|
|
112
|
+
cacheConfig,
|
|
113
|
+
serverRoutes: routes,
|
|
114
|
+
params,
|
|
115
|
+
monitors,
|
|
116
|
+
locals,
|
|
117
|
+
rscClientManifest,
|
|
118
|
+
rscSSRManifest,
|
|
119
|
+
rscServerManifest,
|
|
120
|
+
serverManifest,
|
|
121
|
+
loaderContext: loaderContext || new Map(),
|
|
122
|
+
onError,
|
|
123
|
+
onTiming,
|
|
124
|
+
reporter
|
|
125
|
+
};
|
|
126
|
+
if (fallbackReason) renderOptions.html = injectFallbackReasonToHtml({
|
|
127
|
+
html: renderOptions.html,
|
|
128
|
+
reason: fallbackReason,
|
|
129
|
+
framework
|
|
130
|
+
});
|
|
131
|
+
let response;
|
|
132
|
+
switch(renderMode){
|
|
133
|
+
case 'data':
|
|
134
|
+
response = await dataHandler(req, renderOptions) || await renderHandler(req, renderOptions, 'ssr', fallbackWrapper, framework);
|
|
135
|
+
break;
|
|
136
|
+
case 'rsc-tree':
|
|
137
|
+
response = await renderRscHandler(req, renderOptions);
|
|
138
|
+
break;
|
|
139
|
+
case 'rsc-action':
|
|
140
|
+
response = await serverActionHandler(req, renderOptions);
|
|
141
|
+
break;
|
|
142
|
+
case 'ssr':
|
|
143
|
+
case 'csr':
|
|
144
|
+
response = await renderHandler(req, renderOptions, renderMode, fallbackWrapper, framework);
|
|
145
|
+
break;
|
|
146
|
+
default:
|
|
147
|
+
throw new Error(`Unknown render mode: ${renderMode}`);
|
|
148
|
+
}
|
|
149
|
+
if (fallbackReason) response.headers.set(fallbackHeader, `1;reason=${fallbackReason}`);
|
|
150
|
+
return response;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async function renderHandler(request, options, mode, fallbackWrapper, framework) {
|
|
154
|
+
let response = null;
|
|
155
|
+
const { serverManifest } = options;
|
|
156
|
+
const ssrByRouteIds = options.config.server?.ssrByRouteIds;
|
|
157
|
+
const runtimeEnv = getRuntimeEnv();
|
|
158
|
+
if (serverManifest.nestedRoutesJson && ssrByRouteIds && ssrByRouteIds?.length > 0 && 'node' === runtimeEnv) {
|
|
159
|
+
const { nestedRoutesJson } = serverManifest;
|
|
160
|
+
const routes = nestedRoutesJson?.[options.routeInfo.entryName];
|
|
161
|
+
if (routes) {
|
|
162
|
+
const { matchRoutes } = __webpack_require__("@modern-js/runtime-utils/router");
|
|
163
|
+
const url = new URL(request.url);
|
|
164
|
+
const matchedRoutes = matchRoutes(routes, url.pathname, options.routeInfo.urlPath);
|
|
165
|
+
if (matchedRoutes) {
|
|
166
|
+
const lastMatch = matchedRoutes[matchedRoutes.length - 1];
|
|
167
|
+
if (!lastMatch?.route?.id || !ssrByRouteIds.includes(lastMatch.route.id)) response = await csrRender(request, options);
|
|
168
|
+
} else response = await csrRender(request, options);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if ('ssr' !== mode || response) response = await csrRender(request, options);
|
|
172
|
+
else try {
|
|
173
|
+
response = await ssrRender(request, options);
|
|
174
|
+
} catch (e) {
|
|
175
|
+
options.onError(e, ErrorDigest.ERENDER);
|
|
176
|
+
await fallbackWrapper('error', e);
|
|
177
|
+
response = await csrRender(request, {
|
|
178
|
+
...options,
|
|
179
|
+
html: injectFallbackReasonToHtml({
|
|
180
|
+
html: options.html,
|
|
181
|
+
reason: 'error',
|
|
182
|
+
framework
|
|
183
|
+
})
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const { routeInfo } = options;
|
|
187
|
+
applyExtendHeaders(response, routeInfo);
|
|
188
|
+
return response;
|
|
189
|
+
function applyExtendHeaders(r, route) {
|
|
190
|
+
Object.entries(route.responseHeaders || {}).forEach(([k, v])=>{
|
|
191
|
+
r.headers.set(k, v);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function getRenderMode(req, fallbackHeader, isSSR, forceCSR, nodeReq, onFallback, contextForceCSR) {
|
|
196
|
+
const query = parseQuery(req);
|
|
197
|
+
if (req.headers.get('x-rsc-action')) return 'rsc-action';
|
|
198
|
+
if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
|
|
199
|
+
if (!isSSR) return 'csr';
|
|
200
|
+
{
|
|
201
|
+
if (query.__loader) return 'data';
|
|
202
|
+
const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
|
|
203
|
+
if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
|
|
204
|
+
if (query.csr) await onFallback?.('query');
|
|
205
|
+
else {
|
|
206
|
+
const reason = fallbackHeaderValue?.split(';')[1]?.split('=')[1];
|
|
207
|
+
await onFallback?.(reason ? `header,${reason}` : 'header');
|
|
208
|
+
}
|
|
209
|
+
return 'csr';
|
|
210
|
+
}
|
|
211
|
+
return 'ssr';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function injectFallbackReasonToHtml({ html, reason, framework }) {
|
|
215
|
+
const tag = `<script id="__${framework}_ssr_fallback_reason__" type="application/json">${JSON.stringify({
|
|
216
|
+
reason
|
|
217
|
+
})}</script>`;
|
|
218
|
+
return html.replace(/<\/head>/, `${tag}</head>`);
|
|
219
|
+
}
|
|
220
|
+
async function csrRender(request, options) {
|
|
221
|
+
const { html } = options;
|
|
222
|
+
if (process.env.MODERN_DISABLE_INJECT_RSC_DATA || !options.routeInfo.isRSC) return new Response(html, {
|
|
223
|
+
status: 200,
|
|
224
|
+
headers: new Headers({
|
|
225
|
+
'content-type': 'text/html; charset=UTF-8',
|
|
226
|
+
[X_MODERNJS_RENDER]: 'client'
|
|
227
|
+
})
|
|
228
|
+
});
|
|
229
|
+
return csrRscRender(request, options);
|
|
230
|
+
}
|
|
231
|
+
export { createRender };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
import { createRequestHandlerConfig } from "./utils.mjs";
|
|
4
|
+
const renderRscHandler = async (req, options)=>{
|
|
5
|
+
const { routeInfo, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, monitors, onError, onTiming, staticGenerate } = options;
|
|
6
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
7
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
8
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
9
|
+
const config = createRequestHandlerConfig(options.config);
|
|
10
|
+
const requestHandlerOptions = {
|
|
11
|
+
resource: {
|
|
12
|
+
route: routeInfo,
|
|
13
|
+
loadableStats,
|
|
14
|
+
routeManifest,
|
|
15
|
+
entryName: routeInfo.entryName || MAIN_ENTRY_NAME
|
|
16
|
+
},
|
|
17
|
+
config,
|
|
18
|
+
params,
|
|
19
|
+
loaderContext,
|
|
20
|
+
rscSSRManifest,
|
|
21
|
+
rscClientManifest,
|
|
22
|
+
rscServerManifest,
|
|
23
|
+
locals,
|
|
24
|
+
staticGenerate,
|
|
25
|
+
monitors,
|
|
26
|
+
onError,
|
|
27
|
+
onTiming,
|
|
28
|
+
reporter: options.reporter
|
|
29
|
+
};
|
|
30
|
+
if (!serverBundle) return new Response('Cannot find server bundle for RSC', {
|
|
31
|
+
status: 500
|
|
32
|
+
});
|
|
33
|
+
const rscPayloadHandler = await serverBundle.rscPayloadHandler;
|
|
34
|
+
if (!rscPayloadHandler) return new Response('Cannot find request handler for RSC', {
|
|
35
|
+
status: 500
|
|
36
|
+
});
|
|
37
|
+
return rscPayloadHandler(req, requestHandlerOptions);
|
|
38
|
+
};
|
|
39
|
+
export { renderRscHandler };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
3
|
+
const serverActionHandler = async (req, { serverManifest, routeInfo, rscClientManifest })=>{
|
|
4
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
5
|
+
if (!serverBundle) return new Response('Cannot find server bundle for server action', {
|
|
6
|
+
status: 500
|
|
7
|
+
});
|
|
8
|
+
const { handleAction } = serverBundle;
|
|
9
|
+
if (!handleAction) return new Response('Cannot find server action handler', {
|
|
10
|
+
status: 500
|
|
11
|
+
});
|
|
12
|
+
return handleAction(req);
|
|
13
|
+
};
|
|
14
|
+
export { serverActionHandler };
|