@a2a-js/sdk 0.3.8 → 0.3.10

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,186 @@
1
+ import {
2
+ HTTP_EXTENSION_HEADER
3
+ } from "../../chunk-3QDLXHKS.js";
4
+ import {
5
+ ServerCallContext,
6
+ UnauthenticatedUser
7
+ } from "../../chunk-F6ACNKFR.js";
8
+ import {
9
+ Extensions
10
+ } from "../../chunk-ZX6KNMCP.js";
11
+ import {
12
+ A2AServiceService
13
+ } from "../../chunk-QQCCX2KH.js";
14
+ import {
15
+ FromProto,
16
+ ToProto
17
+ } from "../../chunk-U3QAVT4H.js";
18
+ import {
19
+ A2AError
20
+ } from "../../chunk-UHZEIZLS.js";
21
+
22
+ // src/server/grpc/grpc_service.ts
23
+ import * as grpc from "@grpc/grpc-js";
24
+ function grpcService(options) {
25
+ const requestHandler = options.requestHandler;
26
+ const wrapUnary = async (call, callback, parser, handler, converter) => {
27
+ try {
28
+ const context = await buildContext(call, options.userBuilder);
29
+ const params = parser(call.request);
30
+ const result = await handler(params, context);
31
+ call.sendMetadata(buildMetadata(context));
32
+ callback(null, converter(result));
33
+ } catch (error) {
34
+ callback(mapToError(error), null);
35
+ }
36
+ };
37
+ const wrapStreaming = async (call, parser, handler, converter) => {
38
+ try {
39
+ const context = await buildContext(call, options.userBuilder);
40
+ const params = parser(call.request);
41
+ const stream = await handler(params, context);
42
+ const metadata = buildMetadata(context);
43
+ call.sendMetadata(metadata);
44
+ for await (const responsePart of stream) {
45
+ const response = converter(responsePart);
46
+ call.write(response);
47
+ }
48
+ } catch (error) {
49
+ call.emit("error", mapToError(error));
50
+ } finally {
51
+ call.end();
52
+ }
53
+ };
54
+ return {
55
+ sendMessage(call, callback) {
56
+ return wrapUnary(
57
+ call,
58
+ callback,
59
+ FromProto.messageSendParams,
60
+ requestHandler.sendMessage.bind(requestHandler),
61
+ ToProto.messageSendResult
62
+ );
63
+ },
64
+ sendStreamingMessage(call) {
65
+ return wrapStreaming(
66
+ call,
67
+ FromProto.messageSendParams,
68
+ requestHandler.sendMessageStream.bind(requestHandler),
69
+ ToProto.messageStreamResult
70
+ );
71
+ },
72
+ taskSubscription(call) {
73
+ return wrapStreaming(
74
+ call,
75
+ FromProto.taskIdParams,
76
+ requestHandler.resubscribe.bind(requestHandler),
77
+ ToProto.messageStreamResult
78
+ );
79
+ },
80
+ deleteTaskPushNotificationConfig(call, callback) {
81
+ return wrapUnary(
82
+ call,
83
+ callback,
84
+ FromProto.deleteTaskPushNotificationConfigParams,
85
+ requestHandler.deleteTaskPushNotificationConfig.bind(requestHandler),
86
+ () => ({})
87
+ );
88
+ },
89
+ listTaskPushNotificationConfig(call, callback) {
90
+ return wrapUnary(
91
+ call,
92
+ callback,
93
+ FromProto.listTaskPushNotificationConfigParams,
94
+ requestHandler.listTaskPushNotificationConfigs.bind(requestHandler),
95
+ ToProto.listTaskPushNotificationConfig
96
+ );
97
+ },
98
+ createTaskPushNotificationConfig(call, callback) {
99
+ return wrapUnary(
100
+ call,
101
+ callback,
102
+ FromProto.createTaskPushNotificationConfig,
103
+ requestHandler.setTaskPushNotificationConfig.bind(requestHandler),
104
+ ToProto.taskPushNotificationConfig
105
+ );
106
+ },
107
+ getTaskPushNotificationConfig(call, callback) {
108
+ return wrapUnary(
109
+ call,
110
+ callback,
111
+ FromProto.getTaskPushNotificationConfigParams,
112
+ requestHandler.getTaskPushNotificationConfig.bind(requestHandler),
113
+ ToProto.taskPushNotificationConfig
114
+ );
115
+ },
116
+ getTask(call, callback) {
117
+ return wrapUnary(
118
+ call,
119
+ callback,
120
+ FromProto.taskQueryParams,
121
+ requestHandler.getTask.bind(requestHandler),
122
+ ToProto.task
123
+ );
124
+ },
125
+ cancelTask(call, callback) {
126
+ return wrapUnary(
127
+ call,
128
+ callback,
129
+ FromProto.taskIdParams,
130
+ requestHandler.cancelTask.bind(requestHandler),
131
+ ToProto.task
132
+ );
133
+ },
134
+ getAgentCard(call, callback) {
135
+ return wrapUnary(
136
+ call,
137
+ callback,
138
+ () => ({}),
139
+ (_params, context) => requestHandler.getAuthenticatedExtendedAgentCard(context),
140
+ ToProto.agentCard
141
+ );
142
+ }
143
+ };
144
+ }
145
+ var mapping = {
146
+ [-32001]: grpc.status.NOT_FOUND,
147
+ [-32002]: grpc.status.FAILED_PRECONDITION,
148
+ [-32003]: grpc.status.UNIMPLEMENTED,
149
+ [-32004]: grpc.status.UNIMPLEMENTED,
150
+ [-32005]: grpc.status.INVALID_ARGUMENT,
151
+ [-32006]: grpc.status.INTERNAL,
152
+ [-32007]: grpc.status.FAILED_PRECONDITION,
153
+ [-32600]: grpc.status.INVALID_ARGUMENT,
154
+ [-32602]: grpc.status.INVALID_ARGUMENT,
155
+ [-32603]: grpc.status.INTERNAL
156
+ };
157
+ var mapToError = (error) => {
158
+ const a2aError = error instanceof A2AError ? error : A2AError.internalError(error instanceof Error ? error.message : "Internal server error");
159
+ return {
160
+ code: mapping[a2aError.code] ?? grpc.status.UNKNOWN,
161
+ details: a2aError.message
162
+ };
163
+ };
164
+ var buildContext = async (call, userBuilder) => {
165
+ const user = await userBuilder(call);
166
+ const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER);
167
+ const extensionString = extensionHeaders.map((v) => v.toString()).join(",");
168
+ return new ServerCallContext(Extensions.parseServiceParameter(extensionString), user);
169
+ };
170
+ var buildMetadata = (context) => {
171
+ const metadata = new grpc.Metadata();
172
+ if (context.activatedExtensions?.length) {
173
+ metadata.set(HTTP_EXTENSION_HEADER, context.activatedExtensions.join(","));
174
+ }
175
+ return metadata;
176
+ };
177
+
178
+ // src/server/grpc/common.ts
179
+ var UserBuilder = {
180
+ noAuthentication: () => Promise.resolve(new UnauthenticatedUser())
181
+ };
182
+ export {
183
+ A2AServiceService as A2AService,
184
+ UserBuilder,
185
+ grpcService
186
+ };
@@ -626,7 +626,7 @@ var DefaultPushNotificationSender = class {
626
626
  await Promise.all(dispatches);
627
627
  });
628
628
  this.notificationChain.set(task.id, newPromise);
629
- newPromise.finally(() => {
629
+ return newPromise.finally(() => {
630
630
  if (this.notificationChain.get(task.id) === newPromise) {
631
631
  this.notificationChain.delete(task.id);
632
632
  }
@@ -1,12 +1,14 @@
1
1
  import {
2
- JsonRpcTransportHandler,
2
+ JsonRpcTransportHandler
3
+ } from "../chunk-S53FFHPM.js";
4
+ import {
3
5
  ServerCallContext,
4
6
  UnauthenticatedUser
5
- } from "../chunk-NUQQPJNY.js";
7
+ } from "../chunk-F6ACNKFR.js";
8
+ import "../chunk-ZX6KNMCP.js";
6
9
  import {
7
10
  A2AError
8
11
  } from "../chunk-UHZEIZLS.js";
9
- import "../chunk-ZX6KNMCP.js";
10
12
 
11
13
  // src/server/agent_execution/request_context.ts
12
14
  var RequestContext = class {
@@ -540,7 +542,7 @@ var DefaultPushNotificationSender = class {
540
542
  await Promise.all(dispatches);
541
543
  });
542
544
  this.notificationChain.set(task.id, newPromise);
543
- newPromise.finally(() => {
545
+ return newPromise.finally(() => {
544
546
  if (this.notificationChain.get(task.id) === newPromise) {
545
547
  this.notificationChain.delete(task.id);
546
548
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a2a-js/sdk",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "description": "Server & Client SDK for Agent2Agent protocol",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -21,8 +21,14 @@
21
21
  "server/express": [
22
22
  "./dist/server/express/index.d.ts"
23
23
  ],
24
+ "server/grpc": [
25
+ "./dist/server/grpc/index.d.ts"
26
+ ],
24
27
  "client": [
25
28
  "./dist/client/index.d.ts"
29
+ ],
30
+ "client/grpc": [
31
+ "./dist/client/transports/grpc/index.d.ts"
26
32
  ]
27
33
  }
28
34
  },
@@ -42,10 +48,20 @@
42
48
  "import": "./dist/server/express/index.js",
43
49
  "require": "./dist/server/express/index.cjs"
44
50
  },
51
+ "./server/grpc": {
52
+ "types": "./dist/server/grpc/index.d.ts",
53
+ "import": "./dist/server/grpc/index.js",
54
+ "require": "./dist/server/grpc/index.cjs"
55
+ },
45
56
  "./client": {
46
57
  "types": "./dist/client/index.d.ts",
47
58
  "import": "./dist/client/index.js",
48
59
  "require": "./dist/client/index.cjs"
60
+ },
61
+ "./client/grpc": {
62
+ "types": "./dist/client/transports/grpc/index.d.ts",
63
+ "import": "./dist/client/transports/grpc/index.js",
64
+ "require": "./dist/client/transports/grpc/index.cjs"
49
65
  }
50
66
  },
51
67
  "files": [
@@ -54,8 +70,11 @@
54
70
  "README.md"
55
71
  ],
56
72
  "devDependencies": {
57
- "@cloudflare/vitest-pool-workers": "^0.10.15",
73
+ "@bufbuild/buf": "^1.61.0",
74
+ "@bufbuild/protobuf": "^2.10.2",
75
+ "@cloudflare/vitest-pool-workers": "^0.12.5",
58
76
  "@eslint/js": "^9.39.1",
77
+ "@grpc/grpc-js": "^1.11.0",
59
78
  "@types/express": "^5.0.3",
60
79
  "@types/node": "^22.13.14",
61
80
  "@types/supertest": "^6.0.3",
@@ -65,7 +84,6 @@
65
84
  "eslint-config-prettier": "^10.1.8",
66
85
  "eslint-plugin-prettier": "^5.5.4",
67
86
  "express": "^5.1.0",
68
- "gts": "^6.0.2",
69
87
  "json-schema-to-typescript": "^15.0.4",
70
88
  "prettier": "^3.6.2",
71
89
  "supertest": "^7.1.4",
@@ -76,7 +94,6 @@
76
94
  "vitest": "^3.2.4"
77
95
  },
78
96
  "scripts": {
79
- "clean": "gts clean",
80
97
  "build": "tsup",
81
98
  "test": "vitest run",
82
99
  "test:edge": "vitest run --config vitest.edge.config.ts",
@@ -91,11 +108,19 @@
91
108
  "uuid": "^11.1.0"
92
109
  },
93
110
  "peerDependencies": {
111
+ "@bufbuild/protobuf": "^2.10.2",
112
+ "@grpc/grpc-js": "^1.11.0",
94
113
  "express": "^4.21.2 || ^5.1.0"
95
114
  },
96
115
  "peerDependenciesMeta": {
97
116
  "express": {
98
117
  "optional": true
118
+ },
119
+ "@grpc/grpc-js": {
120
+ "optional": true
121
+ },
122
+ "@bufbuild/protobuf": {
123
+ "optional": true
99
124
  }
100
125
  }
101
126
  }