@fatagnus/dink-convex 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +282 -0
  3. package/convex/convex.config.ts +23 -0
  4. package/convex/crons.ts +37 -0
  5. package/convex/http.ts +421 -0
  6. package/convex/index.ts +20 -0
  7. package/convex/install.ts +172 -0
  8. package/convex/outbox.ts +198 -0
  9. package/convex/outboxProcessor.ts +240 -0
  10. package/convex/schema.ts +97 -0
  11. package/convex/sync.ts +327 -0
  12. package/dist/component.d.ts +34 -0
  13. package/dist/component.d.ts.map +1 -0
  14. package/dist/component.js +35 -0
  15. package/dist/component.js.map +1 -0
  16. package/dist/crdt.d.ts +82 -0
  17. package/dist/crdt.d.ts.map +1 -0
  18. package/dist/crdt.js +134 -0
  19. package/dist/crdt.js.map +1 -0
  20. package/dist/factories.d.ts +80 -0
  21. package/dist/factories.d.ts.map +1 -0
  22. package/dist/factories.js +159 -0
  23. package/dist/factories.js.map +1 -0
  24. package/dist/http.d.ts +238 -0
  25. package/dist/http.d.ts.map +1 -0
  26. package/dist/http.js +222 -0
  27. package/dist/http.js.map +1 -0
  28. package/dist/httpFactory.d.ts +39 -0
  29. package/dist/httpFactory.d.ts.map +1 -0
  30. package/dist/httpFactory.js +128 -0
  31. package/dist/httpFactory.js.map +1 -0
  32. package/dist/index.d.ts +68 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +73 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/schema.d.ts +217 -0
  37. package/dist/schema.d.ts.map +1 -0
  38. package/dist/schema.js +195 -0
  39. package/dist/schema.js.map +1 -0
  40. package/dist/syncFactories.d.ts +240 -0
  41. package/dist/syncFactories.d.ts.map +1 -0
  42. package/dist/syncFactories.js +623 -0
  43. package/dist/syncFactories.js.map +1 -0
  44. package/dist/triggers.d.ts +442 -0
  45. package/dist/triggers.d.ts.map +1 -0
  46. package/dist/triggers.js +705 -0
  47. package/dist/triggers.js.map +1 -0
  48. package/package.json +108 -0
  49. package/scripts/check-peer-deps.cjs +132 -0
@@ -0,0 +1,623 @@
1
+ /**
2
+ * Sync factories for @fatagnus/dink-convex component.
3
+ *
4
+ * These factories create Convex function definitions using the user's
5
+ * _generated imports, keeping all complex logic in the package while
6
+ * reducing user boilerplate to ~5 lines per file.
7
+ *
8
+ * @module syncFactories
9
+ */
10
+ import { v } from "convex/values";
11
+ import { httpRouter, cronJobs } from "convex/server";
12
+ import * as Y from "yjs";
13
+ /**
14
+ * Internal fields that should not be written to user tables.
15
+ */
16
+ const INTERNAL_SYNC_FIELDS = new Set([
17
+ "_collection",
18
+ "syncId",
19
+ "_deleted",
20
+ "_deletedAt",
21
+ ]);
22
+ /**
23
+ * Extract user-facing fields from Yjs document, excluding internal sync metadata.
24
+ */
25
+ function extractUserFields(fields) {
26
+ const userFields = {};
27
+ fields.forEach((value, key) => {
28
+ if (!INTERNAL_SYNC_FIELDS.has(key) && !key.startsWith("_removed_")) {
29
+ userFields[key] = value;
30
+ }
31
+ });
32
+ return userFields;
33
+ }
34
+ /**
35
+ * Create sync mutations and queries.
36
+ *
37
+ * Returns the Convex function definitions for handling CRDT delta operations.
38
+ * The applyDeltaFromEdge mutation skips outbox queueing to prevent sync loops.
39
+ *
40
+ * @param input - Object containing mutation and query builders from _generated/server
41
+ * @returns Object with applyDeltaFromEdge, getDocumentState, listDocuments, listDocumentsPaginated
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // convex/sync.ts (~5 lines!)
46
+ * import { createSyncMutations } from "@fatagnus/dink-convex";
47
+ * import { mutation, query } from "./_generated/server";
48
+ *
49
+ * export const { applyDeltaFromEdge, getDocumentState, listDocuments, listDocumentsPaginated } =
50
+ * createSyncMutations({ mutation, query });
51
+ * ```
52
+ */
53
+ export function createSyncMutations(input) {
54
+ const { mutation, query } = input;
55
+ /**
56
+ * Get the next sequence number for a collection.
57
+ */
58
+ async function getNextSeq(ctx) {
59
+ const latest = await ctx.db
60
+ .query("sync_deltas")
61
+ .order("desc")
62
+ .first();
63
+ return (latest?.seq ?? 0) + 1;
64
+ }
65
+ /**
66
+ * Materialize a CRDT delta to the user table.
67
+ */
68
+ async function materializeToUserTable(db, collection, docId, bytes) {
69
+ const ydoc = new Y.Doc();
70
+ const updateBytes = new Uint8Array(bytes);
71
+ try {
72
+ // Try V2 format first (used by @fatagnus/dink-sync SDK), fall back to V1
73
+ try {
74
+ Y.applyUpdateV2(ydoc, updateBytes);
75
+ }
76
+ catch {
77
+ Y.applyUpdate(ydoc, updateBytes);
78
+ }
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : "Unknown error";
82
+ throw new Error(`Invalid CRDT delta bytes for document "${docId}" in collection "${collection}": ${message}`);
83
+ }
84
+ const fields = ydoc.getMap("fields");
85
+ const isDeleted = fields.get("_deleted") === true;
86
+ const existing = await db
87
+ .query(collection)
88
+ .withIndex("by_syncId", (q) => q.eq("syncId", docId))
89
+ .first();
90
+ if (isDeleted) {
91
+ if (existing) {
92
+ await db.delete(existing._id);
93
+ }
94
+ return;
95
+ }
96
+ const userFields = extractUserFields(fields);
97
+ if (existing) {
98
+ const patchFields = { ...userFields };
99
+ fields.forEach((value, key) => {
100
+ if (key.startsWith("_removed_") && value === true) {
101
+ const removedField = key.slice("_removed_".length);
102
+ patchFields[removedField] = undefined;
103
+ }
104
+ });
105
+ await db.patch(existing._id, patchFields);
106
+ }
107
+ else {
108
+ await db.insert(collection, {
109
+ ...userFields,
110
+ syncId: docId,
111
+ });
112
+ }
113
+ }
114
+ const applyDeltaFromEdge = mutation({
115
+ args: {
116
+ collection: v.string(),
117
+ docId: v.string(),
118
+ bytes: v.bytes(),
119
+ authToken: v.string(),
120
+ edgeId: v.optional(v.string()),
121
+ },
122
+ returns: v.object({
123
+ success: v.boolean(),
124
+ seq: v.number(),
125
+ }),
126
+ handler: async (ctx, args) => {
127
+ const expectedKey = process.env.DINK_APP_SYNC_KEY;
128
+ if (!expectedKey) {
129
+ throw new Error("DINK_APP_SYNC_KEY environment variable is not configured");
130
+ }
131
+ if (!args.authToken) {
132
+ throw new Error("Missing authentication token");
133
+ }
134
+ if (args.authToken !== expectedKey) {
135
+ throw new Error("Invalid authentication token");
136
+ }
137
+ const seq = await getNextSeq(ctx);
138
+ const timestamp = Date.now();
139
+ await ctx.db.insert("sync_deltas", {
140
+ collection: args.collection,
141
+ docId: args.docId,
142
+ bytes: args.bytes,
143
+ seq,
144
+ timestamp,
145
+ edgeId: args.edgeId,
146
+ });
147
+ await materializeToUserTable(ctx.db, args.collection, args.docId, args.bytes);
148
+ return { success: true, seq };
149
+ },
150
+ });
151
+ const getDocumentState = query({
152
+ args: {
153
+ collection: v.string(),
154
+ docId: v.string(),
155
+ },
156
+ returns: v.union(v.object({
157
+ bytes: v.bytes(),
158
+ seq: v.number(),
159
+ }), v.null()),
160
+ handler: async (ctx, args) => {
161
+ const deltas = await ctx.db
162
+ .query("sync_deltas")
163
+ .withIndex("by_docId", (q) => q.eq("collection", args.collection).eq("docId", args.docId))
164
+ .collect();
165
+ if (deltas.length === 0) {
166
+ return null;
167
+ }
168
+ let latestSeq = 0;
169
+ for (const delta of deltas) {
170
+ latestSeq = Math.max(latestSeq, delta.seq);
171
+ }
172
+ const latestDelta = deltas.find((d) => d.seq === latestSeq);
173
+ if (!latestDelta) {
174
+ return null;
175
+ }
176
+ return {
177
+ bytes: latestDelta.bytes,
178
+ seq: latestSeq,
179
+ };
180
+ },
181
+ });
182
+ const listDocuments = query({
183
+ args: {
184
+ collection: v.string(),
185
+ },
186
+ returns: v.array(v.object({
187
+ docId: v.string(),
188
+ seq: v.number(),
189
+ })),
190
+ handler: async (ctx, args) => {
191
+ const deltas = await ctx.db
192
+ .query("sync_deltas")
193
+ .withIndex("by_collection", (q) => q.eq("collection", args.collection))
194
+ .collect();
195
+ const docMap = new Map();
196
+ for (const delta of deltas) {
197
+ const existing = docMap.get(delta.docId) ?? 0;
198
+ docMap.set(delta.docId, Math.max(existing, delta.seq));
199
+ }
200
+ return Array.from(docMap.entries()).map(([docId, seq]) => ({
201
+ docId,
202
+ seq,
203
+ }));
204
+ },
205
+ });
206
+ const listDocumentsPaginated = query({
207
+ args: {
208
+ collection: v.string(),
209
+ cursor: v.optional(v.string()),
210
+ limit: v.optional(v.number()),
211
+ },
212
+ returns: v.object({
213
+ docIds: v.array(v.string()),
214
+ nextCursor: v.optional(v.string()),
215
+ }),
216
+ handler: async (ctx, args) => {
217
+ const limit = args.limit ?? 100;
218
+ const offset = args.cursor ? parseInt(args.cursor, 10) : 0;
219
+ if (isNaN(offset) || offset < 0) {
220
+ throw new Error("Invalid cursor");
221
+ }
222
+ const deltas = await ctx.db
223
+ .query("sync_deltas")
224
+ .withIndex("by_collection", (q) => q.eq("collection", args.collection))
225
+ .collect();
226
+ const docIdSet = new Set();
227
+ for (const delta of deltas) {
228
+ docIdSet.add(delta.docId);
229
+ }
230
+ const allDocIds = Array.from(docIdSet).sort();
231
+ const paginatedDocIds = allDocIds.slice(offset, offset + limit);
232
+ const hasMore = offset + limit < allDocIds.length;
233
+ return {
234
+ docIds: paginatedDocIds,
235
+ nextCursor: hasMore ? String(offset + limit) : undefined,
236
+ };
237
+ },
238
+ });
239
+ return {
240
+ applyDeltaFromEdge,
241
+ getDocumentState,
242
+ listDocuments,
243
+ listDocumentsPaginated,
244
+ };
245
+ }
246
+ /**
247
+ * Outbox status constants.
248
+ */
249
+ const OUTBOX_STATUS = {
250
+ PENDING: "pending",
251
+ SENT: "sent",
252
+ FAILED: "failed",
253
+ };
254
+ const MAX_RETRIES = 5;
255
+ const BASE_DELAY_MS = 1000;
256
+ const MAX_DELAY_MS = 5 * 60 * 1000;
257
+ const BATCH_SIZE = 50;
258
+ function calculateBackoffDelay(retries) {
259
+ const delay = BASE_DELAY_MS * Math.pow(2, retries);
260
+ return Math.min(delay, MAX_DELAY_MS);
261
+ }
262
+ function isDuplicate(item, sentItems) {
263
+ return sentItems.some((sent) => sent.docId === item.docId && sent.seq === item.seq);
264
+ }
265
+ function createPushPayload(item) {
266
+ const deltaArray = item.delta instanceof Uint8Array
267
+ ? item.delta
268
+ : new Uint8Array(item.delta);
269
+ return {
270
+ collection: item.collection,
271
+ docId: item.docId,
272
+ seq: item.seq,
273
+ bytes: Array.from(deltaArray),
274
+ };
275
+ }
276
+ function getNewStatus(success, currentRetries) {
277
+ if (success) {
278
+ return OUTBOX_STATUS.SENT;
279
+ }
280
+ if (currentRetries >= MAX_RETRIES) {
281
+ return OUTBOX_STATUS.FAILED;
282
+ }
283
+ return OUTBOX_STATUS.PENDING;
284
+ }
285
+ function buildPushUrl(baseUrl) {
286
+ const url = new URL("/api/sync/convex-push", baseUrl);
287
+ return url.toString();
288
+ }
289
+ /**
290
+ * Create outbox processor functions.
291
+ *
292
+ * Returns Convex function definitions for processing the sync_outbox table
293
+ * and pushing deltas to dinkd.
294
+ *
295
+ * @param input - Object containing internalAction, internalMutation, internalQuery, and internal API
296
+ * @returns Object with processOutboxBatch, queryPendingItems, updateItemStatus, scheduleOutboxProcessing
297
+ *
298
+ * @example
299
+ * ```typescript
300
+ * // convex/outboxProcessor.ts (~5 lines!)
301
+ * import { createOutboxProcessor } from "@fatagnus/dink-convex";
302
+ * import { internalAction, internalMutation, internalQuery } from "./_generated/server";
303
+ * import { internal } from "./_generated/api";
304
+ *
305
+ * export const { processOutboxBatch, queryPendingItems, updateItemStatus, scheduleOutboxProcessing } =
306
+ * createOutboxProcessor({ internalAction, internalMutation, internalQuery, internal });
307
+ * ```
308
+ */
309
+ export function createOutboxProcessor(input) {
310
+ const { internalAction, internalMutation, internalQuery, internal } = input;
311
+ const queryPendingItems = internalQuery({
312
+ args: {
313
+ limit: v.number(),
314
+ },
315
+ returns: v.array(v.object({
316
+ _id: v.id("sync_outbox"),
317
+ _creationTime: v.number(),
318
+ collection: v.string(),
319
+ docId: v.string(),
320
+ delta: v.bytes(),
321
+ seq: v.number(),
322
+ status: v.string(),
323
+ retries: v.number(),
324
+ createdAt: v.number(),
325
+ lastAttempt: v.optional(v.number()),
326
+ })),
327
+ handler: async (ctx, args) => {
328
+ const items = await ctx.db
329
+ .query("sync_outbox")
330
+ .withIndex("by_status", (q) => q.eq("status", OUTBOX_STATUS.PENDING))
331
+ .collect();
332
+ return items.slice(0, args.limit);
333
+ },
334
+ });
335
+ const updateItemStatus = internalMutation({
336
+ args: {
337
+ itemId: v.id("sync_outbox"),
338
+ status: v.string(),
339
+ retries: v.number(),
340
+ lastAttempt: v.number(),
341
+ },
342
+ returns: v.null(),
343
+ handler: async (ctx, args) => {
344
+ await ctx.db.patch(args.itemId, {
345
+ status: args.status,
346
+ retries: args.retries,
347
+ lastAttempt: args.lastAttempt,
348
+ });
349
+ return null;
350
+ },
351
+ });
352
+ const processOutboxBatch = internalAction({
353
+ args: {},
354
+ returns: v.object({
355
+ processed: v.number(),
356
+ sent: v.number(),
357
+ failed: v.number(),
358
+ skipped: v.number(),
359
+ error: v.optional(v.string()),
360
+ }),
361
+ handler: async (ctx) => {
362
+ console.log("[processOutboxBatch] Starting outbox processing...");
363
+ try {
364
+ const dinkHttpUrl = process.env.DINK_HTTP_URL;
365
+ const appSyncKey = process.env.DINK_APP_SYNC_KEY;
366
+ console.log(`[processOutboxBatch] DINK_HTTP_URL=${dinkHttpUrl ? "configured" : "NOT SET"}, DINK_APP_SYNC_KEY=${appSyncKey ? "configured" : "NOT SET"}`);
367
+ if (!dinkHttpUrl || !appSyncKey) {
368
+ console.log("[processOutboxBatch] DINK_HTTP_URL or DINK_APP_SYNC_KEY not configured, skipping");
369
+ return { processed: 0, sent: 0, failed: 0, skipped: 0 };
370
+ }
371
+ // Validate that internal API references are available
372
+ if (!internal?.outboxProcessor?.queryPendingItems) {
373
+ console.error("[processOutboxBatch] internal.outboxProcessor.queryPendingItems not available");
374
+ return { processed: 0, sent: 0, failed: 0, skipped: 0, error: "Internal API not initialized" };
375
+ }
376
+ let pendingItems;
377
+ try {
378
+ console.log("[processOutboxBatch] Querying pending items...");
379
+ pendingItems = (await ctx.runQuery(internal.outboxProcessor.queryPendingItems, { limit: BATCH_SIZE }));
380
+ console.log(`[processOutboxBatch] Found ${pendingItems?.length || 0} pending items`);
381
+ }
382
+ catch (queryError) {
383
+ console.error("[processOutboxBatch] Failed to query pending items:", queryError);
384
+ return { processed: 0, sent: 0, failed: 0, skipped: 0, error: `Query failed: ${queryError}` };
385
+ }
386
+ if (!pendingItems || pendingItems.length === 0) {
387
+ console.log("[processOutboxBatch] No pending items to process");
388
+ return { processed: 0, sent: 0, failed: 0, skipped: 0 };
389
+ }
390
+ const pushUrl = buildPushUrl(dinkHttpUrl);
391
+ const sentItems = [];
392
+ let sent = 0;
393
+ let failed = 0;
394
+ let skipped = 0;
395
+ for (const item of pendingItems) {
396
+ if (isDuplicate({ docId: item.docId, seq: item.seq }, sentItems)) {
397
+ skipped++;
398
+ continue;
399
+ }
400
+ if (item.lastAttempt && item.retries > 0) {
401
+ const backoffDelay = calculateBackoffDelay(item.retries - 1);
402
+ const timeSinceLastAttempt = Date.now() - item.lastAttempt;
403
+ if (timeSinceLastAttempt < backoffDelay) {
404
+ skipped++;
405
+ continue;
406
+ }
407
+ }
408
+ const payload = createPushPayload({
409
+ collection: item.collection,
410
+ docId: item.docId,
411
+ delta: item.delta,
412
+ seq: item.seq,
413
+ });
414
+ let success = false;
415
+ try {
416
+ const response = await fetch(pushUrl, {
417
+ method: "POST",
418
+ headers: {
419
+ "Content-Type": "application/json",
420
+ Authorization: `Bearer ${appSyncKey}`,
421
+ },
422
+ body: JSON.stringify(payload),
423
+ });
424
+ success = response.ok;
425
+ if (!success) {
426
+ const responseText = await response.text().catch(() => "");
427
+ console.error(`Outbox push failed for ${item.docId}:${item.seq}: ${response.status} ${response.statusText} - ${responseText}`);
428
+ }
429
+ }
430
+ catch (fetchError) {
431
+ console.error(`Outbox push error for ${item.docId}:${item.seq}:`, fetchError);
432
+ success = false;
433
+ }
434
+ const newRetries = success ? item.retries : item.retries + 1;
435
+ const newStatus = getNewStatus(success, newRetries);
436
+ try {
437
+ await ctx.runMutation(internal.outboxProcessor.updateItemStatus, {
438
+ itemId: item._id,
439
+ status: newStatus,
440
+ retries: newRetries,
441
+ lastAttempt: Date.now(),
442
+ });
443
+ }
444
+ catch (updateError) {
445
+ console.error(`Outbox processor: Failed to update item status for ${item.docId}:`, updateError);
446
+ }
447
+ if (success) {
448
+ sent++;
449
+ sentItems.push({ docId: item.docId, seq: item.seq });
450
+ }
451
+ else if (newStatus === OUTBOX_STATUS.FAILED) {
452
+ failed++;
453
+ }
454
+ }
455
+ return {
456
+ processed: pendingItems.length,
457
+ sent,
458
+ failed,
459
+ skipped,
460
+ };
461
+ }
462
+ catch (error) {
463
+ console.error("Outbox processor: Unexpected error:", error);
464
+ return {
465
+ processed: 0,
466
+ sent: 0,
467
+ failed: 0,
468
+ skipped: 0,
469
+ error: error instanceof Error ? error.message : String(error)
470
+ };
471
+ }
472
+ },
473
+ });
474
+ const scheduleOutboxProcessing = internalMutation({
475
+ args: {},
476
+ returns: v.null(),
477
+ handler: async (ctx) => {
478
+ await ctx.scheduler.runAfter(0, internal.outboxProcessor.processOutboxBatch, {});
479
+ return null;
480
+ },
481
+ });
482
+ return {
483
+ processOutboxBatch,
484
+ queryPendingItems,
485
+ updateItemStatus,
486
+ scheduleOutboxProcessing,
487
+ };
488
+ }
489
+ /**
490
+ * Create sync HTTP router with /dink/applyDelta endpoint.
491
+ *
492
+ * @param input - Object containing httpAction builder and api
493
+ * @returns HTTP router to export as default
494
+ *
495
+ * @example
496
+ * ```typescript
497
+ * // convex/http.ts (~5 lines!)
498
+ * import { createSyncHttpRouter } from "@fatagnus/dink-convex";
499
+ * import { httpAction } from "./_generated/server";
500
+ * import { api } from "./_generated/api";
501
+ *
502
+ * export default createSyncHttpRouter({ httpAction, api });
503
+ * ```
504
+ */
505
+ export function createSyncHttpRouter(input) {
506
+ const http = httpRouter();
507
+ const { httpAction, api } = input;
508
+ http.route({
509
+ path: "/dink/applyDelta",
510
+ method: "POST",
511
+ handler: httpAction(async (ctx, request) => {
512
+ const authHeader = request.headers.get("Authorization");
513
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
514
+ return new Response(JSON.stringify({
515
+ success: false,
516
+ error: "Missing or invalid Authorization header",
517
+ }), {
518
+ status: 401,
519
+ headers: { "Content-Type": "application/json" },
520
+ });
521
+ }
522
+ const token = authHeader.slice(7).trim();
523
+ if (!token) {
524
+ return new Response(JSON.stringify({
525
+ success: false,
526
+ error: "Missing authorization token",
527
+ }), {
528
+ status: 401,
529
+ headers: { "Content-Type": "application/json" },
530
+ });
531
+ }
532
+ let payload;
533
+ try {
534
+ payload = (await request.json());
535
+ }
536
+ catch {
537
+ return new Response(JSON.stringify({
538
+ success: false,
539
+ error: "Invalid JSON payload",
540
+ }), {
541
+ status: 400,
542
+ headers: { "Content-Type": "application/json" },
543
+ });
544
+ }
545
+ if (!payload.collection || typeof payload.collection !== "string") {
546
+ return new Response(JSON.stringify({
547
+ success: false,
548
+ error: "Missing or invalid collection field",
549
+ }), {
550
+ status: 400,
551
+ headers: { "Content-Type": "application/json" },
552
+ });
553
+ }
554
+ if (!payload.docId || typeof payload.docId !== "string") {
555
+ return new Response(JSON.stringify({
556
+ success: false,
557
+ error: "Missing or invalid docId field",
558
+ }), {
559
+ status: 400,
560
+ headers: { "Content-Type": "application/json" },
561
+ });
562
+ }
563
+ if (!Array.isArray(payload.bytes)) {
564
+ return new Response(JSON.stringify({
565
+ success: false,
566
+ error: "Missing or invalid bytes field",
567
+ }), {
568
+ status: 400,
569
+ headers: { "Content-Type": "application/json" },
570
+ });
571
+ }
572
+ const bytes = new Uint8Array(payload.bytes).buffer;
573
+ try {
574
+ const result = (await ctx.runMutation(api.sync.applyDeltaFromEdge, {
575
+ collection: payload.collection,
576
+ docId: payload.docId,
577
+ bytes,
578
+ authToken: token,
579
+ }));
580
+ return new Response(JSON.stringify({
581
+ success: true,
582
+ seq: result.seq,
583
+ }), {
584
+ status: 200,
585
+ headers: { "Content-Type": "application/json" },
586
+ });
587
+ }
588
+ catch (error) {
589
+ const message = error instanceof Error ? error.message : "Unknown error";
590
+ return new Response(JSON.stringify({
591
+ success: false,
592
+ error: message,
593
+ }), {
594
+ status: 500,
595
+ headers: { "Content-Type": "application/json" },
596
+ });
597
+ }
598
+ }),
599
+ });
600
+ return http;
601
+ }
602
+ /**
603
+ * Create sync cron jobs for outbox processing.
604
+ *
605
+ * @param input - Object containing internal API
606
+ * @returns Cron jobs to export as default
607
+ *
608
+ * @example
609
+ * ```typescript
610
+ * // convex/crons.ts (~4 lines!)
611
+ * import { createSyncCrons } from "@fatagnus/dink-convex";
612
+ * import { internal } from "./_generated/api";
613
+ *
614
+ * export default createSyncCrons({ internal });
615
+ * ```
616
+ */
617
+ export function createSyncCrons(input) {
618
+ const crons = cronJobs();
619
+ const intervalMinutes = input.intervalMinutes ?? 1;
620
+ crons.interval("processOutbox", { minutes: intervalMinutes }, input.internal.outboxProcessor.processOutboxBatch);
621
+ return crons;
622
+ }
623
+ //# sourceMappingURL=syncFactories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncFactories.js","sourceRoot":"","sources":["../src/syncFactories.ts"],"names":[],"mappings":"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"}