@convex-dev/workpool 0.2.18-alpha.3 → 0.2.19-alpha.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.
- package/README.md +83 -76
- package/dist/commonjs/client/index.d.ts +98 -31
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +124 -49
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/component/kick.d.ts.map +1 -1
- package/dist/commonjs/component/kick.js +2 -2
- package/dist/commonjs/component/kick.js.map +1 -1
- package/dist/commonjs/component/lib.d.ts +39 -1
- package/dist/commonjs/component/lib.d.ts.map +1 -1
- package/dist/commonjs/component/lib.js +92 -56
- package/dist/commonjs/component/lib.js.map +1 -1
- package/dist/esm/client/index.d.ts +98 -31
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +124 -49
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/component/kick.d.ts.map +1 -1
- package/dist/esm/component/kick.js +2 -2
- package/dist/esm/component/kick.js.map +1 -1
- package/dist/esm/component/lib.d.ts +39 -1
- package/dist/esm/component/lib.d.ts.map +1 -1
- package/dist/esm/component/lib.js +92 -56
- package/dist/esm/component/lib.js.map +1 -1
- package/package.json +15 -10
- package/src/client/index.ts +225 -82
- package/src/component/_generated/api.d.ts +34 -0
- package/src/component/kick.ts +3 -1
- package/src/component/lib.ts +108 -61
|
@@ -36,8 +36,7 @@ export class Workpool {
|
|
|
36
36
|
* `./_generated/api.ts`.
|
|
37
37
|
* @param options - The {@link WorkpoolOptions} for the Workpool.
|
|
38
38
|
*/
|
|
39
|
-
constructor(component,
|
|
40
|
-
options) {
|
|
39
|
+
constructor(component, options) {
|
|
41
40
|
this.component = component;
|
|
42
41
|
this.options = options;
|
|
43
42
|
}
|
|
@@ -53,21 +52,31 @@ export class Workpool {
|
|
|
53
52
|
*/
|
|
54
53
|
async enqueueAction(ctx, fn, fnArgs, options) {
|
|
55
54
|
const retryBehavior = getRetryBehavior(this.options.defaultRetryBehavior, this.options.retryActionsByDefault, options?.retry);
|
|
56
|
-
|
|
57
|
-
? {
|
|
58
|
-
fnHandle: await createFunctionHandle(options.onComplete),
|
|
59
|
-
context: options.context,
|
|
60
|
-
}
|
|
61
|
-
: undefined;
|
|
62
|
-
const id = await ctx.runMutation(this.component.lib.enqueue, {
|
|
63
|
-
...(await defaultEnqueueArgs(fn, options?.name, this.options)),
|
|
64
|
-
fnArgs,
|
|
65
|
-
fnType: "action",
|
|
66
|
-
runAt: getRunAt(options),
|
|
67
|
-
onComplete,
|
|
55
|
+
return enqueue(this.component, ctx, "action", fn, fnArgs, {
|
|
68
56
|
retryBehavior,
|
|
57
|
+
...this.options,
|
|
58
|
+
...options,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Enqueues a batch of actions to be run.
|
|
63
|
+
* Each action will be run independently, and the onComplete handler will
|
|
64
|
+
* be called for each action.
|
|
65
|
+
*
|
|
66
|
+
* @param ctx - The mutation or action ctx that can call ctx.runMutation.
|
|
67
|
+
* @param fn - The action to run, like `internal.example.myAction`.
|
|
68
|
+
* @param argsArray - The arguments to pass to the action.
|
|
69
|
+
* @param options - The options for the actions to specify retry behavior,
|
|
70
|
+
* onComplete handling, and scheduling via `runAt` or `runAfter`.
|
|
71
|
+
* @returns The IDs of the work that was enqueued.
|
|
72
|
+
*/
|
|
73
|
+
async enqueueActionBatch(ctx, fn, argsArray, options) {
|
|
74
|
+
const retryBehavior = getRetryBehavior(this.options.defaultRetryBehavior, this.options.retryActionsByDefault, options?.retry);
|
|
75
|
+
return enqueueBatch(this.component, ctx, "action", fn, argsArray, {
|
|
76
|
+
retryBehavior,
|
|
77
|
+
...this.options,
|
|
78
|
+
...options,
|
|
69
79
|
});
|
|
70
|
-
return id;
|
|
71
80
|
}
|
|
72
81
|
/**
|
|
73
82
|
* Enqueues a mutation to be run.
|
|
@@ -83,36 +92,62 @@ export class Workpool {
|
|
|
83
92
|
* and scheduling via `runAt` or `runAfter`.
|
|
84
93
|
*/
|
|
85
94
|
async enqueueMutation(ctx, fn, fnArgs, options) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
context: options.context,
|
|
90
|
-
}
|
|
91
|
-
: undefined;
|
|
92
|
-
const id = await ctx.runMutation(this.component.lib.enqueue, {
|
|
93
|
-
...(await defaultEnqueueArgs(fn, options?.name, this.options)),
|
|
94
|
-
fnArgs,
|
|
95
|
-
fnType: "mutation",
|
|
96
|
-
runAt: getRunAt(options),
|
|
97
|
-
onComplete,
|
|
95
|
+
return enqueue(this.component, ctx, "mutation", fn, fnArgs, {
|
|
96
|
+
...this.options,
|
|
97
|
+
...options,
|
|
98
98
|
});
|
|
99
|
-
return id;
|
|
100
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Enqueues a batch of mutations to be run.
|
|
102
|
+
* Each mutation will be run independently, and the onComplete handler will
|
|
103
|
+
* be called for each mutation.
|
|
104
|
+
*
|
|
105
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
106
|
+
* @param fn - The mutation to run, like `internal.example.myMutation`.
|
|
107
|
+
* @param argsArray - The arguments to pass to the mutations.
|
|
108
|
+
* @param options - The options for the mutations to specify onComplete handling
|
|
109
|
+
* and scheduling via `runAt` or `runAfter`.
|
|
110
|
+
*/
|
|
111
|
+
async enqueueMutationBatch(ctx, fn, argsArray, options) {
|
|
112
|
+
return enqueueBatch(this.component, ctx, "mutation", fn, argsArray, {
|
|
113
|
+
...this.options,
|
|
114
|
+
...options,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Enqueues a query to be run.
|
|
119
|
+
* Usually not what you want, but it can be useful during workflows.
|
|
120
|
+
* The query is run in a mutation and the result is returned to the caller,
|
|
121
|
+
* so it can conflict if other mutations are writing the value.
|
|
122
|
+
*
|
|
123
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
124
|
+
* @param fn - The query to run, like `internal.example.myQuery`.
|
|
125
|
+
* @param fnArgs - The arguments to pass to the query.
|
|
126
|
+
* @param options - The options for the query to specify onComplete handling
|
|
127
|
+
* and scheduling via `runAt` or `runAfter`.
|
|
128
|
+
*/
|
|
101
129
|
async enqueueQuery(ctx, fn, fnArgs, options) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
130
|
+
return enqueue(this.component, ctx, "query", fn, fnArgs, {
|
|
131
|
+
...this.options,
|
|
132
|
+
...options,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Enqueues a batch of queries to be run.
|
|
137
|
+
* Each query will be run independently, and the onComplete handler will
|
|
138
|
+
* be called for each query.
|
|
139
|
+
*
|
|
140
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
141
|
+
* @param fn - The query to run, like `internal.example.myQuery`.
|
|
142
|
+
* @param argsArray - The arguments to pass to the queries.
|
|
143
|
+
* @param options - The options for the queries to specify onComplete handling
|
|
144
|
+
* and scheduling via `runAt` or `runAfter`.
|
|
145
|
+
*/
|
|
146
|
+
async enqueueQueryBatch(ctx, fn, argsArray, options) {
|
|
147
|
+
return enqueueBatch(this.component, ctx, "query", fn, argsArray, {
|
|
148
|
+
...this.options,
|
|
149
|
+
...options,
|
|
114
150
|
});
|
|
115
|
-
return id;
|
|
116
151
|
}
|
|
117
152
|
/**
|
|
118
153
|
* Cancels a work item. If it's already started, it will be allowed to finish
|
|
@@ -132,9 +167,10 @@ export class Workpool {
|
|
|
132
167
|
*
|
|
133
168
|
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
134
169
|
*/
|
|
135
|
-
async cancelAll(ctx) {
|
|
170
|
+
async cancelAll(ctx, options) {
|
|
136
171
|
await ctx.runMutation(this.component.lib.cancelAll, {
|
|
137
172
|
logLevel: this.options.logLevel ?? DEFAULT_LOG_LEVEL,
|
|
173
|
+
...options,
|
|
138
174
|
});
|
|
139
175
|
}
|
|
140
176
|
/**
|
|
@@ -150,6 +186,16 @@ export class Workpool {
|
|
|
150
186
|
async status(ctx, id) {
|
|
151
187
|
return ctx.runQuery(this.component.lib.status, { id });
|
|
152
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Gets the status of a batch of work items.
|
|
191
|
+
*
|
|
192
|
+
* @param ctx - The query context that can call ctx.runQuery.
|
|
193
|
+
* @param ids - The IDs of the work to get the status of.
|
|
194
|
+
* @returns The status of the work items.
|
|
195
|
+
*/
|
|
196
|
+
async statusBatch(ctx, ids) {
|
|
197
|
+
return ctx.runQuery(this.component.lib.statusBatch, { ids });
|
|
198
|
+
}
|
|
153
199
|
/**
|
|
154
200
|
* Defines a mutation that will be run after a work item completes.
|
|
155
201
|
* You can pass this to a call to enqueue* like so:
|
|
@@ -214,16 +260,25 @@ function getRetryBehavior(defaultRetryBehavior, retryActionsByDefault, retryOver
|
|
|
214
260
|
}
|
|
215
261
|
return retryOverride ?? (retryByDefault ? defaultRetry : undefined);
|
|
216
262
|
}
|
|
217
|
-
async function
|
|
263
|
+
async function enqueueArgs(fn, opts) {
|
|
218
264
|
const [fnHandle, fnName] = typeof fn === "string" && fn.startsWith("function://")
|
|
219
|
-
? [fn, name ?? fn]
|
|
220
|
-
: [await createFunctionHandle(fn), name ?? safeFunctionName(fn)];
|
|
265
|
+
? [fn, opts?.name ?? fn]
|
|
266
|
+
: [await createFunctionHandle(fn), opts?.name ?? safeFunctionName(fn)];
|
|
267
|
+
const onComplete = opts?.onComplete
|
|
268
|
+
? {
|
|
269
|
+
fnHandle: await createFunctionHandle(opts.onComplete),
|
|
270
|
+
context: opts.context,
|
|
271
|
+
}
|
|
272
|
+
: undefined;
|
|
221
273
|
return {
|
|
222
274
|
fnHandle,
|
|
223
275
|
fnName,
|
|
276
|
+
onComplete,
|
|
277
|
+
runAt: getRunAt(opts),
|
|
278
|
+
retryBehavior: opts?.retryBehavior,
|
|
224
279
|
config: {
|
|
225
|
-
logLevel: logLevel ?? DEFAULT_LOG_LEVEL,
|
|
226
|
-
maxParallelism: maxParallelism ?? DEFAULT_MAX_PARALLELISM,
|
|
280
|
+
logLevel: opts?.logLevel ?? DEFAULT_LOG_LEVEL,
|
|
281
|
+
maxParallelism: opts?.maxParallelism ?? DEFAULT_MAX_PARALLELISM,
|
|
227
282
|
},
|
|
228
283
|
};
|
|
229
284
|
}
|
|
@@ -231,12 +286,32 @@ function getRunAt(options) {
|
|
|
231
286
|
if (!options) {
|
|
232
287
|
return Date.now();
|
|
233
288
|
}
|
|
234
|
-
if (
|
|
289
|
+
if (options.runAt !== undefined) {
|
|
235
290
|
return options.runAt;
|
|
236
291
|
}
|
|
237
|
-
if (
|
|
292
|
+
if (options.runAfter !== undefined) {
|
|
238
293
|
return Date.now() + options.runAfter;
|
|
239
294
|
}
|
|
240
295
|
return Date.now();
|
|
241
296
|
}
|
|
297
|
+
export async function enqueueBatch(component, ctx, fnType, fn, fnArgsArray, options) {
|
|
298
|
+
const { config, ...defaults } = await enqueueArgs(fn, options);
|
|
299
|
+
const ids = await ctx.runMutation(component.lib.enqueueBatch, {
|
|
300
|
+
items: fnArgsArray.map((fnArgs) => ({
|
|
301
|
+
...defaults,
|
|
302
|
+
fnArgs,
|
|
303
|
+
fnType,
|
|
304
|
+
})),
|
|
305
|
+
config,
|
|
306
|
+
});
|
|
307
|
+
return ids;
|
|
308
|
+
}
|
|
309
|
+
export async function enqueue(component, ctx, fnType, fn, fnArgs, options) {
|
|
310
|
+
const id = await ctx.runMutation(component.lib.enqueue, {
|
|
311
|
+
...(await enqueueArgs(fn, options)),
|
|
312
|
+
fnArgs,
|
|
313
|
+
fnType,
|
|
314
|
+
});
|
|
315
|
+
return id;
|
|
316
|
+
}
|
|
242
317
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAQpB,uBAAuB,GAExB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAS,CAAC,EAA4B,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAiB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAEL,uBAAuB,EAEvB,gBAAgB,GAKjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,gBAAgB,GAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAsC,CAAC;AAChE,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAiB,MAAM,yBAAyB,CAAC;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAqB,CAAC;AAC9D,OAAO;AACL,kDAAkD;AAClD,gBAAgB,IAAI,eAAe;AACnC,kDAAkD;AAClD,gBAAgB,IAAI,eAAe,GACpC,CAAC;AACF,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACpD,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,GAAG;IACrB,IAAI,EAAE,CAAC;CACR,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kick.d.ts","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAEL,MAAM,
|
|
1
|
+
{"version":3,"file":"kick.d.ts","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAEL,MAAM,EAOP,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,EAClD,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAED,eAAO,MAAM,SAAS,2EAOpB,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { internal } from "./_generated/api.js";
|
|
|
2
2
|
import { internalMutation } from "./_generated/server.js";
|
|
3
3
|
import { createLogger, DEFAULT_LOG_LEVEL } from "./logging.js";
|
|
4
4
|
import { INITIAL_STATE } from "./loop.js";
|
|
5
|
-
import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, getNextSegment, } from "./shared.js";
|
|
5
|
+
import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, getNextSegment, SECOND, toSegment, } from "./shared.js";
|
|
6
6
|
/**
|
|
7
7
|
* Called from outside the loop.
|
|
8
8
|
* Returns the soonest segment to enqueue work for the main loop.
|
|
@@ -23,7 +23,7 @@ export async function kickMainLoop(ctx, source, config) {
|
|
|
23
23
|
console.debug(`[${source}] main is saturated, so we don't need to kick it`);
|
|
24
24
|
return next;
|
|
25
25
|
}
|
|
26
|
-
if (runStatus.state.segment <=
|
|
26
|
+
if (runStatus.state.segment <= toSegment(Date.now() + SECOND)) {
|
|
27
27
|
console.debug(`[${source}] main is scheduled to run soon enough, so we don't need to kick it`);
|
|
28
28
|
return next;
|
|
29
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kick.js","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAe,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAElB,uBAAuB,EACvB,WAAW,EACX,iBAAiB,EACjB,cAAc,
|
|
1
|
+
{"version":3,"file":"kick.js","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Id } from "./_generated/dataModel.js";
|
|
1
2
|
export declare const enqueue: import("convex/server").RegisteredMutation<"public", {
|
|
2
3
|
onComplete?: {
|
|
3
4
|
context?: any;
|
|
@@ -18,16 +19,41 @@ export declare const enqueue: import("convex/server").RegisteredMutation<"public
|
|
|
18
19
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
19
20
|
};
|
|
20
21
|
}, Promise<import("convex/values").GenericId<"work">>>;
|
|
22
|
+
export declare const enqueueBatch: import("convex/server").RegisteredMutation<"public", {
|
|
23
|
+
config: {
|
|
24
|
+
maxParallelism: number;
|
|
25
|
+
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
26
|
+
};
|
|
27
|
+
items: {
|
|
28
|
+
onComplete?: {
|
|
29
|
+
context?: any;
|
|
30
|
+
fnHandle: string;
|
|
31
|
+
} | undefined;
|
|
32
|
+
retryBehavior?: {
|
|
33
|
+
maxAttempts: number;
|
|
34
|
+
initialBackoffMs: number;
|
|
35
|
+
base: number;
|
|
36
|
+
} | undefined;
|
|
37
|
+
fnHandle: string;
|
|
38
|
+
fnType: "action" | "mutation" | "query";
|
|
39
|
+
fnName: string;
|
|
40
|
+
fnArgs: any;
|
|
41
|
+
runAt: number;
|
|
42
|
+
}[];
|
|
43
|
+
}, Promise<(string & {
|
|
44
|
+
__tableName: "work";
|
|
45
|
+
})[]>>;
|
|
21
46
|
export declare const cancel: import("convex/server").RegisteredMutation<"public", {
|
|
22
47
|
id: import("convex/values").GenericId<"work">;
|
|
23
48
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
24
49
|
}, Promise<void>>;
|
|
25
50
|
export declare const cancelAll: import("convex/server").RegisteredMutation<"public", {
|
|
26
51
|
before?: number | undefined;
|
|
52
|
+
limit?: number | undefined;
|
|
27
53
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
28
54
|
}, Promise<void>>;
|
|
29
55
|
export declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
30
|
-
id:
|
|
56
|
+
id: Id<"work">;
|
|
31
57
|
}, Promise<{
|
|
32
58
|
readonly state: "finished";
|
|
33
59
|
readonly previousAttempts?: undefined;
|
|
@@ -38,4 +64,16 @@ export declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
|
38
64
|
readonly state: "running";
|
|
39
65
|
readonly previousAttempts: number;
|
|
40
66
|
}>>;
|
|
67
|
+
export declare const statusBatch: import("convex/server").RegisteredQuery<"public", {
|
|
68
|
+
ids: import("convex/values").GenericId<"work">[];
|
|
69
|
+
}, Promise<({
|
|
70
|
+
readonly state: "finished";
|
|
71
|
+
readonly previousAttempts?: undefined;
|
|
72
|
+
} | {
|
|
73
|
+
readonly state: "pending";
|
|
74
|
+
readonly previousAttempts: number;
|
|
75
|
+
} | {
|
|
76
|
+
readonly state: "running";
|
|
77
|
+
readonly previousAttempts: number;
|
|
78
|
+
})[]>>;
|
|
41
79
|
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAiC/C,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;sDASlB,CAAC;AAiCH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;MAcvB,CAAC;AAEH,eAAO,MAAM,MAAM;;;iBAejB,CAAC;AAGH,eAAO,MAAM,SAAS;;;;iBAwCpB,CAAC;AAEH,eAAO,MAAM,MAAM;QAKuC,EAAE,CAAC,MAAM,CAAC;;;;;;;;;;GADlE,CAAC;AAwBH,eAAO,MAAM,WAAW;;;;;;;;;;;MAQtB,CAAC"}
|
|
@@ -8,42 +8,65 @@ import { boundScheduledTime, config, getNextSegment, max, onComplete, retryBehav
|
|
|
8
8
|
import { recordEnqueued } from "./stats.js";
|
|
9
9
|
const MAX_POSSIBLE_PARALLELISM = 100;
|
|
10
10
|
const MAX_PARALLELISM_SOFT_LIMIT = 50;
|
|
11
|
+
const itemArgs = {
|
|
12
|
+
fnHandle: v.string(),
|
|
13
|
+
fnName: v.string(),
|
|
14
|
+
fnArgs: v.any(),
|
|
15
|
+
fnType,
|
|
16
|
+
runAt: v.number(),
|
|
17
|
+
// TODO: annotation?
|
|
18
|
+
onComplete: v.optional(onComplete),
|
|
19
|
+
retryBehavior: v.optional(retryBehavior),
|
|
20
|
+
};
|
|
21
|
+
const enqueueArgs = {
|
|
22
|
+
...itemArgs,
|
|
23
|
+
config,
|
|
24
|
+
};
|
|
11
25
|
export const enqueue = mutation({
|
|
26
|
+
args: enqueueArgs,
|
|
27
|
+
returns: v.id("work"),
|
|
28
|
+
handler: async (ctx, { config, ...itemArgs }) => {
|
|
29
|
+
validateConfig(config);
|
|
30
|
+
const console = createLogger(config.logLevel);
|
|
31
|
+
const kickSegment = await kickMainLoop(ctx, "enqueue", config);
|
|
32
|
+
return await enqueueHandler(ctx, console, kickSegment, itemArgs);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
async function enqueueHandler(ctx, console, kickSegment, { runAt, ...workArgs }) {
|
|
36
|
+
runAt = boundScheduledTime(runAt, console);
|
|
37
|
+
const workId = await ctx.db.insert("work", {
|
|
38
|
+
...workArgs,
|
|
39
|
+
attempts: 0,
|
|
40
|
+
});
|
|
41
|
+
await ctx.db.insert("pendingStart", {
|
|
42
|
+
workId,
|
|
43
|
+
segment: max(toSegment(runAt), kickSegment),
|
|
44
|
+
});
|
|
45
|
+
recordEnqueued(console, { workId, fnName: workArgs.fnName, runAt });
|
|
46
|
+
return workId;
|
|
47
|
+
}
|
|
48
|
+
function validateConfig(config) {
|
|
49
|
+
if (config.maxParallelism > MAX_POSSIBLE_PARALLELISM) {
|
|
50
|
+
throw new Error(`maxParallelism must be <= ${MAX_PARALLELISM_SOFT_LIMIT}`);
|
|
51
|
+
}
|
|
52
|
+
else if (config.maxParallelism > MAX_PARALLELISM_SOFT_LIMIT) {
|
|
53
|
+
createLogger(config.logLevel).warn(`maxParallelism should be <= ${MAX_PARALLELISM_SOFT_LIMIT}, but is set to ${config.maxParallelism}. This will be an error in a future version.`);
|
|
54
|
+
}
|
|
55
|
+
else if (config.maxParallelism < 1) {
|
|
56
|
+
throw new Error("maxParallelism must be >= 1");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export const enqueueBatch = mutation({
|
|
12
60
|
args: {
|
|
13
|
-
|
|
14
|
-
fnName: v.string(),
|
|
15
|
-
fnArgs: v.any(),
|
|
16
|
-
fnType,
|
|
17
|
-
runAt: v.number(),
|
|
18
|
-
// TODO: annotation?
|
|
19
|
-
onComplete: v.optional(onComplete),
|
|
20
|
-
retryBehavior: v.optional(retryBehavior),
|
|
61
|
+
items: v.array(v.object(itemArgs)),
|
|
21
62
|
config,
|
|
22
63
|
},
|
|
23
|
-
returns: v.id("work"),
|
|
24
|
-
handler: async (ctx, { config,
|
|
64
|
+
returns: v.array(v.id("work")),
|
|
65
|
+
handler: async (ctx, { config, items }) => {
|
|
66
|
+
validateConfig(config);
|
|
25
67
|
const console = createLogger(config.logLevel);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
else if (config.maxParallelism > MAX_PARALLELISM_SOFT_LIMIT) {
|
|
30
|
-
console.warn(`maxParallelism should be <= ${MAX_PARALLELISM_SOFT_LIMIT}, but is set to ${config.maxParallelism}. This will be an error in a future version.`);
|
|
31
|
-
}
|
|
32
|
-
else if (config.maxParallelism < 1) {
|
|
33
|
-
throw new Error("maxParallelism must be >= 1");
|
|
34
|
-
}
|
|
35
|
-
runAt = boundScheduledTime(runAt, console);
|
|
36
|
-
const workId = await ctx.db.insert("work", {
|
|
37
|
-
...workArgs,
|
|
38
|
-
attempts: 0,
|
|
39
|
-
});
|
|
40
|
-
const limit = await kickMainLoop(ctx, "enqueue", config);
|
|
41
|
-
await ctx.db.insert("pendingStart", {
|
|
42
|
-
workId,
|
|
43
|
-
segment: max(toSegment(runAt), limit),
|
|
44
|
-
});
|
|
45
|
-
recordEnqueued(console, { workId, fnName: workArgs.fnName, runAt });
|
|
46
|
-
return workId;
|
|
68
|
+
const kickSegment = await kickMainLoop(ctx, "enqueue", config);
|
|
69
|
+
return Promise.all(items.map((item) => enqueueHandler(ctx, console, kickSegment, item)));
|
|
47
70
|
},
|
|
48
71
|
});
|
|
49
72
|
export const cancel = mutation({
|
|
@@ -64,14 +87,19 @@ export const cancel = mutation({
|
|
|
64
87
|
});
|
|
65
88
|
const PAGE_SIZE = 64;
|
|
66
89
|
export const cancelAll = mutation({
|
|
67
|
-
args: {
|
|
68
|
-
|
|
90
|
+
args: {
|
|
91
|
+
logLevel,
|
|
92
|
+
before: v.optional(v.number()),
|
|
93
|
+
limit: v.optional(v.number()),
|
|
94
|
+
},
|
|
95
|
+
handler: async (ctx, { logLevel, before, limit }) => {
|
|
69
96
|
const beforeTime = before ?? Date.now();
|
|
97
|
+
const pageSize = limit ?? PAGE_SIZE;
|
|
70
98
|
const pageOfWork = await ctx.db
|
|
71
99
|
.query("work")
|
|
72
100
|
.withIndex("by_creation_time", (q) => q.lte("_creationTime", beforeTime))
|
|
73
101
|
.order("desc")
|
|
74
|
-
.take(
|
|
102
|
+
.take(pageSize);
|
|
75
103
|
const shouldCancel = await Promise.all(pageOfWork.map(async ({ _id }) => shouldCancelWorkItem(ctx, _id, logLevel)));
|
|
76
104
|
let segment = getNextSegment();
|
|
77
105
|
if (shouldCancel.some((c) => c)) {
|
|
@@ -85,7 +113,7 @@ export const cancelAll = mutation({
|
|
|
85
113
|
});
|
|
86
114
|
}
|
|
87
115
|
}));
|
|
88
|
-
if (pageOfWork.length ===
|
|
116
|
+
if (pageOfWork.length === pageSize) {
|
|
89
117
|
await ctx.scheduler.runAfter(0, api.lib.cancelAll, {
|
|
90
118
|
logLevel,
|
|
91
119
|
before: pageOfWork[pageOfWork.length - 1]._creationTime,
|
|
@@ -96,27 +124,35 @@ export const cancelAll = mutation({
|
|
|
96
124
|
export const status = query({
|
|
97
125
|
args: { id: v.id("work") },
|
|
98
126
|
returns: statusValidator,
|
|
99
|
-
handler:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
127
|
+
handler: statusHandler,
|
|
128
|
+
});
|
|
129
|
+
async function statusHandler(ctx, { id }) {
|
|
130
|
+
const work = await ctx.db.get(id);
|
|
131
|
+
if (!work) {
|
|
132
|
+
return { state: "finished" };
|
|
133
|
+
}
|
|
134
|
+
const pendingStart = await ctx.db
|
|
135
|
+
.query("pendingStart")
|
|
136
|
+
.withIndex("workId", (q) => q.eq("workId", id))
|
|
137
|
+
.unique();
|
|
138
|
+
if (pendingStart) {
|
|
139
|
+
return { state: "pending", previousAttempts: work.attempts };
|
|
140
|
+
}
|
|
141
|
+
const pendingCompletion = await ctx.db
|
|
142
|
+
.query("pendingCompletion")
|
|
143
|
+
.withIndex("workId", (q) => q.eq("workId", id))
|
|
144
|
+
.unique();
|
|
145
|
+
if (pendingCompletion?.retry) {
|
|
146
|
+
return { state: "pending", previousAttempts: work.attempts };
|
|
147
|
+
}
|
|
148
|
+
// Assume it's in progress. It could be pending cancelation
|
|
149
|
+
return { state: "running", previousAttempts: work.attempts };
|
|
150
|
+
}
|
|
151
|
+
export const statusBatch = query({
|
|
152
|
+
args: { ids: v.array(v.id("work")) },
|
|
153
|
+
returns: v.array(statusValidator),
|
|
154
|
+
handler: async (ctx, { ids }) => {
|
|
155
|
+
return await Promise.all(ids.map(async (id) => await statusHandler(ctx, { id })));
|
|
120
156
|
},
|
|
121
157
|
});
|
|
122
158
|
async function shouldCancelWorkItem(ctx, workId, logLevel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"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"}
|