import { JSONRPCMessage } from "../types.js"; import { StdioClientTransport, StdioServerParameters } from "./stdio.js"; // Configure default server parameters based on OS // Uses 'more' command for Windows and 'tee' command for Unix/Linux const getDefaultServerParameters = (): StdioServerParameters => { if (process.platform === "win32") { return { command: "more" }; } return { command: "/usr/bin/tee" }; }; const serverParameters = getDefaultServerParameters(); test("should start then close cleanly", async () => { const client = new StdioClientTransport(serverParameters); client.onerror = (error) => { throw error; }; let didClose = false; client.onclose = () => { didClose = true; }; await client.start(); expect(didClose).toBeFalsy(); await client.close(); expect(didClose).toBeTruthy(); }); test("should read messages", async () => { const client = new StdioClientTransport(serverParameters); client.onerror = (error) => { throw error; }; const messages: JSONRPCMessage[] = [ { jsonrpc: "2.0", id: 1, method: "ping", }, { jsonrpc: "2.0", method: "notifications/initialized", }, ]; const readMessages: JSONRPCMessage[] = []; const finished = new Promise((resolve) => { client.onmessage = (message) => { readMessages.push(message); if (JSON.stringify(message) === JSON.stringify(messages[1])) { resolve(); } }; }); await client.start(); await client.send(messages[0]); await client.send(messages[1]); await finished; expect(readMessages).toEqual(messages); await client.close(); }); test("should return child process pid", async () => { const client = new StdioClientTransport(serverParameters); await client.start(); expect(client.pid).not.toBeNull(); await client.close(); expect(client.pid).toBeNull(); });