[WIP] Refactor everything server to be more modular and use recommended APIs.

Adding simulated logging and refactoring subscriptions to not need to track transports

* Updated architecture.md

* In server/index.ts
  - remove import of Transport
  - import beginSimulatedLogging and stopSimulatedLogging
  - in clientConnected()
    - change argument to sessionId? instead of transport
    - add call to beginSimulatedLogging
    - send server and sessionId to beginSimulatedResourceUpdates and beginSimulatedLogging
  - in cleanup()
    - add call to stopSimulatedLogging passing sessionId

* Added server/logging.ts
  - Initialize logsUpdateIntervals to Map session ID to the interval for sending logging messages to the client
  - in beginSimulatedLogging()
    - create an array of logging meesages, customized with the sessionId if present
    - if the interval for the sessionId hasn't been set, create one, calling server.sendLoggingMessage with a random message to the client each time the interval elapses
  - in stopSimulatedLogging()
    - if a logging interval exists for the sessionId, clear it and remove it

* In subscriptions.ts
  - remove import of Transport
  - remove transports map
  - in beginSimulatedResourceUpdates()
    - change arguments to server and sessionId
    - check for the subsUpdateInterval for the session
    - remove all transport storage and interaction
    - instead use the server to send the notification
 - in stopSimulatedResourceUpdates()
   - remove management of transports map

* In sse.ts and streamableHttp.ts
  - when calling clientConnected, pass sessionId instead of transport

* In stdio.ts,
- when calling clientConnected, pass nothing instead of transport

* In subscriptions.ts
  - updated inline doc
This commit is contained in:
cliffhall
2025-12-07 19:32:18 -05:00
parent 8559fbd5a4
commit 16ed05957c
8 changed files with 130 additions and 57 deletions

View File

@@ -37,10 +37,11 @@ app.get("/sse", async (req, res) => {
// Connect server to transport
await server.connect(transport);
console.error("Client Connected: ", transport.sessionId);
const sessionId = transport.sessionId;
console.error("Client Connected: ", sessionId);
// Start simulated logging and subscription updates when a client connects
clientConnected(transport);
clientConnected(sessionId);
// Handle close of connection
server.server.onclose = async () => {

View File

@@ -10,7 +10,7 @@ async function main() {
const { server, clientConnected, cleanup } = createServer();
await server.connect(transport);
clientConnected(transport);
clientConnected();
// Cleanup on exit
process.on("SIGINT", async () => {

View File

@@ -49,7 +49,7 @@ app.post("/mcp", async (req: Request, res: Response) => {
transports.set(sessionId, transport);
// Start simulated logging and subscription updates when a client connects
clientConnected(transport);
clientConnected(sessionId);
},
});