Revert "fix: handle the client disconnect so that the server does not crash."

This commit is contained in:
Cliff Hall 2025-05-28 12:56:55 -04:00 • committed by GitHub
commit 692c863f5b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -141,7 +141,7 @@ let backingServerTransport: Transport | undefined;
app.get("/mcp", async (req, res) => { app.get("/mcp", async (req, res) => {
const sessionId = req.headers["mcp-session-id"] as string; const sessionId = req.headers["mcp-session-id"] as string;
console.log(`GET /mcp for sessionId ${sessionId}`); console.log(`Received GET message for sessionId ${sessionId}`);
try { try {
const transport = webAppTransports.get( const transport = webAppTransports.get(
sessionId, sessionId,
@ -160,7 +160,7 @@ app.get("/mcp", async (req, res) => {
app.post("/mcp", async (req, res) => { app.post("/mcp", async (req, res) => {
const sessionId = req.headers["mcp-session-id"] as string | undefined; const sessionId = req.headers["mcp-session-id"] as string | undefined;
console.log(`POST /mcp for sessionId ${sessionId}`); console.log(`Received POST message for sessionId ${sessionId}`);
if (!sessionId) { if (!sessionId) {
try { try {
console.log("New streamable-http connection"); console.log("New streamable-http connection");
@ -228,7 +228,7 @@ app.post("/mcp", async (req, res) => {
app.get("/stdio", async (req, res) => { app.get("/stdio", async (req, res) => {
try { try {
console.log("GET /stdio"); console.log("New connection");
try { try {
await backingServerTransport?.close(); await backingServerTransport?.close();
@ -254,54 +254,19 @@ app.get("/stdio", async (req, res) => {
console.log("Created web app transport"); console.log("Created web app transport");
await webAppTransport.start(); await webAppTransport.start();
(backingServerTransport as StdioClientTransport).stderr!.on(
// Handle client disconnection "data",
res.on("close", () => { (chunk) => {
console.log( webAppTransport.send({
`Client disconnected from session ${webAppTransport.sessionId}`,
);
// Clean up the transport map
webAppTransports.delete(webAppTransport.sessionId);
});
// Create a stderr handler that checks connection state
const stderrHandler = (chunk: Buffer) => {
// Only send if the transport exists in our map (meaning it's still active)
if (webAppTransports.has(webAppTransport.sessionId)) {
webAppTransport
.send({
jsonrpc: "2.0", jsonrpc: "2.0",
method: "notifications/stderr", method: "notifications/stderr",
params: { params: {
content: chunk.toString(), content: chunk.toString(),
}, },
})
.catch((error: any) => {
console.error(
`Error sending stderr data to client: ${error.message}`,
);
// If we hit an error sending, clean up the transport
webAppTransports.delete(webAppTransport.sessionId);
}); });
} },
};
if ((backingServerTransport as StdioClientTransport).stderr) {
(backingServerTransport as StdioClientTransport).stderr!.on(
"data",
stderrHandler,
); );
// Store the handler reference so we can remove it when client disconnects
res.on("close", () => {
if ((backingServerTransport as StdioClientTransport).stderr) {
(
backingServerTransport as StdioClientTransport
).stderr!.removeListener("data", stderrHandler);
}
});
}
mcpProxy({ mcpProxy({
transportToClient: webAppTransport, transportToClient: webAppTransport,
transportToServer: backingServerTransport, transportToServer: backingServerTransport,
@ -317,7 +282,7 @@ app.get("/stdio", async (req, res) => {
app.get("/sse", async (req, res) => { app.get("/sse", async (req, res) => {
try { try {
console.log( console.log(
"GET /sse (NOTE: The sse transport is deprecated and has been replaced by streamable-http)", "New SSE connection. NOTE: The sse transport is deprecated and has been replaced by streamable-http",
); );
try { try {
@ -359,7 +324,7 @@ app.get("/sse", async (req, res) => {
app.post("/message", async (req, res) => { app.post("/message", async (req, res) => {
try { try {
const sessionId = req.query.sessionId; const sessionId = req.query.sessionId;
console.log(`POST /message for sessionId ${sessionId}`); console.log(`Received message for sessionId ${sessionId}`);
const transport = webAppTransports.get( const transport = webAppTransports.get(
sessionId as string, sessionId as string,
@ -376,7 +341,6 @@ app.post("/message", async (req, res) => {
}); });
app.get("/health", (req, res) => { app.get("/health", (req, res) => {
console.log("GET /health");
res.json({ res.json({
status: "ok", status: "ok",
}); });
@ -384,7 +348,6 @@ app.get("/health", (req, res) => {
app.get("/config", (req, res) => { app.get("/config", (req, res) => {
try { try {
console.log("GET /config");
res.json({ res.json({
defaultEnvironment, defaultEnvironment,
defaultCommand: values.env, defaultCommand: values.env,