garmin-connect-client 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -11
- package/dist/auth-html-parser.d.ts +18 -0
- package/dist/auth-html-parser.d.ts.map +1 -0
- package/dist/auth-html-parser.js +88 -0
- package/dist/auth-html-parser.js.map +1 -0
- package/dist/authentication-service.d.ts +9 -24
- package/dist/authentication-service.d.ts.map +1 -1
- package/dist/authentication-service.js +87 -299
- package/dist/authentication-service.js.map +1 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -33
- package/dist/client.js.map +1 -1
- package/dist/curl-client.d.ts +16 -0
- package/dist/curl-client.d.ts.map +1 -0
- package/dist/curl-client.js +116 -0
- package/dist/curl-client.js.map +1 -0
- package/dist/errors.d.ts +0 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -12
- package/dist/errors.js.map +1 -1
- package/dist/http-client.d.ts +4 -7
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +22 -75
- package/dist/http-client.js.map +1 -1
- package/dist/index.d.ts +13 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -39
- package/dist/index.js.map +1 -1
- package/dist/oauth-utils.d.ts +3 -8
- package/dist/oauth-utils.d.ts.map +1 -1
- package/dist/oauth-utils.js +14 -38
- package/dist/oauth-utils.js.map +1 -1
- package/dist/oauth2-exchanger.d.ts +9 -0
- package/dist/oauth2-exchanger.d.ts.map +1 -0
- package/dist/oauth2-exchanger.js +58 -0
- package/dist/oauth2-exchanger.js.map +1 -0
- package/dist/types.d.ts +25 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -1
- package/dist/types.js.map +1 -1
- package/dist/urls.d.ts +7 -14
- package/dist/urls.d.ts.map +1 -1
- package/dist/urls.js +71 -60
- package/dist/urls.js.map +1 -1
- package/package.json +4 -2
- package/dist/auth-context.d.ts +0 -23
- package/dist/auth-context.d.ts.map +0 -1
- package/dist/auth-context.js +0 -53
- package/dist/auth-context.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication-service.js","sourceRoot":"","sources":["../src/authentication-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authentication-service.js","sourceRoot":"","sources":["../src/authentication-service.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HttpClient } from './http-client';
|
|
2
2
|
import type { Activity, GarminConnectClient, GolfActivitiesPage, GolfScorecardDetailWithSnapshot, GolfRoundsPage, GarminConnectSleepClient, PersistedSession } from './types';
|
|
3
3
|
import { GarminUrls } from './urls';
|
|
4
4
|
export declare class GarminConnectClientImpl implements GarminConnectClient {
|
|
@@ -7,13 +7,14 @@ export declare class GarminConnectClientImpl implements GarminConnectClient {
|
|
|
7
7
|
private sleepClient;
|
|
8
8
|
get sleep(): GarminConnectSleepClient;
|
|
9
9
|
private constructor();
|
|
10
|
-
static
|
|
10
|
+
static fromHttpClient(httpClient: HttpClient, urls: GarminUrls): GarminConnectClientImpl;
|
|
11
11
|
static createUnauthenticated(): GarminConnectClientImpl;
|
|
12
12
|
static fromSession(session: PersistedSession): GarminConnectClientImpl;
|
|
13
13
|
getActivities(start?: number, limit?: number): Promise<Activity[]>;
|
|
14
14
|
getActivity(id: string): Promise<Activity>;
|
|
15
15
|
getGolfActivities(page?: number, perPage?: number, locale?: string): Promise<GolfActivitiesPage>;
|
|
16
16
|
getGolfScorecardDetail(scorecardId: number, locale?: string): Promise<GolfScorecardDetailWithSnapshot>;
|
|
17
|
+
onSessionUpdate(callback: (session: PersistedSession) => void | Promise<void>): void;
|
|
17
18
|
getSession(): PersistedSession;
|
|
18
19
|
getGolfRounds(page?: number, perPage?: number, locale?: string): Promise<GolfRoundsPage>;
|
|
19
20
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,+BAA+B,EAE/B,cAAc,EACd,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAKpC,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,IAAI,CAAa;IAEzB,OAAO,CAAC,WAAW,CAA2B;IAC9C,IAAW,KAAK,6BAEf;IAED,OAAO;IAQP,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,uBAAuB;IAKxF,MAAM,CAAC,qBAAqB,IAAI,uBAAuB;IAOvD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,uBAAuB;IAMhE,aAAa,CAAC,KAAK,SAAI,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAMzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM1C,iBAAiB,CAAC,IAAI,SAAI,EAAE,OAAO,SAAK,EAAE,MAAM,SAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMrF,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,SAAO,GAAG,OAAO,CAAC,+BAA+B,CAAC;IAkB1G,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpF,UAAU,IAAI,gBAAgB;IAIxB,aAAa,CAAC,IAAI,SAAI,EAAE,OAAO,SAAK,EAAE,MAAM,SAAO,GAAG,OAAO,CAAC,cAAc,CAAC;CAkDpF"}
|
package/dist/client.js
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GarminConnectClientImpl = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const auth_context_1 = require("./auth-context");
|
|
6
|
-
const authentication_service_1 = require("./authentication-service");
|
|
7
|
-
const errors_1 = require("./errors");
|
|
8
5
|
const http_client_1 = require("./http-client");
|
|
9
6
|
const client_1 = require("./sleep/client");
|
|
10
7
|
const types_1 = require("./types");
|
|
@@ -20,34 +17,8 @@ class GarminConnectClientImpl {
|
|
|
20
17
|
this.urls = urls;
|
|
21
18
|
this.sleepClient = new client_1.SleepClientImpl(this.httpClient, this.urls);
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
let httpClient;
|
|
26
|
-
if (context.mfaRequired) {
|
|
27
|
-
if (!mfaCode) {
|
|
28
|
-
throw new errors_1.MfaCodeError('MFA code is required when mfaRequired is true');
|
|
29
|
-
}
|
|
30
|
-
if (!context.mfaMethod) {
|
|
31
|
-
throw new errors_1.AuthenticationContextError('MFA method not found in auth context');
|
|
32
|
-
}
|
|
33
|
-
// Complete MFA authentication
|
|
34
|
-
httpClient = await authentication_service_1.AuthenticationService.completeAuthentication(urls, cookies, {
|
|
35
|
-
type: 'mfa',
|
|
36
|
-
mfaCode,
|
|
37
|
-
mfaMethod: context.mfaMethod,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// No MFA - use the ticket we already have
|
|
42
|
-
const ticket = context.getTicket();
|
|
43
|
-
if (!ticket) {
|
|
44
|
-
throw new errors_1.AuthenticationContextError('Ticket not found in auth context');
|
|
45
|
-
}
|
|
46
|
-
httpClient = await authentication_service_1.AuthenticationService.completeAuthentication(urls, cookies, {
|
|
47
|
-
type: 'ticket',
|
|
48
|
-
ticket,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
20
|
+
// Wraps a fully-authenticated HttpClient in a GarminConnectClient.
|
|
21
|
+
static fromHttpClient(httpClient, urls) {
|
|
51
22
|
return new GarminConnectClientImpl(httpClient, urls);
|
|
52
23
|
}
|
|
53
24
|
// Public constructor for testing - creates unauthenticated client
|
|
@@ -59,8 +30,7 @@ class GarminConnectClientImpl {
|
|
|
59
30
|
// Creates a client from persisted session data (no network calls)
|
|
60
31
|
static fromSession(session) {
|
|
61
32
|
const urls = new urls_1.GarminUrls();
|
|
62
|
-
const
|
|
63
|
-
const httpClient = new http_client_1.HttpClient(urls, authContext);
|
|
33
|
+
const httpClient = new http_client_1.HttpClient(urls, session);
|
|
64
34
|
return new GarminConnectClientImpl(httpClient, urls);
|
|
65
35
|
}
|
|
66
36
|
async getActivities(start = 0, limit = 20) {
|
|
@@ -91,6 +61,9 @@ class GarminConnectClientImpl {
|
|
|
91
61
|
courseSnapshot: snapshot,
|
|
92
62
|
};
|
|
93
63
|
}
|
|
64
|
+
onSessionUpdate(callback) {
|
|
65
|
+
this.httpClient.setSessionUpdateCallback(callback);
|
|
66
|
+
}
|
|
94
67
|
getSession() {
|
|
95
68
|
return this.httpClient.getSession();
|
|
96
69
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class CurlClient {
|
|
2
|
+
private readonly cookieFile;
|
|
3
|
+
private readonly client;
|
|
4
|
+
constructor(serializedCookies?: string);
|
|
5
|
+
get(url: string, options?: {
|
|
6
|
+
headers?: string[];
|
|
7
|
+
}): Promise<string>;
|
|
8
|
+
post(url: string, body: string, options?: {
|
|
9
|
+
headers?: string[];
|
|
10
|
+
allowClientError?: boolean;
|
|
11
|
+
}): Promise<string>;
|
|
12
|
+
getCookies(): string;
|
|
13
|
+
close(): void;
|
|
14
|
+
private request;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=curl-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl-client.d.ts","sourceRoot":"","sources":["../src/curl-client.ts"],"names":[],"mappings":"AAgBA,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,iBAAiB,CAAC,EAAE,MAAM;IAkBhC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvE,IAAI,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAO,GAC/D,OAAO,CAAC,MAAM,CAAC;IAMlB,UAAU,IAAI,MAAM;IAQpB,KAAK,IAAI,IAAI;YAUC,OAAO;CAiCtB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// HTTP transport client using node-libcurl-ja3 with Chrome impersonation.
|
|
3
|
+
//
|
|
4
|
+
// Garmin's sso.garmin.com endpoints are fronted by Cloudflare which blocks
|
|
5
|
+
// non-browser TLS fingerprints. Impersonating Chrome allows requests to pass CF.
|
|
6
|
+
// Cookies are held in a per-instance temp file (libcurl's native cookie engine),
|
|
7
|
+
// then serializable as an opaque string so sessions can be resumed across calls.
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CurlClient = void 0;
|
|
43
|
+
const crypto = __importStar(require("node:crypto"));
|
|
44
|
+
const fs = __importStar(require("node:fs"));
|
|
45
|
+
const os = __importStar(require("node:os"));
|
|
46
|
+
const path = __importStar(require("node:path"));
|
|
47
|
+
const node_libcurl_ja3_1 = require("node-libcurl-ja3");
|
|
48
|
+
const errors_1 = require("./errors");
|
|
49
|
+
class CurlClient {
|
|
50
|
+
constructor(serializedCookies) {
|
|
51
|
+
this.cookieFile = path.join(os.tmpdir(), `garmin-curl-${crypto.randomUUID()}.cookies`);
|
|
52
|
+
if (serializedCookies && serializedCookies.length > 0) {
|
|
53
|
+
fs.writeFileSync(this.cookieFile, serializedCookies, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
this.client = node_libcurl_ja3_1.curly.impersonate(node_libcurl_ja3_1.Browser.Chrome, {
|
|
56
|
+
cookieFile: this.cookieFile,
|
|
57
|
+
cookieJar: this.cookieFile,
|
|
58
|
+
followLocation: true,
|
|
59
|
+
sslVerifyPeer: true,
|
|
60
|
+
// Disable curly's built-in content-type body parsers so we always receive
|
|
61
|
+
// a raw Buffer. Garmin occasionally returns JSON error bodies (e.g. the
|
|
62
|
+
// Cloudflare 429) which would otherwise be auto-parsed into an object
|
|
63
|
+
// and break our HTML parser downstream.
|
|
64
|
+
curlyResponseBodyParser: false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async get(url, options = {}) {
|
|
68
|
+
return this.request('get', url, options);
|
|
69
|
+
}
|
|
70
|
+
async post(url, body, options = {}) {
|
|
71
|
+
return this.request('post', url, { ...options, body });
|
|
72
|
+
}
|
|
73
|
+
// Serializes the current libcurl cookie state to an opaque string that can
|
|
74
|
+
// seed another CurlClient instance. Used to carry sessions across call boundaries.
|
|
75
|
+
getCookies() {
|
|
76
|
+
if (!fs.existsSync(this.cookieFile)) {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
return fs.readFileSync(this.cookieFile, 'utf8');
|
|
80
|
+
}
|
|
81
|
+
// Removes the backing cookie file. Call when the session is complete.
|
|
82
|
+
close() {
|
|
83
|
+
try {
|
|
84
|
+
if (fs.existsSync(this.cookieFile)) {
|
|
85
|
+
fs.unlinkSync(this.cookieFile);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Best-effort cleanup; temp file will be reaped by the OS.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async request(method, url, options = {}) {
|
|
93
|
+
const curlOptions = {};
|
|
94
|
+
if (options.headers) {
|
|
95
|
+
curlOptions.httpHeader = options.headers;
|
|
96
|
+
}
|
|
97
|
+
if (options.body !== undefined) {
|
|
98
|
+
curlOptions.postFields = options.body;
|
|
99
|
+
}
|
|
100
|
+
const response = await this.client[method](url, curlOptions);
|
|
101
|
+
const body = Buffer.isBuffer(response.data) ? response.data.toString('utf8') : String(response.data);
|
|
102
|
+
// 429 (rate limit) and 5xx are never classifiable from an HTML body — always
|
|
103
|
+
// bubble them up as transport errors. Other 4xx responses are allowed
|
|
104
|
+
// through when the caller sets `allowClientError` so the HTML parser can
|
|
105
|
+
// classify bad credentials / locked accounts from the response page.
|
|
106
|
+
const isRateLimited = response.statusCode === 429;
|
|
107
|
+
const isServerError = response.statusCode >= 500;
|
|
108
|
+
const isClientError = response.statusCode >= 400 && response.statusCode < 500;
|
|
109
|
+
if (isRateLimited || isServerError || (isClientError && !options.allowClientError)) {
|
|
110
|
+
throw new errors_1.HttpError(`Curl request failed: ${method.toUpperCase()} ${url} (${response.statusCode})`, response.statusCode, undefined, body);
|
|
111
|
+
}
|
|
112
|
+
return body;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.CurlClient = CurlClient;
|
|
116
|
+
//# sourceMappingURL=curl-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl-client.js","sourceRoot":"","sources":["../src/curl-client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -98,10 +98,4 @@ export declare class HttpError extends GarminConnectError {
|
|
|
98
98
|
readonly responseData?: unknown;
|
|
99
99
|
constructor(message: string, statusCode?: number, statusText?: string, responseData?: unknown);
|
|
100
100
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Thrown when required authentication context data is missing
|
|
103
|
-
*/
|
|
104
|
-
export declare class AuthenticationContextError extends AuthenticationError {
|
|
105
|
-
constructor(message?: string);
|
|
106
|
-
}
|
|
107
101
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAU5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;gBAC7C,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,mBAAmB;gBAClD,OAAO,GAAE,MAAuC;CAK7D;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;gBACzC,OAAO,GAAE,MAA4C;CAKlE;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;gBAChD,OAAO,GAAE,MAA4D;CAKlF;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,kBAAkB;gBAClC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;gBAChC,OAAO,GAAE,MAAkE;CAKxF;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,GAAE,MAAmC;CAKzD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,GAAE,MAAkE;CAKxF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,kBAAkB;gBACpC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,GAAE,MAA0C;CAKhE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,OAAO,GAAE,MAAmC;CAKzD;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,kBAAkB;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,OAAO,GAAE,MAA0B;CAKhD;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,kBAAkB;IAC/C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,YAAY,CAAC,EAAE,OAAO,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;CAQ9F
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAU5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;gBAC7C,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,mBAAmB;gBAClD,OAAO,GAAE,MAAuC;CAK7D;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;gBACzC,OAAO,GAAE,MAA4C;CAKlE;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,mBAAmB;gBAChD,OAAO,GAAE,MAA4D;CAKlF;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,kBAAkB;gBAClC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;gBAChC,OAAO,GAAE,MAAkE;CAKxF;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,OAAO,GAAE,MAAmC;CAKzD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,GAAE,MAAkE;CAKxF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,kBAAkB;gBACpC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,GAAE,MAA0C;CAKhE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,OAAO,GAAE,MAAmC;CAKzD;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,kBAAkB;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,OAAO,GAAE,MAA0B;CAKhD;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,kBAAkB;IAC/C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,YAAY,CAAC,EAAE,OAAO,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;CAQ9F"}
|
package/dist/errors.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* types individually.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
10
|
+
exports.HttpError = exports.NotImplementedError = exports.ClientError = exports.OAuthTokenError = exports.OAuthIdentityError = exports.OAuthError = exports.MfaCodeInvalidError = exports.MfaCodeError = exports.MfaRequiredError = exports.MfaError = exports.NotAuthenticatedError = exports.CsrfTokenError = exports.InvalidCredentialsError = exports.AuthenticationError = exports.GarminConnectError = void 0;
|
|
11
11
|
/**
|
|
12
12
|
* Base exception class for all Garmin Connect client errors
|
|
13
13
|
*/
|
|
@@ -181,15 +181,4 @@ class HttpError extends GarminConnectError {
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
exports.HttpError = HttpError;
|
|
184
|
-
/**
|
|
185
|
-
* Thrown when required authentication context data is missing
|
|
186
|
-
*/
|
|
187
|
-
class AuthenticationContextError extends AuthenticationError {
|
|
188
|
-
constructor(message = 'Required authentication context data is missing') {
|
|
189
|
-
super(message);
|
|
190
|
-
this.name = 'AuthenticationContextError';
|
|
191
|
-
Object.setPrototypeOf(this, AuthenticationContextError.prototype);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
exports.AuthenticationContextError = AuthenticationContextError;
|
|
195
184
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/http-client.d.ts
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
2
|
-
import { AuthContext } from './auth-context';
|
|
3
2
|
import type { PersistedSession } from './types';
|
|
4
3
|
import { GarminUrls } from './urls';
|
|
5
4
|
export declare class HttpClient {
|
|
6
5
|
private client;
|
|
7
|
-
private
|
|
8
|
-
private oauth2Token?;
|
|
6
|
+
private auth?;
|
|
9
7
|
private urls;
|
|
10
8
|
private cookieJar;
|
|
11
9
|
private isRefreshing;
|
|
12
10
|
private refreshPromise?;
|
|
13
|
-
|
|
11
|
+
private onSessionUpdate?;
|
|
12
|
+
constructor(urls: GarminUrls, session?: PersistedSession);
|
|
13
|
+
setSessionUpdateCallback(callback: (session: PersistedSession) => void | Promise<void>): void;
|
|
14
14
|
getCookies(): string;
|
|
15
15
|
getSession(): PersistedSession;
|
|
16
|
-
setCookies(cookies: string): void;
|
|
17
|
-
private static createCookieJarFromJson;
|
|
18
16
|
private setupInterceptors;
|
|
19
|
-
private exchange;
|
|
20
17
|
private refreshToken;
|
|
21
18
|
get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
22
19
|
post<T>(url: string, data: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAOA,OAAc,EAAiB,kBAAkB,EAAE,aAAa,EAA8B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAOA,OAAc,EAAiB,kBAAkB,EAAE,aAAa,EAA8B,MAAM,OAAO,CAAC;AAM5G,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAOpC,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,IAAI,CAAa;IAEzB,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAC,CAAkB;IAEzC,OAAO,CAAC,eAAe,CAAC,CAAsD;gBAElE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAUxD,wBAAwB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAK7F,UAAU,IAAI,MAAM;IAMpB,UAAU,IAAI,gBAAgB;IAa9B,OAAO,CAAC,iBAAiB;YA2DX,YAAY;IA6BpB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ5D,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ5E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAU3E,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAarE,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;CAK3C"}
|
package/dist/http-client.js
CHANGED
|
@@ -15,60 +15,37 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
15
15
|
const axios_cookiejar_support_1 = require("axios-cookiejar-support");
|
|
16
16
|
const tough_cookie_1 = require("tough-cookie");
|
|
17
17
|
const errors_1 = require("./errors");
|
|
18
|
-
const
|
|
18
|
+
const oauth2_exchanger_1 = require("./oauth2-exchanger");
|
|
19
19
|
class HttpClient {
|
|
20
|
-
constructor(urls,
|
|
20
|
+
constructor(urls, session) {
|
|
21
21
|
// Flag to prevent concurrent token refresh attempts
|
|
22
22
|
this.isRefreshing = false;
|
|
23
23
|
this.urls = urls;
|
|
24
|
-
|
|
25
|
-
if (
|
|
26
|
-
this.
|
|
27
|
-
const tokens = authContext.getOAuthTokens();
|
|
28
|
-
if (tokens) {
|
|
29
|
-
this.oauth1Token = tokens.oauth1Token;
|
|
30
|
-
this.oauth2Token = tokens.oauth2Token;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else if (cookies) {
|
|
34
|
-
this.cookieJar = HttpClient.createCookieJarFromJson(cookies);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
this.cookieJar = new tough_cookie_1.CookieJar();
|
|
24
|
+
this.cookieJar = session?.cookies ? tough_cookie_1.CookieJar.fromJSON(session.cookies) : new tough_cookie_1.CookieJar();
|
|
25
|
+
if (session) {
|
|
26
|
+
this.auth = { oauth2Token: session.oauth2Token, diClientId: session.diClientId };
|
|
38
27
|
}
|
|
39
28
|
this.client = (0, axios_cookiejar_support_1.wrapper)(axios_1.default.create({ jar: this.cookieJar }));
|
|
40
29
|
this.setupInterceptors();
|
|
41
30
|
}
|
|
31
|
+
setSessionUpdateCallback(callback) {
|
|
32
|
+
this.onSessionUpdate = callback;
|
|
33
|
+
}
|
|
42
34
|
// Gets serialized cookie jar data as JSON string for storage/transmission
|
|
43
|
-
// Returns a JSON string that can be restored with setCookies
|
|
44
35
|
getCookies() {
|
|
45
36
|
return JSON.stringify(this.cookieJar.toJSON());
|
|
46
37
|
}
|
|
47
38
|
// Gets the full session state for persistence (cookies + OAuth tokens)
|
|
48
39
|
// Throws NotAuthenticatedError if the client is not fully authenticated
|
|
49
40
|
getSession() {
|
|
50
|
-
if (!this.
|
|
41
|
+
if (!this.auth) {
|
|
51
42
|
throw new errors_1.NotAuthenticatedError('Session cannot be persisted: missing OAuth tokens (client not fully authenticated)');
|
|
52
43
|
}
|
|
53
44
|
return {
|
|
54
45
|
cookies: this.getCookies(),
|
|
55
|
-
|
|
56
|
-
oauth2Token: this.oauth2Token,
|
|
46
|
+
...this.auth,
|
|
57
47
|
};
|
|
58
48
|
}
|
|
59
|
-
// Sets cookies from a JSON string (used during authentication flow)
|
|
60
|
-
// This allows restoring cookies from a previous session
|
|
61
|
-
setCookies(cookies) {
|
|
62
|
-
this.cookieJar = HttpClient.createCookieJarFromJson(cookies);
|
|
63
|
-
// Recreate the axios client with the new cookie jar
|
|
64
|
-
this.client = (0, axios_cookiejar_support_1.wrapper)(axios_1.default.create({ jar: this.cookieJar }));
|
|
65
|
-
// Re-setup interceptors on the new client instance
|
|
66
|
-
this.setupInterceptors();
|
|
67
|
-
}
|
|
68
|
-
// Helper to create a CookieJar from JSON string
|
|
69
|
-
static createCookieJarFromJson(json) {
|
|
70
|
-
return tough_cookie_1.CookieJar.fromJSON(json);
|
|
71
|
-
}
|
|
72
49
|
// Sets up request and response interceptors
|
|
73
50
|
setupInterceptors() {
|
|
74
51
|
// Response interceptor: automatically refreshes expired tokens
|
|
@@ -82,7 +59,7 @@ class HttpClient {
|
|
|
82
59
|
const statusText = error.response?.statusText;
|
|
83
60
|
const data = error.response?.data;
|
|
84
61
|
// Only attempt token refresh if we have tokens (authenticated API request)
|
|
85
|
-
if (status === 401 && originalRequest && !originalRequest._retry && this.
|
|
62
|
+
if (status === 401 && originalRequest && !originalRequest._retry && this.auth) {
|
|
86
63
|
originalRequest._retry = true;
|
|
87
64
|
const newToken = await this.refreshToken();
|
|
88
65
|
originalRequest.headers.Authorization = `Bearer ${newToken}`;
|
|
@@ -107,60 +84,30 @@ class HttpClient {
|
|
|
107
84
|
// Request interceptor: automatically adds Bearer token to all requests
|
|
108
85
|
// Ensures all API calls are authenticated without manual token management
|
|
109
86
|
this.client.interceptors.request.use(async (config) => {
|
|
110
|
-
if (this.
|
|
111
|
-
config.headers.Authorization = `Bearer ${this.oauth2Token.access_token}`;
|
|
87
|
+
if (this.auth) {
|
|
88
|
+
config.headers.Authorization = `Bearer ${this.auth.oauth2Token.access_token}`;
|
|
112
89
|
}
|
|
113
90
|
return config;
|
|
114
91
|
});
|
|
115
92
|
}
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
// This is used internally for token refresh when tokens expire.
|
|
119
|
-
// Returns OAuth 2.0 bearer token with expiration metadata
|
|
120
|
-
async exchange(oauth1Token) {
|
|
121
|
-
const appOauthIdentity = (0, oauth_utils_1.getAppOauthIdentity)();
|
|
122
|
-
const oauth = (0, oauth_utils_1.createOauthClient)(appOauthIdentity);
|
|
123
|
-
const token = {
|
|
124
|
-
key: oauth1Token.oauth_token,
|
|
125
|
-
secret: oauth1Token.oauth_token_secret,
|
|
126
|
-
};
|
|
127
|
-
const baseUrl = this.urls.OAUTH_EXCHANGE_BASE();
|
|
128
|
-
const requestData = {
|
|
129
|
-
url: baseUrl,
|
|
130
|
-
method: 'POST',
|
|
131
|
-
};
|
|
132
|
-
const step5AuthData = oauth.authorize(requestData, token);
|
|
133
|
-
// Convert Authorization object to plain object for URL building
|
|
134
|
-
const oauthParameters = { ...step5AuthData };
|
|
135
|
-
const url = this.urls.OAUTH_EXCHANGE(oauthParameters);
|
|
136
|
-
const response = await this.post(url, undefined, {
|
|
137
|
-
headers: {
|
|
138
|
-
'User-Agent': oauth_utils_1.USER_AGENT_CONNECTMOBILE,
|
|
139
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
return (0, oauth_utils_1.setOauth2TokenExpiresAt)(response);
|
|
143
|
-
}
|
|
144
|
-
// Refreshes the OAuth 2.0 token using the existing OAuth 1.0 token
|
|
93
|
+
// Refreshes the OAuth2 token via the device-identity endpoint using the stored client ID.
|
|
145
94
|
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
// refresh attempts - if a refresh is already in progress, all requests
|
|
149
|
-
// wait for the same promise to avoid duplicate refresh API calls.
|
|
150
|
-
// Throws OAuthTokenError if no OAuth 1.0 token is available for refresh
|
|
95
|
+
// Uses promise sharing to prevent concurrent refresh attempts — if a refresh
|
|
96
|
+
// is already in progress, all waiters receive the same promise.
|
|
151
97
|
async refreshToken() {
|
|
152
|
-
if (!this.
|
|
153
|
-
throw new errors_1.OAuthTokenError('No
|
|
98
|
+
if (!this.auth) {
|
|
99
|
+
throw new errors_1.OAuthTokenError('No OAuth2 token or device-identity client ID available for refresh');
|
|
154
100
|
}
|
|
155
101
|
if (this.isRefreshing && this.refreshPromise) {
|
|
156
102
|
return this.refreshPromise;
|
|
157
103
|
}
|
|
158
|
-
const
|
|
104
|
+
const { oauth2Token, diClientId } = this.auth;
|
|
159
105
|
this.isRefreshing = true;
|
|
160
106
|
this.refreshPromise = (async () => {
|
|
161
107
|
try {
|
|
162
|
-
const newToken = await this.
|
|
163
|
-
this.
|
|
108
|
+
const newToken = await (0, oauth2_exchanger_1.refreshDiToken)(this.urls, oauth2Token.refresh_token, diClientId);
|
|
109
|
+
this.auth = { oauth2Token: newToken, diClientId };
|
|
110
|
+
await this.onSessionUpdate?.(this.getSession());
|
|
164
111
|
return newToken.access_token;
|
|
165
112
|
}
|
|
166
113
|
finally {
|
package/dist/http-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":";;;;;;AAAA,+CAA+C;AAC/C,EAAE;AACF,0DAA0D;AAC1D,8CAA8C;AAC9C,2CAA2C;AAC3C,gEAAgE;AAChE,EAAE;AACF,kDAA4G;AAC5G,qEAAkD;AAClD,+CAAyC;
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
|