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,556 @@
1
+ /**
2
+ * RequestContext
3
+ *
4
+ * Carries per-request state through the entire call chain using
5
+ * Node's AsyncLocalStorage. No manual threading needed — any
6
+ * async function called during request processing can access
7
+ * the current context.
8
+ *
9
+ * ┌─────────────────────────────────────────────────────────────┐
10
+ * │ HTTP request arrives at users service │
11
+ * │ │
12
+ * │ RequestContext created: │
13
+ * │ correlationId: "req_abc123" │
14
+ * │ traceId: "trace_xyz789" (from ForgeProxy) │
15
+ * │ spanId: "span_001" │
16
+ * │ auth: { userId, tenantId, role } │
17
+ * │ service: "users" │
18
+ * │ method: "createUser" │
19
+ * │ startTime: 1707500000000 │
20
+ * │ deadline: 1707500005000 │
21
+ * │ baggage: Map { custom key-value pairs } │
22
+ * │ │
23
+ * │ this.notifications.userCreated(user) │
24
+ * │ → Proxy reads current RequestContext │
25
+ * │ → Propagates correlationId + traceId + auth via IPC │
26
+ * │ → Notifications service creates child span │
27
+ * │ → Same correlationId, new spanId │
28
+ * │ │
29
+ * │ All log lines include correlationId automatically │
30
+ * │ All metrics include tenantId automatically │
31
+ * │ Prometheus histograms track per-tenant latency │
32
+ * └─────────────────────────────────────────────────────────────┘
33
+ *
34
+ * Usage in service code (automatic — engineers don't touch this):
35
+ *
36
+ * // The framework does this:
37
+ * RequestContext.run(ctx, async () => {
38
+ * await service.createUser(data);
39
+ * });
40
+ *
41
+ * // Any code inside that async tree can do:
42
+ * const ctx = RequestContext.current();
43
+ * ctx.correlationId // always available
44
+ * ctx.auth // if authenticated
45
+ * ctx.tenantId // shortcut
46
+ * ctx.addBaggage('paymentId', 'pay_123');
47
+ */
48
+ import { AsyncLocalStorage } from "node:async_hooks";
49
+ import { randomBytes } from "node:crypto";
50
+ const _store = new AsyncLocalStorage();
51
+ let _idCounter = 0;
52
+ /** P15: Pre-generate a pool of random hex IDs to reduce per-request randomBytes calls */
53
+ const ID_POOL_SIZE = 256;
54
+ let _idPool = [];
55
+ let _idIndex = 0;
56
+ function _refillPool() {
57
+ const buf = randomBytes(16 * ID_POOL_SIZE);
58
+ _idPool = [];
59
+ for (let i = 0; i < ID_POOL_SIZE; i++) {
60
+ _idPool.push(buf.subarray(i * 16, (i + 1) * 16).toString("hex"));
61
+ }
62
+ _idIndex = 0;
63
+ }
64
+ function nextId() {
65
+ // M1: Refill only when the pool is fully exhausted. The previous 75% threshold
66
+ // wasted IDs 192-255 on every refill cycle, discarding 25% of generated entropy.
67
+ if (_idIndex >= _idPool.length) {
68
+ _refillPool();
69
+ }
70
+ return _idPool[_idIndex++];
71
+ }
72
+ _refillPool();
73
+ /** Regex for validating trace/span/correlation IDs */
74
+ const ID_RE = /^[a-zA-Z0-9_:.-]{1,128}$/;
75
+ /** W3C Trace Context traceparent format: version-traceId-parentId-flags */
76
+ const TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
77
+ /** Maximum number of spans per request context to prevent unbounded growth */
78
+ const MAX_SPANS_PER_CONTEXT = 1024;
79
+ /** Default console exporter for dev mode */
80
+ function _consoleExporter(spans) {
81
+ for (const span of spans) {
82
+ const svc = span.service ?? "unknown";
83
+ const dur = span.durationMs.toFixed(2);
84
+ // eslint-disable-next-line no-console
85
+ console.log(`[trace] ${svc}/${span.operationName} ${span.spanId} ${dur}ms ${span.status} trace=${span.traceId}`);
86
+ }
87
+ }
88
+ /** Format spans as OTLP-compatible JSON (ResourceSpans structure) */
89
+ export function formatOTLP(spans) {
90
+ if (spans.length === 0)
91
+ return { resourceSpans: [] };
92
+ // Group spans by service
93
+ const byService = new Map();
94
+ for (const span of spans) {
95
+ const key = span.service ?? "unknown";
96
+ let arr = byService.get(key);
97
+ if (!arr) {
98
+ arr = [];
99
+ byService.set(key, arr);
100
+ }
101
+ arr.push(span);
102
+ }
103
+ const resourceSpans = [];
104
+ for (const [service, svcSpans] of byService) {
105
+ resourceSpans.push({
106
+ resource: {
107
+ attributes: [
108
+ { key: "service.name", value: { stringValue: service } },
109
+ ],
110
+ },
111
+ scopeSpans: [
112
+ {
113
+ scope: { name: "threadforge" },
114
+ spans: svcSpans.map((s) => ({
115
+ traceId: s.traceId,
116
+ spanId: s.spanId,
117
+ parentSpanId: s.parentSpanId ?? "",
118
+ name: s.operationName,
119
+ startTimeUnixNano: String(s.startTimeUnixNano),
120
+ endTimeUnixNano: String(s.endTimeUnixNano),
121
+ status: { code: s.status === "ok" ? 1 : 2 },
122
+ attributes: Object.entries(s.attributes).map(([key, value]) => {
123
+ if (typeof value === "string")
124
+ return { key, value: { stringValue: value } };
125
+ if (typeof value === "number")
126
+ return { key, value: { intValue: String(value) } };
127
+ return { key, value: { boolValue: value } };
128
+ }),
129
+ })),
130
+ },
131
+ ],
132
+ });
133
+ }
134
+ return { resourceSpans };
135
+ }
136
+ export class RequestContext {
137
+ correlationId;
138
+ traceId;
139
+ spanId;
140
+ parentSpanId;
141
+ auth;
142
+ service;
143
+ method;
144
+ startTime;
145
+ startEpoch;
146
+ deadline;
147
+ baggage;
148
+ spans;
149
+ _projectId;
150
+ /** Configurable trace exporter — set via RequestContext.setTraceExporter() */
151
+ static _traceExporter = null;
152
+ constructor(opts = {}) {
153
+ this.correlationId = opts.correlationId ?? RequestContext.generateId();
154
+ this.traceId = opts.traceId ?? RequestContext.generateTraceId();
155
+ this.spanId = RequestContext.generateSpanId();
156
+ this.parentSpanId = opts.parentSpanId ?? null;
157
+ this.auth = opts.auth ?? null;
158
+ this.service = opts.service ?? null;
159
+ this.method = opts.method ?? null;
160
+ this.startTime = performance.now();
161
+ this.startEpoch = Date.now();
162
+ this.deadline = opts.deadline ?? null;
163
+ this.baggage = new Map(opts.baggage ?? []);
164
+ this.spans = [];
165
+ }
166
+ /** Shortcut for auth fields */
167
+ get userId() {
168
+ return this.auth?.userId ?? null;
169
+ }
170
+ get tenantId() {
171
+ return this.auth?.tenantId ?? null;
172
+ }
173
+ get projectId() {
174
+ return this.auth?.projectId ?? this.auth?.project_id ?? this._projectId ?? null;
175
+ }
176
+ get role() {
177
+ return this.auth?.role ?? null;
178
+ }
179
+ /** Elapsed time since this context was created */
180
+ get elapsed() {
181
+ return performance.now() - this.startTime;
182
+ }
183
+ /** Remaining time before deadline */
184
+ get remaining() {
185
+ if (!this.deadline)
186
+ return Infinity;
187
+ return Math.max(0, this.deadline - Date.now());
188
+ }
189
+ get isExpired() {
190
+ return this.remaining <= 0;
191
+ }
192
+ /** Add custom baggage (propagated to downstream services) */
193
+ addBaggage(key, value) {
194
+ if (!/^[a-zA-Z0-9_-]+$/.test(key)) {
195
+ throw new Error(`Invalid baggage key: "${key}"`);
196
+ }
197
+ if (this.baggage.size >= 32 && !this.baggage.has(key)) {
198
+ throw new Error("Baggage limit exceeded: max 32 entries");
199
+ }
200
+ const strValue = String(value);
201
+ // Check total size using byte length for proper multi-byte character handling
202
+ let totalSize = Buffer.byteLength(key, "utf8") + Buffer.byteLength(strValue, "utf8");
203
+ for (const [k, v] of this.baggage) {
204
+ if (k !== key)
205
+ totalSize += Buffer.byteLength(k, "utf8") + Buffer.byteLength(v, "utf8");
206
+ }
207
+ if (totalSize > 4096) {
208
+ throw new Error("Baggage size limit exceeded: max 4KB total");
209
+ }
210
+ this.baggage.set(key, strValue);
211
+ }
212
+ /** Serialize for propagation over IPC/HTTP */
213
+ toHeaders() {
214
+ const headers = {
215
+ "x-correlation-id": this.correlationId,
216
+ "x-trace-id": this.traceId,
217
+ "x-parent-span-id": this.spanId,
218
+ traceparent: `00-${this.traceId}-${this.spanId}-01`,
219
+ };
220
+ if (this.auth) {
221
+ const authJson = JSON.stringify(this.auth);
222
+ if (authJson.length > 8192) {
223
+ throw new Error(`x-forge-auth header exceeds 8KB limit (${authJson.length} bytes)`);
224
+ }
225
+ headers["x-forge-auth"] = Buffer.from(authJson, "utf8").toString("base64");
226
+ }
227
+ if (this.deadline) {
228
+ const remaining = Math.max(0, this.deadline - Date.now());
229
+ headers["x-forge-deadline"] = String(remaining);
230
+ }
231
+ if (this.baggage.size > 0) {
232
+ headers["x-forge-baggage"] = JSON.stringify([...this.baggage]);
233
+ }
234
+ if (this.projectId) {
235
+ headers["x-forge-project"] = this.projectId;
236
+ }
237
+ return headers;
238
+ }
239
+ /** Serialize for IPC (colocated + cross-process) */
240
+ toIPC() {
241
+ return {
242
+ __forge_correlation_id: this.correlationId,
243
+ __forge_trace_id: this.traceId,
244
+ __forge_parent_span_id: this.spanId,
245
+ __forge_auth: this.auth,
246
+ __forge_deadline: this.deadline,
247
+ __forge_baggage: this.baggage.size > 0 ? [...this.baggage] : null,
248
+ __forge_project: this.projectId,
249
+ };
250
+ }
251
+ /** Sanitize an auth object — must be a plain object, strip dangerous keys */
252
+ static _sanitizeAuth(auth) {
253
+ if (auth == null || typeof auth !== "object" || Array.isArray(auth))
254
+ return null;
255
+ const clean = Object.create(null);
256
+ for (const key of Object.keys(auth)) {
257
+ // H-SEC-3: Block all proto pollution keys consistently with body parser
258
+ if (key === "__proto__" || key === "constructor" || key === "prototype")
259
+ continue;
260
+ clean[key] = auth[key];
261
+ }
262
+ return clean;
263
+ }
264
+ /** Validate an absolute deadline value — must be a finite positive epoch ms, capped at 5 min */
265
+ static _sanitizeDeadline(value) {
266
+ if (value == null)
267
+ return null;
268
+ const num = Number(value);
269
+ if (!Number.isFinite(num) || num <= 0)
270
+ return null;
271
+ const now = Date.now();
272
+ // Reject past deadlines
273
+ if (num < now)
274
+ return null;
275
+ // Cap at 5 minutes from now
276
+ const maxDeadline = now + 300000;
277
+ if (num > maxDeadline)
278
+ return maxDeadline;
279
+ return num;
280
+ }
281
+ /** Validate baggage — max 32 entries and max 4KB serialized size */
282
+ static _sanitizeBaggage(baggage) {
283
+ if (!Array.isArray(baggage))
284
+ return null;
285
+ if (baggage.length > 32)
286
+ return null;
287
+ const serialized = JSON.stringify(baggage);
288
+ if (Buffer.byteLength(serialized, "utf8") > 4096)
289
+ return null;
290
+ return baggage;
291
+ }
292
+ /** Validate a relative deadline (remaining ms) — must be finite, non-negative, max 5 min */
293
+ static _sanitizeRelativeDeadline(value) {
294
+ if (value == null)
295
+ return null;
296
+ const num = Number(value);
297
+ if (!Number.isFinite(num) || num < 0)
298
+ return null;
299
+ // Cap at 5 minutes (300000ms) to prevent unreasonable propagated deadlines
300
+ if (num > 300000)
301
+ return null;
302
+ return num;
303
+ }
304
+ /** Reconstruct from IPC message or HTTP headers */
305
+ static fromPropagation(data) {
306
+ // From IPC payload
307
+ const ipcData = data;
308
+ if (ipcData.__forge_correlation_id) {
309
+ const rawTraceId = ipcData.__forge_trace_id || "";
310
+ const rawParentSpanId = ipcData.__forge_parent_span_id || "";
311
+ const traceId = rawTraceId && ID_RE.test(rawTraceId) ? rawTraceId : null;
312
+ const parentSpanId = rawParentSpanId && ID_RE.test(rawParentSpanId) ? rawParentSpanId : null;
313
+ const ctx = new RequestContext({
314
+ correlationId: ipcData.__forge_correlation_id,
315
+ traceId: traceId ?? undefined,
316
+ parentSpanId: parentSpanId ?? undefined,
317
+ auth: RequestContext._sanitizeAuth(ipcData.__forge_auth),
318
+ deadline: RequestContext._sanitizeDeadline(ipcData.__forge_deadline),
319
+ baggage: RequestContext._sanitizeBaggage(ipcData.__forge_baggage),
320
+ });
321
+ const ipcProject = ipcData.__forge_project;
322
+ if (typeof ipcProject === "string" && /^[a-zA-Z0-9_-]{1,64}$/.test(ipcProject)) {
323
+ ctx._projectId = ipcProject;
324
+ }
325
+ return ctx;
326
+ }
327
+ // From HTTP headers (ForgeProxy → service)
328
+ const headerData = data;
329
+ let auth = null;
330
+ if (headerData["x-forge-auth"]) {
331
+ try {
332
+ // Decode Base64-encoded auth header; fall back to raw JSON for backwards compatibility
333
+ let authStr = headerData["x-forge-auth"];
334
+ if (!/^\s*[{[]/.test(authStr)) {
335
+ authStr = Buffer.from(authStr, "base64").toString("utf8");
336
+ }
337
+ auth = RequestContext._sanitizeAuth(JSON.parse(authStr));
338
+ }
339
+ catch {
340
+ auth = null;
341
+ }
342
+ }
343
+ let baggage = null;
344
+ if (headerData["x-forge-baggage"]) {
345
+ try {
346
+ const parsed = JSON.parse(headerData["x-forge-baggage"], (key, value) => {
347
+ if (key === "__proto__" || key === "constructor" || key === "prototype")
348
+ return undefined;
349
+ return value;
350
+ });
351
+ // M7: Validate baggage size — max 32 entries and max 4KB serialized
352
+ if (Array.isArray(parsed)) {
353
+ if (parsed.length <= 32) {
354
+ const serialized = JSON.stringify(parsed);
355
+ if (Buffer.byteLength(serialized, "utf8") <= 4096) {
356
+ baggage = parsed;
357
+ }
358
+ }
359
+ }
360
+ }
361
+ catch {
362
+ baggage = null;
363
+ }
364
+ }
365
+ // x-forge-deadline is relative (remaining ms), convert to absolute local clock
366
+ let deadline = null;
367
+ const rawDeadline = headerData["x-forge-deadline"];
368
+ if (rawDeadline != null) {
369
+ const remaining = RequestContext._sanitizeRelativeDeadline(Number(rawDeadline));
370
+ if (remaining != null) {
371
+ deadline = Date.now() + remaining;
372
+ }
373
+ }
374
+ const rawCorrelationId = headerData["x-correlation-id"] ?? headerData["x-request-id"];
375
+ const correlationId = typeof rawCorrelationId === "string" &&
376
+ /^[a-zA-Z0-9_.-]+$/.test(rawCorrelationId) &&
377
+ rawCorrelationId.length <= 128
378
+ ? rawCorrelationId
379
+ : null;
380
+ // Parse W3C traceparent header if present (takes precedence over x-trace-id/x-parent-span-id)
381
+ let traceId = null;
382
+ let parentSpanId = null;
383
+ const traceparent = headerData["traceparent"];
384
+ if (traceparent) {
385
+ const match = TRACEPARENT_RE.exec(traceparent);
386
+ if (match) {
387
+ traceId = match[2];
388
+ parentSpanId = match[3];
389
+ }
390
+ }
391
+ // Fall back to forge-specific headers if traceparent not present or invalid
392
+ if (!traceId) {
393
+ const rawTraceId = headerData["x-trace-id"] || "";
394
+ traceId = rawTraceId && ID_RE.test(rawTraceId) ? rawTraceId : null;
395
+ }
396
+ if (!parentSpanId) {
397
+ const rawParentSpanId = headerData["x-parent-span-id"] || "";
398
+ parentSpanId = rawParentSpanId && ID_RE.test(rawParentSpanId) ? rawParentSpanId : null;
399
+ }
400
+ const ctx = new RequestContext({
401
+ correlationId,
402
+ traceId: traceId ?? undefined,
403
+ parentSpanId: parentSpanId ?? undefined,
404
+ auth,
405
+ deadline,
406
+ baggage,
407
+ });
408
+ const rawProject = headerData["x-forge-project"];
409
+ if (typeof rawProject === "string" && /^[a-zA-Z0-9_-]{1,64}$/.test(rawProject)) {
410
+ ctx._projectId = rawProject;
411
+ }
412
+ return ctx;
413
+ }
414
+ /** Create a child context for a downstream call */
415
+ child(service, method) {
416
+ return new RequestContext({
417
+ correlationId: this.correlationId,
418
+ traceId: this.traceId,
419
+ parentSpanId: this.spanId,
420
+ auth: this.auth,
421
+ deadline: this.deadline,
422
+ baggage: [...this.baggage],
423
+ service,
424
+ method,
425
+ });
426
+ }
427
+ // ── Static: AsyncLocalStorage management ──
428
+ /** Run a function within a request context */
429
+ static run(ctx, fn) {
430
+ return _store.run(ctx, fn);
431
+ }
432
+ /** Get the current request context (or null if none) */
433
+ static current() {
434
+ return _store.getStore() ?? null;
435
+ }
436
+ /** Labels for metrics (always includes tenant if available) */
437
+ toMetricLabels() {
438
+ const labels = {};
439
+ if (this.tenantId)
440
+ labels.tenant_id = this.tenantId;
441
+ if (this.projectId)
442
+ labels.project_id = this.projectId;
443
+ if (this.service)
444
+ labels.service = this.service;
445
+ if (this.method)
446
+ labels.method = this.method;
447
+ return labels;
448
+ }
449
+ /** Labels for structured logging */
450
+ toLogFields() {
451
+ const fields = { correlationId: this.correlationId };
452
+ if (this.tenantId)
453
+ fields.tenantId = this.tenantId;
454
+ if (this.userId)
455
+ fields.userId = this.userId;
456
+ if (this.traceId !== this.correlationId)
457
+ fields.traceId = this.traceId;
458
+ return fields;
459
+ }
460
+ // ── Span recording & trace export ──
461
+ /**
462
+ * Record a completed span on this request context.
463
+ * Spans are accumulated and flushed when end() is called or flushSpans() is invoked.
464
+ */
465
+ recordSpan(operationName, startTimeMs, endTimeMs, opts = {}) {
466
+ const span = {
467
+ traceId: this.traceId,
468
+ spanId: opts.spanId ?? RequestContext.generateSpanId(),
469
+ parentSpanId: opts.parentSpanId !== undefined ? opts.parentSpanId : this.spanId,
470
+ operationName,
471
+ service: this.service,
472
+ startTimeUnixNano: Math.round(startTimeMs * 1_000_000),
473
+ endTimeUnixNano: Math.round(endTimeMs * 1_000_000),
474
+ durationMs: endTimeMs - startTimeMs,
475
+ status: opts.status ?? "ok",
476
+ attributes: opts.attributes ?? {},
477
+ };
478
+ if (this.spans.length < MAX_SPANS_PER_CONTEXT) {
479
+ this.spans.push(span);
480
+ }
481
+ return span;
482
+ }
483
+ /**
484
+ * Start a span and return a finish function.
485
+ * Usage: const finish = ctx.startSpan('doWork'); ... finish();
486
+ */
487
+ startSpan(operationName, attributes) {
488
+ const startMs = Date.now();
489
+ const spanId = RequestContext.generateSpanId();
490
+ return (status, extraAttrs) => {
491
+ const endMs = Date.now();
492
+ const mergedAttrs = extraAttrs ? { ...(attributes ?? {}), ...extraAttrs } : (attributes ?? {});
493
+ return this.recordSpan(operationName, startMs, endMs, { status: status ?? "ok", attributes: mergedAttrs, spanId });
494
+ };
495
+ }
496
+ /**
497
+ * Flush all accumulated spans to the configured trace exporter.
498
+ * Clears the spans array after flushing. Returns the flushed spans.
499
+ */
500
+ async flushSpans() {
501
+ const flushed = this.spans.splice(0);
502
+ if (flushed.length === 0)
503
+ return flushed;
504
+ const exporter = RequestContext._traceExporter;
505
+ if (exporter) {
506
+ try {
507
+ await exporter(flushed);
508
+ }
509
+ catch {
510
+ // Exporter failures must not break request processing
511
+ }
512
+ }
513
+ return flushed;
514
+ }
515
+ /**
516
+ * End this request context: record the root span and flush all spans.
517
+ * Call this when the request is complete.
518
+ */
519
+ async end(status) {
520
+ // Record the root span for the entire request
521
+ this.recordSpan(this.method ?? "request", this.startEpoch, Date.now(), {
522
+ status: status ?? "ok",
523
+ spanId: this.spanId,
524
+ parentSpanId: this.parentSpanId,
525
+ attributes: {
526
+ ...(this.service ? { "service.name": this.service } : {}),
527
+ ...(this.method ? { "service.method": this.method } : {}),
528
+ },
529
+ });
530
+ return this.flushSpans();
531
+ }
532
+ /** Set the global trace exporter function */
533
+ static setTraceExporter(fn) {
534
+ RequestContext._traceExporter = fn;
535
+ }
536
+ /** Get the current trace exporter */
537
+ static getTraceExporter() {
538
+ return RequestContext._traceExporter;
539
+ }
540
+ /** Built-in console exporter for development */
541
+ static consoleExporter = _consoleExporter;
542
+ static generateId() {
543
+ const workerId = typeof process !== "undefined" ? process.env?.FORGE_WORKER_ID : undefined;
544
+ const safeWorkerId = workerId && /^[a-zA-Z0-9_-]+$/.test(workerId) ? workerId : "0";
545
+ const hex = nextId();
546
+ return `req_${safeWorkerId}_${(++_idCounter).toString(36)}_${hex.slice(0, 8)}`;
547
+ }
548
+ static generateTraceId() {
549
+ return nextId();
550
+ }
551
+ static generateSpanId() {
552
+ const hex = nextId();
553
+ return hex.slice(0, 16);
554
+ }
555
+ }
556
+ //# sourceMappingURL=RequestContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestContext.js","sourceRoot":"","sources":["../../src/core/RequestContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface RouterResponseLike {
2
+ writeHead: (statusCode: number, headers?: Record<string, string>) => unknown;
3
+ end: (chunk?: unknown) => unknown;
4
+ }
5
+ export type RouteHandler<TReq, TRes extends RouterResponseLike> = (req: TReq, res: TRes, next: (err?: Error) => void) => void | Promise<void>;
6
+ export type MiddlewareHandler<TReq, TRes extends RouterResponseLike> = RouteHandler<TReq, TRes>;
7
+ export interface RouteMatch<TReq, TRes extends RouterResponseLike> {
8
+ handler: RouteHandler<TReq, TRes>;
9
+ params: Record<string, string>;
10
+ query: Record<string, string | string[]>;
11
+ pattern: string;
12
+ }
13
+ interface RouterRouteEntry<TReq, TRes extends RouterResponseLike> {
14
+ method: string;
15
+ pattern: string;
16
+ regex: RegExp;
17
+ paramNames: string[];
18
+ handler: RouteHandler<TReq, TRes>;
19
+ isWildcard: boolean;
20
+ literalCount: number;
21
+ totalSegments: number;
22
+ }
23
+ /**
24
+ * Simple pattern-matching HTTP router.
25
+ * P11: Includes a route matching cache.
26
+ */
27
+ export declare class Router<TReq, TRes extends RouterResponseLike = RouterResponseLike> {
28
+ routes: Map<string, RouterRouteEntry<TReq, TRes>[]>;
29
+ middleware: MiddlewareHandler<TReq, TRes>[];
30
+ _cache: Map<string, RouteMatch<TReq, TRes>>;
31
+ constructor();
32
+ use(fn: MiddlewareHandler<TReq, TRes>): void;
33
+ get(pattern: string, handler: RouteHandler<TReq, TRes>): void;
34
+ post(pattern: string, handler: RouteHandler<TReq, TRes>): void;
35
+ put(pattern: string, handler: RouteHandler<TReq, TRes>): void;
36
+ patch(pattern: string, handler: RouteHandler<TReq, TRes>): void;
37
+ delete(pattern: string, handler: RouteHandler<TReq, TRes>): void;
38
+ _add(method: string, pattern: string, handler: RouteHandler<TReq, TRes>): void;
39
+ _parseQuery(searchParams: URLSearchParams): Record<string, string | string[]>;
40
+ _autoOptions(normalized: string, query: Record<string, string | string[]>): RouteMatch<TReq, TRes> | null;
41
+ match(method: string, url: string): RouteMatch<TReq, TRes> | null;
42
+ _matchUncached(method: string, url: string): RouteMatch<TReq, TRes> | null;
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../src/core/Router.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;IAC7E,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,SAAS,kBAAkB,IAAI,CAChE,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,SAAS,kBAAkB,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEhG,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,IAAI,SAAS,kBAAkB;IAC/D,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB,CAAC,IAAI,EAAE,IAAI,SAAS,kBAAkB;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,kBAAkB,GAAG,kBAAkB;IAC5E,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,UAAU,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;IAS5C,GAAG,CAAC,EAAE,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAI5C,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAG7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAG9D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAG7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAG/D,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IAIhE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IA6C9E,WAAW,CAAC,YAAY,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAU7E,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IA2BzG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;IA+CjE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI;CAiI3E"}