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 +3 -3
- package/dist/component/_generated/component.d.ts +3 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/convex.config.d.ts.map +1 -1
- package/dist/component/convex.config.js +2 -1
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/lib.d.ts +78 -14
- package/dist/component/lib.d.ts.map +1 -1
- package/dist/component/lib.js +254 -129
- package/dist/component/lib.js.map +1 -1
- package/dist/component/schema.d.ts +4 -5
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +2 -1
- package/dist/component/schema.js.map +1 -1
- package/package.json +1 -1
- package/src/component/_generated/component.ts +7 -0
- package/src/component/convex.config.ts +2 -1
- package/src/component/lib.ts +289 -162
- package/src/component/schema.ts +2 -1
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
|
-
- **
|
|
35
|
-
- **
|
|
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; //
|
|
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
|
|
2
|
-
export 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":"
|
|
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 +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,
|
|
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"}
|
package/dist/component/lib.d.ts
CHANGED
|
@@ -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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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;;;;;;;;;;;;;
|
|
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"}
|