@modern-js/server-core 2.55.0 → 2.56.0

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.
Files changed (43) hide show
  1. package/dist/cjs/adapters/node/plugins/resource.js +1 -1
  2. package/dist/cjs/constants.js +12 -9
  3. package/dist/cjs/plugins/customServer/index.js +5 -5
  4. package/dist/cjs/plugins/index.js +7 -3
  5. package/dist/cjs/plugins/log.js +3 -3
  6. package/dist/cjs/plugins/monitors.js +183 -0
  7. package/dist/cjs/plugins/render/index.js +5 -3
  8. package/dist/cjs/plugins/render/render.js +4 -11
  9. package/dist/cjs/utils/error.js +3 -3
  10. package/dist/esm/adapters/node/plugins/resource.js +1 -1
  11. package/dist/esm/constants.js +10 -8
  12. package/dist/esm/plugins/customServer/index.js +8 -8
  13. package/dist/esm/plugins/index.js +4 -2
  14. package/dist/esm/plugins/log.js +4 -4
  15. package/dist/esm/plugins/monitors.js +261 -0
  16. package/dist/esm/plugins/render/index.js +5 -3
  17. package/dist/esm/plugins/render/render.js +5 -12
  18. package/dist/esm/utils/error.js +3 -3
  19. package/dist/esm-node/adapters/node/plugins/resource.js +1 -1
  20. package/dist/esm-node/constants.js +10 -8
  21. package/dist/esm-node/plugins/customServer/index.js +6 -6
  22. package/dist/esm-node/plugins/index.js +4 -2
  23. package/dist/esm-node/plugins/log.js +3 -3
  24. package/dist/esm-node/plugins/monitors.js +156 -0
  25. package/dist/esm-node/plugins/render/index.js +4 -2
  26. package/dist/esm-node/plugins/render/render.js +4 -11
  27. package/dist/esm-node/utils/error.js +3 -3
  28. package/dist/types/constants.d.ts +2 -1
  29. package/dist/types/plugins/index.d.ts +1 -1
  30. package/dist/types/plugins/monitors.d.ts +6 -0
  31. package/dist/types/types/render.d.ts +7 -4
  32. package/dist/types/types/requestHandler.d.ts +0 -2
  33. package/dist/types/types/server.d.ts +6 -2
  34. package/dist/types/utils/error.d.ts +2 -2
  35. package/package.json +7 -7
  36. package/dist/cjs/plugins/monitor.js +0 -87
  37. package/dist/cjs/plugins/render/serverTiming.js +0 -42
  38. package/dist/esm/plugins/monitor.js +0 -120
  39. package/dist/esm/plugins/render/serverTiming.js +0 -29
  40. package/dist/esm-node/plugins/monitor.js +0 -62
  41. package/dist/esm-node/plugins/render/serverTiming.js +0 -18
  42. package/dist/types/plugins/monitor.d.ts +0 -9
  43. package/dist/types/plugins/render/serverTiming.d.ts +0 -8
@@ -0,0 +1,261 @@
1
+ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
3
+ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
4
+ import { time } from "@modern-js/runtime-utils/time";
5
+ import { SERVER_TIMING, ServerTimings } from "../constants";
6
+ function createMonitors() {
7
+ var coreMonitors = [];
8
+ var log = function(level, message, args) {
9
+ var event = {
10
+ type: "log",
11
+ payload: {
12
+ level,
13
+ message,
14
+ args
15
+ }
16
+ };
17
+ coreMonitors.forEach(function(monitor) {
18
+ return monitor(event);
19
+ });
20
+ };
21
+ var mointors = {
22
+ push: function push(monitor) {
23
+ coreMonitors.push(monitor);
24
+ },
25
+ error: function error(message) {
26
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
27
+ args[_key - 1] = arguments[_key];
28
+ }
29
+ log("error", message, args);
30
+ },
31
+ warn: function warn(message) {
32
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
33
+ args[_key - 1] = arguments[_key];
34
+ }
35
+ log("warn", message, args);
36
+ },
37
+ debug: function debug(message) {
38
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
39
+ args[_key - 1] = arguments[_key];
40
+ }
41
+ log("debug", message, args);
42
+ },
43
+ info: function info(message) {
44
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
45
+ args[_key - 1] = arguments[_key];
46
+ }
47
+ log("info", message, args);
48
+ },
49
+ timing: function timing(name, dur, desc) {
50
+ var event = {
51
+ type: "timing",
52
+ payload: {
53
+ name,
54
+ dur,
55
+ desc
56
+ }
57
+ };
58
+ coreMonitors.forEach(function(monitor) {
59
+ return monitor(event);
60
+ });
61
+ }
62
+ };
63
+ return mointors;
64
+ }
65
+ var initMonitorsPlugin = function() {
66
+ return {
67
+ name: "@modern-js/init-mointor",
68
+ setup: function setup(api) {
69
+ return {
70
+ prepare: function prepare() {
71
+ var middlewares = api.useAppContext().middlewares;
72
+ middlewares.push({
73
+ name: "init-monitor",
74
+ handler: function() {
75
+ var _ref = _async_to_generator(function(c, next) {
76
+ var monitors;
77
+ return _ts_generator(this, function(_state) {
78
+ if (!c.get("monitors")) {
79
+ monitors = createMonitors();
80
+ c.set("monitors", monitors);
81
+ }
82
+ return [
83
+ 2,
84
+ next()
85
+ ];
86
+ });
87
+ });
88
+ return function(c, next) {
89
+ return _ref.apply(this, arguments);
90
+ };
91
+ }(),
92
+ order: "pre"
93
+ });
94
+ }
95
+ };
96
+ }
97
+ };
98
+ };
99
+ var injectloggerPluigin = function(logger) {
100
+ return {
101
+ name: "@modern-js/inject-logger",
102
+ setup: function setup(api) {
103
+ return {
104
+ prepare: function prepare() {
105
+ var middlewares = api.useAppContext().middlewares;
106
+ middlewares.push({
107
+ name: "inject-logger",
108
+ handler: function() {
109
+ var _ref = _async_to_generator(function(c, next) {
110
+ var pathname, loggerMonitor, monitors;
111
+ return _ts_generator(this, function(_state) {
112
+ if (!c.get("logger")) {
113
+ c.set("logger", logger);
114
+ }
115
+ pathname = c.req.path;
116
+ loggerMonitor = function(event) {
117
+ if (event.type === "log") {
118
+ var _logger;
119
+ var _event_payload = event.payload, level = _event_payload.level, message = _event_payload.message, args = _event_payload.args;
120
+ (_logger = logger)[level].apply(_logger, [
121
+ message
122
+ ].concat(_to_consumable_array(args || [])));
123
+ }
124
+ if (event.type === "timing") {
125
+ var _event_payload1 = event.payload, name = _event_payload1.name, dur = _event_payload1.dur, desc = _event_payload1.desc;
126
+ if (desc) {
127
+ logger.debug("%s Debug - ".concat(name, ", cost: %s, req.url = %s "), desc, dur, pathname);
128
+ } else {
129
+ logger.debug("Debug - ".concat(name, ", cost: %s, req.url = %s"), dur, pathname);
130
+ }
131
+ }
132
+ };
133
+ monitors = c.get("monitors");
134
+ monitors === null || monitors === void 0 ? void 0 : monitors.push(loggerMonitor);
135
+ return [
136
+ 2,
137
+ next()
138
+ ];
139
+ });
140
+ });
141
+ return function(c, next) {
142
+ return _ref.apply(this, arguments);
143
+ };
144
+ }()
145
+ });
146
+ }
147
+ };
148
+ }
149
+ };
150
+ };
151
+ var injectServerTiming = function() {
152
+ var metaName = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "modern-js";
153
+ return {
154
+ name: "@modern-js/inject-server-timing",
155
+ setup: function setup(api) {
156
+ return {
157
+ prepare: function prepare() {
158
+ var middlewares = api.useAppContext().middlewares;
159
+ middlewares.push({
160
+ name: "inject-server-timing",
161
+ handler: function() {
162
+ var _ref = _async_to_generator(function(c, next) {
163
+ var serverTimings, timingMonitor, monitors;
164
+ return _ts_generator(this, function(_state) {
165
+ switch (_state.label) {
166
+ case 0:
167
+ serverTimings = [];
168
+ timingMonitor = function(event) {
169
+ if (event.type === "timing") {
170
+ serverTimings.push(event.payload);
171
+ }
172
+ };
173
+ monitors = c.get("monitors");
174
+ monitors === null || monitors === void 0 ? void 0 : monitors.push(timingMonitor);
175
+ return [
176
+ 4,
177
+ next()
178
+ ];
179
+ case 1:
180
+ _state.sent();
181
+ serverTimings.forEach(function(serverTiming) {
182
+ var name = serverTiming.name, desc = serverTiming.desc, dur = serverTiming.dur;
183
+ var _name = "bd-".concat(metaName, "-").concat(name);
184
+ var value = "".concat(_name, ";").concat(desc ? 'decs="'.concat(desc, '";') : "", " dur=").concat(dur);
185
+ c.header(SERVER_TIMING, value, {
186
+ append: true
187
+ });
188
+ });
189
+ return [
190
+ 2
191
+ ];
192
+ }
193
+ });
194
+ });
195
+ return function(c, next) {
196
+ return _ref.apply(this, arguments);
197
+ };
198
+ }()
199
+ });
200
+ }
201
+ };
202
+ }
203
+ };
204
+ };
205
+ function initReporter(entryName) {
206
+ return function() {
207
+ var _ref = _async_to_generator(function(c, next) {
208
+ var reporter, getCost, cost;
209
+ return _ts_generator(this, function(_state) {
210
+ switch (_state.label) {
211
+ case 0:
212
+ reporter = c.get("reporter");
213
+ if (!!reporter)
214
+ return [
215
+ 3,
216
+ 2
217
+ ];
218
+ return [
219
+ 4,
220
+ next()
221
+ ];
222
+ case 1:
223
+ _state.sent();
224
+ return [
225
+ 2
226
+ ];
227
+ case 2:
228
+ return [
229
+ 4,
230
+ reporter.init({
231
+ entryName
232
+ })
233
+ ];
234
+ case 3:
235
+ _state.sent();
236
+ getCost = time();
237
+ return [
238
+ 4,
239
+ next()
240
+ ];
241
+ case 4:
242
+ _state.sent();
243
+ cost = getCost();
244
+ reporter.reportTiming(ServerTimings.SERVER_HANDLE_REQUEST, cost);
245
+ return [
246
+ 2
247
+ ];
248
+ }
249
+ });
250
+ });
251
+ return function(c, next) {
252
+ return _ref.apply(this, arguments);
253
+ };
254
+ }();
255
+ }
256
+ export {
257
+ initMonitorsPlugin,
258
+ initReporter,
259
+ injectServerTiming,
260
+ injectloggerPluigin
261
+ };
@@ -1,7 +1,7 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
3
  import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
4
- import { initReporter } from "../monitor";
4
+ import { initReporter } from "../monitors";
5
5
  import { sortRoutes } from "../../utils";
6
6
  import { getLoaderCtx, CustomServer, getServerMidFromUnstableMid } from "../customServer";
7
7
  import { createRender } from "./render";
@@ -150,12 +150,13 @@ function getPageRoutes(routes) {
150
150
  function createRenderHandler(render) {
151
151
  return function() {
152
152
  var _ref = _async_to_generator(function(c, _) {
153
- var _c_env_node, logger, reporter, templates, serverManifest, locals, metrics, loaderContext, request, nodeReq, res, body, status, headers, headersData;
153
+ var _c_env_node, logger, reporter, monitors, templates, serverManifest, locals, metrics, loaderContext, request, nodeReq, res, body, status, headers, headersData;
154
154
  return _ts_generator(this, function(_state) {
155
155
  switch (_state.label) {
156
156
  case 0:
157
157
  logger = c.get("logger");
158
158
  reporter = c.get("reporter");
159
+ monitors = c.get("monitors");
159
160
  templates = c.get("templates") || {};
160
161
  serverManifest = c.get("serverManifest") || {};
161
162
  locals = c.get("locals");
@@ -166,8 +167,9 @@ function createRenderHandler(render) {
166
167
  return [
167
168
  4,
168
169
  render(request, {
169
- logger,
170
170
  nodeReq,
171
+ monitors,
172
+ logger,
171
173
  reporter,
172
174
  templates,
173
175
  metrics,
@@ -12,7 +12,6 @@ import { parseQuery, getPathname, createErrorHtml, sortRoutes, transformResponse
12
12
  import { REPLACE_REG, X_MODERNJS_RENDER } from "../../constants";
13
13
  import { dataHandler } from "./dataHandler";
14
14
  import { ssrRender } from "./ssrRender";
15
- import { ServerTiming } from "./serverTiming";
16
15
  var DYNAMIC_ROUTE_REG = /\/:./;
17
16
  function getRouter(routes) {
18
17
  var dynamicRoutes = [];
@@ -63,7 +62,6 @@ function getHeadersWithoutCookie(headers) {
63
62
  delete _headers.cookie;
64
63
  return _headers;
65
64
  }
66
- var SERVER_TIMING = "Server-Timing";
67
65
  function createRender(_) {
68
66
  return _createRender.apply(this, arguments);
69
67
  }
@@ -77,11 +75,11 @@ function _createRender() {
77
75
  2,
78
76
  function() {
79
77
  var _ref = _async_to_generator(function(req, param2) {
80
- var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, loaderContext, _matchRoute, routeInfo, params, onFallback, html, renderMode, pathname, headerData, serverTimingInstance, onError, onTiming, onBoundError, renderOptions, response, _tmp;
78
+ var logger, reporter, metrics, monitors, nodeReq, templates, serverManifest, locals, loaderContext, _matchRoute, routeInfo, params, onFallback, html, renderMode, pathname, headerData, onError, onTiming, onBoundError, renderOptions, response, _tmp;
81
79
  return _ts_generator(this, function(_state2) {
82
80
  switch (_state2.label) {
83
81
  case 0:
84
- logger = param2.logger, nodeReq = param2.nodeReq, reporter = param2.reporter, templates = param2.templates, serverManifest = param2.serverManifest, locals = param2.locals, metrics = param2.metrics, loaderContext = param2.loaderContext;
82
+ logger = param2.logger, reporter = param2.reporter, metrics = param2.metrics, monitors = param2.monitors, nodeReq = param2.nodeReq, templates = param2.templates, serverManifest = param2.serverManifest, locals = param2.locals, loaderContext = param2.loaderContext;
85
83
  _matchRoute = _sliced_to_array(matchRoute(router, req), 2), routeInfo = _matchRoute[0], params = _matchRoute[1];
86
84
  onFallback = function() {
87
85
  var _ref2 = _async_to_generator(function(reason, error) {
@@ -131,20 +129,18 @@ function _createRender() {
131
129
  renderMode = _state2.sent();
132
130
  pathname = getPathname(req);
133
131
  headerData = parseHeaders(req);
134
- serverTimingInstance = new ServerTiming(metaName || "modern");
135
132
  onError = function(e) {
136
- logger.error("SSR Error - ".concat(_instanceof(e, Error) ? e.name : e, ", error = %s, req.url = %s, req.headers = %o"), _instanceof(e, Error) ? e.stack || e.message : e, pathname, getHeadersWithoutCookie(headerData));
133
+ monitors === null || monitors === void 0 ? void 0 : monitors.error("SSR Error - ".concat(_instanceof(e, Error) ? e.name : e, ", error = %s, req.url = %s, req.headers = %o"), _instanceof(e, Error) ? e.stack || e.message : e, pathname, getHeadersWithoutCookie(headerData));
137
134
  };
138
135
  onTiming = function(name, dur) {
139
- logger.debug("SSR Debug - ".concat(name, ", cost = %s, req.url = %s"), dur, pathname);
140
- serverTimingInstance.addServeTiming(name, dur);
136
+ monitors === null || monitors === void 0 ? void 0 : monitors.timing(name, dur, "SSR");
141
137
  };
142
138
  onBoundError = function() {
143
139
  var _ref2 = _async_to_generator(function(e) {
144
140
  return _ts_generator(this, function(_state3) {
145
141
  switch (_state3.label) {
146
142
  case 0:
147
- onErrorFn(ErrorDigest.ERENDER, e, logger, req);
143
+ onErrorFn(ErrorDigest.ERENDER, e, monitors, req);
148
144
  return [
149
145
  4,
150
146
  onFallback === null || onFallback === void 0 ? void 0 : onFallback("error", e)
@@ -240,9 +236,6 @@ function _createRender() {
240
236
  case 8:
241
237
  throw new Error("Unknown render mode: ".concat(renderMode));
242
238
  case 9:
243
- serverTimingInstance.headers.forEach(function(value) {
244
- response.headers.append(SERVER_TIMING, value);
245
- });
246
239
  return [
247
240
  2,
248
241
  response
@@ -15,11 +15,11 @@ var ErrorDigest;
15
15
  ErrorDigest2["EINTER"] = "Internal server error";
16
16
  ErrorDigest2["ERENDER"] = "SSR render failed";
17
17
  })(ErrorDigest || (ErrorDigest = {}));
18
- function onError(digest, error, logger, req) {
18
+ function onError(digest, error, monitors, req) {
19
19
  var headerData = req && parseHeaders(req);
20
20
  headerData && delete headerData.cookie;
21
- if (logger) {
22
- logger.error(req ? "Server Error - ".concat(digest, ", error = %s, req.url = %s, req.headers = %o") : "Server Error - ".concat(digest, ", error = %s"), _instanceof(error, Error) ? error.stack || error.message : error, req === null || req === void 0 ? void 0 : req.url, headerData);
21
+ if (monitors) {
22
+ monitors.error(req ? "Server Error - ".concat(digest, ", error = %s, req.url = %s, req.headers = %o") : "Server Error - ".concat(digest, ", error = %s"), _instanceof(error, Error) ? error.stack || error.message : error, req === null || req === void 0 ? void 0 : req.url, headerData);
23
23
  } else if (req) {
24
24
  console.error("Server Error - ".concat(digest, ", error = ").concat(_instanceof(error, Error) ? error.stack || error.message : error, ", req.url = ").concat(req.url, ", req.headers = ").concat(JSON.stringify(headerData)));
25
25
  } else {
@@ -40,7 +40,7 @@ const loadBundle = async (filepath, logger) => {
40
40
  return void 0;
41
41
  }
42
42
  return dynamicImport(filepath).catch((e) => {
43
- logger.error(`Load ${filepath} bundle failed, error = %s`, e instanceof Error ? e.stack || e.message : e);
43
+ logger === null || logger === void 0 ? void 0 : logger.error(`Load ${filepath} bundle failed, error = %s`, e instanceof Error ? e.stack || e.message : e);
44
44
  return void 0;
45
45
  });
46
46
  };
@@ -15,19 +15,21 @@ const REPLACE_REG = {
15
15
  body: "</body>"
16
16
  }
17
17
  };
18
- var ServerReportTimings;
19
- (function(ServerReportTimings2) {
20
- ServerReportTimings2["SERVER_HANDLE_REQUEST"] = "server-handle-request";
21
- ServerReportTimings2["SERVER_MIDDLEWARE"] = "server-middleware";
22
- ServerReportTimings2["SERVER_HOOK_AFTER_RENDER"] = "server-hook-after-render";
23
- ServerReportTimings2["SERVER_HOOK_AFTER_MATCH"] = "server-hook-after-match";
24
- })(ServerReportTimings || (ServerReportTimings = {}));
18
+ var ServerTimings;
19
+ (function(ServerTimings2) {
20
+ ServerTimings2["SERVER_HANDLE_REQUEST"] = "server-handle-request";
21
+ ServerTimings2["SERVER_MIDDLEWARE"] = "server-middleware";
22
+ ServerTimings2["SERVER_HOOK_AFTER_RENDER"] = "server-hook-after-render";
23
+ ServerTimings2["SERVER_HOOK_AFTER_MATCH"] = "server-hook-after-match";
24
+ })(ServerTimings || (ServerTimings = {}));
25
+ const SERVER_TIMING = "Server-Timing";
25
26
  const X_RENDER_CACHE = "x-render-cache";
26
27
  const X_MODERNJS_RENDER = "x-modernjs-render";
27
28
  export {
28
29
  AGGRED_DIR,
29
30
  REPLACE_REG,
30
- ServerReportTimings,
31
+ SERVER_TIMING,
32
+ ServerTimings,
31
33
  X_MODERNJS_RENDER,
32
34
  X_RENDER_CACHE
33
35
  };
@@ -1,6 +1,6 @@
1
1
  import { time } from "@modern-js/runtime-utils/time";
2
2
  import { transformResponse } from "../../utils";
3
- import { ServerReportTimings } from "../../constants";
3
+ import { ServerTimings } from "../../constants";
4
4
  import { getLoaderCtx } from "./loader";
5
5
  import { getAfterMatchCtx, getAfterRenderCtx, createCustomMiddlewaresCtx, createAfterStreamingRenderContext } from "./context";
6
6
  import { createBaseHookContext } from "./base";
@@ -15,7 +15,7 @@ class CustomServer {
15
15
  getHookMiddleware(entryName, routes) {
16
16
  return async (c, next) => {
17
17
  const routeInfo = routes.find((route) => route.entryName === entryName);
18
- const reporter = c.get("reporter");
18
+ const monitors = c.get("monitors");
19
19
  const baseHookCtx = createBaseHookContext(c);
20
20
  const afterMatchCtx = getAfterMatchCtx(entryName, baseHookCtx);
21
21
  const getCost = time();
@@ -23,7 +23,7 @@ class CustomServer {
23
23
  onLast: noop
24
24
  });
25
25
  const cost = getCost();
26
- cost && (reporter === null || reporter === void 0 ? void 0 : reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost));
26
+ cost && (monitors === null || monitors === void 0 ? void 0 : monitors.timing(ServerTimings.SERVER_HOOK_AFTER_MATCH, cost));
27
27
  const { url, status } = afterMatchCtx.router;
28
28
  if (url) {
29
29
  return c.redirect(url, status);
@@ -63,7 +63,7 @@ class CustomServer {
63
63
  onLast: noop
64
64
  });
65
65
  const cost2 = getCost2();
66
- cost2 && (reporter === null || reporter === void 0 ? void 0 : reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost2));
66
+ cost2 && (monitors === null || monitors === void 0 ? void 0 : monitors.timing(ServerTimings.SERVER_HOOK_AFTER_RENDER, cost2));
67
67
  if (afterRenderCtx.response.private_overrided) {
68
68
  return void 0;
69
69
  }
@@ -82,7 +82,7 @@ class CustomServer {
82
82
  }
83
83
  return async (c, next) => {
84
84
  var _c_env_node_res, _c_env_node, _c_env;
85
- const reporter = c.get("reporter");
85
+ const monitors = c.get("monitors");
86
86
  const locals = {};
87
87
  const resArgs = {
88
88
  headers: new Headers()
@@ -91,7 +91,7 @@ class CustomServer {
91
91
  const getCost = time();
92
92
  await serverMiddleware(customMiddlewareCtx);
93
93
  const cost = getCost();
94
- cost && (reporter === null || reporter === void 0 ? void 0 : reporter.reportTiming(ServerReportTimings.SERVER_MIDDLEWARE, cost));
94
+ cost && (monitors === null || monitors === void 0 ? void 0 : monitors.timing(ServerTimings.SERVER_MIDDLEWARE, cost));
95
95
  c.set("locals", locals);
96
96
  if (isRedirect(resArgs.headers, resArgs.status)) {
97
97
  return c.redirect(resArgs.headers.get("Location") || "", resArgs.status || 302);
@@ -3,13 +3,15 @@ import { faviconPlugin } from "./favicon";
3
3
  import { processedByPlugin } from "./processedBy";
4
4
  import { getLoaderCtx } from "./customServer";
5
5
  import { logPlugin } from "./log";
6
- import { monitorPlugin } from "./monitor";
6
+ import { initMonitorsPlugin, injectServerTiming, injectloggerPluigin } from "./monitors";
7
7
  export {
8
8
  faviconPlugin,
9
9
  getLoaderCtx,
10
10
  getRenderHandler,
11
+ initMonitorsPlugin,
12
+ injectServerTiming,
13
+ injectloggerPluigin,
11
14
  logPlugin,
12
- monitorPlugin,
13
15
  processedByPlugin,
14
16
  renderPlugin
15
17
  };
@@ -39,13 +39,13 @@ function log(fn, prefix, method, path, status = 0, elapsed) {
39
39
  function logHandler() {
40
40
  return async function logger(c, next) {
41
41
  const { method } = c.req;
42
- const logger2 = c.get("logger");
43
- if (!logger2) {
42
+ const monitors = c.get("monitors");
43
+ if (!monitors) {
44
44
  await next();
45
45
  return;
46
46
  }
47
47
  const path = getPathname(c.req.raw);
48
- const logFn = logger2.debug;
48
+ const logFn = monitors.debug;
49
49
  log(logFn, "<--", method, path);
50
50
  const start = Date.now();
51
51
  await next();
@@ -0,0 +1,156 @@
1
+ import { time } from "@modern-js/runtime-utils/time";
2
+ import { SERVER_TIMING, ServerTimings } from "../constants";
3
+ function createMonitors() {
4
+ const coreMonitors = [];
5
+ const log = (level, message, args) => {
6
+ const event = {
7
+ type: "log",
8
+ payload: {
9
+ level,
10
+ message,
11
+ args
12
+ }
13
+ };
14
+ coreMonitors.forEach((monitor) => monitor(event));
15
+ };
16
+ const mointors = {
17
+ push(monitor) {
18
+ coreMonitors.push(monitor);
19
+ },
20
+ error(message, ...args) {
21
+ log("error", message, args);
22
+ },
23
+ warn(message, ...args) {
24
+ log("warn", message, args);
25
+ },
26
+ debug(message, ...args) {
27
+ log("debug", message, args);
28
+ },
29
+ info(message, ...args) {
30
+ log("info", message, args);
31
+ },
32
+ timing(name, dur, desc) {
33
+ const event = {
34
+ type: "timing",
35
+ payload: {
36
+ name,
37
+ dur,
38
+ desc
39
+ }
40
+ };
41
+ coreMonitors.forEach((monitor) => monitor(event));
42
+ }
43
+ };
44
+ return mointors;
45
+ }
46
+ const initMonitorsPlugin = () => ({
47
+ name: "@modern-js/init-mointor",
48
+ setup(api) {
49
+ return {
50
+ prepare() {
51
+ const { middlewares } = api.useAppContext();
52
+ middlewares.push({
53
+ name: "init-monitor",
54
+ handler: async (c, next) => {
55
+ if (!c.get("monitors")) {
56
+ const monitors = createMonitors();
57
+ c.set("monitors", monitors);
58
+ }
59
+ return next();
60
+ },
61
+ order: "pre"
62
+ });
63
+ }
64
+ };
65
+ }
66
+ });
67
+ const injectloggerPluigin = (logger) => ({
68
+ name: "@modern-js/inject-logger",
69
+ setup(api) {
70
+ return {
71
+ prepare() {
72
+ const { middlewares } = api.useAppContext();
73
+ middlewares.push({
74
+ name: "inject-logger",
75
+ handler: async (c, next) => {
76
+ if (!c.get("logger")) {
77
+ c.set("logger", logger);
78
+ }
79
+ const pathname = c.req.path;
80
+ const loggerMonitor = (event) => {
81
+ if (event.type === "log") {
82
+ const { level, message, args } = event.payload;
83
+ logger[level](message, ...args || []);
84
+ }
85
+ if (event.type === "timing") {
86
+ const { name, dur, desc } = event.payload;
87
+ if (desc) {
88
+ logger.debug(`%s Debug - ${name}, cost: %s, req.url = %s `, desc, dur, pathname);
89
+ } else {
90
+ logger.debug(`Debug - ${name}, cost: %s, req.url = %s`, dur, pathname);
91
+ }
92
+ }
93
+ };
94
+ const monitors = c.get("monitors");
95
+ monitors === null || monitors === void 0 ? void 0 : monitors.push(loggerMonitor);
96
+ return next();
97
+ }
98
+ });
99
+ }
100
+ };
101
+ }
102
+ });
103
+ const injectServerTiming = (metaName = "modern-js") => ({
104
+ name: "@modern-js/inject-server-timing",
105
+ setup(api) {
106
+ return {
107
+ prepare() {
108
+ const { middlewares } = api.useAppContext();
109
+ middlewares.push({
110
+ name: "inject-server-timing",
111
+ handler: async (c, next) => {
112
+ const serverTimings = [];
113
+ const timingMonitor = (event) => {
114
+ if (event.type === "timing") {
115
+ serverTimings.push(event.payload);
116
+ }
117
+ };
118
+ const monitors = c.get("monitors");
119
+ monitors === null || monitors === void 0 ? void 0 : monitors.push(timingMonitor);
120
+ await next();
121
+ serverTimings.forEach((serverTiming) => {
122
+ const { name, desc, dur } = serverTiming;
123
+ const _name = `bd-${metaName}-${name}`;
124
+ const value = `${_name};${desc ? `decs="${desc}";` : ""} dur=${dur}`;
125
+ c.header(SERVER_TIMING, value, {
126
+ append: true
127
+ });
128
+ });
129
+ }
130
+ });
131
+ }
132
+ };
133
+ }
134
+ });
135
+ function initReporter(entryName) {
136
+ return async (c, next) => {
137
+ const reporter = c.get("reporter");
138
+ if (!reporter) {
139
+ await next();
140
+ return;
141
+ }
142
+ await reporter.init({
143
+ entryName
144
+ });
145
+ const getCost = time();
146
+ await next();
147
+ const cost = getCost();
148
+ reporter.reportTiming(ServerTimings.SERVER_HANDLE_REQUEST, cost);
149
+ };
150
+ }
151
+ export {
152
+ initMonitorsPlugin,
153
+ initReporter,
154
+ injectServerTiming,
155
+ injectloggerPluigin
156
+ };