@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.
- package/dist/cjs/adapters/node/plugins/resource.js +1 -1
- package/dist/cjs/constants.js +12 -9
- package/dist/cjs/plugins/customServer/index.js +5 -5
- package/dist/cjs/plugins/index.js +7 -3
- package/dist/cjs/plugins/log.js +3 -3
- package/dist/cjs/plugins/monitors.js +183 -0
- package/dist/cjs/plugins/render/index.js +5 -3
- package/dist/cjs/plugins/render/render.js +4 -11
- package/dist/cjs/utils/error.js +3 -3
- package/dist/esm/adapters/node/plugins/resource.js +1 -1
- package/dist/esm/constants.js +10 -8
- package/dist/esm/plugins/customServer/index.js +8 -8
- package/dist/esm/plugins/index.js +4 -2
- package/dist/esm/plugins/log.js +4 -4
- package/dist/esm/plugins/monitors.js +261 -0
- package/dist/esm/plugins/render/index.js +5 -3
- package/dist/esm/plugins/render/render.js +5 -12
- package/dist/esm/utils/error.js +3 -3
- package/dist/esm-node/adapters/node/plugins/resource.js +1 -1
- package/dist/esm-node/constants.js +10 -8
- package/dist/esm-node/plugins/customServer/index.js +6 -6
- package/dist/esm-node/plugins/index.js +4 -2
- package/dist/esm-node/plugins/log.js +3 -3
- package/dist/esm-node/plugins/monitors.js +156 -0
- package/dist/esm-node/plugins/render/index.js +4 -2
- package/dist/esm-node/plugins/render/render.js +4 -11
- package/dist/esm-node/utils/error.js +3 -3
- package/dist/types/constants.d.ts +2 -1
- package/dist/types/plugins/index.d.ts +1 -1
- package/dist/types/plugins/monitors.d.ts +6 -0
- package/dist/types/types/render.d.ts +7 -4
- package/dist/types/types/requestHandler.d.ts +0 -2
- package/dist/types/types/server.d.ts +6 -2
- package/dist/types/utils/error.d.ts +2 -2
- package/package.json +7 -7
- package/dist/cjs/plugins/monitor.js +0 -87
- package/dist/cjs/plugins/render/serverTiming.js +0 -42
- package/dist/esm/plugins/monitor.js +0 -120
- package/dist/esm/plugins/render/serverTiming.js +0 -29
- package/dist/esm-node/plugins/monitor.js +0 -62
- package/dist/esm-node/plugins/render/serverTiming.js +0 -18
- package/dist/types/plugins/monitor.d.ts +0 -9
- 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 "../
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
package/dist/esm/utils/error.js
CHANGED
|
@@ -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,
|
|
18
|
+
function onError(digest, error, monitors, req) {
|
|
19
19
|
var headerData = req && parseHeaders(req);
|
|
20
20
|
headerData && delete headerData.cookie;
|
|
21
|
-
if (
|
|
22
|
-
|
|
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
|
|
19
|
-
(function(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
})(
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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 && (
|
|
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 && (
|
|
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
|
|
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 && (
|
|
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 {
|
|
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
|
|
43
|
-
if (!
|
|
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 =
|
|
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
|
+
};
|