@peac/transport-grpc 0.12.6
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/.turbo/turbo-build.log +25 -0
- package/.turbo/turbo-test.log +15 -0
- package/LICENSE +190 -0
- package/README.md +110 -0
- package/dist/a2a-carrier.d.ts +71 -0
- package/dist/a2a-carrier.d.ts.map +1 -0
- package/dist/index.cjs +324 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +297 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +304 -0
- package/dist/index.mjs.map +1 -0
- package/dist/metadata.d.ts +42 -0
- package/dist/metadata.d.ts.map +1 -0
- package/package.json +60 -0
- package/src/a2a-carrier.ts +158 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +313 -0
- package/src/metadata.ts +85 -0
- package/tests/a2a-carrier.test.ts +208 -0
- package/tests/status-parity.test.ts +361 -0
- package/tsconfig.json +11 -0
- package/tsup.config.ts +19 -0
- package/vitest.config.d.ts.map +1 -0
- package/vitest.config.js.map +1 -0
- package/vitest.config.ts +9 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var kernel = require('@peac/kernel');
|
|
4
|
+
var crypto = require('crypto');
|
|
5
|
+
var schema = require('@peac/schema');
|
|
6
|
+
|
|
7
|
+
// src/metadata.ts
|
|
8
|
+
var GrpcMetadataKeys = {
|
|
9
|
+
/** PEAC receipt in metadata */
|
|
10
|
+
RECEIPT: "peac-receipt",
|
|
11
|
+
/** PEAC receipt type */
|
|
12
|
+
RECEIPT_TYPE: "peac-receipt-type",
|
|
13
|
+
/** TAP signature */
|
|
14
|
+
TAP_SIGNATURE: "peac-tap-signature",
|
|
15
|
+
/** TAP signature input */
|
|
16
|
+
TAP_SIGNATURE_INPUT: "peac-tap-signature-input",
|
|
17
|
+
/** PEAC error code in trailer */
|
|
18
|
+
ERROR_CODE: "peac-error-code",
|
|
19
|
+
/** Request ID for tracing */
|
|
20
|
+
REQUEST_ID: "peac-request-id"
|
|
21
|
+
};
|
|
22
|
+
function extractReceiptFromMetadata(metadata) {
|
|
23
|
+
const receipt = metadata[GrpcMetadataKeys.RECEIPT];
|
|
24
|
+
if (typeof receipt === "string") {
|
|
25
|
+
return receipt;
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(receipt) && receipt.length > 0) {
|
|
28
|
+
return receipt[0];
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
function extractReceiptTypeFromMetadata(metadata) {
|
|
33
|
+
const typ = metadata[GrpcMetadataKeys.RECEIPT_TYPE];
|
|
34
|
+
if (typeof typ === "string") {
|
|
35
|
+
return typ;
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(typ) && typ.length > 0) {
|
|
38
|
+
return typ[0];
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function addReceiptToMetadata(metadata, receiptJws, receiptType = kernel.WIRE_02_JWS_TYP) {
|
|
43
|
+
metadata[GrpcMetadataKeys.RECEIPT] = receiptJws;
|
|
44
|
+
metadata[GrpcMetadataKeys.RECEIPT_TYPE] = receiptType;
|
|
45
|
+
}
|
|
46
|
+
var GRPC_MAX_CARRIER_SIZE = 8192;
|
|
47
|
+
var BINARY_SUFFIX = "-bin";
|
|
48
|
+
var A2AGrpcCarrierAdapter = class {
|
|
49
|
+
/**
|
|
50
|
+
* Extract PEAC evidence carrier from gRPC metadata.
|
|
51
|
+
*
|
|
52
|
+
* Computes the real SHA-256 receipt_ref from the JWS bytes using
|
|
53
|
+
* Node's synchronous crypto.createHash (server-first package).
|
|
54
|
+
* Rejects binary metadata keys (gRPC `-bin` suffix convention).
|
|
55
|
+
*
|
|
56
|
+
* @returns Extracted carrier with computed receipt_ref, or null if absent
|
|
57
|
+
*/
|
|
58
|
+
extract(input) {
|
|
59
|
+
const binaryReceiptKey = GrpcMetadataKeys.RECEIPT + BINARY_SUFFIX;
|
|
60
|
+
if (binaryReceiptKey in input) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const receiptJws = extractReceiptFromMetadata(input);
|
|
64
|
+
if (!receiptJws) return null;
|
|
65
|
+
const digest = crypto.createHash("sha256").update(receiptJws).digest("hex");
|
|
66
|
+
const receiptRef = `sha256:${digest}`;
|
|
67
|
+
const carrier = {
|
|
68
|
+
receipt_ref: receiptRef,
|
|
69
|
+
receipt_jws: receiptJws
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
receipts: [carrier],
|
|
73
|
+
meta: createGrpcCarrierMeta()
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
attach(output, carriers, meta) {
|
|
77
|
+
if (carriers.length === 0) return output;
|
|
78
|
+
const carrier = carriers[0];
|
|
79
|
+
const effectiveMeta = meta ?? createGrpcCarrierMeta();
|
|
80
|
+
const result = this.validateConstraints(carrier, effectiveMeta);
|
|
81
|
+
if (!result.valid) {
|
|
82
|
+
throw new Error(`Carrier constraint violation: ${result.violations.join("; ")}`);
|
|
83
|
+
}
|
|
84
|
+
if (carrier.receipt_jws) {
|
|
85
|
+
addReceiptToMetadata(output, carrier.receipt_jws);
|
|
86
|
+
}
|
|
87
|
+
return output;
|
|
88
|
+
}
|
|
89
|
+
validateConstraints(carrier, meta) {
|
|
90
|
+
return schema.validateCarrierConstraints(carrier, meta);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
function createGrpcCarrierMeta(overrides) {
|
|
94
|
+
return {
|
|
95
|
+
transport: "grpc",
|
|
96
|
+
format: "embed",
|
|
97
|
+
max_size: GRPC_MAX_CARRIER_SIZE,
|
|
98
|
+
...overrides
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function validateOwnMetadataKeys() {
|
|
102
|
+
const ASCII_KEY_REGEX = /^[a-z0-9_-]+$/;
|
|
103
|
+
const RESERVED_PREFIX = "grpc-";
|
|
104
|
+
const invalid = [];
|
|
105
|
+
for (const key of Object.values(GrpcMetadataKeys)) {
|
|
106
|
+
if (!ASCII_KEY_REGEX.test(key)) {
|
|
107
|
+
invalid.push(key);
|
|
108
|
+
} else if (key.startsWith(RESERVED_PREFIX)) {
|
|
109
|
+
invalid.push(key);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return invalid;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/index.ts
|
|
116
|
+
var GRPC_TRANSPORT_VERSION = "0.12.6";
|
|
117
|
+
var GrpcStatus = {
|
|
118
|
+
/** Success */
|
|
119
|
+
OK: 0,
|
|
120
|
+
/** Operation was cancelled */
|
|
121
|
+
CANCELLED: 1,
|
|
122
|
+
/** Unknown error */
|
|
123
|
+
UNKNOWN: 2,
|
|
124
|
+
/** Client specified invalid argument */
|
|
125
|
+
INVALID_ARGUMENT: 3,
|
|
126
|
+
/** Deadline expired before operation completed */
|
|
127
|
+
DEADLINE_EXCEEDED: 4,
|
|
128
|
+
/** Requested entity not found */
|
|
129
|
+
NOT_FOUND: 5,
|
|
130
|
+
/** Entity already exists */
|
|
131
|
+
ALREADY_EXISTS: 6,
|
|
132
|
+
/** Caller lacks permission */
|
|
133
|
+
PERMISSION_DENIED: 7,
|
|
134
|
+
/** Resource exhausted */
|
|
135
|
+
RESOURCE_EXHAUSTED: 8,
|
|
136
|
+
/** Operation rejected due to precondition */
|
|
137
|
+
FAILED_PRECONDITION: 9,
|
|
138
|
+
/** Operation aborted (conflict) */
|
|
139
|
+
ABORTED: 10,
|
|
140
|
+
/** Value out of range */
|
|
141
|
+
OUT_OF_RANGE: 11,
|
|
142
|
+
/** Operation not implemented */
|
|
143
|
+
UNIMPLEMENTED: 12,
|
|
144
|
+
/** Internal error */
|
|
145
|
+
INTERNAL: 13,
|
|
146
|
+
/** Service unavailable */
|
|
147
|
+
UNAVAILABLE: 14,
|
|
148
|
+
/** Data loss */
|
|
149
|
+
DATA_LOSS: 15,
|
|
150
|
+
/** Not authenticated */
|
|
151
|
+
UNAUTHENTICATED: 16
|
|
152
|
+
};
|
|
153
|
+
function httpStatusToGrpc(httpStatus) {
|
|
154
|
+
switch (httpStatus) {
|
|
155
|
+
case 200:
|
|
156
|
+
case 201:
|
|
157
|
+
case 204:
|
|
158
|
+
return GrpcStatus.OK;
|
|
159
|
+
case 400:
|
|
160
|
+
return GrpcStatus.INVALID_ARGUMENT;
|
|
161
|
+
case 401:
|
|
162
|
+
return GrpcStatus.UNAUTHENTICATED;
|
|
163
|
+
case 402:
|
|
164
|
+
return GrpcStatus.FAILED_PRECONDITION;
|
|
165
|
+
case 403:
|
|
166
|
+
return GrpcStatus.PERMISSION_DENIED;
|
|
167
|
+
case 404:
|
|
168
|
+
return GrpcStatus.NOT_FOUND;
|
|
169
|
+
case 409:
|
|
170
|
+
return GrpcStatus.ABORTED;
|
|
171
|
+
case 429:
|
|
172
|
+
return GrpcStatus.RESOURCE_EXHAUSTED;
|
|
173
|
+
case 499:
|
|
174
|
+
return GrpcStatus.CANCELLED;
|
|
175
|
+
case 500:
|
|
176
|
+
return GrpcStatus.INTERNAL;
|
|
177
|
+
case 501:
|
|
178
|
+
return GrpcStatus.UNIMPLEMENTED;
|
|
179
|
+
case 503:
|
|
180
|
+
return GrpcStatus.UNAVAILABLE;
|
|
181
|
+
case 504:
|
|
182
|
+
return GrpcStatus.DEADLINE_EXCEEDED;
|
|
183
|
+
default:
|
|
184
|
+
if (httpStatus >= 400 && httpStatus < 500) {
|
|
185
|
+
return GrpcStatus.INVALID_ARGUMENT;
|
|
186
|
+
}
|
|
187
|
+
if (httpStatus >= 500) {
|
|
188
|
+
return GrpcStatus.INTERNAL;
|
|
189
|
+
}
|
|
190
|
+
return GrpcStatus.OK;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function grpcStatusToHttp(grpcStatus) {
|
|
194
|
+
switch (grpcStatus) {
|
|
195
|
+
case GrpcStatus.OK:
|
|
196
|
+
return 200;
|
|
197
|
+
case GrpcStatus.CANCELLED:
|
|
198
|
+
return 499;
|
|
199
|
+
case GrpcStatus.UNKNOWN:
|
|
200
|
+
return 500;
|
|
201
|
+
case GrpcStatus.INVALID_ARGUMENT:
|
|
202
|
+
return 400;
|
|
203
|
+
case GrpcStatus.DEADLINE_EXCEEDED:
|
|
204
|
+
return 504;
|
|
205
|
+
case GrpcStatus.NOT_FOUND:
|
|
206
|
+
return 404;
|
|
207
|
+
case GrpcStatus.ALREADY_EXISTS:
|
|
208
|
+
return 409;
|
|
209
|
+
case GrpcStatus.PERMISSION_DENIED:
|
|
210
|
+
return 403;
|
|
211
|
+
case GrpcStatus.RESOURCE_EXHAUSTED:
|
|
212
|
+
return 429;
|
|
213
|
+
case GrpcStatus.FAILED_PRECONDITION:
|
|
214
|
+
return 402;
|
|
215
|
+
case GrpcStatus.ABORTED:
|
|
216
|
+
return 409;
|
|
217
|
+
case GrpcStatus.OUT_OF_RANGE:
|
|
218
|
+
return 400;
|
|
219
|
+
case GrpcStatus.UNIMPLEMENTED:
|
|
220
|
+
return 501;
|
|
221
|
+
case GrpcStatus.INTERNAL:
|
|
222
|
+
return 500;
|
|
223
|
+
case GrpcStatus.UNAVAILABLE:
|
|
224
|
+
return 503;
|
|
225
|
+
case GrpcStatus.DATA_LOSS:
|
|
226
|
+
return 500;
|
|
227
|
+
case GrpcStatus.UNAUTHENTICATED:
|
|
228
|
+
return 401;
|
|
229
|
+
default:
|
|
230
|
+
return 500;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
var PEAC_ERROR_TO_GRPC = {
|
|
234
|
+
// 402 Payment Required -> FAILED_PRECONDITION
|
|
235
|
+
E_RECEIPT_MISSING: GrpcStatus.FAILED_PRECONDITION,
|
|
236
|
+
E_RECEIPT_INVALID: GrpcStatus.FAILED_PRECONDITION,
|
|
237
|
+
E_RECEIPT_EXPIRED: GrpcStatus.FAILED_PRECONDITION,
|
|
238
|
+
// 401 Unauthenticated -> UNAUTHENTICATED
|
|
239
|
+
E_TAP_SIGNATURE_MISSING: GrpcStatus.UNAUTHENTICATED,
|
|
240
|
+
E_TAP_SIGNATURE_INVALID: GrpcStatus.UNAUTHENTICATED,
|
|
241
|
+
E_TAP_TIME_INVALID: GrpcStatus.UNAUTHENTICATED,
|
|
242
|
+
E_TAP_KEY_NOT_FOUND: GrpcStatus.UNAUTHENTICATED,
|
|
243
|
+
E_TAP_REPLAY_PROTECTION_REQUIRED: GrpcStatus.UNAUTHENTICATED,
|
|
244
|
+
// 400 Bad Request -> INVALID_ARGUMENT
|
|
245
|
+
E_TAP_WINDOW_TOO_LARGE: GrpcStatus.INVALID_ARGUMENT,
|
|
246
|
+
E_TAP_TAG_UNKNOWN: GrpcStatus.INVALID_ARGUMENT,
|
|
247
|
+
E_TAP_ALGORITHM_INVALID: GrpcStatus.INVALID_ARGUMENT,
|
|
248
|
+
// 403 Forbidden -> PERMISSION_DENIED
|
|
249
|
+
E_ISSUER_NOT_ALLOWED: GrpcStatus.PERMISSION_DENIED,
|
|
250
|
+
// 409 Conflict -> ABORTED
|
|
251
|
+
E_TAP_NONCE_REPLAY: GrpcStatus.ABORTED,
|
|
252
|
+
// 500 Internal -> INTERNAL
|
|
253
|
+
E_CONFIG_ISSUER_ALLOWLIST_REQUIRED: GrpcStatus.INTERNAL,
|
|
254
|
+
E_INTERNAL_ERROR: GrpcStatus.INTERNAL
|
|
255
|
+
};
|
|
256
|
+
function peacErrorToGrpc(errorCode) {
|
|
257
|
+
return PEAC_ERROR_TO_GRPC[errorCode] ?? GrpcStatus.INTERNAL;
|
|
258
|
+
}
|
|
259
|
+
function createGrpcError(peacCode, message, details) {
|
|
260
|
+
return {
|
|
261
|
+
code: peacErrorToGrpc(peacCode),
|
|
262
|
+
message,
|
|
263
|
+
peacCode,
|
|
264
|
+
details
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
function createSuccessResult(receiptId) {
|
|
268
|
+
return {
|
|
269
|
+
ok: true,
|
|
270
|
+
status: GrpcStatus.OK,
|
|
271
|
+
receiptId
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function createFailureResult(error) {
|
|
275
|
+
return {
|
|
276
|
+
ok: false,
|
|
277
|
+
status: error.code,
|
|
278
|
+
error
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
var GrpcStatusName = {
|
|
282
|
+
[GrpcStatus.OK]: "OK",
|
|
283
|
+
[GrpcStatus.CANCELLED]: "CANCELLED",
|
|
284
|
+
[GrpcStatus.UNKNOWN]: "UNKNOWN",
|
|
285
|
+
[GrpcStatus.INVALID_ARGUMENT]: "INVALID_ARGUMENT",
|
|
286
|
+
[GrpcStatus.DEADLINE_EXCEEDED]: "DEADLINE_EXCEEDED",
|
|
287
|
+
[GrpcStatus.NOT_FOUND]: "NOT_FOUND",
|
|
288
|
+
[GrpcStatus.ALREADY_EXISTS]: "ALREADY_EXISTS",
|
|
289
|
+
[GrpcStatus.PERMISSION_DENIED]: "PERMISSION_DENIED",
|
|
290
|
+
[GrpcStatus.RESOURCE_EXHAUSTED]: "RESOURCE_EXHAUSTED",
|
|
291
|
+
[GrpcStatus.FAILED_PRECONDITION]: "FAILED_PRECONDITION",
|
|
292
|
+
[GrpcStatus.ABORTED]: "ABORTED",
|
|
293
|
+
[GrpcStatus.OUT_OF_RANGE]: "OUT_OF_RANGE",
|
|
294
|
+
[GrpcStatus.UNIMPLEMENTED]: "UNIMPLEMENTED",
|
|
295
|
+
[GrpcStatus.INTERNAL]: "INTERNAL",
|
|
296
|
+
[GrpcStatus.UNAVAILABLE]: "UNAVAILABLE",
|
|
297
|
+
[GrpcStatus.DATA_LOSS]: "DATA_LOSS",
|
|
298
|
+
[GrpcStatus.UNAUTHENTICATED]: "UNAUTHENTICATED"
|
|
299
|
+
};
|
|
300
|
+
function getStatusName(code) {
|
|
301
|
+
return GrpcStatusName[code] ?? "UNKNOWN";
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
exports.A2AGrpcCarrierAdapter = A2AGrpcCarrierAdapter;
|
|
305
|
+
exports.GRPC_MAX_CARRIER_SIZE = GRPC_MAX_CARRIER_SIZE;
|
|
306
|
+
exports.GRPC_TRANSPORT_VERSION = GRPC_TRANSPORT_VERSION;
|
|
307
|
+
exports.GrpcMetadataKeys = GrpcMetadataKeys;
|
|
308
|
+
exports.GrpcStatus = GrpcStatus;
|
|
309
|
+
exports.GrpcStatusName = GrpcStatusName;
|
|
310
|
+
exports.PEAC_ERROR_TO_GRPC = PEAC_ERROR_TO_GRPC;
|
|
311
|
+
exports.addReceiptToMetadata = addReceiptToMetadata;
|
|
312
|
+
exports.createFailureResult = createFailureResult;
|
|
313
|
+
exports.createGrpcCarrierMeta = createGrpcCarrierMeta;
|
|
314
|
+
exports.createGrpcError = createGrpcError;
|
|
315
|
+
exports.createSuccessResult = createSuccessResult;
|
|
316
|
+
exports.extractReceiptFromMetadata = extractReceiptFromMetadata;
|
|
317
|
+
exports.extractReceiptTypeFromMetadata = extractReceiptTypeFromMetadata;
|
|
318
|
+
exports.getStatusName = getStatusName;
|
|
319
|
+
exports.grpcStatusToHttp = grpcStatusToHttp;
|
|
320
|
+
exports.httpStatusToGrpc = httpStatusToGrpc;
|
|
321
|
+
exports.peacErrorToGrpc = peacErrorToGrpc;
|
|
322
|
+
exports.validateOwnMetadataKeys = validateOwnMetadataKeys;
|
|
323
|
+
//# sourceMappingURL=index.cjs.map
|
|
324
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/metadata.ts","../src/a2a-carrier.ts","../src/index.ts"],"names":["WIRE_02_JWS_TYP","createHash","validateCarrierConstraints"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * gRPC metadata keys, types, and helpers for PEAC transport.\n *\n * Extracted to a separate module to avoid circular imports between\n * index.ts and a2a-carrier.ts.\n */\n\nimport { WIRE_02_JWS_TYP } from '@peac/kernel';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** gRPC metadata shape for PEAC carrier operations */\nexport type GrpcMetadataLike = Record<string, string | string[] | undefined>;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * gRPC metadata keys for PEAC transport.\n */\nexport const GrpcMetadataKeys = {\n /** PEAC receipt in metadata */\n RECEIPT: 'peac-receipt',\n /** PEAC receipt type */\n RECEIPT_TYPE: 'peac-receipt-type',\n /** TAP signature */\n TAP_SIGNATURE: 'peac-tap-signature',\n /** TAP signature input */\n TAP_SIGNATURE_INPUT: 'peac-tap-signature-input',\n /** PEAC error code in trailer */\n ERROR_CODE: 'peac-error-code',\n /** Request ID for tracing */\n REQUEST_ID: 'peac-request-id',\n} as const;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract PEAC receipt from gRPC metadata.\n */\nexport function extractReceiptFromMetadata(metadata: GrpcMetadataLike): string | null {\n const receipt = metadata[GrpcMetadataKeys.RECEIPT];\n if (typeof receipt === 'string') {\n return receipt;\n }\n if (Array.isArray(receipt) && receipt.length > 0) {\n return receipt[0];\n }\n return null;\n}\n\n/**\n * Extract receipt type from gRPC metadata.\n */\nexport function extractReceiptTypeFromMetadata(metadata: GrpcMetadataLike): string | null {\n const typ = metadata[GrpcMetadataKeys.RECEIPT_TYPE];\n if (typeof typ === 'string') {\n return typ;\n }\n if (Array.isArray(typ) && typ.length > 0) {\n return typ[0];\n }\n return null;\n}\n\n/**\n * Add PEAC receipt to gRPC metadata.\n *\n * @param metadata - gRPC metadata object to modify\n * @param receiptJws - Compact JWS of the signed receipt\n * @param receiptType - Receipt typ value (defaults to Wire 0.2 `interaction-record+jwt`)\n */\nexport function addReceiptToMetadata(\n metadata: Record<string, string | string[]>,\n receiptJws: string,\n receiptType: string = WIRE_02_JWS_TYP\n): void {\n metadata[GrpcMetadataKeys.RECEIPT] = receiptJws;\n metadata[GrpcMetadataKeys.RECEIPT_TYPE] = receiptType;\n}\n","/**\n * gRPC CarrierAdapter for A2A transport.\n *\n * Implements the PEAC CarrierAdapter interface for gRPC metadata,\n * enabling receipt attach/extract via gRPC metadata keys. Pure TS\n * with no @grpc/grpc-js dependency; consumers bring their own gRPC.\n *\n * Size default: 8 KiB. gRPC metadata rides in HTTP/2 headers where\n * servers commonly enforce an 8 KiB limit. For larger receipts, use\n * reference mode (receipt_url) or negotiate a higher limit with the\n * gRPC server configuration.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport type {\n CarrierAdapter,\n PeacEvidenceCarrier,\n CarrierMeta,\n CarrierValidationResult,\n ReceiptRef,\n} from '@peac/kernel';\nimport { validateCarrierConstraints } from '@peac/schema';\n\nimport { GrpcMetadataKeys, extractReceiptFromMetadata, addReceiptToMetadata } from './metadata.js';\nimport type { GrpcMetadataLike } from './metadata.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * Default maximum carrier size for gRPC metadata (8 KiB).\n *\n * gRPC metadata is carried in HTTP/2 headers. Official gRPC guidance\n * warns that servers may limit request headers, with a common default\n * of 8 KiB. This is a conservative interoperability-safe default.\n * Consumers with known larger server limits can override via\n * `createGrpcCarrierMeta({ max_size: ... })`.\n */\nexport const GRPC_MAX_CARRIER_SIZE = 8_192;\n\n/** Binary metadata key suffix per gRPC convention */\nconst BINARY_SUFFIX = '-bin';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * CarrierAdapter for gRPC metadata transport.\n *\n * Reads and writes PEAC evidence carriers via `GrpcMetadataKeys.RECEIPT`\n * and `GrpcMetadataKeys.RECEIPT_TYPE` metadata entries.\n *\n * `extract()` computes the real SHA-256 receipt_ref synchronously\n * using Node's `crypto.createHash` (server-first package).\n */\nexport class A2AGrpcCarrierAdapter implements CarrierAdapter<GrpcMetadataLike, GrpcMetadataLike> {\n /**\n * Extract PEAC evidence carrier from gRPC metadata.\n *\n * Computes the real SHA-256 receipt_ref from the JWS bytes using\n * Node's synchronous crypto.createHash (server-first package).\n * Rejects binary metadata keys (gRPC `-bin` suffix convention).\n *\n * @returns Extracted carrier with computed receipt_ref, or null if absent\n */\n extract(input: GrpcMetadataLike): { receipts: PeacEvidenceCarrier[]; meta: CarrierMeta } | null {\n // Reject binary-encoded PEAC receipt metadata\n const binaryReceiptKey = GrpcMetadataKeys.RECEIPT + BINARY_SUFFIX;\n if (binaryReceiptKey in input) {\n return null;\n }\n\n const receiptJws = extractReceiptFromMetadata(input);\n if (!receiptJws) return null;\n\n const digest = createHash('sha256').update(receiptJws).digest('hex');\n const receiptRef = `sha256:${digest}` as ReceiptRef;\n\n const carrier: PeacEvidenceCarrier = {\n receipt_ref: receiptRef,\n receipt_jws: receiptJws,\n };\n\n return {\n receipts: [carrier],\n meta: createGrpcCarrierMeta(),\n };\n }\n\n attach(\n output: GrpcMetadataLike,\n carriers: PeacEvidenceCarrier[],\n meta?: CarrierMeta\n ): GrpcMetadataLike {\n if (carriers.length === 0) return output;\n\n const carrier = carriers[0];\n const effectiveMeta = meta ?? createGrpcCarrierMeta();\n const result = this.validateConstraints(carrier, effectiveMeta);\n if (!result.valid) {\n throw new Error(`Carrier constraint violation: ${result.violations.join('; ')}`);\n }\n\n if (carrier.receipt_jws) {\n addReceiptToMetadata(output as Record<string, string | string[]>, carrier.receipt_jws);\n }\n\n return output;\n }\n\n validateConstraints(carrier: PeacEvidenceCarrier, meta: CarrierMeta): CarrierValidationResult {\n return validateCarrierConstraints(carrier, meta);\n }\n}\n\n/**\n * Create default CarrierMeta for gRPC transport.\n *\n * Default max_size is 8 KiB (HTTP/2 header budget). Override for\n * environments with known larger server limits.\n */\nexport function createGrpcCarrierMeta(overrides?: Partial<CarrierMeta>): CarrierMeta {\n return {\n transport: 'grpc',\n format: 'embed',\n max_size: GRPC_MAX_CARRIER_SIZE,\n ...overrides,\n };\n}\n\n/**\n * Validate that the package's own PEAC metadata key constants are ASCII-safe\n * and do not use the reserved `grpc-` prefix.\n *\n * This is a repo-level invariant check, not an inbound metadata validator.\n * It verifies that all keys defined in `GrpcMetadataKeys` use only\n * lowercase ASCII letters, digits, hyphens, and underscores per\n * gRPC metadata key requirements, and that none start with the\n * reserved `grpc-` prefix.\n *\n * @returns Array of invalid keys (empty if all valid)\n */\nexport function validateOwnMetadataKeys(): string[] {\n const ASCII_KEY_REGEX = /^[a-z0-9_-]+$/;\n const RESERVED_PREFIX = 'grpc-';\n const invalid: string[] = [];\n for (const key of Object.values(GrpcMetadataKeys)) {\n if (!ASCII_KEY_REGEX.test(key)) {\n invalid.push(key);\n } else if (key.startsWith(RESERVED_PREFIX)) {\n invalid.push(key);\n }\n }\n return invalid;\n}\n","/**\n * PEAC gRPC Transport Layer\n *\n * Provides gRPC binding for PEAC receipts with StatusCode parity to HTTP.\n *\n * Status code mapping follows these semantics:\n * - INVALID_ARGUMENT (3): Malformed request (HTTP 400)\n * - UNAUTHENTICATED (16): Authentication required (HTTP 401)\n * - FAILED_PRECONDITION (9): Payment required (HTTP 402)\n * - PERMISSION_DENIED (7): Not authorized (HTTP 403)\n * - ABORTED (10): Conflict/replay detected (HTTP 409)\n * - INTERNAL (13): Server error (HTTP 500)\n *\n * @packageDocumentation\n */\n\nexport const GRPC_TRANSPORT_VERSION = '0.12.6' as const;\n\n// Metadata keys, types, and helpers (shared with a2a-carrier.ts)\nexport {\n GrpcMetadataKeys,\n extractReceiptFromMetadata,\n extractReceiptTypeFromMetadata,\n addReceiptToMetadata,\n} from './metadata.js';\nexport type { GrpcMetadataLike } from './metadata.js';\n\n/**\n * gRPC status codes.\n * @see https://grpc.io/docs/guides/status-codes/\n */\nexport const GrpcStatus = {\n /** Success */\n OK: 0,\n /** Operation was cancelled */\n CANCELLED: 1,\n /** Unknown error */\n UNKNOWN: 2,\n /** Client specified invalid argument */\n INVALID_ARGUMENT: 3,\n /** Deadline expired before operation completed */\n DEADLINE_EXCEEDED: 4,\n /** Requested entity not found */\n NOT_FOUND: 5,\n /** Entity already exists */\n ALREADY_EXISTS: 6,\n /** Caller lacks permission */\n PERMISSION_DENIED: 7,\n /** Resource exhausted */\n RESOURCE_EXHAUSTED: 8,\n /** Operation rejected due to precondition */\n FAILED_PRECONDITION: 9,\n /** Operation aborted (conflict) */\n ABORTED: 10,\n /** Value out of range */\n OUT_OF_RANGE: 11,\n /** Operation not implemented */\n UNIMPLEMENTED: 12,\n /** Internal error */\n INTERNAL: 13,\n /** Service unavailable */\n UNAVAILABLE: 14,\n /** Data loss */\n DATA_LOSS: 15,\n /** Not authenticated */\n UNAUTHENTICATED: 16,\n} as const;\n\nexport type GrpcStatusCode = (typeof GrpcStatus)[keyof typeof GrpcStatus];\n\n/**\n * Map HTTP status code to gRPC status code.\n *\n * Mapping semantics:\n * - 400 Bad Request -> INVALID_ARGUMENT (malformed)\n * - 401 Unauthorized -> UNAUTHENTICATED (auth required)\n * - 402 Payment Required -> FAILED_PRECONDITION (payment needed)\n * - 403 Forbidden -> PERMISSION_DENIED (not authorized)\n * - 409 Conflict -> ABORTED (replay detected)\n * - 500 Internal Server Error -> INTERNAL\n * - Other 4xx -> INVALID_ARGUMENT\n * - Other 5xx -> INTERNAL\n */\nexport function httpStatusToGrpc(httpStatus: number): GrpcStatusCode {\n switch (httpStatus) {\n case 200:\n case 201:\n case 204:\n return GrpcStatus.OK;\n case 400:\n return GrpcStatus.INVALID_ARGUMENT;\n case 401:\n return GrpcStatus.UNAUTHENTICATED;\n case 402:\n return GrpcStatus.FAILED_PRECONDITION;\n case 403:\n return GrpcStatus.PERMISSION_DENIED;\n case 404:\n return GrpcStatus.NOT_FOUND;\n case 409:\n return GrpcStatus.ABORTED;\n case 429:\n return GrpcStatus.RESOURCE_EXHAUSTED;\n case 499:\n return GrpcStatus.CANCELLED;\n case 500:\n return GrpcStatus.INTERNAL;\n case 501:\n return GrpcStatus.UNIMPLEMENTED;\n case 503:\n return GrpcStatus.UNAVAILABLE;\n case 504:\n return GrpcStatus.DEADLINE_EXCEEDED;\n default:\n if (httpStatus >= 400 && httpStatus < 500) {\n return GrpcStatus.INVALID_ARGUMENT;\n }\n if (httpStatus >= 500) {\n return GrpcStatus.INTERNAL;\n }\n return GrpcStatus.OK;\n }\n}\n\n/**\n * Map gRPC status code to HTTP status code.\n *\n * Inverse of httpStatusToGrpc for response translation.\n */\nexport function grpcStatusToHttp(grpcStatus: GrpcStatusCode): number {\n switch (grpcStatus) {\n case GrpcStatus.OK:\n return 200;\n case GrpcStatus.CANCELLED:\n return 499;\n case GrpcStatus.UNKNOWN:\n return 500;\n case GrpcStatus.INVALID_ARGUMENT:\n return 400;\n case GrpcStatus.DEADLINE_EXCEEDED:\n return 504;\n case GrpcStatus.NOT_FOUND:\n return 404;\n case GrpcStatus.ALREADY_EXISTS:\n return 409;\n case GrpcStatus.PERMISSION_DENIED:\n return 403;\n case GrpcStatus.RESOURCE_EXHAUSTED:\n return 429;\n case GrpcStatus.FAILED_PRECONDITION:\n return 402;\n case GrpcStatus.ABORTED:\n return 409;\n case GrpcStatus.OUT_OF_RANGE:\n return 400;\n case GrpcStatus.UNIMPLEMENTED:\n return 501;\n case GrpcStatus.INTERNAL:\n return 500;\n case GrpcStatus.UNAVAILABLE:\n return 503;\n case GrpcStatus.DATA_LOSS:\n return 500;\n case GrpcStatus.UNAUTHENTICATED:\n return 401;\n default:\n return 500;\n }\n}\n\n/**\n * PEAC error code to gRPC status mapping.\n *\n * Maps canonical PEAC error codes to appropriate gRPC status codes.\n */\nexport const PEAC_ERROR_TO_GRPC: Record<string, GrpcStatusCode> = {\n // 402 Payment Required -> FAILED_PRECONDITION\n E_RECEIPT_MISSING: GrpcStatus.FAILED_PRECONDITION,\n E_RECEIPT_INVALID: GrpcStatus.FAILED_PRECONDITION,\n E_RECEIPT_EXPIRED: GrpcStatus.FAILED_PRECONDITION,\n\n // 401 Unauthenticated -> UNAUTHENTICATED\n E_TAP_SIGNATURE_MISSING: GrpcStatus.UNAUTHENTICATED,\n E_TAP_SIGNATURE_INVALID: GrpcStatus.UNAUTHENTICATED,\n E_TAP_TIME_INVALID: GrpcStatus.UNAUTHENTICATED,\n E_TAP_KEY_NOT_FOUND: GrpcStatus.UNAUTHENTICATED,\n E_TAP_REPLAY_PROTECTION_REQUIRED: GrpcStatus.UNAUTHENTICATED,\n\n // 400 Bad Request -> INVALID_ARGUMENT\n E_TAP_WINDOW_TOO_LARGE: GrpcStatus.INVALID_ARGUMENT,\n E_TAP_TAG_UNKNOWN: GrpcStatus.INVALID_ARGUMENT,\n E_TAP_ALGORITHM_INVALID: GrpcStatus.INVALID_ARGUMENT,\n\n // 403 Forbidden -> PERMISSION_DENIED\n E_ISSUER_NOT_ALLOWED: GrpcStatus.PERMISSION_DENIED,\n\n // 409 Conflict -> ABORTED\n E_TAP_NONCE_REPLAY: GrpcStatus.ABORTED,\n\n // 500 Internal -> INTERNAL\n E_CONFIG_ISSUER_ALLOWLIST_REQUIRED: GrpcStatus.INTERNAL,\n E_INTERNAL_ERROR: GrpcStatus.INTERNAL,\n};\n\n/**\n * Get gRPC status for a PEAC error code.\n */\nexport function peacErrorToGrpc(errorCode: string): GrpcStatusCode {\n return PEAC_ERROR_TO_GRPC[errorCode] ?? GrpcStatus.INTERNAL;\n}\n\n/**\n * gRPC error with status code.\n */\nexport interface GrpcError {\n /** gRPC status code */\n code: GrpcStatusCode;\n /** Error message */\n message: string;\n /** PEAC error code (if applicable) */\n peacCode?: string;\n /** Additional error details */\n details?: unknown;\n}\n\n/**\n * Create a gRPC error from a PEAC error code.\n */\nexport function createGrpcError(peacCode: string, message: string, details?: unknown): GrpcError {\n return {\n code: peacErrorToGrpc(peacCode),\n message,\n peacCode,\n details,\n };\n}\n\n/**\n * gRPC verification result.\n */\nexport interface GrpcVerificationResult {\n /** Whether verification succeeded */\n ok: boolean;\n /** gRPC status code */\n status: GrpcStatusCode;\n /** Error if verification failed */\n error?: GrpcError;\n /** Receipt ID if verification succeeded */\n receiptId?: string;\n}\n\n/**\n * Create a successful verification result.\n */\nexport function createSuccessResult(receiptId?: string): GrpcVerificationResult {\n return {\n ok: true,\n status: GrpcStatus.OK,\n receiptId,\n };\n}\n\n/**\n * Create a failed verification result.\n */\nexport function createFailureResult(error: GrpcError): GrpcVerificationResult {\n return {\n ok: false,\n status: error.code,\n error,\n };\n}\n\n/**\n * Status code name mapping for debugging.\n */\nexport const GrpcStatusName: Record<GrpcStatusCode, string> = {\n [GrpcStatus.OK]: 'OK',\n [GrpcStatus.CANCELLED]: 'CANCELLED',\n [GrpcStatus.UNKNOWN]: 'UNKNOWN',\n [GrpcStatus.INVALID_ARGUMENT]: 'INVALID_ARGUMENT',\n [GrpcStatus.DEADLINE_EXCEEDED]: 'DEADLINE_EXCEEDED',\n [GrpcStatus.NOT_FOUND]: 'NOT_FOUND',\n [GrpcStatus.ALREADY_EXISTS]: 'ALREADY_EXISTS',\n [GrpcStatus.PERMISSION_DENIED]: 'PERMISSION_DENIED',\n [GrpcStatus.RESOURCE_EXHAUSTED]: 'RESOURCE_EXHAUSTED',\n [GrpcStatus.FAILED_PRECONDITION]: 'FAILED_PRECONDITION',\n [GrpcStatus.ABORTED]: 'ABORTED',\n [GrpcStatus.OUT_OF_RANGE]: 'OUT_OF_RANGE',\n [GrpcStatus.UNIMPLEMENTED]: 'UNIMPLEMENTED',\n [GrpcStatus.INTERNAL]: 'INTERNAL',\n [GrpcStatus.UNAVAILABLE]: 'UNAVAILABLE',\n [GrpcStatus.DATA_LOSS]: 'DATA_LOSS',\n [GrpcStatus.UNAUTHENTICATED]: 'UNAUTHENTICATED',\n};\n\n/**\n * Get human-readable name for a gRPC status code.\n */\nexport function getStatusName(code: GrpcStatusCode): string {\n return GrpcStatusName[code] ?? 'UNKNOWN';\n}\n\n// ---------------------------------------------------------------------------\n// Carrier adapter re-exports\n// ---------------------------------------------------------------------------\n\nexport {\n A2AGrpcCarrierAdapter,\n createGrpcCarrierMeta,\n validateOwnMetadataKeys,\n GRPC_MAX_CARRIER_SIZE,\n} from './a2a-carrier.js';\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PEAC gRPC Transport Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides gRPC binding for PEAC receipts with StatusCode parity to HTTP.
|
|
5
|
+
*
|
|
6
|
+
* Status code mapping follows these semantics:
|
|
7
|
+
* - INVALID_ARGUMENT (3): Malformed request (HTTP 400)
|
|
8
|
+
* - UNAUTHENTICATED (16): Authentication required (HTTP 401)
|
|
9
|
+
* - FAILED_PRECONDITION (9): Payment required (HTTP 402)
|
|
10
|
+
* - PERMISSION_DENIED (7): Not authorized (HTTP 403)
|
|
11
|
+
* - ABORTED (10): Conflict/replay detected (HTTP 409)
|
|
12
|
+
* - INTERNAL (13): Server error (HTTP 500)
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
export declare const GRPC_TRANSPORT_VERSION: "0.12.6";
|
|
17
|
+
export { GrpcMetadataKeys, extractReceiptFromMetadata, extractReceiptTypeFromMetadata, addReceiptToMetadata, } from './metadata.js';
|
|
18
|
+
export type { GrpcMetadataLike } from './metadata.js';
|
|
19
|
+
/**
|
|
20
|
+
* gRPC status codes.
|
|
21
|
+
* @see https://grpc.io/docs/guides/status-codes/
|
|
22
|
+
*/
|
|
23
|
+
export declare const GrpcStatus: {
|
|
24
|
+
/** Success */
|
|
25
|
+
readonly OK: 0;
|
|
26
|
+
/** Operation was cancelled */
|
|
27
|
+
readonly CANCELLED: 1;
|
|
28
|
+
/** Unknown error */
|
|
29
|
+
readonly UNKNOWN: 2;
|
|
30
|
+
/** Client specified invalid argument */
|
|
31
|
+
readonly INVALID_ARGUMENT: 3;
|
|
32
|
+
/** Deadline expired before operation completed */
|
|
33
|
+
readonly DEADLINE_EXCEEDED: 4;
|
|
34
|
+
/** Requested entity not found */
|
|
35
|
+
readonly NOT_FOUND: 5;
|
|
36
|
+
/** Entity already exists */
|
|
37
|
+
readonly ALREADY_EXISTS: 6;
|
|
38
|
+
/** Caller lacks permission */
|
|
39
|
+
readonly PERMISSION_DENIED: 7;
|
|
40
|
+
/** Resource exhausted */
|
|
41
|
+
readonly RESOURCE_EXHAUSTED: 8;
|
|
42
|
+
/** Operation rejected due to precondition */
|
|
43
|
+
readonly FAILED_PRECONDITION: 9;
|
|
44
|
+
/** Operation aborted (conflict) */
|
|
45
|
+
readonly ABORTED: 10;
|
|
46
|
+
/** Value out of range */
|
|
47
|
+
readonly OUT_OF_RANGE: 11;
|
|
48
|
+
/** Operation not implemented */
|
|
49
|
+
readonly UNIMPLEMENTED: 12;
|
|
50
|
+
/** Internal error */
|
|
51
|
+
readonly INTERNAL: 13;
|
|
52
|
+
/** Service unavailable */
|
|
53
|
+
readonly UNAVAILABLE: 14;
|
|
54
|
+
/** Data loss */
|
|
55
|
+
readonly DATA_LOSS: 15;
|
|
56
|
+
/** Not authenticated */
|
|
57
|
+
readonly UNAUTHENTICATED: 16;
|
|
58
|
+
};
|
|
59
|
+
export type GrpcStatusCode = (typeof GrpcStatus)[keyof typeof GrpcStatus];
|
|
60
|
+
/**
|
|
61
|
+
* Map HTTP status code to gRPC status code.
|
|
62
|
+
*
|
|
63
|
+
* Mapping semantics:
|
|
64
|
+
* - 400 Bad Request -> INVALID_ARGUMENT (malformed)
|
|
65
|
+
* - 401 Unauthorized -> UNAUTHENTICATED (auth required)
|
|
66
|
+
* - 402 Payment Required -> FAILED_PRECONDITION (payment needed)
|
|
67
|
+
* - 403 Forbidden -> PERMISSION_DENIED (not authorized)
|
|
68
|
+
* - 409 Conflict -> ABORTED (replay detected)
|
|
69
|
+
* - 500 Internal Server Error -> INTERNAL
|
|
70
|
+
* - Other 4xx -> INVALID_ARGUMENT
|
|
71
|
+
* - Other 5xx -> INTERNAL
|
|
72
|
+
*/
|
|
73
|
+
export declare function httpStatusToGrpc(httpStatus: number): GrpcStatusCode;
|
|
74
|
+
/**
|
|
75
|
+
* Map gRPC status code to HTTP status code.
|
|
76
|
+
*
|
|
77
|
+
* Inverse of httpStatusToGrpc for response translation.
|
|
78
|
+
*/
|
|
79
|
+
export declare function grpcStatusToHttp(grpcStatus: GrpcStatusCode): number;
|
|
80
|
+
/**
|
|
81
|
+
* PEAC error code to gRPC status mapping.
|
|
82
|
+
*
|
|
83
|
+
* Maps canonical PEAC error codes to appropriate gRPC status codes.
|
|
84
|
+
*/
|
|
85
|
+
export declare const PEAC_ERROR_TO_GRPC: Record<string, GrpcStatusCode>;
|
|
86
|
+
/**
|
|
87
|
+
* Get gRPC status for a PEAC error code.
|
|
88
|
+
*/
|
|
89
|
+
export declare function peacErrorToGrpc(errorCode: string): GrpcStatusCode;
|
|
90
|
+
/**
|
|
91
|
+
* gRPC error with status code.
|
|
92
|
+
*/
|
|
93
|
+
export interface GrpcError {
|
|
94
|
+
/** gRPC status code */
|
|
95
|
+
code: GrpcStatusCode;
|
|
96
|
+
/** Error message */
|
|
97
|
+
message: string;
|
|
98
|
+
/** PEAC error code (if applicable) */
|
|
99
|
+
peacCode?: string;
|
|
100
|
+
/** Additional error details */
|
|
101
|
+
details?: unknown;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a gRPC error from a PEAC error code.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createGrpcError(peacCode: string, message: string, details?: unknown): GrpcError;
|
|
107
|
+
/**
|
|
108
|
+
* gRPC verification result.
|
|
109
|
+
*/
|
|
110
|
+
export interface GrpcVerificationResult {
|
|
111
|
+
/** Whether verification succeeded */
|
|
112
|
+
ok: boolean;
|
|
113
|
+
/** gRPC status code */
|
|
114
|
+
status: GrpcStatusCode;
|
|
115
|
+
/** Error if verification failed */
|
|
116
|
+
error?: GrpcError;
|
|
117
|
+
/** Receipt ID if verification succeeded */
|
|
118
|
+
receiptId?: string;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create a successful verification result.
|
|
122
|
+
*/
|
|
123
|
+
export declare function createSuccessResult(receiptId?: string): GrpcVerificationResult;
|
|
124
|
+
/**
|
|
125
|
+
* Create a failed verification result.
|
|
126
|
+
*/
|
|
127
|
+
export declare function createFailureResult(error: GrpcError): GrpcVerificationResult;
|
|
128
|
+
/**
|
|
129
|
+
* Status code name mapping for debugging.
|
|
130
|
+
*/
|
|
131
|
+
export declare const GrpcStatusName: Record<GrpcStatusCode, string>;
|
|
132
|
+
/**
|
|
133
|
+
* Get human-readable name for a gRPC status code.
|
|
134
|
+
*/
|
|
135
|
+
export declare function getStatusName(code: GrpcStatusCode): string;
|
|
136
|
+
export { A2AGrpcCarrierAdapter, createGrpcCarrierMeta, validateOwnMetadataKeys, GRPC_MAX_CARRIER_SIZE, } from './a2a-carrier.js';
|
|
137
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,sBAAsB,EAAG,QAAiB,CAAC;AAGxD,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB,cAAc;;IAEd,8BAA8B;;IAE9B,oBAAoB;;IAEpB,wCAAwC;;IAExC,kDAAkD;;IAElD,iCAAiC;;IAEjC,4BAA4B;;IAE5B,8BAA8B;;IAE9B,yBAAyB;;IAEzB,6CAA6C;;IAE7C,mCAAmC;;IAEnC,yBAAyB;;IAEzB,gCAAgC;;IAEhC,qBAAqB;;IAErB,0BAA0B;;IAE1B,gBAAgB;;IAEhB,wBAAwB;;CAEhB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAE1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAuCnE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAuCnE;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA2B7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAEjE;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAO/F;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,uBAAuB;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAM9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,sBAAsB,CAM5E;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAkBzD,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAE1D;AAMD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
|