@modern-js/prod-server 2.31.2 → 2.32.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 +30 -0
- package/LICENSE +1 -1
- package/dist/cjs/constants.js +10 -0
- package/dist/cjs/libs/context/context.js +7 -2
- package/dist/cjs/libs/preload/flushServerHeader.js +67 -0
- package/dist/cjs/libs/preload/index.js +7 -0
- package/dist/cjs/libs/preload/parseLinks.js +100 -0
- package/dist/cjs/libs/preload/transformLinks2String.js +113 -0
- package/dist/cjs/libs/proxy.js +44 -41
- package/dist/cjs/libs/render/index.js +16 -2
- package/dist/cjs/libs/serverTiming.js +1 -1
- package/dist/cjs/server/modernServer.js +21 -16
- package/dist/esm/constants.js +7 -0
- package/dist/esm/libs/context/context.js +5 -2
- package/dist/esm/libs/preload/flushServerHeader.js +70 -0
- package/dist/esm/libs/preload/index.js +2 -0
- package/dist/esm/libs/preload/parseLinks.js +170 -0
- package/dist/esm/libs/preload/transformLinks2String.js +118 -0
- package/dist/esm/libs/proxy.js +88 -50
- package/dist/esm/libs/render/index.js +17 -3
- package/dist/esm/libs/serverTiming.js +1 -1
- package/dist/esm/server/modernServer.js +22 -17
- package/dist/esm-node/constants.js +7 -0
- package/dist/esm-node/libs/context/context.js +7 -2
- package/dist/esm-node/libs/preload/flushServerHeader.js +45 -0
- package/dist/esm-node/libs/preload/index.js +2 -0
- package/dist/esm-node/libs/preload/parseLinks.js +88 -0
- package/dist/esm-node/libs/preload/transformLinks2String.js +103 -0
- package/dist/esm-node/libs/proxy.js +44 -41
- package/dist/esm-node/libs/render/index.js +16 -2
- package/dist/esm-node/libs/serverTiming.js +1 -1
- package/dist/esm-node/server/modernServer.js +22 -17
- package/dist/types/constants.d.ts +7 -1
- package/dist/types/libs/context/context.d.ts +1 -1
- package/dist/types/libs/preload/flushServerHeader.d.ts +20 -0
- package/dist/types/libs/preload/index.d.ts +2 -0
- package/dist/types/libs/preload/parseLinks.d.ts +14 -0
- package/dist/types/libs/preload/transformLinks2String.d.ts +3 -0
- package/dist/types/libs/proxy.d.ts +3 -3
- package/dist/types/libs/render/index.d.ts +2 -0
- package/dist/types/libs/serverTiming.d.ts +1 -0
- package/dist/types/type.d.ts +3 -0
- package/dist/types/utils.d.ts +1 -1
- package/package.json +18 -17
|
@@ -10,23 +10,25 @@ import { createErrorDocument, createMiddlewareCollecter, getStaticReg, mergeExte
|
|
|
10
10
|
import * as reader from "../libs/render/reader";
|
|
11
11
|
import { createProxyHandler } from "../libs/proxy";
|
|
12
12
|
import { createContext } from "../libs/context";
|
|
13
|
-
import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE } from "../constants";
|
|
13
|
+
import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE, ServerReportTimings } from "../constants";
|
|
14
14
|
import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
|
|
15
15
|
const SERVER_DIR = "./server";
|
|
16
16
|
export class ModernServer {
|
|
17
17
|
// server prepare
|
|
18
18
|
async onInit(runner, app) {
|
|
19
|
-
var _conf_bff, _app,
|
|
19
|
+
var _conf_bff, _app, _this_conf_output;
|
|
20
20
|
this.runner = runner;
|
|
21
21
|
const { distDir, conf } = this;
|
|
22
22
|
this.initReader();
|
|
23
23
|
debug("final server conf", this.conf);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
if ((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy) {
|
|
25
|
+
const { handlers, handleUpgrade } = createProxyHandler(conf.bff.proxy);
|
|
26
|
+
app && handleUpgrade(app);
|
|
27
|
+
handlers.forEach((handler) => {
|
|
28
|
+
this.addHandler(handler);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
(_app = app) === null || _app === void 0 ? void 0 : _app.on("close", () => {
|
|
30
32
|
this.reader.close();
|
|
31
33
|
});
|
|
32
34
|
const usageRoutes = this.filterRoutes(this.getRoutes());
|
|
@@ -50,6 +52,7 @@ export class ModernServer {
|
|
|
50
52
|
distDir,
|
|
51
53
|
staticGenerate,
|
|
52
54
|
forceCSR,
|
|
55
|
+
conf: this.conf,
|
|
53
56
|
nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
|
|
54
57
|
metaName
|
|
55
58
|
});
|
|
@@ -244,7 +247,7 @@ export class ModernServer {
|
|
|
244
247
|
if (this.isSend(res)) {
|
|
245
248
|
return null;
|
|
246
249
|
}
|
|
247
|
-
res.
|
|
250
|
+
res.set("content-type", renderResult.contentType);
|
|
248
251
|
return renderResult;
|
|
249
252
|
}
|
|
250
253
|
async proxy() {
|
|
@@ -279,7 +282,7 @@ export class ModernServer {
|
|
|
279
282
|
const end = time();
|
|
280
283
|
res.on("finish", () => {
|
|
281
284
|
const cost = end();
|
|
282
|
-
reporter.reportTiming(
|
|
285
|
+
reporter.reportTiming(ServerReportTimings.SERVER_HANDLE_REQUEST, cost);
|
|
283
286
|
});
|
|
284
287
|
let route = matched.generate(context.url);
|
|
285
288
|
if (route.isApi) {
|
|
@@ -294,7 +297,7 @@ export class ModernServer {
|
|
|
294
297
|
onLast: noop
|
|
295
298
|
});
|
|
296
299
|
const cost = end2();
|
|
297
|
-
reporter.reportTiming(
|
|
300
|
+
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
|
|
298
301
|
}
|
|
299
302
|
if (this.isSend(res)) {
|
|
300
303
|
return;
|
|
@@ -319,7 +322,7 @@ export class ModernServer {
|
|
|
319
322
|
const end2 = time();
|
|
320
323
|
await this.frameWebHandler(middlewareContext);
|
|
321
324
|
const cost = end2();
|
|
322
|
-
reporter.reportTiming(
|
|
325
|
+
cost && reporter.reportTiming(ServerReportTimings.SERVER_MIDDLEWARE, cost);
|
|
323
326
|
res.locals = {
|
|
324
327
|
...res.locals,
|
|
325
328
|
...middlewareContext.response.locals
|
|
@@ -346,7 +349,7 @@ export class ModernServer {
|
|
|
346
349
|
onLast: noop
|
|
347
350
|
});
|
|
348
351
|
const cost = end2();
|
|
349
|
-
reporter.reportTiming(
|
|
352
|
+
cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
|
|
350
353
|
}
|
|
351
354
|
if (this.isSend(res)) {
|
|
352
355
|
return;
|
|
@@ -356,7 +359,7 @@ export class ModernServer {
|
|
|
356
359
|
res.end(response);
|
|
357
360
|
}
|
|
358
361
|
isSend(res) {
|
|
359
|
-
if (res.
|
|
362
|
+
if (res.writableEnded) {
|
|
360
363
|
return true;
|
|
361
364
|
}
|
|
362
365
|
if (res.getHeader("Location") && isRedirect(res.statusCode)) {
|
|
@@ -408,7 +411,9 @@ export class ModernServer {
|
|
|
408
411
|
req.metrics = req.metrics || this.metrics;
|
|
409
412
|
let context;
|
|
410
413
|
try {
|
|
411
|
-
context = this.createContext(req, res
|
|
414
|
+
context = this.createContext(req, res, {
|
|
415
|
+
metaName: this.metaName
|
|
416
|
+
});
|
|
412
417
|
} catch (e) {
|
|
413
418
|
this.logger.error(e);
|
|
414
419
|
res.statusCode = 500;
|
|
@@ -422,7 +427,7 @@ export class ModernServer {
|
|
|
422
427
|
}
|
|
423
428
|
}
|
|
424
429
|
redirect(res, url, status = 302) {
|
|
425
|
-
res.
|
|
430
|
+
res.set("Location", url);
|
|
426
431
|
res.statusCode = status;
|
|
427
432
|
res.end();
|
|
428
433
|
}
|
|
@@ -433,7 +438,7 @@ export class ModernServer {
|
|
|
433
438
|
async renderErrorPage(context, status) {
|
|
434
439
|
const { res } = context;
|
|
435
440
|
context.status = status;
|
|
436
|
-
res.
|
|
441
|
+
res.set("content-type", mime.contentType("html"));
|
|
437
442
|
const statusPage = `/${status}`;
|
|
438
443
|
const customErrorPage = `/_error`;
|
|
439
444
|
const matched = this.router.match(statusPage) || this.router.match(customErrorPage);
|
|
@@ -21,4 +21,10 @@ export declare const ERROR_PAGE_TEXT: Record<number, string>;
|
|
|
21
21
|
export declare const RUN_MODE: {
|
|
22
22
|
FULL: string;
|
|
23
23
|
TYPE: string;
|
|
24
|
-
};
|
|
24
|
+
};
|
|
25
|
+
export declare enum ServerReportTimings {
|
|
26
|
+
SERVER_HANDLE_REQUEST = "server-handle-request",
|
|
27
|
+
SERVER_MIDDLEWARE = "server-middleware",
|
|
28
|
+
SERVER_HOOK_AFTER_RENDER = "server-hook-after-render",
|
|
29
|
+
SERVER_HOOK_AFTER_MATCH = "server-hook-after-match",
|
|
30
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
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/h7cQDPEdPmsas3bCMYw2w/src/type" />
|
|
6
6
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
7
7
|
import qs from 'querystring';
|
|
8
8
|
import type { ModernServerContext as ModernServerContextInterface, Reporter as ModernServerReporter, ServerTiming as ModernServerTiming } from '@modern-js/types';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { OutgoingHttpHeaders } from 'http';
|
|
3
|
+
import { ServerOptions } from '@modern-js/server-core';
|
|
4
|
+
import { ModernServerContext } from '@modern-js/types';
|
|
5
|
+
export declare function transformToRegExp(input: string | RegExp): RegExp;
|
|
6
|
+
export declare function shouldFlushServerHeader(serverConf: ServerOptions['server'], userAgent?: string, disablePreload?: boolean): boolean;
|
|
7
|
+
export interface FlushServerHeaderOptions {
|
|
8
|
+
ctx: ModernServerContext;
|
|
9
|
+
distDir: string;
|
|
10
|
+
template: string;
|
|
11
|
+
serverConf: ServerOptions['server'];
|
|
12
|
+
headers?: OutgoingHttpHeaders;
|
|
13
|
+
}
|
|
14
|
+
export declare function flushServerHeader({
|
|
15
|
+
serverConf,
|
|
16
|
+
ctx,
|
|
17
|
+
distDir,
|
|
18
|
+
template,
|
|
19
|
+
headers
|
|
20
|
+
}: FlushServerHeaderOptions): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Link {
|
|
2
|
+
uri: string;
|
|
3
|
+
as?: 'script' | 'style' | 'image' | 'video' | 'font' | string;
|
|
4
|
+
}
|
|
5
|
+
export interface ParseLinksOptions {
|
|
6
|
+
distDir: string;
|
|
7
|
+
pathname: string;
|
|
8
|
+
template: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseLinks({
|
|
11
|
+
pathname,
|
|
12
|
+
distDir,
|
|
13
|
+
template
|
|
14
|
+
}: ParseLinksOptions): Promise<Link[]>;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import http from 'http';
|
|
2
2
|
import { RequestHandler } from 'http-proxy-middleware';
|
|
3
3
|
import { ProxyDetail, BffProxyOptions } from '@modern-js/types';
|
|
4
4
|
import type { ModernServerHandler } from '../type';
|
|
5
5
|
export type { BffProxyOptions };
|
|
6
6
|
export declare function formatProxyOptions(proxyOptions: BffProxyOptions): ProxyDetail[];
|
|
7
7
|
export type HttpUpgradeHandler = NonNullable<RequestHandler['upgrade']>;
|
|
8
|
-
export declare const createProxyHandler: (proxyOptions
|
|
8
|
+
export declare const createProxyHandler: (proxyOptions: BffProxyOptions) => {
|
|
9
9
|
handlers: ModernServerHandler[];
|
|
10
|
-
handleUpgrade: (
|
|
10
|
+
handleUpgrade: (server: http.Server) => void;
|
|
11
11
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ModernServerContext } from '@modern-js/types';
|
|
2
|
+
import { ServerOptions } from '@modern-js/server-core';
|
|
2
3
|
import { RenderResult, ServerHookRunner } from '../../type';
|
|
3
4
|
import { ModernRoute } from '../route';
|
|
4
5
|
import * as ssr from './ssr';
|
|
@@ -10,6 +11,7 @@ export type RenderHandler = (options: {
|
|
|
10
11
|
type CreateRenderHandler = (ctx: {
|
|
11
12
|
distDir: string;
|
|
12
13
|
staticGenerate: boolean;
|
|
14
|
+
conf: ServerOptions;
|
|
13
15
|
ssrRender?: typeof ssr.render;
|
|
14
16
|
forceCSR?: boolean;
|
|
15
17
|
nonce?: string;
|
|
@@ -2,6 +2,7 @@ import { ServerTiming as IServerTiming } from '@modern-js/types';
|
|
|
2
2
|
interface Res {
|
|
3
3
|
getHeader: (name: string) => number | string | string[] | undefined;
|
|
4
4
|
setHeader: (name: string, value: string) => void;
|
|
5
|
+
set: (name: string, value: any) => this;
|
|
5
6
|
}
|
|
6
7
|
export declare class ServerTiming implements IServerTiming {
|
|
7
8
|
meta: string;
|
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/h7cQDPEdPmsas3bCMYw2w/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,37 +15,37 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.
|
|
18
|
+
"version": "2.32.0",
|
|
19
19
|
"jsnext:source": "./src/index.ts",
|
|
20
20
|
"types": "./dist/types/index.d.ts",
|
|
21
21
|
"main": "./dist/cjs/index.js",
|
|
22
22
|
"module": "./dist/esm/index.js",
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
|
+
"types": "./dist/types/index.d.ts",
|
|
25
26
|
"node": {
|
|
26
27
|
"jsnext:source": "./src/index.ts",
|
|
27
28
|
"import": "./dist/esm-node/index.js",
|
|
28
29
|
"require": "./dist/cjs/index.js"
|
|
29
30
|
},
|
|
30
|
-
"types": "./dist/types/index.d.ts",
|
|
31
31
|
"default": "./dist/esm/index.js"
|
|
32
32
|
},
|
|
33
33
|
"./worker": {
|
|
34
|
+
"types": "./dist/types/workerServer.d.ts",
|
|
34
35
|
"node": {
|
|
35
36
|
"jsnext:source": "./src/workerServer.ts",
|
|
36
37
|
"import": "./dist/esm-node/workerServer.js",
|
|
37
38
|
"require": "./dist/cjs/workerServer.js"
|
|
38
39
|
},
|
|
39
|
-
"types": "./dist/types/workerServer.d.ts",
|
|
40
40
|
"default": "./dist/esm/workerServer.js"
|
|
41
41
|
},
|
|
42
42
|
"./renderHtml": {
|
|
43
|
+
"types": "./dist/types/renderHtml.d.ts",
|
|
43
44
|
"node": {
|
|
44
45
|
"jsnext:source": "./src/renderHtml.ts",
|
|
45
46
|
"import": "./dist/esm-node/renderHtml.js",
|
|
46
47
|
"require": "./dist/cjs/renderHtml.js"
|
|
47
48
|
},
|
|
48
|
-
"types": "./dist/types/renderHtml.d.ts",
|
|
49
49
|
"default": "./dist/esm/renderHtml.js"
|
|
50
50
|
}
|
|
51
51
|
},
|
|
@@ -63,41 +63,42 @@
|
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
+
"@swc/helpers": "0.5.1",
|
|
67
|
+
"cookie": "^0.4.2",
|
|
66
68
|
"etag": "^1.8.1",
|
|
67
69
|
"fresh": "^0.5.2",
|
|
68
|
-
"cookie": "^0.4.2",
|
|
69
70
|
"http-proxy-middleware": "^2.0.1",
|
|
70
71
|
"ignore-styles": "^5.0.1",
|
|
71
72
|
"lru-cache": "^6.0.0",
|
|
72
73
|
"merge-deep": "^3.0.3",
|
|
74
|
+
"node-html-parser": "^6.1.5",
|
|
73
75
|
"path-to-regexp": "^6.2.0",
|
|
74
76
|
"serve-static": "^1.14.1",
|
|
75
|
-
"@
|
|
76
|
-
"@modern-js/
|
|
77
|
-
"@modern-js/
|
|
78
|
-
"@modern-js/plugin": "2.31.2"
|
|
77
|
+
"@modern-js/plugin": "2.32.0",
|
|
78
|
+
"@modern-js/server-core": "2.32.0",
|
|
79
|
+
"@modern-js/utils": "2.32.0"
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
82
|
"@types/cookie": "^0.4.1",
|
|
83
|
+
"@types/etag": "^1.8.1",
|
|
84
|
+
"@types/fresh": "^0.5.0",
|
|
82
85
|
"@types/jest": "^29",
|
|
83
86
|
"@types/lru-cache": "^5.1.1",
|
|
84
87
|
"@types/merge-deep": "^3.0.0",
|
|
85
88
|
"@types/node": "^14",
|
|
86
|
-
"@types/etag": "^1.8.1",
|
|
87
|
-
"@types/fresh": "^0.5.0",
|
|
88
89
|
"@types/serve-static": "^1.13.10",
|
|
90
|
+
"@types/ws": "^8.5.5",
|
|
89
91
|
"axios": "^1.2.1",
|
|
90
92
|
"jest": "^29",
|
|
93
|
+
"memfs": "^3.5.1",
|
|
91
94
|
"node-mocks-http": "^1.11.0",
|
|
92
95
|
"portfinder": "^1.0.28",
|
|
93
96
|
"typescript": "^5",
|
|
94
|
-
"memfs": "^3.5.1",
|
|
95
97
|
"ws": "^8.13.0",
|
|
96
|
-
"@
|
|
97
|
-
"@modern-js/types": "2.
|
|
98
|
-
"@
|
|
99
|
-
"@scripts/jest-config": "2.
|
|
100
|
-
"@scripts/build": "2.31.1"
|
|
98
|
+
"@modern-js/server-core": "2.32.0",
|
|
99
|
+
"@modern-js/types": "2.32.0",
|
|
100
|
+
"@scripts/build": "2.32.0",
|
|
101
|
+
"@scripts/jest-config": "2.32.0"
|
|
101
102
|
},
|
|
102
103
|
"sideEffects": false,
|
|
103
104
|
"publishConfig": {
|