@modern-js/prod-server 1.1.2 → 1.1.3
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 +11 -0
- package/dist/js/modern/libs/context/context.js +10 -17
- package/dist/js/modern/libs/metrics.js +2 -2
- package/dist/js/modern/libs/render/measure.js +59 -0
- package/dist/js/modern/libs/render/ssr.js +5 -2
- package/dist/js/modern/server/index.js +4 -2
- package/dist/js/modern/server/modern-server-split.js +4 -4
- package/dist/js/modern/server/modern-server.js +6 -6
- package/dist/js/modern/utils.js +0 -9
- package/dist/js/node/libs/context/context.js +10 -18
- package/dist/js/node/libs/metrics.js +2 -2
- package/dist/js/node/libs/render/measure.js +71 -0
- package/dist/js/node/libs/render/ssr.js +6 -2
- package/dist/js/node/server/index.js +3 -1
- package/dist/js/node/server/modern-server-split.js +4 -4
- package/dist/js/node/server/modern-server.js +6 -6
- package/dist/js/node/utils.js +1 -13
- package/dist/types/libs/context/context.d.ts +3 -8
- package/dist/types/libs/render/measure.d.ts +10 -0
- package/dist/types/server/modern-server.d.ts +1 -1
- package/dist/types/utils.d.ts +0 -1
- package/package.json +5 -5
- package/src/libs/context/context.ts +13 -18
- package/src/libs/metrics.ts +2 -2
- package/src/libs/render/measure.ts +66 -0
- package/src/libs/render/ssr.ts +5 -2
- package/src/server/index.ts +7 -2
- package/src/server/modern-server-split.ts +4 -4
- package/src/server/modern-server.ts +6 -6
- package/src/utils.ts +0 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @modern-js/prod-server
|
|
2
2
|
|
|
3
|
+
## 1.1.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a4c5fe78: fix test case
|
|
8
|
+
- 6fa74d5f: add internal metrics and logger
|
|
9
|
+
- Updated dependencies [0ee4bb4e]
|
|
10
|
+
- Updated dependencies [6fa74d5f]
|
|
11
|
+
- @modern-js/utils@1.7.0
|
|
12
|
+
- @modern-js/server-core@1.3.3
|
|
13
|
+
|
|
3
14
|
## 1.1.2
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { URL } from 'url';
|
|
2
2
|
import qs from 'querystring';
|
|
3
|
-
import { toMessage } from "../../utils";
|
|
4
3
|
export class ModernServerContext {
|
|
5
4
|
/**
|
|
6
5
|
* http request
|
|
@@ -13,17 +12,21 @@ export class ModernServerContext {
|
|
|
13
12
|
/**
|
|
14
13
|
* url params
|
|
15
14
|
*/
|
|
15
|
+
get logger() {
|
|
16
|
+
return this.req.logger;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get metrics() {
|
|
20
|
+
return this.req.metrics;
|
|
21
|
+
}
|
|
22
|
+
|
|
16
23
|
constructor(req, res) {
|
|
17
24
|
this.req = void 0;
|
|
18
25
|
this.res = void 0;
|
|
19
26
|
this.params = {};
|
|
20
|
-
this.logger = void 0;
|
|
21
|
-
this.metrics = void 0;
|
|
22
27
|
this.serverData = void 0;
|
|
23
28
|
this.req = req;
|
|
24
29
|
this.res = res;
|
|
25
|
-
this.logger = req.logger;
|
|
26
|
-
this.metrics = req.metrics;
|
|
27
30
|
this.serverData = {};
|
|
28
31
|
this.bind();
|
|
29
32
|
}
|
|
@@ -163,18 +166,8 @@ export class ModernServerContext {
|
|
|
163
166
|
return this.res.writableEnded;
|
|
164
167
|
}
|
|
165
168
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
headers: this.headers,
|
|
169
|
-
href: this.href,
|
|
170
|
-
url: this.url
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
error(dig, err = '') {
|
|
175
|
-
const message = toMessage(dig, err);
|
|
176
|
-
const reqInfo = this.logInfo();
|
|
177
|
-
this.logger.error(`${reqInfo.url} - ${message}`, reqInfo);
|
|
169
|
+
error(dig, e = '') {
|
|
170
|
+
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, this.headers);
|
|
178
171
|
}
|
|
179
172
|
|
|
180
173
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
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
|
+
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
|
+
export const createMetrics = (context, metrics) => {
|
|
8
|
+
const {
|
|
9
|
+
entryName: entry,
|
|
10
|
+
request
|
|
11
|
+
} = context;
|
|
12
|
+
const {
|
|
13
|
+
pathname = ''
|
|
14
|
+
} = request || {};
|
|
15
|
+
|
|
16
|
+
const emitTimer = (name, cost, tags = {}) => {
|
|
17
|
+
metrics.emitTimer(name, cost, _objectSpread(_objectSpread({}, tags), {}, {
|
|
18
|
+
pathname,
|
|
19
|
+
entry
|
|
20
|
+
}));
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const emitCounter = (name, counter, tags = {}) => {
|
|
24
|
+
metrics.emitCounter(name, counter, _objectSpread(_objectSpread({}, tags), {}, {
|
|
25
|
+
pathname,
|
|
26
|
+
entry
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
emitTimer,
|
|
32
|
+
emitCounter
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export const createLogger = (serverContext, logger) => {
|
|
36
|
+
const request = serverContext.request || {};
|
|
37
|
+
const {
|
|
38
|
+
headers = {},
|
|
39
|
+
pathname = ''
|
|
40
|
+
} = request;
|
|
41
|
+
|
|
42
|
+
const debug = (message, ...args) => {
|
|
43
|
+
logger.debug(`SSR Debug - ${message}, req.url = %s`, ...args, pathname);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const info = (message, ...args) => {
|
|
47
|
+
logger.info(`SSR Info - ${message}, req.url = %s`, ...args, pathname);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const error = (message, e) => {
|
|
51
|
+
logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, headers);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
error,
|
|
56
|
+
info,
|
|
57
|
+
debug
|
|
58
|
+
};
|
|
59
|
+
};
|
|
@@ -2,6 +2,7 @@ import path from 'path';
|
|
|
2
2
|
import { mime, SERVER_RENDER_FUNCTION_NAME } from '@modern-js/utils';
|
|
3
3
|
import cookie from 'cookie';
|
|
4
4
|
import cache from "./cache";
|
|
5
|
+
import { createLogger, createMetrics } from "./measure";
|
|
5
6
|
export const render = async (ctx, renderOptions, runner) => {
|
|
6
7
|
const {
|
|
7
8
|
urlPath,
|
|
@@ -28,9 +29,11 @@ export const render = async (ctx, renderOptions, runner) => {
|
|
|
28
29
|
entryName,
|
|
29
30
|
distDir,
|
|
30
31
|
staticGenerate,
|
|
31
|
-
logger:
|
|
32
|
-
metrics:
|
|
32
|
+
logger: undefined,
|
|
33
|
+
metrics: undefined
|
|
33
34
|
};
|
|
35
|
+
context.logger = createLogger(context, ctx.logger);
|
|
36
|
+
context.metrics = createMetrics(context, ctx.metrics);
|
|
34
37
|
runner.extendSSRContext(context);
|
|
35
38
|
|
|
36
39
|
const serverRender = require(bundleJS)[SERVER_RENDER_FUNCTION_NAME];
|
|
@@ -6,7 +6,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
6
6
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import { serverManager, AppContext, ConfigContext, loadPlugins } from '@modern-js/server-core';
|
|
9
|
-
import {
|
|
9
|
+
import { Logger, SHARED_DIR, OUTPUT_CONFIG_FILE } from '@modern-js/utils';
|
|
10
10
|
import { metrics as defaultMetrics } from "../libs/metrics";
|
|
11
11
|
import { loadConfig, getServerConfigPath, requireConfig } from "../libs/loadConfig";
|
|
12
12
|
import { debug } from "../utils";
|
|
@@ -19,7 +19,9 @@ export class Server {
|
|
|
19
19
|
this.app = void 0;
|
|
20
20
|
this.runner = void 0;
|
|
21
21
|
this.serverConfig = void 0;
|
|
22
|
-
options.logger = options.logger ||
|
|
22
|
+
options.logger = options.logger || new Logger({
|
|
23
|
+
level: 'warn'
|
|
24
|
+
});
|
|
23
25
|
options.metrics = options.metrics || defaultMetrics;
|
|
24
26
|
this.options = options;
|
|
25
27
|
this.serverConfig = {};
|
|
@@ -10,9 +10,9 @@ class ModernSSRServer extends ModernServer {
|
|
|
10
10
|
return routes.filter(route => route.isSSR);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
async
|
|
13
|
+
async setupBeforeProdMiddleware() {
|
|
14
14
|
if (this.runMode === RUN_MODE.FULL) {
|
|
15
|
-
await super.
|
|
15
|
+
await super.setupBeforeProdMiddleware();
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -33,9 +33,9 @@ class ModernAPIServer extends ModernServer {
|
|
|
33
33
|
return routes.filter(route => route.isApi);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
async
|
|
36
|
+
async setupBeforeProdMiddleware() {
|
|
37
37
|
if (this.runMode === RUN_MODE.FULL) {
|
|
38
|
-
await super.
|
|
38
|
+
await super.setupBeforeProdMiddleware();
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -128,7 +128,7 @@ export class ModernServer {
|
|
|
128
128
|
distDir,
|
|
129
129
|
staticGenerate
|
|
130
130
|
});
|
|
131
|
-
await this.
|
|
131
|
+
await this.setupBeforeProdMiddleware();
|
|
132
132
|
this.addHandler(this.staticFileHandler);
|
|
133
133
|
this.addHandler(this.routeHandler.bind(this)); // compose middlewares to http handler
|
|
134
134
|
|
|
@@ -193,7 +193,7 @@ export class ModernServer {
|
|
|
193
193
|
|
|
194
194
|
|
|
195
195
|
render404(context) {
|
|
196
|
-
context.error(ERROR_DIGEST.ENOTF);
|
|
196
|
+
context.error(ERROR_DIGEST.ENOTF, '404 Not Found');
|
|
197
197
|
this.renderErrorPage(context, 404);
|
|
198
198
|
} // gather frame extension and get framework handler
|
|
199
199
|
|
|
@@ -276,12 +276,12 @@ export class ModernServer {
|
|
|
276
276
|
});
|
|
277
277
|
}
|
|
278
278
|
|
|
279
|
-
async
|
|
279
|
+
async setupBeforeProdMiddleware() {
|
|
280
280
|
const {
|
|
281
281
|
conf,
|
|
282
282
|
runner
|
|
283
283
|
} = this;
|
|
284
|
-
const preMiddleware = await runner.
|
|
284
|
+
const preMiddleware = await runner.beforeProdServer(conf);
|
|
285
285
|
preMiddleware.flat().forEach(mid => {
|
|
286
286
|
this.addHandler(mid);
|
|
287
287
|
});
|
|
@@ -525,8 +525,8 @@ export class ModernServer {
|
|
|
525
525
|
requestHandler(req, res, next = () => {// empty
|
|
526
526
|
}) {
|
|
527
527
|
res.statusCode = 200;
|
|
528
|
-
req.logger =
|
|
529
|
-
req.metrics =
|
|
528
|
+
req.logger = this.logger;
|
|
529
|
+
req.metrics = this.metrics;
|
|
530
530
|
const context = createContext(req, res);
|
|
531
531
|
|
|
532
532
|
try {
|
package/dist/js/modern/utils.js
CHANGED
|
@@ -7,15 +7,6 @@ export const mergeExtension = users => {
|
|
|
7
7
|
middleware: output.concat(users)
|
|
8
8
|
};
|
|
9
9
|
};
|
|
10
|
-
export const toMessage = (dig, e) => {
|
|
11
|
-
const message = e instanceof Error ? e.message : e;
|
|
12
|
-
|
|
13
|
-
if (message) {
|
|
14
|
-
return `${dig}: ${message}`;
|
|
15
|
-
} else {
|
|
16
|
-
return dig;
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
10
|
export const noop = () => {// noop
|
|
20
11
|
};
|
|
21
12
|
export const createErrorDocument = (status, text) => {
|
|
@@ -9,8 +9,6 @@ var _url = require("url");
|
|
|
9
9
|
|
|
10
10
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
11
11
|
|
|
12
|
-
var _utils = require("../../utils");
|
|
13
|
-
|
|
14
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
13
|
|
|
16
14
|
class ModernServerContext {
|
|
@@ -25,17 +23,21 @@ class ModernServerContext {
|
|
|
25
23
|
/**
|
|
26
24
|
* url params
|
|
27
25
|
*/
|
|
26
|
+
get logger() {
|
|
27
|
+
return this.req.logger;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get metrics() {
|
|
31
|
+
return this.req.metrics;
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
constructor(req, res) {
|
|
29
35
|
this.req = void 0;
|
|
30
36
|
this.res = void 0;
|
|
31
37
|
this.params = {};
|
|
32
|
-
this.logger = void 0;
|
|
33
|
-
this.metrics = void 0;
|
|
34
38
|
this.serverData = void 0;
|
|
35
39
|
this.req = req;
|
|
36
40
|
this.res = res;
|
|
37
|
-
this.logger = req.logger;
|
|
38
|
-
this.metrics = req.metrics;
|
|
39
41
|
this.serverData = {};
|
|
40
42
|
this.bind();
|
|
41
43
|
}
|
|
@@ -175,18 +177,8 @@ class ModernServerContext {
|
|
|
175
177
|
return this.res.writableEnded;
|
|
176
178
|
}
|
|
177
179
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
headers: this.headers,
|
|
181
|
-
href: this.href,
|
|
182
|
-
url: this.url
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
error(dig, err = '') {
|
|
187
|
-
const message = (0, _utils.toMessage)(dig, err);
|
|
188
|
-
const reqInfo = this.logInfo();
|
|
189
|
-
this.logger.error(`${reqInfo.url} - ${message}`, reqInfo);
|
|
180
|
+
error(dig, e = '') {
|
|
181
|
+
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, this.headers);
|
|
190
182
|
}
|
|
191
183
|
|
|
192
184
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createMetrics = exports.createLogger = void 0;
|
|
7
|
+
|
|
8
|
+
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; }
|
|
9
|
+
|
|
10
|
+
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; }
|
|
11
|
+
|
|
12
|
+
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; }
|
|
13
|
+
|
|
14
|
+
const createMetrics = (context, metrics) => {
|
|
15
|
+
const {
|
|
16
|
+
entryName: entry,
|
|
17
|
+
request
|
|
18
|
+
} = context;
|
|
19
|
+
const {
|
|
20
|
+
pathname = ''
|
|
21
|
+
} = request || {};
|
|
22
|
+
|
|
23
|
+
const emitTimer = (name, cost, tags = {}) => {
|
|
24
|
+
metrics.emitTimer(name, cost, _objectSpread(_objectSpread({}, tags), {}, {
|
|
25
|
+
pathname,
|
|
26
|
+
entry
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const emitCounter = (name, counter, tags = {}) => {
|
|
31
|
+
metrics.emitCounter(name, counter, _objectSpread(_objectSpread({}, tags), {}, {
|
|
32
|
+
pathname,
|
|
33
|
+
entry
|
|
34
|
+
}));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
emitTimer,
|
|
39
|
+
emitCounter
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
exports.createMetrics = createMetrics;
|
|
44
|
+
|
|
45
|
+
const createLogger = (serverContext, logger) => {
|
|
46
|
+
const request = serverContext.request || {};
|
|
47
|
+
const {
|
|
48
|
+
headers = {},
|
|
49
|
+
pathname = ''
|
|
50
|
+
} = request;
|
|
51
|
+
|
|
52
|
+
const debug = (message, ...args) => {
|
|
53
|
+
logger.debug(`SSR Debug - ${message}, req.url = %s`, ...args, pathname);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const info = (message, ...args) => {
|
|
57
|
+
logger.info(`SSR Info - ${message}, req.url = %s`, ...args, pathname);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const error = (message, e) => {
|
|
61
|
+
logger.error(`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, pathname, headers);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
error,
|
|
66
|
+
info,
|
|
67
|
+
debug
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
exports.createLogger = createLogger;
|
|
@@ -13,6 +13,8 @@ var _cookie = _interopRequireDefault(require("cookie"));
|
|
|
13
13
|
|
|
14
14
|
var _cache = _interopRequireDefault(require("./cache"));
|
|
15
15
|
|
|
16
|
+
var _measure = require("./measure");
|
|
17
|
+
|
|
16
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
19
|
|
|
18
20
|
const render = async (ctx, renderOptions, runner) => {
|
|
@@ -43,9 +45,11 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
43
45
|
entryName,
|
|
44
46
|
distDir,
|
|
45
47
|
staticGenerate,
|
|
46
|
-
logger:
|
|
47
|
-
metrics:
|
|
48
|
+
logger: undefined,
|
|
49
|
+
metrics: undefined
|
|
48
50
|
};
|
|
51
|
+
context.logger = (0, _measure.createLogger)(context, ctx.logger);
|
|
52
|
+
context.metrics = (0, _measure.createMetrics)(context, ctx.metrics);
|
|
49
53
|
runner.extendSSRContext(context);
|
|
50
54
|
|
|
51
55
|
const serverRender = require(bundleJS)[_utils.SERVER_RENDER_FUNCTION_NAME];
|
|
@@ -35,7 +35,9 @@ class Server {
|
|
|
35
35
|
this.app = void 0;
|
|
36
36
|
this.runner = void 0;
|
|
37
37
|
this.serverConfig = void 0;
|
|
38
|
-
options.logger = options.logger || _utils.
|
|
38
|
+
options.logger = options.logger || new _utils.Logger({
|
|
39
|
+
level: 'warn'
|
|
40
|
+
});
|
|
39
41
|
options.metrics = options.metrics || _metrics.metrics;
|
|
40
42
|
this.options = options;
|
|
41
43
|
this.serverConfig = {};
|
|
@@ -18,9 +18,9 @@ class ModernSSRServer extends _modernServer.ModernServer {
|
|
|
18
18
|
return routes.filter(route => route.isSSR);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
async
|
|
21
|
+
async setupBeforeProdMiddleware() {
|
|
22
22
|
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
23
|
-
await super.
|
|
23
|
+
await super.setupBeforeProdMiddleware();
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -41,9 +41,9 @@ class ModernAPIServer extends _modernServer.ModernServer {
|
|
|
41
41
|
return routes.filter(route => route.isApi);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
async
|
|
44
|
+
async setupBeforeProdMiddleware() {
|
|
45
45
|
if (this.runMode === _constants.RUN_MODE.FULL) {
|
|
46
|
-
await super.
|
|
46
|
+
await super.setupBeforeProdMiddleware();
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
|
|
@@ -157,7 +157,7 @@ class ModernServer {
|
|
|
157
157
|
distDir,
|
|
158
158
|
staticGenerate
|
|
159
159
|
});
|
|
160
|
-
await this.
|
|
160
|
+
await this.setupBeforeProdMiddleware();
|
|
161
161
|
this.addHandler(this.staticFileHandler);
|
|
162
162
|
this.addHandler(this.routeHandler.bind(this)); // compose middlewares to http handler
|
|
163
163
|
|
|
@@ -223,7 +223,7 @@ class ModernServer {
|
|
|
223
223
|
|
|
224
224
|
|
|
225
225
|
render404(context) {
|
|
226
|
-
context.error(_constants.ERROR_DIGEST.ENOTF);
|
|
226
|
+
context.error(_constants.ERROR_DIGEST.ENOTF, '404 Not Found');
|
|
227
227
|
this.renderErrorPage(context, 404);
|
|
228
228
|
} // gather frame extension and get framework handler
|
|
229
229
|
|
|
@@ -309,12 +309,12 @@ class ModernServer {
|
|
|
309
309
|
});
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
async
|
|
312
|
+
async setupBeforeProdMiddleware() {
|
|
313
313
|
const {
|
|
314
314
|
conf,
|
|
315
315
|
runner
|
|
316
316
|
} = this;
|
|
317
|
-
const preMiddleware = await runner.
|
|
317
|
+
const preMiddleware = await runner.beforeProdServer(conf);
|
|
318
318
|
preMiddleware.flat().forEach(mid => {
|
|
319
319
|
this.addHandler(mid);
|
|
320
320
|
});
|
|
@@ -559,8 +559,8 @@ class ModernServer {
|
|
|
559
559
|
requestHandler(req, res, next = () => {// empty
|
|
560
560
|
}) {
|
|
561
561
|
res.statusCode = 200;
|
|
562
|
-
req.logger =
|
|
563
|
-
req.metrics =
|
|
562
|
+
req.logger = this.logger;
|
|
563
|
+
req.metrics = this.metrics;
|
|
564
564
|
const context = (0, _context.createContext)(req, res);
|
|
565
565
|
|
|
566
566
|
try {
|
package/dist/js/node/utils.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.toPath = exports.
|
|
6
|
+
exports.toPath = exports.prepareFavicons = exports.noop = exports.mergeExtension = exports.getStaticReg = exports.debug = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
|
|
7
7
|
|
|
8
8
|
var _pathToRegexp = require("path-to-regexp");
|
|
9
9
|
|
|
@@ -21,18 +21,6 @@ const mergeExtension = users => {
|
|
|
21
21
|
|
|
22
22
|
exports.mergeExtension = mergeExtension;
|
|
23
23
|
|
|
24
|
-
const toMessage = (dig, e) => {
|
|
25
|
-
const message = e instanceof Error ? e.message : e;
|
|
26
|
-
|
|
27
|
-
if (message) {
|
|
28
|
-
return `${dig}: ${message}`;
|
|
29
|
-
} else {
|
|
30
|
-
return dig;
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
exports.toMessage = toMessage;
|
|
35
|
-
|
|
36
24
|
const noop = () => {// noop
|
|
37
25
|
};
|
|
38
26
|
|
|
@@ -24,8 +24,8 @@ export declare class ModernServerContext implements ModernServerContextInterface
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
params: Record<string, string>;
|
|
27
|
-
logger: Logger;
|
|
28
|
-
metrics
|
|
27
|
+
get logger(): Logger;
|
|
28
|
+
get metrics(): Metrics;
|
|
29
29
|
serverData: Record<string, any>;
|
|
30
30
|
constructor(req: IncomingMessage, res: ServerResponse);
|
|
31
31
|
private bind;
|
|
@@ -52,10 +52,5 @@ export declare class ModernServerContext implements ModernServerContextInterface
|
|
|
52
52
|
*/
|
|
53
53
|
|
|
54
54
|
resHasHandled(): boolean;
|
|
55
|
-
|
|
56
|
-
headers: import("http").IncomingHttpHeaders;
|
|
57
|
-
href: string;
|
|
58
|
-
url: string;
|
|
59
|
-
};
|
|
60
|
-
error(dig: string, err?: Error | string): void;
|
|
55
|
+
error(dig: string, e?: Error | string): void;
|
|
61
56
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseSSRServerContext, Logger, Metrics } from '@modern-js/types';
|
|
2
|
+
export declare const createMetrics: (context: BaseSSRServerContext, metrics: Metrics) => {
|
|
3
|
+
emitTimer: (name: string, cost: number, tags?: Record<string, unknown>) => void;
|
|
4
|
+
emitCounter: (name: string, counter: number, tags?: Record<string, unknown>) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const createLogger: (serverContext: BaseSSRServerContext, logger: Logger) => {
|
|
7
|
+
error: (message: string, e: Error | string) => void;
|
|
8
|
+
info: (message: string, ...args: any[]) => void;
|
|
9
|
+
debug: (message: string, ...args: any[]) => void;
|
|
10
|
+
};
|
|
@@ -59,7 +59,7 @@ export declare class ModernServer implements ModernServerInterface {
|
|
|
59
59
|
context: ModernServerContext;
|
|
60
60
|
[propsName: string]: any;
|
|
61
61
|
}): Promise<any>;
|
|
62
|
-
protected
|
|
62
|
+
protected setupBeforeProdMiddleware(): Promise<void>;
|
|
63
63
|
protected handleAPI(context: ModernServerContext): Promise<void>;
|
|
64
64
|
protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<import("../type").RenderResult | null>;
|
|
65
65
|
protected proxy(): Promise<any>;
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ export declare const debug: any;
|
|
|
3
3
|
export declare const mergeExtension: (users: any[]) => {
|
|
4
4
|
middleware: any[];
|
|
5
5
|
};
|
|
6
|
-
export declare const toMessage: (dig: string, e: Error | string) => string;
|
|
7
6
|
export declare const noop: () => void;
|
|
8
7
|
export declare const createErrorDocument: (status: number, text: string) => string;
|
|
9
8
|
export declare type CollectMiddlewaresResult = {
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"modern",
|
|
12
12
|
"modern.js"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.1.
|
|
14
|
+
"version": "1.1.3",
|
|
15
15
|
"jsnext:source": "./src/index.ts",
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
17
|
"main": "./dist/js/node/index.js",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@modern-js/utils": "^1.
|
|
31
|
+
"@modern-js/utils": "^1.7.0",
|
|
32
32
|
"@babel/compat-data": "^7.17.0",
|
|
33
|
-
"@modern-js/server-core": "^1.3.
|
|
33
|
+
"@modern-js/server-core": "^1.3.3",
|
|
34
34
|
"axios": "^0.24.0",
|
|
35
35
|
"compare-versions": "^3.6.0",
|
|
36
36
|
"cookie": "^0.4.2",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"ua-parser-js": "^0.7.28"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@modern-js/types": "1.5.
|
|
47
|
-
"@modern-js/core": "1.
|
|
46
|
+
"@modern-js/types": "1.5.2",
|
|
47
|
+
"@modern-js/core": "1.10.0",
|
|
48
48
|
"@scripts/jest-config": "0.0.0",
|
|
49
49
|
"@scripts/build": "0.0.0",
|
|
50
50
|
"@types/cookie": "^0.4.1",
|
|
@@ -6,7 +6,6 @@ import type {
|
|
|
6
6
|
Metrics,
|
|
7
7
|
Logger,
|
|
8
8
|
} from '@modern-js/types/server';
|
|
9
|
-
import { toMessage } from '../../utils';
|
|
10
9
|
|
|
11
10
|
export type ContextOptions = {
|
|
12
11
|
logger?: Logger;
|
|
@@ -29,17 +28,19 @@ export class ModernServerContext implements ModernServerContextInterface {
|
|
|
29
28
|
*/
|
|
30
29
|
public params: Record<string, string> = {};
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
get logger() {
|
|
32
|
+
return this.req.logger;
|
|
33
|
+
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
get metrics() {
|
|
36
|
+
return this.req.metrics;
|
|
37
|
+
}
|
|
35
38
|
|
|
36
39
|
public serverData: Record<string, any>;
|
|
37
40
|
|
|
38
41
|
constructor(req: IncomingMessage, res: ServerResponse) {
|
|
39
42
|
this.req = req;
|
|
40
43
|
this.res = res;
|
|
41
|
-
this.logger = req.logger;
|
|
42
|
-
this.metrics = req.metrics;
|
|
43
44
|
this.serverData = {};
|
|
44
45
|
|
|
45
46
|
this.bind();
|
|
@@ -166,18 +167,12 @@ export class ModernServerContext implements ModernServerContextInterface {
|
|
|
166
167
|
return this.res.writableEnded;
|
|
167
168
|
}
|
|
168
169
|
|
|
169
|
-
public
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
public error(dig: string, err: Error | string = '') {
|
|
178
|
-
const message = toMessage(dig, err);
|
|
179
|
-
const reqInfo = this.logInfo();
|
|
180
|
-
|
|
181
|
-
this.logger.error(`${reqInfo.url} - ${message}`, reqInfo);
|
|
170
|
+
public error(dig: string, e: Error | string = '') {
|
|
171
|
+
this.logger.error(
|
|
172
|
+
`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`,
|
|
173
|
+
e instanceof Error ? e.stack || e.message : e,
|
|
174
|
+
this.path,
|
|
175
|
+
this.headers,
|
|
176
|
+
);
|
|
182
177
|
}
|
|
183
178
|
}
|
package/src/libs/metrics.ts
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { BaseSSRServerContext, Logger, Metrics } from '@modern-js/types';
|
|
2
|
+
|
|
3
|
+
export const createMetrics = (
|
|
4
|
+
context: BaseSSRServerContext,
|
|
5
|
+
metrics: Metrics,
|
|
6
|
+
) => {
|
|
7
|
+
const { entryName: entry, request } = context;
|
|
8
|
+
const { pathname = '' } = request || {};
|
|
9
|
+
|
|
10
|
+
const emitTimer = (
|
|
11
|
+
name: string,
|
|
12
|
+
cost: number,
|
|
13
|
+
tags: Record<string, unknown> = {},
|
|
14
|
+
) => {
|
|
15
|
+
metrics.emitTimer(name, cost, {
|
|
16
|
+
...tags,
|
|
17
|
+
pathname,
|
|
18
|
+
entry,
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const emitCounter = (
|
|
23
|
+
name: string,
|
|
24
|
+
counter: number,
|
|
25
|
+
tags: Record<string, unknown> = {},
|
|
26
|
+
) => {
|
|
27
|
+
metrics.emitCounter(name, counter, {
|
|
28
|
+
...tags,
|
|
29
|
+
pathname,
|
|
30
|
+
entry,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return { emitTimer, emitCounter };
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const createLogger = (
|
|
38
|
+
serverContext: BaseSSRServerContext,
|
|
39
|
+
logger: Logger,
|
|
40
|
+
) => {
|
|
41
|
+
const request = serverContext.request || {};
|
|
42
|
+
const { headers = {}, pathname = '' } = request;
|
|
43
|
+
|
|
44
|
+
const debug = (message: string, ...args: any[]) => {
|
|
45
|
+
logger.debug(`SSR Debug - ${message}, req.url = %s`, ...args, pathname);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const info = (message: string, ...args: any[]) => {
|
|
49
|
+
logger.info(`SSR Info - ${message}, req.url = %s`, ...args, pathname);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const error = (message: string, e: Error | string) => {
|
|
53
|
+
logger.error(
|
|
54
|
+
`SSR Error - ${message}, error = %s, req.url = %s, req.headers = %o`,
|
|
55
|
+
e instanceof Error ? e.stack || e.message : e,
|
|
56
|
+
pathname,
|
|
57
|
+
headers,
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
error,
|
|
63
|
+
info,
|
|
64
|
+
debug,
|
|
65
|
+
};
|
|
66
|
+
};
|
package/src/libs/render/ssr.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { ModernServerContext } from '../context';
|
|
|
5
5
|
import { RenderResult, ServerHookRunner } from '../../type';
|
|
6
6
|
import cache from './cache';
|
|
7
7
|
import { SSRServerContext } from './type';
|
|
8
|
+
import { createLogger, createMetrics } from './measure';
|
|
8
9
|
|
|
9
10
|
export const render = async (
|
|
10
11
|
ctx: ModernServerContext,
|
|
@@ -38,9 +39,11 @@ export const render = async (
|
|
|
38
39
|
entryName,
|
|
39
40
|
distDir,
|
|
40
41
|
staticGenerate,
|
|
41
|
-
logger:
|
|
42
|
-
metrics:
|
|
42
|
+
logger: undefined!,
|
|
43
|
+
metrics: undefined!,
|
|
43
44
|
};
|
|
45
|
+
context.logger = createLogger(context, ctx.logger);
|
|
46
|
+
context.metrics = createMetrics(context, ctx.metrics);
|
|
44
47
|
|
|
45
48
|
runner.extendSSRContext(context);
|
|
46
49
|
|
package/src/server/index.ts
CHANGED
|
@@ -8,9 +8,10 @@ import {
|
|
|
8
8
|
ServerConfig,
|
|
9
9
|
} from '@modern-js/server-core';
|
|
10
10
|
import {
|
|
11
|
-
|
|
11
|
+
Logger,
|
|
12
12
|
SHARED_DIR,
|
|
13
13
|
OUTPUT_CONFIG_FILE,
|
|
14
|
+
LoggerInterface,
|
|
14
15
|
} from '@modern-js/utils';
|
|
15
16
|
import type { UserConfig } from '@modern-js/core';
|
|
16
17
|
import { ISAppContext } from '@modern-js/types';
|
|
@@ -43,7 +44,11 @@ export class Server {
|
|
|
43
44
|
private serverConfig: ServerConfig;
|
|
44
45
|
|
|
45
46
|
constructor(options: ModernServerOptions) {
|
|
46
|
-
options.logger =
|
|
47
|
+
options.logger =
|
|
48
|
+
options.logger ||
|
|
49
|
+
(new Logger({
|
|
50
|
+
level: 'warn',
|
|
51
|
+
}) as Logger & LoggerInterface);
|
|
47
52
|
options.metrics = options.metrics || defaultMetrics;
|
|
48
53
|
|
|
49
54
|
this.options = options;
|
|
@@ -17,9 +17,9 @@ class ModernSSRServer extends ModernServer {
|
|
|
17
17
|
return routes.filter(route => route.isSSR);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
protected async
|
|
20
|
+
protected async setupBeforeProdMiddleware() {
|
|
21
21
|
if (this.runMode === RUN_MODE.FULL) {
|
|
22
|
-
await super.
|
|
22
|
+
await super.setupBeforeProdMiddleware();
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -39,9 +39,9 @@ class ModernAPIServer extends ModernServer {
|
|
|
39
39
|
return routes.filter(route => route.isApi);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
protected async
|
|
42
|
+
protected async setupBeforeProdMiddleware() {
|
|
43
43
|
if (this.runMode === RUN_MODE.FULL) {
|
|
44
|
-
await super.
|
|
44
|
+
await super.setupBeforeProdMiddleware();
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -180,7 +180,7 @@ export class ModernServer implements ModernServerInterface {
|
|
|
180
180
|
staticGenerate,
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
-
await this.
|
|
183
|
+
await this.setupBeforeProdMiddleware();
|
|
184
184
|
|
|
185
185
|
this.addHandler(this.staticFileHandler);
|
|
186
186
|
this.addHandler(this.routeHandler.bind(this));
|
|
@@ -253,7 +253,7 @@ export class ModernServer implements ModernServerInterface {
|
|
|
253
253
|
|
|
254
254
|
// return 404 page
|
|
255
255
|
protected render404(context: ModernServerContext) {
|
|
256
|
-
context.error(ERROR_DIGEST.ENOTF);
|
|
256
|
+
context.error(ERROR_DIGEST.ENOTF, '404 Not Found');
|
|
257
257
|
this.renderErrorPage(context, 404);
|
|
258
258
|
}
|
|
259
259
|
|
|
@@ -335,10 +335,10 @@ export class ModernServer implements ModernServerInterface {
|
|
|
335
335
|
return this.runner[eventName](input as any, { onLast: noop as any });
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
protected async
|
|
338
|
+
protected async setupBeforeProdMiddleware() {
|
|
339
339
|
const { conf, runner } = this;
|
|
340
340
|
const preMiddleware: ModernServerAsyncHandler[] =
|
|
341
|
-
await runner.
|
|
341
|
+
await runner.beforeProdServer(conf);
|
|
342
342
|
|
|
343
343
|
preMiddleware.flat().forEach(mid => {
|
|
344
344
|
this.addHandler(mid);
|
|
@@ -565,8 +565,8 @@ export class ModernServer implements ModernServerInterface {
|
|
|
565
565
|
},
|
|
566
566
|
) {
|
|
567
567
|
res.statusCode = 200;
|
|
568
|
-
req.logger =
|
|
569
|
-
req.metrics =
|
|
568
|
+
req.logger = this.logger;
|
|
569
|
+
req.metrics = this.metrics;
|
|
570
570
|
const context: ModernServerContext = createContext(req, res);
|
|
571
571
|
|
|
572
572
|
try {
|
package/src/utils.ts
CHANGED
|
@@ -9,15 +9,6 @@ export const mergeExtension = (users: any[]) => {
|
|
|
9
9
|
return { middleware: output.concat(users) };
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
export const toMessage = (dig: string, e: Error | string): string => {
|
|
13
|
-
const message = e instanceof Error ? e.message : e;
|
|
14
|
-
if (message) {
|
|
15
|
-
return `${dig}: ${message}`;
|
|
16
|
-
} else {
|
|
17
|
-
return dig;
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
12
|
export const noop = () => {
|
|
22
13
|
// noop
|
|
23
14
|
};
|