@clipin/convex-wearables 0.0.1

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 (143) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +616 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +4 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +244 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +555 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +689 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +112 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/component/_generated/_ignore.d.ts +1 -0
  16. package/dist/component/_generated/_ignore.d.ts.map +1 -0
  17. package/dist/component/_generated/_ignore.js +4 -0
  18. package/dist/component/_generated/_ignore.js.map +1 -0
  19. package/dist/component/_generated/api.d.ts +13 -0
  20. package/dist/component/_generated/api.d.ts.map +1 -0
  21. package/dist/component/_generated/api.js +14 -0
  22. package/dist/component/_generated/api.js.map +1 -0
  23. package/dist/component/_generated/dataModel.d.ts +28 -0
  24. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  25. package/dist/component/_generated/dataModel.js +11 -0
  26. package/dist/component/_generated/dataModel.js.map +1 -0
  27. package/dist/component/_generated/server.d.ts +23 -0
  28. package/dist/component/_generated/server.d.ts.map +1 -0
  29. package/dist/component/_generated/server.js +18 -0
  30. package/dist/component/_generated/server.js.map +1 -0
  31. package/dist/component/backfillJobs.d.ts +121 -0
  32. package/dist/component/backfillJobs.d.ts.map +1 -0
  33. package/dist/component/backfillJobs.js +233 -0
  34. package/dist/component/backfillJobs.js.map +1 -0
  35. package/dist/component/connections.d.ts +159 -0
  36. package/dist/component/connections.d.ts.map +1 -0
  37. package/dist/component/connections.js +288 -0
  38. package/dist/component/connections.js.map +1 -0
  39. package/dist/component/convex.config.d.ts +3 -0
  40. package/dist/component/convex.config.d.ts.map +1 -0
  41. package/dist/component/convex.config.js +6 -0
  42. package/dist/component/convex.config.js.map +1 -0
  43. package/dist/component/dataPoints.d.ts +81 -0
  44. package/dist/component/dataPoints.d.ts.map +1 -0
  45. package/dist/component/dataPoints.js +258 -0
  46. package/dist/component/dataPoints.js.map +1 -0
  47. package/dist/component/dataSources.d.ts +56 -0
  48. package/dist/component/dataSources.d.ts.map +1 -0
  49. package/dist/component/dataSources.js +95 -0
  50. package/dist/component/dataSources.js.map +1 -0
  51. package/dist/component/events.d.ts +203 -0
  52. package/dist/component/events.d.ts.map +1 -0
  53. package/dist/component/events.js +251 -0
  54. package/dist/component/events.js.map +1 -0
  55. package/dist/component/garminBackfill.d.ts +40 -0
  56. package/dist/component/garminBackfill.d.ts.map +1 -0
  57. package/dist/component/garminBackfill.js +296 -0
  58. package/dist/component/garminBackfill.js.map +1 -0
  59. package/dist/component/garminWebhooks.d.ts +17 -0
  60. package/dist/component/garminWebhooks.d.ts.map +1 -0
  61. package/dist/component/garminWebhooks.js +505 -0
  62. package/dist/component/garminWebhooks.js.map +1 -0
  63. package/dist/component/httpHandlers.d.ts +32 -0
  64. package/dist/component/httpHandlers.d.ts.map +1 -0
  65. package/dist/component/httpHandlers.js +131 -0
  66. package/dist/component/httpHandlers.js.map +1 -0
  67. package/dist/component/lifecycle.d.ts +12 -0
  68. package/dist/component/lifecycle.d.ts.map +1 -0
  69. package/dist/component/lifecycle.js +79 -0
  70. package/dist/component/lifecycle.js.map +1 -0
  71. package/dist/component/menstrualCycles.d.ts +98 -0
  72. package/dist/component/menstrualCycles.d.ts.map +1 -0
  73. package/dist/component/menstrualCycles.js +112 -0
  74. package/dist/component/menstrualCycles.js.map +1 -0
  75. package/dist/component/oauthActions.d.ts +52 -0
  76. package/dist/component/oauthActions.d.ts.map +1 -0
  77. package/dist/component/oauthActions.js +208 -0
  78. package/dist/component/oauthActions.js.map +1 -0
  79. package/dist/component/oauthStates.d.ts +47 -0
  80. package/dist/component/oauthStates.d.ts.map +1 -0
  81. package/dist/component/oauthStates.js +77 -0
  82. package/dist/component/oauthStates.js.map +1 -0
  83. package/dist/component/providerSettings.d.ts +15 -0
  84. package/dist/component/providerSettings.d.ts.map +1 -0
  85. package/dist/component/providerSettings.js +57 -0
  86. package/dist/component/providerSettings.js.map +1 -0
  87. package/dist/component/providers/garmin.d.ts +306 -0
  88. package/dist/component/providers/garmin.d.ts.map +1 -0
  89. package/dist/component/providers/garmin.js +675 -0
  90. package/dist/component/providers/garmin.js.map +1 -0
  91. package/dist/component/providers/oauth.d.ts +42 -0
  92. package/dist/component/providers/oauth.d.ts.map +1 -0
  93. package/dist/component/providers/oauth.js +181 -0
  94. package/dist/component/providers/oauth.js.map +1 -0
  95. package/dist/component/providers/polar.d.ts +6 -0
  96. package/dist/component/providers/polar.d.ts.map +1 -0
  97. package/dist/component/providers/polar.js +175 -0
  98. package/dist/component/providers/polar.js.map +1 -0
  99. package/dist/component/providers/registry.d.ts +14 -0
  100. package/dist/component/providers/registry.d.ts.map +1 -0
  101. package/dist/component/providers/registry.js +32 -0
  102. package/dist/component/providers/registry.js.map +1 -0
  103. package/dist/component/providers/strava.d.ts +45 -0
  104. package/dist/component/providers/strava.d.ts.map +1 -0
  105. package/dist/component/providers/strava.js +182 -0
  106. package/dist/component/providers/strava.js.map +1 -0
  107. package/dist/component/providers/suunto.d.ts +5 -0
  108. package/dist/component/providers/suunto.d.ts.map +1 -0
  109. package/dist/component/providers/suunto.js +502 -0
  110. package/dist/component/providers/suunto.js.map +1 -0
  111. package/dist/component/providers/types.d.ts +139 -0
  112. package/dist/component/providers/types.d.ts.map +1 -0
  113. package/dist/component/providers/types.js +5 -0
  114. package/dist/component/providers/types.js.map +1 -0
  115. package/dist/component/providers/whoop.d.ts +4 -0
  116. package/dist/component/providers/whoop.d.ts.map +1 -0
  117. package/dist/component/providers/whoop.js +439 -0
  118. package/dist/component/providers/whoop.js.map +1 -0
  119. package/dist/component/schema.d.ts +429 -0
  120. package/dist/component/schema.d.ts.map +1 -0
  121. package/dist/component/schema.js +282 -0
  122. package/dist/component/schema.js.map +1 -0
  123. package/dist/component/sdkPush.d.ts +143 -0
  124. package/dist/component/sdkPush.d.ts.map +1 -0
  125. package/dist/component/sdkPush.js +338 -0
  126. package/dist/component/sdkPush.js.map +1 -0
  127. package/dist/component/summaries.d.ts +129 -0
  128. package/dist/component/summaries.d.ts.map +1 -0
  129. package/dist/component/summaries.js +129 -0
  130. package/dist/component/summaries.js.map +1 -0
  131. package/dist/component/syncJobs.d.ts +142 -0
  132. package/dist/component/syncJobs.d.ts.map +1 -0
  133. package/dist/component/syncJobs.js +136 -0
  134. package/dist/component/syncJobs.js.map +1 -0
  135. package/dist/component/syncWorkflow.d.ts +99 -0
  136. package/dist/component/syncWorkflow.d.ts.map +1 -0
  137. package/dist/component/syncWorkflow.js +579 -0
  138. package/dist/component/syncWorkflow.js.map +1 -0
  139. package/dist/component/workflowManager.d.ts +3 -0
  140. package/dist/component/workflowManager.d.ts.map +1 -0
  141. package/dist/component/workflowManager.js +17 -0
  142. package/dist/component/workflowManager.js.map +1 -0
  143. package/package.json +84 -0
@@ -0,0 +1,502 @@
1
+ import { makeAuthenticatedRequest } from "./oauth";
2
+ const API_BASE = "https://cloudapi.suunto.com";
3
+ const WORKOUTS_ENDPOINT = "/v3/workouts/";
4
+ const SLEEP_ENDPOINT = "/247samples/sleep";
5
+ const RECOVERY_ENDPOINT = "/247samples/recovery";
6
+ const ACTIVITY_ENDPOINT = "/247samples/activity";
7
+ const DAILY_STATS_ENDPOINT = "/247/daily-activity-statistics";
8
+ const SLEEP_CHUNK_MS = 20 * 24 * 60 * 60 * 1000;
9
+ const DAILY_STATS_CHUNK_MS = 14 * 24 * 60 * 60 * 1000;
10
+ const SUBSCRIPTION_HEADER = "Ocp-Apim-Subscription-Key";
11
+ const ENERGY_CONVERSION = 4184; // joules → kcal
12
+ const SUUNTO_ACTIVITY_TYPE_MAP = {
13
+ 0: "walking",
14
+ 1: "running",
15
+ 2: "cycling",
16
+ 3: "cross_country_skiing",
17
+ 4: "other",
18
+ 5: "other",
19
+ 6: "other",
20
+ 7: "other",
21
+ 8: "other",
22
+ 9: "other",
23
+ 10: "mountain_biking",
24
+ 11: "hiking",
25
+ 12: "inline_skating",
26
+ 13: "alpine_skiing",
27
+ 14: "paddling",
28
+ 15: "rowing",
29
+ 16: "golf",
30
+ 17: "fitness_equipment",
31
+ 18: "other",
32
+ 19: "other",
33
+ 20: "fitness_equipment",
34
+ 21: "swimming",
35
+ 22: "trail_running",
36
+ 23: "strength_training",
37
+ 24: "walking",
38
+ 25: "horseback_riding",
39
+ 26: "motorcycling",
40
+ 27: "skateboarding",
41
+ 28: "other",
42
+ 29: "rock_climbing",
43
+ 30: "snowboarding",
44
+ 31: "backcountry_skiing",
45
+ 32: "aerobics",
46
+ 33: "soccer",
47
+ 34: "tennis",
48
+ 35: "basketball",
49
+ 36: "badminton",
50
+ 37: "baseball",
51
+ 38: "volleyball",
52
+ 39: "american_football",
53
+ 40: "table_tennis",
54
+ 41: "other",
55
+ 42: "squash",
56
+ 43: "floorball",
57
+ 44: "handball",
58
+ 45: "baseball",
59
+ 46: "other",
60
+ 47: "other",
61
+ 48: "rugby",
62
+ 49: "ice_skating",
63
+ 50: "hockey",
64
+ 51: "yoga",
65
+ 52: "indoor_cycling",
66
+ 53: "treadmill",
67
+ 54: "strength_training",
68
+ 55: "elliptical",
69
+ 56: "cross_country_skiing",
70
+ 57: "rowing_machine",
71
+ 58: "stretching",
72
+ 59: "running",
73
+ 60: "orienteering",
74
+ 61: "stand_up_paddleboarding",
75
+ 62: "martial_arts",
76
+ 63: "strength_training",
77
+ 64: "dance",
78
+ 65: "snowshoeing",
79
+ 66: "other",
80
+ 67: "soccer",
81
+ 68: "multisport",
82
+ 69: "aerobics",
83
+ 70: "hiking",
84
+ 71: "sailing",
85
+ 72: "kayaking",
86
+ 73: "strength_training",
87
+ 74: "triathlon",
88
+ 75: "padel",
89
+ 76: "aerobics",
90
+ 77: "boxing",
91
+ 78: "diving",
92
+ 79: "diving",
93
+ 80: "multisport",
94
+ 81: "fitness_equipment",
95
+ 82: "canoeing",
96
+ 83: "mountaineering",
97
+ 84: "alpine_skiing",
98
+ 85: "open_water_swimming",
99
+ 86: "windsurfing",
100
+ 87: "kitesurfing",
101
+ 88: "other",
102
+ 90: "diving",
103
+ 91: "surfing",
104
+ 92: "multisport",
105
+ 93: "multisport",
106
+ 94: "multisport",
107
+ 95: "running",
108
+ 96: "other",
109
+ 97: "other",
110
+ 98: "transition",
111
+ 99: "cycling",
112
+ 100: "swimming",
113
+ 101: "diving",
114
+ 102: "cardio_training",
115
+ 103: "running",
116
+ 104: "strength_training",
117
+ 105: "e_biking",
118
+ 106: "e_biking",
119
+ 107: "backcountry_skiing",
120
+ 108: "other",
121
+ 109: "cycling",
122
+ 110: "snowboarding",
123
+ 111: "multisport",
124
+ 112: "stretching",
125
+ 113: "hockey",
126
+ 114: "cyclocross",
127
+ 115: "trail_running",
128
+ 116: "mountaineering",
129
+ 117: "cross_country_skiing",
130
+ 118: "cross_country_skiing",
131
+ 119: "other",
132
+ 120: "pilates",
133
+ 121: "yoga",
134
+ };
135
+ function toDateString(value) {
136
+ const timestamp = typeof value === "number" ? value : Date.parse(value);
137
+ if (Number.isNaN(timestamp))
138
+ return undefined;
139
+ return new Date(timestamp).toISOString().split("T")[0];
140
+ }
141
+ function parseTimestamp(value) {
142
+ if (typeof value === "number")
143
+ return value;
144
+ if (!value)
145
+ return undefined;
146
+ const parsed = Date.parse(value);
147
+ return Number.isNaN(parsed) ? undefined : parsed;
148
+ }
149
+ function buildHeaders(subscriptionKey) {
150
+ return subscriptionKey ? { [SUBSCRIPTION_HEADER]: subscriptionKey } : undefined;
151
+ }
152
+ function decodeJwt(token) {
153
+ const parts = token.split(".");
154
+ if (parts.length < 2)
155
+ return null;
156
+ const payload = parts[1];
157
+ const padded = payload.padEnd(Math.ceil(payload.length / 4) * 4, "=");
158
+ try {
159
+ const normalized = padded.replace(/-/g, "+").replace(/_/g, "/");
160
+ return JSON.parse(Buffer.from(normalized, "base64").toString("utf-8"));
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ }
166
+ function mapActivityType(activityId) {
167
+ if (activityId == null)
168
+ return "other";
169
+ return SUUNTO_ACTIVITY_TYPE_MAP[activityId] ?? "other";
170
+ }
171
+ async function paginatedWorkouts(accessToken, startDate, endDate, credentials) {
172
+ const headers = buildHeaders(credentials?.subscriptionKey);
173
+ const perPage = 100;
174
+ const items = [];
175
+ let offset = 0;
176
+ while (true) {
177
+ const response = await makeAuthenticatedRequest(API_BASE, WORKOUTS_ENDPOINT, accessToken, {
178
+ params: {
179
+ since: Math.floor(startDate / 1000),
180
+ limit: perPage,
181
+ offset,
182
+ },
183
+ headers,
184
+ });
185
+ const payload = Array.isArray(response?.payload) ? response.payload : [];
186
+ if (!payload.length)
187
+ break;
188
+ items.push(...payload.filter((workout) => {
189
+ const start = parseTimestamp(workout?.startTime);
190
+ return start !== undefined && start >= startDate && start <= endDate;
191
+ }));
192
+ if (payload.length < perPage)
193
+ break;
194
+ offset += payload.length;
195
+ }
196
+ return items;
197
+ }
198
+ function normalizeWorkout(raw) {
199
+ const start = typeof raw.startTime === "number" ? raw.startTime : undefined;
200
+ const end = typeof raw.stopTime === "number" ? raw.stopTime : undefined;
201
+ const duration = typeof raw.totalTime === "number" ? raw.totalTime : undefined;
202
+ const hrData = raw.hrdata ?? {};
203
+ return {
204
+ category: "workout",
205
+ type: mapActivityType(raw.activityId),
206
+ sourceName: raw.gear?.displayName ?? raw.gear?.name ?? "Suunto",
207
+ deviceModel: raw.gear?.displayName ?? raw.gear?.name,
208
+ softwareVersion: raw.gear?.swVersion,
209
+ source: "suunto",
210
+ originalSourceName: raw.gear?.name,
211
+ durationSeconds: duration,
212
+ startDatetime: start ?? Date.now(),
213
+ endDatetime: end,
214
+ externalId: raw.workoutId != null ? `suunto-workout-${raw.workoutId}` : undefined,
215
+ heartRateMin: hrData?.min,
216
+ heartRateMax: hrData?.hrmax ?? hrData?.max,
217
+ heartRateAvg: hrData?.avg ?? undefined,
218
+ energyBurned: raw.energyConsumption,
219
+ distance: raw.totalDistance,
220
+ stepsCount: raw.stepCount,
221
+ maxSpeed: typeof raw.maxSpeed === "number" ? raw.maxSpeed * 3.6 : undefined,
222
+ averageSpeed: typeof raw.avgSpeed === "number" ? raw.avgSpeed * 3.6 : undefined,
223
+ maxWatts: raw.maxPower,
224
+ averageWatts: raw.avgPower,
225
+ totalElevationGain: raw.totalAscent,
226
+ elevHigh: raw.maxAltitude,
227
+ elevLow: raw.minAltitude,
228
+ movingTimeSeconds: duration,
229
+ };
230
+ }
231
+ function normalizeSleep(raw) {
232
+ const entry = raw.entryData ?? {};
233
+ const startTime = parseTimestamp(entry.BedtimeStart);
234
+ const endTime = parseTimestamp(entry.BedtimeEnd);
235
+ const durationSeconds = Number(entry.Duration ?? 0);
236
+ if (!startTime || !endTime)
237
+ return null;
238
+ const deepSeconds = Number(entry.DeepSleepDuration ?? 0);
239
+ const lightSeconds = Number(entry.LightSleepDuration ?? 0);
240
+ const remSeconds = Number(entry.REMSleepDuration ?? 0);
241
+ const awakeSeconds = Math.max(0, durationSeconds - deepSeconds - lightSeconds - remSeconds);
242
+ const totalSleepMinutes = Math.floor((deepSeconds + lightSeconds + remSeconds) / 60);
243
+ const timeInBedMinutes = Math.floor(durationSeconds / 60);
244
+ return {
245
+ category: "sleep",
246
+ type: "sleep_session",
247
+ sourceName: "Suunto",
248
+ source: "suunto",
249
+ durationSeconds,
250
+ startDatetime: startTime,
251
+ endDatetime: endTime,
252
+ externalId: entry.SleepId != null ? `suunto-sleep-${entry.SleepId}` : undefined,
253
+ sleepTotalDurationMinutes: totalSleepMinutes,
254
+ sleepTimeInBedMinutes: timeInBedMinutes,
255
+ sleepDeepMinutes: Math.floor(deepSeconds / 60),
256
+ sleepLightMinutes: Math.floor(lightSeconds / 60),
257
+ sleepRemMinutes: Math.floor(remSeconds / 60),
258
+ sleepAwakeMinutes: Math.floor(awakeSeconds / 60),
259
+ sleepEfficiencyScore: entry.SleepQualityScore,
260
+ heartRateAvg: Number.isFinite(entry.HRAvg) ? Number(entry.HRAvg) : undefined,
261
+ heartRateMin: Number.isFinite(entry.HRMin) ? Number(entry.HRMin) : undefined,
262
+ isNap: Boolean(entry.IsNap),
263
+ };
264
+ }
265
+ async function fetchSleepEvents(accessToken, startDate, endDate, credentials) {
266
+ const headers = buildHeaders(credentials?.subscriptionKey);
267
+ const events = [];
268
+ let cursor = startDate;
269
+ while (cursor < endDate) {
270
+ const chunkEnd = Math.min(cursor + SLEEP_CHUNK_MS, endDate);
271
+ const response = await makeAuthenticatedRequest(API_BASE, SLEEP_ENDPOINT, accessToken, {
272
+ params: {
273
+ from: cursor,
274
+ to: chunkEnd,
275
+ },
276
+ headers,
277
+ });
278
+ const entries = Array.isArray(response) ? response : [];
279
+ for (const entry of entries) {
280
+ const normalized = normalizeSleep(entry);
281
+ if (normalized)
282
+ events.push(normalized);
283
+ }
284
+ if (chunkEnd === endDate)
285
+ break;
286
+ cursor = chunkEnd;
287
+ }
288
+ return events;
289
+ }
290
+ function normalizeRecoverySample(raw) {
291
+ const timestamp = parseTimestamp(raw.timestamp);
292
+ if (!timestamp)
293
+ return [];
294
+ const entry = raw.entryData ?? {};
295
+ const value = Number(entry.Balance ?? entry.balance ?? null);
296
+ if (!Number.isFinite(value))
297
+ return [];
298
+ return [
299
+ {
300
+ seriesType: "recovery_score",
301
+ recordedAt: timestamp,
302
+ value: value * 100,
303
+ source: "suunto",
304
+ },
305
+ ];
306
+ }
307
+ function normalizeActivitySamples(raw) {
308
+ const timestamp = parseTimestamp(raw.timestamp);
309
+ if (!timestamp)
310
+ return [];
311
+ const entry = raw.entryData ?? {};
312
+ const points = [];
313
+ if (Number.isFinite(entry.HR)) {
314
+ points.push({
315
+ seriesType: "heart_rate",
316
+ recordedAt: timestamp,
317
+ value: Number(entry.HR),
318
+ source: "suunto",
319
+ });
320
+ }
321
+ if (Number.isFinite(entry.StepCount)) {
322
+ points.push({
323
+ seriesType: "steps",
324
+ recordedAt: timestamp,
325
+ value: Number(entry.StepCount),
326
+ source: "suunto",
327
+ });
328
+ }
329
+ if (Number.isFinite(entry.SpO2)) {
330
+ const spo2 = Number(entry.SpO2);
331
+ points.push({
332
+ seriesType: "oxygen_saturation",
333
+ recordedAt: timestamp,
334
+ value: spo2 <= 1 ? spo2 * 100 : spo2,
335
+ source: "suunto",
336
+ });
337
+ }
338
+ if (Number.isFinite(entry.EnergyConsumption)) {
339
+ points.push({
340
+ seriesType: "energy",
341
+ recordedAt: timestamp,
342
+ value: Number(entry.EnergyConsumption) / ENERGY_CONVERSION,
343
+ source: "suunto",
344
+ });
345
+ }
346
+ if (Number.isFinite(entry.HRV)) {
347
+ points.push({
348
+ seriesType: "heart_rate_variability_rmssd",
349
+ recordedAt: timestamp,
350
+ value: Number(entry.HRV),
351
+ source: "suunto",
352
+ });
353
+ }
354
+ return points;
355
+ }
356
+ function normalizeDailyStatSample(stat) {
357
+ const type = (stat.Name ?? stat.type ?? "").toLowerCase();
358
+ const samples = [];
359
+ const sources = Array.isArray(stat.Sources) ? stat.Sources : [];
360
+ for (const source of sources) {
361
+ const entries = Array.isArray(source.Samples) ? source.Samples : [];
362
+ for (const sample of entries) {
363
+ const timestamp = parseTimestamp(sample.TimeISO8601);
364
+ if (!timestamp || sample.Value == null)
365
+ continue;
366
+ let value = Number(sample.Value);
367
+ if (!Number.isFinite(value))
368
+ continue;
369
+ if (type === "energyconsumption") {
370
+ value = value / ENERGY_CONVERSION;
371
+ }
372
+ const date = toDateString(timestamp);
373
+ if (!date)
374
+ continue;
375
+ samples.push({ date, type, recordedAt: timestamp, value });
376
+ }
377
+ }
378
+ return samples;
379
+ }
380
+ async function fetchDailyStats(accessToken, startDate, endDate, credentials) {
381
+ const headers = buildHeaders(credentials?.subscriptionKey);
382
+ const points = [];
383
+ let cursor = startDate;
384
+ while (cursor < endDate) {
385
+ const chunkEnd = Math.min(cursor + DAILY_STATS_CHUNK_MS, endDate);
386
+ const response = await makeAuthenticatedRequest(API_BASE, DAILY_STATS_ENDPOINT, accessToken, {
387
+ params: {
388
+ startdate: new Date(cursor).toISOString().split(".")[0],
389
+ enddate: new Date(chunkEnd).toISOString().split(".")[0],
390
+ },
391
+ headers,
392
+ });
393
+ const stats = Array.isArray(response) ? response : [];
394
+ for (const stat of stats) {
395
+ const normalized = normalizeDailyStatSample(stat);
396
+ for (const sample of normalized) {
397
+ const seriesType = sample.type === "stepcount"
398
+ ? "steps"
399
+ : sample.type === "energyconsumption"
400
+ ? "energy"
401
+ : undefined;
402
+ if (!seriesType)
403
+ continue;
404
+ points.push({
405
+ seriesType,
406
+ recordedAt: sample.recordedAt,
407
+ value: sample.value,
408
+ source: "suunto",
409
+ });
410
+ }
411
+ }
412
+ if (chunkEnd === endDate)
413
+ break;
414
+ cursor = chunkEnd;
415
+ }
416
+ return points;
417
+ }
418
+ async function fetchRecurrencePoints(accessToken, startDate, endDate, endpoint, credentials) {
419
+ const headers = buildHeaders(credentials?.subscriptionKey);
420
+ const results = [];
421
+ let cursor = startDate;
422
+ while (cursor < endDate) {
423
+ const chunkEnd = Math.min(cursor + SLEEP_CHUNK_MS, endDate);
424
+ const response = await makeAuthenticatedRequest(API_BASE, endpoint, accessToken, {
425
+ params: { from: cursor, to: chunkEnd },
426
+ headers,
427
+ });
428
+ if (Array.isArray(response))
429
+ results.push(...response);
430
+ if (chunkEnd === endDate)
431
+ break;
432
+ cursor = chunkEnd;
433
+ }
434
+ return results;
435
+ }
436
+ async function fetchSuuntoRecovery(accessToken, startDate, endDate, credentials) {
437
+ const raws = await fetchRecurrencePoints(accessToken, startDate, endDate, RECOVERY_ENDPOINT, credentials);
438
+ return raws.flatMap(normalizeRecoverySample);
439
+ }
440
+ async function fetchSuuntoActivity(accessToken, startDate, endDate, credentials) {
441
+ const raws = await fetchRecurrencePoints(accessToken, startDate, endDate, ACTIVITY_ENDPOINT, credentials);
442
+ return raws.flatMap(normalizeActivitySamples);
443
+ }
444
+ async function aggregateDailySummaries(accessToken, startDate, endDate, credentials) {
445
+ const dataPoints = await fetchDailyStats(accessToken, startDate, endDate, credentials);
446
+ const summaryMap = {};
447
+ for (const point of dataPoints) {
448
+ const dateKey = new Date(point.recordedAt).toISOString().split("T")[0];
449
+ const bucket = summaryMap[dateKey] ?? { date: dateKey, category: "activity" };
450
+ if (point.seriesType === "steps") {
451
+ bucket.totalSteps = (bucket.totalSteps ?? 0) + point.value;
452
+ }
453
+ if (point.seriesType === "energy") {
454
+ bucket.totalCalories = (bucket.totalCalories ?? 0) + point.value;
455
+ }
456
+ summaryMap[dateKey] = bucket;
457
+ }
458
+ return Object.values(summaryMap);
459
+ }
460
+ export function suuntoOAuthConfig(credentials) {
461
+ return {
462
+ endpoints: {
463
+ authorizeUrl: "https://cloudapi-oauth.suunto.com/oauth/authorize",
464
+ tokenUrl: "https://cloudapi-oauth.suunto.com/oauth/token",
465
+ apiBaseUrl: API_BASE,
466
+ },
467
+ clientId: credentials.clientId,
468
+ clientSecret: credentials.clientSecret,
469
+ defaultScope: "",
470
+ usePkce: false,
471
+ authMethod: "body",
472
+ defaultHeaders: buildHeaders(credentials.subscriptionKey),
473
+ };
474
+ }
475
+ export async function getSuuntoUserInfo(accessToken, _tokenResponse, _appUserId, _credentials) {
476
+ const payload = decodeJwt(accessToken);
477
+ return {
478
+ providerUserId: payload?.sub ? String(payload.sub) : null,
479
+ username: typeof payload?.user === "string" ? payload.user : null,
480
+ };
481
+ }
482
+ export const suuntoProvider = {
483
+ name: "suunto",
484
+ oauthConfig: suuntoOAuthConfig,
485
+ getUserInfo: getSuuntoUserInfo,
486
+ fetchEvents: async (accessToken, startDate, endDate, credentials) => {
487
+ const workouts = await paginatedWorkouts(accessToken, startDate, endDate, credentials);
488
+ const normalizedWorkouts = workouts.map(normalizeWorkout);
489
+ const sleep = await fetchSleepEvents(accessToken, startDate, endDate, credentials);
490
+ return [...normalizedWorkouts, ...sleep];
491
+ },
492
+ fetchDataPoints: async (accessToken, startDate, endDate, credentials) => {
493
+ const recovery = await fetchSuuntoRecovery(accessToken, startDate, endDate, credentials);
494
+ const activity = await fetchSuuntoActivity(accessToken, startDate, endDate, credentials);
495
+ const daily = await fetchDailyStats(accessToken, startDate, endDate, credentials);
496
+ return [...recovery, ...activity, ...daily];
497
+ },
498
+ fetchDailySummaries: async (accessToken, startDate, endDate, credentials) => {
499
+ return aggregateDailySummaries(accessToken, startDate, endDate, credentials);
500
+ },
501
+ };
502
+ //# sourceMappingURL=suunto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suunto.js","sourceRoot":"","sources":["../../../src/component/providers/suunto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Provider-level types shared across all provider implementations.
3
+ */
4
+ export interface OAuthEndpoints {
5
+ authorizeUrl: string;
6
+ tokenUrl: string;
7
+ apiBaseUrl: string;
8
+ }
9
+ export type AuthMethod = "body" | "basic";
10
+ export interface OAuthProviderConfig {
11
+ endpoints: OAuthEndpoints;
12
+ clientId: string;
13
+ clientSecret: string;
14
+ defaultScope: string;
15
+ usePkce: boolean;
16
+ authMethod: AuthMethod;
17
+ /** Extra query params on the authorize URL (e.g. Suunto subscription key). */
18
+ extraAuthorizeParams?: Record<string, string>;
19
+ /** Extra headers to attach to provider API requests. */
20
+ defaultHeaders?: Record<string, string>;
21
+ }
22
+ export interface OAuthTokenResponse {
23
+ access_token: string;
24
+ refresh_token?: string;
25
+ expires_in?: number;
26
+ token_type?: string;
27
+ scope?: string;
28
+ x_user_id?: number;
29
+ [key: string]: unknown;
30
+ }
31
+ export interface ProviderUserInfo {
32
+ providerUserId: string | null;
33
+ username: string | null;
34
+ }
35
+ export interface ProviderCredentials {
36
+ clientId: string;
37
+ clientSecret: string;
38
+ subscriptionKey?: string;
39
+ }
40
+ export interface NormalizedEvent {
41
+ category: "workout" | "sleep";
42
+ type?: string;
43
+ sourceName?: string;
44
+ deviceModel?: string;
45
+ softwareVersion?: string;
46
+ source?: string;
47
+ deviceType?: string;
48
+ originalSourceName?: string;
49
+ durationSeconds?: number;
50
+ startDatetime: number;
51
+ endDatetime?: number;
52
+ externalId?: string;
53
+ heartRateMin?: number;
54
+ heartRateMax?: number;
55
+ heartRateAvg?: number;
56
+ energyBurned?: number;
57
+ distance?: number;
58
+ stepsCount?: number;
59
+ maxSpeed?: number;
60
+ maxWatts?: number;
61
+ movingTimeSeconds?: number;
62
+ totalElevationGain?: number;
63
+ averageSpeed?: number;
64
+ averageWatts?: number;
65
+ elevHigh?: number;
66
+ elevLow?: number;
67
+ sleepTotalDurationMinutes?: number;
68
+ sleepTimeInBedMinutes?: number;
69
+ sleepEfficiencyScore?: number;
70
+ sleepDeepMinutes?: number;
71
+ sleepRemMinutes?: number;
72
+ sleepLightMinutes?: number;
73
+ sleepAwakeMinutes?: number;
74
+ isNap?: boolean;
75
+ sleepStages?: {
76
+ stage: string;
77
+ startTime: number;
78
+ endTime: number;
79
+ }[];
80
+ }
81
+ export interface NormalizedDataPoint {
82
+ seriesType: string;
83
+ recordedAt: number;
84
+ value: number;
85
+ externalId?: string;
86
+ deviceModel?: string;
87
+ softwareVersion?: string;
88
+ source?: string;
89
+ deviceType?: string;
90
+ originalSourceName?: string;
91
+ }
92
+ export interface NormalizedDailySummary {
93
+ date: string;
94
+ category: string;
95
+ totalSteps?: number;
96
+ totalCalories?: number;
97
+ activeCalories?: number;
98
+ activeMinutes?: number;
99
+ totalDistance?: number;
100
+ floorsClimbed?: number;
101
+ avgHeartRate?: number;
102
+ maxHeartRate?: number;
103
+ minHeartRate?: number;
104
+ sleepDurationMinutes?: number;
105
+ sleepEfficiency?: number;
106
+ deepSleepMinutes?: number;
107
+ remSleepMinutes?: number;
108
+ lightSleepMinutes?: number;
109
+ awakeDuringMinutes?: number;
110
+ timeInBedMinutes?: number;
111
+ hrvAvg?: number;
112
+ hrvRmssd?: number;
113
+ restingHeartRate?: number;
114
+ recoveryScore?: number;
115
+ weight?: number;
116
+ bodyFatPercentage?: number;
117
+ bodyMassIndex?: number;
118
+ leanBodyMass?: number;
119
+ bodyTemperature?: number;
120
+ avgStressLevel?: number;
121
+ bodyBattery?: number;
122
+ spo2Avg?: number;
123
+ }
124
+ export interface ProviderAdapter {
125
+ name: string;
126
+ /** Build the OAuth config from provider credentials. */
127
+ oauthConfig(credentials: ProviderCredentials): OAuthProviderConfig;
128
+ /** Resolve the authenticated provider user. */
129
+ getUserInfo(accessToken: string, tokenResponse?: OAuthTokenResponse, appUserId?: string, credentials?: ProviderCredentials): Promise<ProviderUserInfo>;
130
+ /** Optional provider-specific action after token exchange. */
131
+ postConnect?(accessToken: string, tokenResponse: OAuthTokenResponse, appUserId: string, credentials?: ProviderCredentials): Promise<void>;
132
+ /** Fetch provider events (workouts, sleep). */
133
+ fetchEvents?(accessToken: string, startDate: number, endDate: number, credentials?: ProviderCredentials): Promise<NormalizedEvent[]>;
134
+ /** Fetch time-series provider data. */
135
+ fetchDataPoints?(accessToken: string, startDate: number, endDate: number, credentials?: ProviderCredentials): Promise<NormalizedDataPoint[]>;
136
+ /** Fetch daily summary provider data. */
137
+ fetchDailySummaries?(accessToken: string, startDate: number, endDate: number, credentials?: ProviderCredentials): Promise<NormalizedDailySummary[]>;
138
+ }
139
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/component/providers/types.ts"],"names":[],"mappings":"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"}