threadforge 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -20
- 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 +78 -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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForgeHost — Multi-Project Hosting Platform
|
|
3
|
+
*
|
|
4
|
+
* Wraps Supervisor via composition to manage multiple projects
|
|
5
|
+
* sharing one machine, one Postgres, one Redis, and one auth system.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* import { ForgeHost, defineHost } from 'threadforge';
|
|
10
|
+
*
|
|
11
|
+
* const hostConfig = defineHost({ ... });
|
|
12
|
+
* const host = new ForgeHost(hostConfig);
|
|
13
|
+
* await host.start();
|
|
14
|
+
*/
|
|
15
|
+
import type { HostMeta } from "./host-config.js";
|
|
16
|
+
import { resolveAndDefine } from "./host-config.js";
|
|
17
|
+
import type { RegistryMode } from "./config-enums.js";
|
|
18
|
+
interface SupervisorOptions {
|
|
19
|
+
cpus?: number;
|
|
20
|
+
reserved?: number;
|
|
21
|
+
registryMode?: RegistryMode;
|
|
22
|
+
host?: string;
|
|
23
|
+
httpBasePort?: number;
|
|
24
|
+
evaluationIntervalMs?: number;
|
|
25
|
+
}
|
|
26
|
+
interface StatusGroup {
|
|
27
|
+
group: string;
|
|
28
|
+
services: Array<{
|
|
29
|
+
name: string;
|
|
30
|
+
}>;
|
|
31
|
+
workers: number;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
interface StatusResult {
|
|
35
|
+
processGroups: StatusGroup[];
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
interface HostStatus extends StatusResult {
|
|
39
|
+
hostMode: true;
|
|
40
|
+
domain: string | null;
|
|
41
|
+
projects: Record<string, ProjectStatus>;
|
|
42
|
+
}
|
|
43
|
+
interface ProjectStatus {
|
|
44
|
+
domain: string | null;
|
|
45
|
+
services: number;
|
|
46
|
+
workers: number;
|
|
47
|
+
schema: string;
|
|
48
|
+
keyPrefix: string;
|
|
49
|
+
}
|
|
50
|
+
type HostConfigInput = Parameters<typeof resolveAndDefine>[0];
|
|
51
|
+
export declare class ForgeHost {
|
|
52
|
+
private _hostConfig;
|
|
53
|
+
private _options;
|
|
54
|
+
private _supervisor;
|
|
55
|
+
private _resolvedConfig;
|
|
56
|
+
private _hostMeta;
|
|
57
|
+
constructor(hostConfig: HostConfigInput, options?: SupervisorOptions);
|
|
58
|
+
/**
|
|
59
|
+
* Resolve all project configs, merge into one flat config,
|
|
60
|
+
* and start the Supervisor.
|
|
61
|
+
*/
|
|
62
|
+
start(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Gracefully shut down the entire host.
|
|
65
|
+
*/
|
|
66
|
+
shutdown(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get status with per-project breakdown.
|
|
69
|
+
*/
|
|
70
|
+
status(): HostStatus | null;
|
|
71
|
+
/**
|
|
72
|
+
* Get the list of project IDs.
|
|
73
|
+
*/
|
|
74
|
+
get projectIds(): string[];
|
|
75
|
+
/**
|
|
76
|
+
* Get metadata for a specific project.
|
|
77
|
+
*/
|
|
78
|
+
getProject(projectId: string): HostMeta | null;
|
|
79
|
+
private _printHostInfo;
|
|
80
|
+
}
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=ForgeHost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgeHost.d.ts","sourceRoot":"","sources":["../../src/core/ForgeHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAA4B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,YAAY;IACpB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,UAAW,SAAQ,YAAY;IACvC,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,SAAS,CAAkC;gBAEvC,UAAU,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB;IAQxE;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,MAAM,IAAI,UAAU,GAAG,IAAI;IA4B3B;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,EAAE,CAEzB;IAED;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAI9C,OAAO,CAAC,cAAc;CAiBvB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForgeHost — Multi-Project Hosting Platform
|
|
3
|
+
*
|
|
4
|
+
* Wraps Supervisor via composition to manage multiple projects
|
|
5
|
+
* sharing one machine, one Postgres, one Redis, and one auth system.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* import { ForgeHost, defineHost } from 'threadforge';
|
|
10
|
+
*
|
|
11
|
+
* const hostConfig = defineHost({ ... });
|
|
12
|
+
* const host = new ForgeHost(hostConfig);
|
|
13
|
+
* await host.start();
|
|
14
|
+
*/
|
|
15
|
+
import { resolveAndDefine } from "./host-config.js";
|
|
16
|
+
import { Supervisor } from "./Supervisor.js";
|
|
17
|
+
export class ForgeHost {
|
|
18
|
+
_hostConfig;
|
|
19
|
+
_options;
|
|
20
|
+
_supervisor;
|
|
21
|
+
_resolvedConfig;
|
|
22
|
+
_hostMeta;
|
|
23
|
+
constructor(hostConfig, options = {}) {
|
|
24
|
+
this._hostConfig = hostConfig;
|
|
25
|
+
this._options = options;
|
|
26
|
+
this._supervisor = null;
|
|
27
|
+
this._resolvedConfig = null;
|
|
28
|
+
this._hostMeta = null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve all project configs, merge into one flat config,
|
|
32
|
+
* and start the Supervisor.
|
|
33
|
+
*/
|
|
34
|
+
async start() {
|
|
35
|
+
// Resolve host config → flat service map → defineServices()
|
|
36
|
+
this._resolvedConfig = await resolveAndDefine(this._hostConfig);
|
|
37
|
+
this._hostMeta = this._resolvedConfig._hostMeta;
|
|
38
|
+
// Store host meta as JSON for workers to read
|
|
39
|
+
this._resolvedConfig._hostMetaJSON = JSON.stringify(this._hostMeta);
|
|
40
|
+
// Create and start the Supervisor with the merged config
|
|
41
|
+
this._supervisor = new Supervisor(this._resolvedConfig, this._options);
|
|
42
|
+
await this._supervisor.start();
|
|
43
|
+
this._printHostInfo();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gracefully shut down the entire host.
|
|
47
|
+
*/
|
|
48
|
+
async shutdown() {
|
|
49
|
+
if (this._supervisor) {
|
|
50
|
+
await this._supervisor.shutdown();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get status with per-project breakdown.
|
|
55
|
+
*/
|
|
56
|
+
status() {
|
|
57
|
+
if (!this._supervisor || !this._hostMeta)
|
|
58
|
+
return null;
|
|
59
|
+
const base = this._supervisor._status();
|
|
60
|
+
const projects = {};
|
|
61
|
+
for (const [projectId, meta] of Object.entries(this._hostMeta)) {
|
|
62
|
+
const projectGroups = base.processGroups.filter((pg) => pg.services.some((s) => meta.services.includes(s.name)));
|
|
63
|
+
projects[projectId] = {
|
|
64
|
+
domain: meta.domain,
|
|
65
|
+
services: meta.services.length,
|
|
66
|
+
workers: projectGroups.reduce((sum, pg) => sum + pg.workers, 0),
|
|
67
|
+
schema: meta.schema,
|
|
68
|
+
keyPrefix: meta.keyPrefix,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
...base,
|
|
73
|
+
hostMode: true,
|
|
74
|
+
domain: this._resolvedConfig._hostDomain,
|
|
75
|
+
projects,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the list of project IDs.
|
|
80
|
+
*/
|
|
81
|
+
get projectIds() {
|
|
82
|
+
return Object.keys(this._hostMeta ?? {});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get metadata for a specific project.
|
|
86
|
+
*/
|
|
87
|
+
getProject(projectId) {
|
|
88
|
+
return this._hostMeta?.[projectId] ?? null;
|
|
89
|
+
}
|
|
90
|
+
_printHostInfo() {
|
|
91
|
+
console.log(`\n ForgeHost — Multi-Project Platform`);
|
|
92
|
+
console.log(` ─────────────────────────────────────`);
|
|
93
|
+
if (this._resolvedConfig._hostDomain) {
|
|
94
|
+
console.log(` Domain: ${this._resolvedConfig._hostDomain}`);
|
|
95
|
+
}
|
|
96
|
+
console.log(` Projects: ${Object.keys(this._hostMeta).length}`);
|
|
97
|
+
console.log("");
|
|
98
|
+
for (const [projectId, meta] of Object.entries(this._hostMeta)) {
|
|
99
|
+
const domain = meta.domain ? ` (${meta.domain})` : "";
|
|
100
|
+
console.log(` ${projectId}${domain}`);
|
|
101
|
+
console.log(` Services: ${meta.services.join(", ")}`);
|
|
102
|
+
console.log(` Schema: ${meta.schema}`);
|
|
103
|
+
}
|
|
104
|
+
console.log("");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=ForgeHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgeHost.js","sourceRoot":"","sources":["../../src/core/ForgeHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForgePlatform — Platform Mode Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Wraps ForgeHost to provide a platform-level lifecycle with
|
|
5
|
+
* domain-based multi-app routing, shared services, and
|
|
6
|
+
* platform-specific banner output.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
*
|
|
10
|
+
* import { ForgePlatform, definePlatform } from 'threadforge';
|
|
11
|
+
*
|
|
12
|
+
* const config = definePlatform({ ... });
|
|
13
|
+
* const platform = new ForgePlatform(config);
|
|
14
|
+
* await platform.start();
|
|
15
|
+
*/
|
|
16
|
+
interface PlatformApp {
|
|
17
|
+
domains?: string[];
|
|
18
|
+
domain?: string;
|
|
19
|
+
static?: string | null;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
interface PlatformBlock {
|
|
23
|
+
globalAuth?: boolean;
|
|
24
|
+
apps: Record<string, PlatformApp>;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
interface RawPlatformConfig {
|
|
28
|
+
platform: PlatformBlock;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
interface PlatformConfigWrapped {
|
|
32
|
+
_isPlatformConfig: true;
|
|
33
|
+
_raw: RawPlatformConfig;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
type PlatformConfigInput = PlatformConfigWrapped | RawPlatformConfig;
|
|
37
|
+
interface HostMeta {
|
|
38
|
+
services: string[];
|
|
39
|
+
schema: string;
|
|
40
|
+
domain?: string;
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
interface AppInfo {
|
|
44
|
+
domains: string[];
|
|
45
|
+
services: string[];
|
|
46
|
+
schema: string;
|
|
47
|
+
static: string | null;
|
|
48
|
+
}
|
|
49
|
+
interface PlatformStatus {
|
|
50
|
+
platformMode: true;
|
|
51
|
+
apps: Record<string, AppInfo>;
|
|
52
|
+
[key: string]: unknown;
|
|
53
|
+
}
|
|
54
|
+
interface SupervisorOptions {
|
|
55
|
+
[key: string]: unknown;
|
|
56
|
+
}
|
|
57
|
+
export declare class ForgePlatform {
|
|
58
|
+
private _platformConfig;
|
|
59
|
+
private _options;
|
|
60
|
+
private _host;
|
|
61
|
+
private _resolvedConfig;
|
|
62
|
+
private _hostMeta;
|
|
63
|
+
private _platformApps;
|
|
64
|
+
/**
|
|
65
|
+
* @param platformConfig - Output from definePlatform() or raw platform config
|
|
66
|
+
* @param options - Supervisor options override
|
|
67
|
+
*/
|
|
68
|
+
constructor(platformConfig: PlatformConfigInput, options?: SupervisorOptions);
|
|
69
|
+
/**
|
|
70
|
+
* Start the platform: resolve config, create ForgeHost, start.
|
|
71
|
+
*/
|
|
72
|
+
start(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Gracefully shut down the platform.
|
|
75
|
+
*/
|
|
76
|
+
shutdown(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Get the apps map: appId -> { domains, services, schema }
|
|
79
|
+
*/
|
|
80
|
+
get apps(): Record<string, AppInfo>;
|
|
81
|
+
/**
|
|
82
|
+
* Get the host metadata (from ForgeHost).
|
|
83
|
+
*/
|
|
84
|
+
get hostMeta(): Record<string, HostMeta>;
|
|
85
|
+
/**
|
|
86
|
+
* Get platform status with per-app breakdown.
|
|
87
|
+
*/
|
|
88
|
+
status(): PlatformStatus | null;
|
|
89
|
+
/**
|
|
90
|
+
* Collect all service names that belong to a project (not shared).
|
|
91
|
+
*/
|
|
92
|
+
private _collectProjectServiceNames;
|
|
93
|
+
private _printPlatformBanner;
|
|
94
|
+
}
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=ForgePlatform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgePlatform.d.ts","sourceRoot":"","sources":["../../src/core/ForgePlatform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,qBAAqB;IAC7B,iBAAiB,EAAE,IAAI,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,KAAK,mBAAmB,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;AAErE,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,cAAc;IACtB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,iBAAiB;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,aAAa,CAAqC;IAE1D;;;OAGG;gBACS,cAAc,EAAE,mBAAmB,EAAE,OAAO,GAAE,iBAAsB;IAShF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclC;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAEvC;IAED;;OAEG;IACH,MAAM,IAAI,cAAc,GAAG,IAAI;IAW/B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAQnC,OAAO,CAAC,oBAAoB;CA8B7B"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ForgePlatform — Platform Mode Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Wraps ForgeHost to provide a platform-level lifecycle with
|
|
5
|
+
* domain-based multi-app routing, shared services, and
|
|
6
|
+
* platform-specific banner output.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
*
|
|
10
|
+
* import { ForgePlatform, definePlatform } from 'threadforge';
|
|
11
|
+
*
|
|
12
|
+
* const config = definePlatform({ ... });
|
|
13
|
+
* const platform = new ForgePlatform(config);
|
|
14
|
+
* await platform.start();
|
|
15
|
+
*/
|
|
16
|
+
import { ForgeHost } from "./ForgeHost.js";
|
|
17
|
+
import { resolveAppDomains, transformToHostConfig } from "./platform-config.js";
|
|
18
|
+
export class ForgePlatform {
|
|
19
|
+
_platformConfig;
|
|
20
|
+
_options;
|
|
21
|
+
_host;
|
|
22
|
+
_resolvedConfig;
|
|
23
|
+
_hostMeta;
|
|
24
|
+
_platformApps;
|
|
25
|
+
/**
|
|
26
|
+
* @param platformConfig - Output from definePlatform() or raw platform config
|
|
27
|
+
* @param options - Supervisor options override
|
|
28
|
+
*/
|
|
29
|
+
constructor(platformConfig, options = {}) {
|
|
30
|
+
this._platformConfig = platformConfig;
|
|
31
|
+
this._options = options;
|
|
32
|
+
this._host = null;
|
|
33
|
+
this._resolvedConfig = null;
|
|
34
|
+
this._hostMeta = null;
|
|
35
|
+
this._platformApps = null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start the platform: resolve config, create ForgeHost, start.
|
|
39
|
+
*/
|
|
40
|
+
async start() {
|
|
41
|
+
const raw = "_isPlatformConfig" in this._platformConfig && this._platformConfig._isPlatformConfig
|
|
42
|
+
? this._platformConfig._raw
|
|
43
|
+
: this._platformConfig;
|
|
44
|
+
const hostConfig = transformToHostConfig(raw);
|
|
45
|
+
this._platformApps = raw.platform.apps;
|
|
46
|
+
this._host = new ForgeHost(hostConfig, this._options);
|
|
47
|
+
await this._host.start();
|
|
48
|
+
this._resolvedConfig = this._host._resolvedConfig;
|
|
49
|
+
this._hostMeta = this._resolvedConfig._hostMeta ?? null;
|
|
50
|
+
this._resolvedConfig._isPlatformMode = true;
|
|
51
|
+
this._printPlatformBanner();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Gracefully shut down the platform.
|
|
55
|
+
*/
|
|
56
|
+
async shutdown() {
|
|
57
|
+
if (this._host) {
|
|
58
|
+
await this._host.shutdown();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the apps map: appId -> { domains, services, schema }
|
|
63
|
+
*/
|
|
64
|
+
get apps() {
|
|
65
|
+
if (!this._platformApps || !this._hostMeta)
|
|
66
|
+
return {};
|
|
67
|
+
const result = {};
|
|
68
|
+
for (const [appId, app] of Object.entries(this._platformApps)) {
|
|
69
|
+
const meta = this._hostMeta[appId];
|
|
70
|
+
result[appId] = {
|
|
71
|
+
domains: resolveAppDomains(app),
|
|
72
|
+
services: meta?.services ?? [],
|
|
73
|
+
schema: meta?.schema ?? appId,
|
|
74
|
+
static: app.static ?? null,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the host metadata (from ForgeHost).
|
|
81
|
+
*/
|
|
82
|
+
get hostMeta() {
|
|
83
|
+
return this._hostMeta ?? {};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get platform status with per-app breakdown.
|
|
87
|
+
*/
|
|
88
|
+
status() {
|
|
89
|
+
if (!this._host)
|
|
90
|
+
return null;
|
|
91
|
+
const base = this._host.status();
|
|
92
|
+
return {
|
|
93
|
+
...base,
|
|
94
|
+
platformMode: true,
|
|
95
|
+
apps: this.apps,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Collect all service names that belong to a project (not shared).
|
|
100
|
+
*/
|
|
101
|
+
_collectProjectServiceNames() {
|
|
102
|
+
const names = new Set();
|
|
103
|
+
for (const meta of Object.values(this._hostMeta ?? {})) {
|
|
104
|
+
for (const svc of meta.services)
|
|
105
|
+
names.add(svc);
|
|
106
|
+
}
|
|
107
|
+
return names;
|
|
108
|
+
}
|
|
109
|
+
_printPlatformBanner() {
|
|
110
|
+
console.log(`\n ForgePlatform — Multi-App Platform Mode`);
|
|
111
|
+
console.log(` ──────────────────────────────────────────`);
|
|
112
|
+
const apps = this._platformApps;
|
|
113
|
+
if (!apps)
|
|
114
|
+
return;
|
|
115
|
+
console.log(` Apps: ${Object.keys(apps).length}`);
|
|
116
|
+
console.log("");
|
|
117
|
+
for (const [appId, app] of Object.entries(apps)) {
|
|
118
|
+
const domains = resolveAppDomains(app);
|
|
119
|
+
const meta = this._hostMeta?.[appId];
|
|
120
|
+
console.log(` ${appId}`);
|
|
121
|
+
console.log(` Domains: ${domains.join(", ")}`);
|
|
122
|
+
if (meta) {
|
|
123
|
+
console.log(` Services: ${meta.services.join(", ")}`);
|
|
124
|
+
console.log(` Schema: ${meta.schema}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const projectServices = this._collectProjectServiceNames();
|
|
128
|
+
const allServices = Object.keys(this._resolvedConfig?.services ?? {});
|
|
129
|
+
const sharedServices = allServices.filter((s) => !projectServices.has(s));
|
|
130
|
+
if (sharedServices.length > 0) {
|
|
131
|
+
console.log(`\n Shared: ${sharedServices.join(", ")}`);
|
|
132
|
+
}
|
|
133
|
+
console.log("");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ForgePlatform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgePlatform.js","sourceRoot":"","sources":["../../src/core/ForgePlatform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { Socket } from "node:net";
|
|
3
|
+
import type { RequestContext } from "./RequestContext.js";
|
|
4
|
+
export interface WsOptions {
|
|
5
|
+
auth?: string;
|
|
6
|
+
allowedOrigins?: string[];
|
|
7
|
+
pingInterval?: number;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Minimal WebSocket implementation (RFC 6455 framing).
|
|
12
|
+
* No external dependencies. Handles text frames, ping/pong, close.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ForgeWebSocket extends EventEmitter {
|
|
15
|
+
socket: Socket;
|
|
16
|
+
ctx: RequestContext;
|
|
17
|
+
_closed: boolean;
|
|
18
|
+
_closeSent: boolean;
|
|
19
|
+
_closeTimer: ReturnType<typeof setTimeout> | null;
|
|
20
|
+
_bufferChunks: Buffer[];
|
|
21
|
+
_bufferTotalLen: number;
|
|
22
|
+
_fragments: Buffer[];
|
|
23
|
+
_fragmentOpcode: number;
|
|
24
|
+
_fragmentsTotalSize: number;
|
|
25
|
+
_totalBuffered: number;
|
|
26
|
+
_outboundBuffered: number;
|
|
27
|
+
_pingTimer: ReturnType<typeof setInterval> | null;
|
|
28
|
+
_lastPong: number;
|
|
29
|
+
constructor(socket: Socket, rctx: RequestContext, options?: WsOptions);
|
|
30
|
+
send(data: string | Buffer): void;
|
|
31
|
+
sendBinary(data: Buffer | Uint8Array): void;
|
|
32
|
+
/**
|
|
33
|
+
* Write a frame to the socket while tracking outbound backpressure.
|
|
34
|
+
* Increments _outboundBuffered on write; decrements on drain/callback
|
|
35
|
+
* so _totalBuffered reflects actual pending bytes, not lifetime total.
|
|
36
|
+
*/
|
|
37
|
+
_trackOutboundWrite(frame: Buffer): void;
|
|
38
|
+
close(code?: number, reason?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* P7: Consolidate buffer chunks into a single Buffer only when needed.
|
|
41
|
+
*/
|
|
42
|
+
_consolidateBuffer(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get the current buffer as a single Buffer (consolidating if needed).
|
|
45
|
+
*/
|
|
46
|
+
get _buffer(): Buffer;
|
|
47
|
+
/**
|
|
48
|
+
* Set the buffer (replaces all chunks).
|
|
49
|
+
*/
|
|
50
|
+
set _buffer(buf: Buffer);
|
|
51
|
+
_onData(buf: Buffer): void;
|
|
52
|
+
_encodeFrame(payload: Buffer, opcode: number): Buffer;
|
|
53
|
+
_onClose(): void;
|
|
54
|
+
_startPingInterval(intervalMs: number): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=ForgeWebSocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForgeWebSocket.d.ts","sourceRoot":"","sources":["../../src/core/ForgeWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;IAClD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GAAE,SAAc;IA8BzE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAO3C;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmBxC,KAAK,CAAC,IAAI,GAAE,MAAa,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI;IA0BrD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAW1B;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAKpB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,EAQtB;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA2N1B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAqBrD,QAAQ,IAAI,IAAI;IAgBhB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAoB7C"}
|