33 lines
1.3 KiB
JavaScript
33 lines
1.3 KiB
JavaScript
/**
|
|
* AsyncLocalStorage-based propagation del mcpSessionId a los handlers de las tools.
|
|
*
|
|
* En el transporte HTTP, el servidor MCP multiplexa muchas sesiones concurrentes
|
|
* en un mismo proceso Node. Como los handlers de las tools no reciben el
|
|
* `mcp-session-id` directamente (solo lo que el SDK les pase en `extra`), usamos
|
|
* AsyncLocalStorage para propagar el identificador desde el handler HTTP
|
|
* (`POST /mcp`, `GET /sse`, `POST /message`) hasta la tool, y de ahi a helpers
|
|
* como `getCurrentProjectInfo` que resuelven `project_dir` desde las
|
|
* credenciales de la sesion (no desde `process.env`).
|
|
*
|
|
* En modo stdio no hace falta: cada subprocess tiene su propio env.
|
|
*/
|
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
|
|
export const sessionContext = new AsyncLocalStorage();
|
|
|
|
/**
|
|
* Envuelve la ejecucion de `fn` dentro del contexto de la sesion `mcpSessionId`.
|
|
* Cualquier llamada a `getCurrentSessionId()` dentro de `fn` (incluidas las
|
|
* callbacks async) devolvera ese id.
|
|
*/
|
|
export function runWithSession(mcpSessionId, fn) {
|
|
return sessionContext.run({ mcpSessionId }, fn);
|
|
}
|
|
|
|
/**
|
|
* Devuelve el mcpSessionId activo, o null si no estamos dentro de runWithSession.
|
|
*/
|
|
export function getCurrentSessionId() {
|
|
return sessionContext.getStore()?.mcpSessionId || null;
|
|
}
|