@modelcontextprotocol/sdk 0.4.0

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.
Files changed (71) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +110 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +116 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client/index.d.ts +762 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +110 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/index.test.d.ts +2 -0
  12. package/dist/client/index.test.d.ts.map +1 -0
  13. package/dist/client/index.test.js +59 -0
  14. package/dist/client/index.test.js.map +1 -0
  15. package/dist/client/sse.d.ts +22 -0
  16. package/dist/client/sse.d.ts.map +1 -0
  17. package/dist/client/sse.js +91 -0
  18. package/dist/client/sse.js.map +1 -0
  19. package/dist/client/stdio.d.ts +49 -0
  20. package/dist/client/stdio.d.ts.map +1 -0
  21. package/dist/client/stdio.js +134 -0
  22. package/dist/client/stdio.js.map +1 -0
  23. package/dist/client/stdio.test.d.ts +2 -0
  24. package/dist/client/stdio.test.d.ts.map +1 -0
  25. package/dist/client/stdio.test.js +51 -0
  26. package/dist/client/stdio.test.js.map +1 -0
  27. package/dist/client/websocket.d.ts +17 -0
  28. package/dist/client/websocket.d.ts.map +1 -0
  29. package/dist/client/websocket.js +61 -0
  30. package/dist/client/websocket.js.map +1 -0
  31. package/dist/server/index.d.ts +102 -0
  32. package/dist/server/index.d.ts.map +1 -0
  33. package/dist/server/index.js +106 -0
  34. package/dist/server/index.js.map +1 -0
  35. package/dist/server/index.test.d.ts +2 -0
  36. package/dist/server/index.test.d.ts.map +1 -0
  37. package/dist/server/index.test.js +53 -0
  38. package/dist/server/index.test.js.map +1 -0
  39. package/dist/server/sse.d.ts +46 -0
  40. package/dist/server/sse.d.ts.map +1 -0
  41. package/dist/server/sse.js +116 -0
  42. package/dist/server/sse.js.map +1 -0
  43. package/dist/server/stdio.d.ts +28 -0
  44. package/dist/server/stdio.d.ts.map +1 -0
  45. package/dist/server/stdio.js +69 -0
  46. package/dist/server/stdio.js.map +1 -0
  47. package/dist/server/stdio.test.d.ts +2 -0
  48. package/dist/server/stdio.test.d.ts.map +1 -0
  49. package/dist/server/stdio.test.js +87 -0
  50. package/dist/server/stdio.test.js.map +1 -0
  51. package/dist/shared/protocol.d.ts +92 -0
  52. package/dist/shared/protocol.d.ts.map +1 -0
  53. package/dist/shared/protocol.js +225 -0
  54. package/dist/shared/protocol.js.map +1 -0
  55. package/dist/shared/stdio.d.ts +13 -0
  56. package/dist/shared/stdio.d.ts.map +1 -0
  57. package/dist/shared/stdio.js +31 -0
  58. package/dist/shared/stdio.js.map +1 -0
  59. package/dist/shared/stdio.test.d.ts +2 -0
  60. package/dist/shared/stdio.test.d.ts.map +1 -0
  61. package/dist/shared/stdio.test.js +27 -0
  62. package/dist/shared/stdio.test.js.map +1 -0
  63. package/dist/shared/transport.d.ts +39 -0
  64. package/dist/shared/transport.d.ts.map +1 -0
  65. package/dist/shared/transport.js +2 -0
  66. package/dist/shared/transport.js.map +1 -0
  67. package/dist/types.d.ts +26033 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +967 -0
  70. package/dist/types.js.map +1 -0
  71. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,iCAAiC,EACjC,eAAe,EAGf,gBAAgB,EAEhB,cAAc,EAGd,kBAAkB,EAElB,oBAAoB,EAEpB,4BAA4B,EAE5B,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EAEnB,OAAO,EACP,MAAM,EACN,kBAAkB,EAClB,gBAAgB,EAEhB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,MAAM,CACjB,QAAQ,SAAS,OAAO,GAAG,OAAO,EAClC,aAAa,SAAS,YAAY,GAAG,YAAY,EACjD,OAAO,SAAS,MAAM,GAAG,MAAM,CAC/B,SAAQ,QAAQ,CAChB,aAAa,GAAG,QAAQ,EACxB,kBAAkB,GAAG,aAAa,EAClC,YAAY,GAAG,OAAO,CACvB;IAOa,OAAO,CAAC,WAAW;IAN/B,OAAO,CAAC,mBAAmB,CAAC,CAAqB;IACjD,OAAO,CAAC,cAAc,CAAC,CAAiB;IAExC;;OAEG;gBACiB,WAAW,EAAE,cAAc;IAIhC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC3D;;OAEG;IACH,qBAAqB,IAAI,kBAAkB,GAAG,SAAS;IAIvD;;OAEG;IACH,gBAAgB,IAAI,cAAc,GAAG,SAAS;IAIxC,IAAI;;;IAIJ,QAAQ,CACZ,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EACjC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;IASzB,eAAe,CAAC,KAAK,EAAE,YAAY;;;IAOnC,SAAS,CACb,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAClC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASzB,WAAW,CACf,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EACrC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASzB,aAAa,CACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EACvC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;IASzB,qBAAqB,CACzB,MAAM,CAAC,EAAE,4BAA4B,CAAC,QAAQ,CAAC,EAC/C,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;IASzB,YAAY,CAChB,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASzB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC;;;IAOpD,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC;;;IAOxD,QAAQ,CACZ,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EACjC,YAAY,GAAE,OAAO,oBAAoB,GAAG,OAAO,iCAAwD,EAC3G,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASzB,SAAS,CACb,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACnC,UAAU,CAAC,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASzB,oBAAoB;CAG3B"}
@@ -0,0 +1,110 @@
1
+ import { Protocol } from "../shared/protocol.js";
2
+ import { CallToolResultSchema, CompleteResultSchema, EmptyResultSchema, GetPromptResultSchema, InitializeResultSchema, LATEST_PROTOCOL_VERSION, ListPromptsResultSchema, ListResourcesResultSchema, ListResourceTemplatesResultSchema, ListToolsResultSchema, ReadResourceResultSchema, SUPPORTED_PROTOCOL_VERSIONS } from "../types.js";
3
+ /**
4
+ * An MCP client on top of a pluggable transport.
5
+ *
6
+ * The client will automatically begin the initialization flow with the server when connect() is called.
7
+ *
8
+ * To use with custom types, extend the base Request/Notification/Result types and pass them as type parameters:
9
+ *
10
+ * ```typescript
11
+ * // Custom schemas
12
+ * const CustomRequestSchema = RequestSchema.extend({...})
13
+ * const CustomNotificationSchema = NotificationSchema.extend({...})
14
+ * const CustomResultSchema = ResultSchema.extend({...})
15
+ *
16
+ * // Type aliases
17
+ * type CustomRequest = z.infer<typeof CustomRequestSchema>
18
+ * type CustomNotification = z.infer<typeof CustomNotificationSchema>
19
+ * type CustomResult = z.infer<typeof CustomResultSchema>
20
+ *
21
+ * // Create typed client
22
+ * const client = new Client<CustomRequest, CustomNotification, CustomResult>({
23
+ * name: "CustomClient",
24
+ * version: "1.0.0"
25
+ * })
26
+ * ```
27
+ */
28
+ export class Client extends Protocol {
29
+ /**
30
+ * Initializes this client with the given name and version information.
31
+ */
32
+ constructor(_clientInfo) {
33
+ super();
34
+ this._clientInfo = _clientInfo;
35
+ }
36
+ async connect(transport) {
37
+ await super.connect(transport);
38
+ const result = await this.request({
39
+ method: "initialize",
40
+ params: {
41
+ protocolVersion: LATEST_PROTOCOL_VERSION,
42
+ capabilities: {},
43
+ clientInfo: this._clientInfo,
44
+ },
45
+ }, InitializeResultSchema);
46
+ if (result === undefined) {
47
+ throw new Error(`Server sent invalid initialize result: ${result}`);
48
+ }
49
+ if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {
50
+ throw new Error(`Server's protocol version is not supported: ${result.protocolVersion}`);
51
+ }
52
+ this._serverCapabilities = result.capabilities;
53
+ this._serverVersion = result.serverInfo;
54
+ await this.notification({
55
+ method: "notifications/initialized",
56
+ });
57
+ }
58
+ /**
59
+ * After initialization has completed, this will be populated with the server's reported capabilities.
60
+ */
61
+ getServerCapabilities() {
62
+ return this._serverCapabilities;
63
+ }
64
+ /**
65
+ * After initialization has completed, this will be populated with information about the server's name and version.
66
+ */
67
+ getServerVersion() {
68
+ return this._serverVersion;
69
+ }
70
+ async ping() {
71
+ return this.request({ method: "ping" }, EmptyResultSchema);
72
+ }
73
+ async complete(params, onprogress) {
74
+ return this.request({ method: "completion/complete", params }, CompleteResultSchema, onprogress);
75
+ }
76
+ async setLoggingLevel(level) {
77
+ return this.request({ method: "logging/setLevel", params: { level } }, EmptyResultSchema);
78
+ }
79
+ async getPrompt(params, onprogress) {
80
+ return this.request({ method: "prompts/get", params }, GetPromptResultSchema, onprogress);
81
+ }
82
+ async listPrompts(params, onprogress) {
83
+ return this.request({ method: "prompts/list", params }, ListPromptsResultSchema, onprogress);
84
+ }
85
+ async listResources(params, onprogress) {
86
+ return this.request({ method: "resources/list", params }, ListResourcesResultSchema, onprogress);
87
+ }
88
+ async listResourceTemplates(params, onprogress) {
89
+ return this.request({ method: "resources/templates/list", params }, ListResourceTemplatesResultSchema, onprogress);
90
+ }
91
+ async readResource(params, onprogress) {
92
+ return this.request({ method: "resources/read", params }, ReadResourceResultSchema, onprogress);
93
+ }
94
+ async subscribeResource(params) {
95
+ return this.request({ method: "resources/subscribe", params }, EmptyResultSchema);
96
+ }
97
+ async unsubscribeResource(params) {
98
+ return this.request({ method: "resources/unsubscribe", params }, EmptyResultSchema);
99
+ }
100
+ async callTool(params, resultSchema = CallToolResultSchema, onprogress) {
101
+ return this.request({ method: "tools/call", params }, resultSchema, onprogress);
102
+ }
103
+ async listTools(params, onprogress) {
104
+ return this.request({ method: "tools/list", params }, ListToolsResultSchema, onprogress);
105
+ }
106
+ async sendRootsListChanged() {
107
+ return this.notification({ method: "notifications/roots/list_changed" });
108
+ }
109
+ }
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/client/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /* eslint-disable no-constant-binary-expression */
3
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
4
+ import { Client } from "./index.js";
5
+ import { z } from "zod";
6
+ import { RequestSchema, NotificationSchema, ResultSchema } from "../types.js";
7
+ /*
8
+ Test that custom request/notification/result schemas can be used with the Client class.
9
+ */
10
+ test("should typecheck", () => {
11
+ const GetWeatherRequestSchema = RequestSchema.extend({
12
+ method: z.literal("weather/get"),
13
+ params: z.object({
14
+ city: z.string(),
15
+ }),
16
+ });
17
+ const GetForecastRequestSchema = RequestSchema.extend({
18
+ method: z.literal("weather/forecast"),
19
+ params: z.object({
20
+ city: z.string(),
21
+ days: z.number(),
22
+ }),
23
+ });
24
+ const WeatherForecastNotificationSchema = NotificationSchema.extend({
25
+ method: z.literal("weather/alert"),
26
+ params: z.object({
27
+ severity: z.enum(["warning", "watch"]),
28
+ message: z.string(),
29
+ }),
30
+ });
31
+ const WeatherRequestSchema = GetWeatherRequestSchema.or(GetForecastRequestSchema);
32
+ const WeatherNotificationSchema = WeatherForecastNotificationSchema;
33
+ const WeatherResultSchema = ResultSchema.extend({
34
+ temperature: z.number(),
35
+ conditions: z.string(),
36
+ });
37
+ // Create a typed Client for weather data
38
+ const weatherClient = new Client({
39
+ name: "WeatherClient",
40
+ version: "1.0.0",
41
+ });
42
+ // Typecheck that only valid weather requests/notifications/results are allowed
43
+ false &&
44
+ weatherClient.request({
45
+ method: "weather/get",
46
+ params: {
47
+ city: "Seattle",
48
+ },
49
+ }, WeatherResultSchema);
50
+ false &&
51
+ weatherClient.notification({
52
+ method: "weather/alert",
53
+ params: {
54
+ severity: "warning",
55
+ message: "Storm approaching",
56
+ },
57
+ });
58
+ });
59
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/client/index.test.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,kDAAkD;AAClD,6DAA6D;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9E;;EAEE;AACF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,uBAAuB,GAAG,aAAa,CAAC,MAAM,CAAC;QACnD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAG,aAAa,CAAC,MAAM,CAAC;QACpD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,iCAAiC,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,EAAE,CACrD,wBAAwB,CACzB,CAAC;IACF,MAAM,yBAAyB,GAAG,iCAAiC,CAAC;IACpE,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAC;QAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IAMH,yCAAyC;IACzC,MAAM,aAAa,GAAG,IAAI,MAAM,CAI9B;QACA,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,+EAA+E;IAC/E,KAAK;QACH,aAAa,CAAC,OAAO,CACnB;YACE,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;aAChB;SACF,EACD,mBAAmB,CACpB,CAAC;IAEJ,KAAK;QACH,aAAa,CAAC,YAAY,CAAC;YACzB,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE;gBACN,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,mBAAmB;aAC7B;SACF,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Transport } from "../shared/transport.js";
2
+ import { JSONRPCMessage } from "../types.js";
3
+ /**
4
+ * Client transport for SSE: this will connect to a server using Server-Sent Events for receiving
5
+ * messages and make separate POST requests for sending messages.
6
+ *
7
+ * This uses the EventSource API in browsers. You can install the `eventsource` package for Node.js.
8
+ */
9
+ export declare class SSEClientTransport implements Transport {
10
+ private _eventSource?;
11
+ private _endpoint?;
12
+ private _abortController?;
13
+ private _url;
14
+ onclose?: () => void;
15
+ onerror?: (error: Error) => void;
16
+ onmessage?: (message: JSONRPCMessage) => void;
17
+ constructor(url: URL);
18
+ start(): Promise<void>;
19
+ close(): Promise<void>;
20
+ send(message: JSONRPCMessage): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/client/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,SAAS,CAAC,CAAM;IACxB,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,IAAI,CAAM;IAElB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,GAAG,EAAE,GAAG;IAIpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA0BnD"}
@@ -0,0 +1,91 @@
1
+ import { JSONRPCMessageSchema } from "../types.js";
2
+ /**
3
+ * Client transport for SSE: this will connect to a server using Server-Sent Events for receiving
4
+ * messages and make separate POST requests for sending messages.
5
+ *
6
+ * This uses the EventSource API in browsers. You can install the `eventsource` package for Node.js.
7
+ */
8
+ export class SSEClientTransport {
9
+ constructor(url) {
10
+ this._url = url;
11
+ }
12
+ start() {
13
+ if (this._eventSource) {
14
+ throw new Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");
15
+ }
16
+ return new Promise((resolve, reject) => {
17
+ this._eventSource = new EventSource(this._url.href);
18
+ this._abortController = new AbortController();
19
+ this._eventSource.onerror = (event) => {
20
+ var _a;
21
+ const error = new Error(`SSE error: ${JSON.stringify(event)}`);
22
+ reject(error);
23
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
24
+ };
25
+ this._eventSource.onopen = () => {
26
+ // The connection is open, but we need to wait for the endpoint to be received.
27
+ };
28
+ this._eventSource.addEventListener("endpoint", (event) => {
29
+ var _a;
30
+ const messageEvent = event;
31
+ try {
32
+ this._endpoint = new URL(messageEvent.data, this._url);
33
+ if (this._endpoint.origin !== this._url.origin) {
34
+ throw new Error(`Endpoint origin does not match connection origin: ${this._endpoint.origin}`);
35
+ }
36
+ }
37
+ catch (error) {
38
+ reject(error);
39
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
40
+ void this.close();
41
+ return;
42
+ }
43
+ resolve();
44
+ });
45
+ this._eventSource.onmessage = (event) => {
46
+ var _a, _b;
47
+ const messageEvent = event;
48
+ let message;
49
+ try {
50
+ message = JSONRPCMessageSchema.parse(JSON.parse(messageEvent.data));
51
+ }
52
+ catch (error) {
53
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
54
+ return;
55
+ }
56
+ (_b = this.onmessage) === null || _b === void 0 ? void 0 : _b.call(this, message);
57
+ };
58
+ });
59
+ }
60
+ async close() {
61
+ var _a, _b, _c;
62
+ (_a = this._abortController) === null || _a === void 0 ? void 0 : _a.abort();
63
+ (_b = this._eventSource) === null || _b === void 0 ? void 0 : _b.close();
64
+ (_c = this.onclose) === null || _c === void 0 ? void 0 : _c.call(this);
65
+ }
66
+ async send(message) {
67
+ var _a, _b;
68
+ if (!this._endpoint) {
69
+ throw new Error("Not connected");
70
+ }
71
+ try {
72
+ const response = await fetch(this._endpoint, {
73
+ method: "POST",
74
+ headers: {
75
+ "Content-Type": "application/json",
76
+ },
77
+ body: JSON.stringify(message),
78
+ signal: (_a = this._abortController) === null || _a === void 0 ? void 0 : _a.signal,
79
+ });
80
+ if (!response.ok) {
81
+ const text = await response.text().catch(() => null);
82
+ throw new Error(`Error POSTing to endpoint (HTTP ${response.status}): ${text}`);
83
+ }
84
+ }
85
+ catch (error) {
86
+ (_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
87
+ throw error;
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/client/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { JSONRPCMessage } from "../types.js";
2
+ import { Transport } from "../shared/transport.js";
3
+ export type StdioServerParameters = {
4
+ /**
5
+ * The executable to run to start the server.
6
+ */
7
+ command: string;
8
+ /**
9
+ * Command line arguments to pass to the executable.
10
+ */
11
+ args?: string[];
12
+ /**
13
+ * The environment to use when spawning the process.
14
+ *
15
+ * If not specified, the result of getDefaultEnvironment() will be used.
16
+ */
17
+ env?: Record<string, string>;
18
+ };
19
+ /**
20
+ * Environment variables to inherit by default, if an environment is not explicitly given.
21
+ */
22
+ export declare const DEFAULT_INHERITED_ENV_VARS: string[];
23
+ /**
24
+ * Returns a default environment object including only environment variables deemed safe to inherit.
25
+ */
26
+ export declare function getDefaultEnvironment(): Record<string, string>;
27
+ /**
28
+ * Client transport for stdio: this will connect to a server by spawning a process and communicating with it over stdin/stdout.
29
+ *
30
+ * This transport is only available in Node.js environments.
31
+ */
32
+ export declare class StdioClientTransport implements Transport {
33
+ private _process?;
34
+ private _abortController;
35
+ private _readBuffer;
36
+ private _serverParams;
37
+ onclose?: () => void;
38
+ onerror?: (error: Error) => void;
39
+ onmessage?: (message: JSONRPCMessage) => void;
40
+ constructor(server: StdioServerParameters);
41
+ /**
42
+ * Starts the server process and prepares to communicate with it.
43
+ */
44
+ start(): Promise<void>;
45
+ private processReadBuffer;
46
+ close(): Promise<void>;
47
+ send(message: JSONRPCMessage): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBmB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,MAAM,EAAE,qBAAqB;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7C"}
@@ -0,0 +1,134 @@
1
+ import { spawn } from "node:child_process";
2
+ import process from "node:process";
3
+ import { ReadBuffer, serializeMessage } from "../shared/stdio.js";
4
+ /**
5
+ * Environment variables to inherit by default, if an environment is not explicitly given.
6
+ */
7
+ export const DEFAULT_INHERITED_ENV_VARS = process.platform === "win32"
8
+ ? [
9
+ "APPDATA",
10
+ "HOMEDRIVE",
11
+ "HOMEPATH",
12
+ "LOCALAPPDATA",
13
+ "PATH",
14
+ "PROCESSOR_ARCHITECTURE",
15
+ "SYSTEMDRIVE",
16
+ "SYSTEMROOT",
17
+ "TEMP",
18
+ "USERNAME",
19
+ "USERPROFILE",
20
+ ]
21
+ : /* list inspired by the default env inheritance of sudo */
22
+ ["HOME", "LOGNAME", "PATH", "SHELL", "TERM", "USER"];
23
+ /**
24
+ * Returns a default environment object including only environment variables deemed safe to inherit.
25
+ */
26
+ export function getDefaultEnvironment() {
27
+ const env = {};
28
+ for (const key of DEFAULT_INHERITED_ENV_VARS) {
29
+ const value = process.env[key];
30
+ if (value === undefined) {
31
+ continue;
32
+ }
33
+ if (value.startsWith("()")) {
34
+ // Skip functions, which are a security risk.
35
+ continue;
36
+ }
37
+ env[key] = value;
38
+ }
39
+ return env;
40
+ }
41
+ /**
42
+ * Client transport for stdio: this will connect to a server by spawning a process and communicating with it over stdin/stdout.
43
+ *
44
+ * This transport is only available in Node.js environments.
45
+ */
46
+ export class StdioClientTransport {
47
+ constructor(server) {
48
+ this._abortController = new AbortController();
49
+ this._readBuffer = new ReadBuffer();
50
+ this._serverParams = server;
51
+ }
52
+ /**
53
+ * Starts the server process and prepares to communicate with it.
54
+ */
55
+ async start() {
56
+ if (this._process) {
57
+ throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");
58
+ }
59
+ return new Promise((resolve, reject) => {
60
+ var _a, _b, _c, _d, _e;
61
+ this._process = spawn(this._serverParams.command, (_a = this._serverParams.args) !== null && _a !== void 0 ? _a : [], {
62
+ env: (_b = this._serverParams.env) !== null && _b !== void 0 ? _b : getDefaultEnvironment(),
63
+ stdio: ["pipe", "pipe", "inherit"],
64
+ signal: this._abortController.signal,
65
+ });
66
+ this._process.on("error", (error) => {
67
+ var _a, _b;
68
+ if (error.name === "AbortError") {
69
+ // Expected when close() is called.
70
+ (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
71
+ return;
72
+ }
73
+ reject(error);
74
+ (_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
75
+ });
76
+ this._process.on("spawn", () => {
77
+ resolve();
78
+ });
79
+ this._process.on("close", (_code) => {
80
+ var _a;
81
+ this._process = undefined;
82
+ (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
83
+ });
84
+ (_c = this._process.stdin) === null || _c === void 0 ? void 0 : _c.on("error", (error) => {
85
+ var _a;
86
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
87
+ });
88
+ (_d = this._process.stdout) === null || _d === void 0 ? void 0 : _d.on("data", (chunk) => {
89
+ this._readBuffer.append(chunk);
90
+ this.processReadBuffer();
91
+ });
92
+ (_e = this._process.stdout) === null || _e === void 0 ? void 0 : _e.on("error", (error) => {
93
+ var _a;
94
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
95
+ });
96
+ });
97
+ }
98
+ processReadBuffer() {
99
+ var _a, _b;
100
+ while (true) {
101
+ try {
102
+ const message = this._readBuffer.readMessage();
103
+ if (message === null) {
104
+ break;
105
+ }
106
+ (_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, message);
107
+ }
108
+ catch (error) {
109
+ (_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
110
+ }
111
+ }
112
+ }
113
+ async close() {
114
+ this._abortController.abort();
115
+ this._process = undefined;
116
+ this._readBuffer.clear();
117
+ }
118
+ send(message) {
119
+ return new Promise((resolve) => {
120
+ var _a;
121
+ if (!((_a = this._process) === null || _a === void 0 ? void 0 : _a.stdin)) {
122
+ throw new Error("Not connected");
123
+ }
124
+ const json = serializeMessage(message);
125
+ if (this._process.stdin.write(json)) {
126
+ resolve();
127
+ }
128
+ else {
129
+ this._process.stdin.once("drain", resolve);
130
+ }
131
+ });
132
+ }
133
+ }
134
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAuBlE;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC1B,CAAC,CAAC;QACE,SAAS;QACT,WAAW;QACX,UAAU;QACV,cAAc;QACd,MAAM;QACN,wBAAwB;QACxB,aAAa;QACb,YAAY;QACZ,MAAM;QACN,UAAU;QACV,aAAa;KACd;IACH,CAAC,CAAC,0DAA0D;QAC1D,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,6CAA6C;YAC7C,SAAS;QACX,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAU/B,YAAY,MAA6B;QARjC,qBAAgB,GAAoB,IAAI,eAAe,EAAE,CAAC;QAC1D,gBAAW,GAAe,IAAI,UAAU,EAAE,CAAC;QAQjD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;;YACrC,IAAI,CAAC,QAAQ,GAAG,KAAK,CACnB,IAAI,CAAC,aAAa,CAAC,OAAO,EAC1B,MAAA,IAAI,CAAC,aAAa,CAAC,IAAI,mCAAI,EAAE,EAC7B;gBACE,GAAG,EAAE,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,mCAAI,qBAAqB,EAAE;gBACtD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;gBAClC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM;aACrC,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;;gBAClC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAChC,mCAAmC;oBACnC,MAAA,IAAI,CAAC,OAAO,oDAAI,CAAC;oBACjB,OAAO;gBACT,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;;gBAClC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,MAAA,IAAI,CAAC,OAAO,oDAAI,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,0CAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;;gBACzC,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;;gBAC1C,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB;;QACvB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,MAAM;gBACR,CAAC;gBAED,MAAA,IAAI,CAAC,SAAS,qDAAG,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAc,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,OAAuB;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;;YAC7B,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,KAAK,CAAA,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stdio.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.test.d.ts","sourceRoot":"","sources":["../../src/client/stdio.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { StdioClientTransport } from "./stdio.js";
2
+ const serverParameters = {
3
+ command: "/usr/bin/tee",
4
+ };
5
+ test("should start then close cleanly", async () => {
6
+ const client = new StdioClientTransport(serverParameters);
7
+ client.onerror = (error) => {
8
+ throw error;
9
+ };
10
+ let didClose = false;
11
+ client.onclose = () => {
12
+ didClose = true;
13
+ };
14
+ await client.start();
15
+ expect(didClose).toBeFalsy();
16
+ await client.close();
17
+ expect(didClose).toBeTruthy();
18
+ });
19
+ test("should read messages", async () => {
20
+ const client = new StdioClientTransport(serverParameters);
21
+ client.onerror = (error) => {
22
+ throw error;
23
+ };
24
+ const messages = [
25
+ {
26
+ jsonrpc: "2.0",
27
+ id: 1,
28
+ method: "ping",
29
+ },
30
+ {
31
+ jsonrpc: "2.0",
32
+ method: "notifications/initialized",
33
+ },
34
+ ];
35
+ const readMessages = [];
36
+ const finished = new Promise((resolve) => {
37
+ client.onmessage = (message) => {
38
+ readMessages.push(message);
39
+ if (JSON.stringify(message) === JSON.stringify(messages[1])) {
40
+ resolve();
41
+ }
42
+ };
43
+ });
44
+ await client.start();
45
+ await client.send(messages[0]);
46
+ await client.send(messages[1]);
47
+ await finished;
48
+ expect(readMessages).toEqual(messages);
49
+ await client.close();
50
+ });
51
+ //# sourceMappingURL=stdio.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.test.js","sourceRoot":"","sources":["../../src/client/stdio.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,YAAY,CAAC;AAEzE,MAAM,gBAAgB,GAA0B;IAC9C,OAAO,EAAE,cAAc;CACxB,CAAC;AAEF,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;QACzB,MAAM,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;QACpB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IACtC,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;QACzB,MAAM,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAqB;QACjC;YACE,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,MAAM;SACf;QACD;YACE,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,2BAA2B;SACpC;KACF,CAAC;IAEF,MAAM,YAAY,GAAqB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC7C,MAAM,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE;YAC7B,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,QAAQ,CAAC;IACf,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Transport } from "../shared/transport.js";
2
+ import { JSONRPCMessage } from "../types.js";
3
+ /**
4
+ * Client transport for WebSocket: this will connect to a server over the WebSocket protocol.
5
+ */
6
+ export declare class WebSocketClientTransport implements Transport {
7
+ private _socket?;
8
+ private _url;
9
+ onclose?: () => void;
10
+ onerror?: (error: Error) => void;
11
+ onmessage?: (message: JSONRPCMessage) => void;
12
+ constructor(url: URL);
13
+ start(): Promise<void>;
14
+ close(): Promise<void>;
15
+ send(message: JSONRPCMessage): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/client/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAInE;;GAEG;AACH,qBAAa,wBAAyB,YAAW,SAAS;IACxD,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,IAAI,CAAM;IAElB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,GAAG,EAAE,GAAG;IAIpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyChB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7C"}