@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/dist/js/modern/utils.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
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
|
-
|
|
3
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; }
|
|
4
|
-
|
|
5
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; }
|
|
6
|
-
|
|
7
|
-
import { compile } from 'path-to-regexp';
|
|
8
4
|
import { createDebugger, isProd } from '@modern-js/utils';
|
|
9
5
|
export const debug = createDebugger('prod-server');
|
|
10
6
|
export const mergeExtension = users => {
|
|
@@ -13,7 +9,8 @@ export const mergeExtension = users => {
|
|
|
13
9
|
middleware: output.concat(users)
|
|
14
10
|
};
|
|
15
11
|
};
|
|
16
|
-
export const noop = () => {
|
|
12
|
+
export const noop = () => {
|
|
13
|
+
// noop
|
|
17
14
|
};
|
|
18
15
|
export const createErrorDocument = (status, text) => {
|
|
19
16
|
const title = `${status}: ${text}`;
|
|
@@ -51,32 +48,22 @@ export const createErrorDocument = (status, text) => {
|
|
|
51
48
|
export const createMiddlewareCollecter = () => {
|
|
52
49
|
const webMiddlewares = [];
|
|
53
50
|
const apiMiddlewares = [];
|
|
54
|
-
|
|
55
51
|
const addWebMiddleware = input => {
|
|
56
52
|
webMiddlewares.push(input);
|
|
57
53
|
};
|
|
58
|
-
|
|
59
54
|
const addAPIMiddleware = input => {
|
|
60
55
|
apiMiddlewares.push(input);
|
|
61
56
|
};
|
|
62
|
-
|
|
63
57
|
const getMiddlewares = () => ({
|
|
64
58
|
web: webMiddlewares,
|
|
65
59
|
api: apiMiddlewares
|
|
66
60
|
});
|
|
67
|
-
|
|
68
61
|
return {
|
|
69
62
|
getMiddlewares,
|
|
70
63
|
addWebMiddleware,
|
|
71
64
|
addAPIMiddleware
|
|
72
65
|
};
|
|
73
66
|
};
|
|
74
|
-
export const toPath = (reg, params) => {
|
|
75
|
-
const fn = compile(reg, {
|
|
76
|
-
encode: encodeURIComponent
|
|
77
|
-
});
|
|
78
|
-
return fn(params);
|
|
79
|
-
};
|
|
80
67
|
export const useLocalPrefix = url => {
|
|
81
68
|
return isProd() && !url.includes('.');
|
|
82
69
|
};
|
|
@@ -100,31 +87,25 @@ export const getStaticReg = (output = {}) => {
|
|
|
100
87
|
};
|
|
101
88
|
export const prepareFavicons = (favicon, faviconByEntries) => {
|
|
102
89
|
const faviconNames = [];
|
|
103
|
-
|
|
104
90
|
if (favicon) {
|
|
105
91
|
faviconNames.push(favicon.substring(favicon.lastIndexOf('/') + 1));
|
|
106
92
|
}
|
|
107
|
-
|
|
108
93
|
if (faviconByEntries) {
|
|
109
94
|
Object.keys(faviconByEntries).forEach(f => {
|
|
110
95
|
const curFavicon = faviconByEntries[f];
|
|
111
|
-
|
|
112
96
|
if (curFavicon) {
|
|
113
97
|
faviconNames.push(curFavicon.substring(curFavicon.lastIndexOf('/') + 1));
|
|
114
98
|
}
|
|
115
99
|
});
|
|
116
100
|
}
|
|
117
|
-
|
|
118
101
|
return faviconNames;
|
|
119
102
|
};
|
|
120
103
|
export const headersWithoutCookie = headers => {
|
|
121
104
|
if (typeof headers.cookie !== 'undefined') {
|
|
122
105
|
const safeHeaders = _objectSpread({}, headers);
|
|
123
|
-
|
|
124
106
|
delete safeHeaders.cookie;
|
|
125
107
|
return safeHeaders;
|
|
126
108
|
}
|
|
127
|
-
|
|
128
109
|
return headers;
|
|
129
110
|
};
|
|
130
111
|
export const isRedirect = code => {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RouteMatchManager } from "./libs/route";
|
|
2
|
+
export const createHandler = manifest => {
|
|
3
|
+
const routeMgr = new RouteMatchManager();
|
|
4
|
+
const {
|
|
5
|
+
pages,
|
|
6
|
+
routes
|
|
7
|
+
} = manifest;
|
|
8
|
+
routeMgr.reset(routes);
|
|
9
|
+
return async ctx => {
|
|
10
|
+
var _ctx$request, _ctx$request$query, _ctx$request2, _ctx$request2$pathnam, _ctx$request3, _ctx$request3$params;
|
|
11
|
+
const pageMatch = routeMgr.match(ctx.url);
|
|
12
|
+
if (!pageMatch) {
|
|
13
|
+
ctx.body = '404: Page not found';
|
|
14
|
+
ctx.status = 404;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const page = pages[pageMatch.spec.urlPath];
|
|
18
|
+
(_ctx$request$query = (_ctx$request = ctx.request).query) !== null && _ctx$request$query !== void 0 ? _ctx$request$query : _ctx$request.query = ctx.query;
|
|
19
|
+
(_ctx$request2$pathnam = (_ctx$request2 = ctx.request).pathname) !== null && _ctx$request2$pathnam !== void 0 ? _ctx$request2$pathnam : _ctx$request2.pathname = ctx.pathname;
|
|
20
|
+
(_ctx$request3$params = (_ctx$request3 = ctx.request).params) !== null && _ctx$request3$params !== void 0 ? _ctx$request3$params : _ctx$request3.params = ctx.params;
|
|
21
|
+
const params = pageMatch.parseURLParams(ctx.url);
|
|
22
|
+
ctx.body = await page.serverRender({
|
|
23
|
+
template: page.template,
|
|
24
|
+
query: ctx.query,
|
|
25
|
+
request: ctx.request,
|
|
26
|
+
response: ctx.response,
|
|
27
|
+
pathname: ctx.pathname,
|
|
28
|
+
req: ctx.request,
|
|
29
|
+
res: ctx.response,
|
|
30
|
+
params: ctx.params || params || {}
|
|
31
|
+
});
|
|
32
|
+
ctx.status = 200;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
@@ -14,12 +14,10 @@ const AGGRED_DIR = {
|
|
|
14
14
|
exports.AGGRED_DIR = AGGRED_DIR;
|
|
15
15
|
let ApiServerMode;
|
|
16
16
|
exports.ApiServerMode = ApiServerMode;
|
|
17
|
-
|
|
18
17
|
(function (ApiServerMode) {
|
|
19
18
|
ApiServerMode["func"] = "function";
|
|
20
19
|
ApiServerMode["frame"] = "framework";
|
|
21
20
|
})(ApiServerMode || (exports.ApiServerMode = ApiServerMode = {}));
|
|
22
|
-
|
|
23
21
|
const ERROR_DIGEST = {
|
|
24
22
|
INIT: 'Server init error',
|
|
25
23
|
ENOTF: 'Page could not be found',
|
package/dist/js/node/index.js
CHANGED
|
@@ -27,15 +27,10 @@ Object.defineProperty(exports, "createProxyHandler", {
|
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
29
|
exports.default = void 0;
|
|
30
|
-
|
|
31
30
|
var _server = require("./server");
|
|
32
|
-
|
|
33
31
|
var _modernServer = require("./server/modern-server");
|
|
34
|
-
|
|
35
32
|
var _proxy = require("./libs/proxy");
|
|
36
|
-
|
|
37
33
|
var _type = require("./type");
|
|
38
|
-
|
|
39
34
|
Object.keys(_type).forEach(function (key) {
|
|
40
35
|
if (key === "default" || key === "__esModule") return;
|
|
41
36
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
@@ -47,9 +42,7 @@ Object.keys(_type).forEach(function (key) {
|
|
|
47
42
|
}
|
|
48
43
|
});
|
|
49
44
|
});
|
|
50
|
-
|
|
51
45
|
var _constants = require("./constants");
|
|
52
|
-
|
|
53
46
|
Object.keys(_constants).forEach(function (key) {
|
|
54
47
|
if (key === "default" || key === "__esModule") return;
|
|
55
48
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
@@ -61,14 +54,11 @@ Object.keys(_constants).forEach(function (key) {
|
|
|
61
54
|
}
|
|
62
55
|
});
|
|
63
56
|
});
|
|
64
|
-
|
|
65
57
|
var _default = options => {
|
|
66
58
|
if (options == null) {
|
|
67
59
|
throw new Error('can not start mserver without options');
|
|
68
60
|
}
|
|
69
|
-
|
|
70
61
|
const server = new _server.Server(options);
|
|
71
62
|
return server.init();
|
|
72
63
|
};
|
|
73
|
-
|
|
74
64
|
exports.default = _default;
|
|
@@ -4,23 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ModernServerContext = void 0;
|
|
7
|
-
|
|
8
7
|
var _url = require("url");
|
|
9
|
-
|
|
10
8
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
11
|
-
|
|
12
9
|
var _buffer = require("buffer");
|
|
13
|
-
|
|
14
10
|
var _etag = _interopRequireDefault(require("etag"));
|
|
15
|
-
|
|
16
11
|
var _fresh = _interopRequireDefault(require("fresh"));
|
|
17
|
-
|
|
18
12
|
var _utils = require("../../utils");
|
|
19
|
-
|
|
20
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
14
|
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; }
|
|
23
|
-
|
|
24
15
|
class ModernServerContext {
|
|
25
16
|
/**
|
|
26
17
|
* http request
|
|
@@ -33,223 +24,177 @@ class ModernServerContext {
|
|
|
33
24
|
/**
|
|
34
25
|
* url params
|
|
35
26
|
*/
|
|
27
|
+
|
|
36
28
|
get logger() {
|
|
37
29
|
return this.req.logger;
|
|
38
30
|
}
|
|
39
|
-
|
|
40
31
|
get metrics() {
|
|
41
32
|
return this.req.metrics;
|
|
42
33
|
}
|
|
43
|
-
|
|
44
34
|
constructor(req, res, options) {
|
|
45
35
|
_defineProperty(this, "req", void 0);
|
|
46
|
-
|
|
47
36
|
_defineProperty(this, "res", void 0);
|
|
48
|
-
|
|
49
37
|
_defineProperty(this, "params", {});
|
|
50
|
-
|
|
51
38
|
_defineProperty(this, "serverData", void 0);
|
|
52
|
-
|
|
53
39
|
_defineProperty(this, "options", {});
|
|
54
|
-
|
|
55
40
|
this.req = req;
|
|
56
41
|
this.res = res;
|
|
57
42
|
this.options = options || {};
|
|
58
43
|
this.serverData = {};
|
|
59
44
|
this.bind();
|
|
60
45
|
}
|
|
61
|
-
|
|
62
46
|
bind() {
|
|
63
47
|
const {
|
|
64
48
|
req,
|
|
65
49
|
res
|
|
66
50
|
} = this;
|
|
67
|
-
|
|
68
51
|
req.get = key => this.getReqHeader(key);
|
|
69
|
-
|
|
70
52
|
res.set = (key, value) => this.res.setHeader(key, value);
|
|
71
|
-
|
|
72
53
|
res.send = body => {
|
|
73
54
|
this.send(body);
|
|
74
55
|
};
|
|
75
|
-
}
|
|
76
|
-
|
|
56
|
+
}
|
|
77
57
|
|
|
58
|
+
// compat express res.send, only support etag now
|
|
78
59
|
send(body) {
|
|
79
60
|
try {
|
|
80
61
|
const generateETag = !this.res.getHeader('ETag') && this.options.etag;
|
|
81
|
-
|
|
82
62
|
if (body !== undefined && generateETag) {
|
|
83
63
|
const encoding = typeof body === 'string' ? 'utf-8' : undefined;
|
|
84
64
|
const buf = !_buffer.Buffer.isBuffer(body) ? _buffer.Buffer.from(body, encoding) : body;
|
|
85
65
|
const etag = (0, _etag.default)(buf, {
|
|
86
66
|
weak: true
|
|
87
67
|
});
|
|
88
|
-
|
|
89
68
|
if (etag) {
|
|
90
69
|
this.res.setHeader('ETag', etag);
|
|
91
70
|
}
|
|
92
71
|
}
|
|
93
|
-
|
|
94
72
|
if (this.fresh) {
|
|
95
73
|
this.status = 304;
|
|
96
74
|
}
|
|
97
75
|
} catch (e) {
|
|
98
76
|
this.logger.error(e.message);
|
|
99
77
|
}
|
|
100
|
-
|
|
101
78
|
this.res.end(body);
|
|
102
79
|
}
|
|
103
|
-
|
|
104
80
|
setParams(params) {
|
|
105
81
|
this.params = params;
|
|
106
82
|
}
|
|
107
|
-
|
|
108
83
|
setServerData(key, value) {
|
|
109
84
|
this.serverData[key] = value;
|
|
110
85
|
}
|
|
111
|
-
|
|
112
86
|
getReqHeader(key) {
|
|
113
87
|
const {
|
|
114
88
|
req
|
|
115
89
|
} = this;
|
|
116
90
|
const field = key.toLowerCase();
|
|
117
|
-
|
|
118
91
|
switch (field) {
|
|
119
92
|
case 'referer':
|
|
120
93
|
case 'referrer':
|
|
121
94
|
return req.headers.referrer || req.headers.referer || '';
|
|
122
|
-
|
|
123
95
|
default:
|
|
124
96
|
return req.headers[field] || '';
|
|
125
97
|
}
|
|
126
98
|
}
|
|
127
|
-
|
|
128
99
|
get fresh() {
|
|
129
100
|
const {
|
|
130
101
|
status,
|
|
131
102
|
res,
|
|
132
103
|
method
|
|
133
|
-
} = this;
|
|
104
|
+
} = this;
|
|
134
105
|
|
|
106
|
+
// GET or HEAD for weak freshness validation only
|
|
135
107
|
if ('GET' !== method && 'HEAD' !== method) {
|
|
136
108
|
return false;
|
|
137
109
|
}
|
|
138
|
-
|
|
139
110
|
if (status >= 200 && status < 300 || 304 === status) {
|
|
140
111
|
return (0, _fresh.default)(this.headers, {
|
|
141
112
|
etag: res.getHeader('ETag'),
|
|
142
113
|
'last-modified': res.getHeader('Last-Modified')
|
|
143
114
|
});
|
|
144
115
|
}
|
|
145
|
-
|
|
146
116
|
return false;
|
|
147
117
|
}
|
|
148
|
-
/* request property */
|
|
149
|
-
|
|
150
118
|
|
|
119
|
+
/* request property */
|
|
151
120
|
get headers() {
|
|
152
121
|
return this.req.headers;
|
|
153
122
|
}
|
|
154
|
-
|
|
155
123
|
get method() {
|
|
156
124
|
return this.req.method;
|
|
157
125
|
}
|
|
158
|
-
|
|
159
126
|
get url() {
|
|
160
127
|
return this.req.url || '';
|
|
161
128
|
}
|
|
162
|
-
|
|
163
129
|
set url(val) {
|
|
164
130
|
this.req.url = val;
|
|
165
131
|
}
|
|
166
|
-
|
|
167
132
|
get host() {
|
|
168
133
|
let host = this.getReqHeader('X-Forwarded-Host');
|
|
169
|
-
|
|
170
134
|
if (!host) {
|
|
171
135
|
host = this.getReqHeader('Host');
|
|
172
136
|
}
|
|
173
|
-
|
|
174
137
|
return host.split(/\s*,\s*/, 1)[0] || '';
|
|
175
138
|
}
|
|
176
|
-
|
|
177
139
|
get protocol() {
|
|
178
140
|
if (this.req.socket.encrypted) {
|
|
179
141
|
return 'https';
|
|
180
142
|
}
|
|
181
|
-
|
|
182
143
|
const proto = this.getReqHeader('X-Forwarded-Proto');
|
|
183
144
|
return proto ? proto.split(/\s*,\s*/, 1)[0] : 'http';
|
|
184
145
|
}
|
|
185
|
-
|
|
186
146
|
get origin() {
|
|
187
147
|
return `${this.protocol}://${this.host}`;
|
|
188
148
|
}
|
|
189
|
-
|
|
190
149
|
get href() {
|
|
191
150
|
return this.origin + this.url;
|
|
192
151
|
}
|
|
193
|
-
|
|
194
152
|
get parsedURL() {
|
|
195
153
|
const url = new _url.URL(this.req.url, this.origin);
|
|
196
154
|
return url;
|
|
197
155
|
}
|
|
198
|
-
|
|
199
156
|
get path() {
|
|
200
157
|
return this.parsedURL.pathname;
|
|
201
158
|
}
|
|
202
|
-
|
|
203
159
|
set path(p) {
|
|
204
|
-
const url = new _url.URL(this.req.url, this.origin);
|
|
205
|
-
|
|
160
|
+
const url = new _url.URL(this.req.url, this.origin);
|
|
161
|
+
// this should never happened
|
|
206
162
|
if (!url || !p) {
|
|
207
163
|
return;
|
|
208
164
|
}
|
|
209
|
-
|
|
210
165
|
if (url.pathname === p) {
|
|
211
166
|
return;
|
|
212
167
|
}
|
|
213
|
-
|
|
214
168
|
url.pathname = p;
|
|
215
169
|
this.url = url.toString();
|
|
216
170
|
}
|
|
217
|
-
|
|
218
171
|
get querystring() {
|
|
219
172
|
if (!this.req) {
|
|
220
173
|
return '';
|
|
221
174
|
}
|
|
222
|
-
|
|
223
175
|
return this.parsedURL.search.replace(/^\?/, '') || '';
|
|
224
176
|
}
|
|
225
|
-
|
|
226
177
|
get query() {
|
|
227
178
|
const str = this.querystring;
|
|
228
179
|
return _querystring.default.parse(str);
|
|
229
180
|
}
|
|
230
|
-
/* response property */
|
|
231
|
-
|
|
232
181
|
|
|
182
|
+
/* response property */
|
|
233
183
|
get status() {
|
|
234
184
|
return this.res.statusCode;
|
|
235
185
|
}
|
|
236
|
-
|
|
237
186
|
set status(statusCode) {
|
|
238
187
|
this.res.statusCode = statusCode;
|
|
239
188
|
}
|
|
189
|
+
|
|
240
190
|
/**
|
|
241
191
|
* 判断链接是否已经关闭
|
|
242
192
|
*/
|
|
243
|
-
|
|
244
|
-
|
|
245
193
|
resHasHandled() {
|
|
246
194
|
return this.res.writableEnded;
|
|
247
195
|
}
|
|
248
|
-
|
|
249
196
|
error(dig, e = '') {
|
|
250
197
|
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, (0, _utils.headersWithoutCookie)(this.headers));
|
|
251
198
|
}
|
|
252
|
-
|
|
253
199
|
}
|
|
254
|
-
|
|
255
200
|
exports.ModernServerContext = ModernServerContext;
|
|
@@ -10,9 +10,6 @@ Object.defineProperty(exports, "ModernServerContext", {
|
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
exports.createContext = void 0;
|
|
13
|
-
|
|
14
13
|
var _context = require("./context");
|
|
15
|
-
|
|
16
14
|
const createContext = (req, res, options) => new _context.ModernServerContext(req, res, options);
|
|
17
|
-
|
|
18
15
|
exports.createContext = createContext;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createMiddlewareContext = exports.createAfterRenderContext = exports.createAfterMatchContext = exports.base = void 0;
|
|
7
|
+
var _cookie = _interopRequireDefault(require("cookie"));
|
|
8
|
+
var _route = require("./route");
|
|
9
|
+
var _template = require("./template");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
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; }
|
|
12
|
+
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; }
|
|
13
|
+
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; }
|
|
14
|
+
class Response {
|
|
15
|
+
constructor(res) {
|
|
16
|
+
_defineProperty(this, "cookies", void 0);
|
|
17
|
+
_defineProperty(this, "res", void 0);
|
|
18
|
+
_defineProperty(this, "_cookie", void 0);
|
|
19
|
+
this.res = res;
|
|
20
|
+
this._cookie = _cookie.default.parse(res.getHeader('set-cookie') || '');
|
|
21
|
+
this.cookies = {
|
|
22
|
+
get: this.getCookie.bind(this),
|
|
23
|
+
set: this.setCookie.bind(this),
|
|
24
|
+
delete: this.deleteCookie.bind(this),
|
|
25
|
+
clear: this.clearCookie.bind(this),
|
|
26
|
+
apply: this.applyCookie.bind(this)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
get(key) {
|
|
30
|
+
return this.res.getHeader(key);
|
|
31
|
+
}
|
|
32
|
+
set(key, value) {
|
|
33
|
+
return this.res.setHeader(key, value);
|
|
34
|
+
}
|
|
35
|
+
status(code) {
|
|
36
|
+
this.res.statusCode = code;
|
|
37
|
+
}
|
|
38
|
+
getCookie(key) {
|
|
39
|
+
return this._cookie[key];
|
|
40
|
+
}
|
|
41
|
+
setCookie(key, value) {
|
|
42
|
+
this._cookie[key] = value;
|
|
43
|
+
}
|
|
44
|
+
deleteCookie(key) {
|
|
45
|
+
if (this._cookie[key]) {
|
|
46
|
+
delete this._cookie[key];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
clearCookie() {
|
|
50
|
+
this._cookie = {};
|
|
51
|
+
}
|
|
52
|
+
applyCookie() {
|
|
53
|
+
const str = Object.entries(this._cookie).map(([key, value]) => {
|
|
54
|
+
return _cookie.default.serialize(key, value);
|
|
55
|
+
}).join('; ');
|
|
56
|
+
if (str) {
|
|
57
|
+
this.res.setHeader('set-cookie', str);
|
|
58
|
+
} else {
|
|
59
|
+
this.res.removeHeader('set-cookie');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
raw(body, {
|
|
63
|
+
status,
|
|
64
|
+
headers
|
|
65
|
+
}) {
|
|
66
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
67
|
+
this.res.setHeader(key, value);
|
|
68
|
+
});
|
|
69
|
+
if (status) {
|
|
70
|
+
this.res.statusCode = status;
|
|
71
|
+
}
|
|
72
|
+
this.res.end(body);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
class Request {
|
|
76
|
+
constructor(ctx) {
|
|
77
|
+
_defineProperty(this, "host", void 0);
|
|
78
|
+
_defineProperty(this, "pathname", void 0);
|
|
79
|
+
_defineProperty(this, "query", void 0);
|
|
80
|
+
_defineProperty(this, "headers", void 0);
|
|
81
|
+
_defineProperty(this, "cookie", void 0);
|
|
82
|
+
_defineProperty(this, "cookies", void 0);
|
|
83
|
+
_defineProperty(this, "_cookie", void 0);
|
|
84
|
+
this.host = ctx.host;
|
|
85
|
+
this.pathname = ctx.path;
|
|
86
|
+
this.query = ctx.query;
|
|
87
|
+
this.headers = ctx.headers;
|
|
88
|
+
this.cookie = ctx.headers.cookie || '';
|
|
89
|
+
this._cookie = _cookie.default.parse(this.cookie);
|
|
90
|
+
this.cookies = {
|
|
91
|
+
get: this.getCookie.bind(this)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
getCookie(key) {
|
|
95
|
+
return this._cookie[key];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const base = context => {
|
|
99
|
+
const {
|
|
100
|
+
res
|
|
101
|
+
} = context;
|
|
102
|
+
return {
|
|
103
|
+
response: new Response(res),
|
|
104
|
+
request: new Request(context),
|
|
105
|
+
logger: context.logger,
|
|
106
|
+
metrics: context.metrics
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
exports.base = base;
|
|
110
|
+
const createAfterMatchContext = (context, entryName) => {
|
|
111
|
+
const baseContext = base(context);
|
|
112
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
113
|
+
router: new _route.RouteAPI(entryName)
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
exports.createAfterMatchContext = createAfterMatchContext;
|
|
117
|
+
const createAfterRenderContext = (context, content) => {
|
|
118
|
+
const baseContext = base(context);
|
|
119
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
120
|
+
template: new _template.TemplateAPI(content)
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
exports.createAfterRenderContext = createAfterRenderContext;
|
|
124
|
+
const createMiddlewareContext = context => {
|
|
125
|
+
const baseContext = base(context);
|
|
126
|
+
return _objectSpread(_objectSpread({}, baseContext), {}, {
|
|
127
|
+
response: _objectSpread(_objectSpread({}, baseContext.response), {}, {
|
|
128
|
+
locals: context.res.locals || {}
|
|
129
|
+
}),
|
|
130
|
+
source: {
|
|
131
|
+
req: context.req,
|
|
132
|
+
res: context.res
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
exports.createMiddlewareContext = createMiddlewareContext;
|
|
@@ -3,51 +3,26 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
6
|
+
exports.RouteAPI = void 0;
|
|
8
7
|
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; }
|
|
9
|
-
|
|
10
8
|
class RouteAPI {
|
|
11
|
-
constructor(
|
|
12
|
-
_defineProperty(this, "router", void 0);
|
|
13
|
-
|
|
9
|
+
constructor(entryName) {
|
|
14
10
|
_defineProperty(this, "current", void 0);
|
|
15
|
-
|
|
11
|
+
_defineProperty(this, "status", void 0);
|
|
16
12
|
_defineProperty(this, "url", void 0);
|
|
17
|
-
|
|
18
|
-
this.
|
|
19
|
-
this.
|
|
20
|
-
this.url = url;
|
|
13
|
+
this.current = entryName;
|
|
14
|
+
this.status = 200;
|
|
15
|
+
this.url = '';
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
redirect(url, status = 302) {
|
|
18
|
+
this.url = url;
|
|
19
|
+
this.status = status;
|
|
25
20
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const {
|
|
29
|
-
router
|
|
30
|
-
} = this;
|
|
31
|
-
const matched = router.matchEntry(entryName);
|
|
32
|
-
return matched ? matched.generate(this.url) : null;
|
|
21
|
+
rewrite(entryName) {
|
|
22
|
+
this.current = entryName;
|
|
33
23
|
}
|
|
34
|
-
|
|
35
24
|
use(entryName) {
|
|
36
|
-
|
|
37
|
-
router
|
|
38
|
-
} = this;
|
|
39
|
-
const matched = router.matchEntry(entryName);
|
|
40
|
-
|
|
41
|
-
if (matched) {
|
|
42
|
-
this.current = matched;
|
|
43
|
-
return true;
|
|
44
|
-
} else {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
25
|
+
this.rewrite(entryName);
|
|
47
26
|
}
|
|
48
|
-
|
|
49
27
|
}
|
|
50
|
-
|
|
51
|
-
const createRouteAPI = (matched, router, url) => new RouteAPI(matched, router, url);
|
|
52
|
-
|
|
53
|
-
exports.createRouteAPI = createRouteAPI;
|
|
28
|
+
exports.RouteAPI = RouteAPI;
|