@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.
@@ -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"}