@modern-js/prod-server 2.28.0 → 2.30.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/CHANGELOG.md +42 -0
- package/dist/cjs/libs/context/context.js +16 -6
- package/dist/cjs/libs/hook-api/index.js +2 -1
- package/dist/cjs/libs/hook-api/index.worker.js +2 -1
- package/dist/cjs/libs/proxy.js +29 -11
- package/dist/cjs/libs/render/ssr.js +3 -20
- package/dist/cjs/libs/reporter.js +22 -0
- package/dist/cjs/libs/serverTiming.js +27 -0
- package/dist/cjs/server/index.js +14 -0
- package/dist/cjs/server/modernServer.js +27 -9
- package/dist/cjs/workerServer.js +12 -3
- package/dist/esm/libs/context/context.js +14 -4
- package/dist/esm/libs/hook-api/index.js +2 -1
- package/dist/esm/libs/hook-api/index.worker.js +2 -1
- package/dist/esm/libs/proxy.js +80 -32
- package/dist/esm/libs/render/ssr.js +6 -30
- package/dist/esm/libs/reporter.js +12 -0
- package/dist/esm/libs/serverTiming.js +27 -0
- package/dist/esm/server/index.js +22 -2
- package/dist/esm/server/modernServer.js +56 -33
- package/dist/esm/workerServer.js +13 -4
- package/dist/esm-node/libs/context/context.js +14 -4
- package/dist/esm-node/libs/hook-api/index.js +2 -1
- package/dist/esm-node/libs/hook-api/index.worker.js +2 -1
- package/dist/esm-node/libs/proxy.js +29 -11
- package/dist/esm-node/libs/render/ssr.js +3 -20
- package/dist/esm-node/libs/reporter.js +12 -0
- package/dist/esm-node/libs/serverTiming.js +17 -0
- package/dist/esm-node/server/index.js +14 -0
- package/dist/esm-node/server/modernServer.js +27 -9
- package/dist/esm-node/workerServer.js +12 -3
- package/dist/types/libs/context/context.d.ts +5 -2
- package/dist/types/libs/hook-api/index.worker.d.ts +2 -1
- package/dist/types/libs/proxy.d.ts +9 -2
- package/dist/types/libs/reporter.d.ts +2 -0
- package/dist/types/libs/serverTiming.d.ts +12 -0
- package/dist/types/server/modernServer.d.ts +1 -2
- package/dist/types/type.d.ts +1 -0
- package/dist/types/utils.d.ts +1 -1
- package/package.json +10 -8
|
@@ -36,7 +36,21 @@ export class Server {
|
|
|
36
36
|
if (!disableHttpServer) {
|
|
37
37
|
this.app = await this.server.createHTTPServer(this.getRequestHandler());
|
|
38
38
|
}
|
|
39
|
+
{
|
|
40
|
+
const result = await this.runner.beforeServerInit({
|
|
41
|
+
app: this.app,
|
|
42
|
+
server: this.server
|
|
43
|
+
});
|
|
44
|
+
({ app: this.app = this.app, server: this.server } = result);
|
|
45
|
+
}
|
|
39
46
|
await this.server.onInit(this.runner, this.app);
|
|
47
|
+
{
|
|
48
|
+
const result = await this.runner.afterServerInit({
|
|
49
|
+
app: this.app,
|
|
50
|
+
server: this.server
|
|
51
|
+
});
|
|
52
|
+
({ app: this.app = this.app, server: this.server } = result);
|
|
53
|
+
}
|
|
40
54
|
return this;
|
|
41
55
|
}
|
|
42
56
|
/**
|
|
@@ -2,6 +2,7 @@ import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
|
2
2
|
import { createServer } from "http";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { fs, isPromise, isWebOnly, mime, ROUTE_SPEC_FILE } from "@modern-js/utils";
|
|
5
|
+
import { time } from "@modern-js/utils/universal/time";
|
|
5
6
|
import { RouteMatchManager } from "../libs/route";
|
|
6
7
|
import { createRenderHandler } from "../libs/render";
|
|
7
8
|
import { createStaticFileHandler, faviconFallbackHandler } from "../libs/serveFile";
|
|
@@ -20,12 +21,11 @@ export class ModernServer {
|
|
|
20
21
|
const { distDir, conf } = this;
|
|
21
22
|
this.initReader();
|
|
22
23
|
debug("final server conf", this.conf);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
24
|
+
const proxyHandlers = createProxyHandler((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy);
|
|
25
|
+
app.on("upgrade", proxyHandlers.handleUpgrade);
|
|
26
|
+
proxyHandlers.handlers.forEach((handler) => {
|
|
27
|
+
this.addHandler(handler);
|
|
28
|
+
});
|
|
29
29
|
(_app = app) === null || _app === void 0 ? void 0 : _app.on("close", () => {
|
|
30
30
|
this.reader.close();
|
|
31
31
|
});
|
|
@@ -64,7 +64,9 @@ export class ModernServer {
|
|
|
64
64
|
async render(req, res, url) {
|
|
65
65
|
req.logger = req.logger || this.logger;
|
|
66
66
|
req.metrics = req.metrics || this.metrics;
|
|
67
|
-
const context = createContext(req, res
|
|
67
|
+
const context = createContext(req, res, {
|
|
68
|
+
metaName: this.metaName
|
|
69
|
+
});
|
|
68
70
|
const matched = this.router.match(url || context.path);
|
|
69
71
|
if (!matched) {
|
|
70
72
|
return null;
|
|
@@ -265,12 +267,20 @@ export class ModernServer {
|
|
|
265
267
|
/* —————————————————————— private function —————————————————————— */
|
|
266
268
|
// handler route.json, include api / csr / ssr
|
|
267
269
|
async routeHandler(context) {
|
|
268
|
-
const { res } = context;
|
|
270
|
+
const { res, reporter } = context;
|
|
269
271
|
const matched = this.router.match(context.path);
|
|
270
272
|
if (!matched) {
|
|
271
273
|
this.render404(context);
|
|
272
274
|
return;
|
|
273
275
|
}
|
|
276
|
+
await reporter.init({
|
|
277
|
+
match: matched
|
|
278
|
+
});
|
|
279
|
+
const end = time();
|
|
280
|
+
res.on("finish", () => {
|
|
281
|
+
const cost = end();
|
|
282
|
+
reporter.reportTiming("server_handle_request", cost);
|
|
283
|
+
});
|
|
274
284
|
let route = matched.generate(context.url);
|
|
275
285
|
if (route.isApi) {
|
|
276
286
|
await this.handleAPI(context);
|
|
@@ -279,9 +289,12 @@ export class ModernServer {
|
|
|
279
289
|
if (route.entryName) {
|
|
280
290
|
const afterMatchContext = createAfterMatchContext(context, route.entryName);
|
|
281
291
|
if (this.runMode === RUN_MODE.FULL) {
|
|
292
|
+
const end2 = time();
|
|
282
293
|
await this.runner.afterMatch(afterMatchContext, {
|
|
283
294
|
onLast: noop
|
|
284
295
|
});
|
|
296
|
+
const cost = end2();
|
|
297
|
+
reporter.reportTiming("server_hook_after_render", cost);
|
|
285
298
|
}
|
|
286
299
|
if (this.isSend(res)) {
|
|
287
300
|
return;
|
|
@@ -303,7 +316,10 @@ export class ModernServer {
|
|
|
303
316
|
if (this.frameWebHandler) {
|
|
304
317
|
res.locals = res.locals || {};
|
|
305
318
|
const middlewareContext = createMiddlewareContext(context);
|
|
319
|
+
const end2 = time();
|
|
306
320
|
await this.frameWebHandler(middlewareContext);
|
|
321
|
+
const cost = end2();
|
|
322
|
+
reporter.reportTiming("server_middleware", cost);
|
|
307
323
|
res.locals = {
|
|
308
324
|
...res.locals,
|
|
309
325
|
...middlewareContext.response.locals
|
|
@@ -325,9 +341,12 @@ export class ModernServer {
|
|
|
325
341
|
if (route.entryName) {
|
|
326
342
|
const afterRenderContext = createAfterRenderContext(context, response.toString());
|
|
327
343
|
if (this.runMode === RUN_MODE.FULL) {
|
|
344
|
+
const end2 = time();
|
|
328
345
|
await this.runner.afterRender(afterRenderContext, {
|
|
329
346
|
onLast: noop
|
|
330
347
|
});
|
|
348
|
+
const cost = end2();
|
|
349
|
+
reporter.reportTiming("server_hook_after_render", cost);
|
|
331
350
|
}
|
|
332
351
|
if (this.isSend(res)) {
|
|
333
352
|
return;
|
|
@@ -460,7 +479,6 @@ export class ModernServer {
|
|
|
460
479
|
_define_property(this, "loaderHandler", null);
|
|
461
480
|
_define_property(this, "frameWebHandler", null);
|
|
462
481
|
_define_property(this, "frameAPIHandler", null);
|
|
463
|
-
_define_property(this, "proxyHandler", null);
|
|
464
482
|
_define_property(this, "_handler", void 0);
|
|
465
483
|
require("ignore-styles");
|
|
466
484
|
this.pwd = pwd;
|
|
@@ -4,6 +4,7 @@ import { createAfterMatchContext, createAfterRenderContext, createMiddlewareCont
|
|
|
4
4
|
import { Logger } from "./libs/logger";
|
|
5
5
|
import { RouteMatchManager } from "./libs/route";
|
|
6
6
|
import { metrics as defaultMetrics } from "./libs/metrics";
|
|
7
|
+
import { defaultReporter } from "./libs/reporter";
|
|
7
8
|
export class ReturnResponse {
|
|
8
9
|
/**
|
|
9
10
|
* Iterate a Object
|
|
@@ -82,7 +83,8 @@ export const createHandler = (manifest) => {
|
|
|
82
83
|
level: "warn"
|
|
83
84
|
});
|
|
84
85
|
const metrics = defaultMetrics;
|
|
85
|
-
const
|
|
86
|
+
const reporter = defaultReporter;
|
|
87
|
+
const hookContext = createWorkerHookContext(request.url, logger, metrics, reporter);
|
|
86
88
|
const afterMatchHookContext = createAfterMatchContext(hookContext, entryName);
|
|
87
89
|
(_page = page) === null || _page === void 0 ? void 0 : (_page_serverHooks = _page.serverHooks) === null || _page_serverHooks === void 0 ? void 0 : (_page_serverHooks_afterMatch = _page_serverHooks.afterMatch) === null || _page_serverHooks_afterMatch === void 0 ? void 0 : _page_serverHooks_afterMatch.call(_page_serverHooks, afterMatchHookContext, () => void 0);
|
|
88
90
|
if (checkIsSent(hookContext)) {
|
|
@@ -118,9 +120,15 @@ export const createHandler = (manifest) => {
|
|
|
118
120
|
template: page.template,
|
|
119
121
|
entryName: page.entryName,
|
|
120
122
|
logger,
|
|
123
|
+
reporter: defaultReporter,
|
|
121
124
|
metrics,
|
|
122
125
|
// FIXME: pass correctly req & res
|
|
123
126
|
req: request,
|
|
127
|
+
serverTiming: {
|
|
128
|
+
addServeTiming() {
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
},
|
|
124
132
|
res: responseLike
|
|
125
133
|
};
|
|
126
134
|
const body = await page.serverRender(serverRenderContext);
|
|
@@ -165,7 +173,7 @@ function createResponse(template) {
|
|
|
165
173
|
return RESPONSE_NOTFOUND;
|
|
166
174
|
}
|
|
167
175
|
}
|
|
168
|
-
function createWorkerHookContext(url, logger, metrics) {
|
|
176
|
+
function createWorkerHookContext(url, logger, metrics, reporter) {
|
|
169
177
|
const [res, req] = [
|
|
170
178
|
{
|
|
171
179
|
headers: new Headers(),
|
|
@@ -179,7 +187,8 @@ function createWorkerHookContext(url, logger, metrics) {
|
|
|
179
187
|
res,
|
|
180
188
|
req,
|
|
181
189
|
logger,
|
|
182
|
-
metrics
|
|
190
|
+
metrics,
|
|
191
|
+
reporter
|
|
183
192
|
};
|
|
184
193
|
}
|
|
185
194
|
function applyMiddlewares(ctx, middleware) {
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
/// <reference types="node" />
|
|
4
4
|
/// <reference types="node/http" />
|
|
5
|
-
/// <reference types=".dts-temp/
|
|
5
|
+
/// <reference types=".dts-temp/9d9muATSMGvby0DR5Il3_/src/type" />
|
|
6
6
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
7
7
|
import qs from 'querystring';
|
|
8
|
-
import type { ModernServerContext as ModernServerContextInterface } from '@modern-js/types';
|
|
8
|
+
import type { ModernServerContext as ModernServerContextInterface, Reporter as ModernServerReporter, ServerTiming as ModernServerTiming } from '@modern-js/types';
|
|
9
9
|
export type ContextOptions = {
|
|
10
|
+
metaName?: string;
|
|
10
11
|
etag?: boolean;
|
|
11
12
|
};
|
|
12
13
|
type ResponseBody = string | Buffer;
|
|
@@ -23,6 +24,8 @@ export declare class ModernServerContext implements ModernServerContextInterface
|
|
|
23
24
|
* url params
|
|
24
25
|
*/
|
|
25
26
|
params: Record<string, string>;
|
|
27
|
+
reporter: ModernServerReporter;
|
|
28
|
+
serverTiming: ModernServerTiming;
|
|
26
29
|
get logger(): import("@modern-js/types").Logger;
|
|
27
30
|
get metrics(): import("@modern-js/types").Metrics;
|
|
28
31
|
serverData: Record<string, any>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AfterMatchContext, AfterRenderContext, HookContext, Logger, Metrics, MiddlewareContext } from '@modern-js/types/server';
|
|
1
|
+
import { AfterMatchContext, AfterRenderContext, HookContext, Logger, Metrics, MiddlewareContext, Reporter } from '@modern-js/types/server';
|
|
2
2
|
export interface WorkerResponse {
|
|
3
3
|
headers: Headers;
|
|
4
4
|
status: number;
|
|
@@ -10,6 +10,7 @@ export interface WorkerServerContext {
|
|
|
10
10
|
res: WorkerResponse;
|
|
11
11
|
req: Request;
|
|
12
12
|
logger: Logger;
|
|
13
|
+
reporter: Reporter;
|
|
13
14
|
metrics: Metrics;
|
|
14
15
|
}
|
|
15
16
|
export declare const base: (context: WorkerServerContext) => HookContext;
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RequestHandler } from 'http-proxy-middleware';
|
|
3
|
+
import { ProxyDetail, BffProxyOptions } from '@modern-js/types';
|
|
4
|
+
import type { ModernServerHandler } from '../type';
|
|
2
5
|
export type { BffProxyOptions };
|
|
3
6
|
export declare function formatProxyOptions(proxyOptions: BffProxyOptions): ProxyDetail[];
|
|
4
|
-
export
|
|
7
|
+
export type HttpUpgradeHandler = NonNullable<RequestHandler['upgrade']>;
|
|
8
|
+
export declare const createProxyHandler: (proxyOptions?: BffProxyOptions) => {
|
|
9
|
+
handlers: ModernServerHandler[];
|
|
10
|
+
handleUpgrade: (req: import("http-proxy-middleware/dist/types").Request, socket: import("net").Socket, head: any) => void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ServerTiming as IServerTiming } from '@modern-js/types';
|
|
2
|
+
interface Res {
|
|
3
|
+
getHeader: (name: string) => number | string | string[] | undefined;
|
|
4
|
+
setHeader: (name: string, value: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class ServerTiming implements IServerTiming {
|
|
7
|
+
meta: string;
|
|
8
|
+
res: Res;
|
|
9
|
+
constructor(res: Res, meta: string);
|
|
10
|
+
addServeTiming(name: string, dur: number, desc?: string): this;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
import { IncomingMessage, ServerResponse, Server } from 'http';
|
|
4
4
|
import { Adapter, WebAdapter, APIServerStartInput, ServerOptions } from '@modern-js/server-core';
|
|
5
|
-
import type
|
|
5
|
+
import { type ModernServerContext, type ServerRoute } from '@modern-js/types';
|
|
6
6
|
import type { ContextOptions } from '../libs/context';
|
|
7
7
|
import { ModernServerOptions, NextFunction, ServerHookRunner, Metrics, Logger, ModernServerInterface, BuildOptions, ModernServerHandler } from '../type';
|
|
8
8
|
import { RouteMatchManager, ModernRouteInterface, ModernRoute } from '../libs/route';
|
|
@@ -30,7 +30,6 @@ export declare class ModernServer implements ModernServerInterface {
|
|
|
30
30
|
private loaderHandler;
|
|
31
31
|
private frameWebHandler;
|
|
32
32
|
private frameAPIHandler;
|
|
33
|
-
private proxyHandler;
|
|
34
33
|
private _handler;
|
|
35
34
|
constructor({
|
|
36
35
|
pwd,
|
package/dist/types/type.d.ts
CHANGED
package/dist/types/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node/http" />
|
|
3
|
-
/// <reference types=".dts-temp/
|
|
3
|
+
/// <reference types=".dts-temp/9d9muATSMGvby0DR5Il3_/src/type" />
|
|
4
4
|
import { IncomingMessage } from 'http';
|
|
5
5
|
import type { OutputNormalizedConfig, HtmlNormalizedConfig } from '@modern-js/server-core';
|
|
6
6
|
export declare const debug: any;
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.
|
|
18
|
+
"version": "2.30.0",
|
|
19
19
|
"jsnext:source": "./src/index.ts",
|
|
20
20
|
"types": "./dist/types/index.d.ts",
|
|
21
21
|
"main": "./dist/cjs/index.js",
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
"path-to-regexp": "^6.2.0",
|
|
74
74
|
"serve-static": "^1.14.1",
|
|
75
75
|
"@swc/helpers": "0.5.1",
|
|
76
|
-
"@modern-js/utils": "2.
|
|
77
|
-
"@modern-js/server-core": "2.
|
|
78
|
-
"@modern-js/plugin": "2.
|
|
76
|
+
"@modern-js/utils": "2.30.0",
|
|
77
|
+
"@modern-js/server-core": "2.30.0",
|
|
78
|
+
"@modern-js/plugin": "2.30.0"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@types/cookie": "^0.4.1",
|
|
@@ -92,10 +92,12 @@
|
|
|
92
92
|
"portfinder": "^1.0.28",
|
|
93
93
|
"typescript": "^5",
|
|
94
94
|
"memfs": "^3.5.1",
|
|
95
|
-
"
|
|
96
|
-
"@
|
|
97
|
-
"@
|
|
98
|
-
"@
|
|
95
|
+
"ws": "^8.13.0",
|
|
96
|
+
"@types/ws": "^8.5.5",
|
|
97
|
+
"@modern-js/types": "2.30.0",
|
|
98
|
+
"@modern-js/server-core": "2.30.0",
|
|
99
|
+
"@scripts/build": "2.30.0",
|
|
100
|
+
"@scripts/jest-config": "2.30.0"
|
|
99
101
|
},
|
|
100
102
|
"sideEffects": false,
|
|
101
103
|
"publishConfig": {
|