From 9923aecf293b09c115d8ff001df1366ffbf4f8ee Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Thu, 23 Jan 2025 17:29:46 +0000 Subject: [PATCH 1/2] Report SSE error codes --- src/client/sse.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client/sse.ts b/src/client/sse.ts index 932e7e20..d98a30ad 100644 --- a/src/client/sse.ts +++ b/src/client/sse.ts @@ -1,6 +1,6 @@ +import { EventSource, type EventSourceInit } from "eventsource"; 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 @@ -42,7 +42,10 @@ export class SSEClientTransport implements Transport { this._abortController = new AbortController(); this._eventSource.onerror = (event) => { - const error = new Error(`SSE error: ${JSON.stringify(event)}`); + const message = `SSE error: ${event.message}`; + const error = new Error(message); + Object.assign(error, { code: event.code }); + reject(error); this.onerror?.(error); }; From 63f8f07a22f4a356ef8bcc2907bed9e2375616f5 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Fri, 24 Jan 2025 11:26:12 +0000 Subject: [PATCH 2/2] Add `SseError` class for easier introspection --- src/client/sse.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/client/sse.ts b/src/client/sse.ts index d98a30ad..14921f57 100644 --- a/src/client/sse.ts +++ b/src/client/sse.ts @@ -1,7 +1,17 @@ -import { EventSource, type EventSourceInit } from "eventsource"; +import { EventSource, type ErrorEvent, type EventSourceInit } from "eventsource"; import { Transport } from "../shared/transport.js"; import { JSONRPCMessage, JSONRPCMessageSchema } from "../types.js"; +export class SseError extends Error { + constructor( + public readonly code: number | undefined, + message: string | undefined, + public readonly event: ErrorEvent, + ) { + super(`SSE error: ${message}`); + } +} + /** * 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. @@ -42,10 +52,7 @@ export class SSEClientTransport implements Transport { this._abortController = new AbortController(); this._eventSource.onerror = (event) => { - const message = `SSE error: ${event.message}`; - const error = new Error(message); - Object.assign(error, { code: event.code }); - + const error = new SseError(event.code, event.message, event); reject(error); this.onerror?.(error); };