@gooin/garmin-connect 1.8.4 → 1.8.6

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.
Files changed (95) hide show
  1. package/README.md +59 -0
  2. package/dist/common/FileMFASessionStorage.js +1 -1
  3. package/dist/common/HttpClient copy.js +1 -1
  4. package/dist/common/HttpClient.js +1 -1
  5. package/dist/common/HttpClientOLD.js +1 -1
  6. package/dist/common/HttpClientOLDV1.js +1 -1
  7. package/dist/common/HttpClientV1.js +1 -1
  8. package/dist/common/MFAManager.js +1 -1
  9. package/dist/common/MFASessionStorage.js +1 -1
  10. package/dist/common/RedisMFASessionStorage.js +1 -1
  11. package/dist/garmin/GarminConnect.d.ts +18 -4
  12. package/dist/garmin/GarminConnect.js +1 -1
  13. package/dist/garmin/UrlClass.d.ts +6 -0
  14. package/dist/garmin/UrlClass.js +1 -1
  15. package/dist/garmin/UrlClass.js.map +1 -1
  16. package/dist/garmin/common/DateUtils.js +1 -1
  17. package/dist/garmin/common/HydrationUtils.js +1 -1
  18. package/dist/garmin/common/WeightUtils.js +1 -1
  19. package/dist/garmin/modules/activity/base.d.ts +5 -2
  20. package/dist/garmin/modules/activity/base.js +1 -1
  21. package/dist/garmin/modules/activity/base.js.map +1 -1
  22. package/dist/garmin/modules/activity/cycling.js +1 -1
  23. package/dist/garmin/modules/activity/running.d.ts +3 -0
  24. package/dist/garmin/modules/activity/running.js +1 -1
  25. package/dist/garmin/modules/activity/running.js.map +1 -1
  26. package/dist/garmin/modules/activity/training-status.d.ts +3 -0
  27. package/dist/garmin/modules/activity/training-status.js +1 -1
  28. package/dist/garmin/modules/activity/training-status.js.map +1 -1
  29. package/dist/garmin/modules/coach/activity-summary.d.ts +1 -0
  30. package/dist/garmin/modules/coach/activity-summary.js +1 -1
  31. package/dist/garmin/modules/coach/activity-summary.js.map +1 -1
  32. package/dist/garmin/modules/coach/helpers.d.ts +12 -2
  33. package/dist/garmin/modules/coach/helpers.js +1 -1
  34. package/dist/garmin/modules/coach/helpers.js.map +1 -1
  35. package/dist/garmin/modules/coach/sleep-analysis.d.ts +8 -0
  36. package/dist/garmin/modules/coach/sleep-analysis.js +1 -0
  37. package/dist/garmin/modules/coach/sleep-analysis.js.map +1 -0
  38. package/dist/garmin/modules/coach/training-overview.js +1 -1
  39. package/dist/garmin/modules/coach/training-overview.js.map +1 -1
  40. package/dist/garmin/modules/coach/wellness-overview.js +1 -1
  41. package/dist/garmin/modules/coach/wellness-overview.js.map +1 -1
  42. package/dist/garmin/modules/coach/wellness-summary.js +1 -1
  43. package/dist/garmin/modules/coach.d.ts +2 -1
  44. package/dist/garmin/modules/coach.js +1 -1
  45. package/dist/garmin/modules/coach.js.map +1 -1
  46. package/dist/garmin/modules/course.js +1 -1
  47. package/dist/garmin/modules/device.js +1 -1
  48. package/dist/garmin/modules/misc.js +1 -1
  49. package/dist/garmin/modules/types.js +1 -1
  50. package/dist/garmin/modules/user.js +1 -1
  51. package/dist/garmin/modules/wellness/body-battery.js +1 -1
  52. package/dist/garmin/modules/wellness/heart-rate.js +1 -1
  53. package/dist/garmin/modules/wellness/hrv.js +1 -1
  54. package/dist/garmin/modules/wellness/hydration.js +1 -1
  55. package/dist/garmin/modules/wellness/sleep.js +1 -1
  56. package/dist/garmin/modules/wellness/sleep.js.map +1 -1
  57. package/dist/garmin/modules/wellness/weight.js +1 -1
  58. package/dist/garmin/modules/workout.d.ts +9 -3
  59. package/dist/garmin/modules/workout.js +1 -1
  60. package/dist/garmin/modules/workout.js.map +1 -1
  61. package/dist/garmin/types/activity-stats.js +1 -1
  62. package/dist/garmin/types/activity.d.ts +30 -0
  63. package/dist/garmin/types/activity.js +1 -1
  64. package/dist/garmin/types/body-battery.js +1 -1
  65. package/dist/garmin/types/coach.d.ts +21 -0
  66. package/dist/garmin/types/coach.js +1 -1
  67. package/dist/garmin/types/course.js +1 -1
  68. package/dist/garmin/types/cycling.js +1 -1
  69. package/dist/garmin/types/device.js +1 -1
  70. package/dist/garmin/types/golf.js +1 -1
  71. package/dist/garmin/types/heartrate.js +1 -1
  72. package/dist/garmin/types/hrv.js +1 -1
  73. package/dist/garmin/types/hydration.js +1 -1
  74. package/dist/garmin/types/index.d.ts +1 -0
  75. package/dist/garmin/types/index.js +1 -1
  76. package/dist/garmin/types/index.js.map +1 -1
  77. package/dist/garmin/types/personal-info.js +1 -1
  78. package/dist/garmin/types/race-prediction.js +1 -1
  79. package/dist/garmin/types/sleep.d.ts +31 -0
  80. package/dist/garmin/types/sleep.js +1 -1
  81. package/dist/garmin/types/training-status.js +1 -1
  82. package/dist/garmin/types/weight.js +1 -1
  83. package/dist/garmin/types/workout.d.ts +167 -0
  84. package/dist/garmin/types/workout.js +1 -0
  85. package/dist/garmin/types/workout.js.map +1 -0
  86. package/dist/garmin/workouts/Running.js +1 -1
  87. package/dist/garmin/workouts/templates/RunningTemplate.js +1 -1
  88. package/dist/garmin/workouts/workout-draft.d.ts +3 -0
  89. package/dist/garmin/workouts/workout-draft.js +1 -0
  90. package/dist/garmin/workouts/workout-draft.js.map +1 -0
  91. package/dist/index.d.ts +2 -0
  92. package/dist/index.js +1 -1
  93. package/dist/index.js.map +1 -1
  94. package/dist/utils.js +1 -1
  95. package/package.json +8 -3
package/README.md CHANGED
@@ -547,6 +547,65 @@ GCClient.addRunningWorkout('My 5k run', 5000, 'Some description');
547
547
 
548
548
  Will add a running workout of 5km called 'My 5k run' and return a JSON object representing the saved workout.
549
549
 
550
+ ### Compile an AI coach workout draft
551
+
552
+ Use `workout_draft_v1` as a transport-neutral, metric input. The compiler
553
+ validates the draft and converts user-readable values to Garmin workout fields.
554
+ Compilation does not write to Garmin.
555
+
556
+ ```ts
557
+ import { compileWorkoutDraft, type WorkoutDraft } from '@gooin/garmin-connect';
558
+
559
+ const draft: WorkoutDraft = {
560
+ schema: 'workout_draft_v1',
561
+ sport: 'running',
562
+ name: '4 x 1 km threshold',
563
+ estimatedDurationSec: 3600,
564
+ steps: [
565
+ {
566
+ type: 'step',
567
+ stepType: 'warmup',
568
+ duration: { type: 'time', seconds: 600 }
569
+ },
570
+ {
571
+ type: 'repeat',
572
+ iterations: 4,
573
+ steps: [
574
+ {
575
+ type: 'step',
576
+ stepType: 'interval',
577
+ duration: { type: 'distance', meters: 1000 },
578
+ target: {
579
+ type: 'pace',
580
+ fastestSecPerKm: 270,
581
+ slowestSecPerKm: 285
582
+ }
583
+ },
584
+ {
585
+ type: 'step',
586
+ stepType: 'recovery',
587
+ duration: { type: 'time', seconds: 120 }
588
+ }
589
+ ]
590
+ },
591
+ {
592
+ type: 'step',
593
+ stepType: 'cooldown',
594
+ duration: { type: 'time', seconds: 600 }
595
+ }
596
+ ]
597
+ };
598
+
599
+ const payload = compileWorkoutDraft(draft);
600
+
601
+ // Execute these write operations only after explicit user confirmation.
602
+ const workout = await GCClient.addWorkout(payload);
603
+ await GCClient.scheduleWorkout(
604
+ { workoutId: String(workout.workoutId) },
605
+ new Date('2026-06-16')
606
+ );
607
+ ```
608
+
550
609
  ### Schedule workout
551
610
 
552
611
  To add a workout to your calendar, first find your workout and then add it to a specific date.
@@ -1 +1 @@
1
- 'use strict';const a0_0x4730a8=a0_0x219d;function a0_0x219d(_0x4a656a,_0x86ef73){_0x4a656a=_0x4a656a-0x182;const _0x3c7b85=a0_0x3c7b();let _0x219d28=_0x3c7b85[_0x4a656a];return _0x219d28;}(function(_0x6a0ed8,_0x225ae1){const _0x222555=a0_0x219d,_0x5f18aa=_0x6a0ed8();while(!![]){try{const _0x166fd3=-parseInt(_0x222555(0x183))/0x1*(parseInt(_0x222555(0x197))/0x2)+-parseInt(_0x222555(0x196))/0x3+-parseInt(_0x222555(0x19b))/0x4+parseInt(_0x222555(0x1af))/0x5*(-parseInt(_0x222555(0x1b4))/0x6)+-parseInt(_0x222555(0x18c))/0x7+parseInt(_0x222555(0x1b9))/0x8+-parseInt(_0x222555(0x1b2))/0x9*(-parseInt(_0x222555(0x1b8))/0xa);if(_0x166fd3===_0x225ae1)break;else _0x5f18aa['push'](_0x5f18aa['shift']());}catch(_0x5fd233){_0x5f18aa['push'](_0x5f18aa['shift']());}}}(a0_0x3c7b,0x4db44));var __importDefault=this&&this['__importDefault']||function(_0x506771){const _0x8d3dee=a0_0x219d;return _0x506771&&_0x506771[_0x8d3dee(0x18f)]?_0x506771:{'default':_0x506771};};Object[a0_0x4730a8(0x1ab)](exports,'__esModule',{'value':!![]}),exports[a0_0x4730a8(0x1c0)]=void 0x0;const fs_1=require('fs'),path_1=__importDefault(require(a0_0x4730a8(0x191)));class FileMFASessionStorage{constructor(_0xc08288){const _0x29be38=a0_0x4730a8;this[_0x29be38(0x1aa)]=0x5*0x3c*0x3e8,this['storageDir']=_0xc08288,this[_0x29be38(0x1be)]();}async['ensureStorageDir'](){const _0x347d18=a0_0x4730a8;try{await fs_1[_0x347d18(0x1a2)]['mkdir'](this[_0x347d18(0x1a1)],{'recursive':!![]});}catch(_0x479c99){console['error'](_0x347d18(0x1a4),_0x479c99);}}[a0_0x4730a8(0x19a)](_0x13cd03){const _0x90ec53=a0_0x4730a8;return path_1[_0x90ec53(0x1b1)][_0x90ec53(0x1bc)](this[_0x90ec53(0x1a1)],_0x13cd03+'.json');}async[a0_0x4730a8(0x194)](_0x2cc229,_0x3dcec8=this[a0_0x4730a8(0x1aa)]){const _0x4a1c5a=a0_0x4730a8;await this['ensureStorageDir'](),await this[_0x4a1c5a(0x19e)](_0x2cc229);const _0x4b6ba8={'sessionId':_0x2cc229,'status':'waiting','createdAt':new Date()['toISOString'](),'timeout':_0x3dcec8},_0x1a8745=this[_0x4a1c5a(0x19a)](_0x2cc229);return await fs_1[_0x4a1c5a(0x1a2)][_0x4a1c5a(0x193)](_0x1a8745,JSON[_0x4a1c5a(0x1a8)](_0x4b6ba8),_0x4a1c5a(0x19f)),console['log'](_0x4a1c5a(0x1b3)+_0x2cc229),new Promise((_0x2bcc21,_0x26b2ef)=>{const _0x58d6d4=Date['now'](),_0x467b89=setInterval(async()=>{const _0x50ffd6=a0_0x219d;try{if(Date[_0x50ffd6(0x1a0)]()-_0x58d6d4>_0x3dcec8){clearInterval(_0x467b89),await this['cleanupRequest'](_0x2cc229),_0x26b2ef(new Error(_0x50ffd6(0x1bd)));return;}try{const _0x297e81=await fs_1[_0x50ffd6(0x1a2)][_0x50ffd6(0x192)](_0x1a8745,'utf8'),_0x3ce911=JSON['parse'](_0x297e81);if(_0x3ce911[_0x50ffd6(0x1b5)]===_0x50ffd6(0x1a9)&&_0x3ce911['code']){clearInterval(_0x467b89),await this['cleanupRequest'](_0x2cc229),_0x2bcc21(_0x3ce911['code']);return;}if(_0x3ce911[_0x50ffd6(0x1b5)]===_0x50ffd6(0x1bf)&&_0x3ce911[_0x50ffd6(0x1ac)]){clearInterval(_0x467b89),await this[_0x50ffd6(0x19e)](_0x2cc229),_0x26b2ef(new Error(_0x3ce911[_0x50ffd6(0x1ac)]));return;}}catch(_0x16af43){}}catch(_0x4a1702){clearInterval(_0x467b89),await this[_0x50ffd6(0x19e)](_0x2cc229),_0x26b2ef(_0x4a1702 instanceof Error?_0x4a1702:new Error(String(_0x4a1702)));}},0x3e8);});}async['submitMFACode'](_0x539d8a,_0x5480ba){const _0x274d23=a0_0x4730a8,_0x4f7c5f=this['getSessionFilePath'](_0x539d8a);try{const _0xb320cb=await fs_1[_0x274d23(0x1a2)][_0x274d23(0x192)](_0x4f7c5f,_0x274d23(0x19f)),_0x10f56d=JSON[_0x274d23(0x1a5)](_0xb320cb);if(_0x10f56d[_0x274d23(0x1b5)]!=='waiting')return console[_0x274d23(0x184)]('MFA验证会话状态不正确:\x20'+_0x539d8a+_0x274d23(0x18a)+_0x10f56d[_0x274d23(0x1b5)]),![];return _0x10f56d[_0x274d23(0x1b5)]='resolved',_0x10f56d[_0x274d23(0x188)]=_0x5480ba,_0x10f56d[_0x274d23(0x1a3)]=new Date()[_0x274d23(0x182)](),await fs_1[_0x274d23(0x1a2)][_0x274d23(0x193)](_0x4f7c5f,JSON['stringify'](_0x10f56d),'utf8'),console[_0x274d23(0x184)](_0x274d23(0x185)+_0x5480ba+_0x274d23(0x189)+_0x539d8a),!![];}catch(_0x37bd11){return console['log'](_0x274d23(0x186)+_0x539d8a+',\x20错误:\x20'+(_0x37bd11 instanceof Error?_0x37bd11[_0x274d23(0x190)]:String(_0x37bd11))),![];}}async['cancelMFARequest'](_0x2a6daf,_0x3ab720=a0_0x4730a8(0x1a7)){const _0x29ec61=a0_0x4730a8,_0x76ed03=this[_0x29ec61(0x19a)](_0x2a6daf);try{const _0x1a9f04=await fs_1[_0x29ec61(0x1a2)][_0x29ec61(0x192)](_0x76ed03,_0x29ec61(0x19f)),_0x1ef795=JSON[_0x29ec61(0x1a5)](_0x1a9f04);return _0x1ef795[_0x29ec61(0x1b5)]='rejected',_0x1ef795[_0x29ec61(0x1ac)]=_0x3ab720,_0x1ef795[_0x29ec61(0x1ae)]=new Date()[_0x29ec61(0x182)](),await fs_1['promises'][_0x29ec61(0x193)](_0x76ed03,JSON['stringify'](_0x1ef795),_0x29ec61(0x19f)),console[_0x29ec61(0x184)]('MFA验证已取消:\x20'+_0x2a6daf+_0x29ec61(0x195)+_0x3ab720),!![];}catch(_0x452cfc){return console['log'](_0x29ec61(0x186)+_0x2a6daf+_0x29ec61(0x1b0)+(_0x452cfc instanceof Error?_0x452cfc[_0x29ec61(0x190)]:String(_0x452cfc))),![];}}async[a0_0x4730a8(0x19d)](_0x5b7c7f){const _0x5dde77=this['getSessionFilePath'](_0x5b7c7f);try{return await fs_1['promises']['access'](_0x5dde77),!![];}catch(_0x1a2b3c){return![];}}async[a0_0x4730a8(0x1bb)](){const _0x3f9070=a0_0x4730a8;try{await this[_0x3f9070(0x1be)]();const _0x5b3cc1=await fs_1['promises']['readdir'](this[_0x3f9070(0x1a1)]);return _0x5b3cc1[_0x3f9070(0x1ba)](_0x21dd7c=>_0x21dd7c['endsWith'](_0x3f9070(0x18d)))[_0x3f9070(0x1b7)](_0x31c2de=>_0x31c2de[_0x3f9070(0x199)](_0x3f9070(0x18d),''));}catch(_0x1631f9){return console[_0x3f9070(0x1ac)]('获取活跃会话失败:',_0x1631f9 instanceof Error?_0x1631f9:String(_0x1631f9)),[];}}async[a0_0x4730a8(0x18e)](_0x669e8a=this[a0_0x4730a8(0x1aa)]){const _0x5329f7=a0_0x4730a8;try{await this['ensureStorageDir']();const _0x32fe68=await fs_1['promises'][_0x5329f7(0x1b6)](this[_0x5329f7(0x1a1)]),_0x3a6a84=new Date();let _0x57f503=0x0;for(const _0x2be54d of _0x32fe68){if(!_0x2be54d[_0x5329f7(0x1a6)](_0x5329f7(0x18d)))continue;try{const _0x67ba7e=path_1[_0x5329f7(0x1b1)]['join'](this[_0x5329f7(0x1a1)],_0x2be54d),_0xe442fa=await fs_1[_0x5329f7(0x1a2)][_0x5329f7(0x192)](_0x67ba7e,_0x5329f7(0x19f)),_0x45a300=JSON[_0x5329f7(0x1a5)](_0xe442fa),_0xc87691=new Date(_0x45a300[_0x5329f7(0x1ad)]);_0x3a6a84[_0x5329f7(0x187)]()-_0xc87691['getTime']()>_0x669e8a&&(await fs_1[_0x5329f7(0x1a2)][_0x5329f7(0x18b)](_0x67ba7e),_0x57f503++);}catch(_0x931661){try{await fs_1[_0x5329f7(0x1a2)][_0x5329f7(0x18b)](path_1['default'][_0x5329f7(0x1bc)](this[_0x5329f7(0x1a1)],_0x2be54d)),_0x57f503++;}catch(_0x224a62){console['error'](_0x5329f7(0x19c)+_0x2be54d,_0x224a62 instanceof Error?_0x224a62:String(_0x224a62));}}}_0x57f503>0x0&&console[_0x5329f7(0x184)]('清理了\x20'+_0x57f503+_0x5329f7(0x1c1));}catch(_0x5a2bda){console[_0x5329f7(0x1ac)](_0x5329f7(0x198),_0x5a2bda instanceof Error?_0x5a2bda:String(_0x5a2bda));}}async[a0_0x4730a8(0x19e)](_0x20f54b){const _0x433d8b=a0_0x4730a8,_0x3ff304=this[_0x433d8b(0x19a)](_0x20f54b);try{await fs_1[_0x433d8b(0x1a2)][_0x433d8b(0x18b)](_0x3ff304);}catch(_0x2a7b82){}}}function a0_0x3c7b(){const _0x365e8a=['parse','endsWith','MFA验证已取消','stringify','resolved','DEFAULT_TIMEOUT','defineProperty','error','createdAt','rejectedAt','3137145lBLksm',',\x20错误:\x20','default','19405035TUihRp','MFA验证会话已创建:\x20','6AomcDg','status','readdir','map','10dcSZMv','23624KmtGRJ','filter','getActiveSessions','join','MFA验证超时,请重新登录','ensureStorageDir','rejected','FileMFASessionStorage','\x20个过期的MFA验证会话','toISOString','1XfRRvH','log','MFA验证码已提交:\x20code\x20','未找到MFA验证会话:\x20','getTime','code',',\x20sessionId\x20',',\x20状态:\x20','unlink','556703xkPuiR','.json','cleanupExpiredRequests','__esModule','message','path','readFile','writeFile','waitForMFACode',',\x20原因:\x20','1081830UWLwZt','333288taoDjZ','清理过期请求失败:','replace','getSessionFilePath','2426320JzMbtt','删除过期会话文件失败:\x20','hasSession','cleanupRequest','utf8','now','storageDir','promises','resolvedAt','创建MFA存储目录失败:'];a0_0x3c7b=function(){return _0x365e8a;};return a0_0x3c7b();}exports[a0_0x4730a8(0x1c0)]=FileMFASessionStorage;
1
+ 'use strict';const a0_0x5c6317=a0_0x33a1;(function(_0x858e43,_0x4f861e){const _0xb43b40=a0_0x33a1,_0x4c7b8f=_0x858e43();while(!![]){try{const _0x3d2bab=parseInt(_0xb43b40(0x154))/0x1*(-parseInt(_0xb43b40(0x13e))/0x2)+-parseInt(_0xb43b40(0x178))/0x3*(parseInt(_0xb43b40(0x177))/0x4)+-parseInt(_0xb43b40(0x173))/0x5*(-parseInt(_0xb43b40(0x158))/0x6)+parseInt(_0xb43b40(0x15d))/0x7+-parseInt(_0xb43b40(0x14a))/0x8*(parseInt(_0xb43b40(0x16e))/0x9)+-parseInt(_0xb43b40(0x15b))/0xa+parseInt(_0xb43b40(0x162))/0xb;if(_0x3d2bab===_0x4f861e)break;else _0x4c7b8f['push'](_0x4c7b8f['shift']());}catch(_0x1ca367){_0x4c7b8f['push'](_0x4c7b8f['shift']());}}}(a0_0x339f,0xd4572));function a0_0x339f(){const _0x274adb=['MFA验证已取消','8488452YjBYBc','waiting','code','readdir','创建MFA存储目录失败:','14211725Nvvvtg','mkdir','log','unlink','未找到MFA验证会话:\x20','FileMFASessionStorage','replace','清理了\x20','__importDefault','access','join','resolvedAt','18aiccJA','storageDir','endsWith','default',',\x20状态:\x20','15GhxkWN','error','cleanupExpiredRequests','submitMFACode','5636dyWLuN','921UdrSVz','__esModule','readFile','map','resolved','now','2jslwgZ','status','rejected','message','rejectedAt','toISOString','writeFile','stringify','promises','.json','parse','utf8','2161336JQcgbv','getSessionFilePath','清理过期请求失败:','defineProperty','getActiveSessions','MFA验证会话状态不正确:\x20','cleanupRequest',',\x20sessionId\x20','ensureStorageDir',',\x20错误:\x20','503541ITqlBA','getTime',',\x20原因:\x20','\x20个过期的MFA验证会话','2913066RzhRft','获取活跃会话失败:','DEFAULT_TIMEOUT','16149600BSimjJ'];a0_0x339f=function(){return _0x274adb;};return a0_0x339f();}var __importDefault=this&&this[a0_0x5c6317(0x16a)]||function(_0x33642d){return _0x33642d&&_0x33642d['__esModule']?_0x33642d:{'default':_0x33642d};};Object[a0_0x5c6317(0x14d)](exports,a0_0x5c6317(0x179),{'value':!![]}),exports[a0_0x5c6317(0x167)]=void 0x0;const fs_1=require('fs'),path_1=__importDefault(require('path'));function a0_0x33a1(_0xc48a8d,_0x4212c9){_0xc48a8d=_0xc48a8d-0x13c;const _0x339f70=a0_0x339f();let _0x33a132=_0x339f70[_0xc48a8d];return _0x33a132;}class FileMFASessionStorage{constructor(_0x3e185e){const _0x41d434=a0_0x5c6317;this[_0x41d434(0x15a)]=0x5*0x3c*0x3e8,this[_0x41d434(0x16f)]=_0x3e185e,this[_0x41d434(0x152)]();}async[a0_0x5c6317(0x152)](){const _0x3dd3d9=a0_0x5c6317;try{await fs_1[_0x3dd3d9(0x146)][_0x3dd3d9(0x163)](this[_0x3dd3d9(0x16f)],{'recursive':!![]});}catch(_0x26920d){console[_0x3dd3d9(0x174)](_0x3dd3d9(0x161),_0x26920d);}}[a0_0x5c6317(0x14b)](_0x3d6d62){const _0x996659=a0_0x5c6317;return path_1[_0x996659(0x171)]['join'](this['storageDir'],_0x3d6d62+_0x996659(0x147));}async['waitForMFACode'](_0x2f8861,_0x4963ff=this['DEFAULT_TIMEOUT']){const _0x309714=a0_0x5c6317;await this[_0x309714(0x152)](),await this[_0x309714(0x150)](_0x2f8861);const _0x2d810a={'sessionId':_0x2f8861,'status':_0x309714(0x15e),'createdAt':new Date()[_0x309714(0x143)](),'timeout':_0x4963ff},_0x27b5b4=this[_0x309714(0x14b)](_0x2f8861);return await fs_1[_0x309714(0x146)][_0x309714(0x144)](_0x27b5b4,JSON[_0x309714(0x145)](_0x2d810a),_0x309714(0x149)),console[_0x309714(0x164)]('MFA验证会话已创建:\x20'+_0x2f8861),new Promise((_0x276d1f,_0x1ce846)=>{const _0x26541d=Date['now'](),_0x15eb4a=setInterval(async()=>{const _0x1c6cc1=a0_0x33a1;try{if(Date[_0x1c6cc1(0x13d)]()-_0x26541d>_0x4963ff){clearInterval(_0x15eb4a),await this[_0x1c6cc1(0x150)](_0x2f8861),_0x1ce846(new Error('MFA验证超时,请重新登录'));return;}try{const _0x78c200=await fs_1['promises'][_0x1c6cc1(0x17a)](_0x27b5b4,_0x1c6cc1(0x149)),_0x458463=JSON[_0x1c6cc1(0x148)](_0x78c200);if(_0x458463[_0x1c6cc1(0x13f)]===_0x1c6cc1(0x13c)&&_0x458463[_0x1c6cc1(0x15f)]){clearInterval(_0x15eb4a),await this[_0x1c6cc1(0x150)](_0x2f8861),_0x276d1f(_0x458463[_0x1c6cc1(0x15f)]);return;}if(_0x458463[_0x1c6cc1(0x13f)]===_0x1c6cc1(0x140)&&_0x458463[_0x1c6cc1(0x174)]){clearInterval(_0x15eb4a),await this[_0x1c6cc1(0x150)](_0x2f8861),_0x1ce846(new Error(_0x458463[_0x1c6cc1(0x174)]));return;}}catch(_0x55bc47){}}catch(_0x29824d){clearInterval(_0x15eb4a),await this[_0x1c6cc1(0x150)](_0x2f8861),_0x1ce846(_0x29824d instanceof Error?_0x29824d:new Error(String(_0x29824d)));}},0x3e8);});}async[a0_0x5c6317(0x176)](_0x4e8de3,_0x7a277a){const _0x8b9abc=a0_0x5c6317,_0x5d73ce=this[_0x8b9abc(0x14b)](_0x4e8de3);try{const _0x5c27a2=await fs_1['promises'][_0x8b9abc(0x17a)](_0x5d73ce,_0x8b9abc(0x149)),_0x922930=JSON[_0x8b9abc(0x148)](_0x5c27a2);if(_0x922930['status']!=='waiting')return console[_0x8b9abc(0x164)](_0x8b9abc(0x14f)+_0x4e8de3+_0x8b9abc(0x172)+_0x922930['status']),![];return _0x922930[_0x8b9abc(0x13f)]='resolved',_0x922930[_0x8b9abc(0x15f)]=_0x7a277a,_0x922930[_0x8b9abc(0x16d)]=new Date()['toISOString'](),await fs_1[_0x8b9abc(0x146)]['writeFile'](_0x5d73ce,JSON[_0x8b9abc(0x145)](_0x922930),_0x8b9abc(0x149)),console['log']('MFA验证码已提交:\x20code\x20'+_0x7a277a+_0x8b9abc(0x151)+_0x4e8de3),!![];}catch(_0x2de17a){return console['log'](_0x8b9abc(0x166)+_0x4e8de3+',\x20错误:\x20'+(_0x2de17a instanceof Error?_0x2de17a[_0x8b9abc(0x141)]:String(_0x2de17a))),![];}}async['cancelMFARequest'](_0x42c823,_0x287ac1=a0_0x5c6317(0x15c)){const _0x4c2bb8=a0_0x5c6317,_0x5cb2b3=this[_0x4c2bb8(0x14b)](_0x42c823);try{const _0x523f9a=await fs_1[_0x4c2bb8(0x146)][_0x4c2bb8(0x17a)](_0x5cb2b3,_0x4c2bb8(0x149)),_0x4e0c37=JSON[_0x4c2bb8(0x148)](_0x523f9a);return _0x4e0c37[_0x4c2bb8(0x13f)]=_0x4c2bb8(0x140),_0x4e0c37[_0x4c2bb8(0x174)]=_0x287ac1,_0x4e0c37[_0x4c2bb8(0x142)]=new Date()[_0x4c2bb8(0x143)](),await fs_1[_0x4c2bb8(0x146)]['writeFile'](_0x5cb2b3,JSON[_0x4c2bb8(0x145)](_0x4e0c37),_0x4c2bb8(0x149)),console['log']('MFA验证已取消:\x20'+_0x42c823+_0x4c2bb8(0x156)+_0x287ac1),!![];}catch(_0x572c3a){return console[_0x4c2bb8(0x164)](_0x4c2bb8(0x166)+_0x42c823+_0x4c2bb8(0x153)+(_0x572c3a instanceof Error?_0x572c3a[_0x4c2bb8(0x141)]:String(_0x572c3a))),![];}}async['hasSession'](_0x3b1136){const _0x15db75=a0_0x5c6317,_0x3a700e=this[_0x15db75(0x14b)](_0x3b1136);try{return await fs_1['promises'][_0x15db75(0x16b)](_0x3a700e),!![];}catch(_0x3e4edf){return![];}}async[a0_0x5c6317(0x14e)](){const _0x4b3b4b=a0_0x5c6317;try{await this[_0x4b3b4b(0x152)]();const _0x1e97f3=await fs_1[_0x4b3b4b(0x146)][_0x4b3b4b(0x160)](this[_0x4b3b4b(0x16f)]);return _0x1e97f3['filter'](_0x10eb54=>_0x10eb54[_0x4b3b4b(0x170)](_0x4b3b4b(0x147)))[_0x4b3b4b(0x17b)](_0x2ed9fa=>_0x2ed9fa[_0x4b3b4b(0x168)](_0x4b3b4b(0x147),''));}catch(_0x4ecc58){return console[_0x4b3b4b(0x174)](_0x4b3b4b(0x159),_0x4ecc58 instanceof Error?_0x4ecc58:String(_0x4ecc58)),[];}}async[a0_0x5c6317(0x175)](_0x122db9=this['DEFAULT_TIMEOUT']){const _0x1c8ab0=a0_0x5c6317;try{await this[_0x1c8ab0(0x152)]();const _0xc4ec71=await fs_1[_0x1c8ab0(0x146)]['readdir'](this[_0x1c8ab0(0x16f)]),_0x165841=new Date();let _0x294014=0x0;for(const _0x17dc34 of _0xc4ec71){if(!_0x17dc34[_0x1c8ab0(0x170)]('.json'))continue;try{const _0x57935c=path_1[_0x1c8ab0(0x171)][_0x1c8ab0(0x16c)](this[_0x1c8ab0(0x16f)],_0x17dc34),_0x2c74cb=await fs_1[_0x1c8ab0(0x146)][_0x1c8ab0(0x17a)](_0x57935c,'utf8'),_0x48356e=JSON[_0x1c8ab0(0x148)](_0x2c74cb),_0x2ae058=new Date(_0x48356e['createdAt']);_0x165841[_0x1c8ab0(0x155)]()-_0x2ae058[_0x1c8ab0(0x155)]()>_0x122db9&&(await fs_1[_0x1c8ab0(0x146)][_0x1c8ab0(0x165)](_0x57935c),_0x294014++);}catch(_0x23bad8){try{await fs_1[_0x1c8ab0(0x146)][_0x1c8ab0(0x165)](path_1[_0x1c8ab0(0x171)][_0x1c8ab0(0x16c)](this[_0x1c8ab0(0x16f)],_0x17dc34)),_0x294014++;}catch(_0x1ef3b7){console['error']('删除过期会话文件失败:\x20'+_0x17dc34,_0x1ef3b7 instanceof Error?_0x1ef3b7:String(_0x1ef3b7));}}}_0x294014>0x0&&console[_0x1c8ab0(0x164)](_0x1c8ab0(0x169)+_0x294014+_0x1c8ab0(0x157));}catch(_0x55ce66){console[_0x1c8ab0(0x174)](_0x1c8ab0(0x14c),_0x55ce66 instanceof Error?_0x55ce66:String(_0x55ce66));}}async[a0_0x5c6317(0x150)](_0x40f669){const _0x3609ed=a0_0x5c6317,_0x2f6c52=this[_0x3609ed(0x14b)](_0x40f669);try{await fs_1[_0x3609ed(0x146)][_0x3609ed(0x165)](_0x2f6c52);}catch(_0x18667d){}}}exports[a0_0x5c6317(0x167)]=FileMFASessionStorage;