@modern-js/server-core 2.47.0 → 2.47.1-alpha.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 (142) hide show
  1. package/dist/cjs/base/adapters/node/bff.js +69 -0
  2. package/dist/cjs/base/adapters/node/hono.js +62 -0
  3. package/dist/cjs/base/adapters/node/index.js +32 -0
  4. package/dist/cjs/base/adapters/node/loadServer.js +56 -0
  5. package/dist/cjs/base/adapters/node/middlewares/index.js +26 -0
  6. package/dist/cjs/base/adapters/node/middlewares/mock.js +113 -0
  7. package/dist/cjs/base/adapters/node/middlewares/serverStatic.js +105 -0
  8. package/dist/cjs/base/adapters/node/middlewares/templates.js +65 -0
  9. package/dist/cjs/base/adapters/node/node.js +121 -0
  10. package/dist/cjs/base/adapters/node/polyfills/index.js +24 -0
  11. package/dist/cjs/base/adapters/node/polyfills/install.js +57 -0
  12. package/dist/cjs/base/adapters/node/polyfills/stream.js +159 -0
  13. package/dist/cjs/base/constants.js +55 -0
  14. package/dist/cjs/base/index.js +73 -0
  15. package/dist/cjs/base/middlewares/customServer/base.js +115 -0
  16. package/dist/cjs/base/middlewares/customServer/context.js +78 -0
  17. package/dist/cjs/base/middlewares/customServer/index.js +138 -0
  18. package/dist/cjs/base/middlewares/customServer/routerApi.js +48 -0
  19. package/dist/cjs/base/middlewares/customServer/template.js +60 -0
  20. package/dist/cjs/base/middlewares/dataHandler.js +69 -0
  21. package/dist/cjs/base/middlewares/faviconFallback.js +34 -0
  22. package/dist/cjs/base/middlewares/index.js +28 -0
  23. package/dist/cjs/base/middlewares/monitor.js +75 -0
  24. package/dist/cjs/base/middlewares/renderHandler/index.js +92 -0
  25. package/dist/cjs/base/middlewares/renderHandler/render.js +90 -0
  26. package/dist/cjs/base/middlewares/renderHandler/serverTiming.js +43 -0
  27. package/dist/cjs/base/middlewares/renderHandler/ssrCache.js +173 -0
  28. package/dist/cjs/base/middlewares/renderHandler/ssrRender.js +183 -0
  29. package/dist/cjs/base/serverBase.js +167 -0
  30. package/dist/cjs/base/utils/debug.js +29 -0
  31. package/dist/cjs/base/utils/entry.js +30 -0
  32. package/dist/cjs/base/utils/env.js +45 -0
  33. package/dist/cjs/base/utils/error.js +65 -0
  34. package/dist/cjs/base/utils/index.js +40 -0
  35. package/dist/cjs/base/utils/middlewareCollector.js +54 -0
  36. package/dist/cjs/base/utils/path.js +46 -0
  37. package/dist/cjs/base/utils/request.js +65 -0
  38. package/dist/cjs/base/utils/serverConfig.js +71 -0
  39. package/dist/cjs/base/utils/transformStream.js +38 -0
  40. package/dist/cjs/base/utils/warmup.js +43 -0
  41. package/dist/cjs/core/hono.js +16 -0
  42. package/dist/cjs/core/index.js +24 -0
  43. package/dist/cjs/{loadPlugins.js → core/loadPlugins.js} +1 -1
  44. package/dist/cjs/{plugin.js → core/plugin.js} +1 -3
  45. package/dist/cjs/core/render.js +16 -0
  46. package/dist/cjs/core/server.js +22 -0
  47. package/dist/cjs/index.js +6 -4
  48. package/dist/esm/base/adapters/node/bff.js +45 -0
  49. package/dist/esm/base/adapters/node/hono.js +37 -0
  50. package/dist/esm/base/adapters/node/index.js +6 -0
  51. package/dist/esm/base/adapters/node/loadServer.js +22 -0
  52. package/dist/esm/base/adapters/node/middlewares/index.js +3 -0
  53. package/dist/esm/base/adapters/node/middlewares/mock.js +79 -0
  54. package/dist/esm/base/adapters/node/middlewares/serverStatic.js +71 -0
  55. package/dist/esm/base/adapters/node/middlewares/templates.js +31 -0
  56. package/dist/esm/base/adapters/node/node.js +95 -0
  57. package/dist/esm/base/adapters/node/polyfills/index.js +2 -0
  58. package/dist/esm/base/adapters/node/polyfills/install.js +33 -0
  59. package/dist/esm/base/adapters/node/polyfills/stream.js +132 -0
  60. package/dist/esm/base/constants.js +29 -0
  61. package/dist/esm/base/index.js +32 -0
  62. package/dist/esm/base/middlewares/customServer/base.js +91 -0
  63. package/dist/esm/base/middlewares/customServer/context.js +51 -0
  64. package/dist/esm/base/middlewares/customServer/index.js +114 -0
  65. package/dist/esm/base/middlewares/customServer/routerApi.js +24 -0
  66. package/dist/esm/base/middlewares/customServer/template.js +36 -0
  67. package/dist/esm/base/middlewares/dataHandler.js +35 -0
  68. package/dist/esm/base/middlewares/faviconFallback.js +10 -0
  69. package/dist/esm/base/middlewares/index.js +4 -0
  70. package/dist/esm/base/middlewares/monitor.js +49 -0
  71. package/dist/esm/base/middlewares/renderHandler/index.js +67 -0
  72. package/dist/esm/base/middlewares/renderHandler/render.js +66 -0
  73. package/dist/esm/base/middlewares/renderHandler/serverTiming.js +19 -0
  74. package/dist/esm/base/middlewares/renderHandler/ssrCache.js +149 -0
  75. package/dist/esm/base/middlewares/renderHandler/ssrRender.js +149 -0
  76. package/dist/esm/base/serverBase.js +143 -0
  77. package/dist/esm/base/utils/debug.js +5 -0
  78. package/dist/esm/base/utils/entry.js +6 -0
  79. package/dist/esm/base/utils/env.js +20 -0
  80. package/dist/esm/base/utils/error.js +41 -0
  81. package/dist/esm/base/utils/index.js +10 -0
  82. package/dist/esm/base/utils/middlewareCollector.js +29 -0
  83. package/dist/esm/base/utils/path.js +12 -0
  84. package/dist/esm/base/utils/request.js +38 -0
  85. package/dist/esm/base/utils/serverConfig.js +35 -0
  86. package/dist/esm/base/utils/transformStream.js +14 -0
  87. package/dist/esm/base/utils/warmup.js +9 -0
  88. package/dist/esm/core/hono.js +0 -0
  89. package/dist/esm/core/index.js +2 -0
  90. package/dist/esm/{loadPlugins.js → core/loadPlugins.js} +1 -1
  91. package/dist/esm/{plugin.js → core/plugin.js} +1 -3
  92. package/dist/esm/core/render.js +0 -0
  93. package/dist/esm/core/server.js +1 -0
  94. package/dist/esm/index.js +3 -2
  95. package/dist/types/base/adapters/node/bff.d.ts +4 -0
  96. package/dist/types/base/adapters/node/hono.d.ts +30 -0
  97. package/dist/types/base/adapters/node/index.d.ts +6 -0
  98. package/dist/types/base/adapters/node/loadServer.d.ts +3 -0
  99. package/dist/types/base/adapters/node/middlewares/index.d.ts +3 -0
  100. package/dist/types/base/adapters/node/middlewares/mock.d.ts +5 -0
  101. package/dist/types/base/adapters/node/middlewares/serverStatic.d.ts +9 -0
  102. package/dist/types/base/adapters/node/middlewares/templates.d.ts +3 -0
  103. package/dist/types/base/adapters/node/node.d.ts +12 -0
  104. package/dist/types/base/adapters/node/polyfills/index.d.ts +2 -0
  105. package/dist/types/base/adapters/node/polyfills/install.d.ts +1 -0
  106. package/dist/types/base/adapters/node/polyfills/stream.d.ts +18 -0
  107. package/dist/types/base/constants.d.ts +23 -0
  108. package/dist/types/base/index.d.ts +9 -0
  109. package/dist/types/base/middlewares/customServer/base.d.ts +3 -0
  110. package/dist/types/base/middlewares/customServer/context.d.ts +7 -0
  111. package/dist/types/base/middlewares/customServer/index.d.ts +13 -0
  112. package/dist/types/base/middlewares/customServer/routerApi.d.ts +9 -0
  113. package/dist/types/base/middlewares/customServer/template.d.ts +11 -0
  114. package/dist/types/base/middlewares/dataHandler.d.ts +3 -0
  115. package/dist/types/base/middlewares/faviconFallback.d.ts +2 -0
  116. package/dist/types/base/middlewares/index.d.ts +4 -0
  117. package/dist/types/base/middlewares/monitor.d.ts +7 -0
  118. package/dist/types/base/middlewares/renderHandler/index.d.ts +9 -0
  119. package/dist/types/base/middlewares/renderHandler/render.d.ts +12 -0
  120. package/dist/types/base/middlewares/renderHandler/serverTiming.d.ts +7 -0
  121. package/dist/types/base/middlewares/renderHandler/ssrCache.d.ts +17 -0
  122. package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +18 -0
  123. package/dist/types/base/serverBase.d.ts +49 -0
  124. package/dist/types/base/utils/debug.d.ts +1 -0
  125. package/dist/types/base/utils/entry.d.ts +2 -0
  126. package/dist/types/base/utils/env.d.ts +2 -0
  127. package/dist/types/base/utils/error.d.ts +1 -0
  128. package/dist/types/base/utils/index.d.ts +10 -0
  129. package/dist/types/base/utils/middlewareCollector.d.ts +12 -0
  130. package/dist/types/base/utils/path.d.ts +3 -0
  131. package/dist/types/base/utils/request.d.ts +12 -0
  132. package/dist/types/base/utils/serverConfig.d.ts +14 -0
  133. package/dist/types/base/utils/transformStream.d.ts +2 -0
  134. package/dist/types/base/utils/warmup.d.ts +1 -0
  135. package/dist/types/core/hono.d.ts +1 -0
  136. package/dist/types/core/index.d.ts +2 -0
  137. package/dist/types/{loadPlugins.d.ts → core/loadPlugins.d.ts} +1 -1
  138. package/dist/types/{plugin.d.ts → core/plugin.d.ts} +32 -35
  139. package/dist/types/core/render.d.ts +11 -0
  140. package/dist/types/core/server.d.ts +71 -0
  141. package/dist/types/index.d.ts +3 -2
  142. package/package.json +25 -2
@@ -0,0 +1,79 @@
1
+ import path from "node:path";
2
+ import { fs } from "@modern-js/utils";
3
+ import { AGGRED_DIR } from "../../../constants";
4
+ import { connectMid2HonoMid } from "../hono";
5
+ const parseKey = (key) => {
6
+ const _blank = " ";
7
+ const splitted = key.split(_blank).filter(Boolean);
8
+ if (splitted.length > 1) {
9
+ const [method, pathname] = splitted;
10
+ return {
11
+ method: method.toLowerCase(),
12
+ path: pathname
13
+ };
14
+ }
15
+ return {
16
+ method: "get",
17
+ path: key
18
+ };
19
+ };
20
+ const mockHandlerRegistry = /* @__PURE__ */ new Map();
21
+ const registerMockHandlers = async ({ pwd, server }) => {
22
+ const exts = [
23
+ ".ts",
24
+ ".js"
25
+ ];
26
+ let mockFilePath = "";
27
+ for (const ext of exts) {
28
+ const maybeMatch = path.join(pwd, `${AGGRED_DIR.mock}/index${ext}`);
29
+ if (await fs.pathExists(maybeMatch)) {
30
+ mockFilePath = maybeMatch;
31
+ break;
32
+ }
33
+ }
34
+ if (!mockFilePath) {
35
+ return null;
36
+ }
37
+ const { default: mockModule, config } = await import(mockFilePath);
38
+ const enable = config === null || config === void 0 ? void 0 : config.enable;
39
+ if (enable === false) {
40
+ return;
41
+ }
42
+ if (!mockModule) {
43
+ throw new Error(`Mock file ${mockFilePath} parsed failed!`);
44
+ }
45
+ Object.entries(mockModule).forEach(([key, handler]) => {
46
+ const { method, path: path2 } = parseKey(key);
47
+ const methodName = method.toLowerCase();
48
+ const handlerId = `${methodName}-${path2}`;
49
+ mockHandlerRegistry.set(handlerId, {
50
+ handler,
51
+ isRegistered: false
52
+ });
53
+ if (typeof server[methodName] === "function") {
54
+ const mockHandler = async (c, next) => {
55
+ var _mockHandlerRegistry_get;
56
+ if (typeof enable === "function") {
57
+ const isEnabled = enable(c.env.node.req, c.env.node.res);
58
+ if (!isEnabled) {
59
+ return next();
60
+ }
61
+ }
62
+ const handler2 = (_mockHandlerRegistry_get = mockHandlerRegistry.get(handlerId)) === null || _mockHandlerRegistry_get === void 0 ? void 0 : _mockHandlerRegistry_get.handler;
63
+ if (typeof handler2 === "function") {
64
+ await connectMid2HonoMid(handler2)(c, next);
65
+ } else {
66
+ return c.json(handler2);
67
+ }
68
+ };
69
+ const handlerInfo = mockHandlerRegistry.get(handlerId);
70
+ if (handlerInfo && !(handlerInfo === null || handlerInfo === void 0 ? void 0 : handlerInfo.isRegistered)) {
71
+ server[methodName](path2, mockHandler);
72
+ handlerInfo.isRegistered = true;
73
+ }
74
+ }
75
+ });
76
+ };
77
+ export {
78
+ registerMockHandlers
79
+ };
@@ -0,0 +1,71 @@
1
+ import path from "path";
2
+ import { existsSync, lstatSync } from "fs";
3
+ import { readFile } from "fs/promises";
4
+ import { getMimeType } from "hono/utils/mime";
5
+ import { createErrorHtml } from "../../../utils";
6
+ function createStaticMiddleware(options) {
7
+ const { pwd } = options;
8
+ const prefix = options.output.assetPrefix || "/";
9
+ const { distPath: { css: cssPath, js: jsPath, media: mediaPath } = {} } = options.output;
10
+ const { favicon, faviconByEntries } = options.html;
11
+ const favicons = prepareFavicons(favicon, faviconByEntries);
12
+ const staticFiles = [
13
+ cssPath,
14
+ jsPath,
15
+ mediaPath
16
+ ].filter((v) => Boolean(v));
17
+ const staticReg = [
18
+ "static/",
19
+ "upload/",
20
+ ...staticFiles
21
+ ];
22
+ const iconReg = [
23
+ "favicon.ico",
24
+ "icon.png",
25
+ ...favicons
26
+ ];
27
+ const regPrefix = prefix.endsWith("/") ? prefix : `${prefix}/`;
28
+ const staticPathRegExp = new RegExp(`^${regPrefix}(${[
29
+ ...staticReg,
30
+ ...iconReg
31
+ ].join("|")})`);
32
+ return async (c, next) => {
33
+ const pathname = c.req.path;
34
+ const hit = staticPathRegExp.test(pathname);
35
+ if (hit) {
36
+ const filepath = path.resolve(pwd, pathname.replace(prefix, () => ""));
37
+ if (!existsSync(filepath)) {
38
+ return c.html(createErrorHtml(404), 404);
39
+ }
40
+ const mimeType = getMimeType(filepath);
41
+ if (mimeType) {
42
+ c.header("Content-Type", mimeType);
43
+ }
44
+ const stat = lstatSync(filepath);
45
+ const { size } = stat;
46
+ const chunk = await readFile(filepath);
47
+ c.header("Content-Length", String(size));
48
+ return c.body(chunk, 200);
49
+ } else {
50
+ return next();
51
+ }
52
+ };
53
+ }
54
+ const prepareFavicons = (favicon, faviconByEntries) => {
55
+ const faviconNames = [];
56
+ if (favicon) {
57
+ faviconNames.push(favicon.substring(favicon.lastIndexOf("/") + 1));
58
+ }
59
+ if (faviconByEntries) {
60
+ Object.keys(faviconByEntries).forEach((f) => {
61
+ const curFavicon = faviconByEntries[f];
62
+ if (curFavicon) {
63
+ faviconNames.push(curFavicon.substring(curFavicon.lastIndexOf("/") + 1));
64
+ }
65
+ });
66
+ }
67
+ return faviconNames;
68
+ };
69
+ export {
70
+ createStaticMiddleware
71
+ };
@@ -0,0 +1,31 @@
1
+ import path from "path";
2
+ import { fileReader } from "@modern-js/runtime-utils/fileReader";
3
+ async function getHtmlTemplates(pwd, routes) {
4
+ const htmls = await Promise.all(routes.map(async (route) => {
5
+ let html;
6
+ try {
7
+ var _this;
8
+ const htmlPath = path.join(pwd, route.entryPath);
9
+ html = (_this = await fileReader.readFile(htmlPath, "utf-8")) === null || _this === void 0 ? void 0 : _this.toString();
10
+ } catch (e) {
11
+ }
12
+ return [
13
+ route.entryName,
14
+ html
15
+ ];
16
+ }) || []);
17
+ const templates = Object.fromEntries(htmls);
18
+ return templates;
19
+ }
20
+ function createInjectHtml(pwd, routes) {
21
+ return async (c, next) => {
22
+ if (c.req.method.toUpperCase() === "GET" && !c.get("templates") && routes) {
23
+ const templates = await getHtmlTemplates(pwd, routes);
24
+ c.set("templates", templates);
25
+ }
26
+ return next();
27
+ };
28
+ }
29
+ export {
30
+ createInjectHtml
31
+ };
@@ -0,0 +1,95 @@
1
+ import { createServer, ServerResponse } from "node:http";
2
+ import { writeReadableStreamToWritable } from "./polyfills/stream";
3
+ import { installGlobals } from "./polyfills/install";
4
+ installGlobals();
5
+ const createWebRequest = (req, res) => {
6
+ const headerRecord = [];
7
+ const len = req.rawHeaders.length;
8
+ for (let i = 0; i < len; i += 2) {
9
+ headerRecord.push([
10
+ req.rawHeaders[i],
11
+ req.rawHeaders[i + 1]
12
+ ]);
13
+ }
14
+ const { method } = req;
15
+ const controller = new AbortController();
16
+ const init = {
17
+ method,
18
+ headers: headerRecord,
19
+ signal: controller.signal
20
+ };
21
+ res.on("close", () => controller.abort());
22
+ const url = `http://${req.headers.host}${req.url}`;
23
+ const request = new Request(url, init);
24
+ return request;
25
+ };
26
+ const sendResponse = async (response, res) => {
27
+ var _response_headers_get;
28
+ res.statusMessage = response.statusText;
29
+ res.statusCode = response.status;
30
+ const cookies = [];
31
+ for (const [key, value] of response.headers.entries()) {
32
+ if (key === "set-cookie") {
33
+ cookies.push(value);
34
+ } else {
35
+ res.setHeader(key, value);
36
+ }
37
+ }
38
+ if (cookies.length > 0) {
39
+ res.setHeader("set-cookie", cookies);
40
+ }
41
+ if (((_response_headers_get = response.headers.get("Content-Type")) === null || _response_headers_get === void 0 ? void 0 : _response_headers_get.match(/text\/event-stream/i)) && res instanceof ServerResponse) {
42
+ res.flushHeaders();
43
+ }
44
+ if (response.body) {
45
+ await writeReadableStreamToWritable(response.body, res);
46
+ } else {
47
+ res.end();
48
+ }
49
+ };
50
+ const handleResponseError = (e, res) => {
51
+ const err = e instanceof Error ? e : new Error("unknown error", {
52
+ cause: e
53
+ });
54
+ if (err.code === "ERR_STREAM_PREMATURE_CLOSE") {
55
+ console.info("The user aborted a request.");
56
+ } else {
57
+ console.error(e);
58
+ if (!res.headersSent) {
59
+ res.writeHead(500, {
60
+ "Content-Type": "text/plain"
61
+ });
62
+ }
63
+ res.end(`Error: ${err.message}`);
64
+ res.destroy(err);
65
+ }
66
+ };
67
+ const getRequestListener = (handler) => {
68
+ return async (req, res) => {
69
+ try {
70
+ const request = createWebRequest(req, res);
71
+ const response = await handler(request, {
72
+ node: {
73
+ req,
74
+ res
75
+ }
76
+ });
77
+ if (!res.headersSent && !response.res) {
78
+ await sendResponse(response, res);
79
+ }
80
+ } catch (error) {
81
+ return handleResponseError(error, res);
82
+ }
83
+ };
84
+ };
85
+ const createNodeServer = (handleRequest) => {
86
+ const requestListener = getRequestListener(handleRequest);
87
+ const nodeServer = createServer(requestListener);
88
+ nodeServer.getRequestHandler = () => requestListener;
89
+ return nodeServer;
90
+ };
91
+ export {
92
+ createNodeServer,
93
+ createWebRequest,
94
+ sendResponse
95
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./install";
2
+ export * from "./stream";
@@ -0,0 +1,33 @@
1
+ import { Request as NodeRequest, Response as NodeResponse, Headers as NodeHeaders } from "@web-std/fetch";
2
+ import { TransformStream as NodeTransformStream, ReadableStream as NodeReadableStream } from "@web-std/stream";
3
+ Object.defineProperty(NodeHeaders.prototype, "getSetCookie", {
4
+ value: function getSetCookie() {
5
+ const cookies = [];
6
+ this.forEach((value, name) => {
7
+ if (name.toLowerCase() === "set-cookie") {
8
+ cookies.push(value);
9
+ }
10
+ });
11
+ return cookies;
12
+ }
13
+ });
14
+ const installGlobals = () => {
15
+ if (!global.Headers) {
16
+ global.Headers = NodeHeaders;
17
+ }
18
+ if (!global.Request) {
19
+ global.Request = NodeRequest;
20
+ }
21
+ if (!global.Response) {
22
+ global.Response = NodeResponse;
23
+ }
24
+ if (!global.TransformStream) {
25
+ global.TransformStream = NodeTransformStream;
26
+ }
27
+ if (!global.ReadableStream) {
28
+ global.ReadableStream = NodeReadableStream;
29
+ }
30
+ };
31
+ export {
32
+ installGlobals
33
+ };
@@ -0,0 +1,132 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ import { Stream } from "node:stream";
3
+ import { ReadableStream } from "@web-std/stream";
4
+ async function writeReadableStreamToWritable(stream, writable) {
5
+ const reader = stream.getReader();
6
+ const flushable = writable;
7
+ try {
8
+ while (true) {
9
+ const { done, value } = await reader.read();
10
+ if (done) {
11
+ writable.end();
12
+ break;
13
+ }
14
+ writable.write(value);
15
+ if (typeof flushable.flush === "function") {
16
+ flushable.flush();
17
+ }
18
+ }
19
+ } catch (error) {
20
+ writable.destroy(error);
21
+ throw error;
22
+ }
23
+ }
24
+ async function writeAsyncIterableToWritable(iterable, writable) {
25
+ try {
26
+ for await (const chunk of iterable) {
27
+ writable.write(chunk);
28
+ }
29
+ writable.end();
30
+ } catch (error) {
31
+ writable.destroy(error);
32
+ throw error;
33
+ }
34
+ }
35
+ async function readableStreamToString(stream, encoding) {
36
+ const reader = stream.getReader();
37
+ const chunks = [];
38
+ while (true) {
39
+ const { done, value } = await reader.read();
40
+ if (done) {
41
+ break;
42
+ }
43
+ if (value) {
44
+ chunks.push(value);
45
+ }
46
+ }
47
+ return Buffer.concat(chunks).toString(encoding);
48
+ }
49
+ const createReadableStreamFromReadable = (source) => {
50
+ const pump = new StreamPump(source);
51
+ const stream = new ReadableStream(pump, pump);
52
+ return stream;
53
+ };
54
+ class StreamPump {
55
+ size(chunk) {
56
+ return (chunk === null || chunk === void 0 ? void 0 : chunk.byteLength) || 0;
57
+ }
58
+ start(controller) {
59
+ this.controller = controller;
60
+ this.stream.on("data", this.enqueue);
61
+ this.stream.once("error", this.error);
62
+ this.stream.once("end", this.close);
63
+ this.stream.once("close", this.close);
64
+ }
65
+ pull() {
66
+ this.resume();
67
+ }
68
+ cancel(reason) {
69
+ if (this.stream.destroy) {
70
+ this.stream.destroy(reason);
71
+ }
72
+ this.stream.off("data", this.enqueue);
73
+ this.stream.off("error", this.error);
74
+ this.stream.off("end", this.close);
75
+ this.stream.off("close", this.close);
76
+ }
77
+ enqueue(chunk) {
78
+ if (this.controller) {
79
+ try {
80
+ const bytes = chunk instanceof Uint8Array ? chunk : Buffer.from(chunk);
81
+ const available = (this.controller.desiredSize || 0) - bytes.byteLength;
82
+ this.controller.enqueue(bytes);
83
+ if (available <= 0) {
84
+ this.pause();
85
+ }
86
+ } catch (error) {
87
+ this.controller.error(new Error("Could not create Buffer, chunk must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object"));
88
+ this.cancel();
89
+ }
90
+ }
91
+ }
92
+ pause() {
93
+ if (this.stream.pause) {
94
+ this.stream.pause();
95
+ }
96
+ }
97
+ resume() {
98
+ if (this.stream.readable && this.stream.resume) {
99
+ this.stream.resume();
100
+ }
101
+ }
102
+ close() {
103
+ if (this.controller) {
104
+ this.controller.close();
105
+ delete this.controller;
106
+ }
107
+ }
108
+ error(error) {
109
+ if (this.controller) {
110
+ this.controller.error(error);
111
+ delete this.controller;
112
+ }
113
+ }
114
+ constructor(stream) {
115
+ _define_property(this, "highWaterMark", void 0);
116
+ _define_property(this, "accumalatedSize", void 0);
117
+ _define_property(this, "stream", void 0);
118
+ _define_property(this, "controller", void 0);
119
+ this.highWaterMark = stream.readableHighWaterMark || new Stream.Readable().readableHighWaterMark;
120
+ this.accumalatedSize = 0;
121
+ this.stream = stream;
122
+ this.enqueue = this.enqueue.bind(this);
123
+ this.error = this.error.bind(this);
124
+ this.close = this.close.bind(this);
125
+ }
126
+ }
127
+ export {
128
+ createReadableStreamFromReadable,
129
+ readableStreamToString,
130
+ writeAsyncIterableToWritable,
131
+ writeReadableStreamToWritable
132
+ };
@@ -0,0 +1,29 @@
1
+ const AGGRED_DIR = {
2
+ mock: "config/mock",
3
+ server: "server",
4
+ api: "api",
5
+ shared: "shared",
6
+ lambda: "lambda"
7
+ };
8
+ const REPLACE_REG = {
9
+ before: {
10
+ head: "<head[^>]*>",
11
+ body: "<body[^>]*>"
12
+ },
13
+ after: {
14
+ head: "</head>",
15
+ body: "</body>"
16
+ }
17
+ };
18
+ var ServerReportTimings;
19
+ (function(ServerReportTimings2) {
20
+ ServerReportTimings2["SERVER_HANDLE_REQUEST"] = "server-handle-request";
21
+ ServerReportTimings2["SERVER_MIDDLEWARE"] = "server-middleware";
22
+ ServerReportTimings2["SERVER_HOOK_AFTER_RENDER"] = "server-hook-after-render";
23
+ ServerReportTimings2["SERVER_HOOK_AFTER_MATCH"] = "server-hook-after-match";
24
+ })(ServerReportTimings || (ServerReportTimings = {}));
25
+ export {
26
+ AGGRED_DIR,
27
+ REPLACE_REG,
28
+ ServerReportTimings
29
+ };
@@ -0,0 +1,32 @@
1
+ import { ServerBase } from "./serverBase";
2
+ import { createErrorHtml } from "./utils";
3
+ import { AGGRED_DIR } from "./constants";
4
+ import { httpCallBack2HonoMid, createNodeServer, loadServerEnv, connectMid2HonoMid, sendResponse, createStaticMiddleware, bindBFFHandler, registerMockHandlers, createInjectHtml } from "./adapters/node";
5
+ import { favionFallbackMiddleware, bindDataHandlers, injectReporter, getRenderHandler, injectLogger, bindRenderHandler } from "./middlewares";
6
+ function createServerBase(options) {
7
+ if (options == null) {
8
+ throw new Error("can not start server without options");
9
+ }
10
+ const server = new ServerBase(options);
11
+ return server;
12
+ }
13
+ export {
14
+ AGGRED_DIR,
15
+ bindBFFHandler,
16
+ bindDataHandlers,
17
+ bindRenderHandler,
18
+ connectMid2HonoMid,
19
+ createErrorHtml,
20
+ createInjectHtml,
21
+ createNodeServer,
22
+ createServerBase,
23
+ createStaticMiddleware,
24
+ favionFallbackMiddleware,
25
+ getRenderHandler,
26
+ httpCallBack2HonoMid,
27
+ injectLogger,
28
+ injectReporter,
29
+ loadServerEnv,
30
+ registerMockHandlers,
31
+ sendResponse
32
+ };
@@ -0,0 +1,91 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ import { getCookie } from "hono/cookie";
3
+ import { getHost } from "../../utils";
4
+ function createBaseHookContext(c, logger, metrics) {
5
+ return {
6
+ request: new BaseHookRequest(c),
7
+ response: new BaseHookResponse(c),
8
+ logger,
9
+ metrics
10
+ };
11
+ }
12
+ class BaseHookRequest {
13
+ get url() {
14
+ return this.req.url;
15
+ }
16
+ get host() {
17
+ return getHost(this.req.raw);
18
+ }
19
+ get pathname() {
20
+ return this.req.path;
21
+ }
22
+ get query() {
23
+ return this.req.query();
24
+ }
25
+ get headers() {
26
+ return this.req.header();
27
+ }
28
+ get cookies() {
29
+ return {
30
+ // FIXME: ModernRequest Type Error
31
+ get: (key) => {
32
+ return getCookie(this.c, key);
33
+ }
34
+ };
35
+ }
36
+ get cookie() {
37
+ return this.req.header("cookie");
38
+ }
39
+ constructor(c) {
40
+ _define_property(this, "req", void 0);
41
+ _define_property(this, "c", void 0);
42
+ this.c = c;
43
+ this.req = c.req;
44
+ }
45
+ }
46
+ class BaseHookResponse {
47
+ get(key) {
48
+ return this.c.res.headers.get(key);
49
+ }
50
+ set(key, value) {
51
+ if ([
52
+ "set-cookie",
53
+ "Set-Cookie"
54
+ ].includes(key)) {
55
+ this.c.header(key, value.toString(), {
56
+ append: true
57
+ });
58
+ } else {
59
+ this.c.header(key, value.toString());
60
+ }
61
+ }
62
+ status(code) {
63
+ this.c.status(code);
64
+ }
65
+ get cookies() {
66
+ const setCookie = (key, value) => {
67
+ this.c.header("set-cookie", `${key}=${value}`, {
68
+ append: true
69
+ });
70
+ };
71
+ const clearCookie = () => {
72
+ this.c.header("set-cookie", void 0);
73
+ };
74
+ return {
75
+ set: setCookie,
76
+ clear: clearCookie
77
+ };
78
+ }
79
+ raw(body, options) {
80
+ this.c.res = this.c.newResponse(body, options);
81
+ this.private_overrided = true;
82
+ }
83
+ constructor(c) {
84
+ _define_property(this, "private_overrided", false);
85
+ _define_property(this, "c", void 0);
86
+ this.c = c;
87
+ }
88
+ }
89
+ export {
90
+ createBaseHookContext
91
+ };
@@ -0,0 +1,51 @@
1
+ import { RouterAPI } from "./routerApi";
2
+ import { TemplateApi } from "./template";
3
+ import { createBaseHookContext } from "./base";
4
+ function createAfterMatchCtx(c, entryName, logger, metrics) {
5
+ const baseContext = createBaseHookContext(c, logger, metrics);
6
+ return {
7
+ ...baseContext,
8
+ router: new RouterAPI(entryName)
9
+ };
10
+ }
11
+ async function createAfterRenderCtx(c, logger, metrics) {
12
+ const baseContext = createBaseHookContext(c, logger, metrics);
13
+ const resBody = await c.res.text();
14
+ return {
15
+ ...baseContext,
16
+ template: new TemplateApi(resBody)
17
+ };
18
+ }
19
+ function createCustomMiddlewaresCtx(c, logger, metrics) {
20
+ var _c_env_node, _c_env_node1;
21
+ const baseContext = createBaseHookContext(c, logger, metrics);
22
+ const reporter = c.get("reporter");
23
+ return {
24
+ ...baseContext,
25
+ reporter,
26
+ response: {
27
+ ...baseContext.response,
28
+ locals: {}
29
+ },
30
+ source: {
31
+ req: (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req,
32
+ res: (_c_env_node1 = c.env.node) === null || _c_env_node1 === void 0 ? void 0 : _c_env_node1.res
33
+ }
34
+ };
35
+ }
36
+ function createAfterStreamingRenderContext(c, logger, route, metrics) {
37
+ const baseContext = createBaseHookContext(c, logger, metrics);
38
+ return (chunk) => {
39
+ return {
40
+ ...baseContext,
41
+ route,
42
+ chunk
43
+ };
44
+ };
45
+ }
46
+ export {
47
+ createAfterMatchCtx,
48
+ createAfterRenderCtx,
49
+ createAfterStreamingRenderContext,
50
+ createCustomMiddlewaresCtx
51
+ };