import type { ILogger } from "../core/logger.js"; import type { Result } from "../core/result.js"; import type { SessionConfig } from "./config.js"; /** * Session metadata */ export interface Session { /** * Unique session identifier (UUID v4) */ id: string; /** * Timestamp when session was created (milliseconds since epoch) */ createdAt: number; /** * Timestamp when session was last accessed (milliseconds since epoch) */ lastAccessedAt: number; /** * Optional metadata associated with the session */ metadata?: Record; } /** * Session manager interface */ export interface ISessionManager { /** * Create a new session with auto-generated ID */ create(metadata?: Record): string; /** * Refresh last access time for a session */ touch(sessionId: string): Result; /** * Register a callback invoked when a session expires via TTL cleanup. */ setExpirationHandler(handler: (sessionId: string) => Promise | void): void; /** * Register an existing session (created by SDK) */ register(sessionId: string, metadata?: Record): void; /** * Clean up a session by ID */ cleanup(sessionId: string): Result; /** * List all active sessions */ list(): Session[]; /** * Start automatic TTL-based cleanup */ startTTLCleanup(): void; /** * Stop automatic TTL-based cleanup */ stopTTLCleanup(): void; /** * Get number of active sessions */ getActiveSessionCount(): number; /** * Clear all sessions (for testing or emergency cleanup) */ clearAll(): void; } /** * Session Manager * * Manages client sessions for Streamable HTTP transport. * Provides session creation, validation, TTL-based expiration, and automatic cleanup. * * Note: Session validation (checking if session ID exists) is now handled by * StreamableHTTPServerTransport.handleRequest(). This SessionManager focuses on: * - Session creation via SDK callbacks (onsessioninitialized) * - Session cleanup via SDK callbacks (onsessionclosed) and TTL-based cleanup * - Session tracking for health checks and monitoring * * @example * ```typescript * const sessionManager = new SessionManager( * { enabled: true, ttl: 60 * 60 * 1000 }, // 1 hour TTL * logger * ); * * // Create session (typically called from SDK callback) * const sessionId = sessionManager.create({ clientVersion: '1.0' }); * * // Start automatic TTL-based cleanup * sessionManager.startTTLCleanup(); * * // Stop cleanup when done * sessionManager.stopTTLCleanup(); * ``` */ export declare class SessionManager implements ISessionManager { private readonly sessions; private readonly config; private readonly logger; private cleanupInterval; private onSessionExpired; constructor(config: SessionConfig, logger: ILogger); /** * Create a new session with optional metadata * * @param metadata - Optional metadata to associate with the session * @returns Session ID (UUID v4) */ create(metadata?: Record): string; /** * Update lastAccessedAt when a session receives activity * * @param sessionId - Session ID to refresh */ touch(sessionId: string): Result; /** * Register a callback to run when TTL cleanup expires a session. * * @param handler - Callback invoked with expired session ID */ setExpirationHandler(handler: (sessionId: string) => Promise | void): void; /** * Register an SDK-created session for tracking * * This method registers sessions that were created by the MCP SDK's * StreamableHTTPServerTransport. The SDK generates session IDs via the * sessionIdGenerator callback, and then calls onsessioninitialized. * This method creates a new tracking entry with current timestamps * so the session can be managed for TTL cleanup and monitoring. * * @param sessionId - Session ID generated by SDK * @param metadata - Optional metadata to associate with the session */ register(sessionId: string, metadata?: Record): void; /** * Clean up (delete) a session by ID * * @param sessionId - Session ID to clean up * @returns Result indicating success or failure */ cleanup(sessionId: string): Result; /** * List all active sessions * * @returns Array of all active sessions */ list(): Session[]; /** * Start automatic TTL-based cleanup * * Runs cleanup task at an interval of TTL/2 to remove expired sessions. * Does nothing if TTL is not configured or cleanup is already running. */ startTTLCleanup(): void; /** * Stop automatic TTL-based cleanup */ stopTTLCleanup(): void; /** * Run a single cleanup task to remove expired sessions * * @private */ private runCleanupTask; /** * Get number of active sessions * * @returns Number of active sessions */ getActiveSessionCount(): number; /** * Clear all sessions * * Useful for testing or emergency cleanup. */ clearAll(): void; }