@gooin/garmin-connect 1.6.11 → 1.7.2

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.
@@ -0,0 +1,577 @@
1
+ "use strict";
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.HttpClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const tough_cookie_1 = require("tough-cookie");
9
+ const form_data_1 = __importDefault(require("form-data"));
10
+ const lodash_1 = __importDefault(require("lodash"));
11
+ const luxon_1 = require("luxon");
12
+ const oauth_1_0a_1 = __importDefault(require("oauth-1.0a"));
13
+ const qs_1 = __importDefault(require("qs"));
14
+ const node_crypto_1 = __importDefault(require("node:crypto"));
15
+ const CSRF_RE = new RegExp('name="_csrf"\\s+value="(.+?)"');
16
+ const TICKET_RE = new RegExp('ticket=([^"]+)"');
17
+ const ACCOUNT_LOCKED_RE = new RegExp('var statuss*=s*"([^"]*)"');
18
+ const PAGE_TITLE_RE = new RegExp('<title>([^<]*)</title>');
19
+ const USER_AGENT_CONNECTMOBILE = 'com.garmin.android.apps.connectmobile';
20
+ const USER_AGENT_CONNECT_IOS = 'GCM-iOS-5.7.2.1';
21
+ const USER_AGENT_BROWSER = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36';
22
+ const USER_AGENT_BROWSER_MAC = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
23
+ const OAUTH_CONSUMER_URL = 'https://thegarth.s3.amazonaws.com/oauth_consumer.json';
24
+ const HTTP_STATUS = {
25
+ UNAUTHORIZED: 401
26
+ };
27
+ let tokenRefreshPromise = null;
28
+ let refreshSubscribers = [];
29
+ class HttpClient {
30
+ constructor(url, config) {
31
+ var _a, _b;
32
+ const jar = new tough_cookie_1.CookieJar();
33
+ this.url = url;
34
+ this.client = axios_1.default.create({
35
+ timeout: (_a = config === null || config === void 0 ? void 0 : config.timeout) !== null && _a !== void 0 ? _a : 5000,
36
+ timeoutErrorMessage: `Request Timeout: > ${(_b = config === null || config === void 0 ? void 0 : config.timeout) !== null && _b !== void 0 ? _b : 5000} ms`,
37
+ maxRedirects: 10,
38
+ validateStatus: function (status) {
39
+ return status >= 200 && status < 400;
40
+ },
41
+ withCredentials: true,
42
+ jar: jar,
43
+ });
44
+ this.config = config;
45
+ this.client.interceptors.response.use((response) => {
46
+ var _a, _b, _c, _d;
47
+ // 跟踪重定向过程
48
+ if (((_a = response.config.url) === null || _a === void 0 ? void 0 : _a.includes('signin')) ||
49
+ ((_b = response.config.url) === null || _b === void 0 ? void 0 : _b.includes('verifyMFA'))) {
50
+ console.log('> 响应跟踪 - URL:', response.config.url);
51
+ console.log('响应跟踪 - 状态码:', response.status);
52
+ console.log('响应跟踪 - 最终URL:', ((_c = response.request) === null || _c === void 0 ? void 0 : _c.responseURL) || response.config.url);
53
+ console.log('响应跟踪 - 重定向次数:', ((_d = response.request) === null || _d === void 0 ? void 0 : _d.redirectCount) || 0);
54
+ // 检查是否有Location头
55
+ if (response.headers.location) {
56
+ console.log('响应跟踪 - Location头:', response.headers.location);
57
+ }
58
+ // 检查响应头中可能的重定向信息
59
+ if (response.status >= 300 && response.status < 400) {
60
+ console.log('响应跟踪 - 检测到重定向状态码:', response.status);
61
+ }
62
+ }
63
+ return response;
64
+ }, async (error) => {
65
+ var _a, _b, _c, _d;
66
+ if (axios_1.default.isAxiosError(error) &&
67
+ error.code === 'ECONNABORTED') {
68
+ throw new Error(error.message || 'Request Timeout');
69
+ }
70
+ const originalRequest = error.config;
71
+ if (((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === HTTP_STATUS.UNAUTHORIZED &&
72
+ !(originalRequest === null || originalRequest === void 0 ? void 0 : originalRequest._retry)) {
73
+ if (!this.oauth2Token) {
74
+ throw new Error('No OAuth2 token available');
75
+ }
76
+ originalRequest._retry = true;
77
+ try {
78
+ if (!tokenRefreshPromise) {
79
+ tokenRefreshPromise =
80
+ this.refreshOauth2Token().finally(() => {
81
+ tokenRefreshPromise = null;
82
+ });
83
+ }
84
+ await tokenRefreshPromise;
85
+ originalRequest.headers.Authorization = `Bearer ${this.oauth2Token.access_token}`;
86
+ return this.client(originalRequest);
87
+ }
88
+ catch (err) {
89
+ console.error('Token refresh failed:', err);
90
+ throw err;
91
+ }
92
+ }
93
+ if (axios_1.default.isAxiosError(error) && error.response) {
94
+ // 添加错误响应的调试信息
95
+ if (((_b = error.response.config.url) === null || _b === void 0 ? void 0 : _b.includes('signin')) ||
96
+ ((_c = error.response.config.url) === null || _c === void 0 ? void 0 : _c.includes('verifyMFA'))) {
97
+ console.log('> HTTP Error响应跟踪 - URL:', error.response.config.url);
98
+ console.log('HTTP Error响应跟踪 - 状态码:', error.response.status);
99
+ console.log('HTTP Error响应跟踪 - 最终URL:', ((_d = error.response.request) === null || _d === void 0 ? void 0 : _d.responseURL) ||
100
+ error.response.config.url);
101
+ if (error.response.headers.location) {
102
+ console.log('HTTP Error响应跟踪 - Location头:', error.response.headers.location);
103
+ }
104
+ }
105
+ this.handleError(error.response);
106
+ }
107
+ else {
108
+ // 处理没有response的情况
109
+ throw new Error('Network error or unknown error occurred');
110
+ }
111
+ throw error;
112
+ });
113
+ this.client.interceptors.request.use(async (config) => {
114
+ if (this.oauth2Token) {
115
+ config.headers.Authorization =
116
+ 'Bearer ' + this.oauth2Token.access_token;
117
+ }
118
+ return config;
119
+ });
120
+ }
121
+ async fetchOauthConsumer() {
122
+ const response = await axios_1.default.get(OAUTH_CONSUMER_URL);
123
+ this.OAUTH_CONSUMER = {
124
+ key: response.data.consumer_key,
125
+ secret: response.data.consumer_secret
126
+ };
127
+ }
128
+ async checkTokenVaild() {
129
+ if (this.oauth2Token) {
130
+ if (this.oauth2Token.expires_at < luxon_1.DateTime.now().toSeconds()) {
131
+ console.error('Token expired!');
132
+ await this.refreshOauth2Token();
133
+ }
134
+ }
135
+ }
136
+ async get(url, config) {
137
+ const response = await this.client.get(url, config);
138
+ return response === null || response === void 0 ? void 0 : response.data;
139
+ }
140
+ async post(url, data, config) {
141
+ var _a, _b;
142
+ try {
143
+ const response = await this.client.post(url, data, config);
144
+ // 如果是MFA验证请求,添加额外的调试信息
145
+ if (url.includes('verifyMFA')) {
146
+ console.log('MFA验证响应状态码:', response.status);
147
+ console.log('MFA验证响应头 Location:', response.headers.location);
148
+ console.log('MFA验证响应头 Set-Cookie:', response.headers['set-cookie']);
149
+ console.log('MFA验证最终URL:', ((_a = response.request) === null || _a === void 0 ? void 0 : _a.responseURL) || response.config.url);
150
+ // 检查是否重定向到了包含logintoken的URL
151
+ if (((_b = response.request) === null || _b === void 0 ? void 0 : _b.responseURL) &&
152
+ response.request.responseURL.includes('logintoken')) {
153
+ console.log('检测到重定向到包含logintoken的URL:', response.request.responseURL);
154
+ // 如果重定向到了包含logintoken的URL,我们需要获取重定向后的页面内容
155
+ // 因为Axios可能没有自动跟随重定向,我们需要手动获取
156
+ if (!response.data.includes('Success') &&
157
+ !response.data.includes('ticket=')) {
158
+ console.log('响应数据不包含成功标识,手动获取重定向后的页面内容');
159
+ const redirectResponse = await this.client.get(response.request.responseURL, {
160
+ headers: {
161
+ 'User-Agent': USER_AGENT_CONNECT_IOS
162
+ }
163
+ });
164
+ console.log('手动获取重定向页面状态码:', redirectResponse.status);
165
+ console.log('手动获取重定向页面长度:', redirectResponse.data.length);
166
+ return redirectResponse.data;
167
+ }
168
+ }
169
+ }
170
+ return response.data;
171
+ }
172
+ catch (error) {
173
+ console.error('POST请求失败:', error);
174
+ throw error;
175
+ }
176
+ }
177
+ async put(url, data, config) {
178
+ const response = await this.client.put(url, data, config);
179
+ return response === null || response === void 0 ? void 0 : response.data;
180
+ }
181
+ async delete(url, config) {
182
+ const response = await this.client.post(url, null, {
183
+ ...config,
184
+ headers: {
185
+ ...config === null || config === void 0 ? void 0 : config.headers,
186
+ 'X-Http-Method-Override': 'DELETE'
187
+ }
188
+ });
189
+ return response === null || response === void 0 ? void 0 : response.data;
190
+ }
191
+ setCommonHeader(headers) {
192
+ lodash_1.default.each(headers, (headerValue, key) => {
193
+ this.client.defaults.headers.common[key] = headerValue;
194
+ });
195
+ }
196
+ handleError(response) {
197
+ this.handleHttpError(response);
198
+ }
199
+ handleHttpError(response) {
200
+ const { status, statusText, data } = response;
201
+ const errorMessage = {
202
+ status,
203
+ statusText,
204
+ data: typeof data === 'object' ? JSON.stringify(data) : data
205
+ };
206
+ console.error('HTTP Error:', errorMessage);
207
+ throw new Error(`HTTP Error (${status}): ${statusText}`);
208
+ }
209
+ /**
210
+ * Login to Garmin Connect
211
+ * @param username
212
+ * @param password
213
+ * @param mfaCallback Optional MFA callback function
214
+ * @returns {Promise<{oauth1: IOauth1; oauth2: IOauth2Token}>}
215
+ */
216
+ async login(username, password, mfaCallback) {
217
+ try {
218
+ // 获取OAuth Consumer信息
219
+ if (!this.OAUTH_CONSUMER) {
220
+ await this.fetchOauthConsumer();
221
+ }
222
+ // 定义参数,与Python版本保持一致
223
+ const SSO = this.url.GARMIN_SSO;
224
+ const SSO_EMBED = this.url.GARMIN_SSO_EMBED;
225
+ const SSO_EMBED_PARAMS = {
226
+ id: 'gauth-widget',
227
+ embedWidget: 'true',
228
+ gauthHost: SSO
229
+ };
230
+ const SIGNIN_PARAMS = {
231
+ id: 'gauth-widget',
232
+ embedWidget: true,
233
+ clientId: 'GarminConnect',
234
+ locale: 'en',
235
+ gauthHost: this.url.GARMIN_SSO_EMBED,
236
+ service: this.url.GARMIN_SSO_EMBED,
237
+ source: this.url.GARMIN_SSO_EMBED,
238
+ redirectAfterAccountLoginUrl: this.url.GARMIN_SSO_EMBED,
239
+ redirectAfterAccountCreationUrl: this.url.GARMIN_SSO_EMBED
240
+ };
241
+ // 设置cookies - 与Python版本一致
242
+ await this.get(`${SSO}/embed`, {
243
+ params: SSO_EMBED_PARAMS,
244
+ headers: {
245
+ 'User-Agent': USER_AGENT_CONNECT_IOS
246
+ }
247
+ });
248
+ // 获取CSRF令牌 - 与Python版本一致
249
+ const signinResponse = await this.get(`${SSO}/signin`, {
250
+ params: SIGNIN_PARAMS,
251
+ headers: {
252
+ 'User-Agent': USER_AGENT_CONNECT_IOS,
253
+ Referer: `${SSO}/embed`
254
+ }
255
+ });
256
+ // 保存登录页面HTML用于调试
257
+ this.saveHtmlToFile(signinResponse, 'signin_page');
258
+ const csrfToken = this.extractCsrfToken(signinResponse);
259
+ console.log('🚀 - login - csrfToken:', csrfToken);
260
+ if (!csrfToken) {
261
+ throw new Error('无法从登录页面提取CSRF令牌');
262
+ }
263
+ // 提交登录表单 - 使用FormData方式,与旧版本一致
264
+ const form = new form_data_1.default();
265
+ form.append('username', username);
266
+ form.append('password', password);
267
+ form.append('embed', 'true');
268
+ form.append('_csrf', csrfToken);
269
+ const loginResponse = await this.post(`${SSO}/signin`, form, {
270
+ params: SIGNIN_PARAMS,
271
+ headers: {
272
+ 'Content-Type': 'application/x-www-form-urlencoded',
273
+ 'Dnt': 1,
274
+ 'Origin': this.url.GARMIN_SSO_ORIGIN,
275
+ 'Referer': `${SSO}/signin`,
276
+ 'User-Agent': USER_AGENT_CONNECT_IOS
277
+ },
278
+ maxRedirects: 10 // 确保跟随重定向
279
+ });
280
+ ``;
281
+ // 保存登录响应HTML用于调试
282
+ this.saveHtmlToFile(loginResponse, 'login_response');
283
+ const title = this.extractPageTitle(loginResponse);
284
+ console.log('登录后页面标题:', title);
285
+ // 处理MFA - 与Python版本一致
286
+ // 使用与Python版本相同的关键词检测MFA需求
287
+ const mfaKeywords = ['MFA', 'Enter security code', 'Enter MFA code'];
288
+ const needsMfa = mfaKeywords.some(keyword => title && title.toLowerCase().includes(keyword.toLowerCase()));
289
+ let finalResponse = loginResponse; // 默认使用登录响应
290
+ if (needsMfa) {
291
+ if (!mfaCallback) {
292
+ throw new Error('需要MFA验证但未提供回调函数');
293
+ }
294
+ console.log('检测到需要MFA验证,页面标题:', title);
295
+ // 处理MFA验证
296
+ finalResponse = await this.handleMfaVerification(loginResponse, SIGNIN_PARAMS, mfaCallback);
297
+ // 检查MFA验证后的响应是否包含成功标识
298
+ const mfaResultTitle = this.extractPageTitle(finalResponse);
299
+ console.log('MFA验证后页面标题:', mfaResultTitle);
300
+ if (mfaResultTitle !== 'Success' && !finalResponse.includes('ticket=')) {
301
+ throw new Error(`MFA验证后未获得成功页面,当前页面: ${mfaResultTitle}`);
302
+ }
303
+ }
304
+ else if (title !== 'Success') {
305
+ throw new Error(`登录失败,页面标题: ${title}`);
306
+ }
307
+ // 提取ticket - 从最终响应中提取
308
+ const ticket = this.extractTicket(finalResponse);
309
+ if (!ticket) {
310
+ throw new Error('无法从响应中提取ticket');
311
+ }
312
+ // 获取OAuth1令牌
313
+ const oauth1 = await this.getOauth1Token(ticket);
314
+ // 交换OAuth2令牌
315
+ await this.exchange(oauth1);
316
+ return { oauth1, oauth2: this.oauth2Token };
317
+ }
318
+ catch (error) {
319
+ console.error('登录失败:', error);
320
+ throw error;
321
+ }
322
+ }
323
+ /**
324
+ * 保存HTML内容到文件,用于调试
325
+ * @param htmlContent HTML内容
326
+ * @param filename 文件名(不含扩展名)
327
+ */
328
+ saveHtmlToFile(htmlContent, filename) {
329
+ try {
330
+ const fs = require('fs');
331
+ const path = require('path');
332
+ const debugDir = path.join(process.cwd(), 'debug');
333
+ // 确保调试目录存在
334
+ if (!fs.existsSync(debugDir)) {
335
+ fs.mkdirSync(debugDir, { recursive: true });
336
+ }
337
+ const filePath = path.join(debugDir, `${filename}.html`);
338
+ fs.writeFileSync(filePath, htmlContent);
339
+ console.log(`已保存调试文件: ${filePath}`);
340
+ }
341
+ catch (error) {
342
+ console.error('保存调试文件失败:', error);
343
+ }
344
+ }
345
+ /**
346
+ * 处理MFA验证
347
+ * @param loginResponse 登录响应HTML
348
+ * @param signinParams 登录参数
349
+ * @param mfaCallback MFA验证码回调函数
350
+ * @returns MFA验证响应
351
+ */
352
+ async handleMfaVerification(loginResponse, signinParams, mfaCallback) {
353
+ try {
354
+ // 保存MFA页面HTML用于调试
355
+ this.saveHtmlToFile(loginResponse, 'mfa_page');
356
+ // 提取CSRF令牌
357
+ const csrfToken = this.extractCsrfToken(loginResponse);
358
+ if (!csrfToken) {
359
+ throw new Error('无法从MFA页面提取CSRF令牌');
360
+ }
361
+ // 获取MFA验证码
362
+ const mfaCode = await mfaCallback();
363
+ if (!mfaCode) {
364
+ throw new Error('未提供MFA验证码');
365
+ }
366
+ // 处理MFA验证 - 使用FormData方式,与旧版本一致
367
+ const SSO = this.url.GARMIN_SSO;
368
+ const mfaForm = new form_data_1.default();
369
+ mfaForm.append('mfa-code', mfaCode);
370
+ mfaForm.append('embed', 'true');
371
+ mfaForm.append('_csrf', csrfToken);
372
+ const mfaResult = await this.post(`${SSO}/mfa/verify`, mfaForm, {
373
+ params: signinParams,
374
+ headers: {
375
+ 'Content-Type': 'application/x-www-form-urlencoded',
376
+ 'Dnt': 1,
377
+ 'Origin': this.url.GARMIN_SSO_ORIGIN,
378
+ 'Referer': `${SSO}/signin`,
379
+ 'User-Agent': USER_AGENT_BROWSER
380
+ },
381
+ maxRedirects: 10,
382
+ // 添加响应拦截器,确保获取重定向后的最终响应
383
+ transformResponse: [
384
+ function (data, headers) {
385
+ // 检查是否有重定向
386
+ if (headers.location &&
387
+ headers.location.includes('logintoken')) {
388
+ console.log('检测到重定向到包含logintoken的URL:', headers.location);
389
+ }
390
+ return data;
391
+ }
392
+ ]
393
+ });
394
+ console.log('MFA验证完成,响应长度:', mfaResult.length);
395
+ // 保存MFA验证响应用于调试
396
+ this.saveHtmlToFile(mfaResult, 'mfa_verification_response');
397
+ // 检查MFA验证后的页面标题
398
+ const mfaResultTitle = this.extractPageTitle(mfaResult);
399
+ console.log('MFA验证后的页面标题:', mfaResultTitle);
400
+ // 验证MFA是否成功
401
+ if (mfaResultTitle !== 'Success' &&
402
+ !mfaResult.includes('ticket=')) {
403
+ throw new Error(`MFA验证失败,页面标题: ${mfaResultTitle}`);
404
+ }
405
+ // 如果MFA验证成功,更新loginResponse为MFA验证结果
406
+ // 这样后续的ticket提取将从MFA验证后的响应中进行
407
+ // 注意:这里我们不能直接修改loginResponse参数,但可以在返回值中提供MFA验证结果
408
+ return mfaResult;
409
+ }
410
+ catch (error) {
411
+ console.error('MFA验证失败:', error);
412
+ throw error;
413
+ }
414
+ }
415
+ /**
416
+ * 从HTML中提取CSRF令牌
417
+ * @param html HTML字符串
418
+ * @returns CSRF令牌或null
419
+ */
420
+ extractCsrfToken(html) {
421
+ const match = CSRF_RE.exec(html);
422
+ return match ? match[1] : null;
423
+ }
424
+ /**
425
+ * 从HTML中提取页面标题
426
+ * @param html HTML字符串
427
+ * @returns 页面标题或空字符串
428
+ */
429
+ extractPageTitle(html) {
430
+ const match = PAGE_TITLE_RE.exec(html);
431
+ return match ? match[1] : '';
432
+ }
433
+ /**
434
+ * 从HTML中提取ticket
435
+ * @param html HTML字符串
436
+ * @returns ticket或null
437
+ */
438
+ extractTicket(html) {
439
+ const match = TICKET_RE.exec(html);
440
+ return match ? match[1] : null;
441
+ }
442
+ /**
443
+ * 处理页面标题
444
+ * @param htmlStr HTML字符串
445
+ * @returns 页面标题
446
+ */
447
+ handlePageTitle(htmlStr) {
448
+ const pageTitileRegResult = PAGE_TITLE_RE.exec(htmlStr);
449
+ if (pageTitileRegResult) {
450
+ const title = pageTitileRegResult[1];
451
+ console.log('login page title:', title);
452
+ if (lodash_1.default.includes(title, 'Update Phone Number')) {
453
+ // current I don't know where to update it
454
+ // See: https://github.com/matin/garth/issues/19
455
+ throw new Error('login failed (Update Phone number), please update your phone number, See: https://github.com/matin/garth/issues/19');
456
+ }
457
+ return title;
458
+ }
459
+ else {
460
+ return '';
461
+ }
462
+ }
463
+ handleAccountLocked(htmlStr) {
464
+ const accountLockedRegResult = ACCOUNT_LOCKED_RE.exec(htmlStr);
465
+ if (accountLockedRegResult) {
466
+ const msg = accountLockedRegResult[1];
467
+ console.error(msg);
468
+ throw new Error('login failed (AccountLocked), please open connect web page to unlock your account');
469
+ }
470
+ }
471
+ async refreshOauth2Token() {
472
+ try {
473
+ if (!this.OAUTH_CONSUMER) {
474
+ await this.fetchOauthConsumer();
475
+ }
476
+ if (!this.oauth2Token || !this.oauth1Token) {
477
+ throw new Error('Missing required tokens for refresh');
478
+ }
479
+ const oauth1 = {
480
+ oauth: this.getOauthClient(this.OAUTH_CONSUMER),
481
+ token: this.oauth1Token
482
+ };
483
+ await this.exchange(oauth1);
484
+ console.log(`「${this.config.username}」in「${this.url.domain}」 OAuth2 token refreshed successfully`);
485
+ }
486
+ catch (error) {
487
+ console.error('Failed to refresh OAuth2 token:', error);
488
+ throw error;
489
+ }
490
+ }
491
+ async getOauth1Token(ticket) {
492
+ if (!this.OAUTH_CONSUMER) {
493
+ throw new Error('No OAUTH_CONSUMER');
494
+ }
495
+ const params = {
496
+ ticket,
497
+ 'login-url': this.url.GARMIN_SSO_EMBED,
498
+ 'accepts-mfa-tokens': true
499
+ };
500
+ const url = `${this.url.OAUTH_URL}/preauthorized?${qs_1.default.stringify(params)}`;
501
+ const oauth = this.getOauthClient(this.OAUTH_CONSUMER);
502
+ const step4RequestData = {
503
+ url: url,
504
+ method: 'GET'
505
+ };
506
+ const headers = oauth.toHeader(oauth.authorize(step4RequestData));
507
+ // console.log('getOauth1Token - headers:', headers);
508
+ const response = await this.get(url, {
509
+ headers: {
510
+ ...headers,
511
+ 'User-Agent': USER_AGENT_CONNECTMOBILE
512
+ }
513
+ });
514
+ // console.log('getOauth1Token - response:', response);
515
+ const token = qs_1.default.parse(response);
516
+ // console.log('getOauth1Token - token:', token);
517
+ this.oauth1Token = token;
518
+ return { token, oauth };
519
+ }
520
+ getOauthClient(consumer) {
521
+ const oauth = new oauth_1_0a_1.default({
522
+ consumer: consumer,
523
+ signature_method: 'HMAC-SHA1',
524
+ hash_function(base_string, key) {
525
+ return node_crypto_1.default
526
+ .createHmac('sha1', key)
527
+ .update(base_string)
528
+ .digest('base64');
529
+ }
530
+ });
531
+ return oauth;
532
+ }
533
+ //
534
+ async exchange(oauth1) {
535
+ const token = {
536
+ key: oauth1.token.oauth_token,
537
+ secret: oauth1.token.oauth_token_secret
538
+ };
539
+ // console.log('exchange - token:', token);
540
+ const baseUrl = `${this.url.OAUTH_URL}/exchange/user/2.0`;
541
+ const requestData = {
542
+ url: baseUrl,
543
+ method: 'POST',
544
+ data: null
545
+ };
546
+ const step5AuthData = oauth1.oauth.authorize(requestData, token);
547
+ // console.log('login - step5AuthData:', step5AuthData);
548
+ const url = `${baseUrl}?${qs_1.default.stringify(step5AuthData)}`;
549
+ // console.log('exchange - url:', url);
550
+ this.oauth2Token = undefined;
551
+ const response = await this.post(url, null, {
552
+ headers: {
553
+ 'User-Agent': USER_AGENT_CONNECTMOBILE,
554
+ 'Content-Type': 'application/x-www-form-urlencoded'
555
+ }
556
+ });
557
+ // console.log('exchange - response:', response);
558
+ this.oauth2Token = this.setOauth2TokenExpiresAt(response);
559
+ // console.log('exchange - oauth2Token:', this.oauth2Token);
560
+ }
561
+ setOauth2TokenExpiresAt(token) {
562
+ const now = luxon_1.DateTime.now();
563
+ const expiresAt = now.plus({ seconds: token.expires_in });
564
+ const refreshTokenExpiresAt = now.plus({
565
+ seconds: token.refresh_token_expires_in
566
+ });
567
+ return {
568
+ ...token,
569
+ last_update_date: now.toLocal().toString(),
570
+ expires_date: expiresAt.toLocal().toString(),
571
+ expires_at: expiresAt.toSeconds(),
572
+ refresh_token_expires_at: refreshTokenExpiresAt.toSeconds()
573
+ };
574
+ }
575
+ }
576
+ exports.HttpClient = HttpClient;
577
+ //# sourceMappingURL=HttpClientV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClientV1.js","sourceRoot":"","sources":["../../src/common/HttpClientV1.ts"],"names":[],"mappings":"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"}