@modern-js/prod-server 2.31.2 → 2.32.1

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 (46) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +1 -1
  3. package/dist/cjs/constants.js +10 -0
  4. package/dist/cjs/libs/context/context.js +7 -2
  5. package/dist/cjs/libs/preload/flushServerHeader.js +67 -0
  6. package/dist/cjs/libs/preload/index.js +7 -0
  7. package/dist/cjs/libs/preload/parseLinks.js +100 -0
  8. package/dist/cjs/libs/preload/transformLinks2String.js +113 -0
  9. package/dist/cjs/libs/proxy.js +44 -41
  10. package/dist/cjs/libs/render/index.js +16 -2
  11. package/dist/cjs/libs/serverTiming.js +1 -1
  12. package/dist/cjs/server/modernServer.js +21 -16
  13. package/dist/esm/constants.js +7 -0
  14. package/dist/esm/libs/context/context.js +5 -2
  15. package/dist/esm/libs/preload/flushServerHeader.js +70 -0
  16. package/dist/esm/libs/preload/index.js +2 -0
  17. package/dist/esm/libs/preload/parseLinks.js +170 -0
  18. package/dist/esm/libs/preload/transformLinks2String.js +118 -0
  19. package/dist/esm/libs/proxy.js +88 -50
  20. package/dist/esm/libs/render/index.js +17 -3
  21. package/dist/esm/libs/serverTiming.js +1 -1
  22. package/dist/esm/renderHtml.js +6 -6
  23. package/dist/esm/server/modernServer.js +22 -17
  24. package/dist/esm/server/modernServerSplit.js +6 -6
  25. package/dist/esm-node/constants.js +7 -0
  26. package/dist/esm-node/libs/context/context.js +7 -2
  27. package/dist/esm-node/libs/preload/flushServerHeader.js +45 -0
  28. package/dist/esm-node/libs/preload/index.js +2 -0
  29. package/dist/esm-node/libs/preload/parseLinks.js +88 -0
  30. package/dist/esm-node/libs/preload/transformLinks2String.js +103 -0
  31. package/dist/esm-node/libs/proxy.js +44 -41
  32. package/dist/esm-node/libs/render/index.js +16 -2
  33. package/dist/esm-node/libs/serverTiming.js +1 -1
  34. package/dist/esm-node/server/modernServer.js +22 -17
  35. package/dist/types/constants.d.ts +7 -1
  36. package/dist/types/libs/context/context.d.ts +1 -1
  37. package/dist/types/libs/preload/flushServerHeader.d.ts +20 -0
  38. package/dist/types/libs/preload/index.d.ts +2 -0
  39. package/dist/types/libs/preload/parseLinks.d.ts +14 -0
  40. package/dist/types/libs/preload/transformLinks2String.d.ts +3 -0
  41. package/dist/types/libs/proxy.d.ts +3 -3
  42. package/dist/types/libs/render/index.d.ts +2 -0
  43. package/dist/types/libs/serverTiming.d.ts +1 -0
  44. package/dist/types/type.d.ts +3 -0
  45. package/dist/types/utils.d.ts +1 -1
  46. package/package.json +18 -17
@@ -27,8 +27,8 @@ export var ModernServerContext = /* @__PURE__ */ function() {
27
27
  this.req = req;
28
28
  this.res = res;
29
29
  this.options = options || {};
30
- this.serverTiming = new ServerTiming(res, cutNameByHyphen(((_options = options) === null || _options === void 0 ? void 0 : _options.metaName) || "modern-js"));
31
30
  this.bind();
31
+ this.serverTiming = new ServerTiming(this.res, cutNameByHyphen(((_options = options) === null || _options === void 0 ? void 0 : _options.metaName) || "modern-js"));
32
32
  }
33
33
  _create_class(ModernServerContext2, [
34
34
  {
@@ -63,7 +63,10 @@ export var ModernServerContext = /* @__PURE__ */ function() {
63
63
  return _this.getReqHeader(key);
64
64
  };
65
65
  res.set = function(key, value) {
66
- return _this.res.setHeader(key, value);
66
+ if (!res.headersSent) {
67
+ res.setHeader(key, value);
68
+ }
69
+ return res;
67
70
  };
68
71
  res.send = function(body) {
69
72
  _this.send(body);
@@ -0,0 +1,70 @@
1
+ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
+ import { parseLinks } from "./parseLinks";
4
+ import { transformLinks2String } from "./transformLinks2String";
5
+ export function transformToRegExp(input) {
6
+ if (typeof input === "string") {
7
+ return new RegExp(input);
8
+ }
9
+ return input;
10
+ }
11
+ export function shouldFlushServerHeader(serverConf, userAgent, disablePreload) {
12
+ var _ref = serverConf || {}, ssrConf = _ref.ssr;
13
+ if (disablePreload) {
14
+ return false;
15
+ }
16
+ if (typeof ssrConf === "object" && ssrConf.preload) {
17
+ if (typeof ssrConf.preload === "object") {
18
+ var userAgentFilter = ssrConf.preload.userAgentFilter;
19
+ if (userAgentFilter && userAgent) {
20
+ return !transformToRegExp(userAgentFilter).test(userAgent);
21
+ }
22
+ return true;
23
+ }
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ export function flushServerHeader(_) {
29
+ return _flushServerHeader.apply(this, arguments);
30
+ }
31
+ function _flushServerHeader() {
32
+ _flushServerHeader = _async_to_generator(function(param) {
33
+ var serverConf, ctx, distDir, template, headers, _ref, ssrConf, res, links, link, key, _headers, value;
34
+ return _ts_generator(this, function(_state) {
35
+ switch (_state.label) {
36
+ case 0:
37
+ serverConf = param.serverConf, ctx = param.ctx, distDir = param.distDir, template = param.template, headers = param.headers;
38
+ _ref = serverConf || {}, ssrConf = _ref.ssr;
39
+ if (typeof ssrConf !== "object") {
40
+ return [
41
+ 2
42
+ ];
43
+ }
44
+ res = ctx.res;
45
+ return [
46
+ 4,
47
+ parseLinks({
48
+ template: template,
49
+ distDir: distDir,
50
+ pathname: ctx.path
51
+ })
52
+ ];
53
+ case 1:
54
+ links = _state.sent();
55
+ link = transformLinks2String(links, ssrConf.preload);
56
+ res.set("link", link);
57
+ for (var key2 in headers || {}) {
58
+ ;
59
+ value = (_headers = headers) === null || _headers === void 0 ? void 0 : _headers[key2];
60
+ value && res.set(key2, value);
61
+ }
62
+ res.flushHeaders();
63
+ return [
64
+ 2
65
+ ];
66
+ }
67
+ });
68
+ });
69
+ return _flushServerHeader.apply(this, arguments);
70
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./parseLinks";
2
+ export * from "./flushServerHeader";
@@ -0,0 +1,170 @@
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 path from "path";
5
+ import { NESTED_ROUTE_SPEC_FILE, ROUTE_MANIFEST_FILE, ROUTE_SPEC_FILE, fs } from "@modern-js/utils";
6
+ import { parse as htmlParse } from "node-html-parser";
7
+ import { matchRoutes } from "@modern-js/utils/runtime/remix-router";
8
+ import { matchEntry } from "@modern-js/utils/runtime-node";
9
+ export function parseLinks(_) {
10
+ return _parseLinks.apply(this, arguments);
11
+ }
12
+ function _parseLinks() {
13
+ _parseLinks = _async_to_generator(function(param) {
14
+ var pathname, distDir, template, links;
15
+ return _ts_generator(this, function(_state) {
16
+ switch (_state.label) {
17
+ case 0:
18
+ pathname = param.pathname, distDir = param.distDir, template = param.template;
19
+ return [
20
+ 4,
21
+ parseLinksFromRoutes(pathname, distDir)
22
+ ];
23
+ case 1:
24
+ links = _state.sent();
25
+ return [
26
+ 2,
27
+ links.length > 0 ? links : parseLinksFromHtml(template)
28
+ ];
29
+ }
30
+ });
31
+ });
32
+ return _parseLinks.apply(this, arguments);
33
+ }
34
+ function parseLinksFromHtml(html) {
35
+ var root = htmlParse(html);
36
+ var scripts = root.querySelectorAll("script").filter(function(elem) {
37
+ return Boolean(elem.getAttribute("src"));
38
+ });
39
+ var css = root.querySelectorAll("link").filter(function(elem) {
40
+ var href = elem.getAttribute("href");
41
+ var rel = elem.getAttribute("rel");
42
+ return href && rel === "stylesheet";
43
+ });
44
+ var images = root.querySelectorAll("img").filter(function(elem) {
45
+ return Boolean(elem.getAttribute("src"));
46
+ });
47
+ return scripts.map(function(elem) {
48
+ var src = elem.getAttribute("src");
49
+ return {
50
+ uri: src,
51
+ as: "script"
52
+ };
53
+ }).concat(css.map(function(elem) {
54
+ var href = elem.getAttribute("href");
55
+ return {
56
+ uri: href,
57
+ as: "style"
58
+ };
59
+ })).concat(images.map(function(elem) {
60
+ var src = elem.getAttribute("src");
61
+ return {
62
+ uri: src,
63
+ as: "image"
64
+ };
65
+ }));
66
+ }
67
+ function parseLinksFromRoutes(pathname, distDir) {
68
+ return _parseLinksFromRoutes.apply(this, arguments);
69
+ }
70
+ function _parseLinksFromRoutes() {
71
+ _parseLinksFromRoutes = _async_to_generator(function(pathname, distDir) {
72
+ var noopLinks, nestedRoutesSpec, routesJsonPath, routeManifestPath, routesJson, serverRoutes, entry, _routeAssets_entryName, _matches, _assets_filter, _assets, _assets_filter1, _assets1, routes, entryName, entryRoutes, routesManifest, routeAssets, matches, entryAssets, assets, cssLinks, scriptLinks;
73
+ return _ts_generator(this, function(_state) {
74
+ switch (_state.label) {
75
+ case 0:
76
+ noopLinks = [];
77
+ nestedRoutesSpec = path.join(distDir, NESTED_ROUTE_SPEC_FILE);
78
+ routesJsonPath = path.join(distDir, ROUTE_SPEC_FILE);
79
+ routeManifestPath = path.join(distDir, ROUTE_MANIFEST_FILE);
80
+ if (!fs.existsSync(nestedRoutesSpec) || !fs.existsSync(routesJsonPath) || !fs.existsSync(routeManifestPath)) {
81
+ return [
82
+ 2,
83
+ noopLinks
84
+ ];
85
+ }
86
+ return [
87
+ 4,
88
+ import(routesJsonPath)
89
+ ];
90
+ case 1:
91
+ routesJson = _state.sent();
92
+ serverRoutes = routesJson.routes;
93
+ entry = matchEntry(pathname, serverRoutes);
94
+ if (!entry)
95
+ return [
96
+ 3,
97
+ 4
98
+ ];
99
+ return [
100
+ 4,
101
+ import(nestedRoutesSpec)
102
+ ];
103
+ case 2:
104
+ routes = _state.sent();
105
+ entryName = entry.entryName;
106
+ if (!entryName) {
107
+ return [
108
+ 2,
109
+ noopLinks
110
+ ];
111
+ }
112
+ entryRoutes = routes[entryName];
113
+ if (!entryRoutes) {
114
+ return [
115
+ 2,
116
+ noopLinks
117
+ ];
118
+ }
119
+ return [
120
+ 4,
121
+ import(routeManifestPath)
122
+ ];
123
+ case 3:
124
+ routesManifest = _state.sent();
125
+ routeAssets = routesManifest.routeAssets;
126
+ matches = matchRoutes(entryRoutes, pathname, entry.urlPath);
127
+ entryAssets = (_routeAssets_entryName = routeAssets[entryName]) === null || _routeAssets_entryName === void 0 ? void 0 : _routeAssets_entryName.assets;
128
+ assets = (_matches = matches) === null || _matches === void 0 ? void 0 : _matches.reduce(function(acc, match) {
129
+ var routeId = match.route.id;
130
+ if (routeId) {
131
+ var _matchedManifest;
132
+ var matchedManifest = routeAssets[routeId];
133
+ var assets2 = (_matchedManifest = matchedManifest) === null || _matchedManifest === void 0 ? void 0 : _matchedManifest.assets;
134
+ if (Array.isArray(assets2)) {
135
+ var _acc;
136
+ (_acc = acc).push.apply(_acc, _to_consumable_array(assets2));
137
+ }
138
+ }
139
+ return acc;
140
+ }, []).concat(entryAssets || []);
141
+ cssLinks = (_assets = assets) === null || _assets === void 0 ? void 0 : (_assets_filter = _assets.filter(function(asset) {
142
+ return asset.endsWith(".css");
143
+ })) === null || _assets_filter === void 0 ? void 0 : _assets_filter.map(function(uri) {
144
+ return {
145
+ uri: uri,
146
+ as: "style"
147
+ };
148
+ });
149
+ scriptLinks = (_assets1 = assets) === null || _assets1 === void 0 ? void 0 : (_assets_filter1 = _assets1.filter(function(asset) {
150
+ return asset.endsWith(".js");
151
+ })) === null || _assets_filter1 === void 0 ? void 0 : _assets_filter1.map(function(uri) {
152
+ return {
153
+ uri: uri,
154
+ as: "script"
155
+ };
156
+ });
157
+ return [
158
+ 2,
159
+ (cssLinks || []).concat(scriptLinks || [])
160
+ ];
161
+ case 4:
162
+ return [
163
+ 2,
164
+ noopLinks
165
+ ];
166
+ }
167
+ });
168
+ });
169
+ return _parseLinksFromRoutes.apply(this, arguments);
170
+ }
@@ -0,0 +1,118 @@
1
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
+ import { transformToRegExp } from "./flushServerHeader";
3
+ export function transformLinks2String(links, preload) {
4
+ var addInclude = function addInclude2(links2, include2) {
5
+ var _include;
6
+ var images = [
7
+ "gif",
8
+ "jpg",
9
+ "jpeg",
10
+ "png",
11
+ "webp",
12
+ "bmp",
13
+ "tiff",
14
+ "anpg",
15
+ "ico"
16
+ ];
17
+ var videos = [
18
+ "mp4",
19
+ "webm",
20
+ "ogm",
21
+ "ogv",
22
+ "ogg"
23
+ ];
24
+ var fonts = [
25
+ "woff",
26
+ "woff2",
27
+ "eot",
28
+ "ttf",
29
+ "otf"
30
+ ];
31
+ var includes = ((_include = include2) === null || _include === void 0 ? void 0 : _include.map(function(item) {
32
+ if (typeof item === "string") {
33
+ var type = function() {
34
+ if (item.endsWith(".js")) {
35
+ return "script";
36
+ }
37
+ if (item.endsWith(".css")) {
38
+ return "style";
39
+ }
40
+ if (images.some(function(image) {
41
+ return item.endsWith(".".concat(image));
42
+ })) {
43
+ return "image";
44
+ }
45
+ if (videos.some(function(video) {
46
+ return item.endsWith(".".concat(video));
47
+ })) {
48
+ return "video";
49
+ }
50
+ if (fonts.some(function(font) {
51
+ return item.endsWith(".".concat(font));
52
+ })) {
53
+ return "font";
54
+ }
55
+ }();
56
+ return {
57
+ uri: item,
58
+ as: type
59
+ };
60
+ }
61
+ return {
62
+ uri: item.url,
63
+ as: item.type
64
+ };
65
+ })) || [];
66
+ return links2.concat(includes);
67
+ };
68
+ var removeExclude = function removeExclude2(links2, exclude2) {
69
+ return exclude2 ? links2.filter(function(param) {
70
+ var uri = param.uri;
71
+ return !transformToRegExp(exclude2).test(uri);
72
+ }) : links2;
73
+ };
74
+ var addAttributes = function addAttributes2(links2, attributes2) {
75
+ var parseAttributes = function(_attributes) {
76
+ return Object.entries(_attributes || {}).reduce(function(results, param) {
77
+ var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
78
+ if (typeof value === "boolean") {
79
+ value && results.push("; ".concat(key));
80
+ return results;
81
+ }
82
+ results.push("; ".concat(key, "=").concat(value));
83
+ return results;
84
+ }, []).join("");
85
+ };
86
+ return links2.map(function(param) {
87
+ var uri = param.uri, as = param.as;
88
+ if (as) {
89
+ var attributesStr = function() {
90
+ var _ref = attributes2 || {}, style = _ref.style, script = _ref.script, image = _ref.image, font = _ref.font;
91
+ switch (as) {
92
+ case "script":
93
+ return parseAttributes(script);
94
+ case "style":
95
+ return parseAttributes(style);
96
+ case "image":
97
+ return parseAttributes(image);
98
+ case "font":
99
+ return parseAttributes(font);
100
+ default:
101
+ return "";
102
+ }
103
+ }();
104
+ return "<".concat(uri, ">; rel=preload; as=").concat(as).concat(attributesStr);
105
+ }
106
+ return "<".concat(uri, ">; rel=preload");
107
+ });
108
+ };
109
+ if (typeof preload === "boolean") {
110
+ return links.map(function(param) {
111
+ var uri = param.uri, as = param.as;
112
+ return as ? "<".concat(uri, ">; rel=preload; as=").concat(as) : "<".concat(uri, ">; rel=preload");
113
+ }).join(", ");
114
+ }
115
+ var include = preload.include, exclude = preload.exclude, attributes = preload.attributes;
116
+ var resolveLinks = addAttributes(removeExclude(addInclude(links, include), exclude), attributes);
117
+ return resolveLinks.join(", ");
118
+ }
@@ -1,79 +1,91 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
- import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
2
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
3
  import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
4
4
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
5
- import { createProxyMiddleware } from "http-proxy-middleware";
5
+ import { HttpProxyMiddleware } from "http-proxy-middleware/dist/http-proxy-middleware";
6
6
  import { debug } from "../utils";
7
7
  export function formatProxyOptions(proxyOptions) {
8
- var formattedProxy = [];
9
- if (!Array.isArray(proxyOptions)) {
10
- if ("target" in proxyOptions) {
11
- formattedProxy.push(proxyOptions);
12
- } else {
13
- Array.prototype.push.apply(formattedProxy, Object.keys(proxyOptions).reduce(function(total, source) {
14
- var option = proxyOptions[source];
15
- total.push(_object_spread({
16
- context: source,
17
- changeOrigin: true,
18
- logLevel: "warn"
19
- }, typeof option === "string" ? {
20
- target: option
21
- } : option));
22
- return total;
23
- }, []));
24
- }
8
+ var ret = [];
9
+ if (Array.isArray(proxyOptions)) {
10
+ var _ret;
11
+ (_ret = ret).push.apply(_ret, _to_consumable_array(proxyOptions));
12
+ } else if ("target" in proxyOptions) {
13
+ ret.push(proxyOptions);
25
14
  } else {
26
- var _formattedProxy;
27
- (_formattedProxy = formattedProxy).push.apply(_formattedProxy, _to_consumable_array(proxyOptions));
28
- }
29
- return formattedProxy;
30
- }
31
- export var createProxyHandler = function(proxyOptions) {
32
- debug("createProxyHandler", proxyOptions);
33
- var middlewares = [];
34
- var handlers = [];
35
- var handleUpgrade = function(req, socket, head) {
36
- var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
15
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
37
16
  try {
38
- for (var _iterator2 = middlewares[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
39
- var middleware = _step2.value;
40
- if (typeof middleware.upgrade === "function") {
41
- middleware.upgrade(req, socket, head);
17
+ for (var _iterator = Object.entries(proxyOptions)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
18
+ var _step_value = _sliced_to_array(_step.value, 2), context = _step_value[0], options = _step_value[1];
19
+ var opts = {
20
+ context: context,
21
+ changeOrigin: true,
22
+ logLevel: "warn"
23
+ };
24
+ if (typeof options === "string") {
25
+ opts.target = options;
26
+ } else {
27
+ Object.assign(opts, options);
42
28
  }
29
+ ret.push(opts);
43
30
  }
44
31
  } catch (err) {
45
- _didIteratorError2 = true;
46
- _iteratorError2 = err;
32
+ _didIteratorError = true;
33
+ _iteratorError = err;
47
34
  } finally {
48
35
  try {
49
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
50
- _iterator2.return();
36
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
37
+ _iterator.return();
51
38
  }
52
39
  } finally {
53
- if (_didIteratorError2) {
54
- throw _iteratorError2;
40
+ if (_didIteratorError) {
41
+ throw _iteratorError;
55
42
  }
56
43
  }
57
44
  }
45
+ }
46
+ var handleError = function(err, _req, _res, _target) {
47
+ console.error(err);
58
48
  };
59
- if (!proxyOptions) {
60
- return {
61
- handlers: handlers,
62
- handleUpgrade: handleUpgrade
63
- };
49
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
50
+ try {
51
+ for (var _iterator1 = ret[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
52
+ var opts1 = _step1.value;
53
+ var _opts;
54
+ var _onError;
55
+ (_onError = (_opts = opts1).onError) !== null && _onError !== void 0 ? _onError : _opts.onError = handleError;
56
+ }
57
+ } catch (err) {
58
+ _didIteratorError1 = true;
59
+ _iteratorError1 = err;
60
+ } finally {
61
+ try {
62
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
63
+ _iterator1.return();
64
+ }
65
+ } finally {
66
+ if (_didIteratorError1) {
67
+ throw _iteratorError1;
68
+ }
69
+ }
64
70
  }
71
+ return ret;
72
+ }
73
+ export var createProxyHandler = function(proxyOptions) {
74
+ debug("createProxyHandler", proxyOptions);
65
75
  var formattedOptionsList = formatProxyOptions(proxyOptions);
76
+ var proxies = [];
77
+ var handlers = [];
66
78
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
67
79
  try {
68
80
  var _loop = function() {
69
- var options = _step.value;
70
- var middleware = createProxyMiddleware(options.context, options);
81
+ var opts = _step.value;
82
+ var proxy = new HttpProxyMiddleware(opts.context, opts);
71
83
  var handler = function() {
72
84
  var _ref = _async_to_generator(function(ctx, next) {
73
85
  var req, res, bypassUrl;
74
86
  return _ts_generator(this, function(_state) {
75
87
  req = ctx.req, res = ctx.res;
76
- bypassUrl = typeof options.bypass === "function" ? options.bypass(req, res, options) : null;
88
+ bypassUrl = typeof opts.bypass === "function" ? opts.bypass(req, res, opts) : null;
77
89
  if (typeof bypassUrl === "boolean") {
78
90
  ctx.status = 404;
79
91
  next();
@@ -81,7 +93,7 @@ export var createProxyHandler = function(proxyOptions) {
81
93
  ctx.url = bypassUrl;
82
94
  next();
83
95
  } else {
84
- middleware(req, res, next);
96
+ proxy.middleware(req, res, next);
85
97
  }
86
98
  return [
87
99
  2
@@ -92,7 +104,7 @@ export var createProxyHandler = function(proxyOptions) {
92
104
  return _ref.apply(this, arguments);
93
105
  };
94
106
  }();
95
- middlewares.push(middleware);
107
+ proxies.push(proxy);
96
108
  handlers.push(handler);
97
109
  };
98
110
  for (var _iterator = formattedOptionsList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)
@@ -111,6 +123,32 @@ export var createProxyHandler = function(proxyOptions) {
111
123
  }
112
124
  }
113
125
  }
126
+ var handleUpgrade = function(server) {
127
+ var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
128
+ try {
129
+ for (var _iterator2 = proxies[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
130
+ var proxy = _step2.value;
131
+ var raw = proxy;
132
+ if (raw.proxyOptions.ws === true && !raw.wsInternalSubscribed) {
133
+ server.on("upgrade", raw.handleUpgrade);
134
+ raw.wsInternalSubscribed = true;
135
+ }
136
+ }
137
+ } catch (err) {
138
+ _didIteratorError2 = true;
139
+ _iteratorError2 = err;
140
+ } finally {
141
+ try {
142
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
143
+ _iterator2.return();
144
+ }
145
+ } finally {
146
+ if (_didIteratorError2) {
147
+ throw _iteratorError2;
148
+ }
149
+ }
150
+ }
151
+ };
114
152
  return {
115
153
  handlers: handlers,
116
154
  handleUpgrade: handleUpgrade
@@ -3,15 +3,16 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
3
  import path from "path";
4
4
  import { cutNameByHyphen, mime } from "@modern-js/utils";
5
5
  import { ERROR_DIGEST } from "../../constants";
6
+ import { flushServerHeader, shouldFlushServerHeader } from "../preload";
6
7
  import { handleDirectory } from "./static";
7
8
  import { readFile } from "./reader";
8
9
  import * as ssr from "./ssr";
9
10
  import { injectServerData } from "./utils";
10
11
  export var createRenderHandler = function(param) {
11
- var distDir = param.distDir, staticGenerate = param.staticGenerate, forceCSR = param.forceCSR, nonce = param.nonce, ssrRender = param.ssrRender, _param_metaName = param.metaName, metaName = _param_metaName === void 0 ? "modern-js" : _param_metaName;
12
+ var distDir = param.distDir, staticGenerate = param.staticGenerate, conf = param.conf, forceCSR = param.forceCSR, nonce = param.nonce, ssrRender = param.ssrRender, _param_metaName = param.metaName, metaName = _param_metaName === void 0 ? "modern-js" : _param_metaName;
12
13
  return function() {
13
14
  var _render = _async_to_generator(function(param2) {
14
- var ctx, route, runner, entryPath, urlPath, entry, result, templatePath, content, useCSR, ssrRenderOptions, result1, err;
15
+ var ctx, route, runner, entryPath, urlPath, entry, result, templatePath, content, useCSR, userAgent, disablePreload, ssrRenderOptions, result1, err;
15
16
  return _ts_generator(this, function(_state) {
16
17
  switch (_state.label) {
17
18
  case 0:
@@ -67,6 +68,19 @@ export var createRenderHandler = function(param) {
67
68
  ,
68
69
  7
69
70
  ]);
71
+ userAgent = ctx.getReqHeader("User-Agent");
72
+ disablePreload = Boolean(ctx.headers["x-".concat(cutNameByHyphen(metaName), "-disable-preload")]);
73
+ if (shouldFlushServerHeader(conf.server, userAgent, disablePreload)) {
74
+ flushServerHeader({
75
+ serverConf: conf.server,
76
+ ctx: ctx,
77
+ distDir: distDir,
78
+ template: content.toString(),
79
+ headers: {
80
+ "Content-Type": mime.contentType(path.extname(templatePath))
81
+ }
82
+ });
83
+ }
70
84
  ssrRenderOptions = {
71
85
  distDir: distDir,
72
86
  entryName: route.entryName,
@@ -97,7 +111,7 @@ export var createRenderHandler = function(param) {
97
111
  case 6:
98
112
  err = _state.sent();
99
113
  ctx.error(ERROR_DIGEST.ERENDER, err.stack || err.message);
100
- ctx.res.setHeader("x-modern-ssr-fallback", "1");
114
+ ctx.res.set("x-modern-ssr-fallback", "1");
101
115
  return [
102
116
  3,
103
117
  7
@@ -18,7 +18,7 @@ export var ServerTiming = /* @__PURE__ */ function() {
18
18
  var _name = "bd-".concat(this.meta, "-").concat(name);
19
19
  var serverTiming = this.res.getHeader(SERVER_TIMING) || this.res.getHeader(SERVER_TIMING.toLocaleLowerCase());
20
20
  var value = "".concat(_name, ";").concat(desc ? 'decs="'.concat(desc, '";') : "", " dur=").concat(dur);
21
- this.res.setHeader(SERVER_TIMING, serverTiming ? "".concat(serverTiming, ", ").concat(value) : value);
21
+ this.res.set(SERVER_TIMING, serverTiming ? "".concat(serverTiming, ", ").concat(value) : value);
22
22
  return this;
23
23
  }
24
24
  }
@@ -11,9 +11,9 @@ import { Readable } from "stream";
11
11
  import { Socket } from "net";
12
12
  import { Server } from "./server";
13
13
  import { isRedirect } from "./utils";
14
- var IncomingMessageLike = /* @__PURE__ */ function(Readable1) {
14
+ var IncomingMessageLike = /* @__PURE__ */ function(Readable2) {
15
15
  "use strict";
16
- _inherits(IncomingMessageLike2, Readable1);
16
+ _inherits(IncomingMessageLike2, Readable2);
17
17
  var _super = _create_super(IncomingMessageLike2);
18
18
  function IncomingMessageLike2(param) {
19
19
  var method = param.method, url = param.url, headers = param.headers;
@@ -33,9 +33,9 @@ var IncomingMessageLike = /* @__PURE__ */ function(Readable1) {
33
33
  }
34
34
  return IncomingMessageLike2;
35
35
  }(Readable);
36
- var ServerResponseLike = /* @__PURE__ */ function(OutgoingMessage1) {
36
+ var ServerResponseLike = /* @__PURE__ */ function(OutgoingMessage2) {
37
37
  "use strict";
38
- _inherits(ServerResponseLike2, OutgoingMessage1);
38
+ _inherits(ServerResponseLike2, OutgoingMessage2);
39
39
  var _super = _create_super(ServerResponseLike2);
40
40
  function ServerResponseLike2() {
41
41
  _class_call_check(this, ServerResponseLike2);
@@ -60,9 +60,9 @@ var ServerResponseLike = /* @__PURE__ */ function(OutgoingMessage1) {
60
60
  ]);
61
61
  return ServerResponseLike2;
62
62
  }(OutgoingMessage);
63
- var CustomServer = /* @__PURE__ */ function(Server1) {
63
+ var CustomServer = /* @__PURE__ */ function(Server2) {
64
64
  "use strict";
65
- _inherits(CustomServer2, Server1);
65
+ _inherits(CustomServer2, Server2);
66
66
  var _super = _create_super(CustomServer2);
67
67
  function CustomServer2() {
68
68
  _class_call_check(this, CustomServer2);