|
1 | 1 | import express from "express"; |
| 2 | +import http from "http"; |
2 | 3 | import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; |
3 | 4 |
|
4 | 5 | import { config } from "../common/config.js"; |
5 | 6 | import logger, { LogId } from "../common/logger.js"; |
6 | 7 |
|
7 | 8 | const JSON_RPC_ERROR_CODE_PROCESSING_REQUEST_FAILED = -32000; |
8 | 9 |
|
9 | | -export function createHttpTransport(): StreamableHTTPServerTransport { |
| 10 | +export async function createHttpTransport(): Promise<StreamableHTTPServerTransport> { |
10 | 11 | const app = express(); |
11 | 12 | app.enable("trust proxy"); // needed for reverse proxy support |
12 | 13 | app.use(express.urlencoded({ extended: true })); |
@@ -76,28 +77,47 @@ export function createHttpTransport(): StreamableHTTPServerTransport { |
76 | 77 | } |
77 | 78 | }); |
78 | 79 |
|
79 | | - const server = app.listen(config.httpPort, config.httpHost, () => { |
| 80 | + try { |
| 81 | + const server = await new Promise<http.Server>((resolve, reject) => { |
| 82 | + const result = app.listen(config.httpPort, config.httpHost, (err?: Error) => { |
| 83 | + if (err) { |
| 84 | + reject(err); |
| 85 | + return; |
| 86 | + } |
| 87 | + resolve(result); |
| 88 | + }); |
| 89 | + }); |
| 90 | + |
80 | 91 | logger.info( |
81 | 92 | LogId.streamableHttpTransportStarted, |
82 | 93 | "streamableHttpTransport", |
83 | 94 | `Server started on http://${config.httpHost}:${config.httpPort}` |
84 | 95 | ); |
85 | | - }); |
86 | 96 |
|
87 | | - transport.onclose = () => { |
88 | | - logger.info(LogId.streamableHttpTransportCloseRequested, "streamableHttpTransport", `Closing server`); |
89 | | - server.close((err?: Error) => { |
90 | | - if (err) { |
91 | | - logger.error( |
92 | | - LogId.streamableHttpTransportCloseFailure, |
93 | | - "streamableHttpTransport", |
94 | | - `Error closing server: ${err.message}` |
95 | | - ); |
96 | | - return; |
97 | | - } |
98 | | - logger.info(LogId.streamableHttpTransportCloseSuccess, "streamableHttpTransport", `Server closed`); |
99 | | - }); |
100 | | - }; |
| 97 | + transport.onclose = () => { |
| 98 | + logger.info(LogId.streamableHttpTransportCloseRequested, "streamableHttpTransport", `Closing server`); |
| 99 | + server.close((err?: Error) => { |
| 100 | + if (err) { |
| 101 | + logger.error( |
| 102 | + LogId.streamableHttpTransportCloseFailure, |
| 103 | + "streamableHttpTransport", |
| 104 | + `Error closing server: ${err.message}` |
| 105 | + ); |
| 106 | + return; |
| 107 | + } |
| 108 | + logger.info(LogId.streamableHttpTransportCloseSuccess, "streamableHttpTransport", `Server closed`); |
| 109 | + }); |
| 110 | + }; |
| 111 | + |
| 112 | + return transport; |
| 113 | + } catch (error: unknown) { |
| 114 | + const err = error instanceof Error ? error : new Error(String(error)); |
| 115 | + logger.info( |
| 116 | + LogId.streamableHttpTransportStartFailure, |
| 117 | + "streamableHttpTransport", |
| 118 | + `Error starting server: ${err.message}` |
| 119 | + ); |
101 | 120 |
|
102 | | - return transport; |
| 121 | + throw err; |
| 122 | + } |
103 | 123 | } |
0 commit comments