@gooin/garmin-connect 1.8.5 → 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 +17 -3
  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 +4 -1
  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 +11 -1
  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 +15 -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 +1 -1
@@ -1 +1 @@
1
- 'use strict';const a2_0x21807e=a2_0xc98e;(function(_0x3ab901,_0x4bfea6){const _0x36eb7f=a2_0xc98e,_0x3b68bd=_0x3ab901();while(!![]){try{const _0x1888ff=parseInt(_0x36eb7f(0xb6))/0x1+-parseInt(_0x36eb7f(0x70))/0x2*(-parseInt(_0x36eb7f(0xc0))/0x3)+-parseInt(_0x36eb7f(0x115))/0x4*(-parseInt(_0x36eb7f(0xcb))/0x5)+parseInt(_0x36eb7f(0xea))/0x6+-parseInt(_0x36eb7f(0xc1))/0x7*(parseInt(_0x36eb7f(0xa0))/0x8)+parseInt(_0x36eb7f(0x89))/0x9*(-parseInt(_0x36eb7f(0x77))/0xa)+parseInt(_0x36eb7f(0xff))/0xb*(-parseInt(_0x36eb7f(0xe9))/0xc);if(_0x1888ff===_0x4bfea6)break;else _0x3b68bd['push'](_0x3b68bd['shift']());}catch(_0x496959){_0x3b68bd['push'](_0x3b68bd['shift']());}}}(a2_0x5a39,0xea072));function a2_0xc98e(_0x29d107,_0x90a0cc){_0x29d107=_0x29d107-0x6e;const _0x5a3966=a2_0x5a39();let _0xc98e76=_0x5a3966[_0x29d107];return _0xc98e76;}var __importDefault=this&&this[a2_0x21807e(0x7d)]||function(_0x137c6c){const _0x397c5a=a2_0x21807e;return _0x137c6c&&_0x137c6c[_0x397c5a(0xa8)]?_0x137c6c:{'default':_0x137c6c};};Object[a2_0x21807e(0xb2)](exports,'__esModule',{'value':!![]}),exports[a2_0x21807e(0xf9)]=void 0x0;function a2_0x5a39(){const _0x36983b=['DELETE','url','status','响应跟踪\x20-\x20重定向次数:','handleResponseError','append','responseURL','isAxiosError','axios-cookiejar-support','request','<title>([^<]*)</title>','mfa-code','logintoken','tough-cookie','No\x20OAuth2\x20token\x20available\x20(登录失败,密码错误)','oauth-1.0a','interceptors','348DiWDHE','5850186joOsQt','」在「','digest','domain','verifyMFA','未找到OAuth消费者信息','access_token','setOauth2TokenExpiresAt','fetchOauthConsumer','HTTP\x20Error\x20(','/tmp','./MFAManager','performLoginStep2','common','expires_in','HttpClient','MFA验证\x20-\x20未找到CSRF令牌','OAUTH_CONSUMER','signin','extractTicket','handleMFA','901153YOGmcL','update','performLoginStep1','toSeconds','base64','No\x20OAuth2\x20token\x20available','node:crypto','use','登录页面标题:','登录失败(需要更新电话号码),请更新您的电话号码,参考:\x20https://github.com/matin/garth/issues/19','checkTokenVaild','includes','MFA验证失败:\x20','DateTime','):\x20','Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/117.0.0.0\x20Safari/537.36','响应跟踪\x20-\x20状态码:','refreshOauth2Token','getInstance','无法从MFA页面提取CSRF令牌','file','/exchange/user/2.0','7296156NTbjaN','config','handleAccountLocked','检测到重定向到包含logintoken的URL:','stringify','com.garmin.android.apps.connectmobile','Update\x20Phone\x20Number','oauth_token','authentication','var\x20statuss*=s*\x22([^\x22]*)\x22','username','toString','client','oauth1Token','performLoginStep3','/verifyMFA/loginEnterMfaCode','sha1','GarminConnect','41718VPTwDk','delete','true','get','toLocal','handleError','submitMFACode','24770msbDSO','token','_retry','now','setupInterceptors','parse','__importDefault','」的OAuth2令牌刷新成功','onTokenChange','mfa','extractCsrfToken','lodash','default','expires_at','\x20ms','Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_15_7)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/131.0.0.0\x20Safari/537.36','put','exchange','45ESCFgg','response','缺少刷新令牌所需的必要令牌','Login\x20failed:','toHeader','HTTP\x20Error:','oauth2Token','waitForMFACode','登录失败(账户已锁定),请打开Connect网页解锁您的账户','Request\x20Timeout','application/x-www-form-urlencoded','handleHttpError','axios','gauth-widget','location','🚀\x20-\x20handleMFA\x20-\x20mfaCode:','exec','GARMIN_SSO_EMBED','headers','CookieJar','logResponseTracking','Authorization','log','16HZLKlx','step1Params','oauth_token_secret','authorize','MFA验证后的页面标题:','setCommonHeader','message','each','__esModule','Request\x20Timeout:\x20>\x20','toLowerCase','validateMFAResult','step3Params','响应跟踪\x20-\x20Location头:','/preauthorized?','OAUTH_URL','MFA验证失败:','响应跟踪\x20-\x20检测到重定向状态码:','defineProperty','post','🚀\x20-\x20getLoginTicket\x20-\x20收到验证码\x20mfaCode:','getOauthClient','806041unhboP','oauth','password','timeout','consumer_key','handlePageTitle','luxon','POST','mfaManager','🚀\x20-\x20getLoginTicket\x20-\x20等待验证码\x20sessionId:','165OZNWdy','4919691wbDAAR','data','_csrf','getLoginTicket','HMAC-SHA1','createHmac','ECONNABORTED','prepareLoginParams','登录失败(需要MFA验证),请提供MFA回调函数','Token\x20expired!','5koDYUA','GARMIN_SSO_ORIGIN','plus','code','error','GARMIN_SSO','isMFARequired','GET','embed','SIGNIN_URL','handleMFAWithCode','https://thegarth.s3.amazonaws.com/oauth_consumer.json','object'];a2_0x5a39=function(){return _0x36983b;};return a2_0x5a39();}const axios_1=__importDefault(require(a2_0x21807e(0x95))),lodash_1=__importDefault(require(a2_0x21807e(0x82))),luxon_1=require(a2_0x21807e(0xbc)),oauth_1_0a_1=__importDefault(require(a2_0x21807e(0xe7))),qs_1=__importDefault(require('qs')),MFAManager_1=require(a2_0x21807e(0xf5)),node_crypto_1=__importDefault(require(a2_0x21807e(0x105))),tough_cookie_1=require(a2_0x21807e(0xe5)),axios_cookiejar_support_1=require(a2_0x21807e(0xe0)),CSRF_RE=new RegExp('name=\x22_csrf\x22\x5cs+value=\x22(.+?)\x22'),TICKET_RE=new RegExp('ticket=([^\x22]+)\x22'),ACCOUNT_LOCKED_RE=new RegExp(a2_0x21807e(0x11e)),PAGE_TITLE_RE=new RegExp(a2_0x21807e(0xe2)),USER_AGENT_CONNECTMOBILE=a2_0x21807e(0x11a),USER_AGENT_BROWSER=a2_0x21807e(0x10e),USER_AGENT_BROWSER_MAC=a2_0x21807e(0x86),OAUTH_CONSUMER_URL=a2_0x21807e(0xd6),HTTP_STATUS={'UNAUTHORIZED':0x191};let tokenRefreshPromise=null,refreshSubscribers=[];class HttpClient{constructor(_0x32162f,_0x118d83){const _0x3be3e3=a2_0x21807e;var _0x1cd566,_0x177a00;const _0x315a11=new tough_cookie_1[(_0x3be3e3(0x9c))]();this[_0x3be3e3(0xd9)]=_0x32162f,this[_0x3be3e3(0x121)]=(0x0,axios_cookiejar_support_1['wrapper'])(axios_1[_0x3be3e3(0x83)]['create']({'timeout':(_0x1cd566=_0x118d83===null||_0x118d83===void 0x0?void 0x0:_0x118d83['timeout'])!==null&&_0x1cd566!==void 0x0?_0x1cd566:0x1388,'timeoutErrorMessage':_0x3be3e3(0xa9)+((_0x177a00=_0x118d83===null||_0x118d83===void 0x0?void 0x0:_0x118d83[_0x3be3e3(0xb9)])!==null&&_0x177a00!==void 0x0?_0x177a00:0x1388)+_0x3be3e3(0x85),'maxRedirects':0xa,'validateStatus':function(_0x247108){return _0x247108>=0xc8&&_0x247108<0x190;},'withCredentials':!![],'jar':_0x315a11})),this[_0x3be3e3(0x116)]=_0x118d83;const _0x159344=_0x118d83[_0x3be3e3(0x80)]||{'type':_0x3be3e3(0x113),'dir':_0x118d83['mfaStorageDir']||_0x3be3e3(0xf4)};this[_0x3be3e3(0xbe)]=MFAManager_1['MFAManager'][_0x3be3e3(0x111)](_0x159344),this[_0x3be3e3(0x7b)]();}[a2_0x21807e(0x7b)](){const _0x6fa81d=a2_0x21807e;this[_0x6fa81d(0x121)][_0x6fa81d(0xe8)][_0x6fa81d(0x8a)][_0x6fa81d(0x106)](_0x21a39a=>{return _0x21a39a;},async _0x4251a7=>{const _0x37a1ec=_0x6fa81d;return this[_0x37a1ec(0xdc)](_0x4251a7);}),this['client']['interceptors'][_0x6fa81d(0xe1)][_0x6fa81d(0x106)](async _0x195e42=>{const _0x535b20=_0x6fa81d;return this['oauth2Token']&&(_0x195e42[_0x535b20(0x9b)][_0x535b20(0x9e)]='Bearer\x20'+this[_0x535b20(0x8f)]['access_token']),_0x195e42;});}[a2_0x21807e(0x9d)](_0x80848d){const _0x242efb=a2_0x21807e;var _0x469c51,_0x141fb4,_0x228fc5,_0x5ba0fd;(((_0x469c51=_0x80848d[_0x242efb(0x116)][_0x242efb(0xd9)])===null||_0x469c51===void 0x0?void 0x0:_0x469c51[_0x242efb(0x10a)]('signin'))||((_0x141fb4=_0x80848d[_0x242efb(0x116)][_0x242efb(0xd9)])===null||_0x141fb4===void 0x0?void 0x0:_0x141fb4[_0x242efb(0x10a)](_0x242efb(0xee))))&&(console['log']('>\x20响应跟踪\x20-\x20URL:',_0x80848d[_0x242efb(0x116)][_0x242efb(0xd9)]),console[_0x242efb(0x9f)](_0x242efb(0x10f),_0x80848d[_0x242efb(0xda)]),console[_0x242efb(0x9f)]('响应跟踪\x20-\x20最终URL:',((_0x228fc5=_0x80848d[_0x242efb(0xe1)])===null||_0x228fc5===void 0x0?void 0x0:_0x228fc5[_0x242efb(0xde)])||_0x80848d[_0x242efb(0x116)][_0x242efb(0xd9)]),console[_0x242efb(0x9f)](_0x242efb(0xdb),((_0x5ba0fd=_0x80848d[_0x242efb(0xe1)])===null||_0x5ba0fd===void 0x0?void 0x0:_0x5ba0fd['redirectCount'])||0x0),_0x80848d[_0x242efb(0x9b)][_0x242efb(0x97)]&&console[_0x242efb(0x9f)](_0x242efb(0xad),_0x80848d[_0x242efb(0x9b)]['location']),_0x80848d[_0x242efb(0xda)]>=0x12c&&_0x80848d[_0x242efb(0xda)]<0x190&&console[_0x242efb(0x9f)](_0x242efb(0xb1),_0x80848d[_0x242efb(0xda)]));}async[a2_0x21807e(0xdc)](_0x543964){const _0x283b58=a2_0x21807e;var _0x3d46cc,_0x1b933d,_0x478868;if(axios_1[_0x283b58(0x83)][_0x283b58(0xdf)](_0x543964)&&_0x543964[_0x283b58(0xce)]===_0x283b58(0xc7))throw new Error(_0x543964[_0x283b58(0xa6)]||_0x283b58(0x92));const _0x2f3e84=_0x543964[_0x283b58(0x116)];if(((_0x3d46cc=_0x543964===null||_0x543964===void 0x0?void 0x0:_0x543964['response'])===null||_0x3d46cc===void 0x0?void 0x0:_0x3d46cc[_0x283b58(0xda)])===HTTP_STATUS['UNAUTHORIZED']&&!(_0x2f3e84===null||_0x2f3e84===void 0x0?void 0x0:_0x2f3e84[_0x283b58(0x79)])){if(!this[_0x283b58(0x8f)]){if(((_0x1b933d=_0x2f3e84===null||_0x2f3e84===void 0x0?void 0x0:_0x2f3e84[_0x283b58(0xd9)])===null||_0x1b933d===void 0x0?void 0x0:_0x1b933d[_0x283b58(0x10a)](_0x283b58(0xfc)))||((_0x478868=_0x2f3e84===null||_0x2f3e84===void 0x0?void 0x0:_0x2f3e84['url'])===null||_0x478868===void 0x0?void 0x0:_0x478868[_0x283b58(0x10a)]('login')))throw new Error(_0x283b58(0xe6));throw new Error(_0x283b58(0x104));}_0x2f3e84[_0x283b58(0x79)]=!![];try{return!tokenRefreshPromise&&(tokenRefreshPromise=this[_0x283b58(0x110)]()['finally'](()=>{tokenRefreshPromise=null;})),await tokenRefreshPromise,_0x2f3e84[_0x283b58(0x9b)][_0x283b58(0x9e)]='Bearer\x20'+this[_0x283b58(0x8f)][_0x283b58(0xf0)],this[_0x283b58(0x121)](_0x2f3e84);}catch(_0x29b6ea){console['error']('Token\x20refresh\x20failed:',_0x29b6ea);throw _0x29b6ea;}}if(axios_1['default'][_0x283b58(0xdf)](_0x543964)&&_0x543964[_0x283b58(0x8a)])this[_0x283b58(0x75)](_0x543964[_0x283b58(0x8a)]);else throw new Error('Network\x20error\x20or\x20unknown\x20error\x20occurred');throw _0x543964;}async[a2_0x21807e(0xf2)](){const _0x1ca399=a2_0x21807e,_0x15f9c8=await axios_1['default']['get'](OAUTH_CONSUMER_URL);this[_0x1ca399(0xfb)]={'key':_0x15f9c8[_0x1ca399(0xc2)][_0x1ca399(0xba)],'secret':_0x15f9c8[_0x1ca399(0xc2)]['consumer_secret']};}async[a2_0x21807e(0x109)](){const _0x22aa41=a2_0x21807e;this[_0x22aa41(0x8f)]&&(this[_0x22aa41(0x8f)][_0x22aa41(0x84)]<luxon_1[_0x22aa41(0x10c)]['now']()[_0x22aa41(0x102)]()&&(console[_0x22aa41(0xcf)](_0x22aa41(0xca)),await this[_0x22aa41(0x110)]()));}async[a2_0x21807e(0x73)](_0x82e99e,_0x35d8ec){const _0x549455=a2_0x21807e,_0x4c618b=await this[_0x549455(0x121)]['get'](_0x82e99e,_0x35d8ec);return _0x4c618b===null||_0x4c618b===void 0x0?void 0x0:_0x4c618b[_0x549455(0xc2)];}async[a2_0x21807e(0xb3)](_0x4de844,_0x3ec3d9,_0xe911b3){const _0x379fc0=a2_0x21807e,_0x5abcc2=await this[_0x379fc0(0x121)][_0x379fc0(0xb3)](_0x4de844,_0x3ec3d9,_0xe911b3);return _0x5abcc2===null||_0x5abcc2===void 0x0?void 0x0:_0x5abcc2[_0x379fc0(0xc2)];}async[a2_0x21807e(0x87)](_0x18b6ef,_0xb61f26,_0x2d25d3){const _0x5af175=a2_0x21807e,_0x2aa90b=await this[_0x5af175(0x121)][_0x5af175(0x87)](_0x18b6ef,_0xb61f26,_0x2d25d3);return _0x2aa90b===null||_0x2aa90b===void 0x0?void 0x0:_0x2aa90b[_0x5af175(0xc2)];}async[a2_0x21807e(0x71)](_0x3d9ec1,_0x31ef61){const _0x212286=a2_0x21807e,_0x443e25=await this[_0x212286(0x121)]['post'](_0x3d9ec1,null,{..._0x31ef61,'headers':{..._0x31ef61===null||_0x31ef61===void 0x0?void 0x0:_0x31ef61[_0x212286(0x9b)],'X-Http-Method-Override':_0x212286(0xd8)}});return _0x443e25===null||_0x443e25===void 0x0?void 0x0:_0x443e25[_0x212286(0xc2)];}[a2_0x21807e(0xa5)](_0x4f1b8f){const _0x302d92=a2_0x21807e;lodash_1[_0x302d92(0x83)][_0x302d92(0xa7)](_0x4f1b8f,(_0x4edd56,_0x3ebf08)=>{const _0x3021f6=_0x302d92;this['client']['defaults'][_0x3021f6(0x9b)][_0x3021f6(0xf7)][_0x3ebf08]=_0x4edd56;});}[a2_0x21807e(0x75)](_0xfcf553){const _0x3f8c99=a2_0x21807e;this[_0x3f8c99(0x94)](_0xfcf553);}[a2_0x21807e(0x94)](_0x53357e){const _0x4a2fbb=a2_0x21807e,{status:_0x28c58b,statusText:_0x599fc8,data:_0x475bab}=_0x53357e,_0x3bff89={'status':_0x28c58b,'statusText':_0x599fc8,'data':typeof _0x475bab===_0x4a2fbb(0xd7)?JSON['stringify'](_0x475bab):_0x475bab};console[_0x4a2fbb(0xcf)](_0x4a2fbb(0x8e),_0x3bff89);throw new Error(_0x4a2fbb(0xf3)+_0x28c58b+_0x4a2fbb(0x10d)+_0x599fc8);}async['login'](_0x580019,_0x5ab083,_0xe52e05){const _0x1d74f4=a2_0x21807e;try{await this['fetchOauthConsumer']();const _0x371a8e=await this[_0x1d74f4(0xc4)](_0x580019,_0x5ab083,_0xe52e05),_0x412809=await this['getOauth1Token'](_0x371a8e);return await this[_0x1d74f4(0x88)](_0x412809),this;}catch(_0x4786a5){console['error'](_0x1d74f4(0x8c),_0x4786a5);throw _0x4786a5;}}async['getLoginTicket'](_0x77b3cd,_0x1ffe29,_0x2f0708){const _0x4e7d69=a2_0x21807e,_0x3ef9b4=this['prepareLoginParams']();await this['performLoginStep1'](_0x3ef9b4[_0x4e7d69(0xa1)]);const _0x135a86=await this[_0x4e7d69(0xf6)](_0x3ef9b4['step2Params']);let _0x46e4f4=await this['performLoginStep3'](_0x77b3cd,_0x1ffe29,_0x135a86,_0x3ef9b4[_0x4e7d69(0xac)]);this[_0x4e7d69(0x117)](_0x46e4f4);const _0x2ba3f5=this[_0x4e7d69(0xbb)](_0x46e4f4);if(this[_0x4e7d69(0xd1)](_0x2ba3f5)){if(_0x2f0708){console[_0x4e7d69(0x9f)](_0x4e7d69(0xbf),_0x2f0708);const _0x4181e6=await this['mfaManager'][_0x4e7d69(0x90)](_0x2f0708);console['log'](_0x4e7d69(0xb4),_0x4181e6),_0x46e4f4=await this[_0x4e7d69(0xd5)](_0x46e4f4,_0x3ef9b4[_0x4e7d69(0xac)],_0x4181e6);}else throw new Error('需要MFA验证,但未提供验证码获取方式');}const _0xc628d1=this['extractTicket'](_0x46e4f4);if(!_0xc628d1)throw new Error('登录失败(未找到票据或MFA验证失败),请检查用户名和密码');return _0xc628d1;}[a2_0x21807e(0xc8)](){const _0x220a85=a2_0x21807e;return{'step1Params':{'clientId':_0x220a85(0x6f),'locale':'en','service':this[_0x220a85(0xd9)]['GC_MODERN']},'step2Params':{'id':_0x220a85(0x96),'embedWidget':!![],'locale':'en','gauthHost':this[_0x220a85(0xd9)][_0x220a85(0x9a)]},'step3Params':{'id':'gauth-widget','embedWidget':!![],'clientId':'GarminConnect','locale':'en','gauthHost':this[_0x220a85(0xd9)][_0x220a85(0x9a)],'service':this['url'][_0x220a85(0x9a)],'source':this[_0x220a85(0xd9)]['GARMIN_SSO_EMBED'],'redirectAfterAccountLoginUrl':this[_0x220a85(0xd9)][_0x220a85(0x9a)],'redirectAfterAccountCreationUrl':this[_0x220a85(0xd9)][_0x220a85(0x9a)]}};}async[a2_0x21807e(0x101)](_0x1f54ef){const _0x1b1e73=a2_0x21807e,_0xca9085=this[_0x1b1e73(0xd9)][_0x1b1e73(0x9a)]+'?'+qs_1[_0x1b1e73(0x83)]['stringify'](_0x1f54ef);await this[_0x1b1e73(0x121)][_0x1b1e73(0x73)](_0xca9085);}async[a2_0x21807e(0xf6)](_0x32cafd){const _0x46013a=a2_0x21807e,_0x41f9fb=this[_0x46013a(0xd9)][_0x46013a(0xd4)]+'?'+qs_1[_0x46013a(0x83)][_0x46013a(0x119)](_0x32cafd),_0x5a7282=await this['get'](_0x41f9fb),_0x133fa9=this[_0x46013a(0x81)](_0x5a7282);if(!_0x133fa9)throw new Error('登录\x20-\x20未找到CSRF令牌');return _0x133fa9;}async[a2_0x21807e(0x123)](_0x363fc3,_0x321fcf,_0x41e9e4,_0x7efb4a){const _0xaa79de=a2_0x21807e,_0x4db5ff=this[_0xaa79de(0xd9)]['SIGNIN_URL']+'?'+qs_1[_0xaa79de(0x83)][_0xaa79de(0x119)](_0x7efb4a),_0x124c75=new URLSearchParams();return _0x124c75[_0xaa79de(0xdd)](_0xaa79de(0x11f),_0x363fc3),_0x124c75[_0xaa79de(0xdd)](_0xaa79de(0xb8),_0x321fcf),_0x124c75['append']('embed','true'),_0x124c75['append'](_0xaa79de(0xc3),_0x41e9e4),this[_0xaa79de(0xb3)](_0x4db5ff,_0x124c75,{'headers':{'Content-Type':_0xaa79de(0x93),'Dnt':0x1,'Origin':this[_0xaa79de(0xd9)][_0xaa79de(0xcc)],'Referer':this[_0xaa79de(0xd9)]['SIGNIN_URL'],'User-Agent':USER_AGENT_CONNECTMOBILE}});}[a2_0x21807e(0xd1)](_0x4b212a){const _0x1060a2=a2_0x21807e,_0x5dc882=_0x4b212a[_0x1060a2(0xaa)]();return _0x5dc882['includes'](_0x1060a2(0x80))||_0x5dc882['includes'](_0x1060a2(0x11d))&&!_0x5dc882[_0x1060a2(0x10a)]('sign');}[a2_0x21807e(0xfd)](_0x23dcf5){const _0x5c8b00=a2_0x21807e,_0xb2632b=TICKET_RE[_0x5c8b00(0x99)](_0x23dcf5);return _0xb2632b?_0xb2632b[0x1]:null;}async[a2_0x21807e(0xd5)](_0x3fb456,_0x59d403,_0x389270){const _0x680a5e=a2_0x21807e;try{const _0x126cfe=this[_0x680a5e(0x81)](_0x3fb456);if(!_0x126cfe)throw new Error(_0x680a5e(0xfa));const _0xb41db7=await this[_0x680a5e(0x76)](_0x126cfe,_0x389270,_0x59d403);return this['validateMFAResult'](_0xb41db7);}catch(_0x424b40){console[_0x680a5e(0xcf)](_0x680a5e(0xb0),_0x424b40);throw new Error(_0x680a5e(0x10b)+_0x424b40);}}async[a2_0x21807e(0xfe)](_0x5c4d33,_0x3bc0db,_0x40d5ed){const _0x436e37=a2_0x21807e;if(!_0x40d5ed)throw new Error(_0x436e37(0xc9));const _0x126835=this[_0x436e37(0x81)](_0x5c4d33);if(!_0x126835)throw new Error(_0x436e37(0x112));const _0x2d22f2=await _0x40d5ed();console[_0x436e37(0x9f)](_0x436e37(0x98),_0x2d22f2);const _0xca5e13=await this[_0x436e37(0x76)](_0x126835,_0x2d22f2,_0x3bc0db);return this['validateMFAResult'](_0xca5e13);}async[a2_0x21807e(0x76)](_0x3f562d,_0x4e802f,_0x330d24){const _0x1bd895=a2_0x21807e,_0x2c151c=this[_0x1bd895(0xd9)][_0x1bd895(0xd0)],_0x5aa43e=new URLSearchParams();return _0x5aa43e['append'](_0x1bd895(0xe3),_0x4e802f),_0x5aa43e['append'](_0x1bd895(0xd3),_0x1bd895(0x72)),_0x5aa43e[_0x1bd895(0xdd)](_0x1bd895(0xc3),_0x3f562d),this[_0x1bd895(0xb3)](_0x2c151c+_0x1bd895(0x124),_0x5aa43e,{'params':_0x330d24,'headers':{'Content-Type':_0x1bd895(0x93),'Dnt':0x1,'Origin':this[_0x1bd895(0xd9)][_0x1bd895(0xcc)],'Referer':_0x2c151c+'/signin','User-Agent':USER_AGENT_BROWSER},'maxRedirects':0xa,'transformResponse':[function(_0x161cc0,_0x367326){const _0x1e893d=_0x1bd895;return _0x367326[_0x1e893d(0x97)]&&_0x367326['location'][_0x1e893d(0x10a)](_0x1e893d(0xe4))&&console['log'](_0x1e893d(0x118),_0x367326[_0x1e893d(0x97)]),_0x161cc0;}]});}[a2_0x21807e(0xab)](_0x3fc5aa){const _0x29965a=a2_0x21807e,_0x2dbd03=this[_0x29965a(0xbb)](_0x3fc5aa);return console['log'](_0x29965a(0xa4),_0x2dbd03),_0x3fc5aa;}[a2_0x21807e(0x81)](_0x14700b){const _0x43e807=a2_0x21807e,_0x2cffc7=CSRF_RE[_0x43e807(0x99)](_0x14700b);return _0x2cffc7?_0x2cffc7[0x1]:null;}[a2_0x21807e(0xbb)](_0x540f33){const _0x644812=a2_0x21807e,_0x18c964=PAGE_TITLE_RE[_0x644812(0x99)](_0x540f33);if(_0x18c964){const _0x20ba19=_0x18c964[0x1];console[_0x644812(0x9f)](_0x644812(0x107),_0x20ba19);if(lodash_1[_0x644812(0x83)][_0x644812(0x10a)](_0x20ba19,_0x644812(0x11b)))throw new Error(_0x644812(0x108));return _0x20ba19;}else throw new Error('登录失败(未找到页面标题)');}['handleAccountLocked'](_0x57a6fb){const _0x5952a3=a2_0x21807e,_0x32edb4=ACCOUNT_LOCKED_RE[_0x5952a3(0x99)](_0x57a6fb);if(_0x32edb4){const _0x149070=_0x32edb4[0x1];console[_0x5952a3(0xcf)](_0x149070);throw new Error(_0x5952a3(0x91));}}async[a2_0x21807e(0x110)](){const _0x4fad36=a2_0x21807e;try{!this[_0x4fad36(0xfb)]&&await this['fetchOauthConsumer']();if(!this[_0x4fad36(0x8f)]||!this['oauth1Token'])throw new Error(_0x4fad36(0x8b));const _0x1a5c98={'oauth':this[_0x4fad36(0xb5)](this[_0x4fad36(0xfb)]),'token':this['oauth1Token']};await this[_0x4fad36(0x88)](_0x1a5c98),console[_0x4fad36(0x9f)]('「'+this[_0x4fad36(0x116)][_0x4fad36(0x11f)]+_0x4fad36(0xeb)+this[_0x4fad36(0xd9)][_0x4fad36(0xed)]+_0x4fad36(0x7e));}catch(_0x312622){console[_0x4fad36(0xcf)]('刷新OAuth2令牌失败:',_0x312622);throw _0x312622;}}async['getOauth1Token'](_0x5b73e3){const _0x5c75cf=a2_0x21807e;if(!this[_0x5c75cf(0xfb)])throw new Error(_0x5c75cf(0xef));const _0x4bd7e3={'ticket':_0x5b73e3,'login-url':this[_0x5c75cf(0xd9)]['GARMIN_SSO_EMBED'],'accepts-mfa-tokens':!![]},_0x3079ef=this[_0x5c75cf(0xd9)][_0x5c75cf(0xaf)]+_0x5c75cf(0xae)+qs_1[_0x5c75cf(0x83)][_0x5c75cf(0x119)](_0x4bd7e3),_0x301238=this[_0x5c75cf(0xb5)](this['OAUTH_CONSUMER']),_0x2f7424={'url':_0x3079ef,'method':_0x5c75cf(0xd2)},_0x5dfc89=_0x301238[_0x5c75cf(0x8d)](_0x301238[_0x5c75cf(0xa3)](_0x2f7424)),_0x1e0e3f=await this[_0x5c75cf(0x73)](_0x3079ef,{'headers':{..._0x5dfc89,'User-Agent':USER_AGENT_CONNECTMOBILE}}),_0x303786=qs_1['default'][_0x5c75cf(0x7c)](_0x1e0e3f);return this[_0x5c75cf(0x122)]=_0x303786,{'token':_0x303786,'oauth':_0x301238};}[a2_0x21807e(0xb5)](_0x875f6c){const _0x3c960f=a2_0x21807e;return new oauth_1_0a_1[(_0x3c960f(0x83))]({'consumer':_0x875f6c,'signature_method':_0x3c960f(0xc5),'hash_function'(_0x3a15fb,_0x5a6f08){const _0x3d6095=_0x3c960f;return node_crypto_1['default'][_0x3d6095(0xc6)](_0x3d6095(0x6e),_0x5a6f08)[_0x3d6095(0x100)](_0x3a15fb)[_0x3d6095(0xec)](_0x3d6095(0x103));}});}async[a2_0x21807e(0x88)](_0xc99acb){const _0x2b8daf=a2_0x21807e,_0x1a9b80={'key':_0xc99acb[_0x2b8daf(0x78)][_0x2b8daf(0x11c)],'secret':_0xc99acb['token'][_0x2b8daf(0xa2)]},_0x5278f6=this[_0x2b8daf(0xd9)][_0x2b8daf(0xaf)]+_0x2b8daf(0x114),_0x49a02e={'url':_0x5278f6,'method':_0x2b8daf(0xbd),'data':null},_0x50d0a1=_0xc99acb[_0x2b8daf(0xb7)]['authorize'](_0x49a02e,_0x1a9b80),_0x3fce5a=_0x5278f6+'?'+qs_1[_0x2b8daf(0x83)][_0x2b8daf(0x119)](_0x50d0a1);this[_0x2b8daf(0x8f)]=undefined;const _0x443e57=await this['post'](_0x3fce5a,null,{'headers':{'User-Agent':USER_AGENT_CONNECTMOBILE,'Content-Type':_0x2b8daf(0x93)}});this[_0x2b8daf(0x8f)]=this[_0x2b8daf(0xf1)](_0x443e57),this['onTokenChange']&&this[_0x2b8daf(0x122)]&&this[_0x2b8daf(0x8f)]&&this[_0x2b8daf(0x7f)]({'oauth1':this[_0x2b8daf(0x122)],'oauth2':this[_0x2b8daf(0x8f)]});}[a2_0x21807e(0xf1)](_0xd038c7){const _0x212e76=a2_0x21807e,_0x335b48=luxon_1[_0x212e76(0x10c)][_0x212e76(0x7a)](),_0x3eeb63=_0x335b48[_0x212e76(0xcd)]({'seconds':_0xd038c7[_0x212e76(0xf8)]}),_0x13fc24=_0x335b48['plus']({'seconds':_0xd038c7['refresh_token_expires_in']});return{..._0xd038c7,'last_update_date':_0x335b48['toLocal']()[_0x212e76(0x120)](),'expires_date':_0x3eeb63[_0x212e76(0x74)]()[_0x212e76(0x120)](),'expires_at':_0x3eeb63[_0x212e76(0x102)](),'refresh_token_expires_at':_0x13fc24[_0x212e76(0x102)]()};}}exports[a2_0x21807e(0xf9)]=HttpClient;
1
+ 'use strict';const a2_0x52e9fc=a2_0x5385;(function(_0xc67b72,_0x36f073){const _0x221a42=a2_0x5385,_0x3479cb=_0xc67b72();while(!![]){try{const _0x24c45d=-parseInt(_0x221a42(0x1cd))/0x1*(-parseInt(_0x221a42(0x14c))/0x2)+parseInt(_0x221a42(0x1e7))/0x3+-parseInt(_0x221a42(0x199))/0x4+parseInt(_0x221a42(0x166))/0x5*(-parseInt(_0x221a42(0x15f))/0x6)+-parseInt(_0x221a42(0x181))/0x7*(-parseInt(_0x221a42(0x177))/0x8)+parseInt(_0x221a42(0x1df))/0x9+parseInt(_0x221a42(0x141))/0xa;if(_0x24c45d===_0x36f073)break;else _0x3479cb['push'](_0x3479cb['shift']());}catch(_0x8a57e6){_0x3479cb['push'](_0x3479cb['shift']());}}}(a2_0x4e4d,0x73bf9));var __importDefault=this&&this['__importDefault']||function(_0x3166d9){const _0x4e5ab1=a2_0x5385;return _0x3166d9&&_0x3166d9[_0x4e5ab1(0x14d)]?_0x3166d9:{'default':_0x3166d9};};Object['defineProperty'](exports,a2_0x52e9fc(0x14d),{'value':!![]}),exports['HttpClient']=void 0x0;const axios_1=__importDefault(require(a2_0x52e9fc(0x160))),lodash_1=__importDefault(require(a2_0x52e9fc(0x1bd))),luxon_1=require(a2_0x52e9fc(0x1bb)),oauth_1_0a_1=__importDefault(require(a2_0x52e9fc(0x1ed))),qs_1=__importDefault(require('qs')),MFAManager_1=require('./MFAManager'),node_crypto_1=__importDefault(require('node:crypto')),tough_cookie_1=require(a2_0x52e9fc(0x15e)),axios_cookiejar_support_1=require(a2_0x52e9fc(0x1d0)),CSRF_RE=new RegExp('name=\x22_csrf\x22\x5cs+value=\x22(.+?)\x22'),TICKET_RE=new RegExp(a2_0x52e9fc(0x1ba)),ACCOUNT_LOCKED_RE=new RegExp(a2_0x52e9fc(0x192)),PAGE_TITLE_RE=new RegExp(a2_0x52e9fc(0x14f)),USER_AGENT_CONNECTMOBILE='com.garmin.android.apps.connectmobile',USER_AGENT_BROWSER=a2_0x52e9fc(0x157),USER_AGENT_BROWSER_MAC='Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_15_7)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/131.0.0.0\x20Safari/537.36',OAUTH_CONSUMER_URL=a2_0x52e9fc(0x16c),HTTP_STATUS={'UNAUTHORIZED':0x191};let tokenRefreshPromise=null,refreshSubscribers=[];class HttpClient{constructor(_0x242acf,_0x5a8106){const _0x26047c=a2_0x52e9fc;var _0x1e2859,_0x1b904a;const _0x5b1aaf=new tough_cookie_1['CookieJar']();this[_0x26047c(0x1d7)]=_0x242acf,this[_0x26047c(0x1bc)]=(0x0,axios_cookiejar_support_1[_0x26047c(0x1c1)])(axios_1[_0x26047c(0x14b)][_0x26047c(0x18c)]({'timeout':(_0x1e2859=_0x5a8106===null||_0x5a8106===void 0x0?void 0x0:_0x5a8106[_0x26047c(0x16b)])!==null&&_0x1e2859!==void 0x0?_0x1e2859:0x1388,'timeoutErrorMessage':'Request\x20Timeout:\x20>\x20'+((_0x1b904a=_0x5a8106===null||_0x5a8106===void 0x0?void 0x0:_0x5a8106[_0x26047c(0x16b)])!==null&&_0x1b904a!==void 0x0?_0x1b904a:0x1388)+_0x26047c(0x1c5),'maxRedirects':0xa,'validateStatus':function(_0x34e864){return _0x34e864>=0xc8&&_0x34e864<0x190;},'withCredentials':!![],'jar':_0x5b1aaf})),this['config']=_0x5a8106;const _0x25a8b1=_0x5a8106[_0x26047c(0x1b3)]||{'type':_0x26047c(0x1c9),'dir':_0x5a8106[_0x26047c(0x147)]||_0x26047c(0x17c)};this['mfaManager']=MFAManager_1[_0x26047c(0x1e1)][_0x26047c(0x1a1)](_0x25a8b1),this[_0x26047c(0x156)]();}[a2_0x52e9fc(0x156)](){const _0x4c2681=a2_0x52e9fc;this[_0x4c2681(0x1bc)][_0x4c2681(0x1b1)][_0x4c2681(0x1a6)]['use'](_0x3d4adb=>{return _0x3d4adb;},async _0xb71feb=>{return this['handleResponseError'](_0xb71feb);}),this[_0x4c2681(0x1bc)][_0x4c2681(0x1b1)]['request'][_0x4c2681(0x175)](async _0x5d3483=>{const _0xc7590d=_0x4c2681;return this[_0xc7590d(0x15b)]&&(_0x5d3483[_0xc7590d(0x1c4)]['Authorization']='Bearer\x20'+this[_0xc7590d(0x15b)][_0xc7590d(0x1c7)]),_0x5d3483;});}[a2_0x52e9fc(0x186)](_0x1efde6){const _0x30b6c9=a2_0x52e9fc;var _0x587102,_0x540e64,_0x4c6a03,_0x2f771e;(((_0x587102=_0x1efde6[_0x30b6c9(0x16a)][_0x30b6c9(0x1d7)])===null||_0x587102===void 0x0?void 0x0:_0x587102[_0x30b6c9(0x162)](_0x30b6c9(0x1e9)))||((_0x540e64=_0x1efde6[_0x30b6c9(0x16a)]['url'])===null||_0x540e64===void 0x0?void 0x0:_0x540e64[_0x30b6c9(0x162)](_0x30b6c9(0x1a9))))&&(console[_0x30b6c9(0x195)](_0x30b6c9(0x1d1),_0x1efde6[_0x30b6c9(0x16a)][_0x30b6c9(0x1d7)]),console['log'](_0x30b6c9(0x143),_0x1efde6[_0x30b6c9(0x189)]),console[_0x30b6c9(0x195)](_0x30b6c9(0x168),((_0x4c6a03=_0x1efde6[_0x30b6c9(0x17d)])===null||_0x4c6a03===void 0x0?void 0x0:_0x4c6a03[_0x30b6c9(0x1ca)])||_0x1efde6['config'][_0x30b6c9(0x1d7)]),console[_0x30b6c9(0x195)](_0x30b6c9(0x19f),((_0x2f771e=_0x1efde6[_0x30b6c9(0x17d)])===null||_0x2f771e===void 0x0?void 0x0:_0x2f771e[_0x30b6c9(0x169)])||0x0),_0x1efde6['headers'][_0x30b6c9(0x17f)]&&console[_0x30b6c9(0x195)]('响应跟踪\x20-\x20Location头:',_0x1efde6[_0x30b6c9(0x1c4)][_0x30b6c9(0x17f)]),_0x1efde6[_0x30b6c9(0x189)]>=0x12c&&_0x1efde6['status']<0x190&&console['log']('响应跟踪\x20-\x20检测到重定向状态码:',_0x1efde6[_0x30b6c9(0x189)]));}async['handleResponseError'](_0x25de91){const _0x484e0e=a2_0x52e9fc;var _0x151777,_0x4deb51,_0x204823;if(axios_1[_0x484e0e(0x14b)]['isAxiosError'](_0x25de91)&&_0x25de91[_0x484e0e(0x1af)]==='ECONNABORTED')throw new Error(_0x25de91[_0x484e0e(0x1ae)]||'Request\x20Timeout');const _0x133088=_0x25de91['config'];if(((_0x151777=_0x25de91===null||_0x25de91===void 0x0?void 0x0:_0x25de91[_0x484e0e(0x1a6)])===null||_0x151777===void 0x0?void 0x0:_0x151777[_0x484e0e(0x189)])===HTTP_STATUS[_0x484e0e(0x1ab)]&&!(_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088['_retry'])){if(!this['oauth2Token']){if(((_0x4deb51=_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088[_0x484e0e(0x1d7)])===null||_0x4deb51===void 0x0?void 0x0:_0x4deb51[_0x484e0e(0x162)](_0x484e0e(0x1e9)))||((_0x204823=_0x133088===null||_0x133088===void 0x0?void 0x0:_0x133088[_0x484e0e(0x1d7)])===null||_0x204823===void 0x0?void 0x0:_0x204823[_0x484e0e(0x162)](_0x484e0e(0x158))))throw new Error('No\x20OAuth2\x20token\x20available\x20(登录失败,密码错误)');throw new Error(_0x484e0e(0x1e4));}_0x133088[_0x484e0e(0x185)]=!![];try{return!tokenRefreshPromise&&(tokenRefreshPromise=this['refreshOauth2Token']()[_0x484e0e(0x148)](()=>{tokenRefreshPromise=null;})),await tokenRefreshPromise,_0x133088[_0x484e0e(0x1c4)][_0x484e0e(0x17e)]=_0x484e0e(0x1ea)+this[_0x484e0e(0x15b)][_0x484e0e(0x1c7)],this[_0x484e0e(0x1bc)](_0x133088);}catch(_0x7ec409){console[_0x484e0e(0x1db)](_0x484e0e(0x1b0),_0x7ec409);throw _0x7ec409;}}if(axios_1[_0x484e0e(0x14b)][_0x484e0e(0x173)](_0x25de91)&&_0x25de91[_0x484e0e(0x1a6)])this[_0x484e0e(0x1c3)](_0x25de91[_0x484e0e(0x1a6)]);else throw new Error(_0x484e0e(0x150));throw _0x25de91;}async[a2_0x52e9fc(0x183)](){const _0x524b0b=a2_0x52e9fc,_0x49e39d=await axios_1[_0x524b0b(0x14b)][_0x524b0b(0x16f)](OAUTH_CONSUMER_URL);this[_0x524b0b(0x1ec)]={'key':_0x49e39d[_0x524b0b(0x1b4)][_0x524b0b(0x1a3)],'secret':_0x49e39d[_0x524b0b(0x1b4)][_0x524b0b(0x191)]};}async[a2_0x52e9fc(0x1ce)](){const _0x2ef818=a2_0x52e9fc;this[_0x2ef818(0x15b)]&&(this['oauth2Token'][_0x2ef818(0x1e2)]<luxon_1['DateTime'][_0x2ef818(0x171)]()['toSeconds']()&&(console['error'](_0x2ef818(0x1cc)),await this[_0x2ef818(0x140)]()));}async[a2_0x52e9fc(0x16f)](_0x3fb933,_0x515dbc){const _0x5f267d=a2_0x52e9fc,_0x475960=await this['client']['get'](_0x3fb933,_0x515dbc);return _0x475960===null||_0x475960===void 0x0?void 0x0:_0x475960[_0x5f267d(0x1b4)];}async[a2_0x52e9fc(0x1eb)](_0x2d70d8,_0x266d7b,_0xcbeb63){const _0x13832d=a2_0x52e9fc,_0x1ef1b1=await this[_0x13832d(0x1bc)][_0x13832d(0x1eb)](_0x2d70d8,_0x266d7b,_0xcbeb63);return _0x1ef1b1===null||_0x1ef1b1===void 0x0?void 0x0:_0x1ef1b1['data'];}async['put'](_0x3aa25e,_0x366a5e,_0x5da4fb){const _0x51582c=a2_0x52e9fc,_0x371afc=await this[_0x51582c(0x1bc)][_0x51582c(0x1a0)](_0x3aa25e,_0x366a5e,_0x5da4fb);return _0x371afc===null||_0x371afc===void 0x0?void 0x0:_0x371afc[_0x51582c(0x1b4)];}async[a2_0x52e9fc(0x145)](_0xcfaf54,_0x1c832f){const _0x266bac=a2_0x52e9fc,_0xc36ef=await this['client'][_0x266bac(0x1eb)](_0xcfaf54,null,{..._0x1c832f,'headers':{..._0x1c832f===null||_0x1c832f===void 0x0?void 0x0:_0x1c832f[_0x266bac(0x1c4)],'X-Http-Method-Override':_0x266bac(0x198)}});return _0xc36ef===null||_0xc36ef===void 0x0?void 0x0:_0xc36ef['data'];}[a2_0x52e9fc(0x180)](_0xa8fcd4){const _0x1dd599=a2_0x52e9fc;lodash_1['default'][_0x1dd599(0x1a7)](_0xa8fcd4,(_0x1f71fa,_0x4874c4)=>{const _0x3a7134=_0x1dd599;this[_0x3a7134(0x1bc)][_0x3a7134(0x194)][_0x3a7134(0x1c4)][_0x3a7134(0x1d9)][_0x4874c4]=_0x1f71fa;});}['handleError'](_0x2e39a9){const _0x160686=a2_0x52e9fc;this[_0x160686(0x1b2)](_0x2e39a9);}[a2_0x52e9fc(0x1b2)](_0x4fb5e5){const _0x3c9a36=a2_0x52e9fc,{status:_0x1ce377,statusText:_0x4a19d3,data:_0x5e1e34}=_0x4fb5e5,_0x1d2520={'status':_0x1ce377,'statusText':_0x4a19d3,'data':typeof _0x5e1e34===_0x3c9a36(0x174)?JSON[_0x3c9a36(0x1de)](_0x5e1e34):_0x5e1e34};console[_0x3c9a36(0x1db)](_0x3c9a36(0x16d),_0x1d2520);throw new Error(_0x3c9a36(0x159)+_0x1ce377+_0x3c9a36(0x165)+_0x4a19d3);}async[a2_0x52e9fc(0x158)](_0x126617,_0x3d35fb,_0x566752){const _0x297e59=a2_0x52e9fc;try{await this[_0x297e59(0x183)]();const _0x19565d=await this[_0x297e59(0x19e)](_0x126617,_0x3d35fb,_0x566752),_0x5e4547=await this[_0x297e59(0x13d)](_0x19565d);return await this['exchange'](_0x5e4547),this;}catch(_0x5d52f6){console['error'](_0x297e59(0x1bf),_0x5d52f6);throw _0x5d52f6;}}async['getLoginTicket'](_0x41bc39,_0x2ed2f3,_0x2d09b4){const _0x49eb0a=a2_0x52e9fc,_0x291dc9=this['prepareLoginParams']();await this[_0x49eb0a(0x1c2)](_0x291dc9[_0x49eb0a(0x1ee)]);const _0x25d37d=await this[_0x49eb0a(0x167)](_0x291dc9[_0x49eb0a(0x1d8)]);let _0xd8cbfa=await this[_0x49eb0a(0x196)](_0x41bc39,_0x2ed2f3,_0x25d37d,_0x291dc9['step3Params']);this[_0x49eb0a(0x154)](_0xd8cbfa);const _0x466d4d=this[_0x49eb0a(0x1e5)](_0xd8cbfa);if(this[_0x49eb0a(0x1dc)](_0x466d4d)){if(_0x2d09b4){console['log']('🚀\x20-\x20getLoginTicket\x20-\x20等待验证码\x20sessionId:',_0x2d09b4);const _0x68c3cd=await this[_0x49eb0a(0x197)][_0x49eb0a(0x182)](_0x2d09b4);console[_0x49eb0a(0x195)](_0x49eb0a(0x1a8),_0x68c3cd),_0xd8cbfa=await this[_0x49eb0a(0x1cb)](_0xd8cbfa,_0x291dc9[_0x49eb0a(0x161)],_0x68c3cd);}else throw new Error('需要MFA验证,但未提供验证码获取方式');}const _0x274d0e=this[_0x49eb0a(0x1b9)](_0xd8cbfa);if(!_0x274d0e)throw new Error(_0x49eb0a(0x155));return _0x274d0e;}[a2_0x52e9fc(0x1e8)](){const _0x11b5b0=a2_0x52e9fc;return{'step1Params':{'clientId':'GarminConnect','locale':'en','service':this[_0x11b5b0(0x1d7)]['GC_MODERN']},'step2Params':{'id':'gauth-widget','embedWidget':!![],'locale':'en','gauthHost':this['url'][_0x11b5b0(0x190)]},'step3Params':{'id':'gauth-widget','embedWidget':!![],'clientId':'GarminConnect','locale':'en','gauthHost':this['url'][_0x11b5b0(0x190)],'service':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'source':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'redirectAfterAccountLoginUrl':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)],'redirectAfterAccountCreationUrl':this[_0x11b5b0(0x1d7)][_0x11b5b0(0x190)]}};}async['performLoginStep1'](_0x425bb3){const _0x516a85=a2_0x52e9fc,_0x2b0fe5=this[_0x516a85(0x1d7)][_0x516a85(0x190)]+'?'+qs_1[_0x516a85(0x14b)]['stringify'](_0x425bb3);await this[_0x516a85(0x1bc)]['get'](_0x2b0fe5);}async['performLoginStep2'](_0x9a8021){const _0x2d002d=a2_0x52e9fc,_0x25c573=this[_0x2d002d(0x1d7)][_0x2d002d(0x18e)]+'?'+qs_1[_0x2d002d(0x14b)][_0x2d002d(0x1de)](_0x9a8021),_0x209322=await this['get'](_0x25c573),_0x1eb3b6=this[_0x2d002d(0x187)](_0x209322);if(!_0x1eb3b6)throw new Error('登录\x20-\x20未找到CSRF令牌');return _0x1eb3b6;}async[a2_0x52e9fc(0x196)](_0x39d668,_0x15b745,_0x30f3d4,_0x26681d){const _0x3c59ab=a2_0x52e9fc,_0x273ec5=this[_0x3c59ab(0x1d7)][_0x3c59ab(0x18e)]+'?'+qs_1[_0x3c59ab(0x14b)][_0x3c59ab(0x1de)](_0x26681d),_0xe89823=new URLSearchParams();return _0xe89823['append']('username',_0x39d668),_0xe89823['append'](_0x3c59ab(0x179),_0x15b745),_0xe89823['append']('embed',_0x3c59ab(0x188)),_0xe89823[_0x3c59ab(0x1a5)]('_csrf',_0x30f3d4),this[_0x3c59ab(0x1eb)](_0x273ec5,_0xe89823,{'headers':{'Content-Type':'application/x-www-form-urlencoded','Dnt':0x1,'Origin':this[_0x3c59ab(0x1d7)][_0x3c59ab(0x1be)],'Referer':this[_0x3c59ab(0x1d7)][_0x3c59ab(0x18e)],'User-Agent':USER_AGENT_CONNECTMOBILE}});}[a2_0x52e9fc(0x1dc)](_0x1a3fb2){const _0x581b6e=a2_0x52e9fc,_0x13d935=_0x1a3fb2[_0x581b6e(0x149)]();return _0x13d935['includes'](_0x581b6e(0x1b3))||_0x13d935[_0x581b6e(0x162)](_0x581b6e(0x14e))&&!_0x13d935['includes']('sign');}[a2_0x52e9fc(0x1b9)](_0x23299c){const _0x1e6fc7=a2_0x52e9fc,_0x19caca=TICKET_RE[_0x1e6fc7(0x1a2)](_0x23299c);return _0x19caca?_0x19caca[0x1]:null;}async[a2_0x52e9fc(0x1cb)](_0x43be40,_0x4dda4c,_0x1f0f11){const _0x5aff5d=a2_0x52e9fc;try{const _0x2d0444=this['extractCsrfToken'](_0x43be40);if(!_0x2d0444)throw new Error('MFA验证\x20-\x20未找到CSRF令牌');const _0x23f79e=await this[_0x5aff5d(0x1cf)](_0x2d0444,_0x1f0f11,_0x4dda4c);return this[_0x5aff5d(0x1c8)](_0x23f79e);}catch(_0x3b11f9){console['error'](_0x5aff5d(0x176),_0x3b11f9);throw new Error(_0x5aff5d(0x1e0)+_0x3b11f9);}}async[a2_0x52e9fc(0x152)](_0x3d1194,_0x2c7eb2,_0x3fd766){const _0x2bbc6b=a2_0x52e9fc;if(!_0x3fd766)throw new Error(_0x2bbc6b(0x15c));const _0x3bbfe7=this[_0x2bbc6b(0x187)](_0x3d1194);if(!_0x3bbfe7)throw new Error(_0x2bbc6b(0x17a));const _0x443222=await _0x3fd766();console['log'](_0x2bbc6b(0x153),_0x443222);const _0x3a75fc=await this['submitMFACode'](_0x3bbfe7,_0x443222,_0x2c7eb2);return this[_0x2bbc6b(0x1c8)](_0x3a75fc);}async[a2_0x52e9fc(0x1cf)](_0x262398,_0x361de3,_0x19cca0){const _0x35ffdd=a2_0x52e9fc,_0x307cdd=this[_0x35ffdd(0x1d7)][_0x35ffdd(0x18b)],_0x422481=new URLSearchParams();return _0x422481['append']('mfa-code',_0x361de3),_0x422481['append'](_0x35ffdd(0x1ac),_0x35ffdd(0x188)),_0x422481[_0x35ffdd(0x1a5)](_0x35ffdd(0x164),_0x262398),this[_0x35ffdd(0x1eb)](_0x307cdd+_0x35ffdd(0x18f),_0x422481,{'params':_0x19cca0,'headers':{'Content-Type':_0x35ffdd(0x18a),'Dnt':0x1,'Origin':this[_0x35ffdd(0x1d7)][_0x35ffdd(0x1be)],'Referer':_0x307cdd+_0x35ffdd(0x184),'User-Agent':USER_AGENT_BROWSER},'maxRedirects':0xa,'transformResponse':[function(_0x1f9a3f,_0x58be8f){const _0x283f0=_0x35ffdd;return _0x58be8f['location']&&_0x58be8f['location'][_0x283f0(0x162)](_0x283f0(0x19d))&&console[_0x283f0(0x195)]('检测到重定向到包含logintoken的URL:',_0x58be8f['location']),_0x1f9a3f;}]});}[a2_0x52e9fc(0x1c8)](_0x2d8326){const _0x1c6935=a2_0x52e9fc,_0x746417=this[_0x1c6935(0x1e5)](_0x2d8326);return console[_0x1c6935(0x195)]('MFA验证后的页面标题:',_0x746417),_0x2d8326;}['extractCsrfToken'](_0x566c62){const _0x5381cf=CSRF_RE['exec'](_0x566c62);return _0x5381cf?_0x5381cf[0x1]:null;}['handlePageTitle'](_0x468ddb){const _0x39ac76=a2_0x52e9fc,_0x2f15ff=PAGE_TITLE_RE[_0x39ac76(0x1a2)](_0x468ddb);if(_0x2f15ff){const _0x3d6b8c=_0x2f15ff[0x1];console[_0x39ac76(0x195)](_0x39ac76(0x15a),_0x3d6b8c);if(lodash_1['default']['includes'](_0x3d6b8c,_0x39ac76(0x193)))throw new Error('登录失败(需要更新电话号码),请更新您的电话号码,参考:\x20https://github.com/matin/garth/issues/19');return _0x3d6b8c;}else throw new Error('登录失败(未找到页面标题)');}[a2_0x52e9fc(0x154)](_0x5d9e7a){const _0x2726ed=a2_0x52e9fc,_0x4f3907=ACCOUNT_LOCKED_RE[_0x2726ed(0x1a2)](_0x5d9e7a);if(_0x4f3907){const _0x1430ec=_0x4f3907[0x1];console[_0x2726ed(0x1db)](_0x1430ec);throw new Error('登录失败(账户已锁定),请打开Connect网页解锁您的账户');}}async['refreshOauth2Token'](){const _0x3c41f2=a2_0x52e9fc;try{!this[_0x3c41f2(0x1ec)]&&await this[_0x3c41f2(0x183)]();if(!this['oauth2Token']||!this[_0x3c41f2(0x13e)])throw new Error(_0x3c41f2(0x18d));const _0x44739b={'oauth':this[_0x3c41f2(0x1b5)](this['OAUTH_CONSUMER']),'token':this[_0x3c41f2(0x13e)]};await this['exchange'](_0x44739b),console[_0x3c41f2(0x195)]('「'+this['config']['username']+_0x3c41f2(0x142)+this[_0x3c41f2(0x1d7)][_0x3c41f2(0x1d3)]+_0x3c41f2(0x163));}catch(_0x6be089){console[_0x3c41f2(0x1db)](_0x3c41f2(0x13f),_0x6be089);throw _0x6be089;}}async[a2_0x52e9fc(0x13d)](_0x30c3dc){const _0x5a6c15=a2_0x52e9fc;if(!this[_0x5a6c15(0x1ec)])throw new Error(_0x5a6c15(0x146));const _0x1af62e={'ticket':_0x30c3dc,'login-url':this[_0x5a6c15(0x1d7)][_0x5a6c15(0x190)],'accepts-mfa-tokens':!![]},_0x5ce460=this[_0x5a6c15(0x1d7)][_0x5a6c15(0x1d6)]+_0x5a6c15(0x178)+qs_1[_0x5a6c15(0x14b)][_0x5a6c15(0x1de)](_0x1af62e),_0x562059=this[_0x5a6c15(0x1b5)](this[_0x5a6c15(0x1ec)]),_0x325bff={'url':_0x5ce460,'method':_0x5a6c15(0x1e6)},_0x25d04a=_0x562059[_0x5a6c15(0x1d4)](_0x562059['authorize'](_0x325bff)),_0x215db7=await this[_0x5a6c15(0x16f)](_0x5ce460,{'headers':{..._0x25d04a,'User-Agent':USER_AGENT_CONNECTMOBILE}}),_0x24f0c4=qs_1[_0x5a6c15(0x14b)][_0x5a6c15(0x14a)](_0x215db7);return this[_0x5a6c15(0x13e)]=_0x24f0c4,{'token':_0x24f0c4,'oauth':_0x562059};}[a2_0x52e9fc(0x1b5)](_0x212456){const _0x511c07=a2_0x52e9fc;return new oauth_1_0a_1[(_0x511c07(0x14b))]({'consumer':_0x212456,'signature_method':_0x511c07(0x1a4),'hash_function'(_0x5e2d6a,_0x104416){const _0x55bafd=_0x511c07;return node_crypto_1[_0x55bafd(0x14b)]['createHmac'](_0x55bafd(0x1aa),_0x104416)[_0x55bafd(0x1c0)](_0x5e2d6a)[_0x55bafd(0x15d)](_0x55bafd(0x1b6));}});}async[a2_0x52e9fc(0x1e3)](_0x20f070){const _0x21d3aa=a2_0x52e9fc,_0x461c0f={'key':_0x20f070[_0x21d3aa(0x1b8)][_0x21d3aa(0x16e)],'secret':_0x20f070[_0x21d3aa(0x1b8)][_0x21d3aa(0x1d2)]},_0x321446=this['url'][_0x21d3aa(0x1d6)]+_0x21d3aa(0x1c6),_0x28c261={'url':_0x321446,'method':_0x21d3aa(0x1dd),'data':null},_0x1e1403=_0x20f070[_0x21d3aa(0x19a)][_0x21d3aa(0x1b7)](_0x28c261,_0x461c0f),_0x3c9539=_0x321446+'?'+qs_1[_0x21d3aa(0x14b)][_0x21d3aa(0x1de)](_0x1e1403);this[_0x21d3aa(0x15b)]=undefined;const _0xb29074=await this[_0x21d3aa(0x1eb)](_0x3c9539,null,{'headers':{'User-Agent':USER_AGENT_CONNECTMOBILE,'Content-Type':_0x21d3aa(0x18a)}});this[_0x21d3aa(0x15b)]=this[_0x21d3aa(0x172)](_0xb29074),this[_0x21d3aa(0x19b)]&&this[_0x21d3aa(0x13e)]&&this[_0x21d3aa(0x15b)]&&this[_0x21d3aa(0x19b)]({'oauth1':this[_0x21d3aa(0x13e)],'oauth2':this[_0x21d3aa(0x15b)]});}[a2_0x52e9fc(0x172)](_0x3223b5){const _0x3f2c61=a2_0x52e9fc,_0x3e2acb=luxon_1[_0x3f2c61(0x151)][_0x3f2c61(0x171)](),_0x131a45=_0x3e2acb[_0x3f2c61(0x17b)]({'seconds':_0x3223b5[_0x3f2c61(0x19c)]}),_0x2168d5=_0x3e2acb[_0x3f2c61(0x17b)]({'seconds':_0x3223b5[_0x3f2c61(0x170)]});return{..._0x3223b5,'last_update_date':_0x3e2acb[_0x3f2c61(0x144)]()[_0x3f2c61(0x1ad)](),'expires_date':_0x131a45['toLocal']()[_0x3f2c61(0x1ad)](),'expires_at':_0x131a45['toSeconds'](),'refresh_token_expires_at':_0x2168d5[_0x3f2c61(0x1d5)]()};}}exports[a2_0x52e9fc(0x1da)]=HttpClient;function a2_0x5385(_0x7963b4,_0x5b4158){_0x7963b4=_0x7963b4-0x13d;const _0x4e4d7f=a2_0x4e4d();let _0x5385c5=_0x4e4d7f[_0x7963b4];return _0x5385c5;}function a2_0x4e4d(){const _0x3d90bc=['step2Params','common','HttpClient','error','isMFARequired','POST','stringify','1496016zxCkAu','MFA验证失败:\x20','MFAManager','expires_at','exchange','No\x20OAuth2\x20token\x20available','handlePageTitle','GET','202581ettjfV','prepareLoginParams','signin','Bearer\x20','post','OAUTH_CONSUMER','oauth-1.0a','step1Params','getOauth1Token','oauth1Token','刷新OAuth2令牌失败:','refreshOauth2Token','1425630FTHETG','」在「','响应跟踪\x20-\x20状态码:','toLocal','delete','未找到OAuth消费者信息','mfaStorageDir','finally','toLowerCase','parse','default','6OIWRnb','__esModule','authentication','<title>([^<]*)</title>','Network\x20error\x20or\x20unknown\x20error\x20occurred','DateTime','handleMFA','🚀\x20-\x20handleMFA\x20-\x20mfaCode:','handleAccountLocked','登录失败(未找到票据或MFA验证失败),请检查用户名和密码','setupInterceptors','Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/117.0.0.0\x20Safari/537.36','login','HTTP\x20Error\x20(','登录页面标题:','oauth2Token','登录失败(需要MFA验证),请提供MFA回调函数','digest','tough-cookie','1468380qaACui','axios','step3Params','includes','」的OAuth2令牌刷新成功','_csrf','):\x20','15WqXRdw','performLoginStep2','响应跟踪\x20-\x20最终URL:','redirectCount','config','timeout','https://thegarth.s3.amazonaws.com/oauth_consumer.json','HTTP\x20Error:','oauth_token','get','refresh_token_expires_in','now','setOauth2TokenExpiresAt','isAxiosError','object','use','MFA验证失败:','32ghhooJ','/preauthorized?','password','无法从MFA页面提取CSRF令牌','plus','/tmp','request','Authorization','location','setCommonHeader','1245818eKzkfq','waitForMFACode','fetchOauthConsumer','/signin','_retry','logResponseTracking','extractCsrfToken','true','status','application/x-www-form-urlencoded','GARMIN_SSO','create','缺少刷新令牌所需的必要令牌','SIGNIN_URL','/verifyMFA/loginEnterMfaCode','GARMIN_SSO_EMBED','consumer_secret','var\x20statuss*=s*\x22([^\x22]*)\x22','Update\x20Phone\x20Number','defaults','log','performLoginStep3','mfaManager','DELETE','36236mlcqBd','oauth','onTokenChange','expires_in','logintoken','getLoginTicket','响应跟踪\x20-\x20重定向次数:','put','getInstance','exec','consumer_key','HMAC-SHA1','append','response','each','🚀\x20-\x20getLoginTicket\x20-\x20收到验证码\x20mfaCode:','verifyMFA','sha1','UNAUTHORIZED','embed','toString','message','code','Token\x20refresh\x20failed:','interceptors','handleHttpError','mfa','data','getOauthClient','base64','authorize','token','extractTicket','ticket=([^\x22]+)\x22','luxon','client','lodash','GARMIN_SSO_ORIGIN','Login\x20failed:','update','wrapper','performLoginStep1','handleError','headers','\x20ms','/exchange/user/2.0','access_token','validateMFAResult','file','responseURL','handleMFAWithCode','Token\x20expired!','43048DqEjqy','checkTokenVaild','submitMFACode','axios-cookiejar-support','>\x20响应跟踪\x20-\x20URL:','oauth_token_secret','domain','toHeader','toSeconds','OAUTH_URL','url'];a2_0x4e4d=function(){return _0x3d90bc;};return a2_0x4e4d();}