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