@gooin/garmin-connect 1.7.6 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/FileMFASessionStorage.js +1 -247
- package/dist/common/HttpClient copy.js +1 -361
- package/dist/common/HttpClient.d.ts +1 -0
- package/dist/common/HttpClient.js +1 -612
- package/dist/common/HttpClient.js.map +1 -1
- package/dist/common/HttpClientOLD.js +1 -361
- package/dist/common/HttpClientOLDV1.js +1 -361
- package/dist/common/HttpClientV1.js +1 -577
- package/dist/common/MFAManager.js +1 -126
- package/dist/common/MFASessionStorage.js +1 -3
- package/dist/common/RedisMFASessionStorage.js +1 -281
- package/dist/common/RedisMFASessionStorage.js.map +1 -1
- package/dist/garmin/GarminConnect.d.ts +243 -66
- package/dist/garmin/GarminConnect.js +1 -592
- package/dist/garmin/GarminConnect.js.map +1 -1
- package/dist/garmin/UrlClass.d.ts +21 -0
- package/dist/garmin/UrlClass.js +1 -149
- package/dist/garmin/UrlClass.js.map +1 -1
- package/dist/garmin/common/DateUtils.d.ts +1 -0
- package/dist/garmin/common/DateUtils.js +1 -38
- package/dist/garmin/common/DateUtils.js.map +1 -1
- package/dist/garmin/common/HydrationUtils.js +1 -16
- package/dist/garmin/common/WeightUtils.js +1 -9
- package/dist/garmin/modules/activity/base.d.ts +39 -0
- package/dist/garmin/modules/activity/base.js +1 -0
- package/dist/garmin/modules/activity/base.js.map +1 -0
- package/dist/garmin/modules/activity/cycling.d.ts +16 -0
- package/dist/garmin/modules/activity/cycling.js +1 -0
- package/dist/garmin/modules/activity/cycling.js.map +1 -0
- package/dist/garmin/modules/activity/running.d.ts +15 -0
- package/dist/garmin/modules/activity/running.js +1 -0
- package/dist/garmin/modules/activity/running.js.map +1 -0
- package/dist/garmin/modules/activity/training-status.d.ts +13 -0
- package/dist/garmin/modules/activity/training-status.js +1 -0
- package/dist/garmin/modules/activity/training-status.js.map +1 -0
- package/dist/garmin/modules/coach/activity-summary.d.ts +20 -0
- package/dist/garmin/modules/coach/activity-summary.js +1 -0
- package/dist/garmin/modules/coach/activity-summary.js.map +1 -0
- package/dist/garmin/modules/coach/helpers.d.ts +157 -0
- package/dist/garmin/modules/coach/helpers.js +1 -0
- package/dist/garmin/modules/coach/helpers.js.map +1 -0
- package/dist/garmin/modules/coach/training-overview.d.ts +5 -0
- package/dist/garmin/modules/coach/training-overview.js +1 -0
- package/dist/garmin/modules/coach/training-overview.js.map +1 -0
- package/dist/garmin/modules/coach/wellness-overview.d.ts +5 -0
- package/dist/garmin/modules/coach/wellness-overview.js +1 -0
- package/dist/garmin/modules/coach/wellness-overview.js.map +1 -0
- package/dist/garmin/modules/coach/wellness-summary.d.ts +4 -0
- package/dist/garmin/modules/coach/wellness-summary.js +1 -0
- package/dist/garmin/modules/coach/wellness-summary.js.map +1 -0
- package/dist/garmin/modules/coach.d.ts +60 -0
- package/dist/garmin/modules/coach.js +1 -0
- package/dist/garmin/modules/coach.js.map +1 -0
- package/dist/garmin/modules/course.d.ts +27 -0
- package/dist/garmin/modules/course.js +1 -0
- package/dist/garmin/modules/course.js.map +1 -0
- package/dist/garmin/modules/device.d.ts +11 -0
- package/dist/garmin/modules/device.js +1 -0
- package/dist/garmin/modules/device.js.map +1 -0
- package/dist/garmin/modules/misc.d.ts +18 -0
- package/dist/garmin/modules/misc.js +1 -0
- package/dist/garmin/modules/misc.js.map +1 -0
- package/dist/garmin/modules/types.d.ts +10 -0
- package/dist/garmin/modules/types.js +1 -0
- package/dist/garmin/modules/types.js.map +1 -0
- package/dist/garmin/modules/user.d.ts +18 -0
- package/dist/garmin/modules/user.js +1 -0
- package/dist/garmin/modules/user.js.map +1 -0
- package/dist/garmin/modules/wellness/body-battery.d.ts +11 -0
- package/dist/garmin/modules/wellness/body-battery.js +1 -0
- package/dist/garmin/modules/wellness/body-battery.js.map +1 -0
- package/dist/garmin/modules/wellness/heart-rate.d.ts +11 -0
- package/dist/garmin/modules/wellness/heart-rate.js +1 -0
- package/dist/garmin/modules/wellness/heart-rate.js.map +1 -0
- package/dist/garmin/modules/wellness/hrv.d.ts +12 -0
- package/dist/garmin/modules/wellness/hrv.js +1 -0
- package/dist/garmin/modules/wellness/hrv.js.map +1 -0
- package/dist/garmin/modules/wellness/hydration.d.ts +12 -0
- package/dist/garmin/modules/wellness/hydration.js +1 -0
- package/dist/garmin/modules/wellness/hydration.js.map +1 -0
- package/dist/garmin/modules/wellness/sleep.d.ts +16 -0
- package/dist/garmin/modules/wellness/sleep.js +1 -0
- package/dist/garmin/modules/wellness/sleep.js.map +1 -0
- package/dist/garmin/modules/wellness/weight.d.ts +20 -0
- package/dist/garmin/modules/wellness/weight.js +1 -0
- package/dist/garmin/modules/wellness/weight.js.map +1 -0
- package/dist/garmin/modules/workout.d.ts +23 -0
- package/dist/garmin/modules/workout.js +1 -0
- package/dist/garmin/modules/workout.js.map +1 -0
- package/dist/garmin/types/activity-stats.d.ts +21 -0
- package/dist/garmin/types/activity-stats.js +1 -0
- package/dist/garmin/types/activity-stats.js.map +1 -0
- package/dist/garmin/types/activity.js +1 -27
- package/dist/garmin/types/body-battery.d.ts +7 -0
- package/dist/garmin/types/body-battery.js +1 -0
- package/dist/garmin/types/body-battery.js.map +1 -0
- package/dist/garmin/types/coach.d.ts +533 -0
- package/dist/garmin/types/coach.js +1 -0
- package/dist/garmin/types/coach.js.map +1 -0
- package/dist/garmin/types/course.d.ts +3 -11
- package/dist/garmin/types/course.js +1 -3
- package/dist/garmin/types/cycling.d.ts +70 -0
- package/dist/garmin/types/cycling.js +1 -0
- package/dist/garmin/types/cycling.js.map +1 -0
- package/dist/garmin/types/device.d.ts +32 -0
- package/dist/garmin/types/device.js +1 -0
- package/dist/garmin/types/device.js.map +1 -0
- package/dist/garmin/types/golf.d.ts +4 -4
- package/dist/garmin/types/golf.js +1 -3
- package/dist/garmin/types/golf.js.map +1 -1
- package/dist/garmin/types/heartrate.d.ts +3 -3
- package/dist/garmin/types/heartrate.js +1 -2
- package/dist/garmin/types/hrv.d.ts +3 -0
- package/dist/garmin/types/hrv.js +1 -3
- package/dist/garmin/types/hydration.d.ts +3 -3
- package/dist/garmin/types/hydration.js +1 -2
- package/dist/garmin/types/index.d.ts +15 -0
- package/dist/garmin/types/index.js +1 -36
- package/dist/garmin/types/index.js.map +1 -1
- package/dist/garmin/types/personal-info.js +1 -3
- package/dist/garmin/types/race-prediction.d.ts +50 -0
- package/dist/garmin/types/race-prediction.js +1 -0
- package/dist/garmin/types/race-prediction.js.map +1 -0
- package/dist/garmin/types/sleep.js +1 -3
- package/dist/garmin/types/training-status.js +1 -3
- package/dist/garmin/types/weight.d.ts +46 -4
- package/dist/garmin/types/weight.js +1 -3
- package/dist/garmin/workouts/Running.js +1 -47
- package/dist/garmin/workouts/templates/RunningTemplate.js +1 -78
- package/dist/index.js +1 -11
- package/dist/utils.js +1 -37
- package/package.json +4 -3
|
@@ -1,247 +1 @@
|
|
|
1
|
-
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.FileMFASessionStorage = void 0;
|
|
7
|
-
const fs_1 = require("fs");
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
/**
|
|
10
|
-
* 文件系统实现的MFA会话存储
|
|
11
|
-
*/
|
|
12
|
-
class FileMFASessionStorage {
|
|
13
|
-
constructor(storageDir) {
|
|
14
|
-
this.DEFAULT_TIMEOUT = 5 * 60 * 1000; // 5分钟
|
|
15
|
-
this.storageDir = storageDir;
|
|
16
|
-
this.ensureStorageDir();
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 确保存储目录存在
|
|
20
|
-
*/
|
|
21
|
-
async ensureStorageDir() {
|
|
22
|
-
try {
|
|
23
|
-
await fs_1.promises.mkdir(this.storageDir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
console.error('创建MFA存储目录失败:', error);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 获取会话文件路径
|
|
31
|
-
*/
|
|
32
|
-
getSessionFilePath(sessionId) {
|
|
33
|
-
return path_1.default.join(this.storageDir, `${sessionId}.json`);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 创建一个等待MFA验证码的Promise
|
|
37
|
-
* @param sessionId 会话ID
|
|
38
|
-
* @param timeout 超时时间(毫秒)
|
|
39
|
-
* @returns Promise<string> 返回验证码
|
|
40
|
-
*/
|
|
41
|
-
async waitForMFACode(sessionId, timeout = this.DEFAULT_TIMEOUT) {
|
|
42
|
-
// 确保存储目录存在
|
|
43
|
-
await this.ensureStorageDir();
|
|
44
|
-
// 清理可能存在的旧会话
|
|
45
|
-
await this.cleanupRequest(sessionId);
|
|
46
|
-
// 创建会话文件
|
|
47
|
-
const sessionData = {
|
|
48
|
-
sessionId,
|
|
49
|
-
status: 'waiting',
|
|
50
|
-
createdAt: new Date().toISOString(),
|
|
51
|
-
timeout: timeout
|
|
52
|
-
};
|
|
53
|
-
const sessionFilePath = this.getSessionFilePath(sessionId);
|
|
54
|
-
await fs_1.promises.writeFile(sessionFilePath, JSON.stringify(sessionData), 'utf8');
|
|
55
|
-
console.log(`MFA验证会话已创建: ${sessionId}`);
|
|
56
|
-
// 轮询检查验证码是否已提交
|
|
57
|
-
return new Promise((resolve, reject) => {
|
|
58
|
-
const startTime = Date.now();
|
|
59
|
-
const checkInterval = setInterval(async () => {
|
|
60
|
-
try {
|
|
61
|
-
// 检查是否超时
|
|
62
|
-
if (Date.now() - startTime > timeout) {
|
|
63
|
-
clearInterval(checkInterval);
|
|
64
|
-
await this.cleanupRequest(sessionId);
|
|
65
|
-
reject(new Error('MFA验证超时,请重新登录'));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
// 检查会话文件是否存在
|
|
69
|
-
try {
|
|
70
|
-
const data = await fs_1.promises.readFile(sessionFilePath, 'utf8');
|
|
71
|
-
const session = JSON.parse(data);
|
|
72
|
-
// 如果状态已更新为resolved,则返回验证码
|
|
73
|
-
if (session.status === 'resolved' && session.code) {
|
|
74
|
-
clearInterval(checkInterval);
|
|
75
|
-
await this.cleanupRequest(sessionId);
|
|
76
|
-
resolve(session.code);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// 如果状态已更新为rejected,则抛出错误
|
|
80
|
-
if (session.status === 'rejected' && session.error) {
|
|
81
|
-
clearInterval(checkInterval);
|
|
82
|
-
await this.cleanupRequest(sessionId);
|
|
83
|
-
reject(new Error(session.error));
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
// 文件不存在或其他错误,继续等待
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
clearInterval(checkInterval);
|
|
93
|
-
await this.cleanupRequest(sessionId);
|
|
94
|
-
reject(error instanceof Error
|
|
95
|
-
? error
|
|
96
|
-
: new Error(String(error)));
|
|
97
|
-
}
|
|
98
|
-
}, 1000); // 每秒检查一次
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 提交MFA验证码
|
|
103
|
-
* @param sessionId 会话ID
|
|
104
|
-
* @param code 验证码
|
|
105
|
-
* @returns 是否成功提交
|
|
106
|
-
*/
|
|
107
|
-
async submitMFACode(sessionId, code) {
|
|
108
|
-
const sessionFilePath = this.getSessionFilePath(sessionId);
|
|
109
|
-
try {
|
|
110
|
-
// 检查会话文件是否存在
|
|
111
|
-
const data = await fs_1.promises.readFile(sessionFilePath, 'utf8');
|
|
112
|
-
const session = JSON.parse(data);
|
|
113
|
-
if (session.status !== 'waiting') {
|
|
114
|
-
console.log(`MFA验证会话状态不正确: ${sessionId}, 状态: ${session.status}`);
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
// 更新会话状态为已解决
|
|
118
|
-
session.status = 'resolved';
|
|
119
|
-
session.code = code;
|
|
120
|
-
session.resolvedAt = new Date().toISOString();
|
|
121
|
-
await fs_1.promises.writeFile(sessionFilePath, JSON.stringify(session), 'utf8');
|
|
122
|
-
console.log(`MFA验证码已提交: code ${code}, sessionId ${sessionId}`);
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
console.log(`未找到MFA验证会话: ${sessionId}, 错误: ${error instanceof Error ? error.message : String(error)}`);
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* 取消MFA验证
|
|
132
|
-
* @param sessionId 会话ID
|
|
133
|
-
* @param reason 取消原因
|
|
134
|
-
* @returns 是否成功取消
|
|
135
|
-
*/
|
|
136
|
-
async cancelMFARequest(sessionId, reason = 'MFA验证已取消') {
|
|
137
|
-
const sessionFilePath = this.getSessionFilePath(sessionId);
|
|
138
|
-
try {
|
|
139
|
-
// 检查会话文件是否存在
|
|
140
|
-
const data = await fs_1.promises.readFile(sessionFilePath, 'utf8');
|
|
141
|
-
const session = JSON.parse(data);
|
|
142
|
-
// 更新会话状态为已拒绝
|
|
143
|
-
session.status = 'rejected';
|
|
144
|
-
session.error = reason;
|
|
145
|
-
session.rejectedAt = new Date().toISOString();
|
|
146
|
-
await fs_1.promises.writeFile(sessionFilePath, JSON.stringify(session), 'utf8');
|
|
147
|
-
console.log(`MFA验证已取消: ${sessionId}, 原因: ${reason}`);
|
|
148
|
-
return true;
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
console.log(`未找到MFA验证会话: ${sessionId}, 错误: ${error instanceof Error ? error.message : String(error)}`);
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* 检查会话是否存在
|
|
157
|
-
* @param sessionId 会话ID
|
|
158
|
-
* @returns 是否存在
|
|
159
|
-
*/
|
|
160
|
-
async hasSession(sessionId) {
|
|
161
|
-
const sessionFilePath = this.getSessionFilePath(sessionId);
|
|
162
|
-
try {
|
|
163
|
-
await fs_1.promises.access(sessionFilePath);
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
catch (_a) {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 获取所有活跃的会话ID
|
|
172
|
-
* @returns 会话ID列表
|
|
173
|
-
*/
|
|
174
|
-
async getActiveSessions() {
|
|
175
|
-
try {
|
|
176
|
-
await this.ensureStorageDir();
|
|
177
|
-
const files = await fs_1.promises.readdir(this.storageDir);
|
|
178
|
-
return files
|
|
179
|
-
.filter((file) => file.endsWith('.json'))
|
|
180
|
-
.map((file) => file.replace('.json', ''));
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
console.error('获取活跃会话失败:', error instanceof Error ? error : String(error));
|
|
184
|
-
return [];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* 清理过期的请求
|
|
189
|
-
* @param maxAge 最大存活时间(毫秒)
|
|
190
|
-
*/
|
|
191
|
-
async cleanupExpiredRequests(maxAge = this.DEFAULT_TIMEOUT) {
|
|
192
|
-
try {
|
|
193
|
-
await this.ensureStorageDir();
|
|
194
|
-
const files = await fs_1.promises.readdir(this.storageDir);
|
|
195
|
-
const now = new Date();
|
|
196
|
-
let cleanedCount = 0;
|
|
197
|
-
for (const file of files) {
|
|
198
|
-
if (!file.endsWith('.json'))
|
|
199
|
-
continue;
|
|
200
|
-
try {
|
|
201
|
-
const filePath = path_1.default.join(this.storageDir, file);
|
|
202
|
-
const data = await fs_1.promises.readFile(filePath, 'utf8');
|
|
203
|
-
const session = JSON.parse(data);
|
|
204
|
-
const createdAt = new Date(session.createdAt);
|
|
205
|
-
// 检查是否过期
|
|
206
|
-
if (now.getTime() - createdAt.getTime() > maxAge) {
|
|
207
|
-
await fs_1.promises.unlink(filePath);
|
|
208
|
-
cleanedCount++;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
// 如果文件读取失败,直接删除
|
|
213
|
-
try {
|
|
214
|
-
await fs_1.promises.unlink(path_1.default.join(this.storageDir, file));
|
|
215
|
-
cleanedCount++;
|
|
216
|
-
}
|
|
217
|
-
catch (unlinkError) {
|
|
218
|
-
console.error(`删除过期会话文件失败: ${file}`, unlinkError instanceof Error
|
|
219
|
-
? unlinkError
|
|
220
|
-
: String(unlinkError));
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
if (cleanedCount > 0) {
|
|
225
|
-
console.log(`清理了 ${cleanedCount} 个过期的MFA验证会话`);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
console.error('清理过期请求失败:', error instanceof Error ? error : String(error));
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* 清理指定会话的资源
|
|
234
|
-
* @param sessionId 会话ID
|
|
235
|
-
*/
|
|
236
|
-
async cleanupRequest(sessionId) {
|
|
237
|
-
const sessionFilePath = this.getSessionFilePath(sessionId);
|
|
238
|
-
try {
|
|
239
|
-
await fs_1.promises.unlink(sessionFilePath);
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
// 文件不存在,忽略错误
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
exports.FileMFASessionStorage = FileMFASessionStorage;
|
|
247
|
-
//# sourceMappingURL=FileMFASessionStorage.js.map
|
|
1
|
+
'use strict';const a0_0x64fd6e=a0_0x1757;function a0_0xc4a1(){const _0x20e378=['utf8','stringify','replace','default','hasSession','.json','MFA验证码已提交:\x20code\x20','status','error','ensureStorageDir','getSessionFilePath','1528331GnwZYb','access','map','waitForMFACode','resolved','now','72KiknTw','rejected',',\x20状态:\x20','MFA验证已取消','删除过期会话文件失败:\x20',',\x20错误:\x20','code','readFile',',\x20sessionId\x20','__importDefault','MFA验证会话状态不正确:\x20','getActiveSessions','MFA验证会话已创建:\x20','清理过期请求失败:','storageDir','5163280cLsuzu','endsWith','writeFile','清理了\x20','message','3128940pCFzYH','1025632Asthbl','defineProperty','waiting','join','readdir','创建MFA存储目录失败:','submitMFACode','cleanupRequest','DEFAULT_TIMEOUT','__esModule','5428230uMSCtt',',\x20原因:\x20','FileMFASessionStorage','createdAt','1GFkZnd','parse','60seDKmf','toISOString','promises','unlink','MFA验证超时,请重新登录','log','1335616EKFVuL','path','161128zJYCkk'];a0_0xc4a1=function(){return _0x20e378;};return a0_0xc4a1();}(function(_0x465da7,_0x77d7ef){const _0x5c48cf=a0_0x1757,_0x4a7c2e=_0x465da7();while(!![]){try{const _0x15a139=parseInt(_0x5c48cf(0x208))/0x1*(parseInt(_0x5c48cf(0x210))/0x2)+-parseInt(_0x5c48cf(0x20a))/0x3*(parseInt(_0x5c48cf(0x212))/0x4)+parseInt(_0x5c48cf(0x1f9))/0x5+parseInt(_0x5c48cf(0x204))/0x6+-parseInt(_0x5c48cf(0x1df))/0x7+-parseInt(_0x5c48cf(0x1fa))/0x8*(parseInt(_0x5c48cf(0x1e5))/0x9)+parseInt(_0x5c48cf(0x1f4))/0xa;if(_0x15a139===_0x77d7ef)break;else _0x4a7c2e['push'](_0x4a7c2e['shift']());}catch(_0x4cef31){_0x4a7c2e['push'](_0x4a7c2e['shift']());}}}(a0_0xc4a1,0xa25c0));var __importDefault=this&&this[a0_0x64fd6e(0x1ee)]||function(_0x4d2081){const _0x44d450=a0_0x64fd6e;return _0x4d2081&&_0x4d2081[_0x44d450(0x203)]?_0x4d2081:{'default':_0x4d2081};};function a0_0x1757(_0x4519a6,_0x50cedd){_0x4519a6=_0x4519a6-0x1db;const _0xc4a14d=a0_0xc4a1();let _0x1757d0=_0xc4a14d[_0x4519a6];return _0x1757d0;}Object[a0_0x64fd6e(0x1fb)](exports,a0_0x64fd6e(0x203),{'value':!![]}),exports[a0_0x64fd6e(0x206)]=void 0x0;const fs_1=require('fs'),path_1=__importDefault(require(a0_0x64fd6e(0x211)));class FileMFASessionStorage{constructor(_0x16b514){const _0x553033=a0_0x64fd6e;this[_0x553033(0x202)]=0x5*0x3c*0x3e8,this[_0x553033(0x1f3)]=_0x16b514,this[_0x553033(0x1dd)]();}async[a0_0x64fd6e(0x1dd)](){const _0x2a7e86=a0_0x64fd6e;try{await fs_1[_0x2a7e86(0x20c)]['mkdir'](this[_0x2a7e86(0x1f3)],{'recursive':!![]});}catch(_0x4b0d20){console['error'](_0x2a7e86(0x1ff),_0x4b0d20);}}[a0_0x64fd6e(0x1de)](_0x185610){const _0x2fa497=a0_0x64fd6e;return path_1[_0x2fa497(0x216)]['join'](this[_0x2fa497(0x1f3)],_0x185610+_0x2fa497(0x218));}async[a0_0x64fd6e(0x1e2)](_0x43392a,_0xa13adf=this[a0_0x64fd6e(0x202)]){const _0x1ef93e=a0_0x64fd6e;await this['ensureStorageDir'](),await this[_0x1ef93e(0x201)](_0x43392a);const _0x57a8ae={'sessionId':_0x43392a,'status':_0x1ef93e(0x1fc),'createdAt':new Date()[_0x1ef93e(0x20b)](),'timeout':_0xa13adf},_0x367bde=this[_0x1ef93e(0x1de)](_0x43392a);return await fs_1[_0x1ef93e(0x20c)][_0x1ef93e(0x1f6)](_0x367bde,JSON[_0x1ef93e(0x214)](_0x57a8ae),'utf8'),console[_0x1ef93e(0x20f)](_0x1ef93e(0x1f1)+_0x43392a),new Promise((_0x3e165f,_0x3b7696)=>{const _0x414e70=_0x1ef93e,_0x2a7ebb=Date[_0x414e70(0x1e4)](),_0x1400ef=setInterval(async()=>{const _0x1f3cad=_0x414e70;try{if(Date['now']()-_0x2a7ebb>_0xa13adf){clearInterval(_0x1400ef),await this['cleanupRequest'](_0x43392a),_0x3b7696(new Error(_0x1f3cad(0x20e)));return;}try{const _0x11a4fe=await fs_1[_0x1f3cad(0x20c)]['readFile'](_0x367bde,'utf8'),_0x426c05=JSON[_0x1f3cad(0x209)](_0x11a4fe);if(_0x426c05[_0x1f3cad(0x1db)]===_0x1f3cad(0x1e3)&&_0x426c05[_0x1f3cad(0x1eb)]){clearInterval(_0x1400ef),await this[_0x1f3cad(0x201)](_0x43392a),_0x3e165f(_0x426c05[_0x1f3cad(0x1eb)]);return;}if(_0x426c05[_0x1f3cad(0x1db)]===_0x1f3cad(0x1e6)&&_0x426c05[_0x1f3cad(0x1dc)]){clearInterval(_0x1400ef),await this['cleanupRequest'](_0x43392a),_0x3b7696(new Error(_0x426c05['error']));return;}}catch(_0x4bb809){}}catch(_0x2c4cac){clearInterval(_0x1400ef),await this['cleanupRequest'](_0x43392a),_0x3b7696(_0x2c4cac instanceof Error?_0x2c4cac:new Error(String(_0x2c4cac)));}},0x3e8);});}async[a0_0x64fd6e(0x200)](_0x19b929,_0x22100b){const _0x53d77f=a0_0x64fd6e,_0xabd133=this[_0x53d77f(0x1de)](_0x19b929);try{const _0x4ac87c=await fs_1[_0x53d77f(0x20c)][_0x53d77f(0x1ec)](_0xabd133,_0x53d77f(0x213)),_0x5f0b1c=JSON[_0x53d77f(0x209)](_0x4ac87c);if(_0x5f0b1c['status']!==_0x53d77f(0x1fc))return console['log'](_0x53d77f(0x1ef)+_0x19b929+_0x53d77f(0x1e7)+_0x5f0b1c[_0x53d77f(0x1db)]),![];return _0x5f0b1c[_0x53d77f(0x1db)]=_0x53d77f(0x1e3),_0x5f0b1c['code']=_0x22100b,_0x5f0b1c['resolvedAt']=new Date()[_0x53d77f(0x20b)](),await fs_1[_0x53d77f(0x20c)][_0x53d77f(0x1f6)](_0xabd133,JSON[_0x53d77f(0x214)](_0x5f0b1c),_0x53d77f(0x213)),console[_0x53d77f(0x20f)](_0x53d77f(0x219)+_0x22100b+_0x53d77f(0x1ed)+_0x19b929),!![];}catch(_0x3394f9){return console[_0x53d77f(0x20f)]('未找到MFA验证会话:\x20'+_0x19b929+_0x53d77f(0x1ea)+(_0x3394f9 instanceof Error?_0x3394f9[_0x53d77f(0x1f8)]:String(_0x3394f9))),![];}}async['cancelMFARequest'](_0x41d799,_0x2afe78=a0_0x64fd6e(0x1e8)){const _0x57183b=a0_0x64fd6e,_0x575c1e=this[_0x57183b(0x1de)](_0x41d799);try{const _0x3f5136=await fs_1['promises']['readFile'](_0x575c1e,_0x57183b(0x213)),_0x1e72ea=JSON['parse'](_0x3f5136);return _0x1e72ea[_0x57183b(0x1db)]=_0x57183b(0x1e6),_0x1e72ea[_0x57183b(0x1dc)]=_0x2afe78,_0x1e72ea['rejectedAt']=new Date()['toISOString'](),await fs_1['promises']['writeFile'](_0x575c1e,JSON[_0x57183b(0x214)](_0x1e72ea),'utf8'),console[_0x57183b(0x20f)]('MFA验证已取消:\x20'+_0x41d799+_0x57183b(0x205)+_0x2afe78),!![];}catch(_0x36396e){return console['log']('未找到MFA验证会话:\x20'+_0x41d799+_0x57183b(0x1ea)+(_0x36396e instanceof Error?_0x36396e[_0x57183b(0x1f8)]:String(_0x36396e))),![];}}async[a0_0x64fd6e(0x217)](_0x3c94e2){const _0x1f3972=a0_0x64fd6e,_0x1516b5=this[_0x1f3972(0x1de)](_0x3c94e2);try{return await fs_1[_0x1f3972(0x20c)][_0x1f3972(0x1e0)](_0x1516b5),!![];}catch(_0x1faf3e){return![];}}async[a0_0x64fd6e(0x1f0)](){const _0x3d5b82=a0_0x64fd6e;try{await this[_0x3d5b82(0x1dd)]();const _0xde9bc1=await fs_1['promises'][_0x3d5b82(0x1fe)](this[_0x3d5b82(0x1f3)]);return _0xde9bc1['filter'](_0xbb7edf=>_0xbb7edf['endsWith']('.json'))[_0x3d5b82(0x1e1)](_0x7e345c=>_0x7e345c[_0x3d5b82(0x215)](_0x3d5b82(0x218),''));}catch(_0x4c3aae){return console[_0x3d5b82(0x1dc)]('获取活跃会话失败:',_0x4c3aae instanceof Error?_0x4c3aae:String(_0x4c3aae)),[];}}async['cleanupExpiredRequests'](_0x2105ad=this[a0_0x64fd6e(0x202)]){const _0x483876=a0_0x64fd6e;try{await this[_0x483876(0x1dd)]();const _0x58075f=await fs_1['promises'][_0x483876(0x1fe)](this[_0x483876(0x1f3)]),_0x32e67a=new Date();let _0x2ca09f=0x0;for(const _0x24b038 of _0x58075f){if(!_0x24b038[_0x483876(0x1f5)](_0x483876(0x218)))continue;try{const _0x3c20b6=path_1[_0x483876(0x216)][_0x483876(0x1fd)](this[_0x483876(0x1f3)],_0x24b038),_0x275e86=await fs_1[_0x483876(0x20c)][_0x483876(0x1ec)](_0x3c20b6,_0x483876(0x213)),_0x540251=JSON[_0x483876(0x209)](_0x275e86),_0x5d529d=new Date(_0x540251[_0x483876(0x207)]);_0x32e67a['getTime']()-_0x5d529d['getTime']()>_0x2105ad&&(await fs_1[_0x483876(0x20c)][_0x483876(0x20d)](_0x3c20b6),_0x2ca09f++);}catch(_0x5da892){try{await fs_1[_0x483876(0x20c)][_0x483876(0x20d)](path_1[_0x483876(0x216)][_0x483876(0x1fd)](this[_0x483876(0x1f3)],_0x24b038)),_0x2ca09f++;}catch(_0x421578){console[_0x483876(0x1dc)](_0x483876(0x1e9)+_0x24b038,_0x421578 instanceof Error?_0x421578:String(_0x421578));}}}_0x2ca09f>0x0&&console['log'](_0x483876(0x1f7)+_0x2ca09f+'\x20个过期的MFA验证会话');}catch(_0x9b2a1c){console[_0x483876(0x1dc)](_0x483876(0x1f2),_0x9b2a1c instanceof Error?_0x9b2a1c:String(_0x9b2a1c));}}async[a0_0x64fd6e(0x201)](_0x4ff1a0){const _0x92af81=a0_0x64fd6e,_0x1be081=this[_0x92af81(0x1de)](_0x4ff1a0);try{await fs_1[_0x92af81(0x20c)][_0x92af81(0x20d)](_0x1be081);}catch(_0x3f156d){}}}exports[a0_0x64fd6e(0x206)]=FileMFASessionStorage;
|