convex-batch-processor 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,8 +31,8 @@ export default app;
31
31
  ### Batch Accumulator
32
32
 
33
33
  The batch accumulator collects items and flushes them based on:
34
- - **Size threshold**: Flush when `maxBatchSize` items collected
35
- - **Time interval**: Flush automatically after `flushIntervalMs` since first item was added
34
+ - **Time interval**: Flush automatically after `flushIntervalMs` (primary trigger for high-throughput small items)
35
+ - **Size threshold**: Immediate flush when a single call adds `>= maxBatchSize` items
36
36
  - **Manual trigger**: Force flush via API call
37
37
 
38
38
  ```typescript
@@ -287,7 +287,7 @@ Returned by `addItems()`:
287
287
  ```typescript
288
288
  interface BatchResult {
289
289
  batchId: string; // Same ID you passed in
290
- itemCount: number; // Total items in batch
290
+ itemCount: number; // Items added in THIS call (use getBatchStatus for total)
291
291
  flushed: boolean; // Whether batch was flushed
292
292
  status: BatchStatus; // "accumulating" | "flushing" | "completed"
293
293
  }
@@ -41,6 +41,9 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
41
41
  flushBatch: FunctionReference<"mutation", "internal", {
42
42
  batchId: string;
43
43
  }, any, Name>;
44
+ getAllBatchesForBaseId: FunctionReference<"query", "internal", {
45
+ baseBatchId: string;
46
+ }, any, Name>;
44
47
  getBatchStatus: FunctionReference<"query", "internal", {
45
48
  batchId: string;
46
49
  }, any, Name>;
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/component/_generated/component.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,IAC3E;IACE,GAAG,EAAE;QACH,QAAQ,EAAE,iBAAiB,CACzB,UAAU,EACV,UAAU,EACV;YACE,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE;gBACN,eAAe,EAAE,MAAM,CAAC;gBACxB,YAAY,EAAE,MAAM,CAAC;gBACrB,kBAAkB,EAAE,MAAM,CAAC;aAC5B,CAAC;YACF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;SACnB,EACD,GAAG,EACH,IAAI,CACL,CAAC;QACF,iBAAiB,EAAE,iBAAiB,CAClC,UAAU,EACV,UAAU,EACV;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,EACjB,GAAG,EACH,IAAI,CACL,CAAC;QACF,WAAW,EAAE,iBAAiB,CAC5B,UAAU,EACV,UAAU,EACV;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EACnB,GAAG,EACH,IAAI,CACL,CAAC;QACF,iBAAiB,EAAE,iBAAiB,CAClC,UAAU,EACV,UAAU,EACV;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,EACjB,GAAG,EACH,IAAI,CACL,CAAC;QACF,UAAU,EAAE,iBAAiB,CAC3B,UAAU,EACV,UAAU,EACV;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EACnB,GAAG,EACH,IAAI,CACL,CAAC;QACF,cAAc,EAAE,iBAAiB,CAC/B,OAAO,EACP,UAAU,EACV;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EACnB,GAAG,EACH,IAAI,CACL,CAAC;QACF,eAAe,EAAE,iBAAiB,CAChC,OAAO,EACP,UAAU,EACV;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,EACnC,GAAG,EACH,IAAI,CACL,CAAC;QACF,oBAAoB,EAAE,iBAAiB,CACrC,OAAO,EACP,UAAU,EACV;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,EACjB,GAAG,EACH,IAAI,CACL,CAAC;QACF,gBAAgB,EAAE,iBAAiB,CACjC,OAAO,EACP,UAAU,EACV;YACE,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;SACpE,EACD,GAAG,EACH,IAAI,CACL,CAAC;QACF,gBAAgB,EAAE,iBAAiB,CACjC,UAAU,EACV,UAAU,EACV;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,EACjB,GAAG,EACH,IAAI,CACL,CAAC;QACF,iBAAiB,EAAE,iBAAiB,CAClC,UAAU,EACV,UAAU,EACV;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,EACjB,GAAG,EACH,IAAI,CACL,CAAC;QACF,gBAAgB,EAAE,iBAAiB,CACjC,UAAU,EACV,UAAU,EACV;YACE,MAAM,EAAE;gBACN,SAAS,EAAE,MAAM,CAAC;gBAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;gBAC/B,kBAAkB,EAAE,MAAM,CAAC;gBAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;gBACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAC1B,kBAAkB,EAAE,MAAM,CAAC;aAC5B,CAAC;YACF,KAAK,EAAE,MAAM,CAAC;SACf,EACD,GAAG,EACH,IAAI,CACL,CAAC;KACH,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../../src/component/_generated/component.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- declare const _default: import("convex/server").ComponentDefinition<any>;
2
- export default _default;
1
+ declare const component: import("convex/server").ComponentDefinition<any>;
2
+ export default component;
3
3
  //# sourceMappingURL=convex.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"convex.config.d.ts","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":";AAEA,wBAAiD"}
1
+ {"version":3,"file":"convex.config.d.ts","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,SAAS,kDAAoC,CAAC;AACpD,eAAe,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import { defineComponent } from "convex/server";
2
- export default defineComponent("batchProcessor");
2
+ const component = defineComponent("batchProcessor");
3
+ export default component;
3
4
  //# sourceMappingURL=convex.config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convex.config.js","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAe,eAAe,CAAC,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"convex.config.js","sourceRoot":"","sources":["../../src/component/convex.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,SAAS,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;AACpD,eAAe,SAAS,CAAC"}
@@ -91,7 +91,6 @@ export declare const getBatch: import("convex/server").RegisteredQuery<"internal
91
91
  baseBatchId: string;
92
92
  status: "accumulating" | "flushing" | "completed";
93
93
  sequence: number;
94
- itemCount: number;
95
94
  createdAt: number;
96
95
  lastUpdatedAt: number;
97
96
  } | null>>;
@@ -104,6 +103,74 @@ export declare const collectBatchItems: import("convex/server").RegisteredQuery<
104
103
  items: unknown[];
105
104
  flushStartedAt: number;
106
105
  }>>;
106
+ type FlushTransitionResult = {
107
+ flushed: true;
108
+ itemCount: number;
109
+ } | {
110
+ flushed: false;
111
+ reason: string;
112
+ };
113
+ /**
114
+ * maybeFlush - Attempts to transition a batch from "accumulating" to "flushing" state.
115
+ *
116
+ * This is an internal action scheduled by addItems (when threshold is reached) or
117
+ * flushBatch (for manual flushes). It serves as a lightweight coordinator that
118
+ * delegates the actual state transition to doFlushTransition (a mutation).
119
+ *
120
+ * ## Why this architecture?
121
+ *
122
+ * 1. **OCC is handled automatically by Convex**: When doFlushTransition (a mutation)
123
+ * encounters an OCC conflict, Convex automatically retries it. We don't need
124
+ * external retry logic like ActionRetrier for database operations.
125
+ *
126
+ * 2. **Race conditions are handled gracefully**: Multiple maybeFlush calls can be
127
+ * scheduled concurrently (e.g., rapid addItems calls all hitting threshold).
128
+ * The first one to execute wins the race and transitions the batch to "flushing".
129
+ * Subsequent calls see status !== "accumulating" and return early with
130
+ * reason: "not_accumulating". This is expected behavior, not an error.
131
+ *
132
+ * 3. **Mutations can't call actions directly**: Convex mutations are deterministic
133
+ * and can't have side effects. To execute the user's processBatchHandle (an action),
134
+ * we need this action layer. The flow is:
135
+ * mutation (addItems) → schedules action (maybeFlush)
136
+ * action (maybeFlush) → calls mutation (doFlushTransition)
137
+ * mutation (doFlushTransition) → schedules action (executeFlush)
138
+ *
139
+ * 4. **Non-blocking for callers**: addItems returns immediately after scheduling
140
+ * maybeFlush. Users don't wait for the flush to complete.
141
+ *
142
+ * ## Failure scenarios
143
+ *
144
+ * - If maybeFlush fails completely (rare), the batch stays in "accumulating" state.
145
+ * The next addItems call that hits threshold will schedule another maybeFlush.
146
+ * - If a scheduled interval flush exists, it will also attempt the transition.
147
+ *
148
+ * @param batchDocId - The batch document ID to potentially flush
149
+ * @param force - If true, flush regardless of threshold (used by manual flush and interval timer)
150
+ */
151
+ export declare const maybeFlush: import("convex/server").RegisteredAction<"internal", {
152
+ force?: boolean | undefined;
153
+ batchDocId: import("convex/values").GenericId<"batches">;
154
+ }, Promise<void>>;
155
+ /**
156
+ * doFlushTransition - The actual state machine transition from "accumulating" to "flushing".
157
+ *
158
+ * This mutation is the source of truth for batch state transitions. It's designed to be
159
+ * idempotent and race-condition safe:
160
+ *
161
+ * - Returns early if batch is already flushing/completed (another caller won the race)
162
+ * - Returns early if batch is empty or below threshold (unless force=true)
163
+ * - On success, atomically updates status and schedules executeFlush
164
+ *
165
+ * OCC (Optimistic Concurrency Control) note:
166
+ * If two doFlushTransition calls race, Convex detects the conflict when both try to
167
+ * patch the same batch document. One succeeds, the other is auto-retried by Convex.
168
+ * On retry, it sees status="flushing" and returns { flushed: false, reason: "not_accumulating" }.
169
+ */
170
+ export declare const doFlushTransition: import("convex/server").RegisteredMutation<"internal", {
171
+ force?: boolean | undefined;
172
+ batchDocId: import("convex/values").GenericId<"batches">;
173
+ }, Promise<FlushTransitionResult>>;
107
174
  export declare const executeFlush: import("convex/server").RegisteredAction<"internal", {
108
175
  processBatchHandle: string;
109
176
  batchDocId: import("convex/values").GenericId<"batches">;
@@ -119,25 +186,21 @@ export declare const executeFlush: import("convex/server").RegisteredAction<"int
119
186
  export declare const recordFlushResult: import("convex/server").RegisteredMutation<"internal", {
120
187
  flushStartedAt?: number | undefined;
121
188
  errorMessage?: string | undefined;
122
- itemCount: number;
123
189
  batchDocId: import("convex/values").GenericId<"batches">;
190
+ itemCount: number;
124
191
  durationMs: number;
125
192
  success: boolean;
126
193
  }, Promise<void>>;
127
- export declare const markBatchFlushing: import("convex/server").RegisteredMutation<"internal", {
128
- batchDocId: import("convex/values").GenericId<"batches">;
129
- }, Promise<{
130
- processBatchHandle: string;
131
- } | null>>;
194
+ /**
195
+ * scheduledIntervalFlush - Timer-triggered flush that runs after flushIntervalMs.
196
+ *
197
+ * Scheduled once when a batch is created (if flushIntervalMs > 0). Uses force=true
198
+ * to flush regardless of whether the batch has reached maxBatchSize threshold.
199
+ * This ensures batches don't sit indefinitely waiting for more items.
200
+ */
132
201
  export declare const scheduledIntervalFlush: import("convex/server").RegisteredAction<"internal", {
133
202
  batchDocId: import("convex/values").GenericId<"batches">;
134
- }, Promise<{
135
- flushed: boolean;
136
- reason?: string;
137
- success?: boolean;
138
- errorMessage?: string;
139
- durationMs?: number;
140
- }>>;
203
+ }, Promise<void>>;
141
204
  export declare const startIteratorJob: import("convex/server").RegisteredMutation<"public", {
142
205
  jobId: string;
143
206
  config: {
@@ -284,4 +347,5 @@ export declare const incrementRetryCount: import("convex/server").RegisteredMuta
284
347
  errorMessage: string;
285
348
  jobDocId: import("convex/values").GenericId<"iteratorJobs">;
286
349
  }, Promise<void>>;
350
+ export {};
287
351
  //# sourceMappingURL=lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;GAyHnB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;GA2DrB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;gBAmCC,cAAc,GAAG,UAAU;;;;;;;;;UAWrD,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;KAkBjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;KAiB1B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;GAoCtB,CAAC;AAMH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;UAQnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GA0B5B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;GA+CvB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;iBAyF5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;UAmB5B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;aAGxB,OAAO;aACP,MAAM;cACL,OAAO;mBACF,MAAM;iBACR,MAAM;GAiBnB,CAAC;AAMH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;GA8C3B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;GAsB3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;GAyB5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;GAuB5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;UA2B/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;KAmC3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GAmB5B,CAAC;AAMH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;UAQzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;UAK7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;eAGhB,OAAO;WACX,OAAO;qBACG,MAAM;aACd,MAAM;YACP,MAAM;iBACD,MAAM;GA+FnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;iBAc5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAY3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;iBAcxB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;iBAa9B,CAAC"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;GA8FnB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;GAwDrB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;gBA6CE,cAAc,GAAG,UAAU;;;;;;;;;UAiBtD,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;KAiCjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;KAiB1B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;GAuCtB,CAAC;AAMH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;UAQnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GA0B5B,CAAC;AAGH,KAAK,qBAAqB,GACvB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,UAAU;;;iBAcrB,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB;;;kCAqD5B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;GA+CvB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;iBAgH5B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;iBASjC,CAAC;AAMH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;GA8C3B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;GAsB3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;GAyB5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;GAuB5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;UA2B/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;KAmC3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;GAmB5B,CAAC;AAMH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;UAQzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;UAK7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;eAGhB,OAAO;WACX,OAAO;qBACG,MAAM;aACd,MAAM;YACP,MAAM;iBACD,MAAM;GA+FnB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;iBAc5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAY3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;iBAcxB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;iBAa9B,CAAC"}