@blokjs/runner 0.4.0 → 0.6.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/dist/Blok.js +32 -3
- package/dist/Blok.js.map +1 -1
- package/dist/Configuration.d.ts +41 -5
- package/dist/Configuration.js +215 -92
- package/dist/Configuration.js.map +1 -1
- package/dist/ForEachNode.d.ts +59 -0
- package/dist/ForEachNode.js +522 -0
- package/dist/ForEachNode.js.map +1 -0
- package/dist/LoopMaxIterationsError.d.ts +11 -0
- package/dist/LoopMaxIterationsError.js +18 -0
- package/dist/LoopMaxIterationsError.js.map +1 -0
- package/dist/LoopNode.d.ts +36 -0
- package/dist/LoopNode.js +182 -0
- package/dist/LoopNode.js.map +1 -0
- package/dist/Runner.d.ts +11 -1
- package/dist/Runner.js +9 -2
- package/dist/Runner.js.map +1 -1
- package/dist/RunnerSteps.js +419 -112
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/RuntimeAdapterNode.d.ts +2 -1
- package/dist/RuntimeAdapterNode.js +2 -2
- package/dist/RuntimeAdapterNode.js.map +1 -1
- package/dist/RuntimeRegistry.d.ts +23 -2
- package/dist/RuntimeRegistry.js +31 -2
- package/dist/RuntimeRegistry.js.map +1 -1
- package/dist/SubworkflowNode.d.ts +106 -0
- package/dist/SubworkflowNode.js +261 -3
- package/dist/SubworkflowNode.js.map +1 -1
- package/dist/SwitchNode.d.ts +37 -0
- package/dist/SwitchNode.js +153 -0
- package/dist/SwitchNode.js.map +1 -0
- package/dist/TriggerBase.d.ts +50 -0
- package/dist/TriggerBase.js +262 -4
- package/dist/TriggerBase.js.map +1 -1
- package/dist/TryCatchNode.d.ts +32 -0
- package/dist/TryCatchNode.js +207 -0
- package/dist/TryCatchNode.js.map +1 -0
- package/dist/adapters/grpc/GrpcCodec.js +2 -2
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +6 -4
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +6 -4
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
- package/dist/adapters/grpc/types.d.ts +7 -5
- package/dist/adapters/grpc/types.js.map +1 -1
- package/dist/adapters/transport.d.ts +12 -41
- package/dist/adapters/transport.js +21 -70
- package/dist/adapters/transport.js.map +1 -1
- package/dist/cache/NodeResultCache.js +7 -0
- package/dist/cache/NodeResultCache.js.map +1 -1
- package/dist/concurrency/NatsKvConcurrencyBackend.js +18 -5
- package/dist/concurrency/NatsKvConcurrencyBackend.js.map +1 -1
- package/dist/concurrency/RedisConcurrencyBackend.d.ts +64 -0
- package/dist/concurrency/RedisConcurrencyBackend.js +374 -0
- package/dist/concurrency/RedisConcurrencyBackend.js.map +1 -0
- package/dist/concurrency/createConcurrencyBackend.d.ts +1 -0
- package/dist/concurrency/createConcurrencyBackend.js +5 -1
- package/dist/concurrency/createConcurrencyBackend.js.map +1 -1
- package/dist/defineNode.d.ts +8 -0
- package/dist/defineNode.js +25 -5
- package/dist/defineNode.js.map +1 -1
- package/dist/graphql/GraphQLSchemaGenerator.js +1 -1
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -1
- package/dist/index.d.ts +10 -6
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/marketplace/RuntimeCatalog.d.ts +6 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -1
- package/dist/marketplace/RuntimeDiscovery.d.ts +2 -2
- package/dist/marketplace/RuntimeDiscovery.js +18 -6
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -1
- package/dist/monitoring/ConcurrencyMetrics.d.ts +26 -0
- package/dist/monitoring/ConcurrencyMetrics.js +36 -4
- package/dist/monitoring/ConcurrencyMetrics.js.map +1 -1
- package/dist/monitoring/ForEachWaitMetrics.d.ts +22 -0
- package/dist/monitoring/ForEachWaitMetrics.js +36 -0
- package/dist/monitoring/ForEachWaitMetrics.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.js +7 -2
- package/dist/openapi/OpenAPIGenerator.js.map +1 -1
- package/dist/runtime/PrimitiveStack.d.ts +64 -0
- package/dist/runtime/PrimitiveStack.js +92 -0
- package/dist/runtime/PrimitiveStack.js.map +1 -0
- package/dist/scheduling/DebounceBackend.d.ts +108 -0
- package/dist/scheduling/DebounceBackend.js +23 -0
- package/dist/scheduling/DebounceBackend.js.map +1 -0
- package/dist/scheduling/DebounceCoordinator.d.ts +65 -12
- package/dist/scheduling/DebounceCoordinator.js +234 -13
- package/dist/scheduling/DebounceCoordinator.js.map +1 -1
- package/dist/scheduling/DeferredRunScheduler.d.ts +28 -0
- package/dist/scheduling/DeferredRunScheduler.js +105 -3
- package/dist/scheduling/DeferredRunScheduler.js.map +1 -1
- package/dist/scheduling/NatsKvDebounceBackend.d.ts +53 -0
- package/dist/scheduling/NatsKvDebounceBackend.js +334 -0
- package/dist/scheduling/NatsKvDebounceBackend.js.map +1 -0
- package/dist/scheduling/RedisDebounceBackend.d.ts +49 -0
- package/dist/scheduling/RedisDebounceBackend.js +356 -0
- package/dist/scheduling/RedisDebounceBackend.js.map +1 -0
- package/dist/scheduling/createDebounceBackend.d.ts +25 -0
- package/dist/scheduling/createDebounceBackend.js +39 -0
- package/dist/scheduling/createDebounceBackend.js.map +1 -0
- package/dist/security/AuditLogger.js +1 -1
- package/dist/security/AuditLogger.js.map +1 -1
- package/dist/security/AuthMiddleware.d.ts +19 -20
- package/dist/security/AuthMiddleware.js +35 -20
- package/dist/security/AuthMiddleware.js.map +1 -1
- package/dist/security/OAuthProvider.js +2 -2
- package/dist/security/OAuthProvider.js.map +1 -1
- package/dist/security/SecretManager.js +14 -13
- package/dist/security/SecretManager.js.map +1 -1
- package/dist/security/index.d.ts +3 -1
- package/dist/security/index.js +3 -1
- package/dist/security/index.js.map +1 -1
- package/dist/testing/TestHarness.d.ts +27 -12
- package/dist/testing/TestHarness.js +19 -3
- package/dist/testing/TestHarness.js.map +1 -1
- package/dist/testing/WorkflowTestRunner.js +0 -7
- package/dist/testing/WorkflowTestRunner.js.map +1 -1
- package/dist/tracing/InMemoryRunStore.d.ts +14 -1
- package/dist/tracing/InMemoryRunStore.js +95 -6
- package/dist/tracing/InMemoryRunStore.js.map +1 -1
- package/dist/tracing/PostgresRunStore.d.ts +28 -2
- package/dist/tracing/PostgresRunStore.js +276 -3
- package/dist/tracing/PostgresRunStore.js.map +1 -1
- package/dist/tracing/RoutingDiagnostics.d.ts +55 -0
- package/dist/tracing/RoutingDiagnostics.js +50 -0
- package/dist/tracing/RoutingDiagnostics.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +82 -1
- package/dist/tracing/RunTracker.d.ts +7 -1
- package/dist/tracing/RunTracker.js +23 -0
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.d.ts +57 -2
- package/dist/tracing/SqliteRunStore.js +408 -48
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.js +380 -18
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/createStore.js +14 -3
- package/dist/tracing/createStore.js.map +1 -1
- package/dist/tracing/metadataFilter.d.ts +63 -0
- package/dist/tracing/metadataFilter.js +224 -0
- package/dist/tracing/metadataFilter.js.map +1 -0
- package/dist/tracing/types.d.ts +331 -7
- package/dist/utils/envAllowlist.d.ts +35 -0
- package/dist/utils/envAllowlist.js +113 -0
- package/dist/utils/envAllowlist.js.map +1 -0
- package/dist/version/RuntimeVersionValidator.d.ts +38 -0
- package/dist/version/RuntimeVersionValidator.js +121 -0
- package/dist/version/RuntimeVersionValidator.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.js +4 -4
- package/dist/visualization/WorkflowVisualizer.js.map +1 -1
- package/dist/workflow/PersistenceHelper.d.ts +18 -10
- package/dist/workflow/PersistenceHelper.js +35 -9
- package/dist/workflow/PersistenceHelper.js.map +1 -1
- package/dist/workflow/WorkflowNormalizer.d.ts +19 -1
- package/dist/workflow/WorkflowNormalizer.js +469 -19
- package/dist/workflow/WorkflowNormalizer.js.map +1 -1
- package/dist/workflow/WorkflowRegistry.d.ts +122 -0
- package/dist/workflow/WorkflowRegistry.js +121 -0
- package/dist/workflow/WorkflowRegistry.js.map +1 -1
- package/dist/workflow/sampleBody.d.ts +54 -0
- package/dist/workflow/sampleBody.js +320 -0
- package/dist/workflow/sampleBody.js.map +1 -0
- package/package.json +3 -8
- package/dist/adapters/HttpRuntimeAdapter.d.ts +0 -79
- package/dist/adapters/HttpRuntimeAdapter.js +0 -233
- package/dist/adapters/HttpRuntimeAdapter.js.map +0 -1
package/dist/Blok.js
CHANGED
|
@@ -70,6 +70,15 @@ export default class BlokService extends NodeBase {
|
|
|
70
70
|
const result = await this.handle(ctx, inputs);
|
|
71
71
|
this.v.validate(result, this.outputSchema);
|
|
72
72
|
const end = performance.now();
|
|
73
|
+
// Truthful failure indicator. `defineNode.handle()` catches every
|
|
74
|
+
// throw and stuffs it onto `BlokResponse.error` — so the previous
|
|
75
|
+
// "Executed node" log line and the `response.success === false`
|
|
76
|
+
// metrics counter at the bottom of run() were both wrong on the
|
|
77
|
+
// error path (one always said success, the other never fired).
|
|
78
|
+
// Read the BlokResponse's error field once and let the rest of the
|
|
79
|
+
// method use it consistently.
|
|
80
|
+
const blokResponse = result;
|
|
81
|
+
const errored = blokResponse.error !== undefined && blokResponse.error !== null;
|
|
73
82
|
node_execution.add(1, {
|
|
74
83
|
env: process.env.NODE_ENV,
|
|
75
84
|
workflow_path: `${ctx.workflow_path}`,
|
|
@@ -84,16 +93,36 @@ export default class BlokService extends NodeBase {
|
|
|
84
93
|
node_name: `${this.name}`,
|
|
85
94
|
node: this.node,
|
|
86
95
|
});
|
|
87
|
-
|
|
96
|
+
// Surface failures clearly on the per-node log so operators don't
|
|
97
|
+
// see a misleading "Executed node" line followed by a contradictory
|
|
98
|
+
// "FAILED" line from RunnerSteps. The structured per-step log
|
|
99
|
+
// emitted by RunnerSteps remains the canonical "step N/M" entry;
|
|
100
|
+
// this one is the inner-node companion.
|
|
101
|
+
if (errored) {
|
|
102
|
+
const errMsg = blokResponse.error instanceof Error ? blokResponse.error.message : String(blokResponse.error);
|
|
103
|
+
ctx.logger.log(`Node ${this.name} failed in ${(end - start).toFixed(2)}ms: ${errMsg}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
ctx.logger.log(`Executed node: ${this.name} in ${(end - start).toFixed(2)}ms`);
|
|
107
|
+
}
|
|
88
108
|
// V2 persistence — runner-owned, declarative.
|
|
89
109
|
// `ephemeral` skips, `spread` merges, `as` renames, default stores
|
|
90
|
-
// at state[name].
|
|
91
|
-
//
|
|
110
|
+
// at state[name].
|
|
111
|
+
// Pass through the full IBlokResponse so the helper's error guard
|
|
112
|
+
// (`success: false` / non-null `error`) skips state persistence on
|
|
113
|
+
// the failure path — see PersistenceHelper.isErroredResult.
|
|
92
114
|
applyStepOutput(ctx, this, result);
|
|
93
115
|
// Hand the raw result back to the runner. RunnerSteps mirrors
|
|
94
116
|
// response.data into ctx.response so adjacent-step access via
|
|
95
117
|
// `ctx.prev` / `$.prev` keeps working.
|
|
96
118
|
response.data = result;
|
|
119
|
+
// Mirror the inner BlokResponse error state onto the outer envelope
|
|
120
|
+
// the metrics block at the bottom of run() reads. Without this flip
|
|
121
|
+
// the `if (response.success === false)` guard never matched, so
|
|
122
|
+
// the `node_errors` OTel counter has been silently broken for every
|
|
123
|
+
// defineNode-built step since v0.3.x.
|
|
124
|
+
response.success = !errored;
|
|
125
|
+
response.error = errored ? blokResponse.error : null;
|
|
97
126
|
response.data.contentType = this.contentType;
|
|
98
127
|
globalMetrics.retry();
|
|
99
128
|
globalMetrics.stop();
|
package/dist/Blok.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Blok.js","sourceRoot":"","sources":["../src/Blok.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Blok.js","sourceRoot":"","sources":["../src/Blok.ts"],"names":[],"mappings":"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"}
|
package/dist/Configuration.d.ts
CHANGED
|
@@ -12,19 +12,26 @@ export default class Configuration implements Config {
|
|
|
12
12
|
steps: NodeBase[];
|
|
13
13
|
nodes: Node;
|
|
14
14
|
trigger: Trigger;
|
|
15
|
+
/**
|
|
16
|
+
* v0.5.2 — workflow-level middleware chain. Populated from the
|
|
17
|
+
* normalized workflow's `appliedMiddleware` field. HTTP and Worker
|
|
18
|
+
* triggers prepend this list to their own `trigger.<kind>.middleware`
|
|
19
|
+
* before invoking the chain, so workflow-level entries run BEFORE
|
|
20
|
+
* trigger-level entries on every request.
|
|
21
|
+
*/
|
|
22
|
+
appliedMiddleware: readonly string[];
|
|
15
23
|
static loaded_nodes: Node;
|
|
16
24
|
globalOptions: GlobalOptions | undefined;
|
|
17
25
|
constructor();
|
|
18
26
|
/**
|
|
19
27
|
* Initialize the RuntimeRegistry with built-in adapters.
|
|
20
28
|
*
|
|
21
|
-
* Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then
|
|
22
|
-
* SDK language
|
|
23
|
-
*
|
|
24
|
-
*
|
|
29
|
+
* Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then a
|
|
30
|
+
* `GrpcRuntimeAdapter` per SDK language. gRPC is the sole transport
|
|
31
|
+
* since v0.5 — `assertGrpcOnlyTransport` throws if the operator still
|
|
32
|
+
* has `RUNTIME_TRANSPORT=http` set.
|
|
25
33
|
*/
|
|
26
34
|
private initializeRuntimeRegistry;
|
|
27
|
-
private buildHttpAdapter;
|
|
28
35
|
private buildGrpcAdapter;
|
|
29
36
|
/**
|
|
30
37
|
* Initialize the configuration for a workflow run.
|
|
@@ -64,6 +71,35 @@ export default class Configuration implements Config {
|
|
|
64
71
|
* doesn't fire on otherwise-valid wait steps.
|
|
65
72
|
*/
|
|
66
73
|
protected waitResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
74
|
+
/**
|
|
75
|
+
* v0.5 · resolve a `forEach` step. The actual iteration logic lives
|
|
76
|
+
* in `ForEachNode.run()`; the inner `steps` array is pre-resolved by
|
|
77
|
+
* the existing isFlowWithProperties path in `getNodes()`.
|
|
78
|
+
*/
|
|
79
|
+
protected forEachResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
80
|
+
/**
|
|
81
|
+
* v0.5 · resolve a `loop` step. While-loop semantics live in
|
|
82
|
+
* `LoopNode.run()`. Inner `steps` resolved by isFlowWithProperties.
|
|
83
|
+
*/
|
|
84
|
+
protected loopResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
85
|
+
/**
|
|
86
|
+
* v0.5 · resolve a `switch` step. The N-way match logic lives in
|
|
87
|
+
* `SwitchNode.run()`. Cases + default each carry their own resolved
|
|
88
|
+
* inner-step list — see the dedicated `cases` branch in `getNodes()`.
|
|
89
|
+
*/
|
|
90
|
+
protected switchResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
91
|
+
/**
|
|
92
|
+
* v0.5 · resolve a `tryCatch` step. JS-like try/catch/finally semantics
|
|
93
|
+
* live in `TryCatchNode.run()`. Each block (try, catch, finally) is
|
|
94
|
+
* pre-resolved by the dedicated tryCatch branch in `getNodes()` so
|
|
95
|
+
* the runtime can dispatch them through child Runners on-demand.
|
|
96
|
+
*/
|
|
97
|
+
protected tryCatchResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
98
|
+
/**
|
|
99
|
+
* Check if a resolved node has runtimeRequirements and validate them
|
|
100
|
+
* against the currently known runtime versions in the RuntimeRegistry.
|
|
101
|
+
*/
|
|
102
|
+
private validateNodeRuntimeRequirements;
|
|
67
103
|
protected localResolver(node: RunnerNode): Promise<RunnerNode>;
|
|
68
104
|
}
|
|
69
105
|
type NodeResolverTypes = {
|
package/dist/Configuration.js
CHANGED
|
@@ -6,11 +6,11 @@ import ConfigurationResolver from "./ConfigurationResolver";
|
|
|
6
6
|
import RunnerNode from "./RunnerNode";
|
|
7
7
|
import { RuntimeAdapterNode } from "./RuntimeAdapterNode";
|
|
8
8
|
import { RuntimeRegistry } from "./RuntimeRegistry";
|
|
9
|
-
import { HttpRuntimeAdapter } from "./adapters/HttpRuntimeAdapter";
|
|
10
9
|
import { NodeJsRuntimeAdapter } from "./adapters/NodeJsRuntimeAdapter";
|
|
11
10
|
import { GrpcRuntimeAdapter } from "./adapters/grpc/GrpcRuntimeAdapter";
|
|
12
11
|
import { DEFAULT_GRPC_PORTS, GRPC_DEFAULTS } from "./adapters/grpc/types";
|
|
13
|
-
import { isLoopbackHost, isStreamLogsEnabled, isStrictTlsEnabled, loadTlsConfigForKind, resolveHealthCheckFailureThreshold, resolveHealthCheckIntervalMs,
|
|
12
|
+
import { assertGrpcOnlyTransport, isLoopbackHost, isStreamLogsEnabled, isStrictTlsEnabled, loadTlsConfigForKind, resolveHealthCheckFailureThreshold, resolveHealthCheckIntervalMs, } from "./adapters/transport";
|
|
13
|
+
import { RuntimeVersionValidator } from "./version/RuntimeVersionValidator";
|
|
14
14
|
export default class Configuration {
|
|
15
15
|
workflow = {};
|
|
16
16
|
name;
|
|
@@ -18,6 +18,14 @@ export default class Configuration {
|
|
|
18
18
|
steps;
|
|
19
19
|
nodes;
|
|
20
20
|
trigger;
|
|
21
|
+
/**
|
|
22
|
+
* v0.5.2 — workflow-level middleware chain. Populated from the
|
|
23
|
+
* normalized workflow's `appliedMiddleware` field. HTTP and Worker
|
|
24
|
+
* triggers prepend this list to their own `trigger.<kind>.middleware`
|
|
25
|
+
* before invoking the chain, so workflow-level entries run BEFORE
|
|
26
|
+
* trigger-level entries on every request.
|
|
27
|
+
*/
|
|
28
|
+
appliedMiddleware;
|
|
21
29
|
static loaded_nodes = {};
|
|
22
30
|
globalOptions;
|
|
23
31
|
constructor() {
|
|
@@ -26,87 +34,40 @@ export default class Configuration {
|
|
|
26
34
|
this.version = "";
|
|
27
35
|
this.name = "";
|
|
28
36
|
this.trigger = {};
|
|
37
|
+
this.appliedMiddleware = [];
|
|
29
38
|
this.initializeRuntimeRegistry();
|
|
30
39
|
}
|
|
31
40
|
/**
|
|
32
41
|
* Initialize the RuntimeRegistry with built-in adapters.
|
|
33
42
|
*
|
|
34
|
-
* Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then
|
|
35
|
-
* SDK language
|
|
36
|
-
*
|
|
37
|
-
*
|
|
43
|
+
* Registers `NodeJsRuntimeAdapter` for in-process JS nodes, then a
|
|
44
|
+
* `GrpcRuntimeAdapter` per SDK language. gRPC is the sole transport
|
|
45
|
+
* since v0.5 — `assertGrpcOnlyTransport` throws if the operator still
|
|
46
|
+
* has `RUNTIME_TRANSPORT=http` set.
|
|
38
47
|
*/
|
|
39
48
|
initializeRuntimeRegistry() {
|
|
49
|
+
assertGrpcOnlyTransport();
|
|
40
50
|
const registry = RuntimeRegistry.getInstance();
|
|
41
51
|
if (!registry.has("nodejs")) {
|
|
42
52
|
registry.register(new NodeJsRuntimeAdapter());
|
|
43
53
|
}
|
|
44
54
|
const sdkLanguages = [
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
kind: "rust",
|
|
54
|
-
hostEnv: "RUNTIME_RUST_HOST",
|
|
55
|
-
httpPortEnv: "RUNTIME_RUST_PORT",
|
|
56
|
-
grpcPortEnv: "RUNTIME_RUST_GRPC_PORT",
|
|
57
|
-
defaultHttpPort: 9002,
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
kind: "java",
|
|
61
|
-
hostEnv: "RUNTIME_JAVA_HOST",
|
|
62
|
-
httpPortEnv: "RUNTIME_JAVA_PORT",
|
|
63
|
-
grpcPortEnv: "RUNTIME_JAVA_GRPC_PORT",
|
|
64
|
-
defaultHttpPort: 9003,
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
kind: "csharp",
|
|
68
|
-
hostEnv: "RUNTIME_CSHARP_HOST",
|
|
69
|
-
httpPortEnv: "RUNTIME_CSHARP_PORT",
|
|
70
|
-
grpcPortEnv: "RUNTIME_CSHARP_GRPC_PORT",
|
|
71
|
-
defaultHttpPort: 9004,
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
kind: "php",
|
|
75
|
-
hostEnv: "RUNTIME_PHP_HOST",
|
|
76
|
-
httpPortEnv: "RUNTIME_PHP_PORT",
|
|
77
|
-
grpcPortEnv: "RUNTIME_PHP_GRPC_PORT",
|
|
78
|
-
defaultHttpPort: 9005,
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
kind: "ruby",
|
|
82
|
-
hostEnv: "RUNTIME_RUBY_HOST",
|
|
83
|
-
httpPortEnv: "RUNTIME_RUBY_PORT",
|
|
84
|
-
grpcPortEnv: "RUNTIME_RUBY_GRPC_PORT",
|
|
85
|
-
defaultHttpPort: 9006,
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
kind: "python3",
|
|
89
|
-
hostEnv: "RUNTIME_PYTHON3_HOST",
|
|
90
|
-
httpPortEnv: "RUNTIME_PYTHON3_PORT",
|
|
91
|
-
grpcPortEnv: "RUNTIME_PYTHON3_GRPC_PORT",
|
|
92
|
-
defaultHttpPort: 9007,
|
|
93
|
-
},
|
|
55
|
+
{ kind: "go", hostEnv: "RUNTIME_GO_HOST", grpcPortEnv: "RUNTIME_GO_GRPC_PORT" },
|
|
56
|
+
{ kind: "rust", hostEnv: "RUNTIME_RUST_HOST", grpcPortEnv: "RUNTIME_RUST_GRPC_PORT" },
|
|
57
|
+
{ kind: "java", hostEnv: "RUNTIME_JAVA_HOST", grpcPortEnv: "RUNTIME_JAVA_GRPC_PORT" },
|
|
58
|
+
{ kind: "csharp", hostEnv: "RUNTIME_CSHARP_HOST", grpcPortEnv: "RUNTIME_CSHARP_GRPC_PORT" },
|
|
59
|
+
{ kind: "php", hostEnv: "RUNTIME_PHP_HOST", grpcPortEnv: "RUNTIME_PHP_GRPC_PORT" },
|
|
60
|
+
{ kind: "ruby", hostEnv: "RUNTIME_RUBY_HOST", grpcPortEnv: "RUNTIME_RUBY_GRPC_PORT" },
|
|
61
|
+
{ kind: "python3", hostEnv: "RUNTIME_PYTHON3_HOST", grpcPortEnv: "RUNTIME_PYTHON3_GRPC_PORT" },
|
|
94
62
|
];
|
|
95
63
|
for (const lang of sdkLanguages) {
|
|
96
64
|
if (registry.has(lang.kind))
|
|
97
65
|
continue;
|
|
98
|
-
const transport = resolveTransportForKind(lang.kind);
|
|
99
66
|
const host = process.env[lang.hostEnv] || "localhost";
|
|
100
|
-
const adapter =
|
|
101
|
-
? this.buildGrpcAdapter(lang.kind, host, lang.grpcPortEnv)
|
|
102
|
-
: this.buildHttpAdapter(lang.kind, host, lang.httpPortEnv, lang.defaultHttpPort);
|
|
67
|
+
const adapter = this.buildGrpcAdapter(lang.kind, host, lang.grpcPortEnv);
|
|
103
68
|
registry.register(adapter);
|
|
104
69
|
}
|
|
105
70
|
}
|
|
106
|
-
buildHttpAdapter(kind, host, portEnv, defaultPort) {
|
|
107
|
-
const port = process.env[portEnv] ? Number.parseInt(process.env[portEnv], 10) : defaultPort;
|
|
108
|
-
return new HttpRuntimeAdapter(kind, host, port);
|
|
109
|
-
}
|
|
110
71
|
buildGrpcAdapter(kind, host, portEnv) {
|
|
111
72
|
const defaultPort = DEFAULT_GRPC_PORTS[kind];
|
|
112
73
|
const port = process.env[portEnv] ? Number.parseInt(process.env[portEnv], 10) : defaultPort;
|
|
@@ -185,6 +146,11 @@ export default class Configuration {
|
|
|
185
146
|
this.version = this.workflow.version;
|
|
186
147
|
this.name = this.workflow.name;
|
|
187
148
|
this.trigger = this.workflow.trigger;
|
|
149
|
+
// Workflow-level middleware list (v0.5.2). Lives on the normalized
|
|
150
|
+
// workflow as `appliedMiddleware` — see WorkflowNormalizer for the
|
|
151
|
+
// schema overload (`middleware: string[]` at the top level).
|
|
152
|
+
const wfWithApplied = this.workflow;
|
|
153
|
+
this.appliedMiddleware = Array.isArray(wfWithApplied.appliedMiddleware) ? wfWithApplied.appliedMiddleware : [];
|
|
188
154
|
}
|
|
189
155
|
async getSteps(blueprint_steps) {
|
|
190
156
|
const nodes = [];
|
|
@@ -203,13 +169,6 @@ export default class Configuration {
|
|
|
203
169
|
node.name = step.name;
|
|
204
170
|
node.active = step.active !== undefined ? step.active : true;
|
|
205
171
|
node.stop = step.stop !== undefined ? step.stop : false;
|
|
206
|
-
// Pass `set_var` through verbatim — DO NOT default to `false`. The
|
|
207
|
-
// `false` value short-circuits PersistenceHelper.applyStepOutput
|
|
208
|
-
// and silently disables v2's default-store rule. Legacy v1
|
|
209
|
-
// workflows that explicitly set `set_var: false` are normalized
|
|
210
|
-
// to `ephemeral: true` upstream by WorkflowNormalizer.
|
|
211
|
-
if (step.set_var !== undefined)
|
|
212
|
-
node.set_var = step.set_var;
|
|
213
172
|
// V2 persistence knobs — read by PersistenceHelper.applyStepOutput.
|
|
214
173
|
// `as` renames the state key; `spread` flattens result.data into
|
|
215
174
|
// state; `ephemeral: true` skips persistence entirely. Default
|
|
@@ -255,10 +214,17 @@ export default class Configuration {
|
|
|
255
214
|
const hasOutputs = currentNode.mapper !== undefined;
|
|
256
215
|
if (isFlowWithProperties) {
|
|
257
216
|
const steps = currentNode.steps;
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
217
|
+
const flow = await this.getFlow(steps);
|
|
218
|
+
// Spread the metadata FIRST, then the resolved flow — this
|
|
219
|
+
// keeps the resolved NodeBase[] in `flow.steps` and lets
|
|
220
|
+
// the metadata (e.g. forEach's in/as/mode/concurrency,
|
|
221
|
+
// loop's while/maxIterations) survive on the merged config.
|
|
222
|
+
// The earlier code spread metadata AFTER flow with a
|
|
223
|
+
// `copyBlueprintNode.steps = []` reset, which clobbered
|
|
224
|
+
// the resolved steps array — broken for any node config
|
|
225
|
+
// that needed both inner steps AND sibling fields.
|
|
226
|
+
const { steps: _drop, ...metadata } = workflow_nodes[key];
|
|
227
|
+
nodes[key] = { ...metadata, ...flow };
|
|
262
228
|
}
|
|
263
229
|
else if (isFlow) {
|
|
264
230
|
const steps = currentNode.steps;
|
|
@@ -284,6 +250,47 @@ export default class Configuration {
|
|
|
284
250
|
catch: await this.getFlow(currentNode.catch.steps),
|
|
285
251
|
};
|
|
286
252
|
}
|
|
253
|
+
else if (typeof workflow_nodes[key] === "object" &&
|
|
254
|
+
Array.isArray(currentNode.try) &&
|
|
255
|
+
Array.isArray(currentNode.catch)) {
|
|
256
|
+
// v0.5 · tryCatch step. `try`, `catch`, and optional `finally`
|
|
257
|
+
// each carry their own inner-step array (set by
|
|
258
|
+
// `normalizeTryCatchStep`). Resolve each block as its own Flow
|
|
259
|
+
// so TryCatchNode.run() can dispatch them through child Runners.
|
|
260
|
+
const raw = workflow_nodes[key];
|
|
261
|
+
const merged = {
|
|
262
|
+
try: (await this.getFlow(raw.try)).steps,
|
|
263
|
+
catch: (await this.getFlow(raw.catch)).steps,
|
|
264
|
+
};
|
|
265
|
+
if (Array.isArray(raw.finally)) {
|
|
266
|
+
merged.finally = (await this.getFlow(raw.finally)).steps;
|
|
267
|
+
}
|
|
268
|
+
nodes[key] = merged;
|
|
269
|
+
}
|
|
270
|
+
else if (typeof workflow_nodes[key] === "object" &&
|
|
271
|
+
currentNode.cases !== undefined &&
|
|
272
|
+
Array.isArray(currentNode.cases)) {
|
|
273
|
+
// v0.5 · switch step. Each case carries its own inner-step
|
|
274
|
+
// list at `case.steps` (set by `normalizeSwitchStep`); resolve
|
|
275
|
+
// each independently via getFlow. Optional `default` is its
|
|
276
|
+
// own resolved Flow. The merged config preserves the `on`
|
|
277
|
+
// expression so the blueprint mapper can rewrite it before
|
|
278
|
+
// SwitchNode.run() reads ctx.config[name].on at run time.
|
|
279
|
+
const raw = workflow_nodes[key];
|
|
280
|
+
const rawCases = raw.cases;
|
|
281
|
+
const resolvedCases = await Promise.all(rawCases.map(async (c) => ({
|
|
282
|
+
when: c.when,
|
|
283
|
+
steps: (await this.getFlow(c.steps)).steps,
|
|
284
|
+
})));
|
|
285
|
+
const merged = {
|
|
286
|
+
on: raw.on,
|
|
287
|
+
cases: resolvedCases,
|
|
288
|
+
};
|
|
289
|
+
if (Array.isArray(raw.default)) {
|
|
290
|
+
merged.default = (await this.getFlow(raw.default)).steps;
|
|
291
|
+
}
|
|
292
|
+
nodes[key] = merged;
|
|
293
|
+
}
|
|
287
294
|
else {
|
|
288
295
|
nodes[key] = { ...workflow_nodes[key] };
|
|
289
296
|
}
|
|
@@ -309,13 +316,6 @@ export default class Configuration {
|
|
|
309
316
|
node.name = step.name;
|
|
310
317
|
node.active = step.active !== undefined ? step.active : true;
|
|
311
318
|
node.stop = step.stop !== undefined ? step.stop : false;
|
|
312
|
-
// Pass `set_var` through verbatim — DO NOT default to `false`. The
|
|
313
|
-
// `false` value short-circuits PersistenceHelper.applyStepOutput
|
|
314
|
-
// and silently disables v2's default-store rule. Legacy v1
|
|
315
|
-
// workflows that explicitly set `set_var: false` are normalized
|
|
316
|
-
// to `ephemeral: true` upstream by WorkflowNormalizer.
|
|
317
|
-
if (step.set_var !== undefined)
|
|
318
|
-
node.set_var = step.set_var;
|
|
319
319
|
// V2 persistence + idempotency + retry knobs flow through nested
|
|
320
320
|
// flow steps too. Without this, a `branch.then[0]` step with
|
|
321
321
|
// `idempotencyKey` set would NOT be cached on rerun. Mirrors the
|
|
@@ -395,6 +395,23 @@ export default class Configuration {
|
|
|
395
395
|
wait: {
|
|
396
396
|
resolver: async (node) => await this.waitResolver(node),
|
|
397
397
|
},
|
|
398
|
+
// v0.5 · `forEach({...})` step — iterate a collection running
|
|
399
|
+
// inner steps per item. Sequential or parallel-bounded.
|
|
400
|
+
forEach: {
|
|
401
|
+
resolver: async (node) => await this.forEachResolver(node),
|
|
402
|
+
},
|
|
403
|
+
// v0.5 · `loop({...})` step — while-loop with maxIterations cap.
|
|
404
|
+
loop: {
|
|
405
|
+
resolver: async (node) => await this.loopResolver(node),
|
|
406
|
+
},
|
|
407
|
+
// v0.5 · `switchOn({...})` step — N-way branch; first matching case wins.
|
|
408
|
+
switch: {
|
|
409
|
+
resolver: async (node) => await this.switchResolver(node),
|
|
410
|
+
},
|
|
411
|
+
// v0.5 · `tryCatch({...})` step — JS-like try/catch/finally semantics.
|
|
412
|
+
tryCatch: {
|
|
413
|
+
resolver: async (node) => await this.tryCatchResolver(node),
|
|
414
|
+
},
|
|
398
415
|
};
|
|
399
416
|
}
|
|
400
417
|
async runtimeResolver(node) {
|
|
@@ -424,15 +441,6 @@ export default class Configuration {
|
|
|
424
441
|
targetNode.runtime = runtimeKind;
|
|
425
442
|
targetNode.active = node.active !== undefined ? node.active : true;
|
|
426
443
|
targetNode.stop = node.stop !== undefined ? node.stop : false;
|
|
427
|
-
// Pass `set_var` through verbatim — DO NOT default to `false`. The v2
|
|
428
|
-
// default-store rule in PersistenceHelper persists `result.data` at
|
|
429
|
-
// `state[name]` unless `set_var === false` is explicit. Defaulting to
|
|
430
|
-
// `false` here silently disabled persistence for every SDK step,
|
|
431
|
-
// breaking `js/ctx.state['<id>']` reads in v2 workflows
|
|
432
|
-
// (cross-runtime-chain regressed: `state['go']` was undefined even
|
|
433
|
-
// though the GO step ran fine).
|
|
434
|
-
if (node.set_var !== undefined)
|
|
435
|
-
targetNode.set_var = node.set_var;
|
|
436
444
|
// V2 persistence knobs — flow through to PersistenceHelper.
|
|
437
445
|
const v2 = node;
|
|
438
446
|
if (v2.as !== undefined)
|
|
@@ -492,6 +500,31 @@ export default class Configuration {
|
|
|
492
500
|
// `wait: false` triggers the fire-and-forget branch in SubworkflowNode.run.
|
|
493
501
|
// Default to `true` (synchronous) when unset.
|
|
494
502
|
subworkflowNode.wait = v2.wait !== false;
|
|
503
|
+
// v0.7 PR 4 — polymorphic sub-workflow dispatch carries the
|
|
504
|
+
// parent workflow's `trigger.webhook.namespace` so a resolved
|
|
505
|
+
// event-type name (e.g. `"invoice.paid"`) gets prefixed into a
|
|
506
|
+
// full registry name (e.g. `"stripe.invoice.paid"`). Static
|
|
507
|
+
// names are unaffected.
|
|
508
|
+
const triggerCfg = this.workflow?.trigger;
|
|
509
|
+
if (typeof triggerCfg?.webhook?.namespace === "string" && triggerCfg.webhook.namespace.length > 0) {
|
|
510
|
+
subworkflowNode.namespace = triggerCfg.webhook.namespace;
|
|
511
|
+
}
|
|
512
|
+
// G3 polymorphic dispatch — pass the per-step allowList (cleaned to
|
|
513
|
+
// non-empty strings by `normalizeSubworkflowStep`) onto the node so
|
|
514
|
+
// `resolveSubworkflowName` can reject unauthorized lookups at
|
|
515
|
+
// dispatch time without re-walking the workflow shape.
|
|
516
|
+
const allowListSource = node.allowList;
|
|
517
|
+
if (Array.isArray(allowListSource) && allowListSource.length > 0) {
|
|
518
|
+
subworkflowNode.allowList = Object.freeze(allowListSource.filter((s) => typeof s === "string" && s.length > 0));
|
|
519
|
+
}
|
|
520
|
+
// G2 (v0.6) — dispatch strategy. `in-process` (default) preserves
|
|
521
|
+
// the v0.5 behaviour; `http-self` routes the child via a fresh
|
|
522
|
+
// HTTP request to the deployment's own base URL so multi-process
|
|
523
|
+
// deployments can isolate child execution from the parent.
|
|
524
|
+
const dispatchRaw = node.dispatch;
|
|
525
|
+
if (dispatchRaw === "http-self" || dispatchRaw === "in-process") {
|
|
526
|
+
subworkflowNode.dispatch = dispatchRaw;
|
|
527
|
+
}
|
|
495
528
|
// `globalOptions` is the runner's node registry — child Configuration.init
|
|
496
529
|
// needs it for `module:` step resolution.
|
|
497
530
|
subworkflowNode.globalOptions = this.globalOptions;
|
|
@@ -502,6 +535,8 @@ export default class Configuration {
|
|
|
502
535
|
if (!nodeHandler) {
|
|
503
536
|
throw new Error(`Node ${node.node} not found`);
|
|
504
537
|
}
|
|
538
|
+
// Validate runtime requirements if the node declares them
|
|
539
|
+
this.validateNodeRuntimeRequirements(nodeHandler);
|
|
505
540
|
const clone = Object.assign(Object.create(Object.getPrototypeOf(nodeHandler)), nodeHandler);
|
|
506
541
|
// Copy step-level metadata from the workflow JSON onto the clone.
|
|
507
542
|
// Without this, `step.type` is undefined for module nodes and
|
|
@@ -516,8 +551,6 @@ export default class Configuration {
|
|
|
516
551
|
clone.active = node.active;
|
|
517
552
|
if (node.stop !== undefined)
|
|
518
553
|
clone.stop = node.stop;
|
|
519
|
-
if (node.set_var !== undefined)
|
|
520
|
-
clone.set_var = node.set_var;
|
|
521
554
|
return clone;
|
|
522
555
|
}
|
|
523
556
|
/**
|
|
@@ -542,6 +575,96 @@ export default class Configuration {
|
|
|
542
575
|
stub.waitUntil = v2.waitUntil;
|
|
543
576
|
return stub;
|
|
544
577
|
}
|
|
578
|
+
/**
|
|
579
|
+
* v0.5 · resolve a `forEach` step. The actual iteration logic lives
|
|
580
|
+
* in `ForEachNode.run()`; the inner `steps` array is pre-resolved by
|
|
581
|
+
* the existing isFlowWithProperties path in `getNodes()`.
|
|
582
|
+
*/
|
|
583
|
+
async forEachResolver(node) {
|
|
584
|
+
const { ForEachNode } = await import("./ForEachNode");
|
|
585
|
+
const n = new ForEachNode();
|
|
586
|
+
n.node = node.node;
|
|
587
|
+
n.name = node.name;
|
|
588
|
+
n.type = node.type;
|
|
589
|
+
n.active = node.active !== undefined ? node.active : true;
|
|
590
|
+
n.stop = node.stop !== undefined ? node.stop : false;
|
|
591
|
+
return n;
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* v0.5 · resolve a `loop` step. While-loop semantics live in
|
|
595
|
+
* `LoopNode.run()`. Inner `steps` resolved by isFlowWithProperties.
|
|
596
|
+
*/
|
|
597
|
+
async loopResolver(node) {
|
|
598
|
+
const { LoopNode } = await import("./LoopNode");
|
|
599
|
+
const n = new LoopNode();
|
|
600
|
+
n.node = node.node;
|
|
601
|
+
n.name = node.name;
|
|
602
|
+
n.type = node.type;
|
|
603
|
+
n.active = node.active !== undefined ? node.active : true;
|
|
604
|
+
n.stop = node.stop !== undefined ? node.stop : false;
|
|
605
|
+
return n;
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* v0.5 · resolve a `switch` step. The N-way match logic lives in
|
|
609
|
+
* `SwitchNode.run()`. Cases + default each carry their own resolved
|
|
610
|
+
* inner-step list — see the dedicated `cases` branch in `getNodes()`.
|
|
611
|
+
*/
|
|
612
|
+
async switchResolver(node) {
|
|
613
|
+
const { SwitchNode } = await import("./SwitchNode");
|
|
614
|
+
const n = new SwitchNode();
|
|
615
|
+
n.node = node.node;
|
|
616
|
+
n.name = node.name;
|
|
617
|
+
n.type = node.type;
|
|
618
|
+
n.active = node.active !== undefined ? node.active : true;
|
|
619
|
+
n.stop = node.stop !== undefined ? node.stop : false;
|
|
620
|
+
return n;
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* v0.5 · resolve a `tryCatch` step. JS-like try/catch/finally semantics
|
|
624
|
+
* live in `TryCatchNode.run()`. Each block (try, catch, finally) is
|
|
625
|
+
* pre-resolved by the dedicated tryCatch branch in `getNodes()` so
|
|
626
|
+
* the runtime can dispatch them through child Runners on-demand.
|
|
627
|
+
*/
|
|
628
|
+
async tryCatchResolver(node) {
|
|
629
|
+
const { TryCatchNode } = await import("./TryCatchNode");
|
|
630
|
+
const n = new TryCatchNode();
|
|
631
|
+
n.node = node.node;
|
|
632
|
+
n.name = node.name;
|
|
633
|
+
n.type = node.type;
|
|
634
|
+
n.active = node.active !== undefined ? node.active : true;
|
|
635
|
+
n.stop = node.stop !== undefined ? node.stop : false;
|
|
636
|
+
return n;
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Check if a resolved node has runtimeRequirements and validate them
|
|
640
|
+
* against the currently known runtime versions in the RuntimeRegistry.
|
|
641
|
+
*/
|
|
642
|
+
validateNodeRuntimeRequirements(node) {
|
|
643
|
+
const fnNode = node;
|
|
644
|
+
if (!fnNode.runtimeRequirements)
|
|
645
|
+
return;
|
|
646
|
+
const registry = RuntimeRegistry.getInstance();
|
|
647
|
+
const runtimeVersions = {};
|
|
648
|
+
for (const kind of registry.getRegisteredKinds()) {
|
|
649
|
+
const version = registry.getVersion(kind);
|
|
650
|
+
if (version) {
|
|
651
|
+
runtimeVersions[kind] = version;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
// If no runtime versions are known yet, skip validation
|
|
655
|
+
// (versions are populated when health checks succeed)
|
|
656
|
+
if (Object.keys(runtimeVersions).length === 0)
|
|
657
|
+
return;
|
|
658
|
+
const validator = new RuntimeVersionValidator(runtimeVersions);
|
|
659
|
+
const results = validator.validateNode({
|
|
660
|
+
name: fnNode.name || "unknown",
|
|
661
|
+
runtimeRequirements: fnNode.runtimeRequirements,
|
|
662
|
+
});
|
|
663
|
+
const failures = results.filter((r) => !r.valid);
|
|
664
|
+
if (failures.length > 0) {
|
|
665
|
+
throw new Error(RuntimeVersionValidator.formatErrors(failures));
|
|
666
|
+
}
|
|
667
|
+
}
|
|
545
668
|
async localResolver(node) {
|
|
546
669
|
// Security review FW-3 — canonicalize the resolved path against
|
|
547
670
|
// NODES_PATH so a node.node value like "../../malicious" can't
|