@gooin/garmin-connect
Version:
Makes it simple to interface with Garmin Connect to get or set any data point
126 lines • 4.28 kB
JavaScript
;
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