@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.
Files changed (307) hide show
  1. package/dist/Blok.d.ts +19 -0
  2. package/dist/Blok.js +184 -0
  3. package/dist/Blok.js.map +1 -0
  4. package/dist/BlokResponse.d.ts +16 -0
  5. package/dist/BlokResponse.js +28 -0
  6. package/dist/BlokResponse.js.map +1 -0
  7. package/dist/Configuration.d.ts +37 -0
  8. package/dist/Configuration.js +248 -0
  9. package/dist/Configuration.js.map +1 -0
  10. package/dist/ConfigurationResolver.d.ts +7 -0
  11. package/dist/ConfigurationResolver.js +15 -0
  12. package/dist/ConfigurationResolver.js.map +1 -0
  13. package/dist/DefaultLogger.d.ts +65 -0
  14. package/dist/DefaultLogger.js +101 -0
  15. package/dist/DefaultLogger.js.map +1 -0
  16. package/dist/LocalStorage.d.ts +7 -0
  17. package/dist/LocalStorage.js +56 -0
  18. package/dist/LocalStorage.js.map +1 -0
  19. package/dist/MemoryUsage.d.ts +22 -0
  20. package/dist/MemoryUsage.js +83 -0
  21. package/dist/MemoryUsage.js.map +1 -0
  22. package/dist/NodeMap.d.ts +7 -0
  23. package/dist/NodeMap.js +13 -0
  24. package/dist/NodeMap.js.map +1 -0
  25. package/dist/ResolverBase.d.ts +8 -0
  26. package/dist/ResolverBase.js +18 -0
  27. package/dist/ResolverBase.js.map +1 -0
  28. package/dist/Runner.d.ts +25 -0
  29. package/dist/Runner.js +32 -0
  30. package/dist/Runner.js.map +1 -0
  31. package/dist/RunnerNode.d.ts +9 -0
  32. package/dist/RunnerNode.js +8 -0
  33. package/dist/RunnerNode.js.map +1 -0
  34. package/dist/RunnerNodeBase.d.ts +4 -0
  35. package/dist/RunnerNodeBase.js +3 -0
  36. package/dist/RunnerNodeBase.js.map +1 -0
  37. package/dist/RunnerSteps.d.ts +14 -0
  38. package/dist/RunnerSteps.js +110 -0
  39. package/dist/RunnerSteps.js.map +1 -0
  40. package/dist/RuntimeAdapterNode.d.ts +19 -0
  41. package/dist/RuntimeAdapterNode.js +87 -0
  42. package/dist/RuntimeAdapterNode.js.map +1 -0
  43. package/dist/RuntimeRegistry.d.ts +61 -0
  44. package/dist/RuntimeRegistry.js +87 -0
  45. package/dist/RuntimeRegistry.js.map +1 -0
  46. package/dist/TriggerBase.d.ts +119 -0
  47. package/dist/TriggerBase.js +413 -0
  48. package/dist/TriggerBase.js.map +1 -0
  49. package/dist/adapters/BunRuntimeAdapter.d.ts +38 -0
  50. package/dist/adapters/BunRuntimeAdapter.js +169 -0
  51. package/dist/adapters/BunRuntimeAdapter.js.map +1 -0
  52. package/dist/adapters/DockerRuntimeAdapter.d.ts +85 -0
  53. package/dist/adapters/DockerRuntimeAdapter.js +298 -0
  54. package/dist/adapters/DockerRuntimeAdapter.js.map +1 -0
  55. package/dist/adapters/HttpRuntimeAdapter.d.ts +58 -0
  56. package/dist/adapters/HttpRuntimeAdapter.js +152 -0
  57. package/dist/adapters/HttpRuntimeAdapter.js.map +1 -0
  58. package/dist/adapters/NodeJsRuntimeAdapter.d.ts +23 -0
  59. package/dist/adapters/NodeJsRuntimeAdapter.js +67 -0
  60. package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -0
  61. package/dist/adapters/RuntimeAdapter.d.ts +42 -0
  62. package/dist/adapters/RuntimeAdapter.js +2 -0
  63. package/dist/adapters/RuntimeAdapter.js.map +1 -0
  64. package/dist/adapters/WasmRuntimeAdapter.d.ts +69 -0
  65. package/dist/adapters/WasmRuntimeAdapter.js +279 -0
  66. package/dist/adapters/WasmRuntimeAdapter.js.map +1 -0
  67. package/dist/cache/NodeResultCache.d.ts +286 -0
  68. package/dist/cache/NodeResultCache.js +499 -0
  69. package/dist/cache/NodeResultCache.js.map +1 -0
  70. package/dist/cache/index.d.ts +1 -0
  71. package/dist/cache/index.js +2 -0
  72. package/dist/cache/index.js.map +1 -0
  73. package/dist/cost/CostEstimator.d.ts +57 -0
  74. package/dist/cost/CostEstimator.js +171 -0
  75. package/dist/cost/CostEstimator.js.map +1 -0
  76. package/dist/cost/index.d.ts +4 -0
  77. package/dist/cost/index.js +3 -0
  78. package/dist/cost/index.js.map +1 -0
  79. package/dist/cost/pricing.d.ts +24 -0
  80. package/dist/cost/pricing.js +169 -0
  81. package/dist/cost/pricing.js.map +1 -0
  82. package/dist/defineNode.d.ts +155 -0
  83. package/dist/defineNode.js +191 -0
  84. package/dist/defineNode.js.map +1 -0
  85. package/dist/graphql/GraphQLSchemaGenerator.d.ts +129 -0
  86. package/dist/graphql/GraphQLSchemaGenerator.js +425 -0
  87. package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -0
  88. package/dist/hmr/FileWatcher.d.ts +62 -0
  89. package/dist/hmr/FileWatcher.js +185 -0
  90. package/dist/hmr/FileWatcher.js.map +1 -0
  91. package/dist/hmr/HmrDevConsole.d.ts +13 -0
  92. package/dist/hmr/HmrDevConsole.js +46 -0
  93. package/dist/hmr/HmrDevConsole.js.map +1 -0
  94. package/dist/hmr/HotReloadManager.d.ts +84 -0
  95. package/dist/hmr/HotReloadManager.js +195 -0
  96. package/dist/hmr/HotReloadManager.js.map +1 -0
  97. package/dist/hmr/index.d.ts +39 -0
  98. package/dist/hmr/index.js +38 -0
  99. package/dist/hmr/index.js.map +1 -0
  100. package/dist/index.d.ts +107 -0
  101. package/dist/index.js +107 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/integrations/APMIntegration.d.ts +141 -0
  104. package/dist/integrations/APMIntegration.js +212 -0
  105. package/dist/integrations/APMIntegration.js.map +1 -0
  106. package/dist/integrations/AzureMonitorIntegration.d.ts +118 -0
  107. package/dist/integrations/AzureMonitorIntegration.js +254 -0
  108. package/dist/integrations/AzureMonitorIntegration.js.map +1 -0
  109. package/dist/integrations/CloudWatchIntegration.d.ts +135 -0
  110. package/dist/integrations/CloudWatchIntegration.js +293 -0
  111. package/dist/integrations/CloudWatchIntegration.js.map +1 -0
  112. package/dist/integrations/SentryIntegration.d.ts +153 -0
  113. package/dist/integrations/SentryIntegration.js +200 -0
  114. package/dist/integrations/SentryIntegration.js.map +1 -0
  115. package/dist/integrations/index.d.ts +19 -0
  116. package/dist/integrations/index.js +16 -0
  117. package/dist/integrations/index.js.map +1 -0
  118. package/dist/marketplace/RuntimeAutoScaler.d.ts +148 -0
  119. package/dist/marketplace/RuntimeAutoScaler.js +366 -0
  120. package/dist/marketplace/RuntimeAutoScaler.js.map +1 -0
  121. package/dist/marketplace/RuntimeCatalog.d.ts +174 -0
  122. package/dist/marketplace/RuntimeCatalog.js +339 -0
  123. package/dist/marketplace/RuntimeCatalog.js.map +1 -0
  124. package/dist/marketplace/RuntimeDiscovery.d.ts +86 -0
  125. package/dist/marketplace/RuntimeDiscovery.js +219 -0
  126. package/dist/marketplace/RuntimeDiscovery.js.map +1 -0
  127. package/dist/marketplace/RuntimeHealthMonitor.d.ts +100 -0
  128. package/dist/marketplace/RuntimeHealthMonitor.js +241 -0
  129. package/dist/marketplace/RuntimeHealthMonitor.js.map +1 -0
  130. package/dist/marketplace/RuntimeMetricsDashboard.d.ts +113 -0
  131. package/dist/marketplace/RuntimeMetricsDashboard.js +293 -0
  132. package/dist/marketplace/RuntimeMetricsDashboard.js.map +1 -0
  133. package/dist/monitoring/CircuitBreaker.d.ts +107 -0
  134. package/dist/monitoring/CircuitBreaker.js +238 -0
  135. package/dist/monitoring/CircuitBreaker.js.map +1 -0
  136. package/dist/monitoring/DistributedTracer.d.ts +125 -0
  137. package/dist/monitoring/DistributedTracer.js +230 -0
  138. package/dist/monitoring/DistributedTracer.js.map +1 -0
  139. package/dist/monitoring/HealthCheck.d.ts +54 -0
  140. package/dist/monitoring/HealthCheck.js +102 -0
  141. package/dist/monitoring/HealthCheck.js.map +1 -0
  142. package/dist/monitoring/PerformanceProfiler.d.ts +63 -0
  143. package/dist/monitoring/PerformanceProfiler.js +229 -0
  144. package/dist/monitoring/PerformanceProfiler.js.map +1 -0
  145. package/dist/monitoring/PrometheusBootstrap.d.ts +30 -0
  146. package/dist/monitoring/PrometheusBootstrap.js +71 -0
  147. package/dist/monitoring/PrometheusBootstrap.js.map +1 -0
  148. package/dist/monitoring/PrometheusMetricsBridge.d.ts +60 -0
  149. package/dist/monitoring/PrometheusMetricsBridge.js +216 -0
  150. package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -0
  151. package/dist/monitoring/RateLimiter.d.ts +58 -0
  152. package/dist/monitoring/RateLimiter.js +128 -0
  153. package/dist/monitoring/RateLimiter.js.map +1 -0
  154. package/dist/monitoring/StructuredLogger.d.ts +131 -0
  155. package/dist/monitoring/StructuredLogger.js +207 -0
  156. package/dist/monitoring/StructuredLogger.js.map +1 -0
  157. package/dist/monitoring/TracingBootstrap.d.ts +69 -0
  158. package/dist/monitoring/TracingBootstrap.js +129 -0
  159. package/dist/monitoring/TracingBootstrap.js.map +1 -0
  160. package/dist/monitoring/TriggerMetricsCollector.d.ts +94 -0
  161. package/dist/monitoring/TriggerMetricsCollector.js +174 -0
  162. package/dist/monitoring/TriggerMetricsCollector.js.map +1 -0
  163. package/dist/monitoring/index.d.ts +9 -0
  164. package/dist/monitoring/index.js +10 -0
  165. package/dist/monitoring/index.js.map +1 -0
  166. package/dist/openapi/OpenAPIGenerator.d.ts +192 -0
  167. package/dist/openapi/OpenAPIGenerator.js +373 -0
  168. package/dist/openapi/OpenAPIGenerator.js.map +1 -0
  169. package/dist/openapi/index.d.ts +20 -0
  170. package/dist/openapi/index.js +20 -0
  171. package/dist/openapi/index.js.map +1 -0
  172. package/dist/security/ABAC.d.ts +224 -0
  173. package/dist/security/ABAC.js +380 -0
  174. package/dist/security/ABAC.js.map +1 -0
  175. package/dist/security/AuditLogger.d.ts +242 -0
  176. package/dist/security/AuditLogger.js +317 -0
  177. package/dist/security/AuditLogger.js.map +1 -0
  178. package/dist/security/AuthMiddleware.d.ts +163 -0
  179. package/dist/security/AuthMiddleware.js +274 -0
  180. package/dist/security/AuthMiddleware.js.map +1 -0
  181. package/dist/security/EncryptionAtRest.d.ts +206 -0
  182. package/dist/security/EncryptionAtRest.js +236 -0
  183. package/dist/security/EncryptionAtRest.js.map +1 -0
  184. package/dist/security/OAuthProvider.d.ts +334 -0
  185. package/dist/security/OAuthProvider.js +719 -0
  186. package/dist/security/OAuthProvider.js.map +1 -0
  187. package/dist/security/PIIDetector.d.ts +233 -0
  188. package/dist/security/PIIDetector.js +354 -0
  189. package/dist/security/PIIDetector.js.map +1 -0
  190. package/dist/security/RBAC.d.ts +143 -0
  191. package/dist/security/RBAC.js +285 -0
  192. package/dist/security/RBAC.js.map +1 -0
  193. package/dist/security/SecretManager.d.ts +652 -0
  194. package/dist/security/SecretManager.js +1146 -0
  195. package/dist/security/SecretManager.js.map +1 -0
  196. package/dist/security/TLSConfig.d.ts +305 -0
  197. package/dist/security/TLSConfig.js +550 -0
  198. package/dist/security/TLSConfig.js.map +1 -0
  199. package/dist/security/index.d.ts +79 -0
  200. package/dist/security/index.js +80 -0
  201. package/dist/security/index.js.map +1 -0
  202. package/dist/testing/TestHarness.d.ts +189 -0
  203. package/dist/testing/TestHarness.js +272 -0
  204. package/dist/testing/TestHarness.js.map +1 -0
  205. package/dist/testing/TestLogger.d.ts +103 -0
  206. package/dist/testing/TestLogger.js +153 -0
  207. package/dist/testing/TestLogger.js.map +1 -0
  208. package/dist/testing/WorkflowTestRunner.d.ts +172 -0
  209. package/dist/testing/WorkflowTestRunner.js +355 -0
  210. package/dist/testing/WorkflowTestRunner.js.map +1 -0
  211. package/dist/testing/index.d.ts +21 -0
  212. package/dist/testing/index.js +22 -0
  213. package/dist/testing/index.js.map +1 -0
  214. package/dist/tracing/InMemoryRunStore.d.ts +44 -0
  215. package/dist/tracing/InMemoryRunStore.js +341 -0
  216. package/dist/tracing/InMemoryRunStore.js.map +1 -0
  217. package/dist/tracing/PostgresRunStore.d.ts +82 -0
  218. package/dist/tracing/PostgresRunStore.js +640 -0
  219. package/dist/tracing/PostgresRunStore.js.map +1 -0
  220. package/dist/tracing/RunStore.d.ts +38 -0
  221. package/dist/tracing/RunStore.js +2 -0
  222. package/dist/tracing/RunStore.js.map +1 -0
  223. package/dist/tracing/RunTracker.d.ts +75 -0
  224. package/dist/tracing/RunTracker.js +374 -0
  225. package/dist/tracing/RunTracker.js.map +1 -0
  226. package/dist/tracing/SqliteRunStore.d.ts +53 -0
  227. package/dist/tracing/SqliteRunStore.js +703 -0
  228. package/dist/tracing/SqliteRunStore.js.map +1 -0
  229. package/dist/tracing/TraceRouter.d.ts +47 -0
  230. package/dist/tracing/TraceRouter.js +904 -0
  231. package/dist/tracing/TraceRouter.js.map +1 -0
  232. package/dist/tracing/TracingLogger.d.ts +21 -0
  233. package/dist/tracing/TracingLogger.js +62 -0
  234. package/dist/tracing/TracingLogger.js.map +1 -0
  235. package/dist/tracing/createStore.d.ts +30 -0
  236. package/dist/tracing/createStore.js +75 -0
  237. package/dist/tracing/createStore.js.map +1 -0
  238. package/dist/tracing/index.d.ts +13 -0
  239. package/dist/tracing/index.js +9 -0
  240. package/dist/tracing/index.js.map +1 -0
  241. package/dist/tracing/sanitize.d.ts +7 -0
  242. package/dist/tracing/sanitize.js +95 -0
  243. package/dist/tracing/sanitize.js.map +1 -0
  244. package/dist/tracing/types.d.ts +178 -0
  245. package/dist/tracing/types.js +3 -0
  246. package/dist/tracing/types.js.map +1 -0
  247. package/dist/types/Average.d.ts +11 -0
  248. package/dist/types/Average.js +2 -0
  249. package/dist/types/Average.js.map +1 -0
  250. package/dist/types/Condition.d.ts +8 -0
  251. package/dist/types/Condition.js +2 -0
  252. package/dist/types/Condition.js.map +1 -0
  253. package/dist/types/Conditions.d.ts +5 -0
  254. package/dist/types/Conditions.js +2 -0
  255. package/dist/types/Conditions.js.map +1 -0
  256. package/dist/types/Config.d.ts +12 -0
  257. package/dist/types/Config.js +2 -0
  258. package/dist/types/Config.js.map +1 -0
  259. package/dist/types/Flow.d.ts +5 -0
  260. package/dist/types/Flow.js +2 -0
  261. package/dist/types/Flow.js.map +1 -0
  262. package/dist/types/GlobalOptions.d.ts +11 -0
  263. package/dist/types/GlobalOptions.js +2 -0
  264. package/dist/types/GlobalOptions.js.map +1 -0
  265. package/dist/types/Inputs.d.ts +5 -0
  266. package/dist/types/Inputs.js +2 -0
  267. package/dist/types/Inputs.js.map +1 -0
  268. package/dist/types/JsonLikeObject.d.ts +3 -0
  269. package/dist/types/JsonLikeObject.js +2 -0
  270. package/dist/types/JsonLikeObject.js.map +1 -0
  271. package/dist/types/Mapper.d.ts +5 -0
  272. package/dist/types/Mapper.js +2 -0
  273. package/dist/types/Mapper.js.map +1 -0
  274. package/dist/types/Node.d.ts +10 -0
  275. package/dist/types/Node.js +2 -0
  276. package/dist/types/Node.js.map +1 -0
  277. package/dist/types/ParamsDictionary.d.ts +3 -0
  278. package/dist/types/ParamsDictionary.js +2 -0
  279. package/dist/types/ParamsDictionary.js.map +1 -0
  280. package/dist/types/Properties.d.ts +5 -0
  281. package/dist/types/Properties.js +2 -0
  282. package/dist/types/Properties.js.map +1 -0
  283. package/dist/types/Targets.d.ts +5 -0
  284. package/dist/types/Targets.js +2 -0
  285. package/dist/types/Targets.js.map +1 -0
  286. package/dist/types/Trigger.d.ts +5 -0
  287. package/dist/types/Trigger.js +2 -0
  288. package/dist/types/Trigger.js.map +1 -0
  289. package/dist/types/TriggerHttp.d.ts +7 -0
  290. package/dist/types/TriggerHttp.js +2 -0
  291. package/dist/types/TriggerHttp.js.map +1 -0
  292. package/dist/types/TriggerResponse.d.ts +6 -0
  293. package/dist/types/TriggerResponse.js +2 -0
  294. package/dist/types/TriggerResponse.js.map +1 -0
  295. package/dist/types/Triggers.d.ts +5 -0
  296. package/dist/types/Triggers.js +2 -0
  297. package/dist/types/Triggers.js.map +1 -0
  298. package/dist/types/TryCatch.d.ts +6 -0
  299. package/dist/types/TryCatch.js +2 -0
  300. package/dist/types/TryCatch.js.map +1 -0
  301. package/dist/visualization/NodeDependencyGraph.d.ts +76 -0
  302. package/dist/visualization/NodeDependencyGraph.js +418 -0
  303. package/dist/visualization/NodeDependencyGraph.js.map +1 -0
  304. package/dist/visualization/WorkflowVisualizer.d.ts +144 -0
  305. package/dist/visualization/WorkflowVisualizer.js +446 -0
  306. package/dist/visualization/WorkflowVisualizer.js.map +1 -0
  307. 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
+ }