Skip to content

Commit fa6a4a5

Browse files
fix: cover writeSSEEvent and method-not-allowed, surface caught parse errors
- Add onerror for writeSSEEvent catch (surfaces actual write failure) - Add onerror for handleUnsupportedRequest (405 method not allowed) - Surface the caught SyntaxError/ZodError in JSON and JSON-RPC parse catches instead of constructing a generic 'Parse error' string — more useful for debugging - Update tests to assert on error types (SyntaxError, ZodError)
1 parent 856058a commit fa6a4a5

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

packages/server/src/server/streamableHttp.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,8 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
582582
eventData += `data: ${JSON.stringify(message)}\n\n`;
583583
controller.enqueue(encoder.encode(eventData));
584584
return true;
585-
} catch {
585+
} catch (error) {
586+
this.onerror?.(error as Error);
586587
return false;
587588
}
588589
}
@@ -591,6 +592,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
591592
* Handles unsupported requests (`PUT`, `PATCH`, etc.)
592593
*/
593594
private handleUnsupportedRequest(): Response {
595+
this.onerror?.(new Error('Method not allowed'));
594596
return Response.json(
595597
{
596598
jsonrpc: '2.0',
@@ -642,8 +644,8 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
642644
if (options?.parsedBody === undefined) {
643645
try {
644646
rawMessage = await req.json();
645-
} catch {
646-
this.onerror?.(new Error('Parse error: Invalid JSON'));
647+
} catch (error) {
648+
this.onerror?.(error as Error);
647649
return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON');
648650
}
649651
} else {
@@ -657,8 +659,8 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
657659
messages = Array.isArray(rawMessage)
658660
? rawMessage.map(msg => JSONRPCMessageSchema.parse(msg))
659661
: [JSONRPCMessageSchema.parse(rawMessage)];
660-
} catch {
661-
this.onerror?.(new Error('Parse error: Invalid JSON-RPC message'));
662+
} catch (error) {
663+
this.onerror?.(error as Error);
662664
return this.createJsonErrorResponse(400, -32_700, 'Parse error: Invalid JSON-RPC message');
663665
}
664666

packages/server/test/server/streamableHttp.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ describe('Zod v4', () => {
810810
expect(errors.length).toBeGreaterThan(0);
811811
const error = errors[0];
812812
expect(error).toBeDefined();
813-
expect(error?.message).toContain('Parse error');
813+
expect(error).toBeInstanceOf(SyntaxError);
814814
});
815815

816816
it('should call onerror for invalid JSON-RPC message', async () => {
@@ -829,7 +829,7 @@ describe('Zod v4', () => {
829829
expect(errors.length).toBeGreaterThan(0);
830830
const error = errors[0];
831831
expect(error).toBeDefined();
832-
expect(error?.message).toContain('Parse error');
832+
expect(error?.name).toBe('ZodError');
833833
});
834834

835835
it('should call onerror for missing Accept header on POST', async () => {

0 commit comments

Comments
 (0)