39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
|
|
|
|
test("does not reconnect an SSE stream after a JSON-RPC error response", async () => {
|
|
let requests = 0
|
|
const transport = new StreamableHTTPClientTransport(new URL("http://mcp.invalid"), {
|
|
fetch: async () => {
|
|
requests += 1
|
|
return new Response(
|
|
new ReadableStream({
|
|
start(controller) {
|
|
controller.enqueue(new TextEncoder().encode("id: prime\nretry: 1\ndata:\n\n"))
|
|
controller.enqueue(
|
|
new TextEncoder().encode(
|
|
'id: error\ndata: {"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":1}\n\n',
|
|
),
|
|
)
|
|
controller.close()
|
|
},
|
|
}),
|
|
{ status: 200, headers: { "content-type": "text/event-stream" } },
|
|
)
|
|
},
|
|
reconnectionOptions: {
|
|
initialReconnectionDelay: 1,
|
|
maxReconnectionDelay: 1,
|
|
reconnectionDelayGrowFactor: 1,
|
|
maxRetries: 2,
|
|
},
|
|
})
|
|
|
|
await transport.start()
|
|
await transport.send({ jsonrpc: "2.0", method: "resources/list", id: 1 })
|
|
await Bun.sleep(25)
|
|
await transport.close()
|
|
|
|
expect(requests).toBe(1)
|
|
})
|