@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,579 @@
1
+ /**
2
+ * Durable sync orchestration for provider pull syncs.
3
+ *
4
+ * The old implementation executed a whole sync inline in one action. This
5
+ * module now enqueues a durable workflow per connection and keeps syncJobs as
6
+ * the user-visible progress surface.
7
+ */
8
+ import { v } from "convex/values";
9
+ import { api, internal } from "./_generated/api";
10
+ import { action, internalAction, internalMutation } from "./_generated/server";
11
+ import { getProvider } from "./providers/registry";
12
+ import { providerName } from "./schema";
13
+ import { durableWorkflow } from "./workflowManager";
14
+ const EVENT_BATCH_SIZE = 50;
15
+ const DATA_POINT_BATCH_SIZE = 200;
16
+ const SUMMARY_BATCH_SIZE = 50;
17
+ const DEFAULT_SYNC_WINDOW_HOURS = 24;
18
+ const syncPhase = v.union(v.literal("events"), v.literal("dataPoints"), v.literal("summaries"));
19
+ function buildSyncIdempotencyKey(args) {
20
+ return [args.connectionId, args.mode, args.windowStart, args.windowEnd].join("::");
21
+ }
22
+ function sourceCacheKey(provider, metadata) {
23
+ return [
24
+ provider,
25
+ metadata.deviceModel ?? "",
26
+ metadata.softwareVersion ?? "",
27
+ metadata.source ?? provider,
28
+ metadata.deviceType ?? "",
29
+ metadata.originalSourceName ?? "",
30
+ ].join("::");
31
+ }
32
+ async function ensureDataSource(ctx, args, cache, metadata = {}) {
33
+ const key = sourceCacheKey(args.provider, metadata);
34
+ const cached = cache.get(key);
35
+ if (cached)
36
+ return cached;
37
+ const id = await ctx.runMutation(api.dataSources.getOrCreate, {
38
+ userId: args.userId,
39
+ provider: args.provider,
40
+ connectionId: args.connectionId,
41
+ deviceModel: metadata.deviceModel,
42
+ softwareVersion: metadata.softwareVersion,
43
+ source: metadata.source ?? args.provider,
44
+ deviceType: metadata.deviceType,
45
+ originalSourceName: metadata.originalSourceName,
46
+ });
47
+ cache.set(key, id);
48
+ return id;
49
+ }
50
+ function toEventDoc(event, dataSourceId, userId) {
51
+ return {
52
+ dataSourceId,
53
+ userId,
54
+ category: event.category,
55
+ type: event.type,
56
+ sourceName: event.sourceName,
57
+ durationSeconds: event.durationSeconds,
58
+ startDatetime: event.startDatetime,
59
+ endDatetime: event.endDatetime,
60
+ externalId: event.externalId,
61
+ heartRateAvg: event.heartRateAvg,
62
+ heartRateMax: event.heartRateMax,
63
+ heartRateMin: event.heartRateMin,
64
+ energyBurned: event.energyBurned,
65
+ distance: event.distance,
66
+ stepsCount: event.stepsCount,
67
+ maxSpeed: event.maxSpeed,
68
+ maxWatts: event.maxWatts,
69
+ movingTimeSeconds: event.movingTimeSeconds,
70
+ totalElevationGain: event.totalElevationGain,
71
+ averageSpeed: event.averageSpeed,
72
+ averageWatts: event.averageWatts,
73
+ elevHigh: event.elevHigh,
74
+ elevLow: event.elevLow,
75
+ sleepTotalDurationMinutes: event.sleepTotalDurationMinutes,
76
+ sleepTimeInBedMinutes: event.sleepTimeInBedMinutes,
77
+ sleepEfficiencyScore: event.sleepEfficiencyScore,
78
+ sleepDeepMinutes: event.sleepDeepMinutes,
79
+ sleepRemMinutes: event.sleepRemMinutes,
80
+ sleepLightMinutes: event.sleepLightMinutes,
81
+ sleepAwakeMinutes: event.sleepAwakeMinutes,
82
+ isNap: event.isNap,
83
+ sleepStages: event.sleepStages,
84
+ };
85
+ }
86
+ function sortEvents(events) {
87
+ return [...events].sort((a, b) => {
88
+ if (a.startDatetime !== b.startDatetime) {
89
+ return a.startDatetime - b.startDatetime;
90
+ }
91
+ return (a.externalId ?? "").localeCompare(b.externalId ?? "");
92
+ });
93
+ }
94
+ function sortDataPoints(points) {
95
+ return [...points].sort((a, b) => {
96
+ if (a.recordedAt !== b.recordedAt) {
97
+ return a.recordedAt - b.recordedAt;
98
+ }
99
+ if (a.seriesType !== b.seriesType) {
100
+ return a.seriesType.localeCompare(b.seriesType);
101
+ }
102
+ return (a.externalId ?? "").localeCompare(b.externalId ?? "");
103
+ });
104
+ }
105
+ function sortSummaries(summaries) {
106
+ return [...summaries].sort((a, b) => {
107
+ if (a.date !== b.date) {
108
+ return a.date.localeCompare(b.date);
109
+ }
110
+ return a.category.localeCompare(b.category);
111
+ });
112
+ }
113
+ export const requestConnectionSync = internalMutation({
114
+ args: {
115
+ connectionId: v.id("connections"),
116
+ mode: v.optional(v.union(v.literal("manual"), v.literal("cron"), v.literal("webhook"))),
117
+ triggerSource: v.optional(v.string()),
118
+ windowStart: v.number(),
119
+ windowEnd: v.number(),
120
+ },
121
+ returns: v.object({
122
+ syncJobId: v.id("syncJobs"),
123
+ workflowId: v.string(),
124
+ deduped: v.boolean(),
125
+ }),
126
+ handler: async (ctx, args) => {
127
+ const connection = await ctx.db.get(args.connectionId);
128
+ if (!connection) {
129
+ throw new Error(`Connection ${args.connectionId} not found`);
130
+ }
131
+ if (connection.status !== "active") {
132
+ throw new Error(`Connection ${args.connectionId} is not active`);
133
+ }
134
+ const mode = args.mode ?? "manual";
135
+ const idempotencyKey = buildSyncIdempotencyKey({
136
+ connectionId: args.connectionId,
137
+ mode,
138
+ windowStart: args.windowStart,
139
+ windowEnd: args.windowEnd,
140
+ });
141
+ const existing = await ctx.db
142
+ .query("syncJobs")
143
+ .withIndex("by_idempotency_key", (idx) => idx.eq("idempotencyKey", idempotencyKey))
144
+ .order("desc")
145
+ .first();
146
+ if (existing && (existing.status === "queued" || existing.status === "running")) {
147
+ return {
148
+ syncJobId: existing._id,
149
+ workflowId: existing.workflowId ?? "",
150
+ deduped: true,
151
+ };
152
+ }
153
+ const syncJobId = await ctx.db.insert("syncJobs", {
154
+ connectionId: connection._id,
155
+ userId: connection.userId,
156
+ provider: connection.provider,
157
+ mode,
158
+ triggerSource: args.triggerSource,
159
+ idempotencyKey,
160
+ status: "queued",
161
+ startedAt: Date.now(),
162
+ attempt: 0,
163
+ windowStart: args.windowStart,
164
+ windowEnd: args.windowEnd,
165
+ });
166
+ const workflowId = await durableWorkflow.start(ctx, internal.syncWorkflow.runConnectionSync, { syncJobId }, {
167
+ startAsync: true,
168
+ onComplete: internal.syncWorkflow.handleConnectionSyncComplete,
169
+ context: { syncJobId },
170
+ });
171
+ await ctx.db.patch(syncJobId, { workflowId });
172
+ return {
173
+ syncJobId,
174
+ workflowId,
175
+ deduped: false,
176
+ };
177
+ },
178
+ });
179
+ export const fetchSyncPhaseBatch = internalAction({
180
+ args: {
181
+ syncJobId: v.id("syncJobs"),
182
+ phase: syncPhase,
183
+ cursor: v.optional(v.string()),
184
+ },
185
+ returns: v.object({
186
+ events: v.array(v.any()),
187
+ dataPoints: v.array(v.any()),
188
+ summaries: v.array(v.any()),
189
+ nextCursor: v.union(v.string(), v.null()),
190
+ }),
191
+ handler: async (ctx, args) => {
192
+ const job = await ctx.runQuery(internal.syncJobs.getById, {
193
+ jobId: args.syncJobId,
194
+ });
195
+ if (!job) {
196
+ throw new Error(`Sync job ${args.syncJobId} not found`);
197
+ }
198
+ const connection = await ctx.runQuery(internal.connections.getById, {
199
+ connectionId: job.connectionId,
200
+ });
201
+ if (!connection) {
202
+ throw new Error(`Connection ${job.connectionId} not found`);
203
+ }
204
+ const credentials = await ctx.runQuery(internal.providerSettings.getCredentials, {
205
+ provider: job.provider,
206
+ });
207
+ if (!credentials) {
208
+ throw new Error(`Missing stored credentials for provider "${job.provider}"`);
209
+ }
210
+ const providerDef = getProvider(job.provider);
211
+ if (!providerDef) {
212
+ throw new Error(`Provider "${job.provider}" is not implemented`);
213
+ }
214
+ try {
215
+ const accessToken = await ctx.runAction(internal.oauthActions.ensureValidToken, {
216
+ connectionId: connection._id,
217
+ provider: connection.provider,
218
+ accessToken: connection.accessToken ?? "",
219
+ refreshToken: connection.refreshToken,
220
+ tokenExpiresAt: connection.tokenExpiresAt,
221
+ clientId: credentials.clientId,
222
+ clientSecret: credentials.clientSecret,
223
+ subscriptionKey: credentials.subscriptionKey,
224
+ });
225
+ const offset = Number(args.cursor ?? "0");
226
+ const startDate = job.windowStart ?? Date.now() - DEFAULT_SYNC_WINDOW_HOURS * 60 * 60 * 1000;
227
+ const endDate = job.windowEnd ?? Date.now();
228
+ if (args.phase === "events") {
229
+ const all = sortEvents(providerDef.fetchEvents
230
+ ? await providerDef.fetchEvents(accessToken, startDate, endDate, credentials)
231
+ : []);
232
+ const batch = all.slice(offset, offset + EVENT_BATCH_SIZE);
233
+ return {
234
+ events: batch,
235
+ dataPoints: [],
236
+ summaries: [],
237
+ nextCursor: offset + batch.length < all.length ? String(offset + batch.length) : null,
238
+ };
239
+ }
240
+ if (args.phase === "dataPoints") {
241
+ const all = sortDataPoints(providerDef.fetchDataPoints
242
+ ? await providerDef.fetchDataPoints(accessToken, startDate, endDate, credentials)
243
+ : []);
244
+ const batch = all.slice(offset, offset + DATA_POINT_BATCH_SIZE);
245
+ return {
246
+ events: [],
247
+ dataPoints: batch,
248
+ summaries: [],
249
+ nextCursor: offset + batch.length < all.length ? String(offset + batch.length) : null,
250
+ };
251
+ }
252
+ const all = sortSummaries(providerDef.fetchDailySummaries
253
+ ? await providerDef.fetchDailySummaries(accessToken, startDate, endDate, credentials)
254
+ : []);
255
+ const batch = all.slice(offset, offset + SUMMARY_BATCH_SIZE);
256
+ return {
257
+ events: [],
258
+ dataPoints: [],
259
+ summaries: batch,
260
+ nextCursor: offset + batch.length < all.length ? String(offset + batch.length) : null,
261
+ };
262
+ }
263
+ catch (error) {
264
+ const message = error instanceof Error ? error.message : String(error);
265
+ if (message.includes("Authorization expired") ||
266
+ message.includes("Token expired") ||
267
+ message.includes("Token refresh failed")) {
268
+ await ctx.runMutation(internal.connections.updateStatus, {
269
+ connectionId: connection._id,
270
+ status: "expired",
271
+ });
272
+ }
273
+ throw error;
274
+ }
275
+ },
276
+ });
277
+ export const runConnectionSync = durableWorkflow.define({
278
+ args: {
279
+ syncJobId: v.id("syncJobs"),
280
+ },
281
+ returns: v.object({
282
+ recordsProcessed: v.number(),
283
+ }),
284
+ handler: async (step, args) => {
285
+ const job = await step.runQuery(internal.syncJobs.getById, {
286
+ jobId: args.syncJobId,
287
+ });
288
+ if (!job) {
289
+ throw new Error(`Sync job ${args.syncJobId} not found`);
290
+ }
291
+ const connection = await step.runQuery(internal.connections.getById, {
292
+ connectionId: job.connectionId,
293
+ });
294
+ if (!connection) {
295
+ throw new Error(`Connection ${job.connectionId} not found`);
296
+ }
297
+ let processed = 0;
298
+ const sourceCache = new Map();
299
+ await step.runMutation(internal.syncJobs.updateStatus, {
300
+ jobId: args.syncJobId,
301
+ status: "running",
302
+ workflowId: job.workflowId,
303
+ lastHeartbeatAt: Date.now(),
304
+ });
305
+ for (const phase of ["events", "dataPoints", "summaries"]) {
306
+ let cursor;
307
+ while (true) {
308
+ const batch = await step.runAction(internal.syncWorkflow.fetchSyncPhaseBatch, {
309
+ syncJobId: args.syncJobId,
310
+ phase,
311
+ cursor,
312
+ });
313
+ if (phase === "events" && batch.events.length > 0) {
314
+ const eventDocs = await Promise.all(batch.events.map(async (event) => {
315
+ const dataSourceId = await ensureDataSource(step, {
316
+ userId: job.userId,
317
+ provider: job.provider,
318
+ connectionId: connection._id,
319
+ }, sourceCache, {
320
+ deviceModel: event.deviceModel,
321
+ softwareVersion: event.softwareVersion,
322
+ source: event.source ?? job.provider,
323
+ deviceType: event.deviceType,
324
+ originalSourceName: event.originalSourceName,
325
+ });
326
+ return toEventDoc(event, dataSourceId, job.userId);
327
+ }));
328
+ await step.runMutation(internal.events.storeEventBatch, {
329
+ events: eventDocs,
330
+ });
331
+ processed += batch.events.length;
332
+ }
333
+ if (phase === "dataPoints" && batch.dataPoints.length > 0) {
334
+ const grouped = new Map();
335
+ for (const point of batch.dataPoints) {
336
+ const dataSourceId = await ensureDataSource(step, {
337
+ userId: job.userId,
338
+ provider: job.provider,
339
+ connectionId: connection._id,
340
+ }, sourceCache, {
341
+ deviceModel: point.deviceModel,
342
+ softwareVersion: point.softwareVersion,
343
+ source: point.source ?? job.provider,
344
+ deviceType: point.deviceType,
345
+ originalSourceName: point.originalSourceName,
346
+ });
347
+ const key = `${dataSourceId}::${point.seriesType}`;
348
+ const group = grouped.get(key) ?? {
349
+ dataSourceId,
350
+ seriesType: point.seriesType,
351
+ points: [],
352
+ };
353
+ group.points.push({
354
+ recordedAt: point.recordedAt,
355
+ value: point.value,
356
+ externalId: point.externalId,
357
+ });
358
+ grouped.set(key, group);
359
+ }
360
+ for (const group of grouped.values()) {
361
+ await step.runMutation(internal.dataPoints.storeBatch, {
362
+ dataSourceId: group.dataSourceId,
363
+ seriesType: group.seriesType,
364
+ points: group.points,
365
+ });
366
+ }
367
+ processed += batch.dataPoints.length;
368
+ }
369
+ if (phase === "summaries" && batch.summaries.length > 0) {
370
+ for (const summary of batch.summaries) {
371
+ await step.runMutation(internal.summaries.upsert, {
372
+ userId: job.userId,
373
+ ...summary,
374
+ });
375
+ }
376
+ processed += batch.summaries.length;
377
+ }
378
+ cursor = batch.nextCursor ?? undefined;
379
+ await step.runMutation(internal.syncJobs.updateStatus, {
380
+ jobId: args.syncJobId,
381
+ status: "running",
382
+ currentPhase: phase,
383
+ cursor,
384
+ recordsProcessed: processed,
385
+ lastHeartbeatAt: Date.now(),
386
+ });
387
+ if (!cursor) {
388
+ break;
389
+ }
390
+ }
391
+ }
392
+ await step.runMutation(internal.connections.markSynced, {
393
+ connectionId: connection._id,
394
+ });
395
+ return { recordsProcessed: processed };
396
+ },
397
+ });
398
+ export const handleConnectionSyncComplete = internalMutation({
399
+ args: {
400
+ workflowId: v.string(),
401
+ result: v.any(),
402
+ context: v.object({
403
+ syncJobId: v.id("syncJobs"),
404
+ }),
405
+ },
406
+ handler: async (ctx, args) => {
407
+ const job = await ctx.db.get(args.context.syncJobId);
408
+ if (!job)
409
+ return;
410
+ if (args.result.kind === "success") {
411
+ const returnValue = (args.result.returnValue ?? {});
412
+ await ctx.db.patch(job._id, {
413
+ status: "completed",
414
+ completedAt: Date.now(),
415
+ recordsProcessed: returnValue.recordsProcessed ?? job.recordsProcessed ?? 0,
416
+ workflowId: args.workflowId,
417
+ lastHeartbeatAt: Date.now(),
418
+ });
419
+ return;
420
+ }
421
+ if (args.result.kind === "canceled") {
422
+ await ctx.db.patch(job._id, {
423
+ status: "canceled",
424
+ completedAt: Date.now(),
425
+ workflowId: args.workflowId,
426
+ lastHeartbeatAt: Date.now(),
427
+ });
428
+ return;
429
+ }
430
+ await ctx.db.patch(job._id, {
431
+ status: "failed",
432
+ completedAt: Date.now(),
433
+ error: args.result.error,
434
+ workflowId: args.workflowId,
435
+ lastHeartbeatAt: Date.now(),
436
+ });
437
+ },
438
+ });
439
+ export const syncConnection = action({
440
+ args: {
441
+ connectionId: v.id("connections"),
442
+ provider: providerName,
443
+ startDate: v.optional(v.number()),
444
+ endDate: v.optional(v.number()),
445
+ syncWindowHours: v.optional(v.number()),
446
+ clientId: v.optional(v.string()),
447
+ clientSecret: v.optional(v.string()),
448
+ subscriptionKey: v.optional(v.string()),
449
+ },
450
+ returns: v.object({
451
+ syncJobId: v.string(),
452
+ workflowId: v.string(),
453
+ deduped: v.boolean(),
454
+ }),
455
+ handler: async (ctx, args) => {
456
+ const connection = await ctx.runQuery(internal.connections.getById, {
457
+ connectionId: args.connectionId,
458
+ });
459
+ if (!connection) {
460
+ throw new Error(`Connection ${args.connectionId} not found`);
461
+ }
462
+ if (connection.provider !== args.provider) {
463
+ throw new Error(`Connection ${args.connectionId} does not belong to provider "${args.provider}"`);
464
+ }
465
+ if ((args.clientId && !args.clientSecret) || (!args.clientId && args.clientSecret)) {
466
+ throw new Error("clientId and clientSecret must be provided together");
467
+ }
468
+ if (args.clientId && args.clientSecret) {
469
+ await ctx.runMutation(internal.providerSettings.upsertCredentials, {
470
+ provider: args.provider,
471
+ clientId: args.clientId,
472
+ clientSecret: args.clientSecret,
473
+ subscriptionKey: args.subscriptionKey,
474
+ });
475
+ }
476
+ const endDate = args.endDate ?? Date.now();
477
+ const defaultWindowMs = (args.syncWindowHours ?? DEFAULT_SYNC_WINDOW_HOURS) * 60 * 60 * 1000;
478
+ const startDate = args.startDate ??
479
+ Math.max(connection.lastSyncedAt ?? endDate - defaultWindowMs, endDate - defaultWindowMs);
480
+ const result = await ctx.runMutation(internal.syncWorkflow.requestConnectionSync, {
481
+ connectionId: args.connectionId,
482
+ mode: "manual",
483
+ triggerSource: "manual:syncConnection",
484
+ windowStart: startDate,
485
+ windowEnd: endDate,
486
+ });
487
+ return {
488
+ syncJobId: String(result.syncJobId),
489
+ workflowId: result.workflowId,
490
+ deduped: result.deduped,
491
+ };
492
+ },
493
+ });
494
+ export const syncAllActive = action({
495
+ args: {
496
+ clientCredentials: v.object({
497
+ strava: v.optional(v.object({
498
+ clientId: v.string(),
499
+ clientSecret: v.string(),
500
+ })),
501
+ garmin: v.optional(v.object({
502
+ clientId: v.string(),
503
+ clientSecret: v.string(),
504
+ })),
505
+ polar: v.optional(v.object({
506
+ clientId: v.string(),
507
+ clientSecret: v.string(),
508
+ })),
509
+ whoop: v.optional(v.object({
510
+ clientId: v.string(),
511
+ clientSecret: v.string(),
512
+ })),
513
+ suunto: v.optional(v.object({
514
+ clientId: v.string(),
515
+ clientSecret: v.string(),
516
+ subscriptionKey: v.optional(v.string()),
517
+ })),
518
+ }),
519
+ syncWindowHours: v.optional(v.number()),
520
+ },
521
+ returns: v.object({
522
+ enqueued: v.number(),
523
+ deduped: v.number(),
524
+ skipped: v.number(),
525
+ }),
526
+ handler: async (ctx, args) => {
527
+ const activeConnections = await ctx.runQuery(internal.connections.getAllActive, {});
528
+ const endDate = Date.now();
529
+ let enqueued = 0;
530
+ let deduped = 0;
531
+ let skipped = 0;
532
+ for (const conn of activeConnections) {
533
+ const creds = args.clientCredentials[conn.provider];
534
+ if (creds) {
535
+ await ctx.runMutation(internal.providerSettings.upsertCredentials, {
536
+ provider: conn.provider,
537
+ clientId: creds.clientId,
538
+ clientSecret: creds.clientSecret,
539
+ subscriptionKey: "subscriptionKey" in creds ? creds.subscriptionKey : undefined,
540
+ });
541
+ }
542
+ else {
543
+ const stored = await ctx.runQuery(internal.providerSettings.getCredentials, {
544
+ provider: conn.provider,
545
+ });
546
+ if (!stored) {
547
+ skipped += 1;
548
+ continue;
549
+ }
550
+ }
551
+ if (!getProvider(conn.provider)) {
552
+ skipped += 1;
553
+ continue;
554
+ }
555
+ const windowMs = (args.syncWindowHours ?? DEFAULT_SYNC_WINDOW_HOURS) * 60 * 60 * 1000;
556
+ const startDate = Math.max(conn.lastSyncedAt ?? endDate - windowMs, endDate - windowMs);
557
+ try {
558
+ const result = await ctx.runMutation(internal.syncWorkflow.requestConnectionSync, {
559
+ connectionId: conn._id,
560
+ mode: "cron",
561
+ triggerSource: "cron:syncAllActive",
562
+ windowStart: startDate,
563
+ windowEnd: endDate,
564
+ });
565
+ if (result.deduped) {
566
+ deduped += 1;
567
+ }
568
+ else {
569
+ enqueued += 1;
570
+ }
571
+ }
572
+ catch {
573
+ skipped += 1;
574
+ }
575
+ }
576
+ return { enqueued, deduped, skipped };
577
+ },
578
+ });
579
+ //# sourceMappingURL=syncWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncWorkflow.js","sourceRoot":"","sources":["../../src/component/syncWorkflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { WorkflowManager } from "@convex-dev/workflow";
2
+ export declare const durableWorkflow: WorkflowManager;
3
+ //# sourceMappingURL=workflowManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowManager.d.ts","sourceRoot":"","sources":["../../src/component/workflowManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQvD,eAAO,MAAM,eAAe,iBAU1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { WorkflowManager } from "@convex-dev/workflow";
2
+ import { components } from "./_generated/api";
3
+ // In this package, generated child components are typed as AnyComponents,
4
+ // so we narrow the installed workflow child component explicitly here.
5
+ const workflowComponent = components.workflow;
6
+ export const durableWorkflow = new WorkflowManager(workflowComponent, {
7
+ workpoolOptions: {
8
+ maxParallelism: 5,
9
+ retryActionsByDefault: true,
10
+ defaultRetryBehavior: {
11
+ maxAttempts: 4,
12
+ initialBackoffMs: 1_000,
13
+ base: 2,
14
+ },
15
+ },
16
+ });
17
+ //# sourceMappingURL=workflowManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowManager.js","sourceRoot":"","sources":["../../src/component/workflowManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,0EAA0E;AAC1E,uEAAuE;AACvE,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAuD,CAAC;AAE7F,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,iBAAiB,EAAE;IACpE,eAAe,EAAE;QACf,cAAc,EAAE,CAAC;QACjB,qBAAqB,EAAE,IAAI;QAC3B,oBAAoB,EAAE;YACpB,WAAW,EAAE,CAAC;YACd,gBAAgB,EAAE,KAAK;YACvB,IAAI,EAAE,CAAC;SACR;KACF;CACF,CAAC,CAAC"}