From 44c9bffa8511372b760dc5edb78650563053b18f Mon Sep 17 00:00:00 2001 From: Jason Victor Date: Sun, 23 Feb 2025 12:39:15 -0500 Subject: [PATCH] added session id to request handler extra data --- src/server/sse.ts | 2 -- src/shared/protocol.ts | 13 ++++++++++++- src/shared/transport.ts | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/server/sse.ts b/src/server/sse.ts index 84c1cbb9..1bc304a8 100644 --- a/src/server/sse.ts +++ b/src/server/sse.ts @@ -136,8 +136,6 @@ export class SSEServerTransport implements Transport { /** * Returns the session ID for this transport. - * - * This can be used to route incoming POST requests. */ get sessionId(): string { return this._sessionId; diff --git a/src/shared/protocol.ts b/src/shared/protocol.ts index a4f211c6..ef303a39 100644 --- a/src/shared/protocol.ts +++ b/src/shared/protocol.ts @@ -74,6 +74,11 @@ export type RequestHandlerExtra = { * An abort signal used to communicate if the request was cancelled from the sender's side. */ signal: AbortSignal; + + /** + * The session ID from the transport, if available. + */ + sessionId?: string; }; /** @@ -239,9 +244,15 @@ export abstract class Protocol< const abortController = new AbortController(); this._requestHandlerAbortControllers.set(request.id, abortController); + // Create extra object with both abort signal and sessionId from transport + const extra: RequestHandlerExtra = { + signal: abortController.signal, + sessionId: this._transport?.sessionId, + }; + // Starting with Promise.resolve() puts any synchronous errors into the monad as well. Promise.resolve() - .then(() => handler(request, { signal: abortController.signal })) + .then(() => handler(request, extra)) .then( (result) => { if (abortController.signal.aborted) { diff --git a/src/shared/transport.ts b/src/shared/transport.ts index 5843cf00..bcadcf4d 100644 --- a/src/shared/transport.ts +++ b/src/shared/transport.ts @@ -41,4 +41,6 @@ export interface Transport { * Callback for when a message (request or response) is received over the connection. */ onmessage?: (message: JSONRPCMessage) => void; + + sessionId?: string; }