@bleedingdev/modern-js-server-core 3.2.0-ultramodern.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 (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/cjs/adapters/node/helper/index.js +55 -0
  4. package/dist/cjs/adapters/node/helper/loadCache.js +58 -0
  5. package/dist/cjs/adapters/node/helper/loadConfig.js +78 -0
  6. package/dist/cjs/adapters/node/helper/loadEnv.js +66 -0
  7. package/dist/cjs/adapters/node/helper/loadPlugin.js +47 -0
  8. package/dist/cjs/adapters/node/helper/utils.js +39 -0
  9. package/dist/cjs/adapters/node/hono.js +95 -0
  10. package/dist/cjs/adapters/node/index.js +87 -0
  11. package/dist/cjs/adapters/node/node.js +180 -0
  12. package/dist/cjs/adapters/node/plugins/index.js +72 -0
  13. package/dist/cjs/adapters/node/plugins/nodeServer.js +43 -0
  14. package/dist/cjs/adapters/node/plugins/resource.js +206 -0
  15. package/dist/cjs/adapters/node/plugins/static.js +379 -0
  16. package/dist/cjs/constants.js +77 -0
  17. package/dist/cjs/context.js +41 -0
  18. package/dist/cjs/helper.js +45 -0
  19. package/dist/cjs/hono.js +46 -0
  20. package/dist/cjs/index.js +247 -0
  21. package/dist/cjs/plugins/compat/hooks.js +80 -0
  22. package/dist/cjs/plugins/compat/index.js +64 -0
  23. package/dist/cjs/plugins/contractGateAutopilot.js +158 -0
  24. package/dist/cjs/plugins/contractGateSnapshotStore.js +239 -0
  25. package/dist/cjs/plugins/default.js +61 -0
  26. package/dist/cjs/plugins/favicon.js +48 -0
  27. package/dist/cjs/plugins/index.js +157 -0
  28. package/dist/cjs/plugins/log.js +92 -0
  29. package/dist/cjs/plugins/mfCache.js +78 -0
  30. package/dist/cjs/plugins/middlewares.js +49 -0
  31. package/dist/cjs/plugins/monitors.js +192 -0
  32. package/dist/cjs/plugins/processedBy.js +50 -0
  33. package/dist/cjs/plugins/render/csrRscRender.js +74 -0
  34. package/dist/cjs/plugins/render/dataHandler.js +53 -0
  35. package/dist/cjs/plugins/render/index.js +158 -0
  36. package/dist/cjs/plugins/render/inject.js +92 -0
  37. package/dist/cjs/plugins/render/render.js +273 -0
  38. package/dist/cjs/plugins/render/renderRscHandler.js +72 -0
  39. package/dist/cjs/plugins/render/serverActionHandler.js +47 -0
  40. package/dist/cjs/plugins/render/ssrCache.js +198 -0
  41. package/dist/cjs/plugins/render/ssrRender.js +96 -0
  42. package/dist/cjs/plugins/render/utils.js +49 -0
  43. package/dist/cjs/plugins/route.js +68 -0
  44. package/dist/cjs/plugins/telemetry.js +1283 -0
  45. package/dist/cjs/serverBase.js +176 -0
  46. package/dist/cjs/types/config/bff.js +18 -0
  47. package/dist/cjs/types/config/dev.js +18 -0
  48. package/dist/cjs/types/config/html.js +18 -0
  49. package/dist/cjs/types/config/index.js +93 -0
  50. package/dist/cjs/types/config/output.js +18 -0
  51. package/dist/cjs/types/config/security.js +18 -0
  52. package/dist/cjs/types/config/server.js +18 -0
  53. package/dist/cjs/types/config/share.js +18 -0
  54. package/dist/cjs/types/config/source.js +18 -0
  55. package/dist/cjs/types/config/tools.js +18 -0
  56. package/dist/cjs/types/index.js +79 -0
  57. package/dist/cjs/types/plugins/base.js +18 -0
  58. package/dist/cjs/types/plugins/index.js +58 -0
  59. package/dist/cjs/types/plugins/plugin.js +18 -0
  60. package/dist/cjs/types/render.js +18 -0
  61. package/dist/cjs/types/requestHandler.js +18 -0
  62. package/dist/cjs/types/server.js +18 -0
  63. package/dist/cjs/utils/entry.js +40 -0
  64. package/dist/cjs/utils/env.js +51 -0
  65. package/dist/cjs/utils/error.js +93 -0
  66. package/dist/cjs/utils/index.js +114 -0
  67. package/dist/cjs/utils/middlewareCollector.js +63 -0
  68. package/dist/cjs/utils/publicDir.js +92 -0
  69. package/dist/cjs/utils/request.js +86 -0
  70. package/dist/cjs/utils/serverConfig.js +43 -0
  71. package/dist/cjs/utils/storage.js +69 -0
  72. package/dist/cjs/utils/transformStream.js +65 -0
  73. package/dist/cjs/utils/warmup.js +40 -0
  74. package/dist/esm/adapters/node/helper/index.mjs +5 -0
  75. package/dist/esm/adapters/node/helper/loadCache.mjs +14 -0
  76. package/dist/esm/adapters/node/helper/loadConfig.mjs +31 -0
  77. package/dist/esm/adapters/node/helper/loadEnv.mjs +22 -0
  78. package/dist/esm/adapters/node/helper/loadPlugin.mjs +13 -0
  79. package/dist/esm/adapters/node/helper/utils.mjs +5 -0
  80. package/dist/esm/adapters/node/hono.mjs +55 -0
  81. package/dist/esm/adapters/node/index.mjs +4 -0
  82. package/dist/esm/adapters/node/node.mjs +130 -0
  83. package/dist/esm/adapters/node/plugins/index.mjs +3 -0
  84. package/dist/esm/adapters/node/plugins/nodeServer.mjs +9 -0
  85. package/dist/esm/adapters/node/plugins/resource.mjs +138 -0
  86. package/dist/esm/adapters/node/plugins/static.mjs +329 -0
  87. package/dist/esm/constants.mjs +28 -0
  88. package/dist/esm/context.mjs +4 -0
  89. package/dist/esm/helper.mjs +11 -0
  90. package/dist/esm/hono.mjs +2 -0
  91. package/dist/esm/index.mjs +12 -0
  92. package/dist/esm/plugins/compat/hooks.mjs +40 -0
  93. package/dist/esm/plugins/compat/index.mjs +27 -0
  94. package/dist/esm/plugins/contractGateAutopilot.mjs +124 -0
  95. package/dist/esm/plugins/contractGateSnapshotStore.mjs +180 -0
  96. package/dist/esm/plugins/default.mjs +27 -0
  97. package/dist/esm/plugins/favicon.mjs +14 -0
  98. package/dist/esm/plugins/index.mjs +11 -0
  99. package/dist/esm/plugins/log.mjs +58 -0
  100. package/dist/esm/plugins/mfCache.mjs +35 -0
  101. package/dist/esm/plugins/middlewares.mjs +15 -0
  102. package/dist/esm/plugins/monitors.mjs +149 -0
  103. package/dist/esm/plugins/processedBy.mjs +16 -0
  104. package/dist/esm/plugins/render/csrRscRender.mjs +40 -0
  105. package/dist/esm/plugins/render/dataHandler.mjs +19 -0
  106. package/dist/esm/plugins/render/index.mjs +84 -0
  107. package/dist/esm/plugins/render/inject.mjs +55 -0
  108. package/dist/esm/plugins/render/render.mjs +230 -0
  109. package/dist/esm/plugins/render/renderRscHandler.mjs +38 -0
  110. package/dist/esm/plugins/render/serverActionHandler.mjs +13 -0
  111. package/dist/esm/plugins/render/ssrCache.mjs +158 -0
  112. package/dist/esm/plugins/render/ssrRender.mjs +62 -0
  113. package/dist/esm/plugins/render/utils.mjs +15 -0
  114. package/dist/esm/plugins/route.mjs +34 -0
  115. package/dist/esm/plugins/telemetry.mjs +1195 -0
  116. package/dist/esm/rslib-runtime.mjs +18 -0
  117. package/dist/esm/serverBase.mjs +139 -0
  118. package/dist/esm/types/config/bff.mjs +0 -0
  119. package/dist/esm/types/config/dev.mjs +0 -0
  120. package/dist/esm/types/config/html.mjs +0 -0
  121. package/dist/esm/types/config/index.mjs +6 -0
  122. package/dist/esm/types/config/output.mjs +0 -0
  123. package/dist/esm/types/config/security.mjs +0 -0
  124. package/dist/esm/types/config/server.mjs +0 -0
  125. package/dist/esm/types/config/share.mjs +0 -0
  126. package/dist/esm/types/config/source.mjs +0 -0
  127. package/dist/esm/types/config/tools.mjs +0 -0
  128. package/dist/esm/types/index.mjs +4 -0
  129. package/dist/esm/types/plugins/base.mjs +0 -0
  130. package/dist/esm/types/plugins/index.mjs +1 -0
  131. package/dist/esm/types/plugins/plugin.mjs +0 -0
  132. package/dist/esm/types/render.mjs +0 -0
  133. package/dist/esm/types/requestHandler.mjs +0 -0
  134. package/dist/esm/types/server.mjs +0 -0
  135. package/dist/esm/utils/entry.mjs +3 -0
  136. package/dist/esm/utils/env.mjs +14 -0
  137. package/dist/esm/utils/error.mjs +53 -0
  138. package/dist/esm/utils/index.mjs +9 -0
  139. package/dist/esm/utils/middlewareCollector.mjs +26 -0
  140. package/dist/esm/utils/publicDir.mjs +33 -0
  141. package/dist/esm/utils/request.mjs +40 -0
  142. package/dist/esm/utils/serverConfig.mjs +9 -0
  143. package/dist/esm/utils/storage.mjs +35 -0
  144. package/dist/esm/utils/transformStream.mjs +28 -0
  145. package/dist/esm/utils/warmup.mjs +6 -0
  146. package/dist/esm-node/adapters/node/helper/index.mjs +6 -0
  147. package/dist/esm-node/adapters/node/helper/loadCache.mjs +15 -0
  148. package/dist/esm-node/adapters/node/helper/loadConfig.mjs +32 -0
  149. package/dist/esm-node/adapters/node/helper/loadEnv.mjs +23 -0
  150. package/dist/esm-node/adapters/node/helper/loadPlugin.mjs +14 -0
  151. package/dist/esm-node/adapters/node/helper/utils.mjs +6 -0
  152. package/dist/esm-node/adapters/node/hono.mjs +56 -0
  153. package/dist/esm-node/adapters/node/index.mjs +5 -0
  154. package/dist/esm-node/adapters/node/node.mjs +131 -0
  155. package/dist/esm-node/adapters/node/plugins/index.mjs +4 -0
  156. package/dist/esm-node/adapters/node/plugins/nodeServer.mjs +10 -0
  157. package/dist/esm-node/adapters/node/plugins/resource.mjs +139 -0
  158. package/dist/esm-node/adapters/node/plugins/static.mjs +330 -0
  159. package/dist/esm-node/constants.mjs +29 -0
  160. package/dist/esm-node/context.mjs +5 -0
  161. package/dist/esm-node/helper.mjs +12 -0
  162. package/dist/esm-node/hono.mjs +3 -0
  163. package/dist/esm-node/index.mjs +13 -0
  164. package/dist/esm-node/plugins/compat/hooks.mjs +41 -0
  165. package/dist/esm-node/plugins/compat/index.mjs +28 -0
  166. package/dist/esm-node/plugins/contractGateAutopilot.mjs +125 -0
  167. package/dist/esm-node/plugins/contractGateSnapshotStore.mjs +182 -0
  168. package/dist/esm-node/plugins/default.mjs +28 -0
  169. package/dist/esm-node/plugins/favicon.mjs +15 -0
  170. package/dist/esm-node/plugins/index.mjs +12 -0
  171. package/dist/esm-node/plugins/log.mjs +59 -0
  172. package/dist/esm-node/plugins/mfCache.mjs +36 -0
  173. package/dist/esm-node/plugins/middlewares.mjs +16 -0
  174. package/dist/esm-node/plugins/monitors.mjs +150 -0
  175. package/dist/esm-node/plugins/processedBy.mjs +17 -0
  176. package/dist/esm-node/plugins/render/csrRscRender.mjs +41 -0
  177. package/dist/esm-node/plugins/render/dataHandler.mjs +20 -0
  178. package/dist/esm-node/plugins/render/index.mjs +85 -0
  179. package/dist/esm-node/plugins/render/inject.mjs +56 -0
  180. package/dist/esm-node/plugins/render/render.mjs +231 -0
  181. package/dist/esm-node/plugins/render/renderRscHandler.mjs +39 -0
  182. package/dist/esm-node/plugins/render/serverActionHandler.mjs +14 -0
  183. package/dist/esm-node/plugins/render/ssrCache.mjs +159 -0
  184. package/dist/esm-node/plugins/render/ssrRender.mjs +63 -0
  185. package/dist/esm-node/plugins/render/utils.mjs +16 -0
  186. package/dist/esm-node/plugins/route.mjs +35 -0
  187. package/dist/esm-node/plugins/telemetry.mjs +1196 -0
  188. package/dist/esm-node/rslib-runtime.mjs +19 -0
  189. package/dist/esm-node/serverBase.mjs +140 -0
  190. package/dist/esm-node/types/config/bff.mjs +1 -0
  191. package/dist/esm-node/types/config/dev.mjs +1 -0
  192. package/dist/esm-node/types/config/html.mjs +1 -0
  193. package/dist/esm-node/types/config/index.mjs +7 -0
  194. package/dist/esm-node/types/config/output.mjs +1 -0
  195. package/dist/esm-node/types/config/security.mjs +1 -0
  196. package/dist/esm-node/types/config/server.mjs +1 -0
  197. package/dist/esm-node/types/config/share.mjs +1 -0
  198. package/dist/esm-node/types/config/source.mjs +1 -0
  199. package/dist/esm-node/types/config/tools.mjs +1 -0
  200. package/dist/esm-node/types/index.mjs +5 -0
  201. package/dist/esm-node/types/plugins/base.mjs +1 -0
  202. package/dist/esm-node/types/plugins/index.mjs +2 -0
  203. package/dist/esm-node/types/plugins/plugin.mjs +1 -0
  204. package/dist/esm-node/types/render.mjs +1 -0
  205. package/dist/esm-node/types/requestHandler.mjs +1 -0
  206. package/dist/esm-node/types/server.mjs +1 -0
  207. package/dist/esm-node/utils/entry.mjs +4 -0
  208. package/dist/esm-node/utils/env.mjs +15 -0
  209. package/dist/esm-node/utils/error.mjs +54 -0
  210. package/dist/esm-node/utils/index.mjs +10 -0
  211. package/dist/esm-node/utils/middlewareCollector.mjs +27 -0
  212. package/dist/esm-node/utils/publicDir.mjs +34 -0
  213. package/dist/esm-node/utils/request.mjs +41 -0
  214. package/dist/esm-node/utils/serverConfig.mjs +10 -0
  215. package/dist/esm-node/utils/storage.mjs +36 -0
  216. package/dist/esm-node/utils/transformStream.mjs +29 -0
  217. package/dist/esm-node/utils/warmup.mjs +7 -0
  218. package/dist/types/adapters/node/helper/index.d.ts +6 -0
  219. package/dist/types/adapters/node/helper/loadCache.d.ts +2 -0
  220. package/dist/types/adapters/node/helper/loadConfig.d.ts +3 -0
  221. package/dist/types/adapters/node/helper/loadEnv.d.ts +3 -0
  222. package/dist/types/adapters/node/helper/loadPlugin.d.ts +3 -0
  223. package/dist/types/adapters/node/helper/utils.d.ts +21 -0
  224. package/dist/types/adapters/node/hono.d.ts +19 -0
  225. package/dist/types/adapters/node/index.d.ts +5 -0
  226. package/dist/types/adapters/node/node.d.ts +17 -0
  227. package/dist/types/adapters/node/plugins/index.d.ts +3 -0
  228. package/dist/types/adapters/node/plugins/nodeServer.d.ts +6 -0
  229. package/dist/types/adapters/node/plugins/resource.d.ts +11 -0
  230. package/dist/types/adapters/node/plugins/static.d.ts +25 -0
  231. package/dist/types/constants.d.ts +26 -0
  232. package/dist/types/context.d.ts +3 -0
  233. package/dist/types/helper.d.ts +10 -0
  234. package/dist/types/hono.d.ts +3 -0
  235. package/dist/types/index.d.ts +14 -0
  236. package/dist/types/plugins/compat/hooks.d.ts +8 -0
  237. package/dist/types/plugins/compat/index.d.ts +3 -0
  238. package/dist/types/plugins/contractGateAutopilot.d.ts +35 -0
  239. package/dist/types/plugins/contractGateSnapshotStore.d.ts +57 -0
  240. package/dist/types/plugins/default.d.ts +7 -0
  241. package/dist/types/plugins/favicon.d.ts +2 -0
  242. package/dist/types/plugins/index.d.ts +11 -0
  243. package/dist/types/plugins/log.d.ts +2 -0
  244. package/dist/types/plugins/mfCache.d.ts +12 -0
  245. package/dist/types/plugins/middlewares.d.ts +2 -0
  246. package/dist/types/plugins/monitors.d.ts +6 -0
  247. package/dist/types/plugins/processedBy.d.ts +2 -0
  248. package/dist/types/plugins/render/csrRscRender.d.ts +2 -0
  249. package/dist/types/plugins/render/dataHandler.d.ts +5 -0
  250. package/dist/types/plugins/render/index.d.ts +3 -0
  251. package/dist/types/plugins/render/inject.d.ts +7 -0
  252. package/dist/types/plugins/render/render.d.ts +16 -0
  253. package/dist/types/plugins/render/renderRscHandler.d.ts +2 -0
  254. package/dist/types/plugins/render/serverActionHandler.d.ts +2 -0
  255. package/dist/types/plugins/render/ssrCache.d.ts +18 -0
  256. package/dist/types/plugins/render/ssrRender.d.ts +26 -0
  257. package/dist/types/plugins/render/utils.d.ts +3 -0
  258. package/dist/types/plugins/route.d.ts +2 -0
  259. package/dist/types/plugins/telemetry.d.ts +309 -0
  260. package/dist/types/serverBase.d.ts +38 -0
  261. package/dist/types/types/config/bff.d.ts +142 -0
  262. package/dist/types/types/config/dev.d.ts +4 -0
  263. package/dist/types/types/config/html.d.ts +15 -0
  264. package/dist/types/types/config/index.d.ts +35 -0
  265. package/dist/types/types/config/output.d.ts +20 -0
  266. package/dist/types/types/config/security.d.ts +4 -0
  267. package/dist/types/types/config/server.d.ts +402 -0
  268. package/dist/types/types/config/share.d.ts +3 -0
  269. package/dist/types/types/config/source.d.ts +7 -0
  270. package/dist/types/types/config/tools.d.ts +2 -0
  271. package/dist/types/types/index.d.ts +4 -0
  272. package/dist/types/types/plugins/base.d.ts +57 -0
  273. package/dist/types/types/plugins/index.d.ts +2 -0
  274. package/dist/types/types/plugins/plugin.d.ts +31 -0
  275. package/dist/types/types/render.d.ts +24 -0
  276. package/dist/types/types/requestHandler.d.ts +48 -0
  277. package/dist/types/types/server.d.ts +67 -0
  278. package/dist/types/utils/entry.d.ts +3 -0
  279. package/dist/types/utils/env.d.ts +2 -0
  280. package/dist/types/utils/error.d.ts +8 -0
  281. package/dist/types/utils/index.d.ts +9 -0
  282. package/dist/types/utils/middlewareCollector.d.ts +12 -0
  283. package/dist/types/utils/publicDir.d.ts +40 -0
  284. package/dist/types/utils/request.d.ts +17 -0
  285. package/dist/types/utils/serverConfig.d.ts +8 -0
  286. package/dist/types/utils/storage.d.ts +5 -0
  287. package/dist/types/utils/transformStream.d.ts +5 -0
  288. package/dist/types/utils/warmup.d.ts +1 -0
  289. package/package.json +103 -0
  290. package/rslib.config.mts +4 -0
  291. package/rstest.config.mts +7 -0
@@ -0,0 +1,180 @@
1
+ import { fs } from "@modern-js/utils";
2
+ import { promises } from "fs";
3
+ import path from "path";
4
+ const CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION = 1;
5
+ const DEFAULT_CONTRACT_GATE_SNAPSHOT_PATH = '.modern/contract-gates.json';
6
+ const DEFAULT_HTTP_STORE_TIMEOUT_MS = 5000;
7
+ const BUILTIN_HTTP_STATE_STORE_MODULES = new Set([
8
+ 'http',
9
+ '@modern-js/server-core/http',
10
+ '@modern-js/server-core/contract-gate-http-store'
11
+ ]);
12
+ const isRecord = (value)=>'object' == typeof value && null !== value && !Array.isArray(value);
13
+ const normalizeSnapshot = (snapshot)=>{
14
+ if (!isRecord(snapshot)) return;
15
+ const schemaVersion = 'number' == typeof snapshot.schemaVersion ? snapshot.schemaVersion : CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION;
16
+ const updatedAt = 'number' == typeof snapshot.updatedAt ? snapshot.updatedAt : Date.now();
17
+ const gates = isRecord(snapshot.gates) ? snapshot.gates : {};
18
+ return {
19
+ schemaVersion,
20
+ updatedAt,
21
+ gates
22
+ };
23
+ };
24
+ const normalizeHttpStoreOptions = (options)=>{
25
+ const endpoint = 'string' == typeof options?.endpoint ? options.endpoint.trim() : '';
26
+ if (!endpoint) throw new Error('[telemetry.canary.autopilot] HTTP stateStore requires options.endpoint');
27
+ const readMethod = 'string' == typeof options?.readMethod && options.readMethod.trim() ? options.readMethod.trim().toUpperCase() : 'GET';
28
+ const writeMethod = 'string' == typeof options?.writeMethod && options.writeMethod.trim() ? options.writeMethod.trim().toUpperCase() : 'PUT';
29
+ const timeoutMsRaw = Number(options?.timeoutMs);
30
+ const timeoutMs = Number.isFinite(timeoutMsRaw) && timeoutMsRaw > 0 ? Math.floor(timeoutMsRaw) : DEFAULT_HTTP_STORE_TIMEOUT_MS;
31
+ const headersRaw = options?.headers;
32
+ const headers = {};
33
+ if (headersRaw && 'object' == typeof headersRaw && !Array.isArray(headersRaw)) Object.entries(headersRaw).forEach(([key, value])=>{
34
+ if ('string' == typeof key && key.trim().length > 0 && null != value) headers[key] = String(value);
35
+ });
36
+ return {
37
+ endpoint,
38
+ readMethod,
39
+ writeMethod,
40
+ headers,
41
+ timeoutMs
42
+ };
43
+ };
44
+ const withTimeoutAbort = (timeoutMs)=>{
45
+ const controller = new AbortController();
46
+ const timer = setTimeout(()=>controller.abort(), timeoutMs);
47
+ return {
48
+ signal: controller.signal,
49
+ clear: ()=>clearTimeout(timer)
50
+ };
51
+ };
52
+ const createHttpContractGateSnapshotStore = (options)=>{
53
+ const normalized = normalizeHttpStoreOptions(options);
54
+ const endpoint = normalized.endpoint;
55
+ return {
56
+ name: `http:${endpoint}`,
57
+ async readSnapshot () {
58
+ const { signal, clear } = withTimeoutAbort(normalized.timeoutMs || 5000);
59
+ try {
60
+ const response = await fetch(endpoint, {
61
+ method: normalized.readMethod || 'GET',
62
+ headers: {
63
+ accept: 'application/json',
64
+ ...normalized.headers || {}
65
+ },
66
+ signal
67
+ });
68
+ if (404 === response.status) return;
69
+ if (!response.ok) throw new Error(`HTTP stateStore read failed with status ${String(response.status)}`);
70
+ const payload = await response.json();
71
+ return normalizeSnapshot(payload);
72
+ } finally{
73
+ clear();
74
+ }
75
+ },
76
+ async writeSnapshot (snapshot) {
77
+ const body = JSON.stringify(normalizeSnapshot(snapshot) || {
78
+ schemaVersion: CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION,
79
+ updatedAt: Date.now(),
80
+ gates: {}
81
+ });
82
+ const { signal, clear } = withTimeoutAbort(normalized.timeoutMs || 5000);
83
+ try {
84
+ const response = await fetch(endpoint, {
85
+ method: normalized.writeMethod || 'PUT',
86
+ headers: {
87
+ 'content-type': 'application/json',
88
+ ...normalized.headers || {}
89
+ },
90
+ body,
91
+ signal
92
+ });
93
+ if (!response.ok) throw new Error(`HTTP stateStore write failed with status ${String(response.status)}`);
94
+ } finally{
95
+ clear();
96
+ }
97
+ }
98
+ };
99
+ };
100
+ const tryResolveBuiltinSnapshotStore = (input)=>{
101
+ const moduleName = input.stateStore.module.trim();
102
+ if (!BUILTIN_HTTP_STATE_STORE_MODULES.has(moduleName)) return;
103
+ return createHttpContractGateSnapshotStore(input.stateStore.options || {});
104
+ };
105
+ const pickStoreFactory = (mod)=>{
106
+ if ('function' == typeof mod) return mod;
107
+ if ('function' == typeof mod.createContractGateSnapshotStore) return mod.createContractGateSnapshotStore;
108
+ if ('function' == typeof mod.default) return mod.default;
109
+ if (mod.default && 'object' == typeof mod.default && 'function' == typeof mod.default.createContractGateSnapshotStore) return mod.default.createContractGateSnapshotStore;
110
+ };
111
+ const ensureStoreShape = (store, modulePath)=>{
112
+ if (!store || 'object' != typeof store || 'function' != typeof store.readSnapshot || 'function' != typeof store.writeSnapshot) throw new Error(`Invalid contract gate snapshot store from "${modulePath}". Expected { readSnapshot(), writeSnapshot() }.`);
113
+ };
114
+ const resolveStoreModulePath = (appDirectory, modulePath)=>{
115
+ const normalized = modulePath.trim();
116
+ if (!normalized) throw new Error('Contract gate snapshot stateStore.module must be non-empty');
117
+ if (path.isAbsolute(normalized)) return normalized;
118
+ return normalized.startsWith('.') ? path.resolve(appDirectory, normalized) : normalized;
119
+ };
120
+ const resolveContractGateSnapshotPath = (appDirectory, configuredPath)=>{
121
+ const rawPath = configuredPath || process.env.MODERN_CONTRACT_GATES_FILE || DEFAULT_CONTRACT_GATE_SNAPSHOT_PATH;
122
+ if (path.isAbsolute(rawPath)) return rawPath;
123
+ return path.resolve(appDirectory, rawPath);
124
+ };
125
+ const createFileContractGateSnapshotStore = (gateSnapshotPath)=>{
126
+ const resolvedPath = path.resolve(gateSnapshotPath);
127
+ return {
128
+ name: `file:${resolvedPath}`,
129
+ async readSnapshot () {
130
+ if (!await fs.pathExists(resolvedPath)) return;
131
+ try {
132
+ const raw = await promises.readFile(resolvedPath, 'utf8');
133
+ return normalizeSnapshot(JSON.parse(raw));
134
+ } catch (_error) {
135
+ return;
136
+ }
137
+ },
138
+ async writeSnapshot (snapshot) {
139
+ const normalized = normalizeSnapshot(snapshot) || {
140
+ schemaVersion: CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION,
141
+ updatedAt: Date.now(),
142
+ gates: {}
143
+ };
144
+ await promises.mkdir(path.dirname(resolvedPath), {
145
+ recursive: true
146
+ });
147
+ await promises.writeFile(resolvedPath, `${JSON.stringify(normalized, null, 2)}\n`);
148
+ }
149
+ };
150
+ };
151
+ const resolveContractGateSnapshotStore = async (input)=>{
152
+ const { appDirectory, gateSnapshotPath, stateStore, logger } = input;
153
+ if (!stateStore?.module) return createFileContractGateSnapshotStore(gateSnapshotPath);
154
+ const builtinStore = tryResolveBuiltinSnapshotStore({
155
+ stateStore
156
+ });
157
+ if (builtinStore) {
158
+ logger?.info?.(`[telemetry.canary.autopilot] using built-in contract gate snapshot store "${builtinStore.name}"`);
159
+ return builtinStore;
160
+ }
161
+ const modulePath = resolveStoreModulePath(appDirectory, stateStore.module);
162
+ let mod;
163
+ try {
164
+ mod = require(modulePath);
165
+ } catch (error) {
166
+ throw new Error(`[telemetry.canary.autopilot] Failed to load stateStore.module "${stateStore.module}" (${modulePath}): ${error instanceof Error ? error.message : String(error)}`);
167
+ }
168
+ const factory = pickStoreFactory(mod);
169
+ if (!factory) throw new Error(`[telemetry.canary.autopilot] stateStore.module "${stateStore.module}" does not export createContractGateSnapshotStore()`);
170
+ const store = await factory({
171
+ appDirectory,
172
+ gateSnapshotPath,
173
+ options: stateStore.options,
174
+ logger
175
+ });
176
+ ensureStoreShape(store, modulePath);
177
+ logger?.info?.(`[telemetry.canary.autopilot] using contract gate snapshot store "${store.name || modulePath}"`);
178
+ return store;
179
+ };
180
+ export { CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION, DEFAULT_CONTRACT_GATE_SNAPSHOT_PATH, createFileContractGateSnapshotStore, createHttpContractGateSnapshotStore, resolveContractGateSnapshotPath, resolveContractGateSnapshotStore };
@@ -0,0 +1,27 @@
1
+ import { compatPlugin } from "./compat/index.mjs";
2
+ import { logPlugin } from "./log.mjs";
3
+ import { initMonitorsPlugin, injectServerTiming, injectloggerPlugin } from "./monitors.mjs";
4
+ import { processedByPlugin } from "./processedBy.mjs";
5
+ import { injectRenderHandlerPlugin } from "./render/index.mjs";
6
+ import { injectRoutePlugin } from "./route.mjs";
7
+ import { injectTelemetryPlugin } from "./telemetry.mjs";
8
+ function createSilenceLogger() {
9
+ return new Proxy({}, {
10
+ get: ()=>()=>{}
11
+ });
12
+ }
13
+ function createDefaultPlugins(options = {}) {
14
+ const plugins = [
15
+ compatPlugin(),
16
+ logPlugin(),
17
+ initMonitorsPlugin(),
18
+ injectTelemetryPlugin(),
19
+ injectRenderHandlerPlugin(options),
20
+ injectloggerPlugin(options.logger ? options.logger : createSilenceLogger()),
21
+ injectServerTiming(),
22
+ processedByPlugin(),
23
+ injectRoutePlugin()
24
+ ];
25
+ return plugins;
26
+ }
27
+ export { createDefaultPlugins };
@@ -0,0 +1,14 @@
1
+ const faviconPlugin = ()=>({
2
+ name: '@modern-js/plugin-favicon',
3
+ setup (api) {
4
+ api.onPrepare(()=>{
5
+ const { middlewares } = api.getServerContext();
6
+ middlewares.push({
7
+ name: 'favicon-fallback',
8
+ path: '/favicon.ico',
9
+ handler: async (c, _next)=>c.body(null, 204)
10
+ });
11
+ });
12
+ }
13
+ });
14
+ export { faviconPlugin };
@@ -0,0 +1,11 @@
1
+ export { compatPlugin, handleSetupResult } from "./compat/index.mjs";
2
+ export { ContractGateAutopilot } from "./contractGateAutopilot.mjs";
3
+ export { CONTRACT_GATE_SNAPSHOT_SCHEMA_VERSION, DEFAULT_CONTRACT_GATE_SNAPSHOT_PATH, createFileContractGateSnapshotStore, createHttpContractGateSnapshotStore, resolveContractGateSnapshotPath, resolveContractGateSnapshotStore } from "./contractGateSnapshotStore.mjs";
4
+ export { createDefaultPlugins } from "./default.mjs";
5
+ export { faviconPlugin } from "./favicon.mjs";
6
+ export { logPlugin } from "./log.mjs";
7
+ export { injectConfigMiddlewarePlugin } from "./middlewares.mjs";
8
+ export { injectServerTiming, injectloggerPlugin } from "./monitors.mjs";
9
+ export { processedByPlugin } from "./processedBy.mjs";
10
+ export { getRenderHandler, injectRenderHandlerPlugin, renderPlugin } from "./render/index.mjs";
11
+ export { DEFAULT_RUNTIME_FALLBACK_SIGNAL_ENDPOINT, DEFAULT_RUNTIME_STATUS_ENDPOINT, TelemetryCanaryOrchestrator, TelemetryRegistry, TelemetryStartupHealthError, createOtlpTelemetryExporter, createRuntimeFallbackSignalRuntimeState, createRuntimeSignalError, createTelemetryAwareMetrics, createVictoriaMetricsTelemetryExporter, enforceRuntimeFallbackSignalAuthToken, enforceRuntimeFallbackSignalTrustPolicy, getRuntimeSignalErrorStatusCode, hasEnabledTelemetryExporters, injectTelemetryPlugin, normalizeRuntimeFallbackSignalAuthConfig, normalizeRuntimeFallbackTrustPolicy, parseRuntimeFallbackSignalPayloadFromRawBody, resolveRuntimeFallbackSignalEndpoint } from "./telemetry.mjs";
@@ -0,0 +1,58 @@
1
+ import { getPathname } from "../utils/index.mjs";
2
+ const humanize = (times)=>{
3
+ const [delimiter, separator] = [
4
+ ',',
5
+ '.'
6
+ ];
7
+ const orderTimes = times.map((v)=>v.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, `$1${delimiter}`));
8
+ return orderTimes.join(separator);
9
+ };
10
+ const time = (start)=>{
11
+ const delta = Date.now() - start;
12
+ return humanize([
13
+ delta < 1000 ? `${delta}ms` : `${Math.round(delta / 1000)}s`
14
+ ]);
15
+ };
16
+ const colorStatus = (status)=>{
17
+ const out = {
18
+ 7: `\x1b[35m${status}\x1b[0m`,
19
+ 5: `\x1b[31m${status}\x1b[0m`,
20
+ 4: `\x1b[33m${status}\x1b[0m`,
21
+ 3: `\x1b[36m${status}\x1b[0m`,
22
+ 2: `\x1b[32m${status}\x1b[0m`,
23
+ 1: `\x1b[32m${status}\x1b[0m`,
24
+ 0: `\x1b[33m${status}\x1b[0m`
25
+ };
26
+ const calculateStatus = Math.floor(status / 100);
27
+ return out[calculateStatus];
28
+ };
29
+ function log(fn, prefix, method, path, status = 0, elapsed) {
30
+ const out = "<--" === prefix ? ` ${prefix} ${method} ${path}` : ` ${prefix} ${method} ${path} ${colorStatus(status)} ${elapsed}`;
31
+ fn(out);
32
+ }
33
+ function logHandler() {
34
+ return async function(c, next) {
35
+ const { method } = c.req;
36
+ const monitors = c.get('monitors');
37
+ if (!monitors) return void await next();
38
+ const path = getPathname(c.req.raw);
39
+ const logFn = monitors.debug;
40
+ log(logFn, "<--", method, path);
41
+ const start = Date.now();
42
+ await next();
43
+ log(logFn, "-->", method, path, c?.env?.node?.res?.statusCode ?? c.res.status, time(start));
44
+ };
45
+ }
46
+ const logPlugin = ()=>({
47
+ name: '@modern-js/plugin-log',
48
+ setup (api) {
49
+ api.onPrepare(()=>{
50
+ const { middlewares } = api.getServerContext();
51
+ middlewares.push({
52
+ name: 'print_log',
53
+ handler: logHandler()
54
+ });
55
+ });
56
+ }
57
+ });
58
+ export { logPlugin };
@@ -0,0 +1,35 @@
1
+ const REMOTE_ENTRY_REGEXP = /(^|\/)remoteEntry(?:\.[a-zA-Z0-9_-]+)?\.js$/;
2
+ function firstQueryValue(value) {
3
+ if (Array.isArray(value)) return value.find((item)=>'string' == typeof item && item.length > 0);
4
+ if ('string' == typeof value && value.length > 0) return value;
5
+ }
6
+ function getRequestPathname(url) {
7
+ try {
8
+ return new URL(url, 'http://modernjs.local').pathname;
9
+ } catch (_error) {
10
+ return url.split('?')[0] || '/';
11
+ }
12
+ }
13
+ function isMfManifestAsset(pathname) {
14
+ return pathname.endsWith('/mf-manifest.json') || pathname.endsWith('/mf-stats.json');
15
+ }
16
+ function isMfRemoteEntryAsset(pathname) {
17
+ return REMOTE_ENTRY_REGEXP.test(pathname);
18
+ }
19
+ function hasRemoteVersionPin(query = {}) {
20
+ return Boolean(firstQueryValue(query.mfv) || firstQueryValue(query.v) || firstQueryValue(query.version));
21
+ }
22
+ function resolveMfAssetCacheHeaders(url, query = {}) {
23
+ const pathname = getRequestPathname(url);
24
+ if (isMfManifestAsset(pathname)) return {
25
+ 'cache-control': 'no-cache, no-store, must-revalidate',
26
+ pragma: 'no-cache',
27
+ expires: '0'
28
+ };
29
+ if (isMfRemoteEntryAsset(pathname)) return hasRemoteVersionPin(query) ? {
30
+ 'cache-control': 'public, max-age=31536000, immutable'
31
+ } : {
32
+ 'cache-control': 'public, max-age=0, must-revalidate'
33
+ };
34
+ }
35
+ export { getRequestPathname, isMfManifestAsset, isMfRemoteEntryAsset, resolveMfAssetCacheHeaders };
@@ -0,0 +1,15 @@
1
+ const injectConfigMiddlewarePlugin = (configMiddlewares = [], configRenderMiddlewares = [])=>({
2
+ name: '@modern-js/plugin-inject-config-middleware',
3
+ setup (api) {
4
+ api.onPrepare(()=>{
5
+ const { middlewares, renderMiddlewares } = api.getServerContext();
6
+ configMiddlewares.forEach((m)=>{
7
+ middlewares.push(m);
8
+ });
9
+ configRenderMiddlewares.forEach((m)=>{
10
+ renderMiddlewares.push(m);
11
+ });
12
+ });
13
+ }
14
+ });
15
+ export { injectConfigMiddlewarePlugin };
@@ -0,0 +1,149 @@
1
+ import { time } from "@modern-js/runtime-utils/time";
2
+ import { SERVER_TIMING, ServerTimings } from "../constants.mjs";
3
+ function createMonitors() {
4
+ const coreMonitors = [];
5
+ const log = (level, message, args)=>{
6
+ const event = {
7
+ type: 'log',
8
+ payload: {
9
+ level,
10
+ message,
11
+ args
12
+ }
13
+ };
14
+ coreMonitors.forEach((monitor)=>monitor(event));
15
+ };
16
+ const mointors = {
17
+ push (monitor) {
18
+ coreMonitors.push(monitor);
19
+ },
20
+ error (message, ...args) {
21
+ log('error', message, args);
22
+ },
23
+ warn (message, ...args) {
24
+ log('warn', message, args);
25
+ },
26
+ debug (message, ...args) {
27
+ log('debug', message, args);
28
+ },
29
+ info (message, ...args) {
30
+ log('info', message, args);
31
+ },
32
+ trace (message, ...args) {
33
+ log('trace', message, args);
34
+ },
35
+ timing (name, dur, desc, tags, ...args) {
36
+ const event = {
37
+ type: 'timing',
38
+ payload: {
39
+ name,
40
+ dur,
41
+ desc,
42
+ tags,
43
+ args
44
+ }
45
+ };
46
+ coreMonitors.forEach((monitor)=>monitor(event));
47
+ },
48
+ counter (name, tags, ...args) {
49
+ const event = {
50
+ type: 'counter',
51
+ payload: {
52
+ name,
53
+ args,
54
+ tags
55
+ }
56
+ };
57
+ coreMonitors.forEach((monitor)=>monitor(event));
58
+ }
59
+ };
60
+ return mointors;
61
+ }
62
+ const initMonitorsPlugin = ()=>({
63
+ name: '@modern-js/init-mointor',
64
+ setup (api) {
65
+ api.onPrepare(()=>{
66
+ const { middlewares } = api.getServerContext();
67
+ middlewares.push({
68
+ name: 'init-monitor',
69
+ handler: async (c, next)=>{
70
+ if (!c.get('monitors')) {
71
+ const monitors = createMonitors();
72
+ c.set('monitors', monitors);
73
+ }
74
+ return next();
75
+ },
76
+ order: 'pre'
77
+ });
78
+ });
79
+ }
80
+ });
81
+ const injectloggerPlugin = (inputLogger)=>({
82
+ name: '@modern-js/inject-logger',
83
+ setup (api) {
84
+ const logger = inputLogger;
85
+ api.onPrepare(()=>{
86
+ const { middlewares } = api.getServerContext();
87
+ middlewares.push({
88
+ name: 'inject-logger',
89
+ handler: async (c, next)=>{
90
+ const pathname = c.req.path;
91
+ const loggerMonitor = (event)=>{
92
+ if ('log' === event.type) {
93
+ const { level, message, args } = event.payload;
94
+ if ('trace' === level) logger.info(message, ...args || []);
95
+ else logger[level](message, ...args || []);
96
+ }
97
+ if ('timing' === event.type) {
98
+ const { name, dur, desc } = event.payload;
99
+ if (desc) logger.debug(`%s Debug - ${name}, cost: %s, req.url = %s `, desc, dur, pathname);
100
+ else logger.debug(`Debug - ${name}, cost: %s, req.url = %s`, dur, pathname);
101
+ }
102
+ };
103
+ const monitors = c.get('monitors');
104
+ monitors?.push(loggerMonitor);
105
+ return next();
106
+ }
107
+ });
108
+ });
109
+ }
110
+ });
111
+ const injectServerTiming = ()=>({
112
+ name: '@modern-js/inject-server-timing',
113
+ setup (api) {
114
+ api.onPrepare(()=>{
115
+ const { middlewares, metaName } = api.getServerContext();
116
+ middlewares.push({
117
+ name: 'inject-server-timing',
118
+ handler: async (c, next)=>{
119
+ const serverTimings = [];
120
+ const timingMonitor = (event)=>{
121
+ if ('timing' === event.type) serverTimings.push(event.payload);
122
+ };
123
+ const monitors = c.get('monitors');
124
+ monitors?.push(timingMonitor);
125
+ await next();
126
+ serverTimings.forEach((serverTiming)=>{
127
+ const { name, desc, dur } = serverTiming;
128
+ const _name = `bd-${metaName}-${name}`;
129
+ const value = `${_name};${desc ? `decs="${desc}";` : ''} dur=${dur}`;
130
+ c.header(SERVER_TIMING, value, {
131
+ append: true
132
+ });
133
+ });
134
+ }
135
+ });
136
+ });
137
+ }
138
+ });
139
+ function requestLatencyMiddleware() {
140
+ return async (c, next)=>{
141
+ const monitors = c.get('monitors');
142
+ if (!monitors) return void await next();
143
+ const getCost = time();
144
+ await next();
145
+ const cost = getCost();
146
+ monitors.timing(ServerTimings.SERVER_HANDLE_REQUEST, cost);
147
+ };
148
+ }
149
+ export { initMonitorsPlugin, injectServerTiming, injectloggerPlugin, requestLatencyMiddleware };
@@ -0,0 +1,16 @@
1
+ const processedByPlugin = ()=>({
2
+ name: '@modern-js/plugin-processed',
3
+ setup (api) {
4
+ api.onPrepare(()=>{
5
+ const { middlewares } = api.getServerContext();
6
+ middlewares.push({
7
+ name: 'processed-by',
8
+ handler: async (c, next)=>{
9
+ await next();
10
+ c.header('X-Processed-By', 'Modern.js');
11
+ }
12
+ });
13
+ });
14
+ }
15
+ });
16
+ export { processedByPlugin };
@@ -0,0 +1,40 @@
1
+ import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
2
+ import { createRequestHandlerConfig } from "./utils.mjs";
3
+ const csrRscRender = async (req, options)=>{
4
+ const { routeInfo, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, reporter, monitors, onError, onTiming, staticGenerate, html } = options;
5
+ const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
6
+ const loadableStats = serverManifest.loadableStats || {};
7
+ const routeManifest = serverManifest.routeManifest || {};
8
+ const config = createRequestHandlerConfig(options.config);
9
+ const requestHandlerOptions = {
10
+ resource: {
11
+ route: routeInfo,
12
+ loadableStats,
13
+ routeManifest,
14
+ entryName: routeInfo.entryName || MAIN_ENTRY_NAME
15
+ },
16
+ config,
17
+ params,
18
+ loaderContext,
19
+ html,
20
+ rscSSRManifest,
21
+ rscClientManifest,
22
+ rscServerManifest,
23
+ locals,
24
+ staticGenerate,
25
+ monitors,
26
+ onError,
27
+ onTiming,
28
+ reporter: reporter
29
+ };
30
+ if (!serverBundle) return new Response('Cannot find server bundle for RSC', {
31
+ status: 500
32
+ });
33
+ const renderRscStreamHandler = await serverBundle.renderRscStreamHandler;
34
+ if (!renderRscStreamHandler) return new Response('Cannot find render handler for RSC', {
35
+ status: 500
36
+ });
37
+ const response = await renderRscStreamHandler(req, requestHandlerOptions);
38
+ return response;
39
+ };
40
+ export { csrRscRender };
@@ -0,0 +1,19 @@
1
+ import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
2
+ const dataHandler = async (request, { routeInfo, serverRoutes, monitors, onError, onTiming, serverManifest, loaderContext })=>{
3
+ const serverLoaderModule = serverManifest?.loaderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
4
+ if (!serverLoaderModule) return;
5
+ const { routes, handleRequest } = serverLoaderModule;
6
+ const response = await handleRequest({
7
+ request,
8
+ serverRoutes,
9
+ context: {
10
+ monitors,
11
+ loaderContext
12
+ },
13
+ onTiming,
14
+ onError,
15
+ routes
16
+ });
17
+ return response;
18
+ };
19
+ export { dataHandler };
@@ -0,0 +1,84 @@
1
+ import { getLoaderCtx } from "../../helper.mjs";
2
+ import { sortRoutes } from "../../utils/index.mjs";
3
+ import { requestLatencyMiddleware } from "../monitors.mjs";
4
+ export * from "./inject.mjs";
5
+ const DYNAMIC_ROUTE_REG = /\/:./;
6
+ function escapeRegexSpecialChars(path) {
7
+ return path.replace(/[()[\]{}*+?.^$|\\]/g, '\\$&');
8
+ }
9
+ const renderPlugin = ()=>({
10
+ name: '@modern-js/plugin-render',
11
+ setup (api) {
12
+ api.onPrepare(async ()=>{
13
+ const { middlewares, routes, render, renderMiddlewares } = api.getServerContext();
14
+ if (!routes) return;
15
+ const pageRoutes = getPageRoutes(routes);
16
+ middlewares.push({
17
+ name: 'page-latency',
18
+ handler: requestLatencyMiddleware()
19
+ });
20
+ for (const route of pageRoutes){
21
+ const { urlPath: originUrlPath } = route;
22
+ const isDynamic = DYNAMIC_ROUTE_REG.test(originUrlPath);
23
+ const escapedPath = isDynamic ? originUrlPath : escapeRegexSpecialChars(originUrlPath);
24
+ const urlPath = escapedPath.endsWith('/') ? `${escapedPath}*` : `${escapedPath}/*`;
25
+ renderMiddlewares?.forEach((m)=>{
26
+ middlewares.push({
27
+ name: m.name,
28
+ path: urlPath,
29
+ handler: m.handler
30
+ });
31
+ });
32
+ render && middlewares.push({
33
+ name: "render",
34
+ path: urlPath,
35
+ handler: createRenderHandler(render)
36
+ });
37
+ }
38
+ });
39
+ }
40
+ });
41
+ function getPageRoutes(routes) {
42
+ return routes.filter((route)=>!route.isApi).sort(sortRoutes);
43
+ }
44
+ function createRenderHandler(render) {
45
+ return async (c, _)=>{
46
+ const reporter = c.get('reporter');
47
+ const monitors = c.get('monitors');
48
+ const templates = c.get('templates') || {};
49
+ const serverManifest = c.get('serverManifest') || {};
50
+ const rscServerManifest = c.get('rscServerManifest');
51
+ const rscClientManifest = c.get('rscClientManifest');
52
+ const rscSSRManifest = c.get('rscSSRManifest');
53
+ const locals = c.get('locals');
54
+ c.get('metrics');
55
+ const matchPathname = c.get('matchPathname');
56
+ const matchEntryName = c.get('matchEntryName');
57
+ const loaderContext = getLoaderCtx(c);
58
+ const contextForceCSR = c.get('forceCSR');
59
+ const request = c.req.raw;
60
+ const nodeReq = c.env.node?.req;
61
+ const res = await render(request, {
62
+ nodeReq,
63
+ monitors,
64
+ templates,
65
+ serverManifest,
66
+ rscServerManifest,
67
+ rscClientManifest,
68
+ rscSSRManifest,
69
+ loaderContext,
70
+ locals,
71
+ matchPathname,
72
+ matchEntryName,
73
+ contextForceCSR,
74
+ reporter
75
+ });
76
+ const { body, status, headers } = res;
77
+ const headersData = {};
78
+ headers.forEach((v, k)=>{
79
+ headersData[k] = v;
80
+ });
81
+ return c.body(body, status, headersData);
82
+ };
83
+ }
84
+ export { renderPlugin };