@blokjs/runner 0.2.0 → 0.2.2
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 +11 -11
- package/dist/Blok.js.map +1 -1
- package/dist/Configuration.d.ts +21 -2
- package/dist/Configuration.js +188 -26
- package/dist/Configuration.js.map +1 -1
- package/dist/ConfigurationResolver.d.ts +9 -0
- package/dist/ConfigurationResolver.js +17 -1
- package/dist/ConfigurationResolver.js.map +1 -1
- package/dist/RunnerSteps.js +52 -9
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/RuntimeAdapterNode.d.ts +32 -2
- package/dist/RuntimeAdapterNode.js +122 -27
- package/dist/RuntimeAdapterNode.js.map +1 -1
- package/dist/TriggerBase.js +35 -2
- package/dist/TriggerBase.js.map +1 -1
- package/dist/adapters/BunRuntimeAdapter.d.ts +1 -0
- package/dist/adapters/BunRuntimeAdapter.js +1 -0
- package/dist/adapters/BunRuntimeAdapter.js.map +1 -1
- package/dist/adapters/DockerRuntimeAdapter.d.ts +2 -1
- package/dist/adapters/DockerRuntimeAdapter.js +10 -1
- package/dist/adapters/DockerRuntimeAdapter.js.map +1 -1
- package/dist/adapters/HttpRuntimeAdapter.d.ts +26 -5
- package/dist/adapters/HttpRuntimeAdapter.js +97 -16
- package/dist/adapters/HttpRuntimeAdapter.js.map +1 -1
- package/dist/adapters/NodeJsRuntimeAdapter.d.ts +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js +1 -0
- package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -1
- package/dist/adapters/RuntimeAdapter.d.ts +17 -0
- package/dist/adapters/WasmRuntimeAdapter.d.ts +1 -0
- package/dist/adapters/WasmRuntimeAdapter.js +1 -0
- package/dist/adapters/WasmRuntimeAdapter.js.map +1 -1
- package/dist/adapters/grpc/GrpcChannelOptions.d.ts +31 -0
- package/dist/adapters/grpc/GrpcChannelOptions.js +68 -0
- package/dist/adapters/grpc/GrpcChannelOptions.js.map +1 -0
- package/dist/adapters/grpc/GrpcClientPool.d.ts +43 -0
- package/dist/adapters/grpc/GrpcClientPool.js +89 -0
- package/dist/adapters/grpc/GrpcClientPool.js.map +1 -0
- package/dist/adapters/grpc/GrpcCodec.d.ts +226 -0
- package/dist/adapters/grpc/GrpcCodec.js +275 -0
- package/dist/adapters/grpc/GrpcCodec.js.map +1 -0
- package/dist/adapters/grpc/GrpcErrors.d.ts +59 -0
- package/dist/adapters/grpc/GrpcErrors.js +190 -0
- package/dist/adapters/grpc/GrpcErrors.js.map +1 -0
- package/dist/adapters/grpc/GrpcHealthChecker.d.ts +69 -0
- package/dist/adapters/grpc/GrpcHealthChecker.js +96 -0
- package/dist/adapters/grpc/GrpcHealthChecker.js.map +1 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +98 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +478 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -0
- package/dist/adapters/grpc/index.d.ts +13 -0
- package/dist/adapters/grpc/index.js +14 -0
- package/dist/adapters/grpc/index.js.map +1 -0
- package/dist/adapters/grpc/proto/blok/runtime/v1/runtime.proto +302 -0
- package/dist/adapters/grpc/types.d.ts +97 -0
- package/dist/adapters/grpc/types.js +41 -0
- package/dist/adapters/grpc/types.js.map +1 -0
- package/dist/adapters/transport.d.ts +108 -0
- package/dist/adapters/transport.js +196 -0
- package/dist/adapters/transport.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/testing/WorkflowTestRunner.js +12 -0
- package/dist/testing/WorkflowTestRunner.js.map +1 -1
- package/dist/tracing/RunTracker.d.ts +23 -2
- package/dist/tracing/RunTracker.js +120 -10
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.js +19 -3
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.js +245 -4
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/types.d.ts +82 -10
- package/dist/types/GlobalOptions.d.ts +9 -2
- package/dist/workflow/PersistenceHelper.d.ts +46 -0
- package/dist/workflow/PersistenceHelper.js +57 -0
- package/dist/workflow/PersistenceHelper.js.map +1 -0
- package/dist/workflow/WorkflowNormalizer.d.ts +91 -0
- package/dist/workflow/WorkflowNormalizer.js +304 -0
- package/dist/workflow/WorkflowNormalizer.js.map +1 -0
- package/package.json +10 -7
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
export class HttpRuntimeAdapter {
|
|
22
22
|
kind;
|
|
23
|
+
transport = "http";
|
|
23
24
|
baseUrl;
|
|
24
25
|
timeoutMs;
|
|
25
26
|
constructor(kind, host, port, options) {
|
|
@@ -41,7 +42,23 @@ export class HttpRuntimeAdapter {
|
|
|
41
42
|
signal: AbortSignal.timeout(this.timeoutMs),
|
|
42
43
|
});
|
|
43
44
|
if (!response.ok) {
|
|
44
|
-
|
|
45
|
+
// Read the error response body — SDK containers return structured error details
|
|
46
|
+
// that would otherwise be lost (e.g. validation messages, stack traces)
|
|
47
|
+
let errorDetail = "";
|
|
48
|
+
try {
|
|
49
|
+
const errorBody = (await response.json());
|
|
50
|
+
const errors = errorBody?.errors;
|
|
51
|
+
errorDetail = errors?.message || JSON.stringify(errors) || "";
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
try {
|
|
55
|
+
errorDetail = await response.text();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* body not readable */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`HTTP runtime '${this.kind}' at ${this.baseUrl} returned HTTP ${response.status}: ${response.statusText}${errorDetail ? ` — ${errorDetail}` : ""}`);
|
|
45
62
|
}
|
|
46
63
|
const result = (await response.json());
|
|
47
64
|
const duration_ms = performance.now() - startTime;
|
|
@@ -76,11 +93,31 @@ export class HttpRuntimeAdapter {
|
|
|
76
93
|
/**
|
|
77
94
|
* Create the ExecutionRequest payload for the SDK container.
|
|
78
95
|
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
96
|
+
* Sends two shapes in the same envelope so the migration to the new
|
|
97
|
+
* canonical wire format is backward-compatible:
|
|
98
|
+
*
|
|
99
|
+
* 1. **Legacy keys** — `node.config` + `context.{request,response,vars,env}`.
|
|
100
|
+
* Existing SDK HTTP servers (Rust, Python, Go HTTP, others) read
|
|
101
|
+
* these keys today and keep working unchanged.
|
|
102
|
+
*
|
|
103
|
+
* 2. **New canonical keys** — `step` / `inputs` / `trigger` / `state` /
|
|
104
|
+
* `workflow`. Same field names + structure as the gRPC proto so SDK
|
|
105
|
+
* authors who adopt the new shape get a uniform mental model across
|
|
106
|
+
* transports. The "inputs unwrapped at the wire layer" property
|
|
107
|
+
* (FIXES.md #3) holds for both shapes.
|
|
108
|
+
*
|
|
109
|
+
* Data flow priority for the legacy `request.body`:
|
|
110
|
+
* 1. If the node has resolved inputs (from the blueprint Mapper), use
|
|
111
|
+
* those as `request.body` so workflows that define explicit inputs
|
|
112
|
+
* like `"chain": "js/ctx.response.data.chain"` keep working.
|
|
113
|
+
* 2. Otherwise, fall back to `ctx.response.data` (previous step output)
|
|
114
|
+
* enabling zero-config chaining for SDK nodes that read body fields.
|
|
115
|
+
*
|
|
116
|
+
* The new `trigger.body` always reflects the actual trigger body
|
|
117
|
+
* (`ctx.request?.body`) — separated from inputs at the wire layer.
|
|
118
|
+
*
|
|
119
|
+
* Deprecation timeline: legacy keys will be removed in the next minor
|
|
120
|
+
* version once SDK HTTP servers have all adopted the new shape.
|
|
84
121
|
*/
|
|
85
122
|
createExecutionRequest(node, ctx) {
|
|
86
123
|
const nodeConfig = ctx.config
|
|
@@ -91,26 +128,40 @@ export class HttpRuntimeAdapter {
|
|
|
91
128
|
// config[node.name].inputs has resolved values (not raw js/ expressions)
|
|
92
129
|
const resolvedInputs = nodeConfig?.inputs;
|
|
93
130
|
// Use resolved inputs if available, otherwise fall back to previous step data
|
|
94
|
-
const
|
|
131
|
+
const legacyRequestBody = resolvedInputs || (ctx.response?.data ?? {});
|
|
132
|
+
// Unwrap the {inputs: {...}} wrapper that comes from @blokjs/helper StepNode.
|
|
133
|
+
// SDK nodes expect config to contain the inputs directly (e.g. config.operation),
|
|
134
|
+
// not wrapped as config.inputs.operation.
|
|
135
|
+
const unwrappedConfig = resolvedInputs || nodeConfig?.inputs || nodeConfig || {};
|
|
136
|
+
const stepInfo = ctx._stepInfo;
|
|
137
|
+
const headers = ctx.request?.headers ?? {};
|
|
138
|
+
const params = ctx.request?.params ?? {};
|
|
139
|
+
const query = ctx.request?.query ?? {};
|
|
140
|
+
const cookies = ctx.request?.cookies ?? {};
|
|
141
|
+
const method = ctx.request?.method ?? "";
|
|
142
|
+
const url = ctx.request?.url ?? "";
|
|
143
|
+
const baseUrl = ctx.request?.baseUrl ?? "";
|
|
95
144
|
return {
|
|
145
|
+
// ===== Legacy keys (kept for one minor for backward compat) =====
|
|
96
146
|
node: {
|
|
97
147
|
name: node.node,
|
|
98
148
|
type: node.type,
|
|
99
|
-
|
|
149
|
+
version: "",
|
|
150
|
+
config: unwrappedConfig,
|
|
100
151
|
},
|
|
101
152
|
context: {
|
|
102
153
|
id: ctx.id,
|
|
103
154
|
workflow_name: ctx.workflow_name,
|
|
104
155
|
workflow_path: ctx.workflow_path,
|
|
105
156
|
request: {
|
|
106
|
-
body:
|
|
107
|
-
headers
|
|
108
|
-
params
|
|
109
|
-
query
|
|
110
|
-
method
|
|
111
|
-
url
|
|
112
|
-
cookies
|
|
113
|
-
baseUrl
|
|
157
|
+
body: legacyRequestBody,
|
|
158
|
+
headers,
|
|
159
|
+
params,
|
|
160
|
+
query,
|
|
161
|
+
method,
|
|
162
|
+
url,
|
|
163
|
+
cookies,
|
|
164
|
+
baseUrl,
|
|
114
165
|
},
|
|
115
166
|
response: {
|
|
116
167
|
data: null,
|
|
@@ -121,6 +172,36 @@ export class HttpRuntimeAdapter {
|
|
|
121
172
|
vars: ctx.vars ?? {},
|
|
122
173
|
env: ctx.env ?? {},
|
|
123
174
|
},
|
|
175
|
+
// ===== New canonical keys (mirror the gRPC proto v1 schema) =====
|
|
176
|
+
step: {
|
|
177
|
+
name: stepInfo?.name ?? node.name,
|
|
178
|
+
index: stepInfo?.index ?? 0,
|
|
179
|
+
total: stepInfo?.total ?? 1,
|
|
180
|
+
depth: stepInfo?.depth ?? 0,
|
|
181
|
+
},
|
|
182
|
+
inputs: unwrappedConfig,
|
|
183
|
+
trigger: {
|
|
184
|
+
body: ctx.request?.body ?? null,
|
|
185
|
+
headers,
|
|
186
|
+
params,
|
|
187
|
+
query,
|
|
188
|
+
cookies,
|
|
189
|
+
method,
|
|
190
|
+
url,
|
|
191
|
+
baseUrl,
|
|
192
|
+
triggerKind: "",
|
|
193
|
+
},
|
|
194
|
+
state: {
|
|
195
|
+
previousOutput: ctx.response?.data ?? null,
|
|
196
|
+
vars: ctx.vars ?? {},
|
|
197
|
+
env: ctx.env ?? {},
|
|
198
|
+
},
|
|
199
|
+
workflow: {
|
|
200
|
+
runId: ctx.id,
|
|
201
|
+
name: ctx.workflow_name ?? "",
|
|
202
|
+
path: ctx.workflow_path ?? "",
|
|
203
|
+
version: "",
|
|
204
|
+
},
|
|
124
205
|
};
|
|
125
206
|
}
|
|
126
207
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/HttpRuntimeAdapter.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,kBAAkB;IACd,IAAI,CAAc;
|
|
1
|
+
{"version":3,"file":"HttpRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/HttpRuntimeAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import type { ExecutionResult, RuntimeAdapter } from "./RuntimeAdapter";
|
|
|
12
12
|
*/
|
|
13
13
|
export declare class NodeJsRuntimeAdapter implements RuntimeAdapter {
|
|
14
14
|
readonly kind = "nodejs";
|
|
15
|
+
readonly transport: "module";
|
|
15
16
|
/**
|
|
16
17
|
* Execute a Node.js node in-process
|
|
17
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/NodeJsRuntimeAdapter.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAChB,IAAI,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"NodeJsRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/NodeJsRuntimeAdapter.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAChB,IAAI,GAAG,QAAQ,CAAC;IAChB,SAAS,GAAG,QAAiB,CAAC;IAE9C;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAY;QAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACJ,gCAAgC;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAErC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAElD,6CAA6C;YAC7C,0BAA0B;YAC1B,0EAA0E;YAC1E,+CAA+C;YAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAiF,CAAC;YAChH,MAAM,gBAAgB,GAAG,QAAkE,CAAC;YAE5F,6FAA6F;YAC7F,MAAM,WAAW,GAAG,YAAY,EAAE,KAAK,KAAK,IAAI,IAAI,YAAY,EAAE,KAAK,KAAK,SAAS,CAAC;YACtF,MAAM,aAAa,GAAG,gBAAgB,EAAE,KAAK,KAAK,IAAI,IAAI,gBAAgB,EAAE,KAAK,KAAK,SAAS,CAAC;YAChG,MAAM,QAAQ,GAAG,WAAW,IAAI,aAAa,CAAC;YAE9C,yEAAyE;YACzE,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,CAAC;YAC5C,MAAM,eAAe,GAAG,gBAAgB,EAAE,OAAO,CAAC;YAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,eAAe,IAAI,IAAI,CAAC,CAAC;YAE9E,wCAAwC;YACxC,MAAM,UAAU,GAAG,YAAY,EAAE,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,IAAI,CAAC;YAE1E,OAAO;gBACN,OAAO;gBACP,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE;oBACR,WAAW;iBACX;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAElD,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE;oBACP,OAAO,EAAG,KAAe,CAAC,OAAO;oBACjC,KAAK,EAAG,KAAe,CAAC,KAAK;oBAC7B,IAAI,EAAG,KAAe,CAAC,IAAI;iBAC3B;gBACD,OAAO,EAAE;oBACR,WAAW;iBACX;aACD,CAAC;QACH,CAAC;IACF,CAAC;CACD"}
|
|
@@ -4,6 +4,13 @@ import type RunnerNode from "../RunnerNode";
|
|
|
4
4
|
* RuntimeKind represents all supported runtime environments
|
|
5
5
|
*/
|
|
6
6
|
export type RuntimeKind = "nodejs" | "bun" | "python3" | "go" | "java" | "rust" | "php" | "csharp" | "ruby" | "docker" | "wasm";
|
|
7
|
+
/**
|
|
8
|
+
* Wire transport an adapter uses to reach an SDK runtime. `module` is for
|
|
9
|
+
* in-process NodeJS adapters; `http` and `grpc` are the two non-NodeJS
|
|
10
|
+
* options. Used for log tagging and for distinguishing the same `kind`
|
|
11
|
+
* across transports during the gRPC migration.
|
|
12
|
+
*/
|
|
13
|
+
export type AdapterTransport = "module" | "http" | "grpc";
|
|
7
14
|
/**
|
|
8
15
|
* ExecutionResult is the canonical response structure from any runtime adapter
|
|
9
16
|
*/
|
|
@@ -16,6 +23,10 @@ export type ExecutionResult = {
|
|
|
16
23
|
duration_ms?: number;
|
|
17
24
|
cpu_ms?: number;
|
|
18
25
|
memory_bytes?: number;
|
|
26
|
+
/** Approximate or exact bytes the adapter sent on the wire. */
|
|
27
|
+
request_bytes?: number;
|
|
28
|
+
/** Bytes the adapter received from the SDK. */
|
|
29
|
+
response_bytes?: number;
|
|
19
30
|
};
|
|
20
31
|
/** Variables set by the SDK node during execution, to be merged into ctx.vars */
|
|
21
32
|
vars?: Record<string, unknown>;
|
|
@@ -31,6 +42,12 @@ export interface RuntimeAdapter {
|
|
|
31
42
|
* The kind of runtime this adapter handles
|
|
32
43
|
*/
|
|
33
44
|
readonly kind: RuntimeKind;
|
|
45
|
+
/**
|
|
46
|
+
* Wire transport this adapter uses (`http`, `grpc`, or in-process
|
|
47
|
+
* `module`). Surfaced in step-prefix logs so operators can tell at a
|
|
48
|
+
* glance which path a runtime node took during the migration.
|
|
49
|
+
*/
|
|
50
|
+
readonly transport: AdapterTransport;
|
|
34
51
|
/**
|
|
35
52
|
* Execute a node in this runtime
|
|
36
53
|
*
|
|
@@ -21,6 +21,7 @@ import type { ExecutionResult, RuntimeAdapter } from "./RuntimeAdapter";
|
|
|
21
21
|
*/
|
|
22
22
|
export declare class WasmRuntimeAdapter implements RuntimeAdapter {
|
|
23
23
|
readonly kind: "wasm";
|
|
24
|
+
readonly transport: "module";
|
|
24
25
|
private moduleCache;
|
|
25
26
|
private maxCacheSize;
|
|
26
27
|
constructor(options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WasmRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/WasmRuntimeAdapter.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,kBAAkB;IACd,IAAI,GAAG,MAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"WasmRuntimeAdapter.js","sourceRoot":"","sources":["../../src/adapters/WasmRuntimeAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ChannelOptions } from "@grpc/grpc-js";
|
|
2
|
+
import { GRPC_DEFAULTS, type GrpcAdapterConfig } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Build the {@link ChannelOptions} dictionary for `@grpc/grpc-js` from a
|
|
5
|
+
* {@link GrpcAdapterConfig}. Pure function — no I/O.
|
|
6
|
+
*
|
|
7
|
+
* The returned options enforce:
|
|
8
|
+
* - 16MB max send/receive message length (parity with PHP buffer ceiling).
|
|
9
|
+
* - Keepalive pings every 10s with 5s ack timeout.
|
|
10
|
+
* - TLS server-name override when provided.
|
|
11
|
+
*
|
|
12
|
+
* Service config (for `Health` RPC retries) is passed through verbatim so
|
|
13
|
+
* advanced users can tune retry/hedging policy without touching this file.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const channel = new grpc.Client(
|
|
17
|
+
* `${cfg.host}:${cfg.port}`,
|
|
18
|
+
* credentials,
|
|
19
|
+
* buildChannelOptions(cfg),
|
|
20
|
+
* );
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildChannelOptions(config: GrpcAdapterConfig): ChannelOptions;
|
|
23
|
+
/**
|
|
24
|
+
* Default service config for the Health RPC. Permits up to 3 retries on
|
|
25
|
+
* `UNAVAILABLE` with exponential backoff.
|
|
26
|
+
*
|
|
27
|
+
* Only applied to `NodeRuntime/Health` — `Execute` is intentionally never
|
|
28
|
+
* retried automatically because workflow steps are not idempotent in general.
|
|
29
|
+
*/
|
|
30
|
+
export declare const DEFAULT_HEALTH_SERVICE_CONFIG: string;
|
|
31
|
+
export { GRPC_DEFAULTS };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { GRPC_DEFAULTS } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Build the {@link ChannelOptions} dictionary for `@grpc/grpc-js` from a
|
|
4
|
+
* {@link GrpcAdapterConfig}. Pure function — no I/O.
|
|
5
|
+
*
|
|
6
|
+
* The returned options enforce:
|
|
7
|
+
* - 16MB max send/receive message length (parity with PHP buffer ceiling).
|
|
8
|
+
* - Keepalive pings every 10s with 5s ack timeout.
|
|
9
|
+
* - TLS server-name override when provided.
|
|
10
|
+
*
|
|
11
|
+
* Service config (for `Health` RPC retries) is passed through verbatim so
|
|
12
|
+
* advanced users can tune retry/hedging policy without touching this file.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const channel = new grpc.Client(
|
|
16
|
+
* `${cfg.host}:${cfg.port}`,
|
|
17
|
+
* credentials,
|
|
18
|
+
* buildChannelOptions(cfg),
|
|
19
|
+
* );
|
|
20
|
+
*/
|
|
21
|
+
export function buildChannelOptions(config) {
|
|
22
|
+
const opts = {
|
|
23
|
+
"grpc.max_send_message_length": config.maxMessageBytes,
|
|
24
|
+
"grpc.max_receive_message_length": config.maxMessageBytes,
|
|
25
|
+
"grpc.keepalive_time_ms": config.keepalive.timeMs,
|
|
26
|
+
"grpc.keepalive_timeout_ms": config.keepalive.timeoutMs,
|
|
27
|
+
"grpc.keepalive_permit_without_calls": config.keepalive.permitWithoutCalls ? 1 : 0,
|
|
28
|
+
// Sets the maximum amount of time a connection can be idle before keepalive
|
|
29
|
+
// pings start. Matches keepalive_time so we ping consistently.
|
|
30
|
+
"grpc.http2.min_time_between_pings_ms": config.keepalive.timeMs,
|
|
31
|
+
};
|
|
32
|
+
if (config.tls?.serverNameOverride) {
|
|
33
|
+
opts["grpc.ssl_target_name_override"] = config.tls.serverNameOverride;
|
|
34
|
+
opts["grpc.default_authority"] = config.tls.serverNameOverride;
|
|
35
|
+
}
|
|
36
|
+
if (config.serviceConfigJson) {
|
|
37
|
+
opts["grpc.service_config"] = config.serviceConfigJson;
|
|
38
|
+
}
|
|
39
|
+
return opts;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Default service config for the Health RPC. Permits up to 3 retries on
|
|
43
|
+
* `UNAVAILABLE` with exponential backoff.
|
|
44
|
+
*
|
|
45
|
+
* Only applied to `NodeRuntime/Health` — `Execute` is intentionally never
|
|
46
|
+
* retried automatically because workflow steps are not idempotent in general.
|
|
47
|
+
*/
|
|
48
|
+
export const DEFAULT_HEALTH_SERVICE_CONFIG = JSON.stringify({
|
|
49
|
+
methodConfig: [
|
|
50
|
+
{
|
|
51
|
+
name: [
|
|
52
|
+
{
|
|
53
|
+
service: "blok.runtime.v1.NodeRuntime",
|
|
54
|
+
method: "Health",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
retryPolicy: {
|
|
58
|
+
maxAttempts: 3,
|
|
59
|
+
initialBackoff: "0.1s",
|
|
60
|
+
maxBackoff: "1s",
|
|
61
|
+
backoffMultiplier: 2,
|
|
62
|
+
retryableStatusCodes: ["UNAVAILABLE"],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
export { GRPC_DEFAULTS };
|
|
68
|
+
//# sourceMappingURL=GrpcChannelOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrpcChannelOptions.js","sourceRoot":"","sources":["../../../src/adapters/grpc/GrpcChannelOptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA0B,MAAM,SAAS,CAAC;AAEhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAyB;IAC5D,MAAM,IAAI,GAAmB;QAC5B,8BAA8B,EAAE,MAAM,CAAC,eAAe;QACtD,iCAAiC,EAAE,MAAM,CAAC,eAAe;QACzD,wBAAwB,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;QACjD,2BAA2B,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS;QACvD,qCAAqC,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,4EAA4E;QAC5E,+DAA+D;QAC/D,sCAAsC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;KAC/D,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC;QACpC,IAAI,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtE,IAAI,CAAC,wBAAwB,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChE,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9B,IAAI,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAW,IAAI,CAAC,SAAS,CAAC;IACnE,YAAY,EAAE;QACb;YACC,IAAI,EAAE;gBACL;oBACC,OAAO,EAAE,6BAA6B;oBACtC,MAAM,EAAE,QAAQ;iBAChB;aACD;YACD,WAAW,EAAE;gBACZ,WAAW,EAAE,CAAC;gBACd,cAAc,EAAE,MAAM;gBACtB,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,CAAC;gBACpB,oBAAoB,EAAE,CAAC,aAAa,CAAC;aACrC;SACD;KACD;CACD,CAAC,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ChannelCredentials, type Client } from "@grpc/grpc-js";
|
|
2
|
+
import type { GrpcAdapterConfig, TlsConfig } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Pool of gRPC clients keyed by `(host, port)`. One persistent client per
|
|
5
|
+
* endpoint for the lifetime of the pool — no per-request TCP/HTTP/2
|
|
6
|
+
* handshake.
|
|
7
|
+
*
|
|
8
|
+
* Adapters request a client via {@link get}; the pool creates it on first
|
|
9
|
+
* use and caches it. {@link close} drains all clients, used during graceful
|
|
10
|
+
* shutdown.
|
|
11
|
+
*
|
|
12
|
+
* Single Responsibility: lifecycle of `Client` instances. The pool does not
|
|
13
|
+
* encode requests, decode responses, or interpret errors — those belong to
|
|
14
|
+
* {@link GrpcCodec} and {@link GrpcErrors}.
|
|
15
|
+
*/
|
|
16
|
+
export declare class GrpcClientPool {
|
|
17
|
+
private readonly clients;
|
|
18
|
+
/**
|
|
19
|
+
* Get (or lazily create) a client for the given config's `(host, port)`.
|
|
20
|
+
* Subsequent calls with the same endpoint return the same instance.
|
|
21
|
+
*/
|
|
22
|
+
get(config: GrpcAdapterConfig): Client;
|
|
23
|
+
/**
|
|
24
|
+
* Close a client for a specific endpoint. Returns true if a client was
|
|
25
|
+
* present and closed.
|
|
26
|
+
*/
|
|
27
|
+
closeEndpoint(host: string, port: number): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Drain the pool. Closes every cached client.
|
|
30
|
+
*/
|
|
31
|
+
close(): void;
|
|
32
|
+
/** How many clients the pool currently holds. */
|
|
33
|
+
size(): number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build channel credentials from a {@link TlsConfig}. When `tls` is omitted
|
|
37
|
+
* returns insecure credentials (plaintext channel) — appropriate for loopback
|
|
38
|
+
* dev only.
|
|
39
|
+
*
|
|
40
|
+
* `BLOK_GRPC_REQUIRE_TLS=true` causes the adapter to throw at startup when an
|
|
41
|
+
* insecure channel targets a non-loopback host.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildCredentials(tls?: TlsConfig): ChannelCredentials;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { credentials as grpcCredentials } from "@grpc/grpc-js";
|
|
3
|
+
import { buildChannelOptions } from "./GrpcChannelOptions";
|
|
4
|
+
import { NodeRuntimeService } from "./GrpcCodec";
|
|
5
|
+
/**
|
|
6
|
+
* Pool of gRPC clients keyed by `(host, port)`. One persistent client per
|
|
7
|
+
* endpoint for the lifetime of the pool — no per-request TCP/HTTP/2
|
|
8
|
+
* handshake.
|
|
9
|
+
*
|
|
10
|
+
* Adapters request a client via {@link get}; the pool creates it on first
|
|
11
|
+
* use and caches it. {@link close} drains all clients, used during graceful
|
|
12
|
+
* shutdown.
|
|
13
|
+
*
|
|
14
|
+
* Single Responsibility: lifecycle of `Client` instances. The pool does not
|
|
15
|
+
* encode requests, decode responses, or interpret errors — those belong to
|
|
16
|
+
* {@link GrpcCodec} and {@link GrpcErrors}.
|
|
17
|
+
*/
|
|
18
|
+
export class GrpcClientPool {
|
|
19
|
+
clients = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Get (or lazily create) a client for the given config's `(host, port)`.
|
|
22
|
+
* Subsequent calls with the same endpoint return the same instance.
|
|
23
|
+
*/
|
|
24
|
+
get(config) {
|
|
25
|
+
const endpoint = `${config.host}:${config.port}`;
|
|
26
|
+
const existing = this.clients.get(endpoint);
|
|
27
|
+
if (existing)
|
|
28
|
+
return existing;
|
|
29
|
+
const creds = buildCredentials(config.tls);
|
|
30
|
+
const options = buildChannelOptions(config);
|
|
31
|
+
const ServiceCtor = NodeRuntimeService;
|
|
32
|
+
const client = new ServiceCtor(endpoint, creds, options);
|
|
33
|
+
this.clients.set(endpoint, client);
|
|
34
|
+
return client;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Close a client for a specific endpoint. Returns true if a client was
|
|
38
|
+
* present and closed.
|
|
39
|
+
*/
|
|
40
|
+
closeEndpoint(host, port) {
|
|
41
|
+
const endpoint = `${host}:${port}`;
|
|
42
|
+
const client = this.clients.get(endpoint);
|
|
43
|
+
if (!client)
|
|
44
|
+
return false;
|
|
45
|
+
client.close();
|
|
46
|
+
this.clients.delete(endpoint);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Drain the pool. Closes every cached client.
|
|
51
|
+
*/
|
|
52
|
+
close() {
|
|
53
|
+
for (const client of this.clients.values()) {
|
|
54
|
+
try {
|
|
55
|
+
client.close();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* swallow — best-effort cleanup during shutdown */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.clients.clear();
|
|
62
|
+
}
|
|
63
|
+
/** How many clients the pool currently holds. */
|
|
64
|
+
size() {
|
|
65
|
+
return this.clients.size;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build channel credentials from a {@link TlsConfig}. When `tls` is omitted
|
|
70
|
+
* returns insecure credentials (plaintext channel) — appropriate for loopback
|
|
71
|
+
* dev only.
|
|
72
|
+
*
|
|
73
|
+
* `BLOK_GRPC_REQUIRE_TLS=true` causes the adapter to throw at startup when an
|
|
74
|
+
* insecure channel targets a non-loopback host.
|
|
75
|
+
*/
|
|
76
|
+
export function buildCredentials(tls) {
|
|
77
|
+
if (!tls)
|
|
78
|
+
return grpcCredentials.createInsecure();
|
|
79
|
+
if (tls.insecureSkipVerify) {
|
|
80
|
+
// Verified-server-via-handshake-skipped is genuinely insecure. We log
|
|
81
|
+
// at adapter startup; here we just produce the credentials object.
|
|
82
|
+
return grpcCredentials.createInsecure();
|
|
83
|
+
}
|
|
84
|
+
const ca = tls.caCertPath ? fs.readFileSync(tls.caCertPath) : null;
|
|
85
|
+
const clientCert = tls.clientCertPath ? fs.readFileSync(tls.clientCertPath) : null;
|
|
86
|
+
const clientKey = tls.clientKeyPath ? fs.readFileSync(tls.clientKeyPath) : null;
|
|
87
|
+
return grpcCredentials.createSsl(ca ?? null, clientKey ?? null, clientCert ?? null);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=GrpcClientPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrpcClientPool.js","sourceRoot":"","sources":["../../../src/adapters/grpc/GrpcClientPool.ts"],"names":[],"mappings":"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"}
|