|
| 1 | +import { Decimal128, MaxKey, MinKey, ObjectId, Timestamp, UUID } from "bson"; |
| 2 | +import { createEJsonTransport, EJsonReadBuffer } from "../../src/helpers/EJsonTransport.js"; |
| 3 | +import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js"; |
| 4 | +import { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js"; |
| 5 | +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; |
| 6 | +import { Readable } from "stream"; |
| 7 | +import { ReadBuffer } from "@modelcontextprotocol/sdk/shared/stdio.js"; |
| 8 | + |
| 9 | +describe("EJsonTransport", () => { |
| 10 | + let transport: StdioServerTransport; |
| 11 | + beforeEach(async () => { |
| 12 | + transport = createEJsonTransport(); |
| 13 | + await transport.start(); |
| 14 | + }); |
| 15 | + |
| 16 | + afterEach(async () => { |
| 17 | + await transport.close(); |
| 18 | + }); |
| 19 | + |
| 20 | + it("ejson deserializes messages", () => { |
| 21 | + const messages: { message: JSONRPCMessage; extra?: { authInfo?: AuthInfo } }[] = []; |
| 22 | + transport.onmessage = ( |
| 23 | + message, |
| 24 | + extra?: { |
| 25 | + authInfo?: AuthInfo; |
| 26 | + } |
| 27 | + ) => { |
| 28 | + messages.push({ message, extra }); |
| 29 | + }; |
| 30 | + |
| 31 | + (transport["_stdin"] as Readable).emit( |
| 32 | + "data", |
| 33 | + Buffer.from( |
| 34 | + '{"jsonrpc":"2.0","id":1,"method":"testMethod","params":{"oid":{"$oid":"681b741f13aa74a0687b5110"},"uuid":{"$uuid":"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"},"date":{"$date":"2025-05-07T14:54:23.973Z"},"decimal":{"$numberDecimal":"1234567890987654321"},"int32":123,"maxKey":{"$maxKey":1},"minKey":{"$minKey":1},"timestamp":{"$timestamp":{"t":123,"i":456}}}}\n', |
| 35 | + "utf-8" |
| 36 | + ) |
| 37 | + ); |
| 38 | + |
| 39 | + expect(messages.length).toBe(1); |
| 40 | + const message = messages[0].message; |
| 41 | + |
| 42 | + expect(message).toEqual({ |
| 43 | + jsonrpc: "2.0", |
| 44 | + id: 1, |
| 45 | + method: "testMethod", |
| 46 | + params: { |
| 47 | + oid: new ObjectId("681b741f13aa74a0687b5110"), |
| 48 | + uuid: new UUID("f81d4fae-7dec-11d0-a765-00a0c91e6bf6"), |
| 49 | + date: new Date(Date.parse("2025-05-07T14:54:23.973Z")), |
| 50 | + decimal: new Decimal128("1234567890987654321"), |
| 51 | + int32: 123, |
| 52 | + maxKey: new MaxKey(), |
| 53 | + minKey: new MinKey(), |
| 54 | + timestamp: new Timestamp({ t: 123, i: 456 }), |
| 55 | + }, |
| 56 | + }); |
| 57 | + }); |
| 58 | + |
| 59 | + it("has _readBuffer field of type EJsonReadBuffer", () => { |
| 60 | + expect(transport["_readBuffer"]).toBeDefined(); |
| 61 | + expect(transport["_readBuffer"]).toBeInstanceOf(EJsonReadBuffer); |
| 62 | + }); |
| 63 | + |
| 64 | + describe("standard StdioServerTransport", () => { |
| 65 | + it("has a _readBuffer field", () => { |
| 66 | + const standardTransport = new StdioServerTransport(); |
| 67 | + expect(standardTransport["_readBuffer"]).toBeDefined(); |
| 68 | + expect(standardTransport["_readBuffer"]).toBeInstanceOf(ReadBuffer); |
| 69 | + }); |
| 70 | + }); |
| 71 | +}); |
0 commit comments