@glubean/grpc 0.1.4 → 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/README.md +248 -15
- package/dist/contract/adapter.d.ts +44 -0
- package/dist/contract/adapter.d.ts.map +1 -0
- package/dist/contract/adapter.js +482 -0
- package/dist/contract/adapter.js.map +1 -0
- package/dist/contract/factory.d.ts +32 -0
- package/dist/contract/factory.d.ts.map +1 -0
- package/dist/contract/factory.js +92 -0
- package/dist/contract/factory.js.map +1 -0
- package/dist/contract/index.d.ts +17 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +16 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/matchers.d.ts +70 -0
- package/dist/contract/matchers.d.ts.map +1 -0
- package/dist/contract/matchers.js +141 -0
- package/dist/contract/matchers.js.map +1 -0
- package/dist/contract/types.d.ts +227 -0
- package/dist/contract/types.d.ts.map +1 -0
- package/dist/contract/types.js +17 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/index.d.ts +39 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -5
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in gRPC contract adapter for @glubean/grpc 0.2.0.
|
|
3
|
+
*
|
|
4
|
+
* Shipped alongside the transport plugin in @glubean/grpc (single-package
|
|
5
|
+
* model — "contract is a first-class citizen"). Registered via
|
|
6
|
+
* `contract.register("grpc", grpcAdapter)` on import — see ./index.ts.
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities (same interface as HTTP adapter):
|
|
9
|
+
* - execute: run a case's setup → request → expect → verify → teardown
|
|
10
|
+
* - executeCaseInFlow: deep-merge resolvedInputs, run case in flow mode
|
|
11
|
+
* - validateCaseForFlow: reject function-valued request/metadata fields
|
|
12
|
+
* - project: runtime ContractProjection<GrpcPayloadSchemas>
|
|
13
|
+
* - normalize: runtime → JSON-safe ExtractedContractProjection
|
|
14
|
+
* - classifyFailure: gRPC status 0-16 → FailureKind
|
|
15
|
+
* - renderTarget: "Service/Method" → "Service.Method" (display-only)
|
|
16
|
+
* - toMarkdown: case list
|
|
17
|
+
* - describePayload: high-level summary for index views
|
|
18
|
+
*
|
|
19
|
+
* Phase 1 scope: unary RPCs only. Streaming deferred to Phase 2.
|
|
20
|
+
*/
|
|
21
|
+
import { genericMarkdownPart } from "@glubean/sdk";
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Helpers
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Split "Service/Method" wire target into parsed parts.
|
|
27
|
+
* Returns `undefined` for malformed targets rather than throwing, so
|
|
28
|
+
* normalize + projection can tolerate hand-authored data in scanner output.
|
|
29
|
+
*/
|
|
30
|
+
export function parseTarget(target) {
|
|
31
|
+
const slashIdx = target.indexOf("/");
|
|
32
|
+
if (slashIdx <= 0 || slashIdx === target.length - 1)
|
|
33
|
+
return undefined;
|
|
34
|
+
return {
|
|
35
|
+
service: target.slice(0, slashIdx),
|
|
36
|
+
method: target.slice(slashIdx + 1),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Convert a SchemaLike to a JSON Schema fragment if possible (best-effort). */
|
|
40
|
+
export function schemaToJsonSchema(schema) {
|
|
41
|
+
if (!schema || typeof schema !== "object")
|
|
42
|
+
return null;
|
|
43
|
+
// Zod v4 / Valibot pattern: `toJSONSchema` instance method.
|
|
44
|
+
const maybe = schema.toJSONSchema;
|
|
45
|
+
if (typeof maybe === "function") {
|
|
46
|
+
try {
|
|
47
|
+
const out = maybe.call(schema);
|
|
48
|
+
if (out && typeof out === "object")
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/** Deep-merge two plain objects (right wins). Handles nested objects; skips arrays. */
|
|
58
|
+
function deepMerge(base, override) {
|
|
59
|
+
if (!base && !override)
|
|
60
|
+
return {};
|
|
61
|
+
if (!base)
|
|
62
|
+
return { ...override };
|
|
63
|
+
if (!override)
|
|
64
|
+
return { ...base };
|
|
65
|
+
const out = { ...base };
|
|
66
|
+
for (const [k, v] of Object.entries(override)) {
|
|
67
|
+
const baseVal = base[k];
|
|
68
|
+
if (v != null &&
|
|
69
|
+
typeof v === "object" &&
|
|
70
|
+
!Array.isArray(v) &&
|
|
71
|
+
baseVal != null &&
|
|
72
|
+
typeof baseVal === "object" &&
|
|
73
|
+
!Array.isArray(baseVal)) {
|
|
74
|
+
out[k] = deepMerge(baseVal, v);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
out[k] = v;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
/** Resolve the effective gRPC client with case > spec > instance fallback. */
|
|
83
|
+
function resolveClient(caseSpec, spec) {
|
|
84
|
+
const client = caseSpec.client ?? spec.client;
|
|
85
|
+
if (!client) {
|
|
86
|
+
throw new Error(`No gRPC client provided for case. Set "client" on the case or contract spec (e.g. via contract.grpc.with("name", { client: grpcPlugin })).`);
|
|
87
|
+
}
|
|
88
|
+
return client;
|
|
89
|
+
}
|
|
90
|
+
/** Merge metadata: instance defaults < contract defaults < case. */
|
|
91
|
+
function resolveMetadata(spec, caseSpec, state) {
|
|
92
|
+
const caseMd = typeof caseSpec.metadata === "function"
|
|
93
|
+
? caseSpec.metadata(state)
|
|
94
|
+
: caseSpec.metadata;
|
|
95
|
+
const specMd = spec.defaultMetadata;
|
|
96
|
+
if (!caseMd && !specMd)
|
|
97
|
+
return undefined;
|
|
98
|
+
return { ...(specMd ?? {}), ...(caseMd ?? {}) };
|
|
99
|
+
}
|
|
100
|
+
/** Resolve request with deep-merge: contract.defaultRequest < case.request. */
|
|
101
|
+
function resolveRequest(spec, caseSpec, state) {
|
|
102
|
+
const caseReq = typeof caseSpec.request === "function"
|
|
103
|
+
? caseSpec.request(state)
|
|
104
|
+
: caseSpec.request;
|
|
105
|
+
const merged = deepMerge(spec.defaultRequest, caseReq);
|
|
106
|
+
return merged;
|
|
107
|
+
}
|
|
108
|
+
/** Resolve deadline: case > spec > undefined. */
|
|
109
|
+
function resolveDeadline(spec, caseSpec) {
|
|
110
|
+
return caseSpec.deadlineMs ?? spec.deadlineMs;
|
|
111
|
+
}
|
|
112
|
+
// =============================================================================
|
|
113
|
+
// executeCase — standard (non-flow) case execution
|
|
114
|
+
// =============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Execute one gRPC contract case: setup → call → expect → verify → teardown.
|
|
117
|
+
*
|
|
118
|
+
* Teardown runs in finally even if setup returned undefined (HTTP
|
|
119
|
+
* convention — so teardown can still do cleanup that doesn't depend on
|
|
120
|
+
* setup state). See contract-flow.md Rule 1.
|
|
121
|
+
*/
|
|
122
|
+
async function executeCase(ctx, caseSpec, spec) {
|
|
123
|
+
const parsedTarget = parseTarget(spec.target);
|
|
124
|
+
if (!parsedTarget) {
|
|
125
|
+
throw new Error(`gRPC contract: invalid target "${spec.target}". Expected "ServiceName/MethodName".`);
|
|
126
|
+
}
|
|
127
|
+
const state = caseSpec.setup
|
|
128
|
+
? await caseSpec.setup(ctx)
|
|
129
|
+
: undefined;
|
|
130
|
+
try {
|
|
131
|
+
const client = resolveClient(caseSpec, spec);
|
|
132
|
+
const request = resolveRequest(spec, caseSpec, state);
|
|
133
|
+
const metadata = resolveMetadata(spec, caseSpec, state);
|
|
134
|
+
const deadlineMs = resolveDeadline(spec, caseSpec);
|
|
135
|
+
const callResult = await client.call(parsedTarget.method, request, {
|
|
136
|
+
...(metadata ? { metadata } : {}),
|
|
137
|
+
...(deadlineMs !== undefined ? { deadlineMs } : {}),
|
|
138
|
+
});
|
|
139
|
+
const result = {
|
|
140
|
+
message: callResult.message,
|
|
141
|
+
status: callResult.status,
|
|
142
|
+
responseMetadata: callResult.responseMetadata,
|
|
143
|
+
duration: callResult.duration,
|
|
144
|
+
};
|
|
145
|
+
// Assertions
|
|
146
|
+
const expect = caseSpec.expect ?? {};
|
|
147
|
+
const expectedStatus = expect.statusCode ?? 0;
|
|
148
|
+
if (result.status.code !== expectedStatus) {
|
|
149
|
+
ctx.assert(false, `Expected gRPC status code ${expectedStatus} but got ${result.status.code} (${result.status.details})`, { actual: result.status.code, expected: expectedStatus });
|
|
150
|
+
}
|
|
151
|
+
if (expectedStatus === 0) {
|
|
152
|
+
if (expect.schema) {
|
|
153
|
+
ctx.validate(result.message, expect.schema, `response message`);
|
|
154
|
+
}
|
|
155
|
+
if (expect.message) {
|
|
156
|
+
ctx.expect(result.message).toMatchObject(expect.message);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (expect.metadataMatch) {
|
|
160
|
+
ctx.expect(result.responseMetadata).toMatchObject(expect.metadataMatch);
|
|
161
|
+
}
|
|
162
|
+
if (expect.metadata) {
|
|
163
|
+
ctx.validate(result.responseMetadata, expect.metadata, `response metadata`);
|
|
164
|
+
}
|
|
165
|
+
if (caseSpec.verify) {
|
|
166
|
+
await caseSpec.verify(ctx, result);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
if (caseSpec.teardown) {
|
|
171
|
+
await caseSpec.teardown(ctx, state);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// =============================================================================
|
|
176
|
+
// project — runtime ContractProjection
|
|
177
|
+
// =============================================================================
|
|
178
|
+
function projectGrpc(spec) {
|
|
179
|
+
const parsed = parseTarget(spec.target);
|
|
180
|
+
const meta = {
|
|
181
|
+
target: spec.target,
|
|
182
|
+
service: parsed?.service ?? "",
|
|
183
|
+
method: parsed?.method ?? "",
|
|
184
|
+
defaultMetadata: spec.defaultMetadata,
|
|
185
|
+
deadlineMs: spec.deadlineMs,
|
|
186
|
+
};
|
|
187
|
+
const cases = Object.entries(spec.cases).map(([key, c]) => {
|
|
188
|
+
const casted = c;
|
|
189
|
+
const lifecycle = casted.deprecated
|
|
190
|
+
? "deprecated"
|
|
191
|
+
: casted.deferred
|
|
192
|
+
? "deferred"
|
|
193
|
+
: "active";
|
|
194
|
+
const schemas = {
|
|
195
|
+
request: spec.requestSchema,
|
|
196
|
+
response: casted.expect?.schema,
|
|
197
|
+
metadata: casted.expect?.metadata,
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
key,
|
|
201
|
+
description: casted.description,
|
|
202
|
+
lifecycle,
|
|
203
|
+
severity: casted.severity ?? "warning",
|
|
204
|
+
deferredReason: casted.deferred,
|
|
205
|
+
deprecatedReason: casted.deprecated,
|
|
206
|
+
schemas,
|
|
207
|
+
tags: casted.tags,
|
|
208
|
+
extensions: casted.extensions,
|
|
209
|
+
requires: casted.requires,
|
|
210
|
+
defaultRun: casted.defaultRun,
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
// Read factory-provided metadata from the internal `_factory` channel
|
|
214
|
+
// populated by `mergeGrpcDefaults`.
|
|
215
|
+
const factory = spec._factory;
|
|
216
|
+
return {
|
|
217
|
+
protocol: "grpc",
|
|
218
|
+
target: spec.target,
|
|
219
|
+
description: spec.description,
|
|
220
|
+
feature: spec.feature,
|
|
221
|
+
instanceName: factory?.instanceName,
|
|
222
|
+
tags: spec.tags,
|
|
223
|
+
extensions: spec.extensions,
|
|
224
|
+
deprecated: spec.deprecated,
|
|
225
|
+
cases,
|
|
226
|
+
schemas: {},
|
|
227
|
+
meta,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// normalize — runtime → JSON-safe Extracted
|
|
232
|
+
// =============================================================================
|
|
233
|
+
function normalizeGrpc(projection) {
|
|
234
|
+
const safeCases = projection.cases.map((c) => {
|
|
235
|
+
const s = c.schemas ?? {};
|
|
236
|
+
const safe = {
|
|
237
|
+
request: schemaToJsonSchema(s.request) ?? undefined,
|
|
238
|
+
response: schemaToJsonSchema(s.response) ?? undefined,
|
|
239
|
+
metadata: schemaToJsonSchema(s.metadata) ?? undefined,
|
|
240
|
+
};
|
|
241
|
+
return { ...c, schemas: safe };
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
id: projection.id,
|
|
245
|
+
protocol: projection.protocol,
|
|
246
|
+
target: projection.target,
|
|
247
|
+
description: projection.description,
|
|
248
|
+
feature: projection.feature,
|
|
249
|
+
instanceName: projection.instanceName,
|
|
250
|
+
tags: projection.tags,
|
|
251
|
+
extensions: projection.extensions,
|
|
252
|
+
deprecated: projection.deprecated,
|
|
253
|
+
cases: safeCases,
|
|
254
|
+
schemas: {},
|
|
255
|
+
meta: projection.meta,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
// =============================================================================
|
|
259
|
+
// executeCaseInFlow — flow-mode execution
|
|
260
|
+
// =============================================================================
|
|
261
|
+
/**
|
|
262
|
+
* Flow-mode case execution. Called by core's FlowBuilder.step() dispatch.
|
|
263
|
+
*
|
|
264
|
+
* Core has already:
|
|
265
|
+
* 1. Computed `resolvedInputs` via `step.bindings.in(state)` (may be partial)
|
|
266
|
+
* 2. Prepared current flow state
|
|
267
|
+
* 3. Passed the live ProtocolContract (access merged scoped-factory state
|
|
268
|
+
* via `contract._spec`)
|
|
269
|
+
*
|
|
270
|
+
* Adapter responsibilities:
|
|
271
|
+
* 1. Merge resolvedInputs (shape: { request?, metadata?, deadlineMs? })
|
|
272
|
+
* over case static spec
|
|
273
|
+
* 2. Run case setup / call / expect / verify (Rule 1: case teardown runs in
|
|
274
|
+
* step-local finally — contract-flow §7.3)
|
|
275
|
+
* 3. Return GrpcFlowCaseOutput (= GrpcCaseResult<Res>) for `step.out` lens
|
|
276
|
+
*/
|
|
277
|
+
async function executeCaseInFlowGrpc(input) {
|
|
278
|
+
const { ctx, contract: c, caseKey, resolvedInputs } = input;
|
|
279
|
+
const spec = c._spec;
|
|
280
|
+
const caseSpec = spec.cases[caseKey];
|
|
281
|
+
if (!caseSpec) {
|
|
282
|
+
throw new Error(`gRPC contract: unknown case key "${caseKey}".`);
|
|
283
|
+
}
|
|
284
|
+
const parsed = parseTarget(spec.target);
|
|
285
|
+
if (!parsed) {
|
|
286
|
+
throw new Error(`gRPC contract: invalid target "${spec.target}". Expected "ServiceName/MethodName".`);
|
|
287
|
+
}
|
|
288
|
+
// In flow mode, setup is allowed but typically unused; state type is void.
|
|
289
|
+
const state = caseSpec.setup ? await caseSpec.setup(ctx) : undefined;
|
|
290
|
+
try {
|
|
291
|
+
const client = resolveClient(caseSpec, spec);
|
|
292
|
+
// Resolve static inputs from case (reject function fields — CG-3 validate
|
|
293
|
+
// handles that; we guard here too for direct callers).
|
|
294
|
+
const staticReq = typeof caseSpec.request === "function"
|
|
295
|
+
? undefined
|
|
296
|
+
: caseSpec.request;
|
|
297
|
+
const staticMd = typeof caseSpec.metadata === "function"
|
|
298
|
+
? undefined
|
|
299
|
+
: caseSpec.metadata;
|
|
300
|
+
const lensInput = (resolvedInputs ?? {});
|
|
301
|
+
// Deep-merge lens request over case static + contract default
|
|
302
|
+
const mergedRequest = deepMerge(deepMerge(spec.defaultRequest, staticReq), lensInput.request);
|
|
303
|
+
const mergedMetadata = {
|
|
304
|
+
...(spec.defaultMetadata ?? {}),
|
|
305
|
+
...(staticMd ?? {}),
|
|
306
|
+
...(lensInput.metadata ?? {}),
|
|
307
|
+
};
|
|
308
|
+
const deadlineMs = lensInput.deadlineMs ?? caseSpec.deadlineMs ?? spec.deadlineMs;
|
|
309
|
+
const callResult = await client.call(parsed.method, mergedRequest, {
|
|
310
|
+
...(Object.keys(mergedMetadata).length > 0 ? { metadata: mergedMetadata } : {}),
|
|
311
|
+
...(deadlineMs !== undefined ? { deadlineMs } : {}),
|
|
312
|
+
});
|
|
313
|
+
const result = {
|
|
314
|
+
message: callResult.message,
|
|
315
|
+
status: callResult.status,
|
|
316
|
+
responseMetadata: callResult.responseMetadata,
|
|
317
|
+
duration: callResult.duration,
|
|
318
|
+
};
|
|
319
|
+
// Assertions (same as executeCase, except allow tolerant behavior
|
|
320
|
+
// under the caller's flow orchestration)
|
|
321
|
+
const expect = caseSpec.expect ?? {};
|
|
322
|
+
const expectedStatus = expect.statusCode ?? 0;
|
|
323
|
+
if (result.status.code !== expectedStatus) {
|
|
324
|
+
ctx.assert(false, `Expected gRPC status code ${expectedStatus} but got ${result.status.code} (${result.status.details})`, { actual: result.status.code, expected: expectedStatus });
|
|
325
|
+
}
|
|
326
|
+
if (expectedStatus === 0) {
|
|
327
|
+
if (expect.schema) {
|
|
328
|
+
ctx.validate(result.message, expect.schema, `response message`);
|
|
329
|
+
}
|
|
330
|
+
if (expect.message) {
|
|
331
|
+
ctx.expect(result.message).toMatchObject(expect.message);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (expect.metadataMatch) {
|
|
335
|
+
ctx.expect(result.responseMetadata).toMatchObject(expect.metadataMatch);
|
|
336
|
+
}
|
|
337
|
+
if (expect.metadata) {
|
|
338
|
+
ctx.validate(result.responseMetadata, expect.metadata, `response metadata`);
|
|
339
|
+
}
|
|
340
|
+
if (caseSpec.verify) {
|
|
341
|
+
await caseSpec.verify(ctx, result);
|
|
342
|
+
}
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
if (caseSpec.teardown) {
|
|
347
|
+
await caseSpec.teardown(ctx, state);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// =============================================================================
|
|
352
|
+
// validateCaseForFlow — reject function-valued fields in flow mode
|
|
353
|
+
// =============================================================================
|
|
354
|
+
/**
|
|
355
|
+
* Reject cases that reference case-local setup state via function-valued
|
|
356
|
+
* `request` or `metadata` fields when used in a flow. Flow mode can't
|
|
357
|
+
* supply per-case setup state (state belongs to flow orchestration).
|
|
358
|
+
*
|
|
359
|
+
* Parallels HTTP's `validateHttpCaseForFlow` — same discipline as HTTP's
|
|
360
|
+
* function-valued body/params/query/headers rejection.
|
|
361
|
+
*/
|
|
362
|
+
export function validateGrpcCaseForFlow(spec, caseKey, contractId) {
|
|
363
|
+
const caseSpec = spec.cases[caseKey];
|
|
364
|
+
if (!caseSpec) {
|
|
365
|
+
throw new Error(`contract.grpc(${JSON.stringify(contractId)}).case(${JSON.stringify(caseKey)}): case not found.`);
|
|
366
|
+
}
|
|
367
|
+
const functionFields = [];
|
|
368
|
+
if (typeof caseSpec.request === "function")
|
|
369
|
+
functionFields.push("request");
|
|
370
|
+
if (typeof caseSpec.metadata === "function")
|
|
371
|
+
functionFields.push("metadata");
|
|
372
|
+
if (functionFields.length > 0) {
|
|
373
|
+
throw new Error(`contract.grpc(${JSON.stringify(contractId)}).case(${JSON.stringify(caseKey)}): ` +
|
|
374
|
+
`cannot use function-valued ${functionFields.join(" / ")} in a flow step — ` +
|
|
375
|
+
`these fields depend on case-local setup state which isn't available in flow mode. ` +
|
|
376
|
+
`Move the value into flow state and use step.in lens instead.`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// =============================================================================
|
|
380
|
+
// classifyFailure — gRPC status 0-16 → FailureKind
|
|
381
|
+
// =============================================================================
|
|
382
|
+
/**
|
|
383
|
+
* Classify failures based on gRPC status codes and thrown errors.
|
|
384
|
+
*
|
|
385
|
+
* Status code reference:
|
|
386
|
+
* 0 = OK
|
|
387
|
+
* 1 = CANCELLED, 4 = DEADLINE_EXCEEDED, 14 = UNAVAILABLE — transient
|
|
388
|
+
* 3 = INVALID_ARGUMENT, 9 = FAILED_PRECONDITION, 11 = OUT_OF_RANGE — client
|
|
389
|
+
* 5 = NOT_FOUND, 6 = ALREADY_EXISTS, 10 = ABORTED — semantic
|
|
390
|
+
* 7 = PERMISSION_DENIED, 16 = UNAUTHENTICATED — auth
|
|
391
|
+
* 12 = UNIMPLEMENTED, 13 = INTERNAL, 15 = DATA_LOSS, 2 = UNKNOWN, 8 = RESOURCE_EXHAUSTED — server
|
|
392
|
+
*/
|
|
393
|
+
function classifyGrpcFailure(input) {
|
|
394
|
+
// Look for explicit gRPC status events emitted during execution
|
|
395
|
+
const statusEvent = input.events.find((e) => e.type === "grpc_status");
|
|
396
|
+
const code = typeof statusEvent?.data?.code === "number"
|
|
397
|
+
? statusEvent.data.code
|
|
398
|
+
: undefined;
|
|
399
|
+
if (code === undefined) {
|
|
400
|
+
// Fall back to error shape (e.g. transport timeout)
|
|
401
|
+
if (input.error instanceof Error) {
|
|
402
|
+
const name = input.error.name;
|
|
403
|
+
if (name === "TimeoutError" || name === "DeadlineExceededError") {
|
|
404
|
+
return { kind: "transient", source: "trace", retryable: true, message: "deadline exceeded" };
|
|
405
|
+
}
|
|
406
|
+
return { kind: "server", source: "trace", message: input.error.message };
|
|
407
|
+
}
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
410
|
+
return statusToClassification(code);
|
|
411
|
+
}
|
|
412
|
+
function statusToClassification(code) {
|
|
413
|
+
switch (code) {
|
|
414
|
+
case 0:
|
|
415
|
+
return undefined; // OK
|
|
416
|
+
case 1: // CANCELLED
|
|
417
|
+
case 4: // DEADLINE_EXCEEDED
|
|
418
|
+
case 14: // UNAVAILABLE
|
|
419
|
+
case 8: // RESOURCE_EXHAUSTED — backpressure / quota; retryable with backoff
|
|
420
|
+
return { kind: "transient", source: "trace", retryable: true, message: `gRPC ${code}` };
|
|
421
|
+
case 3: // INVALID_ARGUMENT
|
|
422
|
+
case 9: // FAILED_PRECONDITION
|
|
423
|
+
case 11: // OUT_OF_RANGE
|
|
424
|
+
return { kind: "client", source: "trace", message: `gRPC ${code}` };
|
|
425
|
+
case 5: // NOT_FOUND
|
|
426
|
+
case 6: // ALREADY_EXISTS
|
|
427
|
+
case 10: // ABORTED — typically optimistic-concurrency; leave as semantic
|
|
428
|
+
// but note product-specific interpretations may want transient
|
|
429
|
+
return { kind: "semantic", source: "trace", message: `gRPC ${code}` };
|
|
430
|
+
case 7: // PERMISSION_DENIED
|
|
431
|
+
case 16: // UNAUTHENTICATED
|
|
432
|
+
return { kind: "auth", source: "trace", message: `gRPC ${code}` };
|
|
433
|
+
case 2: // UNKNOWN
|
|
434
|
+
case 12: // UNIMPLEMENTED
|
|
435
|
+
case 13: // INTERNAL
|
|
436
|
+
case 15: // DATA_LOSS
|
|
437
|
+
default:
|
|
438
|
+
return { kind: "server", source: "trace", message: `gRPC ${code}` };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// =============================================================================
|
|
442
|
+
// renderTarget — "Service/Method" → "Service.Method" for display
|
|
443
|
+
// =============================================================================
|
|
444
|
+
function renderGrpcTarget(target) {
|
|
445
|
+
const parsed = parseTarget(target);
|
|
446
|
+
if (!parsed)
|
|
447
|
+
return target;
|
|
448
|
+
return `${parsed.service}.${parsed.method}`;
|
|
449
|
+
}
|
|
450
|
+
// =============================================================================
|
|
451
|
+
// describePayload — high-level summary for index views
|
|
452
|
+
// =============================================================================
|
|
453
|
+
function describeGrpcPayload(schemas) {
|
|
454
|
+
const hasRequest = schemas.request !== undefined;
|
|
455
|
+
const hasResponse = schemas.response !== undefined;
|
|
456
|
+
return {
|
|
457
|
+
hasRequest,
|
|
458
|
+
hasResponse,
|
|
459
|
+
protocol: "grpc",
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
// =============================================================================
|
|
463
|
+
// Exported adapter
|
|
464
|
+
// =============================================================================
|
|
465
|
+
export const grpcAdapter = {
|
|
466
|
+
async execute(ctx, caseSpec, contractSpec) {
|
|
467
|
+
await executeCase(ctx, caseSpec, contractSpec);
|
|
468
|
+
},
|
|
469
|
+
project: projectGrpc,
|
|
470
|
+
normalize: normalizeGrpc,
|
|
471
|
+
executeCaseInFlow: executeCaseInFlowGrpc,
|
|
472
|
+
validateCaseForFlow: validateGrpcCaseForFlow,
|
|
473
|
+
classifyFailure: classifyGrpcFailure,
|
|
474
|
+
renderTarget: renderGrpcTarget,
|
|
475
|
+
// Markdown uses the SDK's generic structured renderer — gRPC has no
|
|
476
|
+
// protocol-specific augmentations to contribute.
|
|
477
|
+
artifacts: {
|
|
478
|
+
markdown: (projection) => genericMarkdownPart(projection),
|
|
479
|
+
},
|
|
480
|
+
describePayload: describeGrpcPayload,
|
|
481
|
+
};
|
|
482
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/contract/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contract.grpc factory — scoped-defaults pattern.
|
|
3
|
+
*
|
|
4
|
+
* Root `contract.grpc` exposes only `.with(name, defaults)`. Calling
|
|
5
|
+
* `contract.grpc("id", spec)` directly is forbidden — client injection via
|
|
6
|
+
* scoped instances is the canonical authoring pattern (same as HTTP).
|
|
7
|
+
*
|
|
8
|
+
* The factory wraps the generic dispatcher attached to `contract.grpc` by
|
|
9
|
+
* `contract.register("grpc", grpcAdapter)`. Calls flow through:
|
|
10
|
+
* user code
|
|
11
|
+
* → scoped factory(id, spec)
|
|
12
|
+
* → merge instance defaults into spec
|
|
13
|
+
* → dispatcher(id, mergedSpec) [generic register() output]
|
|
14
|
+
* → adapter.project + per-case registerTest + Test[] with _projection/_spec
|
|
15
|
+
*/
|
|
16
|
+
import type { ProtocolContract } from "@glubean/sdk";
|
|
17
|
+
import type { GrpcContractCase, GrpcContractDefaults, GrpcContractFactory, GrpcContractMeta, GrpcContractRoot, GrpcContractSpec, GrpcPayloadSchemas } from "./types.js";
|
|
18
|
+
type InternalDefaults = GrpcContractDefaults & {
|
|
19
|
+
_name?: string;
|
|
20
|
+
};
|
|
21
|
+
type GrpcDispatch = <Req, Res, Cases extends Record<string, GrpcContractCase<Req, Res, any>>>(id: string, spec: GrpcContractSpec<Req, Res, Cases>) => ProtocolContract<GrpcContractSpec, GrpcPayloadSchemas, GrpcContractMeta>;
|
|
22
|
+
/**
|
|
23
|
+
* Build a scoped gRPC factory. `dispatch` is `contract.grpc` attached by the
|
|
24
|
+
* core's register() call — we wrap it to inject instance defaults.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createGrpcFactory(dispatch: GrpcDispatch, defaults?: InternalDefaults): GrpcContractFactory;
|
|
27
|
+
/**
|
|
28
|
+
* Root factory — `.with()` only, direct call throws.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createGrpcRoot(dispatch: GrpcDispatch): GrpcContractRoot;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/contract/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAc,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,KAAK,gBAAgB,GAAG,oBAAoB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,KAAK,YAAY,GAAG,CAClB,GAAG,EACH,GAAG,EACH,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAE7D,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KACpC,gBAAgB,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;AA+C9E;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,mBAAmB,CA0CrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,CAEvE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contract.grpc factory — scoped-defaults pattern.
|
|
3
|
+
*
|
|
4
|
+
* Root `contract.grpc` exposes only `.with(name, defaults)`. Calling
|
|
5
|
+
* `contract.grpc("id", spec)` directly is forbidden — client injection via
|
|
6
|
+
* scoped instances is the canonical authoring pattern (same as HTTP).
|
|
7
|
+
*
|
|
8
|
+
* The factory wraps the generic dispatcher attached to `contract.grpc` by
|
|
9
|
+
* `contract.register("grpc", grpcAdapter)`. Calls flow through:
|
|
10
|
+
* user code
|
|
11
|
+
* → scoped factory(id, spec)
|
|
12
|
+
* → merge instance defaults into spec
|
|
13
|
+
* → dispatcher(id, mergedSpec) [generic register() output]
|
|
14
|
+
* → adapter.project + per-case registerTest + Test[] with _projection/_spec
|
|
15
|
+
*/
|
|
16
|
+
function mergeExtensions(base, override) {
|
|
17
|
+
if (!base && !override)
|
|
18
|
+
return undefined;
|
|
19
|
+
const merged = {
|
|
20
|
+
...(base ?? {}),
|
|
21
|
+
...(override ?? {}),
|
|
22
|
+
};
|
|
23
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
24
|
+
}
|
|
25
|
+
function mergeGrpcDefaults(defaults, spec) {
|
|
26
|
+
if (!defaults)
|
|
27
|
+
return spec;
|
|
28
|
+
const mergedTags = [...(defaults.tags ?? []), ...(spec.tags ?? [])];
|
|
29
|
+
const mergedExtensions = mergeExtensions(defaults.extensions, spec.extensions);
|
|
30
|
+
const mergedMetadata = {
|
|
31
|
+
...(defaults.metadata ?? {}),
|
|
32
|
+
...(spec.defaultMetadata ?? {}),
|
|
33
|
+
};
|
|
34
|
+
// Embed the factory's instanceName into the spec via a private `_factory`
|
|
35
|
+
// channel. `projectGrpc` reads this at projection time so the produced
|
|
36
|
+
// `_projection` (and `_extracted`) already carries it — no post-dispatch
|
|
37
|
+
// mutation needed.
|
|
38
|
+
const baseMerged = {
|
|
39
|
+
...spec,
|
|
40
|
+
client: spec.client ?? defaults.client,
|
|
41
|
+
feature: spec.feature ?? defaults.feature,
|
|
42
|
+
tags: mergedTags.length > 0 ? mergedTags : undefined,
|
|
43
|
+
extensions: mergedExtensions,
|
|
44
|
+
defaultMetadata: Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined,
|
|
45
|
+
deadlineMs: spec.deadlineMs ?? defaults.deadlineMs,
|
|
46
|
+
};
|
|
47
|
+
if (defaults._name) {
|
|
48
|
+
baseMerged._factory = {
|
|
49
|
+
instanceName: defaults._name,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return baseMerged;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a scoped gRPC factory. `dispatch` is `contract.grpc` attached by the
|
|
56
|
+
* core's register() call — we wrap it to inject instance defaults.
|
|
57
|
+
*/
|
|
58
|
+
export function createGrpcFactory(dispatch, defaults) {
|
|
59
|
+
const factory = (id, spec) => {
|
|
60
|
+
if (!defaults?._name) {
|
|
61
|
+
throw new Error(`contract.grpc("${id}", spec) is not supported. ` +
|
|
62
|
+
`Use contract.grpc.with("name", { client }) first to create a scoped instance, ` +
|
|
63
|
+
`then call instance("${id}", spec).`);
|
|
64
|
+
}
|
|
65
|
+
const merged = mergeGrpcDefaults(defaults, spec);
|
|
66
|
+
return dispatch(id, merged);
|
|
67
|
+
};
|
|
68
|
+
factory.with = (name, more = {}) => {
|
|
69
|
+
const mergedTags = [...(defaults?.tags ?? []), ...(more.tags ?? [])];
|
|
70
|
+
const mergedExtensions = mergeExtensions(defaults?.extensions, more.extensions);
|
|
71
|
+
const mergedMetadata = {
|
|
72
|
+
...(defaults?.metadata ?? {}),
|
|
73
|
+
...(more.metadata ?? {}),
|
|
74
|
+
};
|
|
75
|
+
return createGrpcFactory(dispatch, {
|
|
76
|
+
...defaults,
|
|
77
|
+
...more,
|
|
78
|
+
tags: mergedTags.length > 0 ? mergedTags : undefined,
|
|
79
|
+
extensions: mergedExtensions,
|
|
80
|
+
metadata: Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined,
|
|
81
|
+
_name: name,
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
return factory;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Root factory — `.with()` only, direct call throws.
|
|
88
|
+
*/
|
|
89
|
+
export function createGrpcRoot(dispatch) {
|
|
90
|
+
return createGrpcFactory(dispatch);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/contract/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gRPC contract surface for @glubean/grpc.
|
|
3
|
+
*
|
|
4
|
+
* This module used to register `contract.grpc` + gRPC matchers as side effects
|
|
5
|
+
* at import time. In the plugin-manifest era that responsibility moved to the
|
|
6
|
+
* default export of `@glubean/grpc/src/index.ts`, which projects install
|
|
7
|
+
* explicitly via `installPlugin(...)` / `bootstrap()`.
|
|
8
|
+
*
|
|
9
|
+
* This file is now **side-effect-free** — it only re-exports the adapter,
|
|
10
|
+
* factory, types, and matcher collection so the manifest in `../index.ts`
|
|
11
|
+
* can reference them.
|
|
12
|
+
*/
|
|
13
|
+
export { grpcAdapter } from "./adapter.js";
|
|
14
|
+
export { createGrpcFactory, createGrpcRoot } from "./factory.js";
|
|
15
|
+
export { grpcMatchers } from "./matchers.js";
|
|
16
|
+
export type { GrpcContractCase, GrpcContractDefaults, GrpcContractExample, GrpcContractExpect, GrpcContractFactory, GrpcContractMeta, GrpcContractRoot, GrpcContractSafeMeta, GrpcContractSpec, GrpcCaseResult, GrpcFlowCaseOutput, GrpcPayloadSchemas, GrpcSafeSchemas, InferGrpcRequest, InferGrpcResponse, } from "./types.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|