convex-batch-processor 1.0.2

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/dist/client/index.d.ts +194 -0
  4. package/dist/client/index.d.ts.map +1 -0
  5. package/dist/client/index.js +75 -0
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/component/_generated/api.d.ts +34 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -0
  9. package/dist/component/_generated/api.js +31 -0
  10. package/dist/component/_generated/api.js.map +1 -0
  11. package/dist/component/_generated/component.d.ts +77 -0
  12. package/dist/component/_generated/component.d.ts.map +1 -0
  13. package/dist/component/_generated/component.js +11 -0
  14. package/dist/component/_generated/component.js.map +1 -0
  15. package/dist/component/_generated/dataModel.d.ts +46 -0
  16. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  17. package/dist/component/_generated/dataModel.js +11 -0
  18. package/dist/component/_generated/dataModel.js.map +1 -0
  19. package/dist/component/_generated/server.d.ts +121 -0
  20. package/dist/component/_generated/server.d.ts.map +1 -0
  21. package/dist/component/_generated/server.js +78 -0
  22. package/dist/component/_generated/server.js.map +1 -0
  23. package/dist/component/convex.config.d.ts +3 -0
  24. package/dist/component/convex.config.d.ts.map +1 -0
  25. package/dist/component/convex.config.js +3 -0
  26. package/dist/component/convex.config.js.map +1 -0
  27. package/dist/component/lib.d.ts +261 -0
  28. package/dist/component/lib.d.ts.map +1 -0
  29. package/dist/component/lib.js +629 -0
  30. package/dist/component/lib.js.map +1 -0
  31. package/dist/component/schema.d.ts +100 -0
  32. package/dist/component/schema.d.ts.map +1 -0
  33. package/dist/component/schema.js +49 -0
  34. package/dist/component/schema.js.map +1 -0
  35. package/package.json +63 -0
  36. package/src/client/index.test.ts +121 -0
  37. package/src/client/index.ts +308 -0
  38. package/src/component/_generated/api.ts +50 -0
  39. package/src/component/_generated/component.ts +133 -0
  40. package/src/component/_generated/dataModel.ts +60 -0
  41. package/src/component/_generated/server.ts +156 -0
  42. package/src/component/convex.config.ts +3 -0
  43. package/src/component/lib.ts +792 -0
  44. package/src/component/schema.ts +57 -0
@@ -0,0 +1,629 @@
1
+ import { mutation, query, internalAction, internalMutation, internalQuery, } from "./_generated/server";
2
+ import { internal } from "./_generated/api";
3
+ import { v } from "convex/values";
4
+ // ============================================================================
5
+ // Batch Accumulator - Public API
6
+ // ============================================================================
7
+ export const addItems = mutation({
8
+ args: {
9
+ batchId: v.string(),
10
+ items: v.array(v.any()),
11
+ config: v.object({
12
+ maxBatchSize: v.number(),
13
+ flushIntervalMs: v.number(),
14
+ processBatchHandle: v.string(),
15
+ }),
16
+ },
17
+ handler: async (ctx, { batchId, items, config }) => {
18
+ const now = Date.now();
19
+ let batch = await ctx.db
20
+ .query("batches")
21
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
22
+ .first();
23
+ let isNewBatch = false;
24
+ if (!batch) {
25
+ isNewBatch = true;
26
+ const batchDocId = await ctx.db.insert("batches", {
27
+ batchId,
28
+ items: [],
29
+ itemCount: 0,
30
+ createdAt: now,
31
+ lastUpdatedAt: now,
32
+ status: "accumulating",
33
+ config,
34
+ });
35
+ batch = await ctx.db.get(batchDocId);
36
+ }
37
+ if (!batch) {
38
+ throw new Error(`Failed to create batch ${batchId}`);
39
+ }
40
+ // Reset completed batches to accumulating so they can accept new items
41
+ if (batch.status === "completed") {
42
+ await ctx.db.patch(batch._id, {
43
+ status: "accumulating",
44
+ items: [],
45
+ itemCount: 0,
46
+ lastUpdatedAt: now,
47
+ });
48
+ batch = await ctx.db.get(batch._id);
49
+ if (!batch) {
50
+ throw new Error(`Failed to reset batch ${batchId}`);
51
+ }
52
+ }
53
+ if (batch.status !== "accumulating") {
54
+ throw new Error(`Batch ${batchId} is not in accumulating state (current: ${batch.status})`);
55
+ }
56
+ const newItems = [...batch.items, ...items];
57
+ const newItemCount = newItems.length;
58
+ if (newItemCount >= config.maxBatchSize) {
59
+ if (batch.scheduledFlushId) {
60
+ await ctx.scheduler.cancel(batch.scheduledFlushId);
61
+ }
62
+ await ctx.db.patch(batch._id, {
63
+ items: newItems,
64
+ itemCount: newItemCount,
65
+ lastUpdatedAt: now,
66
+ status: "flushing",
67
+ scheduledFlushId: undefined,
68
+ });
69
+ await ctx.scheduler.runAfter(0, internal.lib.executeFlush, {
70
+ batchDocId: batch._id,
71
+ items: newItems,
72
+ processBatchHandle: config.processBatchHandle,
73
+ });
74
+ return {
75
+ batchId,
76
+ itemCount: newItemCount,
77
+ flushed: true,
78
+ status: "flushing",
79
+ };
80
+ }
81
+ let scheduledFlushId = batch.scheduledFlushId;
82
+ const shouldScheduleFlush = config.flushIntervalMs > 0 &&
83
+ !scheduledFlushId &&
84
+ (isNewBatch || batch.itemCount === 0);
85
+ if (shouldScheduleFlush) {
86
+ scheduledFlushId = await ctx.scheduler.runAfter(config.flushIntervalMs, internal.lib.scheduledIntervalFlush, { batchDocId: batch._id });
87
+ }
88
+ await ctx.db.patch(batch._id, {
89
+ items: newItems,
90
+ itemCount: newItemCount,
91
+ lastUpdatedAt: now,
92
+ config,
93
+ scheduledFlushId,
94
+ });
95
+ return {
96
+ batchId,
97
+ itemCount: newItemCount,
98
+ flushed: false,
99
+ status: "accumulating",
100
+ };
101
+ },
102
+ });
103
+ export const flushBatch = mutation({
104
+ args: { batchId: v.string() },
105
+ handler: async (ctx, { batchId }) => {
106
+ const batch = await ctx.db
107
+ .query("batches")
108
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
109
+ .first();
110
+ if (!batch) {
111
+ throw new Error(`Batch ${batchId} not found`);
112
+ }
113
+ if (batch.status !== "accumulating") {
114
+ throw new Error(`Batch ${batchId} is not in accumulating state (current: ${batch.status})`);
115
+ }
116
+ if (batch.itemCount === 0) {
117
+ return { batchId, itemCount: 0, flushed: false, reason: "Batch is empty" };
118
+ }
119
+ if (!batch.config.processBatchHandle) {
120
+ throw new Error(`Batch ${batchId} has no processBatchHandle configured`);
121
+ }
122
+ if (batch.scheduledFlushId) {
123
+ await ctx.scheduler.cancel(batch.scheduledFlushId);
124
+ }
125
+ await ctx.db.patch(batch._id, {
126
+ status: "flushing",
127
+ scheduledFlushId: undefined,
128
+ });
129
+ await ctx.scheduler.runAfter(0, internal.lib.executeFlush, {
130
+ batchDocId: batch._id,
131
+ items: batch.items,
132
+ processBatchHandle: batch.config.processBatchHandle,
133
+ });
134
+ return {
135
+ batchId,
136
+ itemCount: batch.itemCount,
137
+ flushed: true,
138
+ status: "flushing",
139
+ };
140
+ },
141
+ });
142
+ export const getBatchStatus = query({
143
+ args: { batchId: v.string() },
144
+ handler: async (ctx, { batchId }) => {
145
+ const batch = await ctx.db
146
+ .query("batches")
147
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
148
+ .first();
149
+ if (!batch) {
150
+ return null;
151
+ }
152
+ return {
153
+ batchId: batch.batchId,
154
+ itemCount: batch.itemCount,
155
+ status: batch.status,
156
+ createdAt: batch.createdAt,
157
+ lastUpdatedAt: batch.lastUpdatedAt,
158
+ config: batch.config,
159
+ };
160
+ },
161
+ });
162
+ export const getFlushHistory = query({
163
+ args: {
164
+ batchId: v.string(),
165
+ limit: v.optional(v.number()),
166
+ },
167
+ handler: async (ctx, { batchId, limit }) => {
168
+ let query = ctx.db
169
+ .query("flushHistory")
170
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
171
+ .order("desc");
172
+ if (limit) {
173
+ return await query.take(limit);
174
+ }
175
+ return await query.collect();
176
+ },
177
+ });
178
+ export const deleteBatch = mutation({
179
+ args: { batchId: v.string() },
180
+ handler: async (ctx, { batchId }) => {
181
+ const batch = await ctx.db
182
+ .query("batches")
183
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
184
+ .first();
185
+ if (!batch) {
186
+ return { deleted: false, reason: "Batch not found" };
187
+ }
188
+ if (batch.status === "flushing") {
189
+ return { deleted: false, reason: "Cannot delete batch while flushing" };
190
+ }
191
+ if (batch.status === "accumulating" && batch.itemCount > 0) {
192
+ return { deleted: false, reason: "Cannot delete batch with pending items" };
193
+ }
194
+ if (batch.scheduledFlushId) {
195
+ await ctx.scheduler.cancel(batch.scheduledFlushId);
196
+ }
197
+ await ctx.db.delete(batch._id);
198
+ return { deleted: true };
199
+ },
200
+ });
201
+ // ============================================================================
202
+ // Batch Accumulator - Internal Functions
203
+ // ============================================================================
204
+ export const getBatch = internalQuery({
205
+ args: { batchId: v.string() },
206
+ handler: async (ctx, { batchId }) => {
207
+ return await ctx.db
208
+ .query("batches")
209
+ .withIndex("by_batchId", (q) => q.eq("batchId", batchId))
210
+ .first();
211
+ },
212
+ });
213
+ export const executeFlush = internalAction({
214
+ args: {
215
+ batchDocId: v.id("batches"),
216
+ items: v.array(v.any()),
217
+ processBatchHandle: v.string(),
218
+ },
219
+ handler: async (ctx, { batchDocId, items, processBatchHandle }) => {
220
+ const startTime = Date.now();
221
+ let success = true;
222
+ let errorMessage;
223
+ try {
224
+ const handle = processBatchHandle;
225
+ await ctx.runAction(handle, { items });
226
+ }
227
+ catch (error) {
228
+ success = false;
229
+ errorMessage = error instanceof Error ? error.message : String(error);
230
+ }
231
+ const durationMs = Date.now() - startTime;
232
+ await ctx.runMutation(internal.lib.recordFlushResult, {
233
+ batchDocId,
234
+ itemCount: items.length,
235
+ durationMs,
236
+ success,
237
+ errorMessage,
238
+ });
239
+ return { success, errorMessage, durationMs };
240
+ },
241
+ });
242
+ export const recordFlushResult = internalMutation({
243
+ args: {
244
+ batchDocId: v.id("batches"),
245
+ itemCount: v.number(),
246
+ durationMs: v.number(),
247
+ success: v.boolean(),
248
+ errorMessage: v.optional(v.string()),
249
+ },
250
+ handler: async (ctx, { batchDocId, itemCount, durationMs, success, errorMessage }) => {
251
+ const batch = await ctx.db.get(batchDocId);
252
+ if (!batch)
253
+ return;
254
+ await ctx.db.insert("flushHistory", {
255
+ batchId: batch.batchId,
256
+ itemCount,
257
+ flushedAt: Date.now(),
258
+ durationMs,
259
+ success,
260
+ errorMessage,
261
+ });
262
+ if (success) {
263
+ await ctx.db.patch(batchDocId, {
264
+ status: "completed",
265
+ items: [],
266
+ itemCount: 0,
267
+ scheduledFlushId: undefined,
268
+ });
269
+ }
270
+ else {
271
+ let scheduledFlushId = undefined;
272
+ if (batch.config.flushIntervalMs > 0 && batch.config.processBatchHandle) {
273
+ scheduledFlushId = await ctx.scheduler.runAfter(batch.config.flushIntervalMs, internal.lib.scheduledIntervalFlush, { batchDocId });
274
+ }
275
+ await ctx.db.patch(batchDocId, {
276
+ status: "accumulating",
277
+ scheduledFlushId,
278
+ });
279
+ }
280
+ },
281
+ });
282
+ export const markBatchFlushing = internalMutation({
283
+ args: { batchDocId: v.id("batches") },
284
+ handler: async (ctx, { batchDocId }) => {
285
+ const batch = await ctx.db.get(batchDocId);
286
+ if (!batch || batch.status !== "accumulating" || batch.itemCount === 0) {
287
+ return null;
288
+ }
289
+ await ctx.db.patch(batchDocId, {
290
+ status: "flushing",
291
+ scheduledFlushId: undefined,
292
+ });
293
+ return {
294
+ items: batch.items,
295
+ processBatchHandle: batch.config.processBatchHandle,
296
+ };
297
+ },
298
+ });
299
+ export const scheduledIntervalFlush = internalAction({
300
+ args: { batchDocId: v.id("batches") },
301
+ handler: async (ctx, { batchDocId }) => {
302
+ const batchData = await ctx.runMutation(internal.lib.markBatchFlushing, {
303
+ batchDocId,
304
+ });
305
+ if (!batchData || !batchData.processBatchHandle) {
306
+ return { flushed: false, reason: "Batch not ready for flush" };
307
+ }
308
+ const result = await ctx.runAction(internal.lib.executeFlush, {
309
+ batchDocId,
310
+ items: batchData.items,
311
+ processBatchHandle: batchData.processBatchHandle,
312
+ });
313
+ return { flushed: true, ...result };
314
+ },
315
+ });
316
+ // ============================================================================
317
+ // Table Iterator - Public API
318
+ // ============================================================================
319
+ export const startIteratorJob = mutation({
320
+ args: {
321
+ jobId: v.string(),
322
+ config: v.object({
323
+ batchSize: v.number(),
324
+ delayBetweenBatchesMs: v.optional(v.number()),
325
+ getNextBatchHandle: v.string(),
326
+ processBatchHandle: v.string(),
327
+ onCompleteHandle: v.optional(v.string()),
328
+ maxRetries: v.optional(v.number()),
329
+ }),
330
+ },
331
+ handler: async (ctx, { jobId, config }) => {
332
+ const existingJob = await ctx.db
333
+ .query("iteratorJobs")
334
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
335
+ .first();
336
+ if (existingJob) {
337
+ throw new Error(`Job ${jobId} already exists`);
338
+ }
339
+ const now = Date.now();
340
+ const jobDocId = await ctx.db.insert("iteratorJobs", {
341
+ jobId,
342
+ cursor: undefined,
343
+ processedCount: 0,
344
+ status: "running",
345
+ config: {
346
+ batchSize: config.batchSize,
347
+ delayBetweenBatchesMs: config.delayBetweenBatchesMs ?? 100,
348
+ getNextBatchHandle: config.getNextBatchHandle,
349
+ processBatchHandle: config.processBatchHandle,
350
+ onCompleteHandle: config.onCompleteHandle,
351
+ maxRetries: config.maxRetries,
352
+ },
353
+ retryCount: 0,
354
+ createdAt: now,
355
+ lastRunAt: now,
356
+ });
357
+ await ctx.scheduler.runAfter(0, internal.lib.processNextBatch, { jobDocId });
358
+ return { jobId, status: "running" };
359
+ },
360
+ });
361
+ export const pauseIteratorJob = mutation({
362
+ args: { jobId: v.string() },
363
+ handler: async (ctx, { jobId }) => {
364
+ const job = await ctx.db
365
+ .query("iteratorJobs")
366
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
367
+ .first();
368
+ if (!job) {
369
+ throw new Error(`Job ${jobId} not found`);
370
+ }
371
+ if (job.status !== "running") {
372
+ throw new Error(`Job ${jobId} is not running (current: ${job.status})`);
373
+ }
374
+ await ctx.db.patch(job._id, {
375
+ status: "paused",
376
+ });
377
+ return { jobId, status: "paused" };
378
+ },
379
+ });
380
+ export const resumeIteratorJob = mutation({
381
+ args: { jobId: v.string() },
382
+ handler: async (ctx, { jobId }) => {
383
+ const job = await ctx.db
384
+ .query("iteratorJobs")
385
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
386
+ .first();
387
+ if (!job) {
388
+ throw new Error(`Job ${jobId} not found`);
389
+ }
390
+ if (job.status !== "paused") {
391
+ throw new Error(`Job ${jobId} is not paused (current: ${job.status})`);
392
+ }
393
+ await ctx.db.patch(job._id, {
394
+ status: "running",
395
+ retryCount: 0,
396
+ });
397
+ await ctx.scheduler.runAfter(0, internal.lib.processNextBatch, { jobDocId: job._id });
398
+ return { jobId, status: "running" };
399
+ },
400
+ });
401
+ export const cancelIteratorJob = mutation({
402
+ args: { jobId: v.string() },
403
+ handler: async (ctx, { jobId }) => {
404
+ const job = await ctx.db
405
+ .query("iteratorJobs")
406
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
407
+ .first();
408
+ if (!job) {
409
+ throw new Error(`Job ${jobId} not found`);
410
+ }
411
+ if (job.status === "completed" || job.status === "failed") {
412
+ return { jobId, status: job.status, reason: "Job already finished" };
413
+ }
414
+ await ctx.db.patch(job._id, {
415
+ status: "failed",
416
+ errorMessage: "Cancelled by user",
417
+ });
418
+ return { jobId, status: "failed" };
419
+ },
420
+ });
421
+ export const getIteratorJobStatus = query({
422
+ args: { jobId: v.string() },
423
+ handler: async (ctx, { jobId }) => {
424
+ const job = await ctx.db
425
+ .query("iteratorJobs")
426
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
427
+ .first();
428
+ if (!job) {
429
+ return null;
430
+ }
431
+ return {
432
+ jobId: job.jobId,
433
+ status: job.status,
434
+ processedCount: job.processedCount,
435
+ cursor: job.cursor,
436
+ retryCount: job.retryCount,
437
+ errorMessage: job.errorMessage,
438
+ createdAt: job.createdAt,
439
+ lastRunAt: job.lastRunAt,
440
+ config: {
441
+ batchSize: job.config.batchSize,
442
+ delayBetweenBatchesMs: job.config.delayBetweenBatchesMs,
443
+ },
444
+ };
445
+ },
446
+ });
447
+ export const listIteratorJobs = query({
448
+ args: {
449
+ status: v.optional(v.union(v.literal("pending"), v.literal("running"), v.literal("paused"), v.literal("completed"), v.literal("failed"))),
450
+ limit: v.optional(v.number()),
451
+ },
452
+ handler: async (ctx, { status, limit }) => {
453
+ let queryBuilder;
454
+ if (status) {
455
+ queryBuilder = ctx.db
456
+ .query("iteratorJobs")
457
+ .withIndex("by_status", (q) => q.eq("status", status));
458
+ }
459
+ else {
460
+ queryBuilder = ctx.db.query("iteratorJobs");
461
+ }
462
+ const jobs = limit ? await queryBuilder.take(limit) : await queryBuilder.collect();
463
+ return jobs.map((job) => ({
464
+ jobId: job.jobId,
465
+ status: job.status,
466
+ processedCount: job.processedCount,
467
+ createdAt: job.createdAt,
468
+ lastRunAt: job.lastRunAt,
469
+ errorMessage: job.errorMessage,
470
+ }));
471
+ },
472
+ });
473
+ export const deleteIteratorJob = mutation({
474
+ args: { jobId: v.string() },
475
+ handler: async (ctx, { jobId }) => {
476
+ const job = await ctx.db
477
+ .query("iteratorJobs")
478
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
479
+ .first();
480
+ if (!job) {
481
+ return { deleted: false, reason: "Job not found" };
482
+ }
483
+ if (job.status === "running" || job.status === "paused") {
484
+ return { deleted: false, reason: "Cannot delete active job" };
485
+ }
486
+ await ctx.db.delete(job._id);
487
+ return { deleted: true };
488
+ },
489
+ });
490
+ // ============================================================================
491
+ // Table Iterator - Internal Functions
492
+ // ============================================================================
493
+ export const getIteratorJob = internalQuery({
494
+ args: { jobId: v.string() },
495
+ handler: async (ctx, { jobId }) => {
496
+ return await ctx.db
497
+ .query("iteratorJobs")
498
+ .withIndex("by_jobId", (q) => q.eq("jobId", jobId))
499
+ .first();
500
+ },
501
+ });
502
+ export const getIteratorJobById = internalQuery({
503
+ args: { jobDocId: v.id("iteratorJobs") },
504
+ handler: async (ctx, { jobDocId }) => {
505
+ return await ctx.db.get(jobDocId);
506
+ },
507
+ });
508
+ export const processNextBatch = internalAction({
509
+ args: { jobDocId: v.id("iteratorJobs") },
510
+ handler: async (ctx, { jobDocId }) => {
511
+ const job = await ctx.runQuery(internal.lib.getIteratorJobById, { jobDocId });
512
+ if (!job || job.status !== "running") {
513
+ return { processed: false, reason: "Job not found or not running" };
514
+ }
515
+ const maxRetries = job.config.maxRetries ?? 5;
516
+ try {
517
+ const getNextBatchHandle = job.config.getNextBatchHandle;
518
+ const batchResult = await ctx.runQuery(getNextBatchHandle, {
519
+ cursor: job.cursor ?? undefined,
520
+ batchSize: job.config.batchSize,
521
+ });
522
+ const { items, cursor: nextCursor, done } = batchResult;
523
+ if (items.length > 0) {
524
+ const processBatchHandle = job.config.processBatchHandle;
525
+ await ctx.runAction(processBatchHandle, { items });
526
+ }
527
+ const newProcessedCount = job.processedCount + items.length;
528
+ if (done) {
529
+ await ctx.runMutation(internal.lib.markJobCompleted, {
530
+ jobDocId,
531
+ processedCount: newProcessedCount,
532
+ });
533
+ if (job.config.onCompleteHandle) {
534
+ const onCompleteHandle = job.config.onCompleteHandle;
535
+ await ctx.runMutation(onCompleteHandle, {
536
+ jobId: job.jobId,
537
+ processedCount: newProcessedCount,
538
+ });
539
+ }
540
+ return { processed: true, done: true, processedCount: newProcessedCount };
541
+ }
542
+ await ctx.runMutation(internal.lib.updateJobProgress, {
543
+ jobDocId,
544
+ cursor: nextCursor,
545
+ processedCount: newProcessedCount,
546
+ });
547
+ await ctx.scheduler.runAfter(job.config.delayBetweenBatchesMs, internal.lib.processNextBatch, { jobDocId });
548
+ return { processed: true, done: false, processedCount: newProcessedCount };
549
+ }
550
+ catch (error) {
551
+ const errorMessage = error instanceof Error ? error.message : String(error);
552
+ const newRetryCount = job.retryCount + 1;
553
+ if (newRetryCount >= maxRetries) {
554
+ await ctx.runMutation(internal.lib.markJobFailed, {
555
+ jobDocId,
556
+ errorMessage,
557
+ retryCount: newRetryCount,
558
+ });
559
+ return { processed: false, reason: "Max retries exceeded", error: errorMessage };
560
+ }
561
+ const backoffMs = Math.min(1000 * Math.pow(2, newRetryCount), 30000);
562
+ await ctx.runMutation(internal.lib.incrementRetryCount, {
563
+ jobDocId,
564
+ retryCount: newRetryCount,
565
+ errorMessage,
566
+ });
567
+ await ctx.scheduler.runAfter(backoffMs, internal.lib.processNextBatch, { jobDocId });
568
+ return { processed: false, reason: "Retrying", error: errorMessage, retryCount: newRetryCount };
569
+ }
570
+ },
571
+ });
572
+ export const updateJobProgress = internalMutation({
573
+ args: {
574
+ jobDocId: v.id("iteratorJobs"),
575
+ cursor: v.optional(v.string()),
576
+ processedCount: v.number(),
577
+ },
578
+ handler: async (ctx, { jobDocId, cursor, processedCount }) => {
579
+ await ctx.db.patch(jobDocId, {
580
+ cursor,
581
+ processedCount,
582
+ lastRunAt: Date.now(),
583
+ retryCount: 0,
584
+ });
585
+ },
586
+ });
587
+ export const markJobCompleted = internalMutation({
588
+ args: {
589
+ jobDocId: v.id("iteratorJobs"),
590
+ processedCount: v.number(),
591
+ },
592
+ handler: async (ctx, { jobDocId, processedCount }) => {
593
+ await ctx.db.patch(jobDocId, {
594
+ status: "completed",
595
+ processedCount,
596
+ lastRunAt: Date.now(),
597
+ });
598
+ },
599
+ });
600
+ export const markJobFailed = internalMutation({
601
+ args: {
602
+ jobDocId: v.id("iteratorJobs"),
603
+ errorMessage: v.string(),
604
+ retryCount: v.number(),
605
+ },
606
+ handler: async (ctx, { jobDocId, errorMessage, retryCount }) => {
607
+ await ctx.db.patch(jobDocId, {
608
+ status: "failed",
609
+ errorMessage,
610
+ retryCount,
611
+ lastRunAt: Date.now(),
612
+ });
613
+ },
614
+ });
615
+ export const incrementRetryCount = internalMutation({
616
+ args: {
617
+ jobDocId: v.id("iteratorJobs"),
618
+ retryCount: v.number(),
619
+ errorMessage: v.string(),
620
+ },
621
+ handler: async (ctx, { jobDocId, retryCount, errorMessage }) => {
622
+ await ctx.db.patch(jobDocId, {
623
+ retryCount,
624
+ errorMessage,
625
+ lastRunAt: Date.now(),
626
+ });
627
+ },
628
+ });
629
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}