@glubean/grpc 0.1.4 → 0.2.1

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