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.
- package/README.md +69 -42
- package/bin/forge.js +2 -1058
- package/bin/host-commands.d.ts +2 -0
- package/bin/host-commands.d.ts.map +1 -0
- package/bin/host-commands.js +7 -8
- package/bin/platform-commands.d.ts +2 -0
- package/bin/platform-commands.d.ts.map +1 -0
- package/bin/platform-commands.js +118 -36
- package/dist/cli/base-command.d.ts +12 -0
- package/dist/cli/base-command.d.ts.map +1 -0
- package/dist/cli/base-command.js +25 -0
- package/dist/cli/base-command.js.map +1 -0
- package/dist/cli/commands/build.d.ts +10 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +110 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +12 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +143 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +10 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +138 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +10 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +76 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/host.d.ts +8 -0
- package/dist/cli/commands/host.d.ts.map +1 -0
- package/dist/cli/commands/host.js +20 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/init.d.ts +16 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +246 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/platform.d.ts +8 -0
- package/dist/cli/commands/platform.d.ts.map +1 -0
- package/dist/cli/commands/platform.js +20 -0
- package/dist/cli/commands/platform.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +8 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +13 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/scaffold/frontend.d.ts +10 -0
- package/dist/cli/commands/scaffold/frontend.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/frontend.js +130 -0
- package/dist/cli/commands/scaffold/frontend.js.map +1 -0
- package/dist/cli/commands/scaffold/react.d.ts +7 -0
- package/dist/cli/commands/scaffold/react.d.ts.map +1 -0
- package/dist/cli/commands/scaffold/react.js +12 -0
- package/dist/cli/commands/scaffold/react.js.map +1 -0
- package/dist/cli/commands/scale.d.ts +8 -0
- package/dist/cli/commands/scale.d.ts.map +1 -0
- package/dist/cli/commands/scale.js +13 -0
- package/dist/cli/commands/scale.js.map +1 -0
- package/dist/cli/commands/start.d.ts +10 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +71 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +11 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +60 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +10 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +89 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/util/config-discovery.d.ts +8 -0
- package/dist/cli/util/config-discovery.d.ts.map +1 -0
- package/dist/cli/util/config-discovery.js +70 -0
- package/dist/cli/util/config-discovery.js.map +1 -0
- package/dist/cli/util/config-patcher.d.ts +17 -0
- package/dist/cli/util/config-patcher.d.ts.map +1 -0
- package/dist/cli/util/config-patcher.js +439 -0
- package/dist/cli/util/config-patcher.js.map +1 -0
- package/dist/cli/util/frontend-dev.d.ts +8 -0
- package/dist/cli/util/frontend-dev.d.ts.map +1 -0
- package/dist/cli/util/frontend-dev.js +117 -0
- package/dist/cli/util/frontend-dev.js.map +1 -0
- package/dist/cli/util/process.d.ts +5 -0
- package/dist/cli/util/process.d.ts.map +1 -0
- package/dist/cli/util/process.js +17 -0
- package/dist/cli/util/process.js.map +1 -0
- package/dist/cli/util/templates.d.ts +10 -0
- package/dist/cli/util/templates.d.ts.map +1 -0
- package/dist/cli/util/templates.js +157 -0
- package/dist/cli/util/templates.js.map +1 -0
- package/dist/core/AlertSink.d.ts +83 -0
- package/dist/core/AlertSink.d.ts.map +1 -0
- package/dist/core/AlertSink.js +126 -0
- package/dist/core/AlertSink.js.map +1 -0
- package/dist/core/DirectMessageBus.d.ts +88 -0
- package/dist/core/DirectMessageBus.d.ts.map +1 -0
- package/dist/core/DirectMessageBus.js +352 -0
- package/dist/core/DirectMessageBus.js.map +1 -0
- package/dist/core/EndpointResolver.d.ts +111 -0
- package/dist/core/EndpointResolver.d.ts.map +1 -0
- package/dist/core/EndpointResolver.js +336 -0
- package/dist/core/EndpointResolver.js.map +1 -0
- package/dist/core/ForgeContext.d.ts +221 -0
- package/dist/core/ForgeContext.d.ts.map +1 -0
- package/dist/core/ForgeContext.js +1169 -0
- package/dist/core/ForgeContext.js.map +1 -0
- package/dist/core/ForgeEndpoints.d.ts +71 -0
- package/dist/core/ForgeEndpoints.d.ts.map +1 -0
- package/dist/core/ForgeEndpoints.js +442 -0
- package/dist/core/ForgeEndpoints.js.map +1 -0
- package/dist/core/ForgeHost.d.ts +82 -0
- package/dist/core/ForgeHost.d.ts.map +1 -0
- package/dist/core/ForgeHost.js +107 -0
- package/dist/core/ForgeHost.js.map +1 -0
- package/dist/core/ForgePlatform.d.ts +96 -0
- package/dist/core/ForgePlatform.d.ts.map +1 -0
- package/dist/core/ForgePlatform.js +136 -0
- package/dist/core/ForgePlatform.js.map +1 -0
- package/dist/core/ForgeWebSocket.d.ts +56 -0
- package/dist/core/ForgeWebSocket.d.ts.map +1 -0
- package/dist/core/ForgeWebSocket.js +415 -0
- package/dist/core/ForgeWebSocket.js.map +1 -0
- package/dist/core/Ingress.d.ts +329 -0
- package/dist/core/Ingress.d.ts.map +1 -0
- package/dist/core/Ingress.js +694 -0
- package/dist/core/Ingress.js.map +1 -0
- package/dist/core/Interceptors.d.ts +134 -0
- package/dist/core/Interceptors.d.ts.map +1 -0
- package/dist/core/Interceptors.js +416 -0
- package/dist/core/Interceptors.js.map +1 -0
- package/dist/core/Logger.d.ts +20 -0
- package/dist/core/Logger.d.ts.map +1 -0
- package/dist/core/Logger.js +77 -0
- package/dist/core/Logger.js.map +1 -0
- package/dist/core/MessageBus.d.ts +15 -0
- package/dist/core/MessageBus.d.ts.map +1 -0
- package/dist/core/MessageBus.js +18 -0
- package/dist/core/MessageBus.js.map +1 -0
- package/dist/core/Prometheus.d.ts +80 -0
- package/dist/core/Prometheus.d.ts.map +1 -0
- package/dist/core/Prometheus.js +332 -0
- package/dist/core/Prometheus.js.map +1 -0
- package/dist/core/RequestContext.d.ts +214 -0
- package/dist/core/RequestContext.d.ts.map +1 -0
- package/dist/core/RequestContext.js +556 -0
- package/dist/core/RequestContext.js.map +1 -0
- package/dist/core/Router.d.ts +45 -0
- package/dist/core/Router.d.ts.map +1 -0
- package/dist/core/Router.js +285 -0
- package/dist/core/Router.js.map +1 -0
- package/dist/core/RoutingStrategy.d.ts +116 -0
- package/dist/core/RoutingStrategy.d.ts.map +1 -0
- package/dist/core/RoutingStrategy.js +306 -0
- package/dist/core/RoutingStrategy.js.map +1 -0
- package/dist/core/RpcConfig.d.ts +72 -0
- package/dist/core/RpcConfig.d.ts.map +1 -0
- package/dist/core/RpcConfig.js +127 -0
- package/dist/core/RpcConfig.js.map +1 -0
- package/dist/core/SignatureCache.d.ts +81 -0
- package/dist/core/SignatureCache.d.ts.map +1 -0
- package/dist/core/SignatureCache.js +172 -0
- package/dist/core/SignatureCache.js.map +1 -0
- package/dist/core/StaticFileServer.d.ts +34 -0
- package/dist/core/StaticFileServer.d.ts.map +1 -0
- package/dist/core/StaticFileServer.js +497 -0
- package/dist/core/StaticFileServer.js.map +1 -0
- package/dist/core/Supervisor.d.ts +198 -0
- package/dist/core/Supervisor.d.ts.map +1 -0
- package/dist/core/Supervisor.js +1418 -0
- package/dist/core/Supervisor.js.map +1 -0
- package/dist/core/ThreadAllocator.d.ts +52 -0
- package/dist/core/ThreadAllocator.d.ts.map +1 -0
- package/dist/core/ThreadAllocator.js +174 -0
- package/dist/core/ThreadAllocator.js.map +1 -0
- package/dist/core/WorkerChannelManager.d.ts +130 -0
- package/dist/core/WorkerChannelManager.d.ts.map +1 -0
- package/dist/core/WorkerChannelManager.js +956 -0
- package/dist/core/WorkerChannelManager.js.map +1 -0
- package/dist/core/config-enums.d.ts +41 -0
- package/dist/core/config-enums.d.ts.map +1 -0
- package/dist/core/config-enums.js +59 -0
- package/dist/core/config-enums.js.map +1 -0
- package/dist/core/config.d.ts +159 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +694 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/host-config.d.ts +146 -0
- package/dist/core/host-config.d.ts.map +1 -0
- package/dist/core/host-config.js +312 -0
- package/dist/core/host-config.js.map +1 -0
- package/dist/core/ipc-errors.d.ts +27 -0
- package/dist/core/ipc-errors.d.ts.map +1 -0
- package/dist/core/ipc-errors.js +36 -0
- package/dist/core/ipc-errors.js.map +1 -0
- package/dist/core/network-utils.d.ts +35 -0
- package/dist/core/network-utils.d.ts.map +1 -0
- package/dist/core/network-utils.js +145 -0
- package/dist/core/network-utils.js.map +1 -0
- package/dist/core/platform-config.d.ts +142 -0
- package/dist/core/platform-config.d.ts.map +1 -0
- package/dist/core/platform-config.js +299 -0
- package/dist/core/platform-config.js.map +1 -0
- package/dist/decorators/ServiceProxy.d.ts +175 -0
- package/dist/decorators/ServiceProxy.d.ts.map +1 -0
- package/dist/decorators/ServiceProxy.js +969 -0
- package/dist/decorators/ServiceProxy.js.map +1 -0
- package/dist/decorators/index.d.ts +146 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +545 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/deploy/NginxGenerator.d.ts +165 -0
- package/dist/deploy/NginxGenerator.d.ts.map +1 -0
- package/dist/deploy/NginxGenerator.js +781 -0
- package/dist/deploy/NginxGenerator.js.map +1 -0
- package/dist/deploy/PlatformManifestGenerator.d.ts +43 -0
- package/dist/deploy/PlatformManifestGenerator.d.ts.map +1 -0
- package/dist/deploy/PlatformManifestGenerator.js +80 -0
- package/dist/deploy/PlatformManifestGenerator.js.map +1 -0
- package/dist/deploy/RouteManifestGenerator.d.ts +42 -0
- package/dist/deploy/RouteManifestGenerator.d.ts.map +1 -0
- package/dist/deploy/RouteManifestGenerator.js +105 -0
- package/dist/deploy/RouteManifestGenerator.js.map +1 -0
- package/dist/deploy/index.d.ts +210 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +918 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/frontend/FrontendDevLifecycle.d.ts +26 -0
- package/dist/frontend/FrontendDevLifecycle.d.ts.map +1 -0
- package/dist/frontend/FrontendDevLifecycle.js +60 -0
- package/dist/frontend/FrontendDevLifecycle.js.map +1 -0
- package/dist/frontend/FrontendPluginOrchestrator.d.ts +64 -0
- package/dist/frontend/FrontendPluginOrchestrator.d.ts.map +1 -0
- package/dist/frontend/FrontendPluginOrchestrator.js +167 -0
- package/dist/frontend/FrontendPluginOrchestrator.js.map +1 -0
- package/dist/frontend/SiteResolver.d.ts +33 -0
- package/dist/frontend/SiteResolver.d.ts.map +1 -0
- package/dist/frontend/SiteResolver.js +53 -0
- package/dist/frontend/SiteResolver.js.map +1 -0
- package/dist/frontend/StaticMountRegistry.d.ts +36 -0
- package/dist/frontend/StaticMountRegistry.d.ts.map +1 -0
- package/dist/frontend/StaticMountRegistry.js +94 -0
- package/dist/frontend/StaticMountRegistry.js.map +1 -0
- package/dist/frontend/index.d.ts +7 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/{src → dist}/frontend/index.js +4 -2
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/pathUtils.d.ts +8 -0
- package/dist/frontend/pathUtils.d.ts.map +1 -0
- package/dist/frontend/pathUtils.js +17 -0
- package/dist/frontend/pathUtils.js.map +1 -0
- package/dist/frontend/plugins/index.d.ts +2 -0
- package/dist/frontend/plugins/index.d.ts.map +1 -0
- package/{src → dist}/frontend/plugins/index.js +1 -1
- package/dist/frontend/plugins/index.js.map +1 -0
- package/dist/frontend/plugins/viteFrontend.d.ts +51 -0
- package/dist/frontend/plugins/viteFrontend.d.ts.map +1 -0
- package/dist/frontend/plugins/viteFrontend.js +134 -0
- package/dist/frontend/plugins/viteFrontend.js.map +1 -0
- package/dist/frontend/types.d.ts +25 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/frontend/types.js +2 -0
- package/dist/frontend/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/internals.d.ts +21 -0
- package/dist/internals.d.ts.map +1 -0
- package/{src → dist}/internals.js +12 -14
- package/dist/internals.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +209 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +365 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/ScopedPostgres.d.ts +78 -0
- package/dist/plugins/ScopedPostgres.d.ts.map +1 -0
- package/dist/plugins/ScopedPostgres.js +190 -0
- package/dist/plugins/ScopedPostgres.js.map +1 -0
- package/dist/plugins/ScopedRedis.d.ts +88 -0
- package/dist/plugins/ScopedRedis.d.ts.map +1 -0
- package/dist/plugins/ScopedRedis.js +169 -0
- package/dist/plugins/ScopedRedis.js.map +1 -0
- package/dist/plugins/index.d.ts +289 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +1942 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +59 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/registry/ServiceRegistry.d.ts +305 -0
- package/dist/registry/ServiceRegistry.d.ts.map +1 -0
- package/dist/registry/ServiceRegistry.js +735 -0
- package/dist/registry/ServiceRegistry.js.map +1 -0
- package/dist/scaling/ScaleAdvisor.d.ts +214 -0
- package/dist/scaling/ScaleAdvisor.d.ts.map +1 -0
- package/dist/scaling/ScaleAdvisor.js +526 -0
- package/dist/scaling/ScaleAdvisor.js.map +1 -0
- package/dist/services/Service.d.ts +164 -0
- package/dist/services/Service.d.ts.map +1 -0
- package/dist/services/Service.js +106 -0
- package/dist/services/Service.js.map +1 -0
- package/dist/services/worker-bootstrap.d.ts +15 -0
- package/dist/services/worker-bootstrap.d.ts.map +1 -0
- package/dist/services/worker-bootstrap.js +744 -0
- package/dist/services/worker-bootstrap.js.map +1 -0
- package/dist/templates/auth-service.d.ts +42 -0
- package/dist/templates/auth-service.d.ts.map +1 -0
- package/dist/templates/auth-service.js +54 -0
- package/dist/templates/auth-service.js.map +1 -0
- package/dist/templates/identity-service.d.ts +50 -0
- package/dist/templates/identity-service.d.ts.map +1 -0
- package/dist/templates/identity-service.js +62 -0
- package/dist/templates/identity-service.js.map +1 -0
- package/dist/types/contract.d.ts +120 -0
- package/dist/types/contract.d.ts.map +1 -0
- package/dist/types/contract.js +69 -0
- package/dist/types/contract.js.map +1 -0
- package/package.json +79 -20
- package/src/core/DirectMessageBus.js +0 -364
- package/src/core/EndpointResolver.js +0 -259
- package/src/core/ForgeContext.js +0 -2236
- package/src/core/ForgeHost.js +0 -122
- package/src/core/ForgePlatform.js +0 -145
- package/src/core/Ingress.js +0 -768
- package/src/core/Interceptors.js +0 -420
- package/src/core/MessageBus.js +0 -321
- package/src/core/Prometheus.js +0 -305
- package/src/core/RequestContext.js +0 -413
- package/src/core/RoutingStrategy.js +0 -330
- package/src/core/Supervisor.js +0 -1349
- package/src/core/ThreadAllocator.js +0 -196
- package/src/core/WorkerChannelManager.js +0 -879
- package/src/core/config.js +0 -637
- package/src/core/host-config.js +0 -311
- package/src/core/network-utils.js +0 -166
- package/src/core/platform-config.js +0 -308
- package/src/decorators/ServiceProxy.js +0 -904
- package/src/decorators/index.js +0 -571
- package/src/deploy/NginxGenerator.js +0 -865
- package/src/deploy/PlatformManifestGenerator.js +0 -96
- package/src/deploy/RouteManifestGenerator.js +0 -112
- package/src/deploy/index.js +0 -984
- package/src/frontend/FrontendDevLifecycle.js +0 -65
- package/src/frontend/FrontendPluginOrchestrator.js +0 -187
- package/src/frontend/SiteResolver.js +0 -63
- package/src/frontend/StaticMountRegistry.js +0 -90
- package/src/frontend/plugins/viteFrontend.js +0 -79
- package/src/frontend/types.js +0 -35
- package/src/index.js +0 -58
- package/src/plugins/PluginManager.js +0 -537
- package/src/plugins/ScopedPostgres.js +0 -192
- package/src/plugins/ScopedRedis.js +0 -142
- package/src/plugins/index.js +0 -1756
- package/src/registry/ServiceRegistry.js +0 -797
- package/src/scaling/ScaleAdvisor.js +0 -442
- package/src/services/Service.js +0 -195
- package/src/services/worker-bootstrap.js +0 -679
- package/src/templates/auth-service.js +0 -65
- 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"}
|