@flow-js/garmin-connect 1.6.3

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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +627 -0
  3. package/dist/common/CFClient.d.ts +22 -0
  4. package/dist/common/CFClient.js +137 -0
  5. package/dist/common/CFClient.js.map +1 -0
  6. package/dist/common/DateUtils.d.ts +1 -0
  7. package/dist/common/DateUtils.js +11 -0
  8. package/dist/common/DateUtils.js.map +1 -0
  9. package/dist/common/HttpClient.d.ts +37 -0
  10. package/dist/common/HttpClient.js +496 -0
  11. package/dist/common/HttpClient.js.map +1 -0
  12. package/dist/garmin/GarminConnect.d.ts +112 -0
  13. package/dist/garmin/GarminConnect.js +816 -0
  14. package/dist/garmin/GarminConnect.js.map +1 -0
  15. package/dist/garmin/UrlClass.d.ts +53 -0
  16. package/dist/garmin/UrlClass.js +267 -0
  17. package/dist/garmin/UrlClass.js.map +1 -0
  18. package/dist/garmin/Urls.d.ts +56 -0
  19. package/dist/garmin/Urls.js +88 -0
  20. package/dist/garmin/Urls.js.map +1 -0
  21. package/dist/garmin/common/DateUtils.d.ts +6 -0
  22. package/dist/garmin/common/DateUtils.js +38 -0
  23. package/dist/garmin/common/DateUtils.js.map +1 -0
  24. package/dist/garmin/common/GpxUtils.d.ts +2 -0
  25. package/dist/garmin/common/GpxUtils.js +28 -0
  26. package/dist/garmin/common/GpxUtils.js.map +1 -0
  27. package/dist/garmin/common/HydrationUtils.d.ts +2 -0
  28. package/dist/garmin/common/HydrationUtils.js +16 -0
  29. package/dist/garmin/common/HydrationUtils.js.map +1 -0
  30. package/dist/garmin/common/WeightUtils.d.ts +1 -0
  31. package/dist/garmin/common/WeightUtils.js +9 -0
  32. package/dist/garmin/common/WeightUtils.js.map +1 -0
  33. package/dist/garmin/types/activity.d.ts +408 -0
  34. package/dist/garmin/types/activity.js +27 -0
  35. package/dist/garmin/types/activity.js.map +1 -0
  36. package/dist/garmin/types/gear.d.ts +20 -0
  37. package/dist/garmin/types/gear.js +3 -0
  38. package/dist/garmin/types/gear.js.map +1 -0
  39. package/dist/garmin/types/golf.d.ts +67 -0
  40. package/dist/garmin/types/golf.js +3 -0
  41. package/dist/garmin/types/golf.js.map +1 -0
  42. package/dist/garmin/types/gpx.d.ts +171 -0
  43. package/dist/garmin/types/gpx.js +15 -0
  44. package/dist/garmin/types/gpx.js.map +1 -0
  45. package/dist/garmin/types/heartrate.d.ts +22 -0
  46. package/dist/garmin/types/heartrate.js +2 -0
  47. package/dist/garmin/types/heartrate.js.map +1 -0
  48. package/dist/garmin/types/hydration.d.ts +28 -0
  49. package/dist/garmin/types/hydration.js +2 -0
  50. package/dist/garmin/types/hydration.js.map +1 -0
  51. package/dist/garmin/types/index.d.ts +445 -0
  52. package/dist/garmin/types/index.js +37 -0
  53. package/dist/garmin/types/index.js.map +1 -0
  54. package/dist/garmin/types/sleep.d.ts +120 -0
  55. package/dist/garmin/types/sleep.js +3 -0
  56. package/dist/garmin/types/sleep.js.map +1 -0
  57. package/dist/garmin/types/weight.d.ts +42 -0
  58. package/dist/garmin/types/weight.js +3 -0
  59. package/dist/garmin/types/weight.js.map +1 -0
  60. package/dist/garmin/types/workout-builder.d.ts +138 -0
  61. package/dist/garmin/types/workout-builder.js +286 -0
  62. package/dist/garmin/types/workout-builder.js.map +1 -0
  63. package/dist/garmin/types/workout.d.ts +56 -0
  64. package/dist/garmin/types/workout.js +3 -0
  65. package/dist/garmin/types/workout.js.map +1 -0
  66. package/dist/garmin/types.d.ts +504 -0
  67. package/dist/garmin/types.js +3 -0
  68. package/dist/garmin/types.js.map +1 -0
  69. package/dist/garmin/workout-builder/duration.d.ts +87 -0
  70. package/dist/garmin/workout-builder/duration.js +173 -0
  71. package/dist/garmin/workout-builder/duration.js.map +1 -0
  72. package/dist/garmin/workout-builder/index.d.ts +5 -0
  73. package/dist/garmin/workout-builder/index.js +22 -0
  74. package/dist/garmin/workout-builder/index.js.map +1 -0
  75. package/dist/garmin/workout-builder/step.d.ts +28 -0
  76. package/dist/garmin/workout-builder/step.js +60 -0
  77. package/dist/garmin/workout-builder/step.js.map +1 -0
  78. package/dist/garmin/workout-builder/target.d.ts +49 -0
  79. package/dist/garmin/workout-builder/target.js +193 -0
  80. package/dist/garmin/workout-builder/target.js.map +1 -0
  81. package/dist/garmin/workout-builder/workout-builder.d.ts +12 -0
  82. package/dist/garmin/workout-builder/workout-builder.js +37 -0
  83. package/dist/garmin/workout-builder/workout-builder.js.map +1 -0
  84. package/dist/garmin/workout-builder/workout-type.d.ts +11 -0
  85. package/dist/garmin/workout-builder/workout-type.js +26 -0
  86. package/dist/garmin/workout-builder/workout-type.js.map +1 -0
  87. package/dist/garmin/workouts/Running.d.ts +16 -0
  88. package/dist/garmin/workouts/Running.js +64 -0
  89. package/dist/garmin/workouts/Running.js.map +1 -0
  90. package/dist/garmin/workouts/templates/RunningTemplate.d.ts +68 -0
  91. package/dist/garmin/workouts/templates/RunningTemplate.js +78 -0
  92. package/dist/garmin/workouts/templates/RunningTemplate.js.map +1 -0
  93. package/dist/garmin/workouts/workout-builder.d.ts +138 -0
  94. package/dist/garmin/workouts/workout-builder.js +286 -0
  95. package/dist/garmin/workouts/workout-builder.js.map +1 -0
  96. package/dist/garmin/workouts-builder/workout-builder.d.ts +138 -0
  97. package/dist/garmin/workouts-builder/workout-builder.js +286 -0
  98. package/dist/garmin/workouts-builder/workout-builder.js.map +1 -0
  99. package/dist/index.d.ts +4 -0
  100. package/dist/index.js +26 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/utils.d.ts +3 -0
  103. package/dist/utils.js +46 -0
  104. package/dist/utils.js.map +1 -0
  105. package/examples/assets/paris-marathon.gpx +2037 -0
  106. package/examples/example-gpx-file.js +54 -0
  107. package/examples/example-workout.js +162 -0
  108. package/examples/example.js +34 -0
  109. package/package.json +67 -0
@@ -0,0 +1,496 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.HttpClient = void 0;
54
+ var axios_1 = __importDefault(require("axios"));
55
+ var form_data_1 = __importDefault(require("form-data"));
56
+ var lodash_1 = __importDefault(require("lodash"));
57
+ var luxon_1 = require("luxon");
58
+ var oauth_1_0a_1 = __importDefault(require("oauth-1.0a"));
59
+ var qs_1 = __importDefault(require("qs"));
60
+ var crypto = require('crypto');
61
+ var CSRF_RE = new RegExp('name="_csrf"\\s+value="(.+?)"');
62
+ var TICKET_RE = new RegExp('ticket=([^"]+)"');
63
+ var ACCOUNT_LOCKED_RE = new RegExp('var statuss*=s*"([^"]*)"');
64
+ var PAGE_TITLE_RE = new RegExp('<title>([^<]*)</title>');
65
+ var USER_AGENT_CONNECTMOBILE = 'com.garmin.android.apps.connectmobile';
66
+ var 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';
67
+ var OAUTH_CONSUMER_URL = 'https://thegarth.s3.amazonaws.com/oauth_consumer.json';
68
+ // refresh token
69
+ var isRefreshing = false;
70
+ var refreshSubscribers = [];
71
+ var HttpClient = /** @class */ (function () {
72
+ function HttpClient(url) {
73
+ var _this = this;
74
+ this.url = url;
75
+ this.client = axios_1.default.create();
76
+ this.client.interceptors.response.use(function (response) { return response; }, function (error) { return __awaiter(_this, void 0, void 0, function () {
77
+ var originalRequest, token, err_1;
78
+ var _this = this;
79
+ var _a;
80
+ return __generator(this, function (_b) {
81
+ switch (_b.label) {
82
+ case 0:
83
+ originalRequest = error.config;
84
+ if (!(((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 &&
85
+ !(originalRequest === null || originalRequest === void 0 ? void 0 : originalRequest._retry))) return [3 /*break*/, 6];
86
+ if (!this.oauth2Token) {
87
+ return [2 /*return*/];
88
+ }
89
+ if (!isRefreshing) return [3 /*break*/, 4];
90
+ _b.label = 1;
91
+ case 1:
92
+ _b.trys.push([1, 3, , 4]);
93
+ return [4 /*yield*/, new Promise(function (resolve) {
94
+ refreshSubscribers.push(function (token) {
95
+ resolve(token);
96
+ });
97
+ })];
98
+ case 2:
99
+ token = _b.sent();
100
+ originalRequest.headers.Authorization = "Bearer ".concat(token);
101
+ return [2 /*return*/, this.client(originalRequest)];
102
+ case 3:
103
+ err_1 = _b.sent();
104
+ console.log('err:', err_1);
105
+ return [2 /*return*/, Promise.reject(err_1)];
106
+ case 4:
107
+ originalRequest._retry = true;
108
+ isRefreshing = true;
109
+ console.log('interceptors: refreshOauth2Token start');
110
+ return [4 /*yield*/, this.refreshOauth2Token()];
111
+ case 5:
112
+ _b.sent();
113
+ console.log('interceptors: refreshOauth2Token end');
114
+ isRefreshing = false;
115
+ refreshSubscribers.forEach(function (subscriber) {
116
+ return subscriber(_this.oauth2Token.access_token);
117
+ });
118
+ refreshSubscribers = [];
119
+ originalRequest.headers.Authorization = "Bearer ".concat(this.oauth2Token.access_token);
120
+ return [2 /*return*/, this.client(originalRequest)];
121
+ case 6:
122
+ if (axios_1.default.isAxiosError(error)) {
123
+ if (error === null || error === void 0 ? void 0 : error.response)
124
+ this.handleError(error === null || error === void 0 ? void 0 : error.response);
125
+ }
126
+ throw error;
127
+ }
128
+ });
129
+ }); });
130
+ this.client.interceptors.request.use(function (config) { return __awaiter(_this, void 0, void 0, function () {
131
+ return __generator(this, function (_a) {
132
+ if (this.oauth2Token) {
133
+ config.headers.Authorization =
134
+ 'Bearer ' + this.oauth2Token.access_token;
135
+ }
136
+ return [2 /*return*/, config];
137
+ });
138
+ }); });
139
+ }
140
+ HttpClient.prototype.fetchOauthConsumer = function () {
141
+ return __awaiter(this, void 0, void 0, function () {
142
+ var response;
143
+ return __generator(this, function (_a) {
144
+ switch (_a.label) {
145
+ case 0: return [4 /*yield*/, axios_1.default.get(OAUTH_CONSUMER_URL)];
146
+ case 1:
147
+ response = _a.sent();
148
+ this.OAUTH_CONSUMER = {
149
+ key: response.data.consumer_key,
150
+ secret: response.data.consumer_secret
151
+ };
152
+ return [2 /*return*/];
153
+ }
154
+ });
155
+ });
156
+ };
157
+ HttpClient.prototype.checkTokenVaild = function () {
158
+ return __awaiter(this, void 0, void 0, function () {
159
+ return __generator(this, function (_a) {
160
+ switch (_a.label) {
161
+ case 0:
162
+ if (!this.oauth2Token) return [3 /*break*/, 2];
163
+ if (!(this.oauth2Token.expires_at < luxon_1.DateTime.now().toSeconds())) return [3 /*break*/, 2];
164
+ console.error('Token expired!');
165
+ return [4 /*yield*/, this.refreshOauth2Token()];
166
+ case 1:
167
+ _a.sent();
168
+ _a.label = 2;
169
+ case 2: return [2 /*return*/];
170
+ }
171
+ });
172
+ });
173
+ };
174
+ HttpClient.prototype.get = function (url, config) {
175
+ return __awaiter(this, void 0, void 0, function () {
176
+ var response;
177
+ return __generator(this, function (_a) {
178
+ switch (_a.label) {
179
+ case 0: return [4 /*yield*/, this.client.get(url, config)];
180
+ case 1:
181
+ response = _a.sent();
182
+ return [2 /*return*/, response === null || response === void 0 ? void 0 : response.data];
183
+ }
184
+ });
185
+ });
186
+ };
187
+ HttpClient.prototype.post = function (url, data, config) {
188
+ return __awaiter(this, void 0, void 0, function () {
189
+ var response;
190
+ return __generator(this, function (_a) {
191
+ switch (_a.label) {
192
+ case 0: return [4 /*yield*/, this.client.post(url, data, config)];
193
+ case 1:
194
+ response = _a.sent();
195
+ return [2 /*return*/, response === null || response === void 0 ? void 0 : response.data];
196
+ }
197
+ });
198
+ });
199
+ };
200
+ HttpClient.prototype.put = function (url, data, config) {
201
+ return __awaiter(this, void 0, void 0, function () {
202
+ var response;
203
+ return __generator(this, function (_a) {
204
+ switch (_a.label) {
205
+ case 0: return [4 /*yield*/, this.client.put(url, data, config)];
206
+ case 1:
207
+ response = _a.sent();
208
+ return [2 /*return*/, response === null || response === void 0 ? void 0 : response.data];
209
+ }
210
+ });
211
+ });
212
+ };
213
+ HttpClient.prototype.delete = function (url, config) {
214
+ return __awaiter(this, void 0, void 0, function () {
215
+ var response;
216
+ return __generator(this, function (_a) {
217
+ switch (_a.label) {
218
+ case 0: return [4 /*yield*/, this.client.post(url, null, __assign(__assign({}, config), { headers: __assign(__assign({}, config === null || config === void 0 ? void 0 : config.headers), { 'X-Http-Method-Override': 'DELETE' }) }))];
219
+ case 1:
220
+ response = _a.sent();
221
+ return [2 /*return*/, response === null || response === void 0 ? void 0 : response.data];
222
+ }
223
+ });
224
+ });
225
+ };
226
+ HttpClient.prototype.setCommonHeader = function (headers) {
227
+ var _this = this;
228
+ lodash_1.default.each(headers, function (headerValue, key) {
229
+ _this.client.defaults.headers.common[key] = headerValue;
230
+ });
231
+ };
232
+ HttpClient.prototype.handleError = function (response) {
233
+ this.handleHttpError(response);
234
+ };
235
+ HttpClient.prototype.handleHttpError = function (response) {
236
+ var status = response.status, statusText = response.statusText, data = response.data;
237
+ var msg = "ERROR: (".concat(status, "), ").concat(statusText, ", ").concat(JSON.stringify(data));
238
+ console.error(msg);
239
+ throw new Error(msg);
240
+ };
241
+ /**
242
+ * Login to Garmin Connect
243
+ * @param username
244
+ * @param password
245
+ * @returns {Promise<HttpClient>}
246
+ */
247
+ HttpClient.prototype.login = function (username, password) {
248
+ return __awaiter(this, void 0, void 0, function () {
249
+ var ticket, oauth1;
250
+ return __generator(this, function (_a) {
251
+ switch (_a.label) {
252
+ case 0: return [4 /*yield*/, this.fetchOauthConsumer()];
253
+ case 1:
254
+ _a.sent();
255
+ return [4 /*yield*/, this.getLoginTicket(username, password)];
256
+ case 2:
257
+ ticket = _a.sent();
258
+ return [4 /*yield*/, this.getOauth1Token(ticket)];
259
+ case 3:
260
+ oauth1 = _a.sent();
261
+ // TODO: Handle MFA
262
+ // Step 5: Oauth2
263
+ return [4 /*yield*/, this.exchange(oauth1)];
264
+ case 4:
265
+ // TODO: Handle MFA
266
+ // Step 5: Oauth2
267
+ _a.sent();
268
+ return [2 /*return*/, this];
269
+ }
270
+ });
271
+ });
272
+ };
273
+ HttpClient.prototype.getLoginTicket = function (username, password) {
274
+ return __awaiter(this, void 0, void 0, function () {
275
+ var step1Params, step1Url, step2Params, step2Url, step2Result, csrfRegResult, csrf_token, signinParams, step3Url, step3Form, step3Result, ticketRegResult, ticket;
276
+ return __generator(this, function (_a) {
277
+ switch (_a.label) {
278
+ case 0:
279
+ step1Params = {
280
+ clientId: 'GarminConnect',
281
+ locale: 'en',
282
+ service: this.url.GC_MODERN
283
+ };
284
+ step1Url = "".concat(this.url.GARMIN_SSO_EMBED, "?").concat(qs_1.default.stringify(step1Params));
285
+ // console.log('login - step1Url:', step1Url);
286
+ return [4 /*yield*/, this.client.get(step1Url)];
287
+ case 1:
288
+ // console.log('login - step1Url:', step1Url);
289
+ _a.sent();
290
+ step2Params = {
291
+ id: 'gauth-widget',
292
+ embedWidget: true,
293
+ locale: 'en',
294
+ gauthHost: this.url.GARMIN_SSO_EMBED
295
+ };
296
+ step2Url = "".concat(this.url.SIGNIN_URL, "?").concat(qs_1.default.stringify(step2Params));
297
+ return [4 /*yield*/, this.get(step2Url)];
298
+ case 2:
299
+ step2Result = _a.sent();
300
+ csrfRegResult = CSRF_RE.exec(step2Result);
301
+ if (!csrfRegResult) {
302
+ throw new Error('login - csrf not found');
303
+ }
304
+ csrf_token = csrfRegResult[1];
305
+ signinParams = {
306
+ id: 'gauth-widget',
307
+ embedWidget: true,
308
+ clientId: 'GarminConnect',
309
+ locale: 'en',
310
+ gauthHost: this.url.GARMIN_SSO_EMBED,
311
+ service: this.url.GARMIN_SSO_EMBED,
312
+ source: this.url.GARMIN_SSO_EMBED,
313
+ redirectAfterAccountLoginUrl: this.url.GARMIN_SSO_EMBED,
314
+ redirectAfterAccountCreationUrl: this.url.GARMIN_SSO_EMBED
315
+ };
316
+ step3Url = "".concat(this.url.SIGNIN_URL, "?").concat(qs_1.default.stringify(signinParams));
317
+ step3Form = new form_data_1.default();
318
+ step3Form.append('username', username);
319
+ step3Form.append('password', password);
320
+ step3Form.append('embed', 'true');
321
+ step3Form.append('_csrf', csrf_token);
322
+ return [4 /*yield*/, this.post(step3Url, step3Form, {
323
+ headers: {
324
+ 'Content-Type': 'application/x-www-form-urlencoded',
325
+ Dnt: 1,
326
+ Origin: this.url.GARMIN_SSO_ORIGIN,
327
+ Referer: this.url.SIGNIN_URL,
328
+ 'User-Agent': USER_AGENT_BROWSER
329
+ }
330
+ })];
331
+ case 3:
332
+ step3Result = _a.sent();
333
+ // console.log('step3Result:', step3Result)
334
+ this.handleAccountLocked(step3Result);
335
+ this.handlePageTitle(step3Result);
336
+ this.handleMFA(step3Result);
337
+ ticketRegResult = TICKET_RE.exec(step3Result);
338
+ if (!ticketRegResult) {
339
+ throw new Error('login failed (Ticket not found or MFA), please check username and password');
340
+ }
341
+ ticket = ticketRegResult[1];
342
+ return [2 /*return*/, ticket];
343
+ }
344
+ });
345
+ });
346
+ };
347
+ // TODO: Handle MFA
348
+ HttpClient.prototype.handleMFA = function (htmlStr) { };
349
+ // TODO: Handle Phone number
350
+ HttpClient.prototype.handlePageTitle = function (htmlStr) {
351
+ var pageTitileRegResult = PAGE_TITLE_RE.exec(htmlStr);
352
+ if (pageTitileRegResult) {
353
+ var title = pageTitileRegResult[1];
354
+ console.log('login page title:', title);
355
+ if (lodash_1.default.includes(title, 'Update Phone Number')) {
356
+ // current I don't know where to update it
357
+ // See: https://github.com/matin/garth/issues/19
358
+ throw new Error("login failed (Update Phone number), please update your phone number, currently I don't know where to update it");
359
+ }
360
+ }
361
+ };
362
+ HttpClient.prototype.handleAccountLocked = function (htmlStr) {
363
+ var accountLockedRegResult = ACCOUNT_LOCKED_RE.exec(htmlStr);
364
+ if (accountLockedRegResult) {
365
+ var msg = accountLockedRegResult[1];
366
+ console.error(msg);
367
+ throw new Error('login failed (AccountLocked), please open connect web page to unlock your account');
368
+ }
369
+ };
370
+ HttpClient.prototype.refreshOauth2Token = function () {
371
+ return __awaiter(this, void 0, void 0, function () {
372
+ var oauth1;
373
+ return __generator(this, function (_a) {
374
+ switch (_a.label) {
375
+ case 0:
376
+ if (!!this.OAUTH_CONSUMER) return [3 /*break*/, 2];
377
+ return [4 /*yield*/, this.fetchOauthConsumer()];
378
+ case 1:
379
+ _a.sent();
380
+ _a.label = 2;
381
+ case 2:
382
+ if (!this.oauth2Token || !this.oauth1Token) {
383
+ throw new Error('No Oauth2Token or Oauth1Token');
384
+ }
385
+ oauth1 = {
386
+ oauth: this.getOauthClient(this.OAUTH_CONSUMER),
387
+ token: this.oauth1Token
388
+ };
389
+ return [4 /*yield*/, this.exchange(oauth1)];
390
+ case 3:
391
+ _a.sent();
392
+ console.log('Oauth2 token refreshed!');
393
+ return [2 /*return*/];
394
+ }
395
+ });
396
+ });
397
+ };
398
+ HttpClient.prototype.getOauth1Token = function (ticket) {
399
+ return __awaiter(this, void 0, void 0, function () {
400
+ var params, url, oauth, step4RequestData, headers, response, token;
401
+ return __generator(this, function (_a) {
402
+ switch (_a.label) {
403
+ case 0:
404
+ if (!this.OAUTH_CONSUMER) {
405
+ throw new Error('No OAUTH_CONSUMER');
406
+ }
407
+ params = {
408
+ ticket: ticket,
409
+ 'login-url': this.url.GARMIN_SSO_EMBED,
410
+ 'accepts-mfa-tokens': true
411
+ };
412
+ url = "".concat(this.url.OAUTH_URL, "/preauthorized?").concat(qs_1.default.stringify(params));
413
+ oauth = this.getOauthClient(this.OAUTH_CONSUMER);
414
+ step4RequestData = {
415
+ url: url,
416
+ method: 'GET'
417
+ };
418
+ headers = oauth.toHeader(oauth.authorize(step4RequestData));
419
+ return [4 /*yield*/, this.get(url, {
420
+ headers: __assign(__assign({}, headers), { 'User-Agent': USER_AGENT_CONNECTMOBILE })
421
+ })];
422
+ case 1:
423
+ response = _a.sent();
424
+ token = qs_1.default.parse(response);
425
+ // console.log('getOauth1Token - token:', token);
426
+ this.oauth1Token = token;
427
+ return [2 /*return*/, { token: token, oauth: oauth }];
428
+ }
429
+ });
430
+ });
431
+ };
432
+ HttpClient.prototype.getOauthClient = function (consumer) {
433
+ var oauth = new oauth_1_0a_1.default({
434
+ consumer: consumer,
435
+ signature_method: 'HMAC-SHA1',
436
+ hash_function: function (base_string, key) {
437
+ return crypto
438
+ .createHmac('sha1', key)
439
+ .update(base_string)
440
+ .digest('base64');
441
+ }
442
+ });
443
+ return oauth;
444
+ };
445
+ //
446
+ HttpClient.prototype.exchange = function (oauth1) {
447
+ return __awaiter(this, void 0, void 0, function () {
448
+ var token, baseUrl, requestData, step5AuthData, url, response;
449
+ return __generator(this, function (_a) {
450
+ switch (_a.label) {
451
+ case 0:
452
+ token = {
453
+ key: oauth1.token.oauth_token,
454
+ secret: oauth1.token.oauth_token_secret
455
+ };
456
+ baseUrl = "".concat(this.url.OAUTH_URL, "/exchange/user/2.0");
457
+ requestData = {
458
+ url: baseUrl,
459
+ method: 'POST',
460
+ data: null
461
+ };
462
+ step5AuthData = oauth1.oauth.authorize(requestData, token);
463
+ url = "".concat(baseUrl, "?").concat(qs_1.default.stringify(step5AuthData));
464
+ // console.log('exchange - url:', url);
465
+ this.oauth2Token = undefined;
466
+ return [4 /*yield*/, this.post(url, null, {
467
+ headers: {
468
+ 'User-Agent': USER_AGENT_CONNECTMOBILE,
469
+ 'Content-Type': 'application/x-www-form-urlencoded'
470
+ }
471
+ })];
472
+ case 1:
473
+ response = _a.sent();
474
+ // console.log('exchange - response:', response);
475
+ this.oauth2Token = this.setOauth2TokenExpiresAt(response);
476
+ return [2 /*return*/];
477
+ }
478
+ });
479
+ });
480
+ };
481
+ HttpClient.prototype.setOauth2TokenExpiresAt = function (token) {
482
+ // human readable date
483
+ token['last_update_date'] = luxon_1.DateTime.now().toLocal().toString();
484
+ token['expires_date'] = luxon_1.DateTime.fromSeconds(luxon_1.DateTime.now().toSeconds() + token['expires_in'])
485
+ .toLocal()
486
+ .toString();
487
+ // timestamp for check expired
488
+ token['expires_at'] = luxon_1.DateTime.now().toSeconds() + token['expires_in'];
489
+ token['refresh_token_expires_at'] =
490
+ luxon_1.DateTime.now().toSeconds() + token['refresh_token_expires_in'];
491
+ return token;
492
+ };
493
+ return HttpClient;
494
+ }());
495
+ exports.HttpClient = HttpClient;
496
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/common/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { HttpClient } from '../common/HttpClient';
2
+ import { ExportFileTypeValue, GarminDomain, GCGearId, ICountActivities, IGarminTokens, IOauth1Token, IOauth2Token, ISocialProfile, IUserSettings, IWorkout, IWorkoutDetail, ListCoursesResponse, UploadFileTypeTypeValue } from './types';
3
+ import Running from './workouts/Running';
4
+ import { SleepData } from './types/sleep';
5
+ import { ActivitySubType, ActivityType, GCActivityId, IActivity } from './types/activity';
6
+ import { GearData } from './types/gear';
7
+ import { Workout } from './types/workout';
8
+ import { CoursePoint, GeoPoint, GpxActivityType, ImportedGpxResponse } from './types/gpx';
9
+ export type EventCallback<T> = (data: T) => void;
10
+ export interface GCCredentials {
11
+ username: string;
12
+ password: string;
13
+ }
14
+ export interface Listeners {
15
+ [event: string]: EventCallback<any>[];
16
+ }
17
+ export declare enum Event {
18
+ sessionChange = "sessionChange"
19
+ }
20
+ export interface Session {
21
+ }
22
+ export default class GarminConnect {
23
+ client: HttpClient;
24
+ private _userHash;
25
+ private credentials;
26
+ private listeners;
27
+ private url;
28
+ constructor(credentials?: GCCredentials | undefined, domain?: GarminDomain);
29
+ login(username?: string, password?: string): Promise<GarminConnect>;
30
+ exportTokenToFile(dirPath: string): void;
31
+ loadTokenByFile(dirPath: string): void;
32
+ exportToken(): IGarminTokens;
33
+ loadToken(oauth1: IOauth1Token, oauth2: IOauth2Token): void;
34
+ getUserSettings(): Promise<IUserSettings>;
35
+ getUserProfile(): Promise<ISocialProfile>;
36
+ getActivities(start?: number, limit?: number, activityType?: ActivityType, subActivityType?: ActivitySubType): Promise<IActivity[]>;
37
+ getActivity(activity: {
38
+ activityId: GCActivityId;
39
+ }): Promise<IActivity>;
40
+ countActivities(): Promise<ICountActivities>;
41
+ downloadOriginalActivityData(activity: {
42
+ activityId: GCActivityId;
43
+ }, dir: string, type?: ExportFileTypeValue): Promise<void>;
44
+ uploadActivity(file: string, format?: UploadFileTypeTypeValue): Promise<unknown>;
45
+ deleteActivity(activity: {
46
+ activityId: GCActivityId;
47
+ }): Promise<void>;
48
+ getWorkouts(start: number, limit: number): Promise<IWorkout[]>;
49
+ getWorkoutDetail(workout: {
50
+ workoutId: string;
51
+ }): Promise<IWorkoutDetail>;
52
+ createWorkout(workout: IWorkoutDetail): Promise<IWorkoutDetail>;
53
+ addWorkout(workout: IWorkoutDetail | Running): Promise<IWorkoutDetail>;
54
+ addRunningWorkout(name: string, meters: number, description: string): Promise<IWorkoutDetail>;
55
+ deleteWorkout(workout: {
56
+ workoutId: string;
57
+ }): Promise<unknown>;
58
+ /**
59
+ * Schedule a workout by workoutId to a specific date
60
+ * @param workout - with workoutId
61
+ * @param scheduleDate - 'YYYY-MM-DD'
62
+ */
63
+ scheduleWorkout(workout: {
64
+ workoutId: string;
65
+ }, scheduleDate: string): Promise<unknown>;
66
+ getSteps(date?: Date): Promise<number>;
67
+ getSleepData(date?: Date): Promise<SleepData>;
68
+ getSleepDuration(date?: Date): Promise<{
69
+ hours: number;
70
+ minutes: number;
71
+ }>;
72
+ getDailyWeightData(date?: Date): Promise<WeightData>;
73
+ getDailyWeightInPounds(date?: Date): Promise<number>;
74
+ getDailyHydration(date?: Date): Promise<number>;
75
+ updateWeight(date: Date | undefined, lbs: number, timezone: string): Promise<UpdateWeight>;
76
+ updateHydrationLogOunces(date: Date | undefined, valueInOz: number): Promise<WaterIntake>;
77
+ getGolfSummary(): Promise<GolfSummary>;
78
+ getGolfScorecard(scorecardId: number): Promise<GolfScorecard>;
79
+ getHeartRate(date?: Date): Promise<HeartRate>;
80
+ /**
81
+ * Returns the gear data for the user.
82
+ * @param availableGearDate - Optional date to filter the gear available at the date (format: 'YYYY-MM-DD').
83
+ */
84
+ getGear(availableGearDate?: string): Promise<GearData[]>;
85
+ /**
86
+ * Returns the gear data assigned with a specific activity.
87
+ * @param activityId
88
+ */
89
+ getGearsForActivity(activityId: GCActivityId): Promise<GearData[]>;
90
+ /**
91
+ * Links a gear item to an activity.
92
+ * @param activityId
93
+ * @param gearId - uuid field from GearData
94
+ * @return GearData - the linked gear item data
95
+ */
96
+ linkGearToActivity(activityId: GCActivityId, gearId: GCGearId): Promise<GearData>;
97
+ /**
98
+ * Unlinks a gear item from an activity.
99
+ * @param activityId
100
+ * @param gearId - uuid field from GearData
101
+ * @return GearData - the unlinked gear item data
102
+ */
103
+ unlinkGearFromActivity(activityId: GCActivityId, gearId: GCGearId): Promise<GearData>;
104
+ workouts(): Promise<Workout[]>;
105
+ importGpx(fileName: string, fileContent: string): Promise<ImportedGpxResponse>;
106
+ createCourse(activityType: GpxActivityType, courseName: string, geoPoints: GeoPoint[], coursePoints?: CoursePoint[]): Promise<unknown>;
107
+ listCourses(): Promise<ListCoursesResponse>;
108
+ exportCourseAsGpx(courseId: number): Promise<string>;
109
+ get<T>(url: string, data?: any): Promise<T>;
110
+ post<T>(url: string, data: any): Promise<T>;
111
+ put<T>(url: string, data: any): Promise<T>;
112
+ }