@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 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
- logInfo() {
167
- return {
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
  }
@@ -2,10 +2,10 @@ const metrics = {
2
2
  gauges() {// no impl
3
3
  },
4
4
 
5
- counter() {// no impl
5
+ emitCounter() {// no impl
6
6
  },
7
7
 
8
- timer() {// no impl
8
+ emitTimer() {// no impl
9
9
  }
10
10
 
11
11
  };
@@ -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: ctx.logger,
32
- metrics: ctx.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 { logger as defaultLogger, SHARED_DIR, OUTPUT_CONFIG_FILE } from '@modern-js/utils';
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 || defaultLogger;
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 preServerInit() {
13
+ async setupBeforeProdMiddleware() {
14
14
  if (this.runMode === RUN_MODE.FULL) {
15
- await super.preServerInit();
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 preServerInit() {
36
+ async setupBeforeProdMiddleware() {
37
37
  if (this.runMode === RUN_MODE.FULL) {
38
- await super.preServerInit();
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.preServerInit();
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 preServerInit() {
279
+ async setupBeforeProdMiddleware() {
280
280
  const {
281
281
  conf,
282
282
  runner
283
283
  } = this;
284
- const preMiddleware = await runner.preServerInit(conf);
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 = req.logger || this.logger;
529
- req.metrics = req.metrics || this.metrics;
528
+ req.logger = this.logger;
529
+ req.metrics = this.metrics;
530
530
  const context = createContext(req, res);
531
531
 
532
532
  try {
@@ -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
- logInfo() {
179
- return {
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
  }
@@ -8,10 +8,10 @@ const metrics = {
8
8
  gauges() {// no impl
9
9
  },
10
10
 
11
- counter() {// no impl
11
+ emitCounter() {// no impl
12
12
  },
13
13
 
14
- timer() {// no impl
14
+ emitTimer() {// no impl
15
15
  }
16
16
 
17
17
  };
@@ -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: ctx.logger,
47
- metrics: ctx.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.logger;
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 preServerInit() {
21
+ async setupBeforeProdMiddleware() {
22
22
  if (this.runMode === _constants.RUN_MODE.FULL) {
23
- await super.preServerInit();
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 preServerInit() {
44
+ async setupBeforeProdMiddleware() {
45
45
  if (this.runMode === _constants.RUN_MODE.FULL) {
46
- await super.preServerInit();
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.preServerInit();
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 preServerInit() {
312
+ async setupBeforeProdMiddleware() {
313
313
  const {
314
314
  conf,
315
315
  runner
316
316
  } = this;
317
- const preMiddleware = await runner.preServerInit(conf);
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 = req.logger || this.logger;
563
- req.metrics = req.metrics || this.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 {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.toPath = exports.toMessage = exports.prepareFavicons = exports.noop = exports.mergeExtension = exports.getStaticReg = exports.debug = exports.createMiddlewareCollecter = exports.createErrorDocument = void 0;
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?: 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
- logInfo(): {
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 preServerInit(): Promise<void>;
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>;
@@ -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.2",
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.6.0",
31
+ "@modern-js/utils": "^1.7.0",
32
32
  "@babel/compat-data": "^7.17.0",
33
- "@modern-js/server-core": "^1.3.2",
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.1",
47
- "@modern-js/core": "1.9.0",
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
- public logger: Logger;
31
+ get logger() {
32
+ return this.req.logger;
33
+ }
33
34
 
34
- public metrics?: Metrics;
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 logInfo() {
170
- return {
171
- headers: this.headers,
172
- href: this.href,
173
- url: this.url,
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
  }
@@ -4,10 +4,10 @@ const metrics: Metrics = {
4
4
  gauges() {
5
5
  // no impl
6
6
  },
7
- counter() {
7
+ emitCounter() {
8
8
  // no impl
9
9
  },
10
- timer() {
10
+ emitTimer() {
11
11
  // no impl
12
12
  },
13
13
  };
@@ -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
+ };
@@ -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: ctx.logger,
42
- metrics: ctx.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
 
@@ -8,9 +8,10 @@ import {
8
8
  ServerConfig,
9
9
  } from '@modern-js/server-core';
10
10
  import {
11
- logger as defaultLogger,
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 = options.logger || defaultLogger;
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 preServerInit() {
20
+ protected async setupBeforeProdMiddleware() {
21
21
  if (this.runMode === RUN_MODE.FULL) {
22
- await super.preServerInit();
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 preServerInit() {
42
+ protected async setupBeforeProdMiddleware() {
43
43
  if (this.runMode === RUN_MODE.FULL) {
44
- await super.preServerInit();
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.preServerInit();
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 preServerInit() {
338
+ protected async setupBeforeProdMiddleware() {
339
339
  const { conf, runner } = this;
340
340
  const preMiddleware: ModernServerAsyncHandler[] =
341
- await runner.preServerInit(conf);
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 = req.logger || this.logger;
569
- req.metrics = req.metrics || this.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
  };