threadforge 0.1.0 → 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 (359) hide show
  1. package/README.md +52 -20
  2. package/bin/forge.js +2 -1049
  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 +160 -49
  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 +84 -22
  318. package/shared/identity.js +26 -0
  319. package/src/core/DirectMessageBus.js +0 -364
  320. package/src/core/EndpointResolver.js +0 -247
  321. package/src/core/ForgeContext.js +0 -2227
  322. package/src/core/ForgeHost.js +0 -122
  323. package/src/core/ForgePlatform.js +0 -145
  324. package/src/core/Ingress.js +0 -768
  325. package/src/core/Interceptors.js +0 -420
  326. package/src/core/MessageBus.js +0 -310
  327. package/src/core/Prometheus.js +0 -305
  328. package/src/core/RequestContext.js +0 -413
  329. package/src/core/RoutingStrategy.js +0 -316
  330. package/src/core/Supervisor.js +0 -1306
  331. package/src/core/ThreadAllocator.js +0 -196
  332. package/src/core/WorkerChannelManager.js +0 -879
  333. package/src/core/config.js +0 -624
  334. package/src/core/host-config.js +0 -311
  335. package/src/core/network-utils.js +0 -166
  336. package/src/core/platform-config.js +0 -308
  337. package/src/decorators/ServiceProxy.js +0 -899
  338. package/src/decorators/index.js +0 -571
  339. package/src/deploy/NginxGenerator.js +0 -865
  340. package/src/deploy/PlatformManifestGenerator.js +0 -96
  341. package/src/deploy/RouteManifestGenerator.js +0 -112
  342. package/src/deploy/index.js +0 -984
  343. package/src/frontend/FrontendDevLifecycle.js +0 -65
  344. package/src/frontend/FrontendPluginOrchestrator.js +0 -187
  345. package/src/frontend/SiteResolver.js +0 -63
  346. package/src/frontend/StaticMountRegistry.js +0 -90
  347. package/src/frontend/plugins/viteFrontend.js +0 -79
  348. package/src/frontend/types.js +0 -35
  349. package/src/index.js +0 -56
  350. package/src/plugins/PluginManager.js +0 -537
  351. package/src/plugins/ScopedPostgres.js +0 -192
  352. package/src/plugins/ScopedRedis.js +0 -142
  353. package/src/plugins/index.js +0 -1729
  354. package/src/registry/ServiceRegistry.js +0 -796
  355. package/src/scaling/ScaleAdvisor.js +0 -442
  356. package/src/services/Service.js +0 -195
  357. package/src/services/worker-bootstrap.js +0 -676
  358. package/src/templates/auth-service.js +0 -65
  359. package/src/templates/identity-service.js +0 -75
@@ -0,0 +1,164 @@
1
+ import type { ForgeContext } from "../core/ForgeContext.js";
2
+ /**
3
+ * Service Base Class v2
4
+ *
5
+ * Developers extend this to create ThreadForge services.
6
+ *
7
+ * NEW in v2:
8
+ * - Auto-generated proxy clients for other services
9
+ * (this.users.getUser(id) instead of this.request('users', {...}))
10
+ * - @Expose, @Route, @Emit, @On decorators for contracts
11
+ * - Plain JS fallback via static `contract` property
12
+ * - Automatic HTTP route registration from @Route
13
+ * - Automatic event subscription wiring from @On
14
+ *
15
+ * @example
16
+ * ```js
17
+ * import { Service, Expose, Route, Emit } from 'threadforge';
18
+ *
19
+ * export default class UserService extends Service {
20
+ *
21
+ * @Expose()
22
+ * async getUser(userId) {
23
+ * return this.db.findUser(userId);
24
+ * }
25
+ *
26
+ * @Expose()
27
+ * @Route('POST', '/users')
28
+ * @Emit('user.created')
29
+ * async createUser(data) {
30
+ * const user = await this.db.insert(data);
31
+ * await this.notifications.userCreated(user); // auto-generated proxy
32
+ * return user;
33
+ * }
34
+ * }
35
+ * ```
36
+ *
37
+ * Plain JS equivalent (no decorators):
38
+ * ```js
39
+ * export default class UserService extends Service {
40
+ * static contract = {
41
+ * expose: ['getUser', 'createUser'],
42
+ * routes: [
43
+ * { method: 'POST', path: '/users', handler: 'createUser' },
44
+ * ],
45
+ * emits: { createUser: 'user.created' },
46
+ * };
47
+ *
48
+ * async getUser(userId) { ... }
49
+ * async createUser(data) { ... }
50
+ * }
51
+ * ```
52
+ *
53
+ * **Route handler signatures — two approaches:**
54
+ *
55
+ * 1. Contract routes (`@Route` / `static contract.routes`):
56
+ * Handler receives `(body, params, query)` and returns a value that is
57
+ * auto-serialized as JSON (201 for POST, 200 otherwise).
58
+ *
59
+ * **IMPORTANT: GET handler signature**
60
+ * GET handlers receive the same `(body, params, query)` signature as all
61
+ * other methods. Since GET requests have no request body, the first
62
+ * argument is always an empty object `{}`. Use destructuring to skip it:
63
+ *
64
+ * ```js
65
+ * // Recommended — destructure to ignore the empty body:
66
+ * @Route('GET', '/users/:id')
67
+ * async getUser(_body, params, query) {
68
+ * // _body is always {} for GET requests
69
+ * return this.db.findUser(params.id);
70
+ * }
71
+ *
72
+ * // Also works — use positional args:
73
+ * @Route('GET', '/search')
74
+ * async search(_, _params, query) {
75
+ * return this.db.search(query.q);
76
+ * }
77
+ * ```
78
+ *
79
+ * The same applies to plain JS contracts:
80
+ * ```js
81
+ * static contract = {
82
+ * routes: [{ method: 'GET', path: '/users/:id', handler: 'getUser' }],
83
+ * };
84
+ * async getUser(_body, params) {
85
+ * return this.db.findUser(params.id);
86
+ * }
87
+ * ```
88
+ *
89
+ * 2. Manual routes (registered in `onStart` via `ctx.router`):
90
+ * Handler receives the raw `(req, res)` and must call `res.json()` or
91
+ * `res.end()` itself. These follow Node.js HTTP conventions and do not
92
+ * have the empty body argument.
93
+ *
94
+ * See `autoRegisterRoutes` in `ServiceProxy.js` for full details.
95
+ */
96
+ interface ProxyPayload {
97
+ __forge_method?: string;
98
+ __forge_args?: unknown[];
99
+ [key: string]: unknown;
100
+ }
101
+ export declare class Service {
102
+ ctx: ForgeContext | null;
103
+ /**
104
+ * Auto-generated proxy clients for connected services.
105
+ * Populated by the framework during initialization.
106
+ *
107
+ * Usage: this.users.getUser('123')
108
+ * this.notifications.sendAlert({ ... })
109
+ */
110
+ [key: string]: unknown;
111
+ constructor();
112
+ /**
113
+ * Called when the service starts. Initialize resources here.
114
+ * Routes from @Route decorators are auto-registered BEFORE this is called,
115
+ * so you can add additional routes in onStart if needed.
116
+ */
117
+ onStart(_ctx: ForgeContext | null): Promise<void>;
118
+ /**
119
+ * Called when a message arrives from another service.
120
+ * For proxy-style calls, this is handled automatically.
121
+ * Override for custom fire-and-forget message handling.
122
+ */
123
+ onMessage(_from: string, _payload: unknown): Promise<void>;
124
+ /**
125
+ * Called when a request arrives from another service.
126
+ *
127
+ * For proxy-style calls (@Expose methods), this is dispatched
128
+ * automatically — you don't need to implement a switch/case.
129
+ *
130
+ * Override only for custom non-proxy request handling.
131
+ */
132
+ onRequest(from: string, payload: ProxyPayload): Promise<unknown>;
133
+ /**
134
+ * Called when the service is shutting down.
135
+ */
136
+ onStop(): Promise<void>;
137
+ /**
138
+ * Send a fire-and-forget message to another service.
139
+ * Prefer using proxy clients (this.serviceName.method()) for
140
+ * request/response patterns.
141
+ */
142
+ send(target: string, payload: unknown): Promise<void>;
143
+ /**
144
+ * Send a request to another service.
145
+ * Prefer using proxy clients instead of this low-level API.
146
+ */
147
+ request(target: string, payload: unknown, timeoutMs?: number): Promise<unknown>;
148
+ /** Broadcast to all workers of a target service. */
149
+ broadcast(target: string, payload: unknown): Promise<void>;
150
+ /** @internal */
151
+ _init(ctx: ForgeContext): Promise<void>;
152
+ /**
153
+ * @internal
154
+ * Set proxy clients on the service instance.
155
+ * Called by the worker bootstrap after all services are loaded.
156
+ */
157
+ _setProxies(proxies: Record<string, unknown>): void;
158
+ /** @internal */
159
+ _start(): Promise<void>;
160
+ /** @internal */
161
+ _stop(): Promise<void>;
162
+ }
163
+ export {};
164
+ //# sourceMappingURL=Service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/services/Service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQ5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6FG;AAEH,UAAU,YAAY;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,OAAO;IAClB,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;IAEzB;;;;;;OAMG;IAGH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;;IAQvB;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhE;;;;;;;OAOG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAStE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrF,oDAAoD;IAC9C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,gBAAgB;IACV,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7C;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMnD,gBAAgB;IACV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,gBAAgB;IACV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
@@ -0,0 +1,106 @@
1
+ import { autoRegisterRoutes, autoWireSubscriptions, handleProxyRequest, NOT_HANDLED, } from "../decorators/ServiceProxy.js";
2
+ export class Service {
3
+ ctx;
4
+ constructor() {
5
+ this.ctx = null;
6
+ }
7
+ // ── Lifecycle hooks (override in subclass) ──
8
+ /**
9
+ * Called when the service starts. Initialize resources here.
10
+ * Routes from @Route decorators are auto-registered BEFORE this is called,
11
+ * so you can add additional routes in onStart if needed.
12
+ */
13
+ async onStart(_ctx) { }
14
+ /**
15
+ * Called when a message arrives from another service.
16
+ * For proxy-style calls, this is handled automatically.
17
+ * Override for custom fire-and-forget message handling.
18
+ */
19
+ async onMessage(_from, _payload) { }
20
+ /**
21
+ * Called when a request arrives from another service.
22
+ *
23
+ * For proxy-style calls (@Expose methods), this is dispatched
24
+ * automatically — you don't need to implement a switch/case.
25
+ *
26
+ * Override only for custom non-proxy request handling.
27
+ */
28
+ async onRequest(from, payload) {
29
+ // Try proxy-style dispatch first
30
+ const result = handleProxyRequest(this, from, payload);
31
+ if (result !== NOT_HANDLED)
32
+ return result;
33
+ // Subclass can handle other request formats
34
+ return null;
35
+ }
36
+ /**
37
+ * Called when the service is shutting down.
38
+ */
39
+ async onStop() { }
40
+ // ── Convenience methods ──
41
+ /**
42
+ * Send a fire-and-forget message to another service.
43
+ * Prefer using proxy clients (this.serviceName.method()) for
44
+ * request/response patterns.
45
+ */
46
+ async send(target, payload) {
47
+ if (!this.ctx)
48
+ throw new Error("Service not initialized");
49
+ return this.ctx.send(target, payload);
50
+ }
51
+ /**
52
+ * Send a request to another service.
53
+ * Prefer using proxy clients instead of this low-level API.
54
+ */
55
+ async request(target, payload, timeoutMs) {
56
+ if (!this.ctx)
57
+ throw new Error("Service not initialized");
58
+ return this.ctx.request(target, payload, timeoutMs);
59
+ }
60
+ /** Broadcast to all workers of a target service. */
61
+ async broadcast(target, payload) {
62
+ if (!this.ctx)
63
+ throw new Error("Service not initialized");
64
+ return this.ctx.broadcast(target, payload);
65
+ }
66
+ // ── Internal lifecycle (called by worker bootstrap) ──
67
+ /** @internal */
68
+ async _init(ctx) {
69
+ this.ctx = ctx;
70
+ // Wire IPC handlers
71
+ ctx._onMessage = (from, payload) => this.onMessage(from, payload);
72
+ ctx._onRequest = (from, payload) => this.onRequest(from, payload);
73
+ ctx._wireMessageHandlers();
74
+ // Auto-register HTTP routes from @Route decorators
75
+ autoRegisterRoutes(this, ctx);
76
+ // Auto-wire event subscriptions from @On decorators
77
+ autoWireSubscriptions(this, ctx);
78
+ }
79
+ /**
80
+ * @internal
81
+ * Set proxy clients on the service instance.
82
+ * Called by the worker bootstrap after all services are loaded.
83
+ */
84
+ _setProxies(proxies) {
85
+ for (const [name, proxy] of Object.entries(proxies)) {
86
+ this[name] = proxy;
87
+ }
88
+ }
89
+ /** @internal */
90
+ async _start() {
91
+ await this.onStart(this.ctx);
92
+ if (this.ctx?._needsHttpServer) {
93
+ await this.ctx.startServer();
94
+ }
95
+ }
96
+ /** @internal */
97
+ async _stop() {
98
+ try {
99
+ await this.onStop();
100
+ }
101
+ finally {
102
+ await this.ctx.stop();
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=Service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/services/Service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,GACZ,MAAM,+BAA+B,CAAC;AAuGvC,MAAM,OAAO,OAAO;IAClB,GAAG,CAAsB;IAazB;QACE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,+CAA+C;IAE/C;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,IAAyB,IAAkB,CAAC;IAE1D;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,QAAiB,IAAkB,CAAC;IAEnE;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAqB;QACjD,iCAAiC;QACjC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO,MAAM,CAAC;QAE1C,4CAA4C;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,KAAmB,CAAC;IAEhC,4BAA4B;IAE5B;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,OAAgB;QACzC,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAgB,EAAE,SAAkB;QAChE,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,OAAgB;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,wDAAwD;IAExD,gBAAgB;IAChB,KAAK,CAAC,KAAK,CAAC,GAAiB;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,oBAAoB;QACpB,GAAG,CAAC,UAAU,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE,CAClD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,UAAU,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE,CAClD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAuB,CAAC,CAAC;QAChD,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAE3B,mDAAmD;QACnD,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE9B,oDAAoD;QACpD,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAgC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAgC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAClD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAK,IAAI,CAAC,GAAsC,EAAE,gBAAgB,EAAE,CAAC;YACnE,MAAM,IAAI,CAAC,GAAI,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,GAAI,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Worker Bootstrap v3
3
+ *
4
+ * Loads services, builds proxy clients, and injects them.
5
+ *
6
+ * After bootstrap, a service can call:
7
+ * await this.users.getUser('123')
8
+ *
9
+ * Which transparently routes through:
10
+ * - Direct function call (colocated services, same process)
11
+ * - UDS (different process, same machine)
12
+ * - Supervisor IPC fallback (startup race)
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=worker-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-bootstrap.d.ts","sourceRoot":"","sources":["../../src/services/worker-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}