@modern-js/prod-server 1.21.5 → 2.0.0-beta.1
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 +91 -10
- package/dist/js/modern/constants.js +0 -2
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/libs/context/context.js +10 -56
- package/dist/js/modern/libs/hook-api/index.js +125 -0
- package/dist/js/modern/libs/hook-api/route.js +13 -36
- package/dist/js/modern/libs/hook-api/template.js +38 -15
- package/dist/js/modern/libs/loadConfig.js +3 -10
- package/dist/js/modern/libs/metrics.js +6 -6
- package/dist/js/modern/libs/proxy.js +7 -12
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -1
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -9
- package/dist/js/modern/libs/render/cache/index.js +37 -28
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -10
- package/dist/js/modern/libs/render/cache/spr.js +12 -62
- package/dist/js/modern/libs/render/cache/util.js +0 -6
- package/dist/js/modern/libs/render/index.js +6 -11
- package/dist/js/modern/libs/render/measure.js +7 -10
- package/dist/js/modern/libs/render/modern/index.js +2 -13
- package/dist/js/modern/libs/render/reader.js +13 -24
- package/dist/js/modern/libs/render/ssr.js +24 -12
- package/dist/js/modern/libs/render/static.js +6 -9
- package/dist/js/modern/libs/render/type.js +0 -1
- package/dist/js/modern/libs/route/index.js +8 -19
- package/dist/js/modern/libs/route/matcher.js +21 -29
- package/dist/js/modern/libs/route/route.js +0 -13
- package/dist/js/modern/libs/serve-file.js +13 -6
- package/dist/js/modern/server/index.js +27 -43
- package/dist/js/modern/server/modern-server-split.js +5 -55
- package/dist/js/modern/server/modern-server.js +179 -250
- package/dist/js/modern/utils.js +2 -21
- package/dist/js/modern/worker-server.js +34 -0
- package/dist/js/node/constants.js +0 -2
- package/dist/js/node/index.js +0 -10
- package/dist/js/node/libs/context/context.js +10 -65
- package/dist/js/node/libs/context/index.js +0 -3
- package/dist/js/node/libs/hook-api/index.js +136 -0
- package/dist/js/node/libs/hook-api/route.js +13 -38
- package/dist/js/node/libs/hook-api/template.js +40 -18
- package/dist/js/node/libs/loadConfig.js +3 -22
- package/dist/js/node/libs/metrics.js +6 -6
- package/dist/js/node/libs/proxy.js +7 -17
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -5
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -12
- package/dist/js/node/libs/render/cache/index.js +37 -33
- package/dist/js/node/libs/render/cache/page-caches/index.js +0 -2
- package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -14
- package/dist/js/node/libs/render/cache/spr.js +12 -71
- package/dist/js/node/libs/render/cache/util.js +0 -18
- package/dist/js/node/libs/render/index.js +6 -26
- package/dist/js/node/libs/render/measure.js +5 -15
- package/dist/js/node/libs/render/modern/index.js +2 -20
- package/dist/js/node/libs/render/reader.js +12 -39
- package/dist/js/node/libs/render/ssr.js +23 -22
- package/dist/js/node/libs/render/static.js +6 -18
- package/dist/js/node/libs/render/type.js +0 -1
- package/dist/js/node/libs/route/index.js +8 -22
- package/dist/js/node/libs/route/matcher.js +18 -34
- package/dist/js/node/libs/route/route.js +0 -15
- package/dist/js/node/libs/serve-file.js +15 -12
- package/dist/js/node/server/index.js +26 -62
- package/dist/js/node/server/modern-server-split.js +5 -58
- package/dist/js/node/server/modern-server.js +178 -280
- package/dist/js/node/utils.js +3 -46
- package/dist/js/node/worker-server.js +41 -0
- package/dist/js/treeshaking/constants.js +28 -0
- package/dist/js/treeshaking/index.js +13 -0
- package/dist/js/treeshaking/libs/context/context.js +243 -0
- package/dist/js/treeshaking/libs/context/index.js +5 -0
- package/dist/js/treeshaking/libs/hook-api/index.js +157 -0
- package/dist/js/treeshaking/libs/hook-api/route.js +33 -0
- package/dist/js/treeshaking/libs/hook-api/template.js +91 -0
- package/dist/js/treeshaking/libs/loadConfig.js +39 -0
- package/dist/js/treeshaking/libs/metrics.js +12 -0
- package/dist/js/treeshaking/libs/proxy.js +80 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +124 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +464 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +53 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +35 -0
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +121 -0
- package/dist/js/treeshaking/libs/render/cache/index.js +184 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +30 -0
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +46 -0
- package/dist/js/treeshaking/libs/render/cache/spr.js +362 -0
- package/dist/js/treeshaking/libs/render/cache/type.js +1 -0
- package/dist/js/treeshaking/libs/render/cache/util.js +101 -0
- package/dist/js/treeshaking/libs/render/index.js +100 -0
- package/dist/js/treeshaking/libs/render/measure.js +61 -0
- package/dist/js/treeshaking/libs/render/modern/browser-list.js +7 -0
- package/dist/js/treeshaking/libs/render/modern/index.js +39 -0
- package/dist/js/treeshaking/libs/render/reader.js +191 -0
- package/dist/js/treeshaking/libs/render/ssr.js +98 -0
- package/dist/js/treeshaking/libs/render/static.js +84 -0
- package/dist/js/treeshaking/libs/render/type.js +6 -0
- package/dist/js/treeshaking/libs/route/index.js +94 -0
- package/dist/js/treeshaking/libs/route/matcher.js +113 -0
- package/dist/js/treeshaking/libs/route/route.js +26 -0
- package/dist/js/treeshaking/libs/serve-file.js +75 -0
- package/dist/js/treeshaking/server/index.js +343 -0
- package/dist/js/treeshaking/server/modern-server-split.js +152 -0
- package/dist/js/treeshaking/server/modern-server.js +945 -0
- package/dist/js/treeshaking/type.js +1 -0
- package/dist/js/treeshaking/utils.js +87 -0
- package/dist/js/treeshaking/worker-server.js +56 -0
- package/dist/types/index.d.ts +0 -2
- package/dist/types/libs/context/context.d.ts +0 -3
- package/dist/types/libs/hook-api/index.d.ts +5 -0
- package/dist/types/libs/hook-api/route.d.ts +9 -14
- package/dist/types/libs/hook-api/template.d.ts +19 -9
- package/dist/types/libs/loadConfig.d.ts +0 -1
- package/dist/types/libs/render/cache/index.d.ts +4 -4
- package/dist/types/libs/render/cache/spr.d.ts +0 -2
- package/dist/types/libs/render/type.d.ts +3 -1
- package/dist/types/libs/serve-file.d.ts +2 -1
- package/dist/types/server/index.d.ts +2 -3
- package/dist/types/server/modern-server.d.ts +11 -11
- package/dist/types/type.d.ts +8 -10
- package/dist/types/utils.d.ts +0 -1
- package/dist/types/worker-server.d.ts +16 -0
- package/package.json +28 -35
package/CHANGELOG.md
CHANGED
|
@@ -1,25 +1,106 @@
|
|
|
1
1
|
# @modern-js/prod-server
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 2.0.0-beta.1
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- dda38c9: chore: v2
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
- @modern-js/utils@1.21.5
|
|
9
|
+
### Minor Changes
|
|
9
10
|
|
|
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 的请求
|
|
11
15
|
|
|
12
16
|
### Patch Changes
|
|
13
17
|
|
|
14
|
-
-
|
|
15
|
-
|
|
18
|
+
- d032d49: export createHandle
|
|
19
|
+
导出 createHandle 函数
|
|
20
|
+
- 15bf09d9c8: feat: support completely custom server, export render() api for render single page
|
|
21
|
+
feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
|
|
22
|
+
- cc971eabfc: refactor: move server plugin load logic in `@modern-js/core`
|
|
23
|
+
refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
|
|
24
|
+
- 40ed587: feat: inject css chunk into html for streaming ssr
|
|
25
|
+
feat: streaming ssr 返回的 html 注入 css chunk
|
|
26
|
+
- 102d32e4ba: feat(server): add `req` and `res` to SSR context
|
|
27
|
+
|
|
28
|
+
feat(server): 添加 `req` 和 `res` 到 SSR context 中
|
|
29
|
+
|
|
30
|
+
- 3bbea92b2a: feat: support Hook、Middleware new API
|
|
31
|
+
feat: 支持 Hook、Middleware 的新 API
|
|
32
|
+
- 73cd29dd9f: fix(server): add favicon fallback handler
|
|
33
|
+
|
|
34
|
+
fix(server): 添加 favicon 兜底处理逻辑
|
|
35
|
+
|
|
36
|
+
- 18aaf42: fix: fix server loader redirects
|
|
37
|
+
fix: 修复 server loader 重定向错误
|
|
38
|
+
- 14b712d: fix: use consistent alias type and default value across packages
|
|
39
|
+
|
|
40
|
+
fix: 在各个包中使用一致的 alias 类型定义和默认值
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [15bf09d9c8]
|
|
43
|
+
- Updated dependencies [92f0ead]
|
|
44
|
+
- Updated dependencies [edd1cfb1af]
|
|
45
|
+
- Updated dependencies [cc971eabfc]
|
|
46
|
+
- Updated dependencies [5b9049f]
|
|
47
|
+
- Updated dependencies [92004d1]
|
|
48
|
+
- Updated dependencies [b8bbe036c7]
|
|
49
|
+
- Updated dependencies [d5a31df781]
|
|
50
|
+
- Updated dependencies [dda38c9]
|
|
51
|
+
- Updated dependencies [3bbea92b2a]
|
|
52
|
+
- Updated dependencies [abf3421]
|
|
53
|
+
- Updated dependencies [543be9558e]
|
|
54
|
+
- Updated dependencies [14b712d]
|
|
55
|
+
- @modern-js/server-core@2.0.0-beta.1
|
|
56
|
+
- @modern-js/utils@2.0.0-beta.1
|
|
57
|
+
|
|
58
|
+
## 2.0.0-beta.0
|
|
16
59
|
|
|
17
|
-
|
|
60
|
+
### Major Changes
|
|
61
|
+
|
|
62
|
+
- dda38c9: chore: v2
|
|
63
|
+
|
|
64
|
+
### Minor Changes
|
|
65
|
+
|
|
66
|
+
- c9e800d39: feat: support React18 streaming SSR
|
|
67
|
+
feat: 支持 React18 流式 SSR
|
|
68
|
+
- 543be95: feat: compile server loader and support handle loader request
|
|
69
|
+
feat: 编译 server loader 并支持处理 loader 的请求
|
|
18
70
|
|
|
19
71
|
### Patch Changes
|
|
20
72
|
|
|
21
|
-
-
|
|
22
|
-
|
|
73
|
+
- 15bf09d9c: feat: support completely custom server, export render() api for render single page
|
|
74
|
+
feat: 支持完全自定义 Server,导出 render() 方法用来渲染单个页面
|
|
75
|
+
- cc971eabf: refactor: move server plugin load logic in `@modern-js/core`
|
|
76
|
+
refactor:移除在 `@modern-js/core` 中的 server 插件加载逻辑
|
|
77
|
+
- 102d32e4b: feat(server): add `req` and `res` to SSR context
|
|
78
|
+
|
|
79
|
+
feat(server): 添加 `req` 和 `res` 到 SSR context 中
|
|
80
|
+
|
|
81
|
+
- 3bbea92b2: feat: support Hook、Middleware new API
|
|
82
|
+
feat: 支持 Hook、Middleware 的新 API
|
|
83
|
+
- 73cd29dd9: fix(server): add favicon fallback handler
|
|
84
|
+
|
|
85
|
+
fix(server): 添加 favicon 兜底处理逻辑
|
|
86
|
+
|
|
87
|
+
- 14b712d: fix: use consistent alias type and default value across packages
|
|
88
|
+
|
|
89
|
+
fix: 在各个包中使用一致的 alias 类型定义和默认值
|
|
90
|
+
|
|
91
|
+
- Updated dependencies [15bf09d9c]
|
|
92
|
+
- Updated dependencies [edd1cfb1a]
|
|
93
|
+
- Updated dependencies [cc971eabf]
|
|
94
|
+
- Updated dependencies [5b9049f]
|
|
95
|
+
- Updated dependencies [b8bbe036c]
|
|
96
|
+
- Updated dependencies [d5a31df78]
|
|
97
|
+
- Updated dependencies [dda38c9]
|
|
98
|
+
- Updated dependencies [3bbea92b2]
|
|
99
|
+
- Updated dependencies [abf3421]
|
|
100
|
+
- Updated dependencies [543be95]
|
|
101
|
+
- Updated dependencies [14b712d]
|
|
102
|
+
- @modern-js/server-core@2.0.0-beta.0
|
|
103
|
+
- @modern-js/utils@2.0.0-beta.0
|
|
23
104
|
|
|
24
105
|
## 1.21.2
|
|
25
106
|
|
|
@@ -6,12 +6,10 @@ export const AGGRED_DIR = {
|
|
|
6
6
|
lambda: 'lambda'
|
|
7
7
|
};
|
|
8
8
|
export let ApiServerMode;
|
|
9
|
-
|
|
10
9
|
(function (ApiServerMode) {
|
|
11
10
|
ApiServerMode["func"] = "function";
|
|
12
11
|
ApiServerMode["frame"] = "framework";
|
|
13
12
|
})(ApiServerMode || (ApiServerMode = {}));
|
|
14
|
-
|
|
15
13
|
export const ERROR_DIGEST = {
|
|
16
14
|
INIT: 'Server init error',
|
|
17
15
|
ENOTF: 'Page could not be found',
|
package/dist/js/modern/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
2
|
import { URL } from 'url';
|
|
4
3
|
import qs from 'querystring';
|
|
5
4
|
import { Buffer } from 'buffer';
|
|
@@ -18,221 +17,176 @@ export class ModernServerContext {
|
|
|
18
17
|
/**
|
|
19
18
|
* url params
|
|
20
19
|
*/
|
|
20
|
+
|
|
21
21
|
get logger() {
|
|
22
22
|
return this.req.logger;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
24
|
get metrics() {
|
|
26
25
|
return this.req.metrics;
|
|
27
26
|
}
|
|
28
|
-
|
|
29
27
|
constructor(req, res, options) {
|
|
30
28
|
_defineProperty(this, "req", void 0);
|
|
31
|
-
|
|
32
29
|
_defineProperty(this, "res", void 0);
|
|
33
|
-
|
|
34
30
|
_defineProperty(this, "params", {});
|
|
35
|
-
|
|
36
31
|
_defineProperty(this, "serverData", void 0);
|
|
37
|
-
|
|
38
32
|
_defineProperty(this, "options", {});
|
|
39
|
-
|
|
40
33
|
this.req = req;
|
|
41
34
|
this.res = res;
|
|
42
35
|
this.options = options || {};
|
|
43
36
|
this.serverData = {};
|
|
44
37
|
this.bind();
|
|
45
38
|
}
|
|
46
|
-
|
|
47
39
|
bind() {
|
|
48
40
|
const {
|
|
49
41
|
req,
|
|
50
42
|
res
|
|
51
43
|
} = this;
|
|
52
|
-
|
|
53
44
|
req.get = key => this.getReqHeader(key);
|
|
54
|
-
|
|
55
45
|
res.set = (key, value) => this.res.setHeader(key, value);
|
|
56
|
-
|
|
57
46
|
res.send = body => {
|
|
58
47
|
this.send(body);
|
|
59
48
|
};
|
|
60
|
-
}
|
|
61
|
-
|
|
49
|
+
}
|
|
62
50
|
|
|
51
|
+
// compat express res.send, only support etag now
|
|
63
52
|
send(body) {
|
|
64
53
|
try {
|
|
65
54
|
const generateETag = !this.res.getHeader('ETag') && this.options.etag;
|
|
66
|
-
|
|
67
55
|
if (body !== undefined && generateETag) {
|
|
68
56
|
const encoding = typeof body === 'string' ? 'utf-8' : undefined;
|
|
69
57
|
const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;
|
|
70
58
|
const etag = createEtag(buf, {
|
|
71
59
|
weak: true
|
|
72
60
|
});
|
|
73
|
-
|
|
74
61
|
if (etag) {
|
|
75
62
|
this.res.setHeader('ETag', etag);
|
|
76
63
|
}
|
|
77
64
|
}
|
|
78
|
-
|
|
79
65
|
if (this.fresh) {
|
|
80
66
|
this.status = 304;
|
|
81
67
|
}
|
|
82
68
|
} catch (e) {
|
|
83
69
|
this.logger.error(e.message);
|
|
84
70
|
}
|
|
85
|
-
|
|
86
71
|
this.res.end(body);
|
|
87
72
|
}
|
|
88
|
-
|
|
89
73
|
setParams(params) {
|
|
90
74
|
this.params = params;
|
|
91
75
|
}
|
|
92
|
-
|
|
93
76
|
setServerData(key, value) {
|
|
94
77
|
this.serverData[key] = value;
|
|
95
78
|
}
|
|
96
|
-
|
|
97
79
|
getReqHeader(key) {
|
|
98
80
|
const {
|
|
99
81
|
req
|
|
100
82
|
} = this;
|
|
101
83
|
const field = key.toLowerCase();
|
|
102
|
-
|
|
103
84
|
switch (field) {
|
|
104
85
|
case 'referer':
|
|
105
86
|
case 'referrer':
|
|
106
87
|
return req.headers.referrer || req.headers.referer || '';
|
|
107
|
-
|
|
108
88
|
default:
|
|
109
89
|
return req.headers[field] || '';
|
|
110
90
|
}
|
|
111
91
|
}
|
|
112
|
-
|
|
113
92
|
get fresh() {
|
|
114
93
|
const {
|
|
115
94
|
status,
|
|
116
95
|
res,
|
|
117
96
|
method
|
|
118
|
-
} = this;
|
|
97
|
+
} = this;
|
|
119
98
|
|
|
99
|
+
// GET or HEAD for weak freshness validation only
|
|
120
100
|
if ('GET' !== method && 'HEAD' !== method) {
|
|
121
101
|
return false;
|
|
122
102
|
}
|
|
123
|
-
|
|
124
103
|
if (status >= 200 && status < 300 || 304 === status) {
|
|
125
104
|
return fresh(this.headers, {
|
|
126
105
|
etag: res.getHeader('ETag'),
|
|
127
106
|
'last-modified': res.getHeader('Last-Modified')
|
|
128
107
|
});
|
|
129
108
|
}
|
|
130
|
-
|
|
131
109
|
return false;
|
|
132
110
|
}
|
|
133
|
-
/* request property */
|
|
134
|
-
|
|
135
111
|
|
|
112
|
+
/* request property */
|
|
136
113
|
get headers() {
|
|
137
114
|
return this.req.headers;
|
|
138
115
|
}
|
|
139
|
-
|
|
140
116
|
get method() {
|
|
141
117
|
return this.req.method;
|
|
142
118
|
}
|
|
143
|
-
|
|
144
119
|
get url() {
|
|
145
120
|
return this.req.url || '';
|
|
146
121
|
}
|
|
147
|
-
|
|
148
122
|
set url(val) {
|
|
149
123
|
this.req.url = val;
|
|
150
124
|
}
|
|
151
|
-
|
|
152
125
|
get host() {
|
|
153
126
|
let host = this.getReqHeader('X-Forwarded-Host');
|
|
154
|
-
|
|
155
127
|
if (!host) {
|
|
156
128
|
host = this.getReqHeader('Host');
|
|
157
129
|
}
|
|
158
|
-
|
|
159
130
|
return host.split(/\s*,\s*/, 1)[0] || '';
|
|
160
131
|
}
|
|
161
|
-
|
|
162
132
|
get protocol() {
|
|
163
133
|
if (this.req.socket.encrypted) {
|
|
164
134
|
return 'https';
|
|
165
135
|
}
|
|
166
|
-
|
|
167
136
|
const proto = this.getReqHeader('X-Forwarded-Proto');
|
|
168
137
|
return proto ? proto.split(/\s*,\s*/, 1)[0] : 'http';
|
|
169
138
|
}
|
|
170
|
-
|
|
171
139
|
get origin() {
|
|
172
140
|
return `${this.protocol}://${this.host}`;
|
|
173
141
|
}
|
|
174
|
-
|
|
175
142
|
get href() {
|
|
176
143
|
return this.origin + this.url;
|
|
177
144
|
}
|
|
178
|
-
|
|
179
145
|
get parsedURL() {
|
|
180
146
|
const url = new URL(this.req.url, this.origin);
|
|
181
147
|
return url;
|
|
182
148
|
}
|
|
183
|
-
|
|
184
149
|
get path() {
|
|
185
150
|
return this.parsedURL.pathname;
|
|
186
151
|
}
|
|
187
|
-
|
|
188
152
|
set path(p) {
|
|
189
|
-
const url = new URL(this.req.url, this.origin);
|
|
190
|
-
|
|
153
|
+
const url = new URL(this.req.url, this.origin);
|
|
154
|
+
// this should never happened
|
|
191
155
|
if (!url || !p) {
|
|
192
156
|
return;
|
|
193
157
|
}
|
|
194
|
-
|
|
195
158
|
if (url.pathname === p) {
|
|
196
159
|
return;
|
|
197
160
|
}
|
|
198
|
-
|
|
199
161
|
url.pathname = p;
|
|
200
162
|
this.url = url.toString();
|
|
201
163
|
}
|
|
202
|
-
|
|
203
164
|
get querystring() {
|
|
204
165
|
if (!this.req) {
|
|
205
166
|
return '';
|
|
206
167
|
}
|
|
207
|
-
|
|
208
168
|
return this.parsedURL.search.replace(/^\?/, '') || '';
|
|
209
169
|
}
|
|
210
|
-
|
|
211
170
|
get query() {
|
|
212
171
|
const str = this.querystring;
|
|
213
172
|
return qs.parse(str);
|
|
214
173
|
}
|
|
215
|
-
/* response property */
|
|
216
|
-
|
|
217
174
|
|
|
175
|
+
/* response property */
|
|
218
176
|
get status() {
|
|
219
177
|
return this.res.statusCode;
|
|
220
178
|
}
|
|
221
|
-
|
|
222
179
|
set status(statusCode) {
|
|
223
180
|
this.res.statusCode = statusCode;
|
|
224
181
|
}
|
|
182
|
+
|
|
225
183
|
/**
|
|
226
184
|
* 判断链接是否已经关闭
|
|
227
185
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
186
|
resHasHandled() {
|
|
231
187
|
return this.res.writableEnded;
|
|
232
188
|
}
|
|
233
|
-
|
|
234
189
|
error(dig, e = '') {
|
|
235
190
|
this.logger.error(`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, this.path, headersWithoutCookie(this.headers));
|
|
236
191
|
}
|
|
237
|
-
|
|
238
192
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
3
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
import cookie from 'cookie';
|
|
5
|
+
import { RouteAPI } from "./route";
|
|
6
|
+
import { TemplateAPI } from "./template";
|
|
7
|
+
class Response {
|
|
8
|
+
constructor(res) {
|
|
9
|
+
_defineProperty(this, "cookies", void 0);
|
|
10
|
+
_defineProperty(this, "res", void 0);
|
|
11
|
+
_defineProperty(this, "_cookie", void 0);
|
|
12
|
+
this.res = res;
|
|
13
|
+
this._cookie = cookie.parse(res.getHeader('set-cookie') || '');
|
|
14
|
+
this.cookies = {
|
|
15
|
+
get: this.getCookie.bind(this),
|
|
16
|
+
set: this.setCookie.bind(this),
|
|
17
|
+
delete: this.deleteCookie.bind(this),
|
|
18
|
+
clear: this.clearCookie.bind(this),
|
|
19
|
+
apply: this.applyCookie.bind(this)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
get(key) {
|
|
23
|
+
return this.res.getHeader(key);
|
|
24
|
+
}
|
|
25
|
+
set(key, value) {
|
|
26
|
+
return this.res.setHeader(key, value);
|
|
27
|
+
}
|
|
28
|
+
status(code) {
|
|
29
|
+
this.res.statusCode = code;
|
|
30
|
+
}
|
|
31
|
+
getCookie(key) {
|
|
32
|
+
return this._cookie[key];
|
|
33
|
+
}
|
|
34
|
+
setCookie(key, value) {
|
|
35
|
+
this._cookie[key] = value;
|
|
36
|
+
}
|
|
37
|
+
deleteCookie(key) {
|
|
38
|
+
if (this._cookie[key]) {
|
|
39
|
+
delete this._cookie[key];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
clearCookie() {
|
|
43
|
+
this._cookie = {};
|
|
44
|
+
}
|
|
45
|
+
applyCookie() {
|
|
46
|
+
const str = Object.entries(this._cookie).map(([key, value]) => {
|
|
47
|
+
return cookie.serialize(key, value);
|
|
48
|
+
}).join('; ');
|
|
49
|
+
if (str) {
|
|
50
|
+
this.res.setHeader('set-cookie', str);
|
|
51
|
+
} else {
|
|
52
|
+
this.res.removeHeader('set-cookie');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
raw(body, {
|
|
56
|
+
status,
|
|
57
|
+
headers
|
|
58
|
+
}) {
|
|
59
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
60
|
+
this.res.setHeader(key, value);
|
|
61
|
+
});
|
|
62
|
+
if (status) {
|
|
63
|
+
this.res.statusCode = status;
|
|
64
|
+
}
|
|
65
|
+
this.res.end(body);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
class Request {
|
|
69
|
+
constructor(ctx) {
|
|
70
|
+
_defineProperty(this, "host", void 0);
|
|
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);
|
|
77
|
+
this.host = ctx.host;
|
|
78
|
+
this.pathname = ctx.path;
|
|
79
|
+
this.query = ctx.query;
|
|
80
|
+
this.headers = ctx.headers;
|
|
81
|
+
this.cookie = ctx.headers.cookie || '';
|
|
82
|
+
this._cookie = cookie.parse(this.cookie);
|
|
83
|
+
this.cookies = {
|
|
84
|
+
get: this.getCookie.bind(this)
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
getCookie(key) {
|
|
88
|
+
return this._cookie[key];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export const base = context => {
|
|
92
|
+
const {
|
|
93
|
+
res
|
|
94
|
+
} = context;
|
|
95
|
+
return {
|
|
96
|
+
response: new Response(res),
|
|
97
|
+
request: new Request(context),
|
|
98
|
+
logger: context.logger,
|
|
99
|
+
metrics: context.metrics
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
export const createAfterMatchContext = (context, entryName) => {
|
|
103
|
+
const baseContext = base(context);
|
|
104
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
105
|
+
router: new RouteAPI(entryName)
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
export const createAfterRenderContext = (context, content) => {
|
|
109
|
+
const baseContext = base(context);
|
|
110
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
111
|
+
template: new TemplateAPI(content)
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
export const createMiddlewareContext = context => {
|
|
115
|
+
const baseContext = base(context);
|
|
116
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
117
|
+
response: _objectSpread(_objectSpread({}, baseContext.response), {}, {
|
|
118
|
+
locals: context.res.locals || {}
|
|
119
|
+
}),
|
|
120
|
+
source: {
|
|
121
|
+
req: context.req,
|
|
122
|
+
res: context.res
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
};
|
|
@@ -1,44 +1,21 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
constructor(matched, router, url) {
|
|
5
|
-
_defineProperty(this, "router", void 0);
|
|
6
|
-
|
|
2
|
+
export class RouteAPI {
|
|
3
|
+
constructor(entryName) {
|
|
7
4
|
_defineProperty(this, "current", void 0);
|
|
8
|
-
|
|
5
|
+
_defineProperty(this, "status", void 0);
|
|
9
6
|
_defineProperty(this, "url", void 0);
|
|
10
|
-
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
13
|
-
this.url = url;
|
|
7
|
+
this.current = entryName;
|
|
8
|
+
this.status = 200;
|
|
9
|
+
this.url = '';
|
|
14
10
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
redirect(url, status = 302) {
|
|
12
|
+
this.url = url;
|
|
13
|
+
this.status = status;
|
|
18
14
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const {
|
|
22
|
-
router
|
|
23
|
-
} = this;
|
|
24
|
-
const matched = router.matchEntry(entryName);
|
|
25
|
-
return matched ? matched.generate(this.url) : null;
|
|
15
|
+
rewrite(entryName) {
|
|
16
|
+
this.current = entryName;
|
|
26
17
|
}
|
|
27
|
-
|
|
28
18
|
use(entryName) {
|
|
29
|
-
|
|
30
|
-
router
|
|
31
|
-
} = this;
|
|
32
|
-
const matched = router.matchEntry(entryName);
|
|
33
|
-
|
|
34
|
-
if (matched) {
|
|
35
|
-
this.current = matched;
|
|
36
|
-
return true;
|
|
37
|
-
} else {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
19
|
+
this.rewrite(entryName);
|
|
40
20
|
}
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export const createRouteAPI = (matched, router, url) => new RouteAPI(matched, router, url);
|
|
21
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
2
|
+
import { Transform } from 'stream';
|
|
3
3
|
const RegList = {
|
|
4
4
|
before: {
|
|
5
5
|
head: '<head>',
|
|
@@ -10,55 +10,78 @@ const RegList = {
|
|
|
10
10
|
body: '</body>'
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
|
-
|
|
14
|
-
class TemplateAPI {
|
|
13
|
+
export class TemplateAPI {
|
|
15
14
|
constructor(content) {
|
|
16
15
|
_defineProperty(this, "content", void 0);
|
|
17
|
-
|
|
18
16
|
this.content = content;
|
|
19
17
|
}
|
|
20
|
-
|
|
21
18
|
get() {
|
|
22
19
|
return this.content;
|
|
23
20
|
}
|
|
24
|
-
|
|
25
21
|
set(content) {
|
|
26
22
|
this.content = content;
|
|
27
23
|
}
|
|
28
|
-
|
|
29
24
|
prependHead(fragment) {
|
|
30
25
|
const {
|
|
31
26
|
head
|
|
32
27
|
} = RegList.before;
|
|
33
28
|
return this.replace(head, `${head}${fragment}`);
|
|
34
29
|
}
|
|
35
|
-
|
|
36
30
|
appendHead(fragment) {
|
|
37
31
|
const {
|
|
38
32
|
head
|
|
39
33
|
} = RegList.after;
|
|
40
34
|
return this.replace(head, `${fragment}${head}`);
|
|
41
35
|
}
|
|
42
|
-
|
|
43
36
|
prependBody(fragment) {
|
|
44
37
|
const {
|
|
45
38
|
body
|
|
46
39
|
} = RegList.before;
|
|
47
40
|
return this.replace(body, `${body}${fragment}`);
|
|
48
41
|
}
|
|
49
|
-
|
|
50
42
|
appendBody(fragment) {
|
|
51
43
|
const {
|
|
52
44
|
body
|
|
53
45
|
} = RegList.after;
|
|
54
46
|
return this.replace(body, `${fragment}${body}`);
|
|
55
47
|
}
|
|
56
|
-
|
|
57
48
|
replace(reg, text) {
|
|
58
49
|
this.content = this.content.replace(reg, text);
|
|
59
|
-
return this;
|
|
60
50
|
}
|
|
61
|
-
|
|
62
51
|
}
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
export const templateInjectableStream = ({
|
|
53
|
+
prependHead,
|
|
54
|
+
appendHead,
|
|
55
|
+
prependBody,
|
|
56
|
+
appendBody
|
|
57
|
+
}) => new Transform({
|
|
58
|
+
write(chunk, _, callback) {
|
|
59
|
+
let chunk_str = chunk.toString();
|
|
60
|
+
if (prependHead) {
|
|
61
|
+
const {
|
|
62
|
+
head
|
|
63
|
+
} = RegList.before;
|
|
64
|
+
chunk_str = chunk_str.replace(head, `${head}${prependHead}`);
|
|
65
|
+
}
|
|
66
|
+
if (appendHead) {
|
|
67
|
+
const {
|
|
68
|
+
head
|
|
69
|
+
} = RegList.after;
|
|
70
|
+
chunk_str = chunk_str.replace(head, `${appendHead}${head}`);
|
|
71
|
+
}
|
|
72
|
+
if (prependBody) {
|
|
73
|
+
const {
|
|
74
|
+
body
|
|
75
|
+
} = RegList.before;
|
|
76
|
+
chunk_str = chunk_str.replace(body, `${body}${prependBody}`);
|
|
77
|
+
}
|
|
78
|
+
if (appendBody) {
|
|
79
|
+
const {
|
|
80
|
+
body
|
|
81
|
+
} = RegList.after;
|
|
82
|
+
chunk_str = chunk_str.replace(body, `${appendBody}${body}`);
|
|
83
|
+
}
|
|
84
|
+
this.push(chunk_str);
|
|
85
|
+
callback();
|
|
86
|
+
}
|
|
87
|
+
});
|