@nativesquare/soma 0.7.2 → 0.8.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/dist/client/index.d.ts +83 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +131 -0
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +159 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/garmin.d.ts +190 -6
- package/dist/component/garmin.d.ts.map +1 -1
- package/dist/component/garmin.js +829 -63
- package/dist/component/garmin.js.map +1 -1
- package/dist/component/private.d.ts +18 -0
- package/dist/component/private.d.ts.map +1 -1
- package/dist/component/private.js +18 -0
- package/dist/component/private.js.map +1 -1
- package/dist/component/public.d.ts +88 -42
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +12 -2
- package/dist/component/public.js.map +1 -1
- package/dist/component/schema.d.ts +87 -32
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +2 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/component/validators/connection.d.ts +1 -0
- package/dist/component/validators/connection.d.ts.map +1 -1
- package/dist/component/validators/connection.js +2 -0
- package/dist/component/validators/connection.js.map +1 -1
- package/dist/component/validators/daily.d.ts +40 -5
- package/dist/component/validators/daily.d.ts.map +1 -1
- package/dist/component/validators/daily.js +10 -1
- package/dist/component/validators/daily.js.map +1 -1
- package/dist/component/validators/plannedWorkout.d.ts +5 -1
- package/dist/component/validators/plannedWorkout.d.ts.map +1 -1
- package/dist/component/validators/plannedWorkout.js +4 -0
- package/dist/component/validators/plannedWorkout.js.map +1 -1
- package/dist/component/validators/sleep.d.ts +8 -8
- package/dist/garmin/activity.d.ts +7 -16
- package/dist/garmin/activity.d.ts.map +1 -1
- package/dist/garmin/activity.js +17 -23
- package/dist/garmin/activity.js.map +1 -1
- package/dist/garmin/bloodPressure.d.ts +28 -0
- package/dist/garmin/bloodPressure.d.ts.map +1 -0
- package/dist/garmin/bloodPressure.js +34 -0
- package/dist/garmin/bloodPressure.js.map +1 -0
- package/dist/garmin/body.js +1 -1
- package/dist/garmin/body.js.map +1 -1
- package/dist/garmin/client.d.ts +117 -17
- package/dist/garmin/client.d.ts.map +1 -1
- package/dist/garmin/client.js +337 -43
- package/dist/garmin/client.js.map +1 -1
- package/dist/garmin/daily.d.ts.map +1 -1
- package/dist/garmin/daily.js +3 -3
- package/dist/garmin/daily.js.map +1 -1
- package/dist/garmin/hrv.d.ts +30 -0
- package/dist/garmin/hrv.d.ts.map +1 -0
- package/dist/garmin/hrv.js +45 -0
- package/dist/garmin/hrv.js.map +1 -0
- package/dist/garmin/index.d.ts +16 -2
- package/dist/garmin/index.d.ts.map +1 -1
- package/dist/garmin/index.js +8 -1
- package/dist/garmin/index.js.map +1 -1
- package/dist/garmin/maps/activity-type.d.ts +1 -2
- package/dist/garmin/maps/activity-type.d.ts.map +1 -1
- package/dist/garmin/maps/activity-type.js +1 -0
- package/dist/garmin/maps/activity-type.js.map +1 -1
- package/dist/garmin/menstruation.d.ts +6 -4
- package/dist/garmin/menstruation.d.ts.map +1 -1
- package/dist/garmin/menstruation.js +12 -8
- package/dist/garmin/menstruation.js.map +1 -1
- package/dist/garmin/pulseOx.d.ts +24 -0
- package/dist/garmin/pulseOx.d.ts.map +1 -0
- package/dist/garmin/pulseOx.js +33 -0
- package/dist/garmin/pulseOx.js.map +1 -0
- package/dist/garmin/respiration.d.ts +29 -0
- package/dist/garmin/respiration.d.ts.map +1 -0
- package/dist/garmin/respiration.js +42 -0
- package/dist/garmin/respiration.js.map +1 -0
- package/dist/garmin/skinTemp.d.ts +27 -0
- package/dist/garmin/skinTemp.d.ts.map +1 -0
- package/dist/garmin/skinTemp.js +35 -0
- package/dist/garmin/skinTemp.js.map +1 -0
- package/dist/garmin/sleep.d.ts +4 -4
- package/dist/garmin/sleep.d.ts.map +1 -1
- package/dist/garmin/sleep.js +15 -9
- package/dist/garmin/sleep.js.map +1 -1
- package/dist/garmin/stressDetails.d.ts +30 -0
- package/dist/garmin/stressDetails.d.ts.map +1 -0
- package/dist/garmin/stressDetails.js +49 -0
- package/dist/garmin/stressDetails.js.map +1 -0
- package/dist/garmin/sync.d.ts +14 -0
- package/dist/garmin/sync.d.ts.map +1 -1
- package/dist/garmin/sync.js +287 -5
- package/dist/garmin/sync.js.map +1 -1
- package/dist/garmin/types.d.ts +77 -186
- package/dist/garmin/types.d.ts.map +1 -1
- package/dist/garmin/types.js +4 -2
- package/dist/garmin/types.js.map +1 -1
- package/dist/garmin/userMetrics.d.ts +23 -0
- package/dist/garmin/userMetrics.d.ts.map +1 -0
- package/dist/garmin/userMetrics.js +41 -0
- package/dist/garmin/userMetrics.js.map +1 -0
- package/dist/validators.d.ts +107 -28
- package/dist/validators.d.ts.map +1 -1
- package/package.json +133 -124
- package/src/client/index.ts +199 -0
- package/src/component/_generated/component.ts +161 -2
- package/src/component/garmin.ts +923 -73
- package/src/component/private.ts +21 -0
- package/src/component/public.ts +11 -2
- package/src/component/schema.ts +2 -1
- package/src/component/validators/connection.ts +2 -0
- package/src/component/validators/daily.ts +15 -0
- package/src/component/validators/plannedWorkout.ts +4 -0
- package/src/garmin/activity.test.ts +13 -21
- package/src/garmin/activity.ts +38 -45
- package/src/garmin/bloodPressure.ts +41 -0
- package/src/garmin/body.ts +1 -1
- package/src/garmin/client.ts +550 -71
- package/src/garmin/daily.ts +8 -4
- package/src/garmin/hrv.ts +57 -0
- package/src/garmin/index.ts +77 -7
- package/src/garmin/maps/activity-type.ts +2 -2
- package/src/garmin/menstruation.ts +14 -12
- package/src/garmin/pulseOx.ts +45 -0
- package/src/garmin/respiration.ts +55 -0
- package/src/garmin/skinTemp.ts +42 -0
- package/src/garmin/sleep.test.ts +5 -6
- package/src/garmin/sleep.ts +22 -16
- package/src/garmin/spec/wellness-api.json +1 -0
- package/src/garmin/stressDetails.ts +71 -0
- package/src/garmin/sync.ts +348 -5
- package/src/garmin/types.ts +88 -300
- package/src/garmin/userMetrics.ts +50 -0
- package/src/garmin/wellness-api.d.ts +5637 -0
package/dist/garmin/client.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
// ─── Garmin Health API Client ────────────────────────────────────────────────
|
|
2
|
-
//
|
|
3
|
-
//
|
|
2
|
+
// Uses openapi-fetch for type-safe Wellness API calls and manual fetch for
|
|
3
|
+
// Training API endpoints that are not covered by the OpenAPI spec.
|
|
4
|
+
import createClient from "openapi-fetch";
|
|
4
5
|
const DEFAULT_BASE_URL = "https://apis.garmin.com";
|
|
5
6
|
/**
|
|
6
|
-
* A
|
|
7
|
+
* A client for the Garmin Health API.
|
|
8
|
+
*
|
|
9
|
+
* Wellness API endpoints use openapi-fetch for type safety. Training API
|
|
10
|
+
* endpoints use manual fetch since they are not part of the Wellness API spec.
|
|
7
11
|
*
|
|
8
12
|
* All requests are authenticated with a Bearer token. Time-range parameters
|
|
9
13
|
* use Unix epoch seconds for `uploadStartTimeInSeconds` and
|
|
@@ -24,36 +28,130 @@ const DEFAULT_BASE_URL = "https://apis.garmin.com";
|
|
|
24
28
|
export class GarminClient {
|
|
25
29
|
accessToken;
|
|
26
30
|
baseUrl;
|
|
31
|
+
wellness;
|
|
27
32
|
constructor(opts) {
|
|
28
33
|
this.accessToken = opts.accessToken;
|
|
29
34
|
this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
35
|
+
const authMiddleware = {
|
|
36
|
+
async onRequest({ request }) {
|
|
37
|
+
request.headers.set("Authorization", `Bearer ${opts.accessToken}`);
|
|
38
|
+
request.headers.set("Accept", "application/json");
|
|
39
|
+
return request;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
this.wellness = createClient({
|
|
43
|
+
baseUrl: `${this.baseUrl}/wellness-api`,
|
|
44
|
+
});
|
|
45
|
+
this.wellness.use(authMiddleware);
|
|
46
|
+
}
|
|
47
|
+
// ─── User Identity ──────────────────────────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the Garmin user ID for the authenticated user.
|
|
50
|
+
*
|
|
51
|
+
* Garmin API: `GET /wellness-api/rest/user/id`
|
|
52
|
+
*/
|
|
53
|
+
async getUserId() {
|
|
54
|
+
const { data, error, response } = await this.wellness.GET("/rest/user/id");
|
|
55
|
+
if (error) {
|
|
56
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
57
|
+
}
|
|
58
|
+
return data?.userId ?? null;
|
|
59
|
+
}
|
|
60
|
+
// ─── User Permissions ─────────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Check which permissions the user has granted.
|
|
63
|
+
*
|
|
64
|
+
* Garmin API: `GET /wellness-api/rest/user/permissions`
|
|
65
|
+
*/
|
|
66
|
+
async getUserPermissions() {
|
|
67
|
+
const { data, error, response } = await this.wellness.GET("/rest/user/permissions");
|
|
68
|
+
if (error) {
|
|
69
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
70
|
+
}
|
|
71
|
+
return data?.permissions ?? [];
|
|
30
72
|
}
|
|
31
|
-
// ─── Daily Summaries
|
|
73
|
+
// ─── Daily Summaries ──────────────────────────────────────────────────
|
|
32
74
|
/**
|
|
33
75
|
* Get daily wellness summaries.
|
|
34
76
|
*
|
|
35
77
|
* Garmin API: `GET /wellness-api/rest/dailies`
|
|
36
78
|
*/
|
|
37
79
|
async getDailies(params) {
|
|
38
|
-
|
|
80
|
+
const { data, error, response } = await this.wellness.GET("/rest/dailies", {
|
|
81
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
82
|
+
});
|
|
83
|
+
if (error) {
|
|
84
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
85
|
+
}
|
|
86
|
+
console.log("[getDailies] raw response:", JSON.stringify(data?.[0], null, 2));
|
|
87
|
+
return (data ?? []);
|
|
39
88
|
}
|
|
40
|
-
// ─── Activities
|
|
89
|
+
// ─── Activities ───────────────────────────────────────────────────────
|
|
41
90
|
/**
|
|
42
91
|
* Get activity summaries.
|
|
43
92
|
*
|
|
44
93
|
* Garmin API: `GET /wellness-api/rest/activities`
|
|
45
94
|
*/
|
|
46
95
|
async getActivities(params) {
|
|
47
|
-
|
|
96
|
+
const { data, error, response } = await this.wellness.GET("/rest/activities", {
|
|
97
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
98
|
+
});
|
|
99
|
+
if (error) {
|
|
100
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
101
|
+
}
|
|
102
|
+
return (data ?? []);
|
|
103
|
+
}
|
|
104
|
+
// ─── Activity Details ─────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Get detailed activity summaries including GPS, heart rate, and sensor data.
|
|
107
|
+
*
|
|
108
|
+
* Garmin API: `GET /wellness-api/rest/activityDetails`
|
|
109
|
+
*/
|
|
110
|
+
async getActivityDetails(params) {
|
|
111
|
+
const { data, error, response } = await this.wellness.GET("/rest/activityDetails", {
|
|
112
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
113
|
+
});
|
|
114
|
+
if (error) {
|
|
115
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
116
|
+
}
|
|
117
|
+
return (data ?? []);
|
|
118
|
+
}
|
|
119
|
+
// ─── Activity File ────────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Download a raw activity file (FIT, TCX, or GPX).
|
|
122
|
+
*
|
|
123
|
+
* Garmin API: `GET /wellness-api/rest/activityFile`
|
|
124
|
+
*
|
|
125
|
+
* @returns The raw file as an ArrayBuffer.
|
|
126
|
+
*/
|
|
127
|
+
async getActivityFile(id) {
|
|
128
|
+
const url = `${this.baseUrl}/wellness-api/rest/activityFile?id=${encodeURIComponent(id)}`;
|
|
129
|
+
const response = await fetch(url, {
|
|
130
|
+
method: "GET",
|
|
131
|
+
headers: {
|
|
132
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
if (!response.ok) {
|
|
136
|
+
const body = await response.text().catch(() => "");
|
|
137
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
|
|
138
|
+
}
|
|
139
|
+
return response.arrayBuffer();
|
|
48
140
|
}
|
|
49
|
-
// ─── Sleep
|
|
141
|
+
// ─── Sleep ────────────────────────────────────────────────────────────
|
|
50
142
|
/**
|
|
51
143
|
* Get sleep summaries.
|
|
52
144
|
*
|
|
53
145
|
* Garmin API: `GET /wellness-api/rest/sleeps`
|
|
54
146
|
*/
|
|
55
147
|
async getSleeps(params) {
|
|
56
|
-
|
|
148
|
+
const { data, error, response } = await this.wellness.GET("/rest/sleeps", {
|
|
149
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
150
|
+
});
|
|
151
|
+
if (error) {
|
|
152
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
153
|
+
}
|
|
154
|
+
return (data ?? []);
|
|
57
155
|
}
|
|
58
156
|
// ─── Body Composition ─────────────────────────────────────────────────
|
|
59
157
|
/**
|
|
@@ -62,16 +160,208 @@ export class GarminClient {
|
|
|
62
160
|
* Garmin API: `GET /wellness-api/rest/bodyComps`
|
|
63
161
|
*/
|
|
64
162
|
async getBodyCompositions(params) {
|
|
65
|
-
|
|
163
|
+
const { data, error, response } = await this.wellness.GET("/rest/bodyComps", {
|
|
164
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
165
|
+
});
|
|
166
|
+
if (error) {
|
|
167
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
168
|
+
}
|
|
169
|
+
return (data ?? []);
|
|
66
170
|
}
|
|
67
171
|
// ─── Menstrual Cycle ──────────────────────────────────────────────────
|
|
68
172
|
/**
|
|
69
|
-
* Get menstrual cycle data.
|
|
173
|
+
* Get menstrual cycle tracking data.
|
|
70
174
|
*
|
|
71
|
-
* Garmin API: `GET /wellness-api/rest/
|
|
175
|
+
* Garmin API: `GET /wellness-api/rest/mct`
|
|
72
176
|
*/
|
|
73
177
|
async getMenstrualCycleData(params) {
|
|
74
|
-
|
|
178
|
+
const { data, error, response } = await this.wellness.GET("/rest/mct", {
|
|
179
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
180
|
+
});
|
|
181
|
+
if (error) {
|
|
182
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
183
|
+
}
|
|
184
|
+
return (data ?? []);
|
|
185
|
+
}
|
|
186
|
+
// ─── User Metrics ─────────────────────────────────────────────────────
|
|
187
|
+
/**
|
|
188
|
+
* Get user metrics (VO2 max, fitness age, etc.).
|
|
189
|
+
*
|
|
190
|
+
* Garmin API: `GET /wellness-api/rest/userMetrics`
|
|
191
|
+
*/
|
|
192
|
+
async getUserMetrics(params) {
|
|
193
|
+
const { data, error, response } = await this.wellness.GET("/rest/userMetrics", {
|
|
194
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
195
|
+
});
|
|
196
|
+
if (error) {
|
|
197
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
198
|
+
}
|
|
199
|
+
return (data ?? []);
|
|
200
|
+
}
|
|
201
|
+
// ─── Stress Details ───────────────────────────────────────────────────
|
|
202
|
+
/**
|
|
203
|
+
* Get stress detail summaries.
|
|
204
|
+
*
|
|
205
|
+
* Garmin API: `GET /wellness-api/rest/stressDetails`
|
|
206
|
+
*/
|
|
207
|
+
async getStressDetails(params) {
|
|
208
|
+
const { data, error, response } = await this.wellness.GET("/rest/stressDetails", {
|
|
209
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
210
|
+
});
|
|
211
|
+
if (error) {
|
|
212
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
213
|
+
}
|
|
214
|
+
return (data ?? []);
|
|
215
|
+
}
|
|
216
|
+
// ─── Skin Temperature ─────────────────────────────────────────────────
|
|
217
|
+
/**
|
|
218
|
+
* Get skin temperature summaries.
|
|
219
|
+
*
|
|
220
|
+
* Garmin API: `GET /wellness-api/rest/skinTemp`
|
|
221
|
+
*/
|
|
222
|
+
async getSkinTemperature(params) {
|
|
223
|
+
const { data, error, response } = await this.wellness.GET("/rest/skinTemp", {
|
|
224
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
225
|
+
});
|
|
226
|
+
if (error) {
|
|
227
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
228
|
+
}
|
|
229
|
+
return (data ?? []);
|
|
230
|
+
}
|
|
231
|
+
// ─── Respiration ──────────────────────────────────────────────────────
|
|
232
|
+
/**
|
|
233
|
+
* Get respiration summaries.
|
|
234
|
+
*
|
|
235
|
+
* Garmin API: `GET /wellness-api/rest/respiration`
|
|
236
|
+
*/
|
|
237
|
+
async getRespiration(params) {
|
|
238
|
+
const { data, error, response } = await this.wellness.GET("/rest/respiration", {
|
|
239
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
240
|
+
});
|
|
241
|
+
if (error) {
|
|
242
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
243
|
+
}
|
|
244
|
+
return (data ?? []);
|
|
245
|
+
}
|
|
246
|
+
// ─── Pulse Ox ─────────────────────────────────────────────────────────
|
|
247
|
+
/**
|
|
248
|
+
* Get pulse oximetry (SpO2) summaries.
|
|
249
|
+
*
|
|
250
|
+
* Garmin API: `GET /wellness-api/rest/pulseOx`
|
|
251
|
+
*/
|
|
252
|
+
async getPulseOx(params) {
|
|
253
|
+
const { data, error, response } = await this.wellness.GET("/rest/pulseOx", {
|
|
254
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
255
|
+
});
|
|
256
|
+
if (error) {
|
|
257
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
258
|
+
}
|
|
259
|
+
return (data ?? []);
|
|
260
|
+
}
|
|
261
|
+
// ─── Move IQ ──────────────────────────────────────────────────────────
|
|
262
|
+
/**
|
|
263
|
+
* Get Move IQ auto-detected activity events.
|
|
264
|
+
*
|
|
265
|
+
* Garmin API: `GET /wellness-api/rest/moveiq`
|
|
266
|
+
*/
|
|
267
|
+
async getMoveIQ(params) {
|
|
268
|
+
const { data, error, response } = await this.wellness.GET("/rest/moveiq", {
|
|
269
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
270
|
+
});
|
|
271
|
+
if (error) {
|
|
272
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
273
|
+
}
|
|
274
|
+
return (data ?? []);
|
|
275
|
+
}
|
|
276
|
+
// ─── HRV ──────────────────────────────────────────────────────────────
|
|
277
|
+
/**
|
|
278
|
+
* Get heart rate variability (HRV) summaries.
|
|
279
|
+
*
|
|
280
|
+
* Garmin API: `GET /wellness-api/rest/hrv`
|
|
281
|
+
*/
|
|
282
|
+
async getHRV(params) {
|
|
283
|
+
const { data, error, response } = await this.wellness.GET("/rest/hrv", {
|
|
284
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
285
|
+
});
|
|
286
|
+
if (error) {
|
|
287
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
288
|
+
}
|
|
289
|
+
return (data ?? []);
|
|
290
|
+
}
|
|
291
|
+
// ─── Health Snapshot ──────────────────────────────────────────────────
|
|
292
|
+
/**
|
|
293
|
+
* Get health snapshot summaries.
|
|
294
|
+
*
|
|
295
|
+
* Garmin API: `GET /wellness-api/rest/healthSnapshot`
|
|
296
|
+
*/
|
|
297
|
+
async getHealthSnapshot(params) {
|
|
298
|
+
const { data, error, response } = await this.wellness.GET("/rest/healthSnapshot", {
|
|
299
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
300
|
+
});
|
|
301
|
+
if (error) {
|
|
302
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
303
|
+
}
|
|
304
|
+
return (data ?? []);
|
|
305
|
+
}
|
|
306
|
+
// ─── Epochs ───────────────────────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* Get epoch (15-minute interval) summaries.
|
|
309
|
+
*
|
|
310
|
+
* Garmin API: `GET /wellness-api/rest/epochs`
|
|
311
|
+
*/
|
|
312
|
+
async getEpochs(params) {
|
|
313
|
+
const { data, error, response } = await this.wellness.GET("/rest/epochs", {
|
|
314
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
315
|
+
});
|
|
316
|
+
if (error) {
|
|
317
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
318
|
+
}
|
|
319
|
+
return (data ?? []);
|
|
320
|
+
}
|
|
321
|
+
// ─── Blood Pressure ───────────────────────────────────────────────────
|
|
322
|
+
/**
|
|
323
|
+
* Get blood pressure summaries.
|
|
324
|
+
*
|
|
325
|
+
* Garmin API: `GET /wellness-api/rest/bloodPressures`
|
|
326
|
+
*/
|
|
327
|
+
async getBloodPressures(params) {
|
|
328
|
+
const { data, error, response } = await this.wellness.GET("/rest/bloodPressures", {
|
|
329
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
330
|
+
});
|
|
331
|
+
if (error) {
|
|
332
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
333
|
+
}
|
|
334
|
+
return (data ?? []);
|
|
335
|
+
}
|
|
336
|
+
// ─── Manually Updated Activities ──────────────────────────────────────
|
|
337
|
+
/**
|
|
338
|
+
* Get manually created or edited activities.
|
|
339
|
+
*
|
|
340
|
+
* Garmin API: `GET /wellness-api/rest/manuallyUpdatedActivities`
|
|
341
|
+
*/
|
|
342
|
+
async getManuallyUpdatedActivities(params) {
|
|
343
|
+
const { data, error, response } = await this.wellness.GET("/rest/manuallyUpdatedActivities", {
|
|
344
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
345
|
+
});
|
|
346
|
+
if (error) {
|
|
347
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
348
|
+
}
|
|
349
|
+
return (data ?? []);
|
|
350
|
+
}
|
|
351
|
+
// ─── Solar Intensity ──────────────────────────────────────────────────
|
|
352
|
+
/**
|
|
353
|
+
* Get solar intensity summaries.
|
|
354
|
+
*
|
|
355
|
+
* Garmin API: `GET /wellness-api/rest/solarIntensity`
|
|
356
|
+
*/
|
|
357
|
+
async getSolarIntensity(params) {
|
|
358
|
+
const { data, error, response } = await this.wellness.GET("/rest/solarIntensity", {
|
|
359
|
+
params: { query: timeRangeQuery(params, this.accessToken) },
|
|
360
|
+
});
|
|
361
|
+
if (error) {
|
|
362
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
363
|
+
}
|
|
364
|
+
return (data ?? []);
|
|
75
365
|
}
|
|
76
366
|
// ─── Backfill ─────────────────────────────────────────────────────────
|
|
77
367
|
/**
|
|
@@ -80,22 +370,45 @@ export class GarminClient {
|
|
|
80
370
|
* Garmin processes backfill requests asynchronously and delivers data
|
|
81
371
|
* via the configured webhook endpoint. Maximum range: 90 days per request.
|
|
82
372
|
*
|
|
373
|
+
* Uses manual fetch because the spec defines individual backfill paths
|
|
374
|
+
* (e.g. `/rest/backfill/dailies`) but this method accepts a dynamic
|
|
375
|
+
* summaryType string.
|
|
376
|
+
*
|
|
83
377
|
* @param summaryType - The data type to backfill (e.g., "dailies", "activities", "sleeps", "bodyComps")
|
|
84
378
|
* @param params - Time range for the backfill
|
|
85
379
|
*/
|
|
86
380
|
async requestBackfill(summaryType, params) {
|
|
87
|
-
const query = timeRangeQuery(params);
|
|
88
|
-
|
|
381
|
+
const query = timeRangeQuery(params, this.accessToken);
|
|
382
|
+
const qs = new URLSearchParams(query).toString();
|
|
383
|
+
const url = `${this.baseUrl}/wellness-api/rest/backfill/${summaryType}?${qs}`;
|
|
384
|
+
const response = await fetch(url, {
|
|
385
|
+
method: "GET",
|
|
386
|
+
headers: {
|
|
387
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
388
|
+
Accept: "application/json",
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
if (!response.ok) {
|
|
392
|
+
const body = await response.text().catch(() => "");
|
|
393
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
|
|
394
|
+
}
|
|
89
395
|
}
|
|
90
|
-
// ───
|
|
396
|
+
// ─── User Deregistration ──────────────────────────────────────────────
|
|
91
397
|
/**
|
|
92
|
-
*
|
|
398
|
+
* Delete the user's registration with Garmin.
|
|
93
399
|
*
|
|
94
|
-
*
|
|
400
|
+
* Must be called when the user disconnects or deletes their account
|
|
401
|
+
* to comply with Garmin's API requirements.
|
|
95
402
|
*/
|
|
96
|
-
async
|
|
97
|
-
|
|
403
|
+
async deleteUserRegistration() {
|
|
404
|
+
const { error, response } = await this.wellness.DELETE("/rest/user/registration");
|
|
405
|
+
if (error) {
|
|
406
|
+
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, JSON.stringify(error));
|
|
407
|
+
}
|
|
98
408
|
}
|
|
409
|
+
// ─── Training API V2 ─────────────────────────────────────────────────
|
|
410
|
+
// These endpoints are NOT part of the Wellness API spec, so they use
|
|
411
|
+
// manual fetch.
|
|
99
412
|
/**
|
|
100
413
|
* Create a workout in Garmin Connect.
|
|
101
414
|
*
|
|
@@ -159,27 +472,7 @@ export class GarminClient {
|
|
|
159
472
|
async deleteSchedule(scheduleId) {
|
|
160
473
|
await this.del(`/training-api/schedule/${scheduleId}`);
|
|
161
474
|
}
|
|
162
|
-
// ───
|
|
163
|
-
/**
|
|
164
|
-
* Delete the user's registration with Garmin.
|
|
165
|
-
*
|
|
166
|
-
* Must be called when the user disconnects or deletes their account
|
|
167
|
-
* to comply with Garmin's API requirements.
|
|
168
|
-
*/
|
|
169
|
-
async deleteUserRegistration() {
|
|
170
|
-
const url = `${this.baseUrl}/wellness-api/rest/user/registration`;
|
|
171
|
-
const response = await fetch(url, {
|
|
172
|
-
method: "DELETE",
|
|
173
|
-
headers: {
|
|
174
|
-
Authorization: `Bearer ${this.accessToken}`,
|
|
175
|
-
},
|
|
176
|
-
});
|
|
177
|
-
if (!response.ok) {
|
|
178
|
-
const body = await response.text().catch(() => "");
|
|
179
|
-
throw new GarminApiError(`Garmin API error: ${response.status} ${response.statusText}`, response.status, body);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// ─── Internal ─────────────────────────────────────────────────────────
|
|
475
|
+
// ─── Internal (Training API helpers) ──────────────────────────────────
|
|
183
476
|
async get(path, queryParams) {
|
|
184
477
|
const fullUrl = `${this.baseUrl}${path}`;
|
|
185
478
|
const qs = queryParams
|
|
@@ -252,10 +545,11 @@ export class GarminClient {
|
|
|
252
545
|
}
|
|
253
546
|
}
|
|
254
547
|
}
|
|
255
|
-
function timeRangeQuery(params) {
|
|
548
|
+
function timeRangeQuery(params, token) {
|
|
256
549
|
return {
|
|
257
550
|
uploadStartTimeInSeconds: String(params.uploadStartTimeInSeconds),
|
|
258
551
|
uploadEndTimeInSeconds: String(params.uploadEndTimeInSeconds),
|
|
552
|
+
...(token ? { token } : {}),
|
|
259
553
|
};
|
|
260
554
|
}
|
|
261
555
|
// ─── Error ────────────────────────────────────────────────────────────────────
|
|
@@ -263,7 +557,7 @@ export class GarminApiError extends Error {
|
|
|
263
557
|
status;
|
|
264
558
|
body;
|
|
265
559
|
constructor(message, status, body) {
|
|
266
|
-
super(message);
|
|
560
|
+
super(`${message} — ${body}`);
|
|
267
561
|
this.status = status;
|
|
268
562
|
this.body = body;
|
|
269
563
|
this.name = "GarminApiError";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/garmin/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/garmin/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daily.d.ts","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"daily.d.ts","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMrD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA8LlC,MAAM;;;;;;;;;uBAAN,MAAM;;;;;;;;;;;;;;;uBAAN,MAAM;;;;;uBAAN,MAAM;;;;;EAvK3B"}
|
package/dist/garmin/daily.js
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* @returns Soma Daily fields (without connectionId/userId)
|
|
8
8
|
*/
|
|
9
9
|
export function transformDaily(daily) {
|
|
10
|
-
const startMs = daily.startTimeInSeconds * 1000;
|
|
11
|
-
const endMs = startMs + daily.durationInSeconds * 1000;
|
|
10
|
+
const startMs = (daily.startTimeInSeconds ?? 0) * 1000;
|
|
11
|
+
const endMs = startMs + (daily.durationInSeconds ?? 0) * 1000;
|
|
12
12
|
return {
|
|
13
13
|
metadata: {
|
|
14
14
|
start_time: new Date(startMs).toISOString(),
|
|
@@ -136,7 +136,7 @@ function buildStressData(daily) {
|
|
|
136
136
|
*/
|
|
137
137
|
function buildTimeOffsetSamples(startTimeInSeconds, offsets, mapValue) {
|
|
138
138
|
return Object.entries(offsets).map(([offset, value]) => ({
|
|
139
|
-
timestamp: new Date((startTimeInSeconds + parseInt(offset, 10)) * 1000).toISOString(),
|
|
139
|
+
timestamp: new Date(((startTimeInSeconds ?? 0) + parseInt(offset, 10)) * 1000).toISOString(),
|
|
140
140
|
...mapValue(value),
|
|
141
141
|
}));
|
|
142
142
|
}
|
package/dist/garmin/daily.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daily.js","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;
|
|
1
|
+
{"version":3,"file":"daily.js","sourceRoot":"","sources":["../../src/garmin/daily.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { GarminHRVSummary } from "./types.js";
|
|
2
|
+
export type HRVData = ReturnType<typeof transformHRV>;
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Garmin HRV summary into heart rate data fields for a Soma Daily.
|
|
5
|
+
*
|
|
6
|
+
* This produces a partial daily shape that can be merged into a matching
|
|
7
|
+
* daily record by date.
|
|
8
|
+
*
|
|
9
|
+
* @param hrv - The Garmin HRV summary from the Health API
|
|
10
|
+
* @returns Partial Soma Daily heart_rate_data fields
|
|
11
|
+
*/
|
|
12
|
+
export declare function transformHRV(hrv: GarminHRVSummary): {
|
|
13
|
+
calendar_date: string | undefined;
|
|
14
|
+
heart_rate_data: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
calendar_date: string | undefined;
|
|
17
|
+
heart_rate_data: {
|
|
18
|
+
summary: {
|
|
19
|
+
avg_hrv_rmssd: number | undefined;
|
|
20
|
+
max_hrv_rmssd: number | undefined;
|
|
21
|
+
} | undefined;
|
|
22
|
+
detailed: {
|
|
23
|
+
hrv_samples_rmssd: {
|
|
24
|
+
timestamp: string;
|
|
25
|
+
hrv_rmssd: number;
|
|
26
|
+
}[];
|
|
27
|
+
} | undefined;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=hrv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hrv.d.ts","sourceRoot":"","sources":["../../src/garmin/hrv.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB;;;;;;;;;;;;;;;;;EAwCjD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// ─── HRV Transformer ─────────────────────────────────────────────────────────
|
|
2
|
+
// Transforms Garmin HRV summary data into fields that enrich a Soma Daily record.
|
|
3
|
+
/**
|
|
4
|
+
* Transform a Garmin HRV summary into heart rate data fields for a Soma Daily.
|
|
5
|
+
*
|
|
6
|
+
* This produces a partial daily shape that can be merged into a matching
|
|
7
|
+
* daily record by date.
|
|
8
|
+
*
|
|
9
|
+
* @param hrv - The Garmin HRV summary from the Health API
|
|
10
|
+
* @returns Partial Soma Daily heart_rate_data fields
|
|
11
|
+
*/
|
|
12
|
+
export function transformHRV(hrv) {
|
|
13
|
+
const startMs = (hrv.startTimeInSeconds ?? 0) * 1000;
|
|
14
|
+
const endMs = startMs + (hrv.durationInSeconds ?? 0) * 1000;
|
|
15
|
+
const hasSummary = hrv.lastNightAvg != null || hrv.lastNight5MinHigh != null;
|
|
16
|
+
const hasSamples = hrv.hrvValues != null && Object.keys(hrv.hrvValues).length > 0;
|
|
17
|
+
if (!hasSummary && !hasSamples) {
|
|
18
|
+
return {
|
|
19
|
+
calendar_date: hrv.calendarDate,
|
|
20
|
+
heart_rate_data: undefined,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const startTime = hrv.startTimeInSeconds ?? 0;
|
|
24
|
+
const hrvSamples = hasSamples
|
|
25
|
+
? Object.entries(hrv.hrvValues).map(([offset, rmssd]) => ({
|
|
26
|
+
timestamp: new Date((startTime + parseInt(offset, 10)) * 1000).toISOString(),
|
|
27
|
+
hrv_rmssd: rmssd,
|
|
28
|
+
}))
|
|
29
|
+
: undefined;
|
|
30
|
+
return {
|
|
31
|
+
calendar_date: hrv.calendarDate,
|
|
32
|
+
heart_rate_data: {
|
|
33
|
+
summary: hasSummary
|
|
34
|
+
? {
|
|
35
|
+
avg_hrv_rmssd: hrv.lastNightAvg,
|
|
36
|
+
max_hrv_rmssd: hrv.lastNight5MinHigh,
|
|
37
|
+
}
|
|
38
|
+
: undefined,
|
|
39
|
+
detailed: hrvSamples && hrvSamples.length > 0
|
|
40
|
+
? { hrv_samples_rmssd: hrvSamples }
|
|
41
|
+
: undefined,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=hrv.js.map
|