UNPKG

@gooin/garmin-connect

Version:

Makes it simple to interface with Garmin Connect to get or set any data point

126 lines 4.28 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MFAManager = void 0; const FileMFASessionStorage_1 = require("./FileMFASessionStorage"); const RedisMFASessionStorage_1 = require("./RedisMFASessionStorage"); const path_1 = __importDefault(require("path")); /** * MFA管理器,用于处理需要等待外部验证码的登录流程 * 支持文件系统和Redis两种存储方式 */ class MFAManager { constructor(config) { this.DEFAULT_TIMEOUT = 5 * 60 * 1000; // 5分钟 // 根据配置创建不同的存储实现 if (config.type === 'redis') { if (config.redis) { this.storage = new RedisMFASessionStorage_1.RedisMFASessionStorage(undefined, undefined, config.redis); } else if (config.redisUrl && config.redisToken) { this.storage = new RedisMFASessionStorage_1.RedisMFASessionStorage(config.redisUrl, config.redisToken); } else if (config.redisUrl) { this.storage = new RedisMFASessionStorage_1.RedisMFASessionStorage(config.redisUrl); } else { throw new Error('Redis配置不完整,需要提供redisUrl或redis实例'); } } else if (config.type === 'file') { const storageDir = config.dir || path_1.default.join(process.cwd(), '.mfa-sessions'); this.storage = new FileMFASessionStorage_1.FileMFASessionStorage(storageDir); } else { throw new Error(`不支持的MFA存储类型: ${config.type}`); } } /** * 获取MFA管理器单例 */ static getInstance(config) { if (!MFAManager.instance) { if (!config) { throw new Error('首次创建MFAManager实例必须提供配置'); } console.log('创建MFA管理器实例', config); MFAManager.instance = new MFAManager(config); } return MFAManager.instance; } /** * 重置单例实例,用于测试或重新配置 */ static resetInstance() { MFAManager.instance = undefined; } /** * 创建一个等待MFA验证码的Promise * @param sessionId 会话ID * @param timeout 超时时间(毫秒) * @returns Promise<string> 返回验证码 */ async waitForMFACode(sessionId, timeout = this.DEFAULT_TIMEOUT) { return this.storage.waitForMFACode(sessionId, timeout); } /** * 提交MFA验证码 * @param sessionId 会话ID * @param code 验证码 * @returns 是否成功提交 */ async submitMFACode(sessionId, code) { return this.storage.submitMFACode(sessionId, code); } /** * 取消MFA验证 * @param sessionId 会话ID * @param reason 取消原因 * @returns 是否成功取消 */ async cancelMFARequest(sessionId, reason = 'MFA验证已取消') { return this.storage.cancelMFARequest(sessionId, reason); } /** * 检查会话是否存在 * @param sessionId 会话ID * @returns 是否存在 */ async hasSession(sessionId) { return this.storage.hasSession(sessionId); } /** * 获取所有活跃的会话ID * @returns 会话ID列表 */ async getActiveSessions() { return this.storage.getActiveSessions(); } /** * 清理过期的请求 * @param maxAge 最大存活时间(毫秒) */ async cleanupExpiredRequests(maxAge = this.DEFAULT_TIMEOUT) { return this.storage.cleanupExpiredRequests(maxAge); } /** * 定期清理过期请求 */ startCleanupTask(interval = 60000) { setInterval(() => { this.cleanupExpiredRequests(); }, interval); } /** * 关闭资源连接(主要用于Redis) */ async disconnect() { if (this.storage instanceof RedisMFASessionStorage_1.RedisMFASessionStorage) { await this.storage.disconnect(); } } } exports.MFAManager = MFAManager; //# sourceMappingURL=MFAManager.js.map