threadforge 0.1.1 → 0.2.2

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 +69 -42
  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 +79 -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,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":"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"}
@@ -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"}