@blokjs/runner 0.2.0
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/dist/Blok.d.ts +19 -0
- package/dist/Blok.js +184 -0
- package/dist/Blok.js.map +1 -0
- package/dist/BlokResponse.d.ts +16 -0
- package/dist/BlokResponse.js +28 -0
- package/dist/BlokResponse.js.map +1 -0
- package/dist/Configuration.d.ts +37 -0
- package/dist/Configuration.js +248 -0
- package/dist/Configuration.js.map +1 -0
- package/dist/ConfigurationResolver.d.ts +7 -0
- package/dist/ConfigurationResolver.js +15 -0
- package/dist/ConfigurationResolver.js.map +1 -0
- package/dist/DefaultLogger.d.ts +65 -0
- package/dist/DefaultLogger.js +101 -0
- package/dist/DefaultLogger.js.map +1 -0
- package/dist/LocalStorage.d.ts +7 -0
- package/dist/LocalStorage.js +56 -0
- package/dist/LocalStorage.js.map +1 -0
- package/dist/MemoryUsage.d.ts +22 -0
- package/dist/MemoryUsage.js +83 -0
- package/dist/MemoryUsage.js.map +1 -0
- package/dist/NodeMap.d.ts +7 -0
- package/dist/NodeMap.js +13 -0
- package/dist/NodeMap.js.map +1 -0
- package/dist/ResolverBase.d.ts +8 -0
- package/dist/ResolverBase.js +18 -0
- package/dist/ResolverBase.js.map +1 -0
- package/dist/Runner.d.ts +25 -0
- package/dist/Runner.js +32 -0
- package/dist/Runner.js.map +1 -0
- package/dist/RunnerNode.d.ts +9 -0
- package/dist/RunnerNode.js +8 -0
- package/dist/RunnerNode.js.map +1 -0
- package/dist/RunnerNodeBase.d.ts +4 -0
- package/dist/RunnerNodeBase.js +3 -0
- package/dist/RunnerNodeBase.js.map +1 -0
- package/dist/RunnerSteps.d.ts +14 -0
- package/dist/RunnerSteps.js +110 -0
- package/dist/RunnerSteps.js.map +1 -0
- package/dist/RuntimeAdapterNode.d.ts +19 -0
- package/dist/RuntimeAdapterNode.js +87 -0
- package/dist/RuntimeAdapterNode.js.map +1 -0
- package/dist/RuntimeRegistry.d.ts +61 -0
- package/dist/RuntimeRegistry.js +87 -0
- package/dist/RuntimeRegistry.js.map +1 -0
- package/dist/TriggerBase.d.ts +119 -0
- package/dist/TriggerBase.js +413 -0
- package/dist/TriggerBase.js.map +1 -0
- package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
- package/dist/adapters/BunRuntimeAdapter.js +169 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
- package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
- package/dist/adapters/DockerRuntimeAdapter.js +298 -0
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
- package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
- package/dist/adapters/HttpRuntimeAdapter.js +152 -0
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
- package/dist/adapters/RuntimeAdapter.d.ts +42 -0
- package/dist/adapters/RuntimeAdapter.js +2 -0
- package/dist/adapters/RuntimeAdapter.js.map +1 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
- package/dist/adapters/WasmRuntimeAdapter.js +279 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
- package/dist/cache/NodeResultCache.d.ts +286 -0
- package/dist/cache/NodeResultCache.js +499 -0
- package/dist/cache/NodeResultCache.js.map +1 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cost/CostEstimator.d.ts +57 -0
- package/dist/cost/CostEstimator.js +171 -0
- package/dist/cost/CostEstimator.js.map +1 -0
- package/dist/cost/index.d.ts +4 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/pricing.d.ts +24 -0
- package/dist/cost/pricing.js +169 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/defineNode.d.ts +155 -0
- package/dist/defineNode.js +191 -0
- package/dist/defineNode.js.map +1 -0
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
- package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
- package/dist/hmr/FileWatcher.d.ts +62 -0
- package/dist/hmr/FileWatcher.js +185 -0
- package/dist/hmr/FileWatcher.js.map +1 -0
- package/dist/hmr/HmrDevConsole.d.ts +13 -0
- package/dist/hmr/HmrDevConsole.js +46 -0
- package/dist/hmr/HmrDevConsole.js.map +1 -0
- package/dist/hmr/HotReloadManager.d.ts +84 -0
- package/dist/hmr/HotReloadManager.js +195 -0
- package/dist/hmr/HotReloadManager.js.map +1 -0
- package/dist/hmr/index.d.ts +39 -0
- package/dist/hmr/index.js +38 -0
- package/dist/hmr/index.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/APMIntegration.d.ts +141 -0
- package/dist/integrations/APMIntegration.js +212 -0
- package/dist/integrations/APMIntegration.js.map +1 -0
- package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
- package/dist/integrations/AzureMonitorIntegration.js +254 -0
- package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
- package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
- package/dist/integrations/CloudWatchIntegration.js +293 -0
- package/dist/integrations/CloudWatchIntegration.js.map +1 -0
- package/dist/integrations/SentryIntegration.d.ts +153 -0
- package/dist/integrations/SentryIntegration.js +200 -0
- package/dist/integrations/SentryIntegration.js.map +1 -0
- package/dist/integrations/index.d.ts +19 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
- package/dist/marketplace/RuntimeAutoScaler.js +366 -0
- package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
- package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
- package/dist/marketplace/RuntimeCatalog.js +339 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -0
- package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
- package/dist/marketplace/RuntimeDiscovery.js +219 -0
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
- package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
- package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
- package/dist/monitoring/CircuitBreaker.d.ts +107 -0
- package/dist/monitoring/CircuitBreaker.js +238 -0
- package/dist/monitoring/CircuitBreaker.js.map +1 -0
- package/dist/monitoring/DistributedTracer.d.ts +125 -0
- package/dist/monitoring/DistributedTracer.js +230 -0
- package/dist/monitoring/DistributedTracer.js.map +1 -0
- package/dist/monitoring/HealthCheck.d.ts +54 -0
- package/dist/monitoring/HealthCheck.js +102 -0
- package/dist/monitoring/HealthCheck.js.map +1 -0
- package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
- package/dist/monitoring/PerformanceProfiler.js +229 -0
- package/dist/monitoring/PerformanceProfiler.js.map +1 -0
- package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
- package/dist/monitoring/PrometheusBootstrap.js +71 -0
- package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
- package/dist/monitoring/RateLimiter.d.ts +58 -0
- package/dist/monitoring/RateLimiter.js +128 -0
- package/dist/monitoring/RateLimiter.js.map +1 -0
- package/dist/monitoring/StructuredLogger.d.ts +131 -0
- package/dist/monitoring/StructuredLogger.js +207 -0
- package/dist/monitoring/StructuredLogger.js.map +1 -0
- package/dist/monitoring/TracingBootstrap.d.ts +69 -0
- package/dist/monitoring/TracingBootstrap.js +129 -0
- package/dist/monitoring/TracingBootstrap.js.map +1 -0
- package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
- package/dist/monitoring/TriggerMetricsCollector.js +174 -0
- package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
- package/dist/monitoring/index.d.ts +9 -0
- package/dist/monitoring/index.js +10 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
- package/dist/openapi/OpenAPIGenerator.js +373 -0
- package/dist/openapi/OpenAPIGenerator.js.map +1 -0
- package/dist/openapi/index.d.ts +20 -0
- package/dist/openapi/index.js +20 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/security/ABAC.d.ts +224 -0
- package/dist/security/ABAC.js +380 -0
- package/dist/security/ABAC.js.map +1 -0
- package/dist/security/AuditLogger.d.ts +242 -0
- package/dist/security/AuditLogger.js +317 -0
- package/dist/security/AuditLogger.js.map +1 -0
- package/dist/security/AuthMiddleware.d.ts +163 -0
- package/dist/security/AuthMiddleware.js +274 -0
- package/dist/security/AuthMiddleware.js.map +1 -0
- package/dist/security/EncryptionAtRest.d.ts +206 -0
- package/dist/security/EncryptionAtRest.js +236 -0
- package/dist/security/EncryptionAtRest.js.map +1 -0
- package/dist/security/OAuthProvider.d.ts +334 -0
- package/dist/security/OAuthProvider.js +719 -0
- package/dist/security/OAuthProvider.js.map +1 -0
- package/dist/security/PIIDetector.d.ts +233 -0
- package/dist/security/PIIDetector.js +354 -0
- package/dist/security/PIIDetector.js.map +1 -0
- package/dist/security/RBAC.d.ts +143 -0
- package/dist/security/RBAC.js +285 -0
- package/dist/security/RBAC.js.map +1 -0
- package/dist/security/SecretManager.d.ts +652 -0
- package/dist/security/SecretManager.js +1146 -0
- package/dist/security/SecretManager.js.map +1 -0
- package/dist/security/TLSConfig.d.ts +305 -0
- package/dist/security/TLSConfig.js +550 -0
- package/dist/security/TLSConfig.js.map +1 -0
- package/dist/security/index.d.ts +79 -0
- package/dist/security/index.js +80 -0
- package/dist/security/index.js.map +1 -0
- package/dist/testing/TestHarness.d.ts +189 -0
- package/dist/testing/TestHarness.js +272 -0
- package/dist/testing/TestHarness.js.map +1 -0
- package/dist/testing/TestLogger.d.ts +103 -0
- package/dist/testing/TestLogger.js +153 -0
- package/dist/testing/TestLogger.js.map +1 -0
- package/dist/testing/WorkflowTestRunner.d.ts +172 -0
- package/dist/testing/WorkflowTestRunner.js +355 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracing/InMemoryRunStore.d.ts +44 -0
- package/dist/tracing/InMemoryRunStore.js +341 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -0
- package/dist/tracing/PostgresRunStore.d.ts +82 -0
- package/dist/tracing/PostgresRunStore.js +640 -0
- package/dist/tracing/PostgresRunStore.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +38 -0
- package/dist/tracing/RunStore.js +2 -0
- package/dist/tracing/RunStore.js.map +1 -0
- package/dist/tracing/RunTracker.d.ts +75 -0
- package/dist/tracing/RunTracker.js +374 -0
- package/dist/tracing/RunTracker.js.map +1 -0
- package/dist/tracing/SqliteRunStore.d.ts +53 -0
- package/dist/tracing/SqliteRunStore.js +703 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -0
- package/dist/tracing/TraceRouter.d.ts +47 -0
- package/dist/tracing/TraceRouter.js +904 -0
- package/dist/tracing/TraceRouter.js.map +1 -0
- package/dist/tracing/TracingLogger.d.ts +21 -0
- package/dist/tracing/TracingLogger.js +62 -0
- package/dist/tracing/TracingLogger.js.map +1 -0
- package/dist/tracing/createStore.d.ts +30 -0
- package/dist/tracing/createStore.js +75 -0
- package/dist/tracing/createStore.js.map +1 -0
- package/dist/tracing/index.d.ts +13 -0
- package/dist/tracing/index.js +9 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/sanitize.d.ts +7 -0
- package/dist/tracing/sanitize.js +95 -0
- package/dist/tracing/sanitize.js.map +1 -0
- package/dist/tracing/types.d.ts +178 -0
- package/dist/tracing/types.js +3 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/Average.d.ts +11 -0
- package/dist/types/Average.js +2 -0
- package/dist/types/Average.js.map +1 -0
- package/dist/types/Condition.d.ts +8 -0
- package/dist/types/Condition.js +2 -0
- package/dist/types/Condition.js.map +1 -0
- package/dist/types/Conditions.d.ts +5 -0
- package/dist/types/Conditions.js +2 -0
- package/dist/types/Conditions.js.map +1 -0
- package/dist/types/Config.d.ts +12 -0
- package/dist/types/Config.js +2 -0
- package/dist/types/Config.js.map +1 -0
- package/dist/types/Flow.d.ts +5 -0
- package/dist/types/Flow.js +2 -0
- package/dist/types/Flow.js.map +1 -0
- package/dist/types/GlobalOptions.d.ts +11 -0
- package/dist/types/GlobalOptions.js +2 -0
- package/dist/types/GlobalOptions.js.map +1 -0
- package/dist/types/Inputs.d.ts +5 -0
- package/dist/types/Inputs.js +2 -0
- package/dist/types/Inputs.js.map +1 -0
- package/dist/types/JsonLikeObject.d.ts +3 -0
- package/dist/types/JsonLikeObject.js +2 -0
- package/dist/types/JsonLikeObject.js.map +1 -0
- package/dist/types/Mapper.d.ts +5 -0
- package/dist/types/Mapper.js +2 -0
- package/dist/types/Mapper.js.map +1 -0
- package/dist/types/Node.d.ts +10 -0
- package/dist/types/Node.js +2 -0
- package/dist/types/Node.js.map +1 -0
- package/dist/types/ParamsDictionary.d.ts +3 -0
- package/dist/types/ParamsDictionary.js +2 -0
- package/dist/types/ParamsDictionary.js.map +1 -0
- package/dist/types/Properties.d.ts +5 -0
- package/dist/types/Properties.js +2 -0
- package/dist/types/Properties.js.map +1 -0
- package/dist/types/Targets.d.ts +5 -0
- package/dist/types/Targets.js +2 -0
- package/dist/types/Targets.js.map +1 -0
- package/dist/types/Trigger.d.ts +5 -0
- package/dist/types/Trigger.js +2 -0
- package/dist/types/Trigger.js.map +1 -0
- package/dist/types/TriggerHttp.d.ts +7 -0
- package/dist/types/TriggerHttp.js +2 -0
- package/dist/types/TriggerHttp.js.map +1 -0
- package/dist/types/TriggerResponse.d.ts +6 -0
- package/dist/types/TriggerResponse.js +2 -0
- package/dist/types/TriggerResponse.js.map +1 -0
- package/dist/types/Triggers.d.ts +5 -0
- package/dist/types/Triggers.js +2 -0
- package/dist/types/Triggers.js.map +1 -0
- package/dist/types/TryCatch.d.ts +6 -0
- package/dist/types/TryCatch.js +2 -0
- package/dist/types/TryCatch.js.map +1 -0
- package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
- package/dist/visualization/NodeDependencyGraph.js +418 -0
- package/dist/visualization/NodeDependencyGraph.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
- package/dist/visualization/WorkflowVisualizer.js +446 -0
- package/dist/visualization/WorkflowVisualizer.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Context } from "@blokjs/shared";
|
|
2
|
+
import type RunnerNode from "../RunnerNode";
|
|
3
|
+
import type { ExecutionResult, RuntimeAdapter, RuntimeKind } from "./RuntimeAdapter";
|
|
4
|
+
/**
|
|
5
|
+
* Container pool configuration
|
|
6
|
+
*/
|
|
7
|
+
interface PoolConfig {
|
|
8
|
+
minInstances: number;
|
|
9
|
+
maxInstances: number;
|
|
10
|
+
maxIdleTime: number;
|
|
11
|
+
maxUseCount: number;
|
|
12
|
+
healthCheckInterval: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* DockerRuntimeAdapter executes nodes in Docker containers
|
|
16
|
+
*
|
|
17
|
+
* This adapter provides:
|
|
18
|
+
* - Container pooling for performance
|
|
19
|
+
* - Health checks for reliability
|
|
20
|
+
* - Automatic cleanup and recycling
|
|
21
|
+
* - HTTP-based communication protocol
|
|
22
|
+
*
|
|
23
|
+
* Containers must expose an HTTP endpoint that:
|
|
24
|
+
* - POST /execute - Executes a node with the provided context
|
|
25
|
+
* - GET /health - Returns container health status
|
|
26
|
+
*/
|
|
27
|
+
export declare class DockerRuntimeAdapter implements RuntimeAdapter {
|
|
28
|
+
readonly kind: RuntimeKind;
|
|
29
|
+
private image;
|
|
30
|
+
private pool;
|
|
31
|
+
private poolConfig;
|
|
32
|
+
private cleanupInterval?;
|
|
33
|
+
private healthCheckInterval?;
|
|
34
|
+
private nextPort;
|
|
35
|
+
constructor(kind: RuntimeKind | undefined, image: string, poolConfig?: Partial<PoolConfig>);
|
|
36
|
+
/**
|
|
37
|
+
* Execute a node in a Docker container
|
|
38
|
+
*/
|
|
39
|
+
execute(node: RunnerNode, ctx: Context): Promise<ExecutionResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Get a container from the pool or create a new one
|
|
42
|
+
*/
|
|
43
|
+
private getContainer;
|
|
44
|
+
/**
|
|
45
|
+
* Create a new container instance
|
|
46
|
+
*/
|
|
47
|
+
private createContainer;
|
|
48
|
+
/**
|
|
49
|
+
* Wait for container to be healthy
|
|
50
|
+
*/
|
|
51
|
+
private waitForHealth;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a container is healthy
|
|
54
|
+
*/
|
|
55
|
+
private checkHealth;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a request in a container
|
|
58
|
+
*/
|
|
59
|
+
private executeInContainer;
|
|
60
|
+
/**
|
|
61
|
+
* Create the execution request payload
|
|
62
|
+
*/
|
|
63
|
+
private createExecutionRequest;
|
|
64
|
+
/**
|
|
65
|
+
* Recycle a container (stop and remove from pool)
|
|
66
|
+
*/
|
|
67
|
+
private recycleContainer;
|
|
68
|
+
/**
|
|
69
|
+
* Initialize the container pool
|
|
70
|
+
*/
|
|
71
|
+
private initializePool;
|
|
72
|
+
/**
|
|
73
|
+
* Cleanup idle containers
|
|
74
|
+
*/
|
|
75
|
+
private cleanupIdleContainers;
|
|
76
|
+
/**
|
|
77
|
+
* Perform health checks on all containers
|
|
78
|
+
*/
|
|
79
|
+
private performHealthChecks;
|
|
80
|
+
/**
|
|
81
|
+
* Shutdown the adapter and cleanup all containers
|
|
82
|
+
*/
|
|
83
|
+
shutdown(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
/**
|
|
5
|
+
* DockerRuntimeAdapter executes nodes in Docker containers
|
|
6
|
+
*
|
|
7
|
+
* This adapter provides:
|
|
8
|
+
* - Container pooling for performance
|
|
9
|
+
* - Health checks for reliability
|
|
10
|
+
* - Automatic cleanup and recycling
|
|
11
|
+
* - HTTP-based communication protocol
|
|
12
|
+
*
|
|
13
|
+
* Containers must expose an HTTP endpoint that:
|
|
14
|
+
* - POST /execute - Executes a node with the provided context
|
|
15
|
+
* - GET /health - Returns container health status
|
|
16
|
+
*/
|
|
17
|
+
export class DockerRuntimeAdapter {
|
|
18
|
+
kind;
|
|
19
|
+
image;
|
|
20
|
+
pool = new Map();
|
|
21
|
+
poolConfig;
|
|
22
|
+
cleanupInterval;
|
|
23
|
+
healthCheckInterval;
|
|
24
|
+
nextPort = 9000;
|
|
25
|
+
constructor(kind = "docker", image, poolConfig) {
|
|
26
|
+
this.kind = kind;
|
|
27
|
+
this.image = image;
|
|
28
|
+
this.poolConfig = {
|
|
29
|
+
minInstances: poolConfig?.minInstances ?? 0,
|
|
30
|
+
maxInstances: poolConfig?.maxInstances ?? 5,
|
|
31
|
+
maxIdleTime: poolConfig?.maxIdleTime ?? 5 * 60 * 1000, // 5 minutes
|
|
32
|
+
maxUseCount: poolConfig?.maxUseCount ?? 100,
|
|
33
|
+
healthCheckInterval: poolConfig?.healthCheckInterval ?? 30 * 1000, // 30 seconds
|
|
34
|
+
};
|
|
35
|
+
// Initialize pool
|
|
36
|
+
this.initializePool();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a node in a Docker container
|
|
40
|
+
*/
|
|
41
|
+
async execute(node, ctx) {
|
|
42
|
+
const startTime = performance.now();
|
|
43
|
+
try {
|
|
44
|
+
// Get or create a container from the pool
|
|
45
|
+
const container = await this.getContainer();
|
|
46
|
+
// Prepare the execution request
|
|
47
|
+
const request = this.createExecutionRequest(node, ctx);
|
|
48
|
+
// Execute via HTTP POST to container
|
|
49
|
+
const response = await this.executeInContainer(container, request);
|
|
50
|
+
// Update container stats
|
|
51
|
+
container.lastUsed = Date.now();
|
|
52
|
+
container.useCount++;
|
|
53
|
+
// Recycle container if needed
|
|
54
|
+
if (container.useCount >= this.poolConfig.maxUseCount) {
|
|
55
|
+
await this.recycleContainer(container);
|
|
56
|
+
}
|
|
57
|
+
const duration_ms = performance.now() - startTime;
|
|
58
|
+
return {
|
|
59
|
+
success: response.success ?? true,
|
|
60
|
+
data: response.data,
|
|
61
|
+
errors: response.errors || null,
|
|
62
|
+
logs: response.logs,
|
|
63
|
+
metrics: {
|
|
64
|
+
duration_ms,
|
|
65
|
+
...(response.metrics || {}),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const duration_ms = performance.now() - startTime;
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
data: null,
|
|
74
|
+
errors: {
|
|
75
|
+
message: error.message,
|
|
76
|
+
stack: error.stack,
|
|
77
|
+
name: error.name,
|
|
78
|
+
},
|
|
79
|
+
metrics: {
|
|
80
|
+
duration_ms,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get a container from the pool or create a new one
|
|
87
|
+
*/
|
|
88
|
+
async getContainer() {
|
|
89
|
+
// Try to get a healthy container from the pool
|
|
90
|
+
for (const container of this.pool.values()) {
|
|
91
|
+
if (container.healthy && container.useCount < this.poolConfig.maxUseCount) {
|
|
92
|
+
return container;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Check if we can create a new container
|
|
96
|
+
if (this.pool.size < this.poolConfig.maxInstances) {
|
|
97
|
+
return await this.createContainer();
|
|
98
|
+
}
|
|
99
|
+
// Wait and retry (simple backoff)
|
|
100
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
101
|
+
return await this.getContainer();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a new container instance
|
|
105
|
+
*/
|
|
106
|
+
async createContainer() {
|
|
107
|
+
const port = this.nextPort++;
|
|
108
|
+
const containerName = `blok-runtime-${this.kind}-${Date.now()}-${port}`;
|
|
109
|
+
try {
|
|
110
|
+
// Run container with port mapping
|
|
111
|
+
const { stdout } = await execAsync(`docker run -d --name ${containerName} -p ${port}:8080 --rm ${this.image}`);
|
|
112
|
+
const containerId = stdout.trim();
|
|
113
|
+
const container = {
|
|
114
|
+
containerId,
|
|
115
|
+
containerName,
|
|
116
|
+
image: this.image,
|
|
117
|
+
port,
|
|
118
|
+
healthy: false,
|
|
119
|
+
lastUsed: Date.now(),
|
|
120
|
+
useCount: 0,
|
|
121
|
+
};
|
|
122
|
+
// Wait for container to be healthy
|
|
123
|
+
await this.waitForHealth(container);
|
|
124
|
+
this.pool.set(containerId, container);
|
|
125
|
+
return container;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw new Error(`Failed to create container: ${error.message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Wait for container to be healthy
|
|
133
|
+
*/
|
|
134
|
+
async waitForHealth(container, maxAttempts = 30, delay = 1000) {
|
|
135
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
136
|
+
try {
|
|
137
|
+
const healthy = await this.checkHealth(container);
|
|
138
|
+
if (healthy) {
|
|
139
|
+
container.healthy = true;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Container not ready yet
|
|
145
|
+
}
|
|
146
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
147
|
+
}
|
|
148
|
+
throw new Error(`Container ${container.containerName} failed to become healthy`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if a container is healthy
|
|
152
|
+
*/
|
|
153
|
+
async checkHealth(container) {
|
|
154
|
+
try {
|
|
155
|
+
const response = await fetch(`http://localhost:${container.port}/health`, {
|
|
156
|
+
method: "GET",
|
|
157
|
+
signal: AbortSignal.timeout(2000),
|
|
158
|
+
});
|
|
159
|
+
if (response.ok) {
|
|
160
|
+
const data = await response.json();
|
|
161
|
+
return data.status === "healthy";
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Execute a request in a container
|
|
171
|
+
*/
|
|
172
|
+
async executeInContainer(container, request) {
|
|
173
|
+
const response = await fetch(`http://localhost:${container.port}/execute`, {
|
|
174
|
+
method: "POST",
|
|
175
|
+
headers: {
|
|
176
|
+
"Content-Type": "application/json",
|
|
177
|
+
},
|
|
178
|
+
body: JSON.stringify(request),
|
|
179
|
+
signal: AbortSignal.timeout(30000), // 30 second timeout
|
|
180
|
+
});
|
|
181
|
+
if (!response.ok) {
|
|
182
|
+
throw new Error(`Container execution failed: ${response.statusText}`);
|
|
183
|
+
}
|
|
184
|
+
return (await response.json());
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create the execution request payload
|
|
188
|
+
*/
|
|
189
|
+
createExecutionRequest(node, ctx) {
|
|
190
|
+
const nodeConfig = ctx.config ? ctx.config[node.name] : {};
|
|
191
|
+
return {
|
|
192
|
+
node: {
|
|
193
|
+
name: node.node,
|
|
194
|
+
type: node.type,
|
|
195
|
+
config: nodeConfig || {},
|
|
196
|
+
},
|
|
197
|
+
context: {
|
|
198
|
+
id: ctx.id,
|
|
199
|
+
workflow_name: ctx.workflow_name,
|
|
200
|
+
workflow_path: ctx.workflow_path,
|
|
201
|
+
request: {
|
|
202
|
+
body: ctx.request.body,
|
|
203
|
+
headers: ctx.request.headers,
|
|
204
|
+
params: ctx.request.params,
|
|
205
|
+
query: ctx.request.query,
|
|
206
|
+
method: ctx.request.method,
|
|
207
|
+
url: ctx.request.url,
|
|
208
|
+
cookies: ctx.request.cookies,
|
|
209
|
+
baseUrl: ctx.request.baseUrl,
|
|
210
|
+
},
|
|
211
|
+
response: ctx.response,
|
|
212
|
+
vars: ctx.vars,
|
|
213
|
+
env: ctx.env,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Recycle a container (stop and remove from pool)
|
|
219
|
+
*/
|
|
220
|
+
async recycleContainer(container) {
|
|
221
|
+
this.pool.delete(container.containerId);
|
|
222
|
+
try {
|
|
223
|
+
// Container will auto-remove due to --rm flag
|
|
224
|
+
await execAsync(`docker stop ${container.containerName}`);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Ignore errors during cleanup
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Initialize the container pool
|
|
232
|
+
*/
|
|
233
|
+
async initializePool() {
|
|
234
|
+
// Create minimum instances
|
|
235
|
+
const promises = [];
|
|
236
|
+
for (let i = 0; i < this.poolConfig.minInstances; i++) {
|
|
237
|
+
promises.push(this.createContainer().catch(() => null));
|
|
238
|
+
}
|
|
239
|
+
await Promise.all(promises);
|
|
240
|
+
// Start cleanup interval
|
|
241
|
+
this.cleanupInterval = setInterval(() => {
|
|
242
|
+
this.cleanupIdleContainers();
|
|
243
|
+
}, 60000); // Run every minute
|
|
244
|
+
// Start health check interval
|
|
245
|
+
this.healthCheckInterval = setInterval(() => {
|
|
246
|
+
this.performHealthChecks();
|
|
247
|
+
}, this.poolConfig.healthCheckInterval);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Cleanup idle containers
|
|
251
|
+
*/
|
|
252
|
+
async cleanupIdleContainers() {
|
|
253
|
+
const now = Date.now();
|
|
254
|
+
const containersToRemove = [];
|
|
255
|
+
for (const container of this.pool.values()) {
|
|
256
|
+
const idleTime = now - container.lastUsed;
|
|
257
|
+
const isIdle = idleTime > this.poolConfig.maxIdleTime;
|
|
258
|
+
const canRemove = this.pool.size > this.poolConfig.minInstances;
|
|
259
|
+
if (isIdle && canRemove) {
|
|
260
|
+
containersToRemove.push(container);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const container of containersToRemove) {
|
|
264
|
+
await this.recycleContainer(container);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Perform health checks on all containers
|
|
269
|
+
*/
|
|
270
|
+
async performHealthChecks() {
|
|
271
|
+
const checks = Array.from(this.pool.values()).map(async (container) => {
|
|
272
|
+
const healthy = await this.checkHealth(container);
|
|
273
|
+
container.healthy = healthy;
|
|
274
|
+
// Recycle unhealthy containers
|
|
275
|
+
if (!healthy) {
|
|
276
|
+
await this.recycleContainer(container);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
await Promise.allSettled(checks);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Shutdown the adapter and cleanup all containers
|
|
283
|
+
*/
|
|
284
|
+
async shutdown() {
|
|
285
|
+
// Clear intervals
|
|
286
|
+
if (this.cleanupInterval) {
|
|
287
|
+
clearInterval(this.cleanupInterval);
|
|
288
|
+
}
|
|
289
|
+
if (this.healthCheckInterval) {
|
|
290
|
+
clearInterval(this.healthCheckInterval);
|
|
291
|
+
}
|
|
292
|
+
// Stop all containers
|
|
293
|
+
const shutdownPromises = Array.from(this.pool.values()).map((container) => this.recycleContainer(container));
|
|
294
|
+
await Promise.allSettled(shutdownPromises);
|
|
295
|
+
this.pool.clear();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=DockerRuntimeAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/DockerRuntimeAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Context } from "@blokjs/shared";
|
|
2
|
+
import type RunnerNode from "../RunnerNode";
|
|
3
|
+
import type { ExecutionResult, RuntimeAdapter, RuntimeKind } from "./RuntimeAdapter";
|
|
4
|
+
/**
|
|
5
|
+
* Configuration options for HttpRuntimeAdapter
|
|
6
|
+
*/
|
|
7
|
+
export interface HttpRuntimeAdapterOptions {
|
|
8
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
9
|
+
timeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* HttpRuntimeAdapter executes nodes in pre-existing SDK containers via HTTP.
|
|
13
|
+
*
|
|
14
|
+
* Unlike DockerRuntimeAdapter, this adapter does NOT manage container lifecycle.
|
|
15
|
+
* It connects to already-running containers (managed externally by Docker Compose,
|
|
16
|
+
* Kubernetes, or any other orchestrator).
|
|
17
|
+
*
|
|
18
|
+
* All SDK containers implement the same HTTP contract:
|
|
19
|
+
* - POST /execute — Execute a node with the provided context
|
|
20
|
+
* - GET /health — Return container health status
|
|
21
|
+
*
|
|
22
|
+
* Environment variables per language:
|
|
23
|
+
* RUNTIME_GO_HOST / RUNTIME_GO_PORT
|
|
24
|
+
* RUNTIME_RUST_HOST / RUNTIME_RUST_PORT
|
|
25
|
+
* RUNTIME_JAVA_HOST / RUNTIME_JAVA_PORT
|
|
26
|
+
* RUNTIME_CSHARP_HOST / RUNTIME_CSHARP_PORT
|
|
27
|
+
* RUNTIME_PHP_HOST / RUNTIME_PHP_PORT
|
|
28
|
+
* RUNTIME_RUBY_HOST / RUNTIME_RUBY_PORT
|
|
29
|
+
* RUNTIME_PYTHON3_HOST / RUNTIME_PYTHON3_PORT
|
|
30
|
+
*/
|
|
31
|
+
export declare class HttpRuntimeAdapter implements RuntimeAdapter {
|
|
32
|
+
readonly kind: RuntimeKind;
|
|
33
|
+
private baseUrl;
|
|
34
|
+
private timeoutMs;
|
|
35
|
+
constructor(kind: RuntimeKind, host: string, port: number, options?: HttpRuntimeAdapterOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Execute a node in the SDK container via HTTP POST /execute
|
|
38
|
+
*/
|
|
39
|
+
execute(node: RunnerNode, ctx: Context): Promise<ExecutionResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Create the ExecutionRequest payload for the SDK container.
|
|
42
|
+
*
|
|
43
|
+
* Data flow priority:
|
|
44
|
+
* 1. If the node has resolved inputs (from blueprint Mapper), use those as request.body
|
|
45
|
+
* This allows workflows to define explicit inputs like: "chain": "js/ctx.response.data.chain"
|
|
46
|
+
* 2. Otherwise, fall back to ctx.response.data (previous step output)
|
|
47
|
+
* This enables zero-config chaining where SDK nodes automatically receive prior output
|
|
48
|
+
*/
|
|
49
|
+
private createExecutionRequest;
|
|
50
|
+
/**
|
|
51
|
+
* Check if the SDK container is healthy via GET /health
|
|
52
|
+
*/
|
|
53
|
+
checkHealth(): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Get the base URL for this adapter
|
|
56
|
+
*/
|
|
57
|
+
getBaseUrl(): string;
|
|
58
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpRuntimeAdapter executes nodes in pre-existing SDK containers via HTTP.
|
|
3
|
+
*
|
|
4
|
+
* Unlike DockerRuntimeAdapter, this adapter does NOT manage container lifecycle.
|
|
5
|
+
* It connects to already-running containers (managed externally by Docker Compose,
|
|
6
|
+
* Kubernetes, or any other orchestrator).
|
|
7
|
+
*
|
|
8
|
+
* All SDK containers implement the same HTTP contract:
|
|
9
|
+
* - POST /execute — Execute a node with the provided context
|
|
10
|
+
* - GET /health — Return container health status
|
|
11
|
+
*
|
|
12
|
+
* Environment variables per language:
|
|
13
|
+
* RUNTIME_GO_HOST / RUNTIME_GO_PORT
|
|
14
|
+
* RUNTIME_RUST_HOST / RUNTIME_RUST_PORT
|
|
15
|
+
* RUNTIME_JAVA_HOST / RUNTIME_JAVA_PORT
|
|
16
|
+
* RUNTIME_CSHARP_HOST / RUNTIME_CSHARP_PORT
|
|
17
|
+
* RUNTIME_PHP_HOST / RUNTIME_PHP_PORT
|
|
18
|
+
* RUNTIME_RUBY_HOST / RUNTIME_RUBY_PORT
|
|
19
|
+
* RUNTIME_PYTHON3_HOST / RUNTIME_PYTHON3_PORT
|
|
20
|
+
*/
|
|
21
|
+
export class HttpRuntimeAdapter {
|
|
22
|
+
kind;
|
|
23
|
+
baseUrl;
|
|
24
|
+
timeoutMs;
|
|
25
|
+
constructor(kind, host, port, options) {
|
|
26
|
+
this.kind = kind;
|
|
27
|
+
this.baseUrl = `http://${host}:${port}`;
|
|
28
|
+
this.timeoutMs = options?.timeoutMs ?? 30000;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Execute a node in the SDK container via HTTP POST /execute
|
|
32
|
+
*/
|
|
33
|
+
async execute(node, ctx) {
|
|
34
|
+
const startTime = performance.now();
|
|
35
|
+
try {
|
|
36
|
+
const request = this.createExecutionRequest(node, ctx);
|
|
37
|
+
const response = await fetch(`${this.baseUrl}/execute`, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
body: JSON.stringify(request),
|
|
41
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`HTTP runtime '${this.kind}' at ${this.baseUrl} returned HTTP ${response.status}: ${response.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
const result = (await response.json());
|
|
47
|
+
const duration_ms = performance.now() - startTime;
|
|
48
|
+
return {
|
|
49
|
+
success: result.success ?? true,
|
|
50
|
+
data: result.data,
|
|
51
|
+
errors: result.errors || null,
|
|
52
|
+
logs: result.logs,
|
|
53
|
+
metrics: {
|
|
54
|
+
duration_ms,
|
|
55
|
+
...(result.metrics || {}),
|
|
56
|
+
},
|
|
57
|
+
vars: result.vars,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const duration_ms = performance.now() - startTime;
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
data: null,
|
|
65
|
+
errors: {
|
|
66
|
+
message: error.message,
|
|
67
|
+
stack: error.stack,
|
|
68
|
+
name: error.name,
|
|
69
|
+
},
|
|
70
|
+
metrics: {
|
|
71
|
+
duration_ms,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create the ExecutionRequest payload for the SDK container.
|
|
78
|
+
*
|
|
79
|
+
* Data flow priority:
|
|
80
|
+
* 1. If the node has resolved inputs (from blueprint Mapper), use those as request.body
|
|
81
|
+
* This allows workflows to define explicit inputs like: "chain": "js/ctx.response.data.chain"
|
|
82
|
+
* 2. Otherwise, fall back to ctx.response.data (previous step output)
|
|
83
|
+
* This enables zero-config chaining where SDK nodes automatically receive prior output
|
|
84
|
+
*/
|
|
85
|
+
createExecutionRequest(node, ctx) {
|
|
86
|
+
const nodeConfig = ctx.config
|
|
87
|
+
? ctx.config[node.name]
|
|
88
|
+
: {};
|
|
89
|
+
// Check if the Mapper has resolved inputs for this node
|
|
90
|
+
// The Mapper runs BEFORE run() in NodeBase.process(), so by now
|
|
91
|
+
// config[node.name].inputs has resolved values (not raw js/ expressions)
|
|
92
|
+
const resolvedInputs = nodeConfig?.inputs;
|
|
93
|
+
// Use resolved inputs if available, otherwise fall back to previous step data
|
|
94
|
+
const requestBody = resolvedInputs || (ctx.response?.data ?? {});
|
|
95
|
+
return {
|
|
96
|
+
node: {
|
|
97
|
+
name: node.node,
|
|
98
|
+
type: node.type,
|
|
99
|
+
config: nodeConfig || {},
|
|
100
|
+
},
|
|
101
|
+
context: {
|
|
102
|
+
id: ctx.id,
|
|
103
|
+
workflow_name: ctx.workflow_name,
|
|
104
|
+
workflow_path: ctx.workflow_path,
|
|
105
|
+
request: {
|
|
106
|
+
body: requestBody,
|
|
107
|
+
headers: ctx.request?.headers ?? {},
|
|
108
|
+
params: ctx.request?.params ?? {},
|
|
109
|
+
query: ctx.request?.query ?? {},
|
|
110
|
+
method: ctx.request?.method ?? "",
|
|
111
|
+
url: ctx.request?.url ?? "",
|
|
112
|
+
cookies: ctx.request?.cookies ?? {},
|
|
113
|
+
baseUrl: ctx.request?.baseUrl ?? "",
|
|
114
|
+
},
|
|
115
|
+
response: {
|
|
116
|
+
data: null,
|
|
117
|
+
contentType: "application/json",
|
|
118
|
+
success: true,
|
|
119
|
+
error: null,
|
|
120
|
+
},
|
|
121
|
+
vars: ctx.vars ?? {},
|
|
122
|
+
env: ctx.env ?? {},
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if the SDK container is healthy via GET /health
|
|
128
|
+
*/
|
|
129
|
+
async checkHealth() {
|
|
130
|
+
try {
|
|
131
|
+
const response = await fetch(`${this.baseUrl}/health`, {
|
|
132
|
+
method: "GET",
|
|
133
|
+
signal: AbortSignal.timeout(5000),
|
|
134
|
+
});
|
|
135
|
+
if (response.ok) {
|
|
136
|
+
const data = (await response.json());
|
|
137
|
+
return data.status === "healthy" || data.status === "ok";
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the base URL for this adapter
|
|
147
|
+
*/
|
|
148
|
+
getBaseUrl() {
|
|
149
|
+
return this.baseUrl;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=HttpRuntimeAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/HttpRuntimeAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Context } from "@blokjs/shared";
|
|
2
|
+
import type RunnerNode from "../RunnerNode";
|
|
3
|
+
import type { ExecutionResult, RuntimeAdapter } from "./RuntimeAdapter";
|
|
4
|
+
/**
|
|
5
|
+
* NodeJsRuntimeAdapter executes TypeScript/JavaScript nodes in-process
|
|
6
|
+
*
|
|
7
|
+
* This adapter handles both:
|
|
8
|
+
* - Module nodes: Nodes loaded from the NodeMap (registered npm packages)
|
|
9
|
+
* - Local nodes: Nodes loaded from the local filesystem
|
|
10
|
+
*
|
|
11
|
+
* Execution happens in the same Node.js process with zero gRPC/HTTP overhead.
|
|
12
|
+
*/
|
|
13
|
+
export declare class NodeJsRuntimeAdapter implements RuntimeAdapter {
|
|
14
|
+
readonly kind = "nodejs";
|
|
15
|
+
/**
|
|
16
|
+
* Execute a Node.js node in-process
|
|
17
|
+
*
|
|
18
|
+
* @param node - The node instance to execute (already resolved/instantiated)
|
|
19
|
+
* @param ctx - The workflow execution context
|
|
20
|
+
* @returns Promise that resolves to ExecutionResult
|
|
21
|
+
*/
|
|
22
|
+
execute(node: RunnerNode, ctx: Context): Promise<ExecutionResult>;
|
|
23
|
+
}
|