/** * Represents a pool of sessions. * @class */ /** * Represents a pool of sessions. * @template T - The type of session value. */ class SessionPool { /** * Creates a new SessionPool instance. * @constructor * @param {number} expirationTime - The expiration time for sessions in milliseconds. */ constructor(expirationTime) { this.sessions = new Map(); this.expirationTime = expirationTime; // Set up a timer to clean up expired sessions setInterval(() => this.cleanupSessions(), expirationTime); } /** * Retrieves a session from the pool. * @param {string} key - The key of the session to retrieve. * @returns {T | null} The session value if it exists and is not expired, otherwise null. */ getSession(key) { const now = Date.now(); const session = this.sessions.get(key); // If the session exists and is not expired, return it if (session && session.expiration > now) { session.expiration = now + this.expirationTime return session.value; } return null; } /** * Creates a new session in the pool. * @param {string} key - The key of the session to create. * @param {T} session - The session value. * @param {Function} off - The function to call when the session is removed from the pool. */ createSession(key, session, off) { this.sessions.set(key, { expiration: Date.now() + this.expirationTime, value: session, off }); } /** * Cleans up expired sessions from the pool. */ async cleanupSessions() { const now = Date.now(); for (const [key, session] of this.sessions) { if (session.expiration <= now) { this.sessions.delete(key); try { await session.off(session.value) } catch(e) { console.error("cleanupSessions: ", e); } } } } } module.exports = SessionPool