Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
[FEAT] added support for AuthInfo in extra for StreamableHTTPServerTr…
…ansport
  • Loading branch information
its-nikhil committed Apr 24, 2025
commit 37ca02d36df56487430f13a6b4b6c0889647933b
11 changes: 7 additions & 4 deletions src/server/streamableHttp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { isInitializeRequest, isJSONRPCError, isJSONRPCRequest, isJSONRPCRespons
import getRawBody from "raw-body";
import contentType from "content-type";
import { randomUUID } from "node:crypto";
import { AuthInfo } from "./auth/types.js";

const MAXIMUM_MESSAGE_SIZE = "4mb";

Expand Down Expand Up @@ -112,7 +113,7 @@ export class StreamableHTTPServerTransport implements Transport {
sessionId?: string | undefined;
onclose?: () => void;
onerror?: (error: Error) => void;
onmessage?: (message: JSONRPCMessage) => void;
onmessage?: (message: JSONRPCMessage, extra?: { authInfo?: AuthInfo }) => void;

constructor(options: StreamableHTTPServerTransportOptions) {
this.sessionIdGenerator = options.sessionIdGenerator;
Expand Down Expand Up @@ -286,7 +287,7 @@ export class StreamableHTTPServerTransport implements Transport {
/**
* Handles POST requests containing JSON-RPC messages
*/
private async handlePostRequest(req: IncomingMessage, res: ServerResponse, parsedBody?: unknown): Promise<void> {
private async handlePostRequest(req: IncomingMessage & { auth?: AuthInfo }, res: ServerResponse, parsedBody?: unknown): Promise<void> {
try {
// Validate the Accept header
const acceptHeader = req.headers.accept;
Expand Down Expand Up @@ -316,6 +317,8 @@ export class StreamableHTTPServerTransport implements Transport {
return;
}

const authInfo: AuthInfo | undefined = req.auth;

let rawMessage;
if (parsedBody !== undefined) {
rawMessage = parsedBody;
Expand Down Expand Up @@ -392,7 +395,7 @@ export class StreamableHTTPServerTransport implements Transport {

// handle each message
for (const message of messages) {
this.onmessage?.(message);
this.onmessage?.(message, { authInfo });
}
} else if (hasRequests) {
// The default behavior is to use SSE streaming
Expand Down Expand Up @@ -427,7 +430,7 @@ export class StreamableHTTPServerTransport implements Transport {

// handle each message
for (const message of messages) {
this.onmessage?.(message);
this.onmessage?.(message, { authInfo });
}
// The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses
// This will be handled by the send() method when responses are ready
Expand Down