threadforge 0.1.1 → 0.2.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 (358) hide show
  1. package/README.md +52 -20
  2. package/bin/forge.js +2 -1058
  3. package/bin/host-commands.d.ts +2 -0
  4. package/bin/host-commands.d.ts.map +1 -0
  5. package/bin/host-commands.js +7 -8
  6. package/bin/platform-commands.d.ts +2 -0
  7. package/bin/platform-commands.d.ts.map +1 -0
  8. package/bin/platform-commands.js +118 -36
  9. package/dist/cli/base-command.d.ts +12 -0
  10. package/dist/cli/base-command.d.ts.map +1 -0
  11. package/dist/cli/base-command.js +25 -0
  12. package/dist/cli/base-command.js.map +1 -0
  13. package/dist/cli/commands/build.d.ts +10 -0
  14. package/dist/cli/commands/build.d.ts.map +1 -0
  15. package/dist/cli/commands/build.js +110 -0
  16. package/dist/cli/commands/build.js.map +1 -0
  17. package/dist/cli/commands/deploy.d.ts +12 -0
  18. package/dist/cli/commands/deploy.d.ts.map +1 -0
  19. package/dist/cli/commands/deploy.js +143 -0
  20. package/dist/cli/commands/deploy.js.map +1 -0
  21. package/dist/cli/commands/dev.d.ts +10 -0
  22. package/dist/cli/commands/dev.d.ts.map +1 -0
  23. package/dist/cli/commands/dev.js +138 -0
  24. package/dist/cli/commands/dev.js.map +1 -0
  25. package/dist/cli/commands/generate.d.ts +10 -0
  26. package/dist/cli/commands/generate.d.ts.map +1 -0
  27. package/dist/cli/commands/generate.js +76 -0
  28. package/dist/cli/commands/generate.js.map +1 -0
  29. package/dist/cli/commands/host.d.ts +8 -0
  30. package/dist/cli/commands/host.d.ts.map +1 -0
  31. package/dist/cli/commands/host.js +20 -0
  32. package/dist/cli/commands/host.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +16 -0
  34. package/dist/cli/commands/init.d.ts.map +1 -0
  35. package/dist/cli/commands/init.js +246 -0
  36. package/dist/cli/commands/init.js.map +1 -0
  37. package/dist/cli/commands/platform.d.ts +8 -0
  38. package/dist/cli/commands/platform.d.ts.map +1 -0
  39. package/dist/cli/commands/platform.js +20 -0
  40. package/dist/cli/commands/platform.js.map +1 -0
  41. package/dist/cli/commands/restart.d.ts +8 -0
  42. package/dist/cli/commands/restart.d.ts.map +1 -0
  43. package/dist/cli/commands/restart.js +13 -0
  44. package/dist/cli/commands/restart.js.map +1 -0
  45. package/dist/cli/commands/scaffold/frontend.d.ts +10 -0
  46. package/dist/cli/commands/scaffold/frontend.d.ts.map +1 -0
  47. package/dist/cli/commands/scaffold/frontend.js +130 -0
  48. package/dist/cli/commands/scaffold/frontend.js.map +1 -0
  49. package/dist/cli/commands/scaffold/react.d.ts +7 -0
  50. package/dist/cli/commands/scaffold/react.d.ts.map +1 -0
  51. package/dist/cli/commands/scaffold/react.js +12 -0
  52. package/dist/cli/commands/scaffold/react.js.map +1 -0
  53. package/dist/cli/commands/scale.d.ts +8 -0
  54. package/dist/cli/commands/scale.d.ts.map +1 -0
  55. package/dist/cli/commands/scale.js +13 -0
  56. package/dist/cli/commands/scale.js.map +1 -0
  57. package/dist/cli/commands/start.d.ts +10 -0
  58. package/dist/cli/commands/start.d.ts.map +1 -0
  59. package/dist/cli/commands/start.js +71 -0
  60. package/dist/cli/commands/start.js.map +1 -0
  61. package/dist/cli/commands/status.d.ts +11 -0
  62. package/dist/cli/commands/status.d.ts.map +1 -0
  63. package/dist/cli/commands/status.js +60 -0
  64. package/dist/cli/commands/status.js.map +1 -0
  65. package/dist/cli/commands/stop.d.ts +10 -0
  66. package/dist/cli/commands/stop.d.ts.map +1 -0
  67. package/dist/cli/commands/stop.js +89 -0
  68. package/dist/cli/commands/stop.js.map +1 -0
  69. package/dist/cli/util/config-discovery.d.ts +8 -0
  70. package/dist/cli/util/config-discovery.d.ts.map +1 -0
  71. package/dist/cli/util/config-discovery.js +70 -0
  72. package/dist/cli/util/config-discovery.js.map +1 -0
  73. package/dist/cli/util/config-patcher.d.ts +17 -0
  74. package/dist/cli/util/config-patcher.d.ts.map +1 -0
  75. package/dist/cli/util/config-patcher.js +439 -0
  76. package/dist/cli/util/config-patcher.js.map +1 -0
  77. package/dist/cli/util/frontend-dev.d.ts +8 -0
  78. package/dist/cli/util/frontend-dev.d.ts.map +1 -0
  79. package/dist/cli/util/frontend-dev.js +117 -0
  80. package/dist/cli/util/frontend-dev.js.map +1 -0
  81. package/dist/cli/util/process.d.ts +5 -0
  82. package/dist/cli/util/process.d.ts.map +1 -0
  83. package/dist/cli/util/process.js +17 -0
  84. package/dist/cli/util/process.js.map +1 -0
  85. package/dist/cli/util/templates.d.ts +10 -0
  86. package/dist/cli/util/templates.d.ts.map +1 -0
  87. package/dist/cli/util/templates.js +157 -0
  88. package/dist/cli/util/templates.js.map +1 -0
  89. package/dist/core/AlertSink.d.ts +83 -0
  90. package/dist/core/AlertSink.d.ts.map +1 -0
  91. package/dist/core/AlertSink.js +126 -0
  92. package/dist/core/AlertSink.js.map +1 -0
  93. package/dist/core/DirectMessageBus.d.ts +88 -0
  94. package/dist/core/DirectMessageBus.d.ts.map +1 -0
  95. package/dist/core/DirectMessageBus.js +352 -0
  96. package/dist/core/DirectMessageBus.js.map +1 -0
  97. package/dist/core/EndpointResolver.d.ts +111 -0
  98. package/dist/core/EndpointResolver.d.ts.map +1 -0
  99. package/dist/core/EndpointResolver.js +336 -0
  100. package/dist/core/EndpointResolver.js.map +1 -0
  101. package/dist/core/ForgeContext.d.ts +221 -0
  102. package/dist/core/ForgeContext.d.ts.map +1 -0
  103. package/dist/core/ForgeContext.js +1169 -0
  104. package/dist/core/ForgeContext.js.map +1 -0
  105. package/dist/core/ForgeEndpoints.d.ts +71 -0
  106. package/dist/core/ForgeEndpoints.d.ts.map +1 -0
  107. package/dist/core/ForgeEndpoints.js +442 -0
  108. package/dist/core/ForgeEndpoints.js.map +1 -0
  109. package/dist/core/ForgeHost.d.ts +82 -0
  110. package/dist/core/ForgeHost.d.ts.map +1 -0
  111. package/dist/core/ForgeHost.js +107 -0
  112. package/dist/core/ForgeHost.js.map +1 -0
  113. package/dist/core/ForgePlatform.d.ts +96 -0
  114. package/dist/core/ForgePlatform.d.ts.map +1 -0
  115. package/dist/core/ForgePlatform.js +136 -0
  116. package/dist/core/ForgePlatform.js.map +1 -0
  117. package/dist/core/ForgeWebSocket.d.ts +56 -0
  118. package/dist/core/ForgeWebSocket.d.ts.map +1 -0
  119. package/dist/core/ForgeWebSocket.js +415 -0
  120. package/dist/core/ForgeWebSocket.js.map +1 -0
  121. package/dist/core/Ingress.d.ts +329 -0
  122. package/dist/core/Ingress.d.ts.map +1 -0
  123. package/dist/core/Ingress.js +694 -0
  124. package/dist/core/Ingress.js.map +1 -0
  125. package/dist/core/Interceptors.d.ts +134 -0
  126. package/dist/core/Interceptors.d.ts.map +1 -0
  127. package/dist/core/Interceptors.js +416 -0
  128. package/dist/core/Interceptors.js.map +1 -0
  129. package/dist/core/Logger.d.ts +20 -0
  130. package/dist/core/Logger.d.ts.map +1 -0
  131. package/dist/core/Logger.js +77 -0
  132. package/dist/core/Logger.js.map +1 -0
  133. package/dist/core/MessageBus.d.ts +15 -0
  134. package/dist/core/MessageBus.d.ts.map +1 -0
  135. package/dist/core/MessageBus.js +18 -0
  136. package/dist/core/MessageBus.js.map +1 -0
  137. package/dist/core/Prometheus.d.ts +80 -0
  138. package/dist/core/Prometheus.d.ts.map +1 -0
  139. package/dist/core/Prometheus.js +332 -0
  140. package/dist/core/Prometheus.js.map +1 -0
  141. package/dist/core/RequestContext.d.ts +214 -0
  142. package/dist/core/RequestContext.d.ts.map +1 -0
  143. package/dist/core/RequestContext.js +556 -0
  144. package/dist/core/RequestContext.js.map +1 -0
  145. package/dist/core/Router.d.ts +45 -0
  146. package/dist/core/Router.d.ts.map +1 -0
  147. package/dist/core/Router.js +285 -0
  148. package/dist/core/Router.js.map +1 -0
  149. package/dist/core/RoutingStrategy.d.ts +116 -0
  150. package/dist/core/RoutingStrategy.d.ts.map +1 -0
  151. package/dist/core/RoutingStrategy.js +306 -0
  152. package/dist/core/RoutingStrategy.js.map +1 -0
  153. package/dist/core/RpcConfig.d.ts +72 -0
  154. package/dist/core/RpcConfig.d.ts.map +1 -0
  155. package/dist/core/RpcConfig.js +127 -0
  156. package/dist/core/RpcConfig.js.map +1 -0
  157. package/dist/core/SignatureCache.d.ts +81 -0
  158. package/dist/core/SignatureCache.d.ts.map +1 -0
  159. package/dist/core/SignatureCache.js +172 -0
  160. package/dist/core/SignatureCache.js.map +1 -0
  161. package/dist/core/StaticFileServer.d.ts +34 -0
  162. package/dist/core/StaticFileServer.d.ts.map +1 -0
  163. package/dist/core/StaticFileServer.js +497 -0
  164. package/dist/core/StaticFileServer.js.map +1 -0
  165. package/dist/core/Supervisor.d.ts +198 -0
  166. package/dist/core/Supervisor.d.ts.map +1 -0
  167. package/dist/core/Supervisor.js +1418 -0
  168. package/dist/core/Supervisor.js.map +1 -0
  169. package/dist/core/ThreadAllocator.d.ts +52 -0
  170. package/dist/core/ThreadAllocator.d.ts.map +1 -0
  171. package/dist/core/ThreadAllocator.js +174 -0
  172. package/dist/core/ThreadAllocator.js.map +1 -0
  173. package/dist/core/WorkerChannelManager.d.ts +130 -0
  174. package/dist/core/WorkerChannelManager.d.ts.map +1 -0
  175. package/dist/core/WorkerChannelManager.js +956 -0
  176. package/dist/core/WorkerChannelManager.js.map +1 -0
  177. package/dist/core/config-enums.d.ts +41 -0
  178. package/dist/core/config-enums.d.ts.map +1 -0
  179. package/dist/core/config-enums.js +59 -0
  180. package/dist/core/config-enums.js.map +1 -0
  181. package/dist/core/config.d.ts +159 -0
  182. package/dist/core/config.d.ts.map +1 -0
  183. package/dist/core/config.js +694 -0
  184. package/dist/core/config.js.map +1 -0
  185. package/dist/core/host-config.d.ts +146 -0
  186. package/dist/core/host-config.d.ts.map +1 -0
  187. package/dist/core/host-config.js +312 -0
  188. package/dist/core/host-config.js.map +1 -0
  189. package/dist/core/ipc-errors.d.ts +27 -0
  190. package/dist/core/ipc-errors.d.ts.map +1 -0
  191. package/dist/core/ipc-errors.js +36 -0
  192. package/dist/core/ipc-errors.js.map +1 -0
  193. package/dist/core/network-utils.d.ts +35 -0
  194. package/dist/core/network-utils.d.ts.map +1 -0
  195. package/dist/core/network-utils.js +145 -0
  196. package/dist/core/network-utils.js.map +1 -0
  197. package/dist/core/platform-config.d.ts +142 -0
  198. package/dist/core/platform-config.d.ts.map +1 -0
  199. package/dist/core/platform-config.js +299 -0
  200. package/dist/core/platform-config.js.map +1 -0
  201. package/dist/decorators/ServiceProxy.d.ts +175 -0
  202. package/dist/decorators/ServiceProxy.d.ts.map +1 -0
  203. package/dist/decorators/ServiceProxy.js +969 -0
  204. package/dist/decorators/ServiceProxy.js.map +1 -0
  205. package/dist/decorators/index.d.ts +146 -0
  206. package/dist/decorators/index.d.ts.map +1 -0
  207. package/dist/decorators/index.js +545 -0
  208. package/dist/decorators/index.js.map +1 -0
  209. package/dist/deploy/NginxGenerator.d.ts +165 -0
  210. package/dist/deploy/NginxGenerator.d.ts.map +1 -0
  211. package/dist/deploy/NginxGenerator.js +781 -0
  212. package/dist/deploy/NginxGenerator.js.map +1 -0
  213. package/dist/deploy/PlatformManifestGenerator.d.ts +43 -0
  214. package/dist/deploy/PlatformManifestGenerator.d.ts.map +1 -0
  215. package/dist/deploy/PlatformManifestGenerator.js +80 -0
  216. package/dist/deploy/PlatformManifestGenerator.js.map +1 -0
  217. package/dist/deploy/RouteManifestGenerator.d.ts +42 -0
  218. package/dist/deploy/RouteManifestGenerator.d.ts.map +1 -0
  219. package/dist/deploy/RouteManifestGenerator.js +105 -0
  220. package/dist/deploy/RouteManifestGenerator.js.map +1 -0
  221. package/dist/deploy/index.d.ts +210 -0
  222. package/dist/deploy/index.d.ts.map +1 -0
  223. package/dist/deploy/index.js +918 -0
  224. package/dist/deploy/index.js.map +1 -0
  225. package/dist/frontend/FrontendDevLifecycle.d.ts +26 -0
  226. package/dist/frontend/FrontendDevLifecycle.d.ts.map +1 -0
  227. package/dist/frontend/FrontendDevLifecycle.js +60 -0
  228. package/dist/frontend/FrontendDevLifecycle.js.map +1 -0
  229. package/dist/frontend/FrontendPluginOrchestrator.d.ts +64 -0
  230. package/dist/frontend/FrontendPluginOrchestrator.d.ts.map +1 -0
  231. package/dist/frontend/FrontendPluginOrchestrator.js +167 -0
  232. package/dist/frontend/FrontendPluginOrchestrator.js.map +1 -0
  233. package/dist/frontend/SiteResolver.d.ts +33 -0
  234. package/dist/frontend/SiteResolver.d.ts.map +1 -0
  235. package/dist/frontend/SiteResolver.js +53 -0
  236. package/dist/frontend/SiteResolver.js.map +1 -0
  237. package/dist/frontend/StaticMountRegistry.d.ts +36 -0
  238. package/dist/frontend/StaticMountRegistry.d.ts.map +1 -0
  239. package/dist/frontend/StaticMountRegistry.js +94 -0
  240. package/dist/frontend/StaticMountRegistry.js.map +1 -0
  241. package/dist/frontend/index.d.ts +7 -0
  242. package/dist/frontend/index.d.ts.map +1 -0
  243. package/{src → dist}/frontend/index.js +4 -2
  244. package/dist/frontend/index.js.map +1 -0
  245. package/dist/frontend/pathUtils.d.ts +8 -0
  246. package/dist/frontend/pathUtils.d.ts.map +1 -0
  247. package/dist/frontend/pathUtils.js +17 -0
  248. package/dist/frontend/pathUtils.js.map +1 -0
  249. package/dist/frontend/plugins/index.d.ts +2 -0
  250. package/dist/frontend/plugins/index.d.ts.map +1 -0
  251. package/{src → dist}/frontend/plugins/index.js +1 -1
  252. package/dist/frontend/plugins/index.js.map +1 -0
  253. package/dist/frontend/plugins/viteFrontend.d.ts +51 -0
  254. package/dist/frontend/plugins/viteFrontend.d.ts.map +1 -0
  255. package/dist/frontend/plugins/viteFrontend.js +134 -0
  256. package/dist/frontend/plugins/viteFrontend.js.map +1 -0
  257. package/dist/frontend/types.d.ts +25 -0
  258. package/dist/frontend/types.d.ts.map +1 -0
  259. package/dist/frontend/types.js +2 -0
  260. package/dist/frontend/types.js.map +1 -0
  261. package/dist/index.d.ts +17 -0
  262. package/dist/index.d.ts.map +1 -0
  263. package/dist/index.js +32 -0
  264. package/dist/index.js.map +1 -0
  265. package/dist/internals.d.ts +21 -0
  266. package/dist/internals.d.ts.map +1 -0
  267. package/{src → dist}/internals.js +12 -14
  268. package/dist/internals.js.map +1 -0
  269. package/dist/plugins/PluginManager.d.ts +209 -0
  270. package/dist/plugins/PluginManager.d.ts.map +1 -0
  271. package/dist/plugins/PluginManager.js +365 -0
  272. package/dist/plugins/PluginManager.js.map +1 -0
  273. package/dist/plugins/ScopedPostgres.d.ts +78 -0
  274. package/dist/plugins/ScopedPostgres.d.ts.map +1 -0
  275. package/dist/plugins/ScopedPostgres.js +190 -0
  276. package/dist/plugins/ScopedPostgres.js.map +1 -0
  277. package/dist/plugins/ScopedRedis.d.ts +88 -0
  278. package/dist/plugins/ScopedRedis.d.ts.map +1 -0
  279. package/dist/plugins/ScopedRedis.js +169 -0
  280. package/dist/plugins/ScopedRedis.js.map +1 -0
  281. package/dist/plugins/index.d.ts +289 -0
  282. package/dist/plugins/index.d.ts.map +1 -0
  283. package/dist/plugins/index.js +1942 -0
  284. package/dist/plugins/index.js.map +1 -0
  285. package/dist/plugins/types.d.ts +59 -0
  286. package/dist/plugins/types.d.ts.map +1 -0
  287. package/dist/plugins/types.js +2 -0
  288. package/dist/plugins/types.js.map +1 -0
  289. package/dist/registry/ServiceRegistry.d.ts +305 -0
  290. package/dist/registry/ServiceRegistry.d.ts.map +1 -0
  291. package/dist/registry/ServiceRegistry.js +735 -0
  292. package/dist/registry/ServiceRegistry.js.map +1 -0
  293. package/dist/scaling/ScaleAdvisor.d.ts +214 -0
  294. package/dist/scaling/ScaleAdvisor.d.ts.map +1 -0
  295. package/dist/scaling/ScaleAdvisor.js +526 -0
  296. package/dist/scaling/ScaleAdvisor.js.map +1 -0
  297. package/dist/services/Service.d.ts +164 -0
  298. package/dist/services/Service.d.ts.map +1 -0
  299. package/dist/services/Service.js +106 -0
  300. package/dist/services/Service.js.map +1 -0
  301. package/dist/services/worker-bootstrap.d.ts +15 -0
  302. package/dist/services/worker-bootstrap.d.ts.map +1 -0
  303. package/dist/services/worker-bootstrap.js +744 -0
  304. package/dist/services/worker-bootstrap.js.map +1 -0
  305. package/dist/templates/auth-service.d.ts +42 -0
  306. package/dist/templates/auth-service.d.ts.map +1 -0
  307. package/dist/templates/auth-service.js +54 -0
  308. package/dist/templates/auth-service.js.map +1 -0
  309. package/dist/templates/identity-service.d.ts +50 -0
  310. package/dist/templates/identity-service.d.ts.map +1 -0
  311. package/dist/templates/identity-service.js +62 -0
  312. package/dist/templates/identity-service.js.map +1 -0
  313. package/dist/types/contract.d.ts +120 -0
  314. package/dist/types/contract.d.ts.map +1 -0
  315. package/dist/types/contract.js +69 -0
  316. package/dist/types/contract.js.map +1 -0
  317. package/package.json +78 -20
  318. package/src/core/DirectMessageBus.js +0 -364
  319. package/src/core/EndpointResolver.js +0 -259
  320. package/src/core/ForgeContext.js +0 -2236
  321. package/src/core/ForgeHost.js +0 -122
  322. package/src/core/ForgePlatform.js +0 -145
  323. package/src/core/Ingress.js +0 -768
  324. package/src/core/Interceptors.js +0 -420
  325. package/src/core/MessageBus.js +0 -321
  326. package/src/core/Prometheus.js +0 -305
  327. package/src/core/RequestContext.js +0 -413
  328. package/src/core/RoutingStrategy.js +0 -330
  329. package/src/core/Supervisor.js +0 -1349
  330. package/src/core/ThreadAllocator.js +0 -196
  331. package/src/core/WorkerChannelManager.js +0 -879
  332. package/src/core/config.js +0 -637
  333. package/src/core/host-config.js +0 -311
  334. package/src/core/network-utils.js +0 -166
  335. package/src/core/platform-config.js +0 -308
  336. package/src/decorators/ServiceProxy.js +0 -904
  337. package/src/decorators/index.js +0 -571
  338. package/src/deploy/NginxGenerator.js +0 -865
  339. package/src/deploy/PlatformManifestGenerator.js +0 -96
  340. package/src/deploy/RouteManifestGenerator.js +0 -112
  341. package/src/deploy/index.js +0 -984
  342. package/src/frontend/FrontendDevLifecycle.js +0 -65
  343. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  344. package/src/frontend/SiteResolver.js +0 -63
  345. package/src/frontend/StaticMountRegistry.js +0 -90
  346. package/src/frontend/plugins/viteFrontend.js +0 -79
  347. package/src/frontend/types.js +0 -35
  348. package/src/index.js +0 -58
  349. package/src/plugins/PluginManager.js +0 -537
  350. package/src/plugins/ScopedPostgres.js +0 -192
  351. package/src/plugins/ScopedRedis.js +0 -142
  352. package/src/plugins/index.js +0 -1756
  353. package/src/registry/ServiceRegistry.js +0 -797
  354. package/src/scaling/ScaleAdvisor.js +0 -442
  355. package/src/services/Service.js +0 -195
  356. package/src/services/worker-bootstrap.js +0 -679
  357. package/src/templates/auth-service.js +0 -65
  358. package/src/templates/identity-service.js +0 -75
@@ -0,0 +1,497 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { Readable } from "node:stream";
4
+ import { createBrotliCompress, createGzip, constants as zlibConstants } from "node:zlib";
5
+ const EXTENSION_TO_MIME = Object.freeze({
6
+ ".html": "text/html; charset=utf-8",
7
+ ".css": "text/css; charset=utf-8",
8
+ ".js": "application/javascript; charset=utf-8",
9
+ ".mjs": "application/javascript; charset=utf-8",
10
+ ".cjs": "application/javascript; charset=utf-8",
11
+ ".json": "application/json; charset=utf-8",
12
+ ".map": "application/json; charset=utf-8",
13
+ ".svg": "image/svg+xml",
14
+ ".png": "image/png",
15
+ ".jpg": "image/jpeg",
16
+ ".jpeg": "image/jpeg",
17
+ ".gif": "image/gif",
18
+ ".webp": "image/webp",
19
+ ".avif": "image/avif",
20
+ ".ico": "image/x-icon",
21
+ ".txt": "text/plain; charset=utf-8",
22
+ ".xml": "application/xml; charset=utf-8",
23
+ ".woff": "font/woff",
24
+ ".woff2": "font/woff2",
25
+ ".ttf": "font/ttf",
26
+ ".otf": "font/otf",
27
+ ".mp4": "video/mp4",
28
+ ".webm": "video/webm",
29
+ ".ogg": "application/ogg",
30
+ ".mp3": "audio/mpeg",
31
+ ".wav": "audio/wav",
32
+ ".wasm": "application/wasm",
33
+ ".pdf": "application/pdf",
34
+ ".jsx": "text/jsx",
35
+ ".tsx": "text/tsx",
36
+ ".md": "text/markdown",
37
+ ".yaml": "text/yaml",
38
+ ".yml": "text/yaml",
39
+ ".webmanifest": "application/manifest+json",
40
+ });
41
+ // Extensions that are already compressed — skip runtime re-compression
42
+ const SKIP_COMPRESSION_EXT = new Set([
43
+ ".br",
44
+ ".gz",
45
+ ".zst",
46
+ ".png",
47
+ ".jpg",
48
+ ".jpeg",
49
+ ".gif",
50
+ ".webp",
51
+ ".avif",
52
+ ".ico",
53
+ ".mp4",
54
+ ".webm",
55
+ ".ogg",
56
+ ".mp3",
57
+ ".wav",
58
+ ".woff",
59
+ ".woff2",
60
+ ".wasm",
61
+ ".pdf",
62
+ ".zip",
63
+ ]);
64
+ const HOP_BY_HOP_HEADERS = new Set([
65
+ "connection",
66
+ "keep-alive",
67
+ "proxy-authenticate",
68
+ "proxy-authorization",
69
+ "te",
70
+ "trailer",
71
+ "transfer-encoding",
72
+ "upgrade",
73
+ ]);
74
+ export class StaticFileServer {
75
+ _staticRegistry;
76
+ _logger;
77
+ _metrics;
78
+ constructor(options) {
79
+ this._staticRegistry = options.staticRegistry;
80
+ this._logger = options.logger;
81
+ this._metrics = options.metrics;
82
+ }
83
+ resolveMountForRequest(req, pathname) {
84
+ const hostHeader = (req.headers.host ?? "").toLowerCase();
85
+ const host = hostHeader.includes(":") ? hostHeader.split(":")[0] : hostHeader;
86
+ return this._staticRegistry.resolve(host, pathname);
87
+ }
88
+ async tryServeStatic(req, res, start) {
89
+ if (req.method !== "GET" && req.method !== "HEAD")
90
+ return false;
91
+ const requestUrl = new URL(req.url, "http://localhost");
92
+ const pathname = requestUrl.pathname;
93
+ const mount = this.resolveMountForRequest(req, pathname);
94
+ if (!mount)
95
+ return false;
96
+ if (mount.devProxyTarget) {
97
+ const proxied = await this._proxyStaticToDevServer(req, res, mount, start);
98
+ if (proxied)
99
+ return true;
100
+ }
101
+ const resolved = this._resolveStaticFile(mount.dir, mount.relativePath);
102
+ if (!resolved.ok) {
103
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
104
+ method: req.method,
105
+ route: `static:${mount.siteId ?? "unknown"}`,
106
+ status: 403,
107
+ });
108
+ res.writeHead(403, { "Content-Type": "text/plain" });
109
+ res.end("Forbidden");
110
+ return true;
111
+ }
112
+ const mountRoot = path.resolve(mount.dir);
113
+ let fileResult = await this._resolveExistingStaticFile(resolved.filePath, mountRoot);
114
+ // DX M2: Configurable SPA exclusion prefixes via mount.spaExclude (default: ['/api/'])
115
+ const spaExclude = mount.spaExclude ?? ["/api/"];
116
+ const isSpaExcluded = spaExclude.some((prefix) => pathname.startsWith(prefix));
117
+ if (!fileResult && mount.spaFallback && !isSpaExcluded) {
118
+ fileResult = await this._resolveExistingStaticFile(path.resolve(mount.dir, "index.html"), mountRoot);
119
+ }
120
+ if (!fileResult)
121
+ return false;
122
+ const { filePath, stat } = fileResult;
123
+ const extension = path.extname(filePath).toLowerCase();
124
+ const contentType = EXTENSION_TO_MIME[extension] ?? "application/octet-stream";
125
+ const cacheControl = this._staticCacheControl(mount, filePath);
126
+ const routeLabel = `static:${mount.siteId ?? "unknown"}`;
127
+ // ETag: hex(mtime_ms)-hex(size) — stable and cheap to compute
128
+ const etag = `"${stat.mtimeMs.toString(16)}-${stat.size.toString(16)}"`;
129
+ const lastModified = stat.mtime.toUTCString();
130
+ res.setHeader("Content-Type", contentType);
131
+ res.setHeader("Cache-Control", cacheControl);
132
+ res.setHeader("ETag", etag);
133
+ res.setHeader("Last-Modified", lastModified);
134
+ res.setHeader("Accept-Ranges", "bytes");
135
+ // Override global CSP with mount-specific CSP when configured
136
+ if (mount.csp) {
137
+ res.setHeader("Content-Security-Policy", mount.csp);
138
+ }
139
+ // 304 Not Modified — check If-None-Match (ETag) first, then If-Modified-Since
140
+ const ifNoneMatch = req.headers["if-none-match"];
141
+ if (ifNoneMatch && ifNoneMatch === etag) {
142
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
143
+ method: req.method,
144
+ route: routeLabel,
145
+ status: 304,
146
+ });
147
+ res.writeHead(304);
148
+ res.end();
149
+ return true;
150
+ }
151
+ const ifModifiedSince = req.headers["if-modified-since"];
152
+ if (!ifNoneMatch && ifModifiedSince) {
153
+ const clientDate = new Date(ifModifiedSince);
154
+ if (!Number.isNaN(clientDate.getTime()) && stat.mtime <= clientDate) {
155
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
156
+ method: req.method,
157
+ route: routeLabel,
158
+ status: 304,
159
+ });
160
+ res.writeHead(304);
161
+ res.end();
162
+ return true;
163
+ }
164
+ }
165
+ const finishMetrics = () => {
166
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
167
+ method: req.method,
168
+ route: routeLabel,
169
+ status: res.statusCode || 200,
170
+ });
171
+ res.removeListener("finish", finishMetrics);
172
+ };
173
+ res.on("finish", finishMetrics);
174
+ // Range request support (single ranges only)
175
+ const rangeHeader = req.headers.range;
176
+ if (rangeHeader && req.method === "GET") {
177
+ const rangeResult = this._parseRange(rangeHeader, stat.size);
178
+ if (rangeResult) {
179
+ const { start: rangeStart, end: rangeEnd } = rangeResult;
180
+ const contentLength = rangeEnd - rangeStart + 1;
181
+ res.setHeader("Content-Range", `bytes ${rangeStart}-${rangeEnd}/${stat.size}`);
182
+ res.setHeader("Content-Length", contentLength);
183
+ await new Promise((resolve, reject) => {
184
+ const stream = fs.createReadStream(filePath, { start: rangeStart, end: rangeEnd });
185
+ stream.on("error", (err) => {
186
+ if (res.headersSent) {
187
+ res.destroy();
188
+ }
189
+ else {
190
+ res.writeHead(500, { "Content-Type": "text/plain" });
191
+ res.end("Internal server error");
192
+ }
193
+ reject(err);
194
+ });
195
+ stream.on("open", () => {
196
+ if (!res.headersSent)
197
+ res.writeHead(206);
198
+ });
199
+ stream.on("end", resolve);
200
+ stream.pipe(res);
201
+ });
202
+ return true;
203
+ }
204
+ // Unsatisfiable range
205
+ res.setHeader("Content-Range", `bytes */${stat.size}`);
206
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
207
+ method: req.method,
208
+ route: routeLabel,
209
+ status: 416,
210
+ });
211
+ res.writeHead(416);
212
+ res.end();
213
+ return true;
214
+ }
215
+ // Compression negotiation — skip for already-compressed formats and small files
216
+ const acceptEncoding = req.headers["accept-encoding"] ?? "";
217
+ const canCompress = !SKIP_COMPRESSION_EXT.has(extension) && stat.size > 1024;
218
+ let encoding = null;
219
+ let preCompressedPath = null;
220
+ if (canCompress) {
221
+ // Check for pre-compressed files first (build-time brotli/gzip)
222
+ if (acceptEncoding.includes("br")) {
223
+ const brPath = `${filePath}.br`;
224
+ try {
225
+ const brStat = await fs.promises.stat(brPath);
226
+ // M5: Validate compressed file path against mount root to prevent symlink traversal
227
+ if (brStat.isFile() && (!mountRoot || (await this._isWithinRoot(brPath, mountRoot)))) {
228
+ preCompressedPath = brPath;
229
+ encoding = "br";
230
+ }
231
+ }
232
+ catch { }
233
+ }
234
+ if (!preCompressedPath && acceptEncoding.includes("gzip")) {
235
+ const gzPath = `${filePath}.gz`;
236
+ try {
237
+ const gzStat = await fs.promises.stat(gzPath);
238
+ // M5: Validate compressed file path against mount root to prevent symlink traversal
239
+ if (gzStat.isFile() && (!mountRoot || (await this._isWithinRoot(gzPath, mountRoot)))) {
240
+ preCompressedPath = gzPath;
241
+ encoding = "gzip";
242
+ }
243
+ }
244
+ catch { }
245
+ }
246
+ // Runtime compression fallback
247
+ if (!preCompressedPath) {
248
+ if (acceptEncoding.includes("br"))
249
+ encoding = "br";
250
+ else if (acceptEncoding.includes("gzip"))
251
+ encoding = "gzip";
252
+ }
253
+ }
254
+ // Set Vary for all compressible content types to ensure proper cache behavior
255
+ if (canCompress) {
256
+ res.setHeader("Vary", "Accept-Encoding");
257
+ }
258
+ if (encoding) {
259
+ res.setHeader("Content-Encoding", encoding);
260
+ }
261
+ if (preCompressedPath) {
262
+ const preStat = await fs.promises.stat(preCompressedPath);
263
+ res.setHeader("Content-Length", preStat.size);
264
+ }
265
+ else if (!encoding) {
266
+ res.setHeader("Content-Length", stat.size);
267
+ }
268
+ // When runtime-compressing, omit Content-Length (chunked transfer)
269
+ if (req.method === "HEAD") {
270
+ res.writeHead(200);
271
+ res.end();
272
+ return true;
273
+ }
274
+ await new Promise((resolve, reject) => {
275
+ const sourcePath = preCompressedPath ?? filePath;
276
+ const stream = fs.createReadStream(sourcePath);
277
+ stream.on("error", (err) => {
278
+ if (res.headersSent) {
279
+ res.destroy();
280
+ }
281
+ else {
282
+ res.writeHead(500, { "Content-Type": "text/plain" });
283
+ res.end("Internal server error");
284
+ }
285
+ reject(err);
286
+ });
287
+ if (encoding && !preCompressedPath) {
288
+ // Runtime compression
289
+ const compressor = encoding === "br"
290
+ ? createBrotliCompress({ params: { [zlibConstants.BROTLI_PARAM_QUALITY]: 4 } })
291
+ : createGzip({ level: 6 });
292
+ compressor.on("error", (err) => {
293
+ if (res.headersSent) {
294
+ res.destroy();
295
+ }
296
+ else {
297
+ res.writeHead(500, { "Content-Type": "text/plain" });
298
+ res.end("Internal server error");
299
+ }
300
+ reject(err);
301
+ });
302
+ stream.on("open", () => {
303
+ if (!res.headersSent)
304
+ res.writeHead(200);
305
+ });
306
+ compressor.on("end", resolve);
307
+ stream.pipe(compressor).pipe(res);
308
+ }
309
+ else {
310
+ stream.on("open", () => {
311
+ if (!res.headersSent)
312
+ res.writeHead(200);
313
+ });
314
+ stream.on("end", resolve);
315
+ stream.pipe(res);
316
+ }
317
+ });
318
+ return true;
319
+ }
320
+ async _proxyStaticToDevServer(req, res, mount, start) {
321
+ const routeLabel = `static-dev:${mount.siteId ?? "unknown"}`;
322
+ let base;
323
+ try {
324
+ base = new URL(mount.devProxyTarget);
325
+ }
326
+ catch (err) {
327
+ this._logger.warn("Invalid frontend dev proxy target", {
328
+ siteId: mount.siteId,
329
+ proxyTarget: mount.devProxyTarget,
330
+ error: err.message,
331
+ });
332
+ return false;
333
+ }
334
+ const incomingUrl = new URL(req.url, "http://localhost");
335
+ const upstreamPath = mount.relativePath ?? incomingUrl.pathname;
336
+ const upstreamUrl = new URL(`${upstreamPath}${incomingUrl.search}`, base);
337
+ const headers = new Headers();
338
+ for (const [key, value] of Object.entries(req.headers)) {
339
+ if (value === undefined)
340
+ continue;
341
+ if (key.toLowerCase() === "host")
342
+ continue;
343
+ if (Array.isArray(value)) {
344
+ headers.set(key, value.join(", "));
345
+ }
346
+ else {
347
+ headers.set(key, String(value));
348
+ }
349
+ }
350
+ headers.set("host", base.host);
351
+ headers.set("x-forwarded-host", req.headers.host ?? "");
352
+ headers.set("x-forwarded-proto", "http");
353
+ let upstreamRes;
354
+ try {
355
+ upstreamRes = await fetch(upstreamUrl, {
356
+ method: req.method,
357
+ headers,
358
+ redirect: "manual",
359
+ });
360
+ }
361
+ catch (err) {
362
+ this._logger.warn("Frontend dev proxy request failed", {
363
+ siteId: mount.siteId,
364
+ proxyTarget: mount.devProxyTarget,
365
+ url: upstreamUrl.toString(),
366
+ error: err.message,
367
+ });
368
+ return false;
369
+ }
370
+ for (const [key, value] of upstreamRes.headers.entries()) {
371
+ if (HOP_BY_HOP_HEADERS.has(key.toLowerCase()))
372
+ continue;
373
+ res.setHeader(key, value);
374
+ }
375
+ const status = upstreamRes.status || 200;
376
+ res.writeHead(status);
377
+ if (req.method === "HEAD" || !upstreamRes.body) {
378
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
379
+ method: req.method,
380
+ route: routeLabel,
381
+ status,
382
+ });
383
+ res.end();
384
+ return true;
385
+ }
386
+ const bodyStream = Readable.fromWeb(upstreamRes.body);
387
+ await new Promise((resolve, reject) => {
388
+ bodyStream.on("error", reject);
389
+ res.on("error", reject);
390
+ res.on("finish", resolve);
391
+ bodyStream.pipe(res);
392
+ });
393
+ this._metrics.httpRequestEnd((performance.now() - start) / 1000, {
394
+ method: req.method,
395
+ route: routeLabel,
396
+ status,
397
+ });
398
+ return true;
399
+ }
400
+ _resolveStaticFile(rootDir, requestPath) {
401
+ const normalizedRoot = path.resolve(rootDir);
402
+ let decodedPath;
403
+ try {
404
+ decodedPath = decodeURIComponent(requestPath || "/");
405
+ }
406
+ catch {
407
+ return { ok: false, filePath: null };
408
+ }
409
+ const normalized = path.posix.normalize(decodedPath.startsWith("/") ? decodedPath : `/${decodedPath}`);
410
+ const absolute = path.resolve(normalizedRoot, `.${normalized}`);
411
+ if (absolute !== normalizedRoot && !absolute.startsWith(`${normalizedRoot}${path.sep}`)) {
412
+ return { ok: false, filePath: null };
413
+ }
414
+ return { ok: true, filePath: absolute };
415
+ }
416
+ async _resolveExistingStaticFile(filePath, rootDir) {
417
+ try {
418
+ const stat = await fs.promises.stat(filePath);
419
+ if (stat.isFile()) {
420
+ if (rootDir && !(await this._isWithinRoot(filePath, rootDir)))
421
+ return null;
422
+ return { filePath, stat };
423
+ }
424
+ if (stat.isDirectory()) {
425
+ const indexPath = path.join(filePath, "index.html");
426
+ const indexStat = await fs.promises.stat(indexPath);
427
+ if (indexStat.isFile()) {
428
+ if (rootDir && !(await this._isWithinRoot(indexPath, rootDir)))
429
+ return null;
430
+ return { filePath: indexPath, stat: indexStat };
431
+ }
432
+ }
433
+ }
434
+ catch { }
435
+ return null;
436
+ }
437
+ async _isWithinRoot(filePath, rootDir) {
438
+ try {
439
+ const realFile = await fs.promises.realpath(filePath);
440
+ const realRoot = await fs.promises.realpath(rootDir);
441
+ return realFile === realRoot || realFile.startsWith(`${realRoot}${path.sep}`);
442
+ }
443
+ catch {
444
+ return false;
445
+ }
446
+ }
447
+ _parseRange(rangeHeader, fileSize) {
448
+ if (fileSize === 0)
449
+ return null;
450
+ const match = /^bytes=(\d*)-(\d*)$/.exec(rangeHeader);
451
+ if (!match)
452
+ return null;
453
+ let start;
454
+ let end;
455
+ if (match[1] === "" && match[2] !== "") {
456
+ const suffix = parseInt(match[2], 10);
457
+ if (suffix === 0)
458
+ return null;
459
+ start = Math.max(0, fileSize - suffix);
460
+ end = fileSize - 1;
461
+ }
462
+ else if (match[2] === "") {
463
+ start = parseInt(match[1], 10);
464
+ end = fileSize - 1;
465
+ }
466
+ else {
467
+ start = parseInt(match[1], 10);
468
+ end = parseInt(match[2], 10);
469
+ }
470
+ if (start > end || start >= fileSize)
471
+ return null;
472
+ end = Math.min(end, fileSize - 1);
473
+ return { start, end };
474
+ }
475
+ _staticCacheControl(mount, filePath) {
476
+ if (mount.cachePolicy === "none")
477
+ return "no-store";
478
+ if (mount.cachePolicy === "immutable")
479
+ return "public, max-age=31536000, immutable";
480
+ // Match content-hashed filenames from bundlers:
481
+ // - Hex hashes (webpack): main.a1b2c3d4.js — matched by [a-f0-9]{8,}
482
+ // - Base64url hashes (vite/rollup): index-SguGrCfz.js — matched by mixed-case check
483
+ const base = path.basename(filePath);
484
+ const hashMatch = base.match(/[.-]([a-zA-Z0-9_-]{8,})\.[^.]+$/);
485
+ if (hashMatch) {
486
+ const seg = hashMatch[1];
487
+ const isHex = /^[a-f0-9]+$/i.test(seg);
488
+ const hasMixedCase = /[a-z]/.test(seg) && /[A-Z]/.test(seg);
489
+ const hasDigit = /\d/.test(seg);
490
+ if (isHex || hasMixedCase || hasDigit) {
491
+ return "public, max-age=31536000, immutable";
492
+ }
493
+ }
494
+ return "public, max-age=300";
495
+ }
496
+ }
497
+ //# sourceMappingURL=StaticFileServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticFileServer.js","sourceRoot":"","sources":["../../src/core/StaticFileServer.ts"],"names":[],"mappings":"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"}