@modern-js/prod-server 2.0.0-beta.3 → 2.0.0-beta.6
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/CHANGELOG.md +139 -0
- package/dist/js/modern/constants.js +32 -25
- package/dist/js/modern/index.js +11 -6
- package/dist/js/modern/libs/context/context.js +52 -84
- package/dist/js/modern/libs/context/index.js +5 -2
- package/dist/js/modern/libs/hook-api/index.js +44 -35
- package/dist/js/modern/libs/hook-api/route.js +6 -7
- package/dist/js/modern/libs/hook-api/template.js +20 -34
- package/dist/js/modern/libs/loadConfig.js +45 -24
- package/dist/js/modern/libs/metrics.js +3 -4
- package/dist/js/modern/libs/proxy.js +68 -37
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +112 -67
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +246 -216
- package/dist/js/modern/libs/render/cache/__tests__/cacheable.js +43 -49
- package/dist/js/modern/libs/render/cache/__tests__/error-configuration.js +36 -34
- package/dist/js/modern/libs/render/cache/__tests__/matched-cache.js +83 -113
- package/dist/js/modern/libs/render/cache/index.js +88 -54
- package/dist/js/modern/libs/render/cache/page-caches/index.js +31 -8
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +6 -6
- package/dist/js/modern/libs/render/cache/spr.js +133 -117
- package/dist/js/modern/libs/render/cache/type.js +0 -1
- package/dist/js/modern/libs/render/cache/util.js +71 -39
- package/dist/js/modern/libs/render/index.js +76 -56
- package/dist/js/modern/libs/render/measure.js +38 -27
- package/dist/js/modern/libs/render/reader.js +65 -62
- package/dist/js/modern/libs/render/ssr.js +50 -32
- package/dist/js/modern/libs/render/static.js +50 -33
- package/dist/js/modern/libs/render/type.js +9 -6
- package/dist/js/modern/libs/route/index.js +8 -15
- package/dist/js/modern/libs/route/matcher.js +20 -34
- package/dist/js/modern/libs/route/route.js +9 -18
- package/dist/js/modern/libs/serve-file.js +33 -20
- package/dist/js/modern/server/index.js +150 -145
- package/dist/js/modern/server/modern-server-split.js +46 -12
- package/dist/js/modern/server/modern-server.js +384 -422
- package/dist/js/modern/type.js +0 -1
- package/dist/js/modern/utils.js +62 -43
- package/dist/js/modern/worker-server.js +34 -14
- package/dist/js/node/constants.js +53 -30
- package/dist/js/node/index.js +37 -57
- package/dist/js/node/libs/context/context.js +83 -94
- package/dist/js/node/libs/context/index.js +28 -13
- package/dist/js/node/libs/hook-api/index.js +76 -48
- package/dist/js/node/libs/hook-api/route.js +26 -11
- package/dist/js/node/libs/hook-api/template.js +41 -39
- package/dist/js/node/libs/loadConfig.js +73 -35
- package/dist/js/node/libs/metrics.js +25 -9
- package/dist/js/node/libs/proxy.js +89 -44
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +99 -56
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +147 -128
- package/dist/js/node/libs/render/cache/__tests__/cacheable.js +65 -55
- package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +58 -40
- package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +105 -119
- package/dist/js/node/libs/render/cache/index.js +110 -64
- package/dist/js/node/libs/render/cache/page-caches/index.js +54 -14
- package/dist/js/node/libs/render/cache/page-caches/lru.js +33 -12
- package/dist/js/node/libs/render/cache/spr.js +161 -129
- package/dist/js/node/libs/render/cache/type.js +15 -5
- package/dist/js/node/libs/render/cache/util.js +99 -45
- package/dist/js/node/libs/render/index.js +106 -67
- package/dist/js/node/libs/render/measure.js +58 -31
- package/dist/js/node/libs/render/reader.js +95 -70
- package/dist/js/node/libs/render/ssr.js +80 -47
- package/dist/js/node/libs/render/static.js +79 -40
- package/dist/js/node/libs/render/type.js +31 -12
- package/dist/js/node/libs/route/index.js +31 -26
- package/dist/js/node/libs/route/matcher.js +40 -41
- package/dist/js/node/libs/route/route.js +29 -22
- package/dist/js/node/libs/serve-file.js +66 -32
- package/dist/js/node/server/index.js +168 -160
- package/dist/js/node/server/modern-server-split.js +72 -22
- package/dist/js/node/server/modern-server.js +403 -445
- package/dist/js/node/type.js +15 -3
- package/dist/js/node/utils.js +85 -52
- package/dist/js/node/worker-server.js +57 -21
- package/dist/js/treeshaking/constants.js +26 -25
- package/dist/js/treeshaking/index.js +10 -10
- package/dist/js/treeshaking/libs/context/context.js +268 -237
- package/dist/js/treeshaking/libs/context/index.js +3 -3
- package/dist/js/treeshaking/libs/hook-api/index.js +267 -143
- package/dist/js/treeshaking/libs/hook-api/route.js +65 -30
- package/dist/js/treeshaking/libs/hook-api/template.js +121 -85
- package/dist/js/treeshaking/libs/loadConfig.js +80 -37
- package/dist/js/treeshaking/libs/metrics.js +4 -10
- package/dist/js/treeshaking/libs/proxy.js +240 -76
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +288 -121
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +772 -455
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +65 -51
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +45 -35
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +144 -118
- package/dist/js/treeshaking/libs/render/cache/index.js +337 -175
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +151 -27
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +80 -42
- package/dist/js/treeshaking/libs/render/cache/spr.js +470 -340
- package/dist/js/treeshaking/libs/render/cache/type.js +1 -1
- package/dist/js/treeshaking/libs/render/cache/util.js +271 -92
- package/dist/js/treeshaking/libs/render/index.js +228 -95
- package/dist/js/treeshaking/libs/render/measure.js +142 -57
- package/dist/js/treeshaking/libs/render/reader.js +325 -177
- package/dist/js/treeshaking/libs/render/ssr.js +220 -95
- package/dist/js/treeshaking/libs/render/static.js +210 -78
- package/dist/js/treeshaking/libs/render/type.js +7 -6
- package/dist/js/treeshaking/libs/route/index.js +125 -89
- package/dist/js/treeshaking/libs/route/matcher.js +132 -107
- package/dist/js/treeshaking/libs/route/route.js +40 -26
- package/dist/js/treeshaking/libs/serve-file.js +177 -68
- package/dist/js/treeshaking/server/index.js +493 -327
- package/dist/js/treeshaking/server/modern-server-split.js +352 -144
- package/dist/js/treeshaking/server/modern-server.js +1048 -909
- package/dist/js/treeshaking/type.js +1 -1
- package/dist/js/treeshaking/utils.js +138 -81
- package/dist/js/treeshaking/worker-server.js +176 -55
- package/dist/types/index.d.ts +2 -0
- package/dist/types/libs/context/context.d.ts +4 -1
- package/dist/types/libs/loadConfig.d.ts +1 -0
- package/dist/types/libs/render/cache/index.d.ts +2 -0
- package/dist/types/libs/render/cache/spr.d.ts +2 -0
- package/dist/types/libs/route/route.d.ts +0 -1
- package/dist/types/server/index.d.ts +3 -0
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/worker-server.d.ts +1 -2
- package/package.json +7 -14
- package/dist/js/modern/libs/render/modern/browser-list.js +0 -7
- package/dist/js/modern/libs/render/modern/index.js +0 -37
- package/dist/js/node/libs/render/modern/browser-list.js +0 -14
- package/dist/js/node/libs/render/modern/index.js +0 -46
- package/dist/js/treeshaking/libs/render/modern/browser-list.js +0 -7
- package/dist/js/treeshaking/libs/render/modern/index.js +0 -39
- package/dist/types/libs/render/modern/browser-list.d.ts +0 -1
- package/dist/types/libs/render/modern/index.d.ts +0 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,144 @@
|
|
|
1
1
|
# @modern-js/prod-server
|
|
2
2
|
|
|
3
|
+
## 2.0.0-beta.6
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- dda38c9c3e: chore: v2
|
|
8
|
+
|
|
9
|
+
### Minor Changes
|
|
10
|
+
|
|
11
|
+
- c9e800d39a: feat: support React18 streaming SSR
|
|
12
|
+
feat: 支持 React18 流式 SSR
|
|
13
|
+
- 543be9558e: feat: compile server loader and support handle loader request
|
|
14
|
+
feat: 编译 server loader 并支持处理 loader 的请求
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 7879e8f711: refactor: remove enableModernMode config
|
|
19
|
+
|
|
20
|
+
refactor: 不再支持 enableModernMode 配置项
|
|
21
|
+
|
|
22
|
+
- d032d49e09: export createHandle
|
|
23
|
+
导出 createHandle 函数
|
|
24
|
+
- 15bf09d9c8: feat: support completely custom server, export render() api for render single page
|
|
25
|
+
feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
|
|
26
|
+
- cc971eabfc: refactor: move server plugin load logic in `@modern-js/core`
|
|
27
|
+
refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
|
|
28
|
+
- 40ed5874c6: feat: inject css chunk into html for streaming ssr
|
|
29
|
+
feat: streaming ssr 返回的 html 注入 css chunk
|
|
30
|
+
- 102d32e4ba: feat(server): add `req` and `res` to SSR context
|
|
31
|
+
|
|
32
|
+
feat(server): 添加 `req` 和 `res` 到 SSR context 中
|
|
33
|
+
|
|
34
|
+
- 3bbea92b2a: feat: support Hook、Middleware new API
|
|
35
|
+
feat: 支持 Hook、Middleware 的新 API
|
|
36
|
+
- 73cd29dd9f: fix(server): add favicon fallback handler
|
|
37
|
+
|
|
38
|
+
fix(server): 添加 favicon 兜底处理逻辑
|
|
39
|
+
|
|
40
|
+
- cce8ecee2d: fix: handle some `TODO` & `FIXME`, change some tests
|
|
41
|
+
fix: 处理一些 `TODO` 和 `FIXME`, 修改了一些 tests
|
|
42
|
+
- 18aaf42249: fix: fix server loader redirects
|
|
43
|
+
fix: 修复 server loader 重定向错误
|
|
44
|
+
- 14b712da84: fix: use consistent alias type and default value across packages
|
|
45
|
+
|
|
46
|
+
fix: 在各个包中使用一致的 alias 类型定义和默认值
|
|
47
|
+
|
|
48
|
+
- Updated dependencies [7879e8f711]
|
|
49
|
+
- Updated dependencies [6aca875011]
|
|
50
|
+
- Updated dependencies [15bf09d9c8]
|
|
51
|
+
- Updated dependencies [2e6031955e]
|
|
52
|
+
- Updated dependencies [7b7d12cf8f]
|
|
53
|
+
- Updated dependencies [7efeed4]
|
|
54
|
+
- Updated dependencies [92f0eade39]
|
|
55
|
+
- Updated dependencies [edd1cfb1af]
|
|
56
|
+
- Updated dependencies [cc971eabfc]
|
|
57
|
+
- Updated dependencies [5b9049f2e9]
|
|
58
|
+
- Updated dependencies [92004d1906]
|
|
59
|
+
- Updated dependencies [b8bbe036c7]
|
|
60
|
+
- Updated dependencies [d5a31df781]
|
|
61
|
+
- Updated dependencies [dda38c9c3e]
|
|
62
|
+
- Updated dependencies [3bbea92b2a]
|
|
63
|
+
- Updated dependencies [b710adb843]
|
|
64
|
+
- Updated dependencies [ea7cf06257]
|
|
65
|
+
- Updated dependencies [bbe4c4ab64]
|
|
66
|
+
- Updated dependencies [e4558a0bc4]
|
|
67
|
+
- Updated dependencies [abf3421a75]
|
|
68
|
+
- Updated dependencies [543be9558e]
|
|
69
|
+
- Updated dependencies [14b712da84]
|
|
70
|
+
- @modern-js/utils@2.0.0-beta.6
|
|
71
|
+
- @modern-js/server-core@2.0.0-beta.6
|
|
72
|
+
|
|
73
|
+
## 2.0.0-beta.4
|
|
74
|
+
|
|
75
|
+
### Major Changes
|
|
76
|
+
|
|
77
|
+
- dda38c9c3e: chore: v2
|
|
78
|
+
|
|
79
|
+
### Minor Changes
|
|
80
|
+
|
|
81
|
+
- c9e800d39a: feat: support React18 streaming SSR
|
|
82
|
+
feat: 支持 React18 流式 SSR
|
|
83
|
+
- 543be9558e: feat: compile server loader and support handle loader request
|
|
84
|
+
feat: 编译 server loader 并支持处理 loader 的请求
|
|
85
|
+
|
|
86
|
+
### Patch Changes
|
|
87
|
+
|
|
88
|
+
- 7879e8f: refactor: remove enableModernMode config
|
|
89
|
+
|
|
90
|
+
refactor: 不再支持 enableModernMode 配置项
|
|
91
|
+
|
|
92
|
+
- d032d49e09: export createHandle
|
|
93
|
+
导出 createHandle 函数
|
|
94
|
+
- 15bf09d9c8: feat: support completely custom server, export render() api for render single page
|
|
95
|
+
feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
|
|
96
|
+
- cc971eabfc: refactor: move server plugin load logic in `@modern-js/core`
|
|
97
|
+
refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
|
|
98
|
+
- 40ed5874c6: feat: inject css chunk into html for streaming ssr
|
|
99
|
+
feat: streaming ssr 返回的 html 注入 css chunk
|
|
100
|
+
- 102d32e4ba: feat(server): add `req` and `res` to SSR context
|
|
101
|
+
|
|
102
|
+
feat(server): 添加 `req` 和 `res` 到 SSR context 中
|
|
103
|
+
|
|
104
|
+
- 3bbea92b2a: feat: support Hook、Middleware new API
|
|
105
|
+
feat: 支持 Hook、Middleware 的新 API
|
|
106
|
+
- 73cd29dd9f: fix(server): add favicon fallback handler
|
|
107
|
+
|
|
108
|
+
fix(server): 添加 favicon 兜底处理逻辑
|
|
109
|
+
|
|
110
|
+
- cce8ecee2d: fix: handle some `TODO` & `FIXME`, change some tests
|
|
111
|
+
fix: 处理一些 `TODO` 和 `FIXME`, 修改了一些 tests
|
|
112
|
+
- 18aaf42249: fix: fix server loader redirects
|
|
113
|
+
fix: 修复 server loader 重定向错误
|
|
114
|
+
- 14b712da84: fix: use consistent alias type and default value across packages
|
|
115
|
+
|
|
116
|
+
fix: 在各个包中使用一致的 alias 类型定义和默认值
|
|
117
|
+
|
|
118
|
+
- Updated dependencies [7879e8f]
|
|
119
|
+
- Updated dependencies [6aca875]
|
|
120
|
+
- Updated dependencies [15bf09d9c8]
|
|
121
|
+
- Updated dependencies [2e6031955e]
|
|
122
|
+
- Updated dependencies [7b7d12c]
|
|
123
|
+
- Updated dependencies [92f0eade39]
|
|
124
|
+
- Updated dependencies [edd1cfb1af]
|
|
125
|
+
- Updated dependencies [cc971eabfc]
|
|
126
|
+
- Updated dependencies [5b9049f2e9]
|
|
127
|
+
- Updated dependencies [92004d1906]
|
|
128
|
+
- Updated dependencies [b8bbe036c7]
|
|
129
|
+
- Updated dependencies [d5a31df781]
|
|
130
|
+
- Updated dependencies [dda38c9c3e]
|
|
131
|
+
- Updated dependencies [3bbea92b2a]
|
|
132
|
+
- Updated dependencies [b710adb843]
|
|
133
|
+
- Updated dependencies [ea7cf06]
|
|
134
|
+
- Updated dependencies [bbe4c4a]
|
|
135
|
+
- Updated dependencies [e4558a0]
|
|
136
|
+
- Updated dependencies [abf3421a75]
|
|
137
|
+
- Updated dependencies [543be9558e]
|
|
138
|
+
- Updated dependencies [14b712da84]
|
|
139
|
+
- @modern-js/utils@2.0.0-beta.4
|
|
140
|
+
- @modern-js/server-core@2.0.0-beta.4
|
|
141
|
+
|
|
3
142
|
## 2.0.0-beta.3
|
|
4
143
|
|
|
5
144
|
### Major Changes
|
|
@@ -1,28 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
mock:
|
|
3
|
-
server:
|
|
4
|
-
api:
|
|
5
|
-
shared:
|
|
6
|
-
lambda:
|
|
1
|
+
const AGGRED_DIR = {
|
|
2
|
+
mock: "config/mock",
|
|
3
|
+
server: "server",
|
|
4
|
+
api: "api",
|
|
5
|
+
shared: "shared",
|
|
6
|
+
lambda: "lambda"
|
|
7
7
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
})(ApiServerMode ||
|
|
13
|
-
|
|
14
|
-
INIT:
|
|
15
|
-
ENOTF:
|
|
16
|
-
WARMUP:
|
|
17
|
-
EINTER:
|
|
18
|
-
ERENDER:
|
|
19
|
-
EMICROINJ:
|
|
8
|
+
var ApiServerMode = /* @__PURE__ */ ((ApiServerMode2) => {
|
|
9
|
+
ApiServerMode2["func"] = "function";
|
|
10
|
+
ApiServerMode2["frame"] = "framework";
|
|
11
|
+
return ApiServerMode2;
|
|
12
|
+
})(ApiServerMode || {});
|
|
13
|
+
const ERROR_DIGEST = {
|
|
14
|
+
INIT: "Server init error",
|
|
15
|
+
ENOTF: "Page could not be found",
|
|
16
|
+
WARMUP: "SSR warmup failed",
|
|
17
|
+
EINTER: "Internal server error",
|
|
18
|
+
ERENDER: "SSR render failed",
|
|
19
|
+
EMICROINJ: "Get micro-frontend info failed"
|
|
20
20
|
};
|
|
21
|
-
|
|
22
|
-
404:
|
|
23
|
-
500:
|
|
21
|
+
const ERROR_PAGE_TEXT = {
|
|
22
|
+
404: "This page could not be found.",
|
|
23
|
+
500: "Internal Server Error."
|
|
24
|
+
};
|
|
25
|
+
const RUN_MODE = {
|
|
26
|
+
FULL: "full",
|
|
27
|
+
TYPE: "type"
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
AGGRED_DIR,
|
|
31
|
+
ApiServerMode,
|
|
32
|
+
ERROR_DIGEST,
|
|
33
|
+
ERROR_PAGE_TEXT,
|
|
34
|
+
RUN_MODE
|
|
24
35
|
};
|
|
25
|
-
export const RUN_MODE = {
|
|
26
|
-
FULL: 'full',
|
|
27
|
-
TYPE: 'type'
|
|
28
|
-
};
|
package/dist/js/modern/index.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { Server } from "./server";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export { createProxyHandler } from "./libs/proxy";
|
|
2
|
+
import { ModernServer } from "./server/modern-server";
|
|
3
|
+
import { createProxyHandler } from "./libs/proxy";
|
|
5
4
|
export * from "./type";
|
|
6
5
|
export * from "./constants";
|
|
7
|
-
|
|
6
|
+
var src_default = (options) => {
|
|
8
7
|
if (options == null) {
|
|
9
|
-
throw new Error(
|
|
8
|
+
throw new Error("can not start mserver without options");
|
|
10
9
|
}
|
|
11
10
|
const server = new Server(options);
|
|
12
11
|
return server.init();
|
|
13
|
-
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
ModernServer,
|
|
15
|
+
Server,
|
|
16
|
+
createProxyHandler,
|
|
17
|
+
src_default as default
|
|
18
|
+
};
|
|
@@ -1,65 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import fresh from 'fresh';
|
|
1
|
+
import { URL } from "url";
|
|
2
|
+
import qs from "querystring";
|
|
3
|
+
import { Buffer } from "buffer";
|
|
4
|
+
import createEtag from "etag";
|
|
5
|
+
import fresh from "fresh";
|
|
7
6
|
import { headersWithoutCookie } from "../../utils";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* http request
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* http response
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* url params
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
get logger() {
|
|
22
|
-
return this.req.logger;
|
|
23
|
-
}
|
|
24
|
-
get metrics() {
|
|
25
|
-
return this.req.metrics;
|
|
26
|
-
}
|
|
7
|
+
class ModernServerContext {
|
|
27
8
|
constructor(req, res, options) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
_defineProperty(this, "params", {});
|
|
31
|
-
_defineProperty(this, "serverData", void 0);
|
|
32
|
-
_defineProperty(this, "options", {});
|
|
9
|
+
this.params = {};
|
|
10
|
+
this.options = {};
|
|
33
11
|
this.req = req;
|
|
34
12
|
this.res = res;
|
|
35
13
|
this.options = options || {};
|
|
36
14
|
this.serverData = {};
|
|
37
15
|
this.bind();
|
|
38
16
|
}
|
|
17
|
+
get logger() {
|
|
18
|
+
return this.req.logger;
|
|
19
|
+
}
|
|
20
|
+
get metrics() {
|
|
21
|
+
return this.req.metrics;
|
|
22
|
+
}
|
|
39
23
|
bind() {
|
|
40
|
-
const {
|
|
41
|
-
|
|
42
|
-
res
|
|
43
|
-
} = this;
|
|
44
|
-
req.get = key => this.getReqHeader(key);
|
|
24
|
+
const { req, res } = this;
|
|
25
|
+
req.get = (key) => this.getReqHeader(key);
|
|
45
26
|
res.set = (key, value) => this.res.setHeader(key, value);
|
|
46
|
-
res.send = body => {
|
|
27
|
+
res.send = (body) => {
|
|
47
28
|
this.send(body);
|
|
48
29
|
};
|
|
49
30
|
}
|
|
50
|
-
|
|
51
|
-
// compat express res.send, only support etag now
|
|
52
31
|
send(body) {
|
|
53
32
|
try {
|
|
54
|
-
const generateETag = !this.res.getHeader(
|
|
55
|
-
if (body !==
|
|
56
|
-
const encoding = typeof body ===
|
|
33
|
+
const generateETag = !this.res.getHeader("ETag") && this.options.etag;
|
|
34
|
+
if (body !== void 0 && generateETag) {
|
|
35
|
+
const encoding = typeof body === "string" ? "utf-8" : void 0;
|
|
57
36
|
const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;
|
|
58
|
-
const etag = createEtag(buf, {
|
|
59
|
-
weak: true
|
|
60
|
-
});
|
|
37
|
+
const etag = createEtag(buf, { weak: true });
|
|
61
38
|
if (etag) {
|
|
62
|
-
this.res.setHeader(
|
|
39
|
+
this.res.setHeader("ETag", etag);
|
|
63
40
|
}
|
|
64
41
|
}
|
|
65
42
|
if (this.fresh) {
|
|
@@ -77,39 +54,29 @@ export class ModernServerContext {
|
|
|
77
54
|
this.serverData[key] = value;
|
|
78
55
|
}
|
|
79
56
|
getReqHeader(key) {
|
|
80
|
-
const {
|
|
81
|
-
req
|
|
82
|
-
} = this;
|
|
57
|
+
const { req } = this;
|
|
83
58
|
const field = key.toLowerCase();
|
|
84
59
|
switch (field) {
|
|
85
|
-
case
|
|
86
|
-
case
|
|
87
|
-
return req.headers.referrer || req.headers.referer ||
|
|
60
|
+
case "referer":
|
|
61
|
+
case "referrer":
|
|
62
|
+
return req.headers.referrer || req.headers.referer || "";
|
|
88
63
|
default:
|
|
89
|
-
return req.headers[field] ||
|
|
64
|
+
return req.headers[field] || "";
|
|
90
65
|
}
|
|
91
66
|
}
|
|
92
67
|
get fresh() {
|
|
93
|
-
const {
|
|
94
|
-
|
|
95
|
-
res,
|
|
96
|
-
method
|
|
97
|
-
} = this;
|
|
98
|
-
|
|
99
|
-
// GET or HEAD for weak freshness validation only
|
|
100
|
-
if ('GET' !== method && 'HEAD' !== method) {
|
|
68
|
+
const { status, res, method } = this;
|
|
69
|
+
if ("GET" !== method && "HEAD" !== method) {
|
|
101
70
|
return false;
|
|
102
71
|
}
|
|
103
72
|
if (status >= 200 && status < 300 || 304 === status) {
|
|
104
73
|
return fresh(this.headers, {
|
|
105
|
-
etag: res.getHeader(
|
|
106
|
-
|
|
74
|
+
etag: res.getHeader("ETag"),
|
|
75
|
+
"last-modified": res.getHeader("Last-Modified")
|
|
107
76
|
});
|
|
108
77
|
}
|
|
109
78
|
return false;
|
|
110
79
|
}
|
|
111
|
-
|
|
112
|
-
/* request property */
|
|
113
80
|
get headers() {
|
|
114
81
|
return this.req.headers;
|
|
115
82
|
}
|
|
@@ -117,24 +84,24 @@ export class ModernServerContext {
|
|
|
117
84
|
return this.req.method;
|
|
118
85
|
}
|
|
119
86
|
get url() {
|
|
120
|
-
return this.req.url ||
|
|
87
|
+
return this.req.url || "";
|
|
121
88
|
}
|
|
122
89
|
set url(val) {
|
|
123
90
|
this.req.url = val;
|
|
124
91
|
}
|
|
125
92
|
get host() {
|
|
126
|
-
let host = this.getReqHeader(
|
|
93
|
+
let host = this.getReqHeader("X-Forwarded-Host");
|
|
127
94
|
if (!host) {
|
|
128
|
-
host = this.getReqHeader(
|
|
95
|
+
host = this.getReqHeader("Host");
|
|
129
96
|
}
|
|
130
|
-
return host.split(/\s*,\s*/, 1)[0] ||
|
|
97
|
+
return host.split(/\s*,\s*/, 1)[0] || "";
|
|
131
98
|
}
|
|
132
99
|
get protocol() {
|
|
133
100
|
if (this.req.socket.encrypted) {
|
|
134
|
-
return
|
|
101
|
+
return "https";
|
|
135
102
|
}
|
|
136
|
-
const proto = this.getReqHeader(
|
|
137
|
-
return proto ? proto.split(/\s*,\s*/, 1)[0] :
|
|
103
|
+
const proto = this.getReqHeader("X-Forwarded-Proto");
|
|
104
|
+
return proto ? proto.split(/\s*,\s*/, 1)[0] : "http";
|
|
138
105
|
}
|
|
139
106
|
get origin() {
|
|
140
107
|
return `${this.protocol}://${this.host}`;
|
|
@@ -151,7 +118,6 @@ export class ModernServerContext {
|
|
|
151
118
|
}
|
|
152
119
|
set path(p) {
|
|
153
120
|
const url = new URL(this.req.url, this.origin);
|
|
154
|
-
// this should never happened
|
|
155
121
|
if (!url || !p) {
|
|
156
122
|
return;
|
|
157
123
|
}
|
|
@@ -163,30 +129,32 @@ export class ModernServerContext {
|
|
|
163
129
|
}
|
|
164
130
|
get querystring() {
|
|
165
131
|
if (!this.req) {
|
|
166
|
-
return
|
|
132
|
+
return "";
|
|
167
133
|
}
|
|
168
|
-
return this.parsedURL.search.replace(/^\?/,
|
|
134
|
+
return this.parsedURL.search.replace(/^\?/, "") || "";
|
|
169
135
|
}
|
|
170
136
|
get query() {
|
|
171
137
|
const str = this.querystring;
|
|
172
138
|
return qs.parse(str);
|
|
173
139
|
}
|
|
174
|
-
|
|
175
|
-
/* response property */
|
|
176
140
|
get status() {
|
|
177
141
|
return this.res.statusCode;
|
|
178
142
|
}
|
|
179
143
|
set status(statusCode) {
|
|
180
144
|
this.res.statusCode = statusCode;
|
|
181
145
|
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* 判断链接是否已经关闭
|
|
185
|
-
*/
|
|
186
146
|
resHasHandled() {
|
|
187
147
|
return this.res.writableEnded;
|
|
188
148
|
}
|
|
189
|
-
error(dig, e =
|
|
190
|
-
this.logger.error(
|
|
191
|
-
|
|
192
|
-
|
|
149
|
+
error(dig, e = "") {
|
|
150
|
+
this.logger.error(
|
|
151
|
+
`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`,
|
|
152
|
+
e instanceof Error ? e.stack || e.message : e,
|
|
153
|
+
this.path,
|
|
154
|
+
headersWithoutCookie(this.headers)
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
ModernServerContext
|
|
160
|
+
};
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { ModernServerContext } from "./context";
|
|
2
|
-
|
|
3
|
-
export {
|
|
2
|
+
const createContext = (req, res, options) => new ModernServerContext(req, res, options);
|
|
3
|
+
export {
|
|
4
|
+
ModernServerContext,
|
|
5
|
+
createContext
|
|
6
|
+
};
|
|
@@ -1,16 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
import cookie from "cookie";
|
|
5
21
|
import { RouteAPI } from "./route";
|
|
6
22
|
import { TemplateAPI } from "./template";
|
|
7
23
|
class Response {
|
|
8
24
|
constructor(res) {
|
|
9
|
-
_defineProperty(this, "cookies", void 0);
|
|
10
|
-
_defineProperty(this, "res", void 0);
|
|
11
|
-
_defineProperty(this, "_cookie", void 0);
|
|
12
25
|
this.res = res;
|
|
13
|
-
this._cookie = cookie.parse(res.getHeader(
|
|
26
|
+
this._cookie = cookie.parse(res.getHeader("set-cookie") || "");
|
|
14
27
|
this.cookies = {
|
|
15
28
|
get: this.getCookie.bind(this),
|
|
16
29
|
set: this.setCookie.bind(this),
|
|
@@ -45,17 +58,15 @@ class Response {
|
|
|
45
58
|
applyCookie() {
|
|
46
59
|
const str = Object.entries(this._cookie).map(([key, value]) => {
|
|
47
60
|
return cookie.serialize(key, value);
|
|
48
|
-
}).join(
|
|
61
|
+
}).join("; ");
|
|
49
62
|
if (str) {
|
|
50
|
-
this.res.setHeader(
|
|
63
|
+
this.res.setHeader("set-cookie", str);
|
|
51
64
|
} else {
|
|
52
|
-
this.res.removeHeader(
|
|
65
|
+
this.res.removeHeader("set-cookie");
|
|
53
66
|
}
|
|
54
67
|
}
|
|
55
|
-
raw(body, {
|
|
56
|
-
status,
|
|
57
|
-
headers
|
|
58
|
-
}) {
|
|
68
|
+
raw(body, options) {
|
|
69
|
+
const { status, headers = {} } = options || {};
|
|
59
70
|
Object.entries(headers).forEach(([key, value]) => {
|
|
60
71
|
this.res.setHeader(key, value);
|
|
61
72
|
});
|
|
@@ -67,18 +78,12 @@ class Response {
|
|
|
67
78
|
}
|
|
68
79
|
class Request {
|
|
69
80
|
constructor(ctx) {
|
|
70
|
-
|
|
71
|
-
_defineProperty(this, "pathname", void 0);
|
|
72
|
-
_defineProperty(this, "query", void 0);
|
|
73
|
-
_defineProperty(this, "headers", void 0);
|
|
74
|
-
_defineProperty(this, "cookie", void 0);
|
|
75
|
-
_defineProperty(this, "cookies", void 0);
|
|
76
|
-
_defineProperty(this, "_cookie", void 0);
|
|
81
|
+
this.url = ctx.url;
|
|
77
82
|
this.host = ctx.host;
|
|
78
83
|
this.pathname = ctx.path;
|
|
79
84
|
this.query = ctx.query;
|
|
80
85
|
this.headers = ctx.headers;
|
|
81
|
-
this.cookie = ctx.headers.cookie ||
|
|
86
|
+
this.cookie = ctx.headers.cookie || "";
|
|
82
87
|
this._cookie = cookie.parse(this.cookie);
|
|
83
88
|
this.cookies = {
|
|
84
89
|
get: this.getCookie.bind(this)
|
|
@@ -88,10 +93,8 @@ class Request {
|
|
|
88
93
|
return this._cookie[key];
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
|
-
|
|
92
|
-
const {
|
|
93
|
-
res
|
|
94
|
-
} = context;
|
|
96
|
+
const base = (context) => {
|
|
97
|
+
const { res } = context;
|
|
95
98
|
return {
|
|
96
99
|
response: new Response(res),
|
|
97
100
|
request: new Request(context),
|
|
@@ -99,22 +102,22 @@ export const base = context => {
|
|
|
99
102
|
metrics: context.metrics
|
|
100
103
|
};
|
|
101
104
|
};
|
|
102
|
-
|
|
105
|
+
const createAfterMatchContext = (context, entryName) => {
|
|
103
106
|
const baseContext = base(context);
|
|
104
|
-
return
|
|
107
|
+
return __spreadProps(__spreadValues({}, baseContext), {
|
|
105
108
|
router: new RouteAPI(entryName)
|
|
106
109
|
});
|
|
107
110
|
};
|
|
108
|
-
|
|
111
|
+
const createAfterRenderContext = (context, content) => {
|
|
109
112
|
const baseContext = base(context);
|
|
110
|
-
return
|
|
113
|
+
return __spreadProps(__spreadValues({}, baseContext), {
|
|
111
114
|
template: new TemplateAPI(content)
|
|
112
115
|
});
|
|
113
116
|
};
|
|
114
|
-
|
|
117
|
+
const createMiddlewareContext = (context) => {
|
|
115
118
|
const baseContext = base(context);
|
|
116
|
-
return
|
|
117
|
-
response:
|
|
119
|
+
return __spreadProps(__spreadValues({}, baseContext), {
|
|
120
|
+
response: __spreadProps(__spreadValues({}, baseContext.response), {
|
|
118
121
|
locals: context.res.locals || {}
|
|
119
122
|
}),
|
|
120
123
|
source: {
|
|
@@ -122,4 +125,10 @@ export const createMiddlewareContext = context => {
|
|
|
122
125
|
res: context.res
|
|
123
126
|
}
|
|
124
127
|
});
|
|
125
|
-
};
|
|
128
|
+
};
|
|
129
|
+
export {
|
|
130
|
+
base,
|
|
131
|
+
createAfterMatchContext,
|
|
132
|
+
createAfterRenderContext,
|
|
133
|
+
createMiddlewareContext
|
|
134
|
+
};
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export class RouteAPI {
|
|
1
|
+
class RouteAPI {
|
|
3
2
|
constructor(entryName) {
|
|
4
|
-
_defineProperty(this, "current", void 0);
|
|
5
|
-
_defineProperty(this, "status", void 0);
|
|
6
|
-
_defineProperty(this, "url", void 0);
|
|
7
3
|
this.current = entryName;
|
|
8
4
|
this.status = 200;
|
|
9
|
-
this.url =
|
|
5
|
+
this.url = "";
|
|
10
6
|
}
|
|
11
7
|
redirect(url, status = 302) {
|
|
12
8
|
this.url = url;
|
|
@@ -18,4 +14,7 @@ export class RouteAPI {
|
|
|
18
14
|
use(entryName) {
|
|
19
15
|
this.rewrite(entryName);
|
|
20
16
|
}
|
|
21
|
-
}
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
RouteAPI
|
|
20
|
+
};
|