@blokjs/trigger-grpc 1.1.0 → 1.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.
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gRPC trigger end-to-end integration test (issue #600).
|
|
3
|
+
*
|
|
4
|
+
* Stands up the REAL gRPC trigger on a live HTTP/2 port — the exact boot
|
|
5
|
+
* path `GrpcServer.start()` uses: a fastify `{ http2: true }` server with
|
|
6
|
+
* `@connectrpc/connect-fastify`'s `fastifyConnectPlugin`, wired via
|
|
7
|
+
* `trigger.processRequest(router, trigger)`. It is then driven by the
|
|
8
|
+
* repo's OWN gRPC client (`GrpcClient`, backed by
|
|
9
|
+
* `@connectrpc/connect-node`'s `createGrpcTransport`) over the wire.
|
|
10
|
+
* Nothing about the transport, the Connect codec, the trigger's decode /
|
|
11
|
+
* execute / middleware / error-encode path, or the runner is mocked — only
|
|
12
|
+
* OTel is stubbed to avoid needing an exporter.
|
|
13
|
+
*
|
|
14
|
+
* Gating: this test boots a real network listener, so it is gated on
|
|
15
|
+
* `RUN_GRPC_IT` (unset → the whole suite is skipped). The port + node /
|
|
16
|
+
* workflow names carry a per-run random suffix so a concurrent target on
|
|
17
|
+
* the same box never collides.
|
|
18
|
+
*
|
|
19
|
+
* The ONLY execution path the trigger exposes on the wire is the
|
|
20
|
+
* "remote node" path (`GRpcTrigger.executeWorkflow`): the decoded message
|
|
21
|
+
* must carry a `workflow` object, and the trigger synthesizes an ephemeral
|
|
22
|
+
* single-step workflow around the node named by `request.Name`, resolving
|
|
23
|
+
* that node from its in-process `nodeMap.nodes`. This is exactly what the
|
|
24
|
+
* shipped `NanoSDK.nodejs()` / `.python3()` helpers do. The fixture node is
|
|
25
|
+
* injected into the trigger's `nodeMap` before boot so we drive a fully
|
|
26
|
+
* in-process module node (no external HTTP dependency) and can force a
|
|
27
|
+
* throw for the error-mapping assertion.
|
|
28
|
+
*
|
|
29
|
+
* A module-level `EXECUTIONS` array records each node-body invocation so
|
|
30
|
+
* assertions prove the workflow ACTUALLY ran on the far side of the wire —
|
|
31
|
+
* not just that a well-formed response came back.
|
|
32
|
+
*
|
|
33
|
+
* Coverage vs. the four #600 behaviours:
|
|
34
|
+
* 1. UNARY — a real gRPC call runs the workflow and returns the real,
|
|
35
|
+
* decoded node output. (observable EXECUTIONS effect + decoded body)
|
|
36
|
+
* 2. ORDERED multi-message — the proto/service is UNARY-only
|
|
37
|
+
* (`methodKind: "unary"`; there is no server-streaming RPC on the
|
|
38
|
+
* wire), so true gRPC server-streaming is not implementable against
|
|
39
|
+
* this adapter. We instead prove ordered, multi-message delivery over
|
|
40
|
+
* the real wire via N sequential unary calls, asserting the far side
|
|
41
|
+
* received them in order. (See the NOTE on the test itself — we do NOT
|
|
42
|
+
* fake a streaming RPC.)
|
|
43
|
+
* 3. MIDDLEWARE — a trigger-level middleware chain (`trigger.grpc
|
|
44
|
+
* .middleware`) runs before the body; the "allow" middleware mutates
|
|
45
|
+
* ctx.state (observable in the node output) and the "deny" middleware
|
|
46
|
+
* throws a 401 GlobalError that short-circuits the body (the node
|
|
47
|
+
* never runs) and surfaces as the mapped error envelope.
|
|
48
|
+
* 4. ERROR MAPPING — a thrown workflow error is caught and mapped to the
|
|
49
|
+
* adapter's error envelope: the message travels back in the response
|
|
50
|
+
* `Message` field with `Type: TEXT` (NOT the success `JSON` type), the
|
|
51
|
+
* RPC does not crash the server, and a follow-up healthy call still
|
|
52
|
+
* succeeds. NOTE: this adapter deliberately does NOT translate the
|
|
53
|
+
* workflow error into a non-OK gRPC/Connect status Code — it returns
|
|
54
|
+
* the error INSIDE an OK response envelope, which is the contract the
|
|
55
|
+
* shipped `NanoSDK`/`MessageDecode.responseDecode` consumer already
|
|
56
|
+
* depends on. So the non-vacuous, truthful assertion here is on the
|
|
57
|
+
* envelope shape, not on a Connect `Code`.
|
|
58
|
+
*/
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gRPC trigger end-to-end integration test (issue #600).
|
|
3
|
+
*
|
|
4
|
+
* Stands up the REAL gRPC trigger on a live HTTP/2 port — the exact boot
|
|
5
|
+
* path `GrpcServer.start()` uses: a fastify `{ http2: true }` server with
|
|
6
|
+
* `@connectrpc/connect-fastify`'s `fastifyConnectPlugin`, wired via
|
|
7
|
+
* `trigger.processRequest(router, trigger)`. It is then driven by the
|
|
8
|
+
* repo's OWN gRPC client (`GrpcClient`, backed by
|
|
9
|
+
* `@connectrpc/connect-node`'s `createGrpcTransport`) over the wire.
|
|
10
|
+
* Nothing about the transport, the Connect codec, the trigger's decode /
|
|
11
|
+
* execute / middleware / error-encode path, or the runner is mocked — only
|
|
12
|
+
* OTel is stubbed to avoid needing an exporter.
|
|
13
|
+
*
|
|
14
|
+
* Gating: this test boots a real network listener, so it is gated on
|
|
15
|
+
* `RUN_GRPC_IT` (unset → the whole suite is skipped). The port + node /
|
|
16
|
+
* workflow names carry a per-run random suffix so a concurrent target on
|
|
17
|
+
* the same box never collides.
|
|
18
|
+
*
|
|
19
|
+
* The ONLY execution path the trigger exposes on the wire is the
|
|
20
|
+
* "remote node" path (`GRpcTrigger.executeWorkflow`): the decoded message
|
|
21
|
+
* must carry a `workflow` object, and the trigger synthesizes an ephemeral
|
|
22
|
+
* single-step workflow around the node named by `request.Name`, resolving
|
|
23
|
+
* that node from its in-process `nodeMap.nodes`. This is exactly what the
|
|
24
|
+
* shipped `NanoSDK.nodejs()` / `.python3()` helpers do. The fixture node is
|
|
25
|
+
* injected into the trigger's `nodeMap` before boot so we drive a fully
|
|
26
|
+
* in-process module node (no external HTTP dependency) and can force a
|
|
27
|
+
* throw for the error-mapping assertion.
|
|
28
|
+
*
|
|
29
|
+
* A module-level `EXECUTIONS` array records each node-body invocation so
|
|
30
|
+
* assertions prove the workflow ACTUALLY ran on the far side of the wire —
|
|
31
|
+
* not just that a well-formed response came back.
|
|
32
|
+
*
|
|
33
|
+
* Coverage vs. the four #600 behaviours:
|
|
34
|
+
* 1. UNARY — a real gRPC call runs the workflow and returns the real,
|
|
35
|
+
* decoded node output. (observable EXECUTIONS effect + decoded body)
|
|
36
|
+
* 2. ORDERED multi-message — the proto/service is UNARY-only
|
|
37
|
+
* (`methodKind: "unary"`; there is no server-streaming RPC on the
|
|
38
|
+
* wire), so true gRPC server-streaming is not implementable against
|
|
39
|
+
* this adapter. We instead prove ordered, multi-message delivery over
|
|
40
|
+
* the real wire via N sequential unary calls, asserting the far side
|
|
41
|
+
* received them in order. (See the NOTE on the test itself — we do NOT
|
|
42
|
+
* fake a streaming RPC.)
|
|
43
|
+
* 3. MIDDLEWARE — a trigger-level middleware chain (`trigger.grpc
|
|
44
|
+
* .middleware`) runs before the body; the "allow" middleware mutates
|
|
45
|
+
* ctx.state (observable in the node output) and the "deny" middleware
|
|
46
|
+
* throws a 401 GlobalError that short-circuits the body (the node
|
|
47
|
+
* never runs) and surfaces as the mapped error envelope.
|
|
48
|
+
* 4. ERROR MAPPING — a thrown workflow error is caught and mapped to the
|
|
49
|
+
* adapter's error envelope: the message travels back in the response
|
|
50
|
+
* `Message` field with `Type: TEXT` (NOT the success `JSON` type), the
|
|
51
|
+
* RPC does not crash the server, and a follow-up healthy call still
|
|
52
|
+
* succeeds. NOTE: this adapter deliberately does NOT translate the
|
|
53
|
+
* workflow error into a non-OK gRPC/Connect status Code — it returns
|
|
54
|
+
* the error INSIDE an OK response envelope, which is the contract the
|
|
55
|
+
* shipped `NanoSDK`/`MessageDecode.responseDecode` consumer already
|
|
56
|
+
* depends on. So the non-vacuous, truthful assertion here is on the
|
|
57
|
+
* envelope shape, not on a Connect `Code`.
|
|
58
|
+
*/
|
|
59
|
+
import { workflow } from "@blokjs/helper";
|
|
60
|
+
import { NodeMap, WorkflowRegistry, defineNode } from "@blokjs/runner";
|
|
61
|
+
import { GlobalError } from "@blokjs/shared";
|
|
62
|
+
import { fastifyConnectPlugin } from "@connectrpc/connect-fastify";
|
|
63
|
+
import fastify from "fastify";
|
|
64
|
+
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
65
|
+
import { z } from "zod";
|
|
66
|
+
vi.mock("@opentelemetry/api", () => {
|
|
67
|
+
const noop = { setAttribute: () => { }, setStatus: () => { }, recordException: () => { }, end: () => { } };
|
|
68
|
+
return {
|
|
69
|
+
trace: {
|
|
70
|
+
getTracer: () => ({
|
|
71
|
+
startActiveSpan: (...a) => {
|
|
72
|
+
const fn = a.find((x) => typeof x === "function");
|
|
73
|
+
return fn?.(noop);
|
|
74
|
+
},
|
|
75
|
+
startSpan: () => noop,
|
|
76
|
+
}),
|
|
77
|
+
getActiveSpan: () => undefined,
|
|
78
|
+
setSpan: (c) => c,
|
|
79
|
+
},
|
|
80
|
+
metrics: {
|
|
81
|
+
getMeter: () => ({
|
|
82
|
+
createCounter: () => ({ add: () => { } }),
|
|
83
|
+
createHistogram: () => ({ record: () => { } }),
|
|
84
|
+
createGauge: () => ({ record: () => { } }),
|
|
85
|
+
createObservableGauge: () => ({ addCallback: () => { } }),
|
|
86
|
+
}),
|
|
87
|
+
},
|
|
88
|
+
context: { active: () => ({}), with: (_c, fn) => fn() },
|
|
89
|
+
propagation: { extract: (c) => c, inject: () => { } },
|
|
90
|
+
SpanKind: { INTERNAL: 0, SERVER: 1, CLIENT: 2, PRODUCER: 3, CONSUMER: 4 },
|
|
91
|
+
SpanStatusCode: { OK: 0, ERROR: 1 },
|
|
92
|
+
isSpanContextValid: () => false,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
import GRpcTrigger from "./GRpcTrigger";
|
|
96
|
+
import GrpcClient, { HttpVersionEnum, TransportEnum } from "./GrpcClient";
|
|
97
|
+
import MessageDecode from "./MessageDecode";
|
|
98
|
+
const RUN = process.env.RUN_GRPC_IT ? describe : describe.skip;
|
|
99
|
+
// Per-run namespace so a concurrent target on the same box never collides
|
|
100
|
+
// on the node name / workflow name registered in shared singletons.
|
|
101
|
+
const SUFFIX = Math.random().toString(36).slice(2);
|
|
102
|
+
const NODE_NAME = `echo-node-${SUFFIX}`;
|
|
103
|
+
const THROW_NODE = `boom-node-${SUFFIX}`;
|
|
104
|
+
const ALLOW_MW = `allow-mw-${SUFFIX}`;
|
|
105
|
+
const DENY_MW = `deny-mw-${SUFFIX}`;
|
|
106
|
+
const ALLOW_MW_NODE = `allow-mw-node-${SUFFIX}`;
|
|
107
|
+
const DENY_MW_NODE = `deny-mw-node-${SUFFIX}`;
|
|
108
|
+
const EXECUTIONS = [];
|
|
109
|
+
// --- fixture nodes (all pure in-process — no external services) ---
|
|
110
|
+
const echoNode = defineNode({
|
|
111
|
+
name: NODE_NAME,
|
|
112
|
+
description: "test fixture — echo input + record the run",
|
|
113
|
+
input: z.object({ seq: z.number().optional(), payload: z.string().optional() }).passthrough(),
|
|
114
|
+
output: z.object({ echoed: z.string(), seq: z.number().optional(), viaMiddleware: z.string().optional() }),
|
|
115
|
+
async execute(ctx, input) {
|
|
116
|
+
EXECUTIONS.push({ node: NODE_NAME, seq: input.seq });
|
|
117
|
+
// The "allow" middleware writes ctx.state.mwStamp; surface it in the
|
|
118
|
+
// output so the test can observe the middleware effect over the wire.
|
|
119
|
+
const viaMiddleware = ctx.state?.mwStamp;
|
|
120
|
+
return { echoed: input.payload ?? "ok", seq: input.seq, viaMiddleware };
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
const throwNode = defineNode({
|
|
124
|
+
name: THROW_NODE,
|
|
125
|
+
description: "test fixture — always throws a coded GlobalError",
|
|
126
|
+
input: z.object({}).passthrough(),
|
|
127
|
+
output: z.object({ never: z.string() }),
|
|
128
|
+
async execute() {
|
|
129
|
+
EXECUTIONS.push({ node: THROW_NODE, seq: undefined });
|
|
130
|
+
const err = new GlobalError("kaboom-from-node");
|
|
131
|
+
err.setCode(422);
|
|
132
|
+
throw err;
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
// Middleware body nodes. `applyMiddlewareChain` runs these on the same ctx
|
|
136
|
+
// BEFORE the main workflow body, so state they write is visible downstream.
|
|
137
|
+
const allowMwNode = defineNode({
|
|
138
|
+
name: ALLOW_MW_NODE,
|
|
139
|
+
description: "test fixture — middleware that stamps ctx.state and passes",
|
|
140
|
+
input: z.object({}).passthrough(),
|
|
141
|
+
output: z.object({ ok: z.boolean() }),
|
|
142
|
+
async execute(ctx) {
|
|
143
|
+
ctx.state.mwStamp = "stamped-by-allow-mw";
|
|
144
|
+
return { ok: true };
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const denyMwNode = defineNode({
|
|
148
|
+
name: DENY_MW_NODE,
|
|
149
|
+
description: "test fixture — auth-gate middleware that rejects",
|
|
150
|
+
input: z.object({}).passthrough(),
|
|
151
|
+
output: z.object({ never: z.string() }),
|
|
152
|
+
async execute() {
|
|
153
|
+
const err = new GlobalError("unauthorized-by-mw");
|
|
154
|
+
err.setCode(401);
|
|
155
|
+
throw err;
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
/** Build the middleware workflow object the WorkflowRegistry expects. */
|
|
159
|
+
function middlewareWorkflow(name, nodeName) {
|
|
160
|
+
return {
|
|
161
|
+
name,
|
|
162
|
+
version: "1.0.0",
|
|
163
|
+
description: `${name} middleware`,
|
|
164
|
+
middleware: true,
|
|
165
|
+
trigger: { grpc: {} },
|
|
166
|
+
steps: [{ id: "mw", use: nodeName, type: "module", inputs: {} }],
|
|
167
|
+
nodes: { mw: { inputs: {} } },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Encode a message the way the wire expects it: JSON `{ request, workflow }`
|
|
172
|
+
* → BASE64. `workflow` carries the model the remote-node path reads
|
|
173
|
+
* (`steps[0].type`, `trigger`, `nodes.node.inputs`).
|
|
174
|
+
*/
|
|
175
|
+
function encodeRequest(nodeName, inputs, opts) {
|
|
176
|
+
const model = {
|
|
177
|
+
name: "Remote Node",
|
|
178
|
+
version: "1.0.0",
|
|
179
|
+
description: "remote node exec",
|
|
180
|
+
trigger: { grpc: opts?.middleware ? { middleware: opts.middleware } : {} },
|
|
181
|
+
steps: [{ id: "node", use: nodeName, type: "module" }],
|
|
182
|
+
nodes: { node: { inputs } },
|
|
183
|
+
};
|
|
184
|
+
const message = Buffer.from(JSON.stringify({ request: {}, workflow: model })).toString("base64");
|
|
185
|
+
return {
|
|
186
|
+
$typeName: "blok.workflow.v1.WorkflowRequest",
|
|
187
|
+
Name: nodeName,
|
|
188
|
+
Message: message,
|
|
189
|
+
Encoding: "BASE64",
|
|
190
|
+
Type: "JSON",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
RUN("GRpcTrigger — #600 live integration (real gRPC wire)", () => {
|
|
194
|
+
// http2 instance — its RawServer/Request/Reply differ from the http1 default,
|
|
195
|
+
// so the generics must be the node:http2 types (matches `fastify({ http2: true })`).
|
|
196
|
+
let server;
|
|
197
|
+
let client;
|
|
198
|
+
const decoder = new MessageDecode();
|
|
199
|
+
beforeAll(async () => {
|
|
200
|
+
process.env.BLOK_TRACE_ENABLED = "false";
|
|
201
|
+
WorkflowRegistry.resetInstance();
|
|
202
|
+
const trigger = new GRpcTrigger();
|
|
203
|
+
// Inject fixture nodes + the middleware workflows into the trigger's
|
|
204
|
+
// nodeMap BEFORE boot. `processRequest` seeds the WorkflowRegistry
|
|
205
|
+
// from `nodeMap.workflows` (via `registerWorkflowsFromNodeMap`), so
|
|
206
|
+
// the middleware chain can resolve `allow-mw` / `deny-mw` by name.
|
|
207
|
+
const nm = trigger.nodeMap;
|
|
208
|
+
nm.nodes = nm.nodes ?? new NodeMap();
|
|
209
|
+
nm.nodes.addNode(NODE_NAME, echoNode);
|
|
210
|
+
nm.nodes.addNode(THROW_NODE, throwNode);
|
|
211
|
+
nm.nodes.addNode(ALLOW_MW_NODE, allowMwNode);
|
|
212
|
+
nm.nodes.addNode(DENY_MW_NODE, denyMwNode);
|
|
213
|
+
nm.workflows = nm.workflows ?? {};
|
|
214
|
+
nm.workflows[ALLOW_MW] = workflow(middlewareWorkflow(ALLOW_MW, ALLOW_MW_NODE));
|
|
215
|
+
nm.workflows[DENY_MW] = workflow(middlewareWorkflow(DENY_MW, DENY_MW_NODE));
|
|
216
|
+
// Boot the REAL trigger the way GrpcServer.start() does.
|
|
217
|
+
server = fastify({ http2: true });
|
|
218
|
+
await server.register(fastifyConnectPlugin, {
|
|
219
|
+
routes: (router) => trigger.processRequest(router, trigger),
|
|
220
|
+
});
|
|
221
|
+
await server.listen({ host: "127.0.0.1", port: 0 });
|
|
222
|
+
const port = server.server.address().port;
|
|
223
|
+
client = new GrpcClient({
|
|
224
|
+
host: "127.0.0.1",
|
|
225
|
+
port,
|
|
226
|
+
protocol: "http",
|
|
227
|
+
httpVersion: HttpVersionEnum.HTTP2,
|
|
228
|
+
transport: TransportEnum.GRPC,
|
|
229
|
+
});
|
|
230
|
+
}, 20_000);
|
|
231
|
+
afterAll(async () => {
|
|
232
|
+
if (server)
|
|
233
|
+
await server.close();
|
|
234
|
+
WorkflowRegistry.resetInstance();
|
|
235
|
+
process.env.BLOK_TRACE_ENABLED = undefined;
|
|
236
|
+
});
|
|
237
|
+
it("1) UNARY — a real gRPC call runs the workflow and returns the decoded node output", async () => {
|
|
238
|
+
EXECUTIONS.length = 0;
|
|
239
|
+
const res = await client.call(encodeRequest(NODE_NAME, { payload: "hello-grpc", seq: 1 }));
|
|
240
|
+
// Real wire response — decode it the way NanoSDK does.
|
|
241
|
+
const body = decoder.responseDecode(res);
|
|
242
|
+
expect(body.echoed).toBe("hello-grpc");
|
|
243
|
+
expect(body.seq).toBe(1);
|
|
244
|
+
// Observable proof the node body executed exactly once on the far side.
|
|
245
|
+
expect(EXECUTIONS).toEqual([{ node: NODE_NAME, seq: 1 }]);
|
|
246
|
+
}, 15_000);
|
|
247
|
+
it("2) ORDERED multi-message — N sequential unary calls arrive in order (unary-only proto; no server-streaming RPC exists)", async () => {
|
|
248
|
+
// NOTE: the WorkflowService is `methodKind: "unary"` only — there is
|
|
249
|
+
// no server-streaming method on the wire — so we prove ordered
|
|
250
|
+
// multi-message delivery via sequential unary calls rather than
|
|
251
|
+
// faking a streaming RPC that the adapter does not expose.
|
|
252
|
+
EXECUTIONS.length = 0;
|
|
253
|
+
const seqs = [10, 11, 12, 13];
|
|
254
|
+
const bodies = [];
|
|
255
|
+
for (const seq of seqs) {
|
|
256
|
+
const res = await client.call(encodeRequest(NODE_NAME, { payload: `m-${seq}`, seq }));
|
|
257
|
+
bodies.push(decoder.responseDecode(res));
|
|
258
|
+
}
|
|
259
|
+
// Responses came back in request order over the real wire.
|
|
260
|
+
expect(bodies.map((b) => b.seq)).toEqual(seqs);
|
|
261
|
+
// And the far side executed them in the same order.
|
|
262
|
+
expect(EXECUTIONS.map((e) => e.seq)).toEqual(seqs);
|
|
263
|
+
}, 20_000);
|
|
264
|
+
it("3a) MIDDLEWARE (allow) — trigger.grpc.middleware runs before the body and its ctx.state mutation is observable", async () => {
|
|
265
|
+
EXECUTIONS.length = 0;
|
|
266
|
+
const res = await client.call(encodeRequest(NODE_NAME, { payload: "mw", seq: 99 }, { middleware: [ALLOW_MW] }));
|
|
267
|
+
const body = decoder.responseDecode(res);
|
|
268
|
+
// The node saw ctx.state.mwStamp — proof the middleware actually ran
|
|
269
|
+
// on the same ctx, before the body.
|
|
270
|
+
expect(body.viaMiddleware).toBe("stamped-by-allow-mw");
|
|
271
|
+
expect(EXECUTIONS).toEqual([{ node: NODE_NAME, seq: 99 }]);
|
|
272
|
+
}, 15_000);
|
|
273
|
+
it("3b) MIDDLEWARE (deny) — an auth-gate middleware throw short-circuits the body (node never runs)", async () => {
|
|
274
|
+
EXECUTIONS.length = 0;
|
|
275
|
+
const res = await client.call(encodeRequest(NODE_NAME, { payload: "should-not-run", seq: 7 }, { middleware: [DENY_MW] }));
|
|
276
|
+
// The deny middleware threw a 401 GlobalError → mapped to the error
|
|
277
|
+
// envelope (Type: TEXT), and the main workflow body NEVER executed.
|
|
278
|
+
expect(res.Type).toBe("TEXT");
|
|
279
|
+
const msg = Buffer.from(res.Message, "base64").toString("utf-8");
|
|
280
|
+
expect(msg).toContain("unauthorized-by-mw");
|
|
281
|
+
expect(EXECUTIONS).toEqual([]);
|
|
282
|
+
}, 15_000);
|
|
283
|
+
it("4) ERROR MAPPING — a thrown workflow error maps to the error envelope, the server does not crash, and the next call succeeds", async () => {
|
|
284
|
+
EXECUTIONS.length = 0;
|
|
285
|
+
const errRes = await client.call(encodeRequest(THROW_NODE, {}));
|
|
286
|
+
// The adapter caught the throw and returned an OK RPC carrying the
|
|
287
|
+
// error INSIDE the envelope: TEXT type + the raw error message. (This
|
|
288
|
+
// adapter's contract is error-in-envelope, NOT a non-OK Connect Code —
|
|
289
|
+
// see the file header; asserting the envelope is the truthful check.)
|
|
290
|
+
expect(errRes.Type).toBe("TEXT");
|
|
291
|
+
const errMsg = Buffer.from(errRes.Message, "base64").toString("utf-8");
|
|
292
|
+
expect(errMsg).toContain("kaboom-from-node");
|
|
293
|
+
// The node body DID enter (it throws), but produced no success payload.
|
|
294
|
+
expect(EXECUTIONS).toEqual([{ node: THROW_NODE, seq: undefined }]);
|
|
295
|
+
// The error did not poison the server — a fresh healthy call still
|
|
296
|
+
// works over the same live connection, returning a JSON success body.
|
|
297
|
+
EXECUTIONS.length = 0;
|
|
298
|
+
const okRes = await client.call(encodeRequest(NODE_NAME, { payload: "after-error", seq: 2 }));
|
|
299
|
+
expect(okRes.Type).toBe("JSON");
|
|
300
|
+
const okBody = decoder.responseDecode(okRes);
|
|
301
|
+
expect(okBody.echoed).toBe("after-error");
|
|
302
|
+
expect(EXECUTIONS).toEqual([{ node: NODE_NAME, seq: 2 }]);
|
|
303
|
+
}, 15_000);
|
|
304
|
+
});
|
|
305
|
+
//# sourceMappingURL=GRpcTrigger.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GRpcTrigger.integration.test.js","sourceRoot":"","sources":["../src/GRpcTrigger.integration.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blokjs/trigger-grpc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"files": ["dist"],
|
|
5
5
|
"description": "",
|
|
6
6
|
"type": "module",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"@connectrpc/connect": "^2.1.1",
|
|
37
37
|
"@connectrpc/connect-fastify": "^2.1.1",
|
|
38
38
|
"@connectrpc/connect-node": "^2.1.1",
|
|
39
|
-
"@blokjs/api-call": "^1.
|
|
40
|
-
"@blokjs/helper": "^1.
|
|
41
|
-
"@blokjs/if-else": "^1.
|
|
42
|
-
"@blokjs/runner": "^1.
|
|
43
|
-
"@blokjs/shared": "^1.
|
|
39
|
+
"@blokjs/api-call": "^1.2.0",
|
|
40
|
+
"@blokjs/helper": "^1.2.0",
|
|
41
|
+
"@blokjs/if-else": "^1.2.0",
|
|
42
|
+
"@blokjs/runner": "^1.2.0",
|
|
43
|
+
"@blokjs/shared": "^1.2.0",
|
|
44
44
|
"@opentelemetry/api": "^1.9.0",
|
|
45
45
|
"@opentelemetry/exporter-prometheus": "^0.57.2",
|
|
46
46
|
"@opentelemetry/resources": "^1.30.1",
|