Use eventsource package

This commit is contained in:
Justin Spahr-Summers 2025-01-22 18:49:04 +00:00
commit c828067171
No known key found for this signature in database
4 changed files with 31 additions and 17 deletions

28
package-lock.json generated
View file

@ -1,15 +1,16 @@
{
"name": "@modelcontextprotocol/sdk",
"version": "1.3.1",
"version": "1.3.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@modelcontextprotocol/sdk",
"version": "1.3.1",
"version": "1.3.2",
"license": "MIT",
"dependencies": {
"content-type": "^1.0.5",
"eventsource": "^3.0.2",
"raw-body": "^3.0.0",
"zod": "^3.23.8",
"zod-to-json-schema": "^3.24.1"
@ -24,7 +25,6 @@
"@types/node": "^22.0.2",
"@types/ws": "^8.5.12",
"eslint": "^9.8.0",
"eventsource": "^2.0.2",
"express": "^4.19.2",
"jest": "^29.7.0",
"ts-jest": "^29.2.4",
@ -3066,12 +3066,24 @@
}
},
"node_modules/eventsource": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
"integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
"dev": true,
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.2.tgz",
"integrity": "sha512-YolzkJNxsTL3tCJMWFxpxtG2sCjbZ4LQUBUrkdaJK0ub0p6lmJt+2+1SwhKjLc652lpH9L/79Ptez972H9tphw==",
"license": "MIT",
"dependencies": {
"eventsource-parser": "^3.0.0"
},
"engines": {
"node": ">=12.0.0"
"node": ">=18.0.0"
}
},
"node_modules/eventsource-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz",
"integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
}
},
"node_modules/execa": {

View file

@ -47,6 +47,7 @@
},
"dependencies": {
"content-type": "^1.0.5",
"eventsource": "^3.0.2",
"raw-body": "^3.0.0",
"zod": "^3.23.8",
"zod-to-json-schema": "^3.24.1"
@ -61,7 +62,6 @@
"@types/node": "^22.0.2",
"@types/ws": "^8.5.12",
"eslint": "^9.8.0",
"eventsource": "^2.0.2",
"express": "^4.19.2",
"jest": "^29.7.0",
"ts-jest": "^29.2.4",

View file

@ -1,8 +1,5 @@
import EventSource from "eventsource";
import WebSocket from "ws";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(global as any).EventSource = EventSource;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(global as any).WebSocket = WebSocket;

View file

@ -1,11 +1,10 @@
import { Transport } from "../shared/transport.js";
import { JSONRPCMessage, JSONRPCMessageSchema } from "../types.js";
import { EventSource, type EventSourceInit } from "eventsource";
/**
* Client transport for SSE: this will connect to a server using Server-Sent Events for receiving
* messages and make separate POST requests for sending messages.
*
* This uses the EventSource API in browsers. You can install the `eventsource` package for Node.js.
*/
export class SSEClientTransport implements Transport {
private _eventSource?: EventSource;
@ -19,7 +18,10 @@ export class SSEClientTransport implements Transport {
onerror?: (error: Error) => void;
onmessage?: (message: JSONRPCMessage) => void;
constructor(url: URL, opts?: { eventSourceInit?: EventSourceInit, requestInit?: RequestInit }) {
constructor(
url: URL,
opts?: { eventSourceInit?: EventSourceInit; requestInit?: RequestInit },
) {
this._url = url;
this._eventSourceInit = opts?.eventSourceInit;
this._requestInit = opts?.requestInit;
@ -33,7 +35,10 @@ export class SSEClientTransport implements Transport {
}
return new Promise((resolve, reject) => {
this._eventSource = new EventSource(this._url.href, this._eventSourceInit);
this._eventSource = new EventSource(
this._url.href,
this._eventSourceInit,
);
this._abortController = new AbortController();
this._eventSource.onerror = (event) => {
@ -101,7 +106,7 @@ export class SSEClientTransport implements Transport {
method: "POST",
headers,
body: JSON.stringify(message),
signal: this._abortController?.signal
signal: this._abortController?.signal,
};
const response = await fetch(this._endpoint, init);