@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/cjs/libs/context/context.js +16 -6
  3. package/dist/cjs/libs/hook-api/index.js +2 -1
  4. package/dist/cjs/libs/hook-api/index.worker.js +2 -1
  5. package/dist/cjs/libs/proxy.js +29 -11
  6. package/dist/cjs/libs/render/ssr.js +3 -20
  7. package/dist/cjs/libs/reporter.js +22 -0
  8. package/dist/cjs/libs/serverTiming.js +27 -0
  9. package/dist/cjs/server/index.js +14 -0
  10. package/dist/cjs/server/modernServer.js +27 -9
  11. package/dist/cjs/workerServer.js +12 -3
  12. package/dist/esm/libs/context/context.js +14 -4
  13. package/dist/esm/libs/hook-api/index.js +2 -1
  14. package/dist/esm/libs/hook-api/index.worker.js +2 -1
  15. package/dist/esm/libs/proxy.js +80 -32
  16. package/dist/esm/libs/render/ssr.js +6 -30
  17. package/dist/esm/libs/reporter.js +12 -0
  18. package/dist/esm/libs/serverTiming.js +27 -0
  19. package/dist/esm/server/index.js +22 -2
  20. package/dist/esm/server/modernServer.js +56 -33
  21. package/dist/esm/workerServer.js +13 -4
  22. package/dist/esm-node/libs/context/context.js +14 -4
  23. package/dist/esm-node/libs/hook-api/index.js +2 -1
  24. package/dist/esm-node/libs/hook-api/index.worker.js +2 -1
  25. package/dist/esm-node/libs/proxy.js +29 -11
  26. package/dist/esm-node/libs/render/ssr.js +3 -20
  27. package/dist/esm-node/libs/reporter.js +12 -0
  28. package/dist/esm-node/libs/serverTiming.js +17 -0
  29. package/dist/esm-node/server/index.js +14 -0
  30. package/dist/esm-node/server/modernServer.js +27 -9
  31. package/dist/esm-node/workerServer.js +12 -3
  32. package/dist/types/libs/context/context.d.ts +5 -2
  33. package/dist/types/libs/hook-api/index.worker.d.ts +2 -1
  34. package/dist/types/libs/proxy.d.ts +9 -2
  35. package/dist/types/libs/reporter.d.ts +2 -0
  36. package/dist/types/libs/serverTiming.d.ts +12 -0
  37. package/dist/types/server/modernServer.d.ts +1 -2
  38. package/dist/types/type.d.ts +1 -0
  39. package/dist/types/utils.d.ts +1 -1
  40. 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
- this.proxyHandler = createProxyHandler((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy);
24
- if (this.proxyHandler) {
25
- this.proxyHandler.forEach((handler) => {
26
- this.addHandler(handler);
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 hookContext = createWorkerHookContext(request.url, logger, metrics);
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/3ag51RGwEKkAOCZCey_Qe/src/type" />
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
- import { ProxyDetail, NextFunction, BffProxyOptions, ModernServerContext } from '@modern-js/types';
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 declare const createProxyHandler: (proxyOptions?: BffProxyOptions) => ((ctx: ModernServerContext, next: NextFunction) => Promise<void>)[] | null;
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,2 @@
1
+ import { Reporter } from '@modern-js/types/server';
2
+ export declare const defaultReporter: Reporter;
@@ -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 { ModernServerContext, ServerRoute } from '@modern-js/types';
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,
@@ -11,6 +11,7 @@ declare module 'http' {
11
11
  interface IncomingMessage {
12
12
  logger: Logger;
13
13
  metrics: Metrics;
14
+ body?: any;
14
15
  }
15
16
  }
16
17
  export type ModernServerOptions = {
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node/http" />
3
- /// <reference types=".dts-temp/3ag51RGwEKkAOCZCey_Qe/src/type" />
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.28.0",
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.28.0",
77
- "@modern-js/server-core": "2.28.0",
78
- "@modern-js/plugin": "2.28.0"
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
- "@modern-js/types": "2.28.0",
96
- "@modern-js/server-core": "2.28.0",
97
- "@scripts/build": "2.28.0",
98
- "@scripts/jest-config": "2.28.0"
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": {