@modern-js/server-core 2.69.5 → 3.0.0-alpha.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/dist/cjs/adapters/node/helper/index.js +52 -39
- package/dist/cjs/adapters/node/helper/loadCache.js +52 -47
- package/dist/cjs/adapters/node/helper/loadConfig.js +69 -85
- package/dist/cjs/adapters/node/helper/loadEnv.js +60 -50
- package/dist/cjs/adapters/node/helper/loadPlugin.js +40 -32
- package/dist/cjs/adapters/node/helper/utils.js +33 -28
- package/dist/cjs/adapters/node/hono.js +87 -99
- package/dist/cjs/adapters/node/index.js +84 -60
- package/dist/cjs/adapters/node/node.js +164 -190
- package/dist/cjs/adapters/node/plugins/index.js +69 -23
- package/dist/cjs/adapters/node/plugins/nodeServer.js +39 -34
- package/dist/cjs/adapters/node/plugins/resource.js +186 -181
- package/dist/cjs/adapters/node/plugins/static.js +152 -164
- package/dist/cjs/constants.js +70 -57
- package/dist/cjs/context.js +37 -28
- package/dist/cjs/helper.js +40 -33
- package/dist/cjs/hono.js +46 -0
- package/dist/cjs/index.js +236 -57
- package/dist/cjs/plugins/compat/hooks.js +71 -83
- package/dist/cjs/plugins/compat/index.js +59 -60
- package/dist/cjs/plugins/default.js +52 -47
- package/dist/cjs/plugins/favicon.js +43 -39
- package/dist/cjs/plugins/index.js +73 -54
- package/dist/cjs/plugins/log.js +82 -87
- package/dist/cjs/plugins/middlewares.js +43 -37
- package/dist/cjs/plugins/monitors.js +178 -187
- package/dist/cjs/plugins/processedBy.js +45 -39
- package/dist/cjs/plugins/render/csrRscRender.js +70 -71
- package/dist/cjs/plugins/render/dataHandler.js +49 -45
- package/dist/cjs/plugins/render/index.js +152 -126
- package/dist/cjs/plugins/render/inject.js +84 -86
- package/dist/cjs/plugins/render/render.js +244 -271
- package/dist/cjs/plugins/render/renderRscHandler.js +68 -69
- package/dist/cjs/plugins/render/serverActionHandler.js +45 -44
- package/dist/cjs/plugins/render/ssrCache.js +173 -191
- package/dist/cjs/plugins/render/ssrRender.js +89 -94
- package/dist/cjs/plugins/render/utils.js +44 -36
- package/dist/cjs/plugins/route.js +60 -57
- package/dist/cjs/serverBase.js +164 -162
- package/dist/cjs/types/config/bff.js +17 -15
- package/dist/cjs/types/config/dev.js +17 -15
- package/dist/cjs/types/config/html.js +17 -15
- package/dist/cjs/types/config/index.js +90 -29
- package/dist/cjs/types/config/output.js +17 -15
- package/dist/cjs/types/config/security.js +17 -15
- package/dist/cjs/types/config/server.js +17 -15
- package/dist/cjs/types/config/share.js +17 -15
- package/dist/cjs/types/config/source.js +17 -15
- package/dist/cjs/types/config/tools.js +17 -15
- package/dist/cjs/types/index.js +76 -25
- package/dist/cjs/types/plugins/base.js +17 -15
- package/dist/cjs/types/plugins/index.js +55 -21
- package/dist/cjs/types/plugins/plugin.js +18 -0
- package/dist/cjs/types/render.js +17 -15
- package/dist/cjs/types/requestHandler.js +17 -15
- package/dist/cjs/types/server.js +17 -15
- package/dist/cjs/utils/entry.js +37 -32
- package/dist/cjs/utils/env.js +46 -40
- package/dist/cjs/utils/error.js +56 -50
- package/dist/cjs/utils/index.js +111 -33
- package/dist/cjs/utils/middlewareCollector.js +58 -49
- package/dist/cjs/utils/publicDir.js +92 -0
- package/dist/cjs/utils/request.js +73 -65
- package/dist/cjs/utils/serverConfig.js +39 -31
- package/dist/cjs/utils/storage.js +58 -68
- package/dist/cjs/utils/transformStream.js +57 -53
- package/dist/cjs/utils/warmup.js +34 -27
- package/dist/esm/adapters/node/helper/index.mjs +6 -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 +2 -0
- package/dist/esm/adapters/node/hono.mjs +53 -0
- package/dist/esm/adapters/node/index.mjs +5 -0
- package/dist/esm/adapters/node/node.mjs +129 -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 +118 -0
- package/dist/esm/constants.mjs +28 -0
- package/dist/{esm-node/context.js → esm/context.mjs} +1 -4
- package/dist/esm/helper.mjs +11 -0
- package/dist/esm/hono.mjs +3 -0
- package/dist/esm/index.mjs +13 -0
- package/dist/esm/plugins/compat/hooks.mjs +40 -0
- package/dist/esm/plugins/compat/index.mjs +27 -0
- package/dist/esm/plugins/default.mjs +25 -0
- package/dist/esm/plugins/favicon.mjs +14 -0
- package/dist/{esm-node/plugins/index.js → esm/plugins/index.mjs} +2 -15
- package/dist/esm/plugins/log.mjs +58 -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 +43 -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 +226 -0
- package/dist/esm/plugins/render/renderRscHandler.mjs +41 -0
- package/dist/esm/plugins/render/serverActionHandler.mjs +18 -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/serverBase.mjs +136 -0
- package/dist/esm/types/plugins/index.mjs +1 -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-node/utils/index.js → esm/utils/index.mjs} +1 -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 +30 -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 +14 -0
- package/dist/esm-node/adapters/node/helper/loadConfig.mjs +31 -0
- package/dist/esm-node/adapters/node/helper/loadEnv.mjs +22 -0
- package/dist/esm-node/adapters/node/helper/loadPlugin.mjs +13 -0
- package/dist/esm-node/adapters/node/helper/utils.mjs +2 -0
- package/dist/esm-node/adapters/node/hono.mjs +53 -0
- package/dist/esm-node/adapters/node/index.mjs +5 -0
- package/dist/esm-node/adapters/node/node.mjs +129 -0
- package/dist/esm-node/adapters/node/plugins/index.mjs +3 -0
- package/dist/esm-node/adapters/node/plugins/nodeServer.mjs +9 -0
- package/dist/esm-node/adapters/node/plugins/resource.mjs +138 -0
- package/dist/esm-node/adapters/node/plugins/static.mjs +118 -0
- package/dist/esm-node/constants.mjs +28 -0
- package/dist/esm-node/context.mjs +3 -0
- package/dist/esm-node/helper.mjs +11 -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 +40 -0
- package/dist/esm-node/plugins/compat/index.mjs +27 -0
- package/dist/esm-node/plugins/default.mjs +25 -0
- package/dist/esm-node/plugins/favicon.mjs +14 -0
- package/dist/esm-node/plugins/index.mjs +9 -0
- package/dist/esm-node/plugins/log.mjs +58 -0
- package/dist/esm-node/plugins/middlewares.mjs +15 -0
- package/dist/esm-node/plugins/monitors.mjs +149 -0
- package/dist/esm-node/plugins/processedBy.mjs +16 -0
- package/dist/esm-node/plugins/render/csrRscRender.mjs +43 -0
- package/dist/esm-node/plugins/render/dataHandler.mjs +19 -0
- package/dist/esm-node/plugins/render/index.mjs +84 -0
- package/dist/esm-node/plugins/render/inject.mjs +55 -0
- package/dist/esm-node/plugins/render/render.mjs +226 -0
- package/dist/esm-node/plugins/render/renderRscHandler.mjs +41 -0
- package/dist/esm-node/plugins/render/serverActionHandler.mjs +18 -0
- package/dist/esm-node/plugins/render/ssrCache.mjs +158 -0
- package/dist/esm-node/plugins/render/ssrRender.mjs +62 -0
- package/dist/esm-node/plugins/render/utils.mjs +15 -0
- package/dist/esm-node/plugins/route.mjs +34 -0
- package/dist/esm-node/serverBase.mjs +136 -0
- package/dist/esm-node/types/config/index.mjs +6 -0
- package/dist/esm-node/types/index.mjs +4 -0
- package/dist/esm-node/types/plugins/index.mjs +1 -0
- package/dist/esm-node/utils/entry.mjs +3 -0
- package/dist/esm-node/utils/env.mjs +14 -0
- package/dist/esm-node/utils/error.mjs +53 -0
- package/dist/esm-node/utils/index.mjs +9 -0
- package/dist/esm-node/utils/middlewareCollector.mjs +26 -0
- package/dist/esm-node/utils/publicDir.mjs +33 -0
- package/dist/esm-node/utils/request.mjs +40 -0
- package/dist/esm-node/utils/serverConfig.mjs +9 -0
- package/dist/esm-node/utils/storage.mjs +30 -0
- package/dist/esm-node/utils/transformStream.mjs +28 -0
- package/dist/esm-node/utils/warmup.mjs +6 -0
- package/dist/types/adapters/node/helper/loadConfig.d.ts +1 -1
- package/dist/types/adapters/node/plugins/nodeServer.d.ts +2 -2
- package/dist/types/adapters/node/plugins/resource.d.ts +3 -3
- package/dist/types/adapters/node/plugins/static.d.ts +3 -2
- package/dist/types/hono.d.ts +3 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/plugins/compat/hooks.d.ts +1 -1
- package/dist/types/plugins/default.d.ts +2 -2
- package/dist/types/plugins/favicon.d.ts +2 -2
- package/dist/types/plugins/log.d.ts +2 -2
- package/dist/types/plugins/middlewares.d.ts +2 -2
- package/dist/types/plugins/monitors.d.ts +4 -4
- package/dist/types/plugins/processedBy.d.ts +2 -2
- package/dist/types/plugins/render/dataHandler.d.ts +1 -1
- package/dist/types/plugins/render/index.d.ts +2 -2
- package/dist/types/plugins/render/inject.d.ts +2 -2
- package/dist/types/plugins/render/ssrRender.d.ts +3 -5
- package/dist/types/plugins/route.d.ts +2 -2
- package/dist/types/serverBase.d.ts +14 -20
- package/dist/types/types/config/bff.d.ts +0 -2
- package/dist/types/types/config/html.d.ts +0 -1
- package/dist/types/types/config/index.d.ts +0 -6
- package/dist/types/types/config/output.d.ts +2 -8
- package/dist/types/types/config/server.d.ts +1 -1
- package/dist/types/types/plugins/base.d.ts +5 -26
- package/dist/types/types/plugins/index.d.ts +1 -2
- package/dist/types/types/plugins/{new.d.ts → plugin.d.ts} +6 -4
- package/dist/types/types/render.d.ts +2 -5
- package/dist/types/types/requestHandler.d.ts +3 -7
- package/dist/types/types/server.d.ts +2 -1
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/publicDir.d.ts +40 -0
- package/dist/types/utils/transformStream.d.ts +1 -1
- package/package.json +25 -29
- package/rslib.config.mts +4 -0
- package/rstest.config.ts +7 -0
- package/dist/cjs/plugins/customServer/base.js +0 -186
- package/dist/cjs/plugins/customServer/context.js +0 -70
- package/dist/cjs/plugins/customServer/index.js +0 -210
- package/dist/cjs/plugins/customServer/routerApi.js +0 -44
- package/dist/cjs/plugins/customServer/template.js +0 -58
- package/dist/cjs/types/plugins/new.js +0 -16
- package/dist/cjs/types/plugins/old.js +0 -16
- package/dist/esm/adapters/node/helper/index.js +0 -13
- package/dist/esm/adapters/node/helper/loadCache.js +0 -44
- package/dist/esm/adapters/node/helper/loadConfig.js +0 -157
- package/dist/esm/adapters/node/helper/loadEnv.js +0 -73
- package/dist/esm/adapters/node/helper/loadPlugin.js +0 -59
- package/dist/esm/adapters/node/helper/utils.js +0 -7
- package/dist/esm/adapters/node/hono.js +0 -148
- package/dist/esm/adapters/node/index.js +0 -23
- package/dist/esm/adapters/node/node.js +0 -357
- package/dist/esm/adapters/node/plugins/index.js +0 -3
- package/dist/esm/adapters/node/plugins/nodeServer.js +0 -18
- package/dist/esm/adapters/node/plugins/resource.js +0 -543
- package/dist/esm/adapters/node/plugins/static.js +0 -245
- package/dist/esm/constants.js +0 -35
- package/dist/esm/context.js +0 -6
- package/dist/esm/helper.js +0 -14
- package/dist/esm/index.js +0 -22
- package/dist/esm/plugins/compat/hooks.js +0 -70
- package/dist/esm/plugins/compat/index.js +0 -45
- package/dist/esm/plugins/customServer/base.js +0 -218
- package/dist/esm/plugins/customServer/context.js +0 -66
- package/dist/esm/plugins/customServer/index.js +0 -369
- package/dist/esm/plugins/customServer/routerApi.js +0 -26
- package/dist/esm/plugins/customServer/template.js +0 -47
- package/dist/esm/plugins/default.js +0 -31
- package/dist/esm/plugins/favicon.js +0 -34
- package/dist/esm/plugins/index.js +0 -22
- package/dist/esm/plugins/log.js +0 -106
- package/dist/esm/plugins/middlewares.js +0 -22
- package/dist/esm/plugins/monitors.js +0 -287
- package/dist/esm/plugins/processedBy.js +0 -42
- package/dist/esm/plugins/render/csrRscRender.js +0 -88
- package/dist/esm/plugins/render/dataHandler.js +0 -48
- package/dist/esm/plugins/render/index.js +0 -215
- package/dist/esm/plugins/render/inject.js +0 -126
- package/dist/esm/plugins/render/render.js +0 -572
- package/dist/esm/plugins/render/renderRscHandler.js +0 -81
- package/dist/esm/plugins/render/serverActionHandler.js +0 -49
- package/dist/esm/plugins/render/ssrCache.js +0 -305
- package/dist/esm/plugins/render/ssrRender.js +0 -124
- package/dist/esm/plugins/render/utils.js +0 -17
- package/dist/esm/plugins/route.js +0 -92
- package/dist/esm/serverBase.js +0 -248
- package/dist/esm/types/config/index.js +0 -6
- package/dist/esm/types/index.js +0 -4
- package/dist/esm/types/plugins/index.js +0 -2
- package/dist/esm/types/requestHandler.js +0 -0
- package/dist/esm/types/server.js +0 -0
- package/dist/esm/utils/entry.js +0 -10
- package/dist/esm/utils/env.js +0 -20
- package/dist/esm/utils/error.js +0 -33
- package/dist/esm/utils/index.js +0 -8
- package/dist/esm/utils/middlewareCollector.js +0 -31
- package/dist/esm/utils/request.js +0 -51
- package/dist/esm/utils/serverConfig.js +0 -13
- package/dist/esm/utils/storage.js +0 -38
- package/dist/esm/utils/transformStream.js +0 -104
- package/dist/esm/utils/warmup.js +0 -9
- package/dist/esm-node/adapters/node/helper/index.js +0 -13
- package/dist/esm-node/adapters/node/helper/loadCache.js +0 -19
- package/dist/esm-node/adapters/node/helper/loadConfig.js +0 -59
- package/dist/esm-node/adapters/node/helper/loadEnv.js +0 -22
- package/dist/esm-node/adapters/node/helper/loadPlugin.js +0 -15
- package/dist/esm-node/adapters/node/helper/utils.js +0 -7
- package/dist/esm-node/adapters/node/hono.js +0 -79
- package/dist/esm-node/adapters/node/index.js +0 -23
- package/dist/esm-node/adapters/node/node.js +0 -169
- package/dist/esm-node/adapters/node/plugins/nodeServer.js +0 -14
- package/dist/esm-node/adapters/node/plugins/resource.js +0 -159
- package/dist/esm-node/adapters/node/plugins/static.js +0 -144
- package/dist/esm-node/constants.js +0 -35
- package/dist/esm-node/helper.js +0 -14
- package/dist/esm-node/index.js +0 -22
- package/dist/esm-node/plugins/compat/hooks.js +0 -66
- package/dist/esm-node/plugins/compat/index.js +0 -40
- package/dist/esm-node/plugins/customServer/base.js +0 -162
- package/dist/esm-node/plugins/customServer/context.js +0 -43
- package/dist/esm-node/plugins/customServer/index.js +0 -185
- package/dist/esm-node/plugins/customServer/routerApi.js +0 -20
- package/dist/esm-node/plugins/customServer/template.js +0 -34
- package/dist/esm-node/plugins/default.js +0 -30
- package/dist/esm-node/plugins/favicon.js +0 -20
- package/dist/esm-node/plugins/log.js +0 -73
- package/dist/esm-node/plugins/middlewares.js +0 -19
- package/dist/esm-node/plugins/monitors.js +0 -174
- package/dist/esm-node/plugins/processedBy.js +0 -20
- package/dist/esm-node/plugins/render/csrRscRender.js +0 -54
- package/dist/esm-node/plugins/render/dataHandler.js +0 -25
- package/dist/esm-node/plugins/render/index.js +0 -106
- package/dist/esm-node/plugins/render/inject.js +0 -69
- package/dist/esm-node/plugins/render/render.js +0 -253
- package/dist/esm-node/plugins/render/renderRscHandler.js +0 -52
- package/dist/esm-node/plugins/render/serverActionHandler.js +0 -27
- package/dist/esm-node/plugins/render/ssrCache.js +0 -190
- package/dist/esm-node/plugins/render/ssrRender.js +0 -77
- package/dist/esm-node/plugins/render/utils.js +0 -17
- package/dist/esm-node/plugins/route.js +0 -41
- package/dist/esm-node/serverBase.js +0 -146
- package/dist/esm-node/types/plugins/index.js +0 -2
- package/dist/esm-node/utils/entry.js +0 -10
- package/dist/esm-node/utils/env.js +0 -20
- package/dist/esm-node/utils/error.js +0 -61
- package/dist/esm-node/utils/middlewareCollector.js +0 -29
- package/dist/esm-node/utils/request.js +0 -50
- package/dist/esm-node/utils/serverConfig.js +0 -11
- package/dist/esm-node/utils/storage.js +0 -40
- package/dist/esm-node/utils/transformStream.js +0 -36
- package/dist/esm-node/utils/warmup.js +0 -9
- package/dist/types/plugins/customServer/base.d.ts +0 -7
- package/dist/types/plugins/customServer/context.d.ts +0 -8
- package/dist/types/plugins/customServer/index.d.ts +0 -11
- package/dist/types/plugins/customServer/routerApi.d.ts +0 -9
- package/dist/types/plugins/customServer/template.d.ts +0 -11
- package/dist/types/types/plugins/old.d.ts +0 -56
- /package/dist/{esm-node/adapters/node/plugins/index.js → esm/adapters/node/plugins/index.mjs} +0 -0
- /package/dist/{esm-node/types/server.js → esm/types/config/bff.mjs} +0 -0
- /package/dist/esm/types/config/{bff.js → dev.mjs} +0 -0
- /package/dist/esm/types/config/{dev.js → html.mjs} +0 -0
- /package/dist/{esm-node/types/config/index.js → esm/types/config/index.mjs} +0 -0
- /package/dist/esm/types/config/{html.js → output.mjs} +0 -0
- /package/dist/esm/types/config/{output.js → security.mjs} +0 -0
- /package/dist/esm/types/config/{security.js → server.mjs} +0 -0
- /package/dist/esm/types/config/{server.js → share.mjs} +0 -0
- /package/dist/esm/types/config/{share.js → source.mjs} +0 -0
- /package/dist/esm/types/config/{source.js → tools.mjs} +0 -0
- /package/dist/{esm-node/types/index.js → esm/types/index.mjs} +0 -0
- /package/dist/esm/types/{config/tools.js → plugins/base.mjs} +0 -0
- /package/dist/esm/types/plugins/{base.js → plugin.mjs} +0 -0
- /package/dist/esm/types/{plugins/new.js → render.mjs} +0 -0
- /package/dist/esm/types/{plugins/old.js → requestHandler.mjs} +0 -0
- /package/dist/esm/types/{render.js → server.mjs} +0 -0
- /package/dist/esm-node/types/config/{bff.js → bff.mjs} +0 -0
- /package/dist/esm-node/types/config/{dev.js → dev.mjs} +0 -0
- /package/dist/esm-node/types/config/{html.js → html.mjs} +0 -0
- /package/dist/esm-node/types/config/{output.js → output.mjs} +0 -0
- /package/dist/esm-node/types/config/{security.js → security.mjs} +0 -0
- /package/dist/esm-node/types/config/{server.js → server.mjs} +0 -0
- /package/dist/esm-node/types/config/{share.js → share.mjs} +0 -0
- /package/dist/esm-node/types/config/{source.js → source.mjs} +0 -0
- /package/dist/esm-node/types/config/{tools.js → tools.mjs} +0 -0
- /package/dist/esm-node/types/plugins/{base.js → base.mjs} +0 -0
- /package/dist/esm-node/types/plugins/{new.js → plugin.mjs} +0 -0
- /package/dist/esm-node/types/{plugins/old.js → render.mjs} +0 -0
- /package/dist/esm-node/types/{render.js → requestHandler.mjs} +0 -0
- /package/dist/esm-node/types/{requestHandler.js → server.mjs} +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
import { createRequestHandlerConfig } from "./utils";
|
|
3
|
+
const renderRscHandler = async (req, options)=>{
|
|
4
|
+
const { routeInfo, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, monitors, onError, onTiming, staticGenerate } = options;
|
|
5
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
6
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
7
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
8
|
+
const config = createRequestHandlerConfig(options.config);
|
|
9
|
+
const requestHandlerOptions = {
|
|
10
|
+
resource: {
|
|
11
|
+
route: routeInfo,
|
|
12
|
+
loadableStats,
|
|
13
|
+
routeManifest,
|
|
14
|
+
entryName: routeInfo.entryName || MAIN_ENTRY_NAME
|
|
15
|
+
},
|
|
16
|
+
config,
|
|
17
|
+
params,
|
|
18
|
+
loaderContext,
|
|
19
|
+
rscSSRManifest,
|
|
20
|
+
rscClientManifest,
|
|
21
|
+
rscServerManifest,
|
|
22
|
+
locals,
|
|
23
|
+
staticGenerate,
|
|
24
|
+
monitors,
|
|
25
|
+
onError,
|
|
26
|
+
onTiming,
|
|
27
|
+
reporter: options.reporter
|
|
28
|
+
};
|
|
29
|
+
if (!serverBundle) return new Response('Cannot find server bundle for RSC', {
|
|
30
|
+
status: 500
|
|
31
|
+
});
|
|
32
|
+
const rscPayloadHandler = await serverBundle.rscPayloadHandler;
|
|
33
|
+
if (!rscPayloadHandler) return new Response('Cannot find request handler for RSC', {
|
|
34
|
+
status: 500
|
|
35
|
+
});
|
|
36
|
+
if (!rscClientManifest) return new Response('Cannot find rsc client manifest', {
|
|
37
|
+
status: 500
|
|
38
|
+
});
|
|
39
|
+
return rscPayloadHandler(req, requestHandlerOptions);
|
|
40
|
+
};
|
|
41
|
+
export { renderRscHandler };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
const serverActionHandler = async (req, { serverManifest, routeInfo, rscClientManifest })=>{
|
|
3
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
4
|
+
if (!serverBundle) return new Response('Cannot find server bundle for server action', {
|
|
5
|
+
status: 500
|
|
6
|
+
});
|
|
7
|
+
const { handleAction } = serverBundle;
|
|
8
|
+
if (!handleAction) return new Response('Cannot find server action handler', {
|
|
9
|
+
status: 500
|
|
10
|
+
});
|
|
11
|
+
if (!rscClientManifest) return new Response('Cannot find rsc client manifest', {
|
|
12
|
+
status: 500
|
|
13
|
+
});
|
|
14
|
+
return handleAction(req, {
|
|
15
|
+
clientManifest: rscClientManifest
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
export { serverActionHandler };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createMemoryStorage } from "@modern-js/runtime-utils/storer";
|
|
2
|
+
import { X_RENDER_CACHE } from "../../constants";
|
|
3
|
+
import { createTransformStream, getPathname } from "../../utils";
|
|
4
|
+
const removeTailSlash = (s)=>s.replace(/\/+$/, '');
|
|
5
|
+
const ZERO_RENDER_LEVEL = /"renderLevel":0/;
|
|
6
|
+
const NO_SSR_CACHE = /<meta\s+[^>]*name=["']no-ssr-cache["'][^>]*>/i;
|
|
7
|
+
async function processCache({ request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus }) {
|
|
8
|
+
const response = await requestHandler(request, requestHandlerOptions);
|
|
9
|
+
const { onError } = requestHandlerOptions;
|
|
10
|
+
const nonCacheableStatusCodes = [
|
|
11
|
+
204,
|
|
12
|
+
305,
|
|
13
|
+
404,
|
|
14
|
+
405,
|
|
15
|
+
500,
|
|
16
|
+
501,
|
|
17
|
+
502,
|
|
18
|
+
503,
|
|
19
|
+
504
|
|
20
|
+
];
|
|
21
|
+
if (nonCacheableStatusCodes.includes(response.status)) return response;
|
|
22
|
+
const decoder = new TextDecoder();
|
|
23
|
+
if (response.body) {
|
|
24
|
+
const stream = createTransformStream();
|
|
25
|
+
const reader = response.body.getReader();
|
|
26
|
+
const writer = stream.writable.getWriter();
|
|
27
|
+
let html = '';
|
|
28
|
+
const push = ()=>reader.read().then(({ done, value })=>{
|
|
29
|
+
if (done) {
|
|
30
|
+
const match = ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html);
|
|
31
|
+
if (match) return void writer.close();
|
|
32
|
+
const current = Date.now();
|
|
33
|
+
const cache = {
|
|
34
|
+
val: html,
|
|
35
|
+
cursor: current
|
|
36
|
+
};
|
|
37
|
+
container.set(key, JSON.stringify(cache), {
|
|
38
|
+
ttl
|
|
39
|
+
}).catch(()=>{
|
|
40
|
+
if (onError) onError(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
41
|
+
else console.error(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
42
|
+
});
|
|
43
|
+
writer.close();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const content = decoder.decode(value);
|
|
47
|
+
html += content;
|
|
48
|
+
writer.write(value);
|
|
49
|
+
push();
|
|
50
|
+
});
|
|
51
|
+
push();
|
|
52
|
+
cacheStatus && response.headers.set(X_RENDER_CACHE, cacheStatus);
|
|
53
|
+
return new Response(stream.readable, {
|
|
54
|
+
status: response.status,
|
|
55
|
+
headers: response.headers
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
const CACHE_NAMESPACE = '__ssr__cache';
|
|
61
|
+
const storage = createMemoryStorage(CACHE_NAMESPACE);
|
|
62
|
+
function computedKey(req, cacheControl) {
|
|
63
|
+
const pathname = getPathname(req);
|
|
64
|
+
const { customKey } = cacheControl;
|
|
65
|
+
const defaultKey = '/' === pathname ? pathname : removeTailSlash(pathname);
|
|
66
|
+
if (!customKey) return defaultKey;
|
|
67
|
+
if ('string' == typeof customKey) return customKey;
|
|
68
|
+
return customKey(defaultKey);
|
|
69
|
+
}
|
|
70
|
+
function shouldUseCache(request) {
|
|
71
|
+
const url = new URL(request.url);
|
|
72
|
+
const hasRSCAction = request.headers.has('x-rsc-action');
|
|
73
|
+
const hasRSCTree = request.headers.has('x-rsc-tree');
|
|
74
|
+
const hasLoaderQuery = url.searchParams.has('__loader');
|
|
75
|
+
return !(hasRSCAction || hasRSCTree || hasLoaderQuery);
|
|
76
|
+
}
|
|
77
|
+
function matchCacheControl(cacheOption, req) {
|
|
78
|
+
if (!cacheOption || !req) return;
|
|
79
|
+
{
|
|
80
|
+
if (isCacheControl(cacheOption)) return cacheOption;
|
|
81
|
+
if (isCacheOptionProvider(cacheOption)) return cacheOption(req);
|
|
82
|
+
const url = req.url;
|
|
83
|
+
const options = Object.entries(cacheOption);
|
|
84
|
+
for (const [key, option] of options)if ('*' === key || new RegExp(key).test(url)) if ('function' == typeof option) return option(req);
|
|
85
|
+
else return option;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
function isCacheOptionProvider(option) {
|
|
89
|
+
return 'function' == typeof option;
|
|
90
|
+
}
|
|
91
|
+
function isCacheControl(option) {
|
|
92
|
+
return 'object' == typeof option && null !== option && 'maxAge' in option;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function getCacheResult(request, options) {
|
|
96
|
+
const { cacheControl, container = storage, requestHandler, requestHandlerOptions } = options;
|
|
97
|
+
const { onError } = requestHandlerOptions;
|
|
98
|
+
const key = computedKey(request, cacheControl);
|
|
99
|
+
let value;
|
|
100
|
+
try {
|
|
101
|
+
value = await container.get(key);
|
|
102
|
+
} catch (_) {
|
|
103
|
+
if (onError) onError(`[render-cache] get cache failed, key: ${key}`);
|
|
104
|
+
else console.error(`[render-cache] get cache failed, key: ${key}`);
|
|
105
|
+
value = void 0;
|
|
106
|
+
}
|
|
107
|
+
const { maxAge, staleWhileRevalidate } = cacheControl;
|
|
108
|
+
const ttl = maxAge + staleWhileRevalidate;
|
|
109
|
+
if (!value) return processCache({
|
|
110
|
+
key,
|
|
111
|
+
request,
|
|
112
|
+
requestHandler,
|
|
113
|
+
requestHandlerOptions,
|
|
114
|
+
ttl,
|
|
115
|
+
container,
|
|
116
|
+
cacheStatus: 'miss'
|
|
117
|
+
});
|
|
118
|
+
{
|
|
119
|
+
const cache = JSON.parse(value);
|
|
120
|
+
const interval = Date.now() - cache.cursor;
|
|
121
|
+
if (interval <= maxAge) {
|
|
122
|
+
const cacheStatus = 'hit';
|
|
123
|
+
return new Response(cache.val, {
|
|
124
|
+
headers: {
|
|
125
|
+
[X_RENDER_CACHE]: cacheStatus
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
|
|
130
|
+
key,
|
|
131
|
+
request,
|
|
132
|
+
requestHandler,
|
|
133
|
+
requestHandlerOptions,
|
|
134
|
+
ttl,
|
|
135
|
+
container,
|
|
136
|
+
cacheStatus: 'expired'
|
|
137
|
+
});
|
|
138
|
+
{
|
|
139
|
+
processCache({
|
|
140
|
+
key,
|
|
141
|
+
request,
|
|
142
|
+
requestHandler,
|
|
143
|
+
requestHandlerOptions,
|
|
144
|
+
ttl,
|
|
145
|
+
container
|
|
146
|
+
}).then(async (response)=>{
|
|
147
|
+
await response.text();
|
|
148
|
+
});
|
|
149
|
+
const cacheStatus = 'stale';
|
|
150
|
+
return new Response(cache.val, {
|
|
151
|
+
headers: {
|
|
152
|
+
[X_RENDER_CACHE]: cacheStatus
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export { getCacheResult, matchCacheControl, shouldUseCache };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
import { X_MODERNJS_RENDER } from "../../constants";
|
|
3
|
+
import { getPathname, parseHeaders } from "../../utils";
|
|
4
|
+
import { getCacheResult, matchCacheControl, shouldUseCache } from "./ssrCache";
|
|
5
|
+
import { createRequestHandlerConfig } from "./utils";
|
|
6
|
+
const SERVER_RUNTIME_ENTRY = 'requestHandler';
|
|
7
|
+
async function ssrRender(request, { routeInfo, html, config: userConfig, staticGenerate, nodeReq, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, monitors, cacheConfig, onError, onTiming, reporter }) {
|
|
8
|
+
const { entryName } = routeInfo;
|
|
9
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
10
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
11
|
+
const headers = parseHeaders(request);
|
|
12
|
+
if (nodeReq) {
|
|
13
|
+
for(const key in nodeReq.headers)if (!headers[key]) headers[key] = nodeReq.headers[key];
|
|
14
|
+
}
|
|
15
|
+
const renderBundle = serverManifest.renderBundles?.[entryName || MAIN_ENTRY_NAME];
|
|
16
|
+
if (!renderBundle) throw new Error(`Can't find renderBundle ${entryName || MAIN_ENTRY_NAME}`);
|
|
17
|
+
const requestHandler = await renderBundle[SERVER_RUNTIME_ENTRY];
|
|
18
|
+
const config = createRequestHandlerConfig(userConfig);
|
|
19
|
+
const requestHandlerOptions = {
|
|
20
|
+
resource: {
|
|
21
|
+
route: routeInfo,
|
|
22
|
+
loadableStats,
|
|
23
|
+
routeManifest,
|
|
24
|
+
htmlTemplate: html,
|
|
25
|
+
entryName: entryName || MAIN_ENTRY_NAME
|
|
26
|
+
},
|
|
27
|
+
params,
|
|
28
|
+
loaderContext,
|
|
29
|
+
config,
|
|
30
|
+
rscSSRManifest,
|
|
31
|
+
rscClientManifest,
|
|
32
|
+
rscServerManifest,
|
|
33
|
+
locals,
|
|
34
|
+
staticGenerate,
|
|
35
|
+
monitors,
|
|
36
|
+
onError,
|
|
37
|
+
onTiming,
|
|
38
|
+
reporter
|
|
39
|
+
};
|
|
40
|
+
const cacheControl = await matchCacheControl(cacheConfig?.strategy, nodeReq || new IncomingMessgeProxy(request));
|
|
41
|
+
let response;
|
|
42
|
+
response = cacheControl && shouldUseCache(request) ? await getCacheResult(request, {
|
|
43
|
+
cacheControl,
|
|
44
|
+
container: cacheConfig?.container,
|
|
45
|
+
requestHandler: requestHandler,
|
|
46
|
+
requestHandlerOptions
|
|
47
|
+
}) : await requestHandler(request, requestHandlerOptions);
|
|
48
|
+
response.headers.set(X_MODERNJS_RENDER, 'server');
|
|
49
|
+
response.headers.set('content-type', 'text/html; charset=UTF-8');
|
|
50
|
+
return response;
|
|
51
|
+
}
|
|
52
|
+
class IncomingMessgeProxy {
|
|
53
|
+
constructor(req){
|
|
54
|
+
this.headers = {};
|
|
55
|
+
req.headers.forEach((value, key)=>{
|
|
56
|
+
this.headers[key] = value;
|
|
57
|
+
});
|
|
58
|
+
this.method = req.method;
|
|
59
|
+
this.url = getPathname(req);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export { ssrRender };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function createRequestHandlerConfig(userConfig) {
|
|
2
|
+
const { output, server, security, html, source } = userConfig;
|
|
3
|
+
return {
|
|
4
|
+
ssr: server?.ssr,
|
|
5
|
+
ssrByEntries: server?.ssrByEntries,
|
|
6
|
+
nonce: security?.nonce,
|
|
7
|
+
inlineScripts: output?.inlineScripts,
|
|
8
|
+
inlineStyles: output?.inlineStyles,
|
|
9
|
+
crossorigin: html?.crossorigin,
|
|
10
|
+
scriptLoading: html?.scriptLoading,
|
|
11
|
+
useJsonScript: server?.useJsonScript,
|
|
12
|
+
enableAsyncEntry: source?.enableAsyncEntry
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export { createRequestHandlerConfig };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
import { sortRoutes } from "../utils";
|
|
3
|
+
function injectRoute(route) {
|
|
4
|
+
return async (c, next)=>{
|
|
5
|
+
if (route && !c.get('route')) c.set('route', route);
|
|
6
|
+
await next();
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function getPageRoutes(routes) {
|
|
10
|
+
return routes.filter((route)=>route.entryName).sort(sortRoutes);
|
|
11
|
+
}
|
|
12
|
+
const injectRoutePlugin = ()=>({
|
|
13
|
+
name: '@modern-js/plugin-inject-route',
|
|
14
|
+
setup (api) {
|
|
15
|
+
api.onPrepare(()=>{
|
|
16
|
+
const { middlewares, routes } = api.getServerContext();
|
|
17
|
+
if (!routes) return;
|
|
18
|
+
const pageRoutes = getPageRoutes(routes);
|
|
19
|
+
for (const route of pageRoutes){
|
|
20
|
+
const { urlPath: originUrlPath, entryName = MAIN_ENTRY_NAME } = route;
|
|
21
|
+
const urlPath = originUrlPath.endsWith('/') ? `${originUrlPath}*` : `${originUrlPath}/*`;
|
|
22
|
+
middlewares.push({
|
|
23
|
+
name: 'inject-route-info',
|
|
24
|
+
path: urlPath,
|
|
25
|
+
handler: injectRoute({
|
|
26
|
+
entryName,
|
|
27
|
+
urlPath: originUrlPath
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
export { injectRoutePlugin };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { server as server_server } from "@modern-js/plugin/server";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { run } from "./context";
|
|
4
|
+
import { handleSetupResult } from "./plugins/compat/hooks";
|
|
5
|
+
import { loadConfig } from "./utils";
|
|
6
|
+
function _check_private_redeclaration(obj, privateCollection) {
|
|
7
|
+
if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
8
|
+
}
|
|
9
|
+
function _class_private_method_get(receiver, privateSet, fn) {
|
|
10
|
+
if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance");
|
|
11
|
+
return fn;
|
|
12
|
+
}
|
|
13
|
+
function _class_private_method_init(obj, privateSet) {
|
|
14
|
+
_check_private_redeclaration(obj, privateSet);
|
|
15
|
+
privateSet.add(obj);
|
|
16
|
+
}
|
|
17
|
+
var _applyMiddlewares = /*#__PURE__*/ new WeakSet();
|
|
18
|
+
class ServerBase {
|
|
19
|
+
async init() {
|
|
20
|
+
const { serverConfig, config: cliConfig } = this.options;
|
|
21
|
+
const mergedConfig = loadConfig({
|
|
22
|
+
cliConfig,
|
|
23
|
+
serverConfig: serverConfig || {}
|
|
24
|
+
});
|
|
25
|
+
const { serverContext } = await server_server.run({
|
|
26
|
+
plugins: this.plugins,
|
|
27
|
+
options: this.options,
|
|
28
|
+
config: mergedConfig,
|
|
29
|
+
handleSetupResult: handleSetupResult
|
|
30
|
+
});
|
|
31
|
+
serverContext.serverBase = this;
|
|
32
|
+
this.serverContext = serverContext;
|
|
33
|
+
await serverContext.hooks.onPrepare.call();
|
|
34
|
+
_class_private_method_get(this, _applyMiddlewares, applyMiddlewares).call(this);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
addPlugins(plugins) {
|
|
38
|
+
this.plugins.push(...plugins);
|
|
39
|
+
}
|
|
40
|
+
get hooks() {
|
|
41
|
+
return this.serverContext.hooks;
|
|
42
|
+
}
|
|
43
|
+
get all() {
|
|
44
|
+
return this.app.all.bind(this.app);
|
|
45
|
+
}
|
|
46
|
+
get use() {
|
|
47
|
+
return this.app.use.bind(this.app);
|
|
48
|
+
}
|
|
49
|
+
get get() {
|
|
50
|
+
return this.app.get.bind(this.app);
|
|
51
|
+
}
|
|
52
|
+
get post() {
|
|
53
|
+
return this.app.post.bind(this.app);
|
|
54
|
+
}
|
|
55
|
+
get put() {
|
|
56
|
+
return this.app.put.bind(this.app);
|
|
57
|
+
}
|
|
58
|
+
get delete() {
|
|
59
|
+
return this.app.delete.bind(this.app);
|
|
60
|
+
}
|
|
61
|
+
get patch() {
|
|
62
|
+
return this.app.patch.bind(this.app);
|
|
63
|
+
}
|
|
64
|
+
get handle() {
|
|
65
|
+
return this.app.fetch.bind(this.app);
|
|
66
|
+
}
|
|
67
|
+
get request() {
|
|
68
|
+
return this.app.request.bind(this.app);
|
|
69
|
+
}
|
|
70
|
+
get notFound() {
|
|
71
|
+
return this.app.notFound.bind(this.app);
|
|
72
|
+
}
|
|
73
|
+
get onError() {
|
|
74
|
+
return this.app.onError.bind(this.app);
|
|
75
|
+
}
|
|
76
|
+
constructor(options){
|
|
77
|
+
_class_private_method_init(this, _applyMiddlewares);
|
|
78
|
+
this.plugins = [];
|
|
79
|
+
this.serverContext = null;
|
|
80
|
+
this.options = options;
|
|
81
|
+
this.app = new Hono();
|
|
82
|
+
this.app.use('*', run);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function applyMiddlewares() {
|
|
86
|
+
const { middlewares } = this.serverContext;
|
|
87
|
+
const preMiddlewares = [];
|
|
88
|
+
const defaultMiddlewares = [];
|
|
89
|
+
const postMiddlewares = [];
|
|
90
|
+
for (const middleware of middlewares)switch(middleware.order){
|
|
91
|
+
case 'pre':
|
|
92
|
+
preMiddlewares.push(middleware);
|
|
93
|
+
break;
|
|
94
|
+
case 'post':
|
|
95
|
+
postMiddlewares.push(middleware);
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
defaultMiddlewares.push(middleware);
|
|
99
|
+
}
|
|
100
|
+
const finalMiddlewares = [];
|
|
101
|
+
const insertMiddleware = (middleware)=>{
|
|
102
|
+
if (middleware.before) {
|
|
103
|
+
const targetIndex = finalMiddlewares.findIndex((item)=>{
|
|
104
|
+
if (middleware.before?.includes(item.name)) return true;
|
|
105
|
+
return false;
|
|
106
|
+
});
|
|
107
|
+
if (-1 !== targetIndex) finalMiddlewares.splice(targetIndex, 0, middleware);
|
|
108
|
+
else finalMiddlewares.push(middleware);
|
|
109
|
+
} else finalMiddlewares.push(middleware);
|
|
110
|
+
};
|
|
111
|
+
preMiddlewares.forEach(insertMiddleware);
|
|
112
|
+
defaultMiddlewares.forEach(insertMiddleware);
|
|
113
|
+
postMiddlewares.forEach(insertMiddleware);
|
|
114
|
+
for (const middleware of finalMiddlewares){
|
|
115
|
+
const { path = '*', method = 'all', handler } = middleware;
|
|
116
|
+
const handlers = handler2Handlers(handler);
|
|
117
|
+
if (0 === handlers.length) continue;
|
|
118
|
+
const firstHandler = handlers[0];
|
|
119
|
+
const restHandlers = handlers.slice(1);
|
|
120
|
+
const m = method;
|
|
121
|
+
const register = this.app[m];
|
|
122
|
+
register.call(this.app, path, firstHandler, ...restHandlers);
|
|
123
|
+
}
|
|
124
|
+
function handler2Handlers(handler) {
|
|
125
|
+
if (Array.isArray(handler)) return handler;
|
|
126
|
+
return [
|
|
127
|
+
handler
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function createServerBase(options) {
|
|
132
|
+
if (null == options) throw new Error('can not start server without options');
|
|
133
|
+
const server = new ServerBase(options);
|
|
134
|
+
return server;
|
|
135
|
+
}
|
|
136
|
+
export { ServerBase, createServerBase };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./plugin";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const getRuntimeEnv = ()=>{
|
|
2
|
+
if (globalThis?.process?.release?.name === 'node') return 'node';
|
|
3
|
+
return 'other';
|
|
4
|
+
};
|
|
5
|
+
const checkIsProd = ()=>{
|
|
6
|
+
const env = getRuntimeEnv();
|
|
7
|
+
switch(env){
|
|
8
|
+
case 'node':
|
|
9
|
+
return 'production' === process.env.NODE_ENV;
|
|
10
|
+
default:
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export { checkIsProd, getRuntimeEnv };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { parseHeaders } from "./request";
|
|
2
|
+
const ERROR_PAGE_TEXT = {
|
|
3
|
+
404: 'This page could not be found.',
|
|
4
|
+
500: 'Internal Server Error.'
|
|
5
|
+
};
|
|
6
|
+
const createErrorHtml = (status)=>{
|
|
7
|
+
const text = ERROR_PAGE_TEXT[status] || '';
|
|
8
|
+
const title = `${status}: ${text}`;
|
|
9
|
+
return `<!DOCTYPE html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8">
|
|
13
|
+
<meta name="viewport" content="width=device-width">
|
|
14
|
+
<title>${title}</title>
|
|
15
|
+
<style>
|
|
16
|
+
html,body {
|
|
17
|
+
margin: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.page-container {
|
|
21
|
+
color: #000;
|
|
22
|
+
background: #fff;
|
|
23
|
+
height: 100vh;
|
|
24
|
+
text-align: center;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
align-items: center;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
}
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<div class="page-container">
|
|
34
|
+
<h1>${status}</h1>
|
|
35
|
+
<div>${text}</div>
|
|
36
|
+
</body>
|
|
37
|
+
</html>
|
|
38
|
+
`;
|
|
39
|
+
};
|
|
40
|
+
var error_ErrorDigest = /*#__PURE__*/ function(ErrorDigest) {
|
|
41
|
+
ErrorDigest["ENOTF"] = "Page could not be found";
|
|
42
|
+
ErrorDigest["EINTER"] = "Internal server error";
|
|
43
|
+
ErrorDigest["ERENDER"] = "SSR render fallback";
|
|
44
|
+
return ErrorDigest;
|
|
45
|
+
}({});
|
|
46
|
+
function onError(digest, error, monitors, req) {
|
|
47
|
+
const headerData = req && parseHeaders(req);
|
|
48
|
+
headerData && delete headerData.cookie;
|
|
49
|
+
if (monitors) monitors.error(req ? `Server Error - ${digest}, error = %s, req.url = %s, req.headers = %o` : `Server Error - ${digest}, error = %s`, error instanceof Error ? error.stack || error.message : error, req?.url, headerData);
|
|
50
|
+
else if (req) console.error(`Server Error - ${digest}, error = ${error instanceof Error ? error.stack || error.message : error}, req.url = ${req.url}, req.headers = ${JSON.stringify(headerData)}`);
|
|
51
|
+
else console.error(`Server Error - ${digest}, error = ${error instanceof Error ? error.stack || error.message : error} `);
|
|
52
|
+
}
|
|
53
|
+
export { error_ErrorDigest as ErrorDigest, createErrorHtml, onError };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const mergeExtension = (users)=>{
|
|
2
|
+
const output = [];
|
|
3
|
+
return {
|
|
4
|
+
middleware: output.concat(users)
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
const createMiddlewareCollecter = ()=>{
|
|
8
|
+
const webMiddlewares = [];
|
|
9
|
+
const apiMiddlewares = [];
|
|
10
|
+
const addWebMiddleware = (input)=>{
|
|
11
|
+
webMiddlewares.push(input);
|
|
12
|
+
};
|
|
13
|
+
const addAPIMiddleware = (input)=>{
|
|
14
|
+
apiMiddlewares.push(input);
|
|
15
|
+
};
|
|
16
|
+
const getMiddlewares = ()=>({
|
|
17
|
+
web: webMiddlewares,
|
|
18
|
+
api: apiMiddlewares
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
getMiddlewares,
|
|
22
|
+
addWebMiddleware,
|
|
23
|
+
addAPIMiddleware
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export { createMiddlewareCollecter, mergeExtension };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
function normalizePublicDir(publicDir) {
|
|
3
|
+
if (!publicDir) return [];
|
|
4
|
+
return Array.isArray(publicDir) ? publicDir : [
|
|
5
|
+
publicDir
|
|
6
|
+
];
|
|
7
|
+
}
|
|
8
|
+
function normalizePublicDirPath(dir) {
|
|
9
|
+
return dir.replace(/^\.\//, '').replace(/\/$/, '');
|
|
10
|
+
}
|
|
11
|
+
function getPublicDirRoutePrefixes(publicDir) {
|
|
12
|
+
const dirs = normalizePublicDir(publicDir);
|
|
13
|
+
return dirs.map((dir)=>{
|
|
14
|
+
const normalized = normalizePublicDirPath(dir);
|
|
15
|
+
return `/${normalized}`;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function getPublicDirPatterns(publicDir) {
|
|
19
|
+
const dirs = normalizePublicDir(publicDir);
|
|
20
|
+
return dirs.map((dir)=>{
|
|
21
|
+
const normalized = normalizePublicDirPath(dir);
|
|
22
|
+
return `${normalized}/`;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function resolvePublicDirPaths(publicDir, appDirectory) {
|
|
26
|
+
const dirs = normalizePublicDir(publicDir);
|
|
27
|
+
if (!appDirectory) return dirs;
|
|
28
|
+
return dirs.map((dir)=>path.resolve(appDirectory, dir));
|
|
29
|
+
}
|
|
30
|
+
function getPublicDirConfig(serverConfig) {
|
|
31
|
+
return serverConfig?.publicDir;
|
|
32
|
+
}
|
|
33
|
+
export { getPublicDirConfig, getPublicDirPatterns, getPublicDirRoutePrefixes, normalizePublicDir, normalizePublicDirPath, resolvePublicDirPaths };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function parseQuery(req) {
|
|
2
|
+
const query = {};
|
|
3
|
+
const { url } = req;
|
|
4
|
+
const q = url.split('?')[1];
|
|
5
|
+
if (q) {
|
|
6
|
+
const search = new URLSearchParams(q);
|
|
7
|
+
search.forEach((v, k)=>{
|
|
8
|
+
query[k] = v;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
return query;
|
|
12
|
+
}
|
|
13
|
+
function parseHeaders(request) {
|
|
14
|
+
const headersData = {};
|
|
15
|
+
request.headers.forEach((value, key)=>{
|
|
16
|
+
headersData[key] = value;
|
|
17
|
+
});
|
|
18
|
+
return headersData;
|
|
19
|
+
}
|
|
20
|
+
function getPathname(request) {
|
|
21
|
+
const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/);
|
|
22
|
+
return match ? match[1] : '/';
|
|
23
|
+
}
|
|
24
|
+
function getHost(request) {
|
|
25
|
+
const { headers } = request;
|
|
26
|
+
let host = headers.get('X-Forwarded-Host');
|
|
27
|
+
if (!host) host = headers.get('Host');
|
|
28
|
+
host = host?.split(/\s*,\s*/, 1)[0] || 'undefined';
|
|
29
|
+
return host;
|
|
30
|
+
}
|
|
31
|
+
function parseCookie(req) {
|
|
32
|
+
const _cookie = req.headers.get('Cookie');
|
|
33
|
+
const cookie = {};
|
|
34
|
+
_cookie?.trim().split(';').forEach((item)=>{
|
|
35
|
+
const [k, v] = item.trim().split('=');
|
|
36
|
+
if (k) cookie[k] = v;
|
|
37
|
+
});
|
|
38
|
+
return cookie;
|
|
39
|
+
}
|
|
40
|
+
export { getHost, getPathname, parseCookie, parseHeaders, parseQuery };
|