@convex-dev/workpool 0.3.1-alpha.0 → 0.3.1
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 +9 -0
- package/dist/client/index.d.ts +9 -9
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +22 -22
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +2 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +12 -6
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/dataModel.d.ts +1 -1
- package/dist/component/complete.d.ts.map +1 -1
- package/dist/component/complete.js +2 -2
- package/dist/component/complete.js.map +1 -1
- package/dist/component/config.d.ts +16 -0
- package/dist/component/config.d.ts.map +1 -0
- package/dist/component/config.js +63 -0
- package/dist/component/config.js.map +1 -0
- package/dist/component/kick.d.ts +1 -1
- package/dist/component/kick.d.ts.map +1 -1
- package/dist/component/kick.js +4 -29
- package/dist/component/kick.js.map +1 -1
- package/dist/component/lib.d.ts +6 -6
- package/dist/component/lib.d.ts.map +1 -1
- package/dist/component/lib.js +19 -29
- package/dist/component/lib.js.map +1 -1
- package/dist/component/schema.js +4 -4
- package/dist/component/schema.js.map +1 -1
- package/dist/component/shared.d.ts +5 -6
- package/dist/component/shared.d.ts.map +1 -1
- package/dist/component/shared.js +3 -3
- package/dist/component/shared.js.map +1 -1
- package/package.json +22 -22
- package/src/client/index.ts +33 -25
- package/src/component/_generated/api.ts +2 -0
- package/src/component/_generated/component.ts +18 -6
- package/src/component/_generated/dataModel.ts +1 -1
- package/src/component/complete.ts +2 -6
- package/src/component/config.test.ts +31 -0
- package/src/component/config.ts +72 -0
- package/src/component/kick.test.ts +2 -23
- package/src/component/kick.ts +4 -32
- package/src/component/lib.test.ts +3 -3
- package/src/component/lib.ts +21 -34
- package/src/component/recovery.test.ts +122 -122
- package/src/component/schema.ts +6 -6
- package/src/component/shared.ts +5 -6
package/dist/component/lib.js
CHANGED
|
@@ -3,10 +3,9 @@ import { api } from "./_generated/api.js";
|
|
|
3
3
|
import { mutation, query, } from "./_generated/server.js";
|
|
4
4
|
import { kickMainLoop } from "./kick.js";
|
|
5
5
|
import { createLogger, logLevel, } from "./logging.js";
|
|
6
|
-
import { boundScheduledTime,
|
|
6
|
+
import { boundScheduledTime, vConfig, fnType, getNextSegment, max, vOnCompleteFnContext, retryBehavior, status as statusValidator, toSegment, } from "./shared.js";
|
|
7
7
|
import { recordEnqueued } from "./stats.js";
|
|
8
|
-
|
|
9
|
-
const MAX_PARALLELISM_SOFT_LIMIT = 100;
|
|
8
|
+
import { getOrUpdateGlobals } from "./config.js";
|
|
10
9
|
const itemArgs = {
|
|
11
10
|
fnHandle: v.string(),
|
|
12
11
|
fnName: v.string(),
|
|
@@ -14,20 +13,20 @@ const itemArgs = {
|
|
|
14
13
|
fnType,
|
|
15
14
|
runAt: v.number(),
|
|
16
15
|
// TODO: annotation?
|
|
17
|
-
onComplete: v.optional(
|
|
16
|
+
onComplete: v.optional(vOnCompleteFnContext),
|
|
18
17
|
retryBehavior: v.optional(retryBehavior),
|
|
19
18
|
};
|
|
20
19
|
const enqueueArgs = {
|
|
21
20
|
...itemArgs,
|
|
22
|
-
config,
|
|
21
|
+
config: vConfig.partial(),
|
|
23
22
|
};
|
|
24
23
|
export const enqueue = mutation({
|
|
25
24
|
args: enqueueArgs,
|
|
26
25
|
returns: v.id("work"),
|
|
27
26
|
handler: async (ctx, { config, ...itemArgs }) => {
|
|
28
|
-
|
|
29
|
-
const console = createLogger(
|
|
30
|
-
const kickSegment = await kickMainLoop(ctx, "enqueue",
|
|
27
|
+
const globals = await getOrUpdateGlobals(ctx, config);
|
|
28
|
+
const console = createLogger(globals.logLevel);
|
|
29
|
+
const kickSegment = await kickMainLoop(ctx, "enqueue", globals);
|
|
31
30
|
return await enqueueHandler(ctx, console, kickSegment, itemArgs);
|
|
32
31
|
},
|
|
33
32
|
});
|
|
@@ -44,39 +43,29 @@ async function enqueueHandler(ctx, console, kickSegment, { runAt, ...workArgs })
|
|
|
44
43
|
recordEnqueued(console, { workId, fnName: workArgs.fnName, runAt });
|
|
45
44
|
return workId;
|
|
46
45
|
}
|
|
47
|
-
function validateConfig(config) {
|
|
48
|
-
if (config.maxParallelism > MAX_POSSIBLE_PARALLELISM) {
|
|
49
|
-
throw new Error(`maxParallelism must be <= ${MAX_PARALLELISM_SOFT_LIMIT}`);
|
|
50
|
-
}
|
|
51
|
-
else if (config.maxParallelism > MAX_PARALLELISM_SOFT_LIMIT) {
|
|
52
|
-
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.`);
|
|
53
|
-
}
|
|
54
|
-
else if (config.maxParallelism < 1) {
|
|
55
|
-
throw new Error("maxParallelism must be >= 1");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
46
|
export const enqueueBatch = mutation({
|
|
59
47
|
args: {
|
|
60
48
|
items: v.array(v.object(itemArgs)),
|
|
61
|
-
config,
|
|
49
|
+
config: vConfig.partial(),
|
|
62
50
|
},
|
|
63
51
|
returns: v.array(v.id("work")),
|
|
64
52
|
handler: async (ctx, { config, items }) => {
|
|
65
|
-
|
|
66
|
-
const console = createLogger(
|
|
67
|
-
const kickSegment = await kickMainLoop(ctx, "enqueue",
|
|
53
|
+
const globals = await getOrUpdateGlobals(ctx, config);
|
|
54
|
+
const console = createLogger(globals.logLevel);
|
|
55
|
+
const kickSegment = await kickMainLoop(ctx, "enqueue", globals);
|
|
68
56
|
return Promise.all(items.map((item) => enqueueHandler(ctx, console, kickSegment, item)));
|
|
69
57
|
},
|
|
70
58
|
});
|
|
71
59
|
export const cancel = mutation({
|
|
72
60
|
args: {
|
|
73
61
|
id: v.id("work"),
|
|
74
|
-
logLevel,
|
|
62
|
+
logLevel: v.optional(logLevel),
|
|
75
63
|
},
|
|
76
64
|
handler: async (ctx, { id, logLevel }) => {
|
|
77
|
-
const
|
|
65
|
+
const globals = await getOrUpdateGlobals(ctx, { logLevel });
|
|
66
|
+
const shouldCancel = await shouldCancelWorkItem(ctx, id, globals.logLevel);
|
|
78
67
|
if (shouldCancel) {
|
|
79
|
-
const segment = await kickMainLoop(ctx, "cancel",
|
|
68
|
+
const segment = await kickMainLoop(ctx, "cancel", globals);
|
|
80
69
|
await ctx.db.insert("pendingCancelation", {
|
|
81
70
|
workId: id,
|
|
82
71
|
segment,
|
|
@@ -87,7 +76,7 @@ export const cancel = mutation({
|
|
|
87
76
|
const PAGE_SIZE = 64;
|
|
88
77
|
export const cancelAll = mutation({
|
|
89
78
|
args: {
|
|
90
|
-
logLevel,
|
|
79
|
+
logLevel: v.optional(logLevel),
|
|
91
80
|
before: v.optional(v.number()),
|
|
92
81
|
limit: v.optional(v.number()),
|
|
93
82
|
},
|
|
@@ -99,10 +88,11 @@ export const cancelAll = mutation({
|
|
|
99
88
|
.withIndex("by_creation_time", (q) => q.lte("_creationTime", beforeTime))
|
|
100
89
|
.order("desc")
|
|
101
90
|
.take(pageSize);
|
|
102
|
-
const
|
|
91
|
+
const globals = await getOrUpdateGlobals(ctx, { logLevel });
|
|
92
|
+
const shouldCancel = await Promise.all(pageOfWork.map(async ({ _id }) => shouldCancelWorkItem(ctx, _id, globals.logLevel)));
|
|
103
93
|
let segment = getNextSegment();
|
|
104
94
|
if (shouldCancel.some((c) => c)) {
|
|
105
|
-
segment = await kickMainLoop(ctx, "cancel",
|
|
95
|
+
segment = await kickMainLoop(ctx, "cancel", globals);
|
|
106
96
|
}
|
|
107
97
|
await Promise.all(pageOfWork.map(({ _id }, index) => {
|
|
108
98
|
if (shouldCancel[index]) {
|
|
@@ -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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"}
|
package/dist/component/schema.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { defineSchema, defineTable } from "convex/server";
|
|
2
2
|
import { v } from "convex/values";
|
|
3
|
-
import { fnType,
|
|
3
|
+
import { fnType, vConfig, vOnCompleteFnContext, retryBehavior, vResult, } from "./shared.js";
|
|
4
4
|
// Represents a slice of time to process work.
|
|
5
5
|
const segment = v.int64();
|
|
6
6
|
export default defineSchema({
|
|
7
7
|
// Written from kickLoop, read everywhere.
|
|
8
|
-
globals: defineTable(
|
|
8
|
+
globals: defineTable(vConfig),
|
|
9
9
|
// Singleton, only read & written by `main`.
|
|
10
10
|
internalState: defineTable({
|
|
11
11
|
// Ensure that only one main is running at a time.
|
|
@@ -48,7 +48,7 @@ export default defineSchema({
|
|
|
48
48
|
fnName: v.string(),
|
|
49
49
|
fnArgs: v.any(),
|
|
50
50
|
attempts: v.number(), // number of completed attempts
|
|
51
|
-
onComplete: v.optional(
|
|
51
|
+
onComplete: v.optional(vOnCompleteFnContext),
|
|
52
52
|
retryBehavior: v.optional(retryBehavior),
|
|
53
53
|
canceled: v.optional(v.boolean()),
|
|
54
54
|
}),
|
|
@@ -62,7 +62,7 @@ export default defineSchema({
|
|
|
62
62
|
// Written by complete, read & deleted by `main`.
|
|
63
63
|
pendingCompletion: defineTable({
|
|
64
64
|
segment,
|
|
65
|
-
runResult:
|
|
65
|
+
runResult: vResult,
|
|
66
66
|
workId: v.id("work"),
|
|
67
67
|
retry: v.boolean(),
|
|
68
68
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EACL,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,14 +11,14 @@ export declare function toSegment(ms: number): bigint;
|
|
|
11
11
|
export declare function getCurrentSegment(): bigint;
|
|
12
12
|
export declare function getNextSegment(): bigint;
|
|
13
13
|
export declare function fromSegment(segment: bigint): number;
|
|
14
|
-
export declare const
|
|
14
|
+
export declare const vConfig: import("convex/values").VObject<{
|
|
15
15
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
16
16
|
maxParallelism: number;
|
|
17
17
|
}, {
|
|
18
18
|
maxParallelism: import("convex/values").VFloat64<number, "required">;
|
|
19
19
|
logLevel: import("convex/values").VUnion<"DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR", [import("convex/values").VLiteral<"DEBUG", "required">, import("convex/values").VLiteral<"TRACE", "required">, import("convex/values").VLiteral<"INFO", "required">, import("convex/values").VLiteral<"REPORT", "required">, import("convex/values").VLiteral<"WARN", "required">, import("convex/values").VLiteral<"ERROR", "required">], "required", never>;
|
|
20
20
|
}, "required", "logLevel" | "maxParallelism">;
|
|
21
|
-
export type Config = Infer<typeof
|
|
21
|
+
export type Config = Infer<typeof vConfig>;
|
|
22
22
|
export declare const retryBehavior: import("convex/values").VObject<{
|
|
23
23
|
maxAttempts: number;
|
|
24
24
|
initialBackoffMs: number;
|
|
@@ -46,7 +46,7 @@ export type RetryBehavior = {
|
|
|
46
46
|
base: number;
|
|
47
47
|
};
|
|
48
48
|
export declare const DEFAULT_RETRY_BEHAVIOR: RetryBehavior;
|
|
49
|
-
export declare const
|
|
49
|
+
export declare const vResult: import("convex/values").VUnion<{
|
|
50
50
|
kind: "success";
|
|
51
51
|
returnValue: any;
|
|
52
52
|
} | {
|
|
@@ -71,15 +71,14 @@ export declare const vResultValidator: import("convex/values").VUnion<{
|
|
|
71
71
|
}, {
|
|
72
72
|
kind: import("convex/values").VLiteral<"canceled", "required">;
|
|
73
73
|
}, "required", "kind">], "required", "kind" | "returnValue" | `returnValue.${string}` | "error">;
|
|
74
|
-
export type RunResult = Infer<typeof
|
|
75
|
-
export declare const
|
|
74
|
+
export type RunResult = Infer<typeof vResult>;
|
|
75
|
+
export declare const vOnCompleteFnContext: import("convex/values").VObject<{
|
|
76
76
|
context?: any;
|
|
77
77
|
fnHandle: string;
|
|
78
78
|
}, {
|
|
79
79
|
fnHandle: import("convex/values").VString<string, "required">;
|
|
80
80
|
context: import("convex/values").VAny<any, "optional", string>;
|
|
81
81
|
}, "required", "fnHandle" | "context" | `context.${string}`>;
|
|
82
|
-
export type OnComplete = Infer<typeof onComplete>;
|
|
83
82
|
export type OnCompleteArgs = {
|
|
84
83
|
/**
|
|
85
84
|
* The ID of the work that completed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,KAAK,MAAM,EAAY,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,MAAM,+PAIlB,CAAC;AAEF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,eAAO,MAAM,MAAM,OAAO,CAAC;AAC3B,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAO,MAAM,IAAI,QAAc,CAAC;AAChC,eAAO,MAAM,GAAG,QAAY,CAAC;AAC7B,eAAO,MAAM,IAAI,QAAY,CAAC;AAE9B,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,KAAK,MAAM,EAAY,MAAM,cAAc,CAAC;AAErD,eAAO,MAAM,MAAM,+PAIlB,CAAC;AAEF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,eAAO,MAAM,MAAM,OAAO,CAAC;AAC3B,eAAO,MAAM,MAAM,QAAc,CAAC;AAClC,eAAO,MAAM,IAAI,QAAc,CAAC;AAChC,eAAO,MAAM,GAAG,QAAY,CAAC;AAC7B,eAAO,MAAM,IAAI,QAAY,CAAC;AAE9B,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,eAAO,MAAM,OAAO;;;;;;6CAGlB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAE3C,eAAO,MAAM,aAAa;;;;;;;;2DAIxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;gGAYnB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAE9C,eAAO,MAAM,oBAAoB;;;;;;4DAG/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+GAclB,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAatE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAEnD"}
|
package/dist/component/shared.js
CHANGED
|
@@ -20,7 +20,7 @@ export function getNextSegment() {
|
|
|
20
20
|
export function fromSegment(segment) {
|
|
21
21
|
return Number(segment) * SEGMENT_MS;
|
|
22
22
|
}
|
|
23
|
-
export const
|
|
23
|
+
export const vConfig = v.object({
|
|
24
24
|
maxParallelism: v.number(),
|
|
25
25
|
logLevel,
|
|
26
26
|
});
|
|
@@ -37,7 +37,7 @@ export const DEFAULT_RETRY_BEHAVIOR = {
|
|
|
37
37
|
};
|
|
38
38
|
// This ensures that the type satisfies the schema.
|
|
39
39
|
const _ = {};
|
|
40
|
-
export const
|
|
40
|
+
export const vResult = v.union(v.object({
|
|
41
41
|
kind: v.literal("success"),
|
|
42
42
|
returnValue: v.any(),
|
|
43
43
|
}), v.object({
|
|
@@ -46,7 +46,7 @@ export const vResultValidator = v.union(v.object({
|
|
|
46
46
|
}), v.object({
|
|
47
47
|
kind: v.literal("canceled"),
|
|
48
48
|
}));
|
|
49
|
-
export const
|
|
49
|
+
export const vOnCompleteFnContext = v.object({
|
|
50
50
|
fnHandle: v.string(), // mutation
|
|
51
51
|
context: v.optional(v.any()),
|
|
52
52
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAe,QAAQ,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAC3B,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC;AAChC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"email": "support@convex.dev",
|
|
8
8
|
"url": "https://github.com/get-convex/workpool/issues"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.3.1
|
|
10
|
+
"version": "0.3.1",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
36
36
|
"prepare": "npm run build",
|
|
37
37
|
"alpha": "npm run clean && npm ci && run-p test lint typecheck && npm version prerelease --preid alpha && npm publish --tag alpha && git push --tags",
|
|
38
|
-
"release": "npm run clean && npm ci && run-p test lint typecheck && npm version patch && npm publish && git push --tags",
|
|
38
|
+
"release": "(npm whoami || npm login) && npm run clean && npm ci && run-p test lint typecheck && npm version patch && npm publish && git push --tags",
|
|
39
39
|
"version": "pbcopy <<<$npm_package_version; vim CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
@@ -67,31 +67,31 @@
|
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@edge-runtime/vm": "5.0.0",
|
|
70
|
-
"@eslint/eslintrc": "3.3.
|
|
71
|
-
"@eslint/js": "9.39.
|
|
72
|
-
"@types/node": "20.19.
|
|
73
|
-
"@types/react": "19.2.
|
|
74
|
-
"@types/react-dom": "19.2.
|
|
75
|
-
"@vitejs/plugin-react": "5.1.
|
|
76
|
-
"@vitest/coverage-v8": "
|
|
70
|
+
"@eslint/eslintrc": "3.3.3",
|
|
71
|
+
"@eslint/js": "9.39.2",
|
|
72
|
+
"@types/node": "20.19.27",
|
|
73
|
+
"@types/react": "19.2.7",
|
|
74
|
+
"@types/react-dom": "19.2.3",
|
|
75
|
+
"@vitejs/plugin-react": "5.1.2",
|
|
76
|
+
"@vitest/coverage-v8": "4.0.16",
|
|
77
77
|
"chokidar-cli": "3.0.0",
|
|
78
|
-
"convex": "1.
|
|
79
|
-
"convex-helpers": "0.1.
|
|
80
|
-
"convex-test": "0.0.
|
|
78
|
+
"convex": "1.31.3",
|
|
79
|
+
"convex-helpers": "0.1.108",
|
|
80
|
+
"convex-test": "0.0.41",
|
|
81
81
|
"cpy-cli": "6.0.0",
|
|
82
|
-
"eslint": "9.39.
|
|
82
|
+
"eslint": "9.39.2",
|
|
83
83
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
84
|
-
"eslint-plugin-react-refresh": "0.4.
|
|
85
|
-
"globals": "
|
|
84
|
+
"eslint-plugin-react-refresh": "0.4.26",
|
|
85
|
+
"globals": "17.0.0",
|
|
86
86
|
"npm-run-all2": "8.0.4",
|
|
87
|
-
"pkg-pr-new": "0.0.
|
|
88
|
-
"prettier": "3.
|
|
89
|
-
"react": "19.2.
|
|
90
|
-
"react-dom": "19.2.
|
|
87
|
+
"pkg-pr-new": "0.0.62",
|
|
88
|
+
"prettier": "3.7.4",
|
|
89
|
+
"react": "19.2.3",
|
|
90
|
+
"react-dom": "19.2.3",
|
|
91
91
|
"typescript": "5.9.3",
|
|
92
|
-
"typescript-eslint": "8.
|
|
93
|
-
"vite": "7.1
|
|
94
|
-
"vitest": "
|
|
92
|
+
"typescript-eslint": "8.52.0",
|
|
93
|
+
"vite": "7.3.1",
|
|
94
|
+
"vitest": "4.0.16"
|
|
95
95
|
},
|
|
96
96
|
"types": "./dist/client/index.d.ts",
|
|
97
97
|
"module": "./dist/client/index.js"
|
package/src/client/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createFunctionHandle,
|
|
3
3
|
type DefaultFunctionArgs,
|
|
4
|
+
type FunctionArgs,
|
|
4
5
|
type FunctionHandle,
|
|
5
6
|
type FunctionReference,
|
|
6
7
|
type FunctionType,
|
|
@@ -18,17 +19,15 @@ import {
|
|
|
18
19
|
type VString,
|
|
19
20
|
} from "convex/values";
|
|
20
21
|
import type { ComponentApi } from "../component/_generated/component.js";
|
|
21
|
-
import {
|
|
22
|
+
import { type LogLevel } from "../component/logging.js";
|
|
22
23
|
import {
|
|
23
24
|
type Config,
|
|
24
|
-
DEFAULT_MAX_PARALLELISM,
|
|
25
25
|
DEFAULT_RETRY_BEHAVIOR,
|
|
26
|
-
type OnComplete,
|
|
27
26
|
type RetryBehavior,
|
|
28
27
|
type RunResult,
|
|
29
28
|
type OnCompleteArgs as SharedOnCompleteArgs,
|
|
30
29
|
type Status,
|
|
31
|
-
|
|
30
|
+
vResult,
|
|
32
31
|
} from "../component/shared.js";
|
|
33
32
|
import {
|
|
34
33
|
type RunMutationCtx,
|
|
@@ -37,16 +36,21 @@ import {
|
|
|
37
36
|
} from "./utils.js";
|
|
38
37
|
export { logLevel as vLogLevel, type LogLevel } from "../component/logging.js";
|
|
39
38
|
export { retryBehavior as vRetryBehavior } from "../component/shared.js";
|
|
40
|
-
export { vResultValidator, type RetryBehavior, type RunResult };
|
|
41
39
|
|
|
42
40
|
export type WorkId = string & { __isWorkId: true };
|
|
43
|
-
export const
|
|
41
|
+
export const vWorkId = v.string() as VString<WorkId>;
|
|
44
42
|
export {
|
|
43
|
+
vResult,
|
|
45
44
|
DEFAULT_RETRY_BEHAVIOR,
|
|
46
|
-
/** @deprecated Use `
|
|
47
|
-
|
|
48
|
-
/** @deprecated Use `
|
|
49
|
-
|
|
45
|
+
/** @deprecated Use `vResult` instead. */
|
|
46
|
+
vResult as resultValidator,
|
|
47
|
+
/** @deprecated Use `vWorkId` instead. */
|
|
48
|
+
vWorkId as workIdValidator,
|
|
49
|
+
// Older name, not deprecated yet
|
|
50
|
+
vWorkId as vWorkIdValidator,
|
|
51
|
+
vResult as vResultValidator,
|
|
52
|
+
type RetryBehavior,
|
|
53
|
+
type RunResult,
|
|
50
54
|
};
|
|
51
55
|
/** Equivalent to `vOnCompleteArgs(<your-context-validator>)`. */
|
|
52
56
|
export const vOnComplete = vOnCompleteArgs(v.any());
|
|
@@ -234,7 +238,7 @@ export class Workpool {
|
|
|
234
238
|
async cancel(ctx: RunMutationCtx, id: WorkId): Promise<void> {
|
|
235
239
|
await ctx.runMutation(this.component.lib.cancel, {
|
|
236
240
|
id,
|
|
237
|
-
logLevel: this.options.logLevel
|
|
241
|
+
logLevel: this.options.logLevel,
|
|
238
242
|
});
|
|
239
243
|
}
|
|
240
244
|
/**
|
|
@@ -247,10 +251,11 @@ export class Workpool {
|
|
|
247
251
|
options?: { limit?: number },
|
|
248
252
|
): Promise<void> {
|
|
249
253
|
await ctx.runMutation(this.component.lib.cancelAll, {
|
|
250
|
-
logLevel: this.options.logLevel
|
|
254
|
+
logLevel: this.options.logLevel,
|
|
251
255
|
...options,
|
|
252
256
|
});
|
|
253
257
|
}
|
|
258
|
+
|
|
254
259
|
/**
|
|
255
260
|
* Gets the status of a work item.
|
|
256
261
|
*
|
|
@@ -337,9 +342,9 @@ export function vOnCompleteArgs<
|
|
|
337
342
|
V extends Validator<any, "required", any> = VAny,
|
|
338
343
|
>(context?: V) {
|
|
339
344
|
return v.object({
|
|
340
|
-
workId:
|
|
345
|
+
workId: vWorkId,
|
|
341
346
|
context: (context ?? v.optional(v.any())) as V,
|
|
342
|
-
result:
|
|
347
|
+
result: vResult,
|
|
343
348
|
});
|
|
344
349
|
}
|
|
345
350
|
|
|
@@ -355,7 +360,8 @@ export type RetryOption = {
|
|
|
355
360
|
|
|
356
361
|
export type WorkpoolOptions = {
|
|
357
362
|
/** How many actions/mutations can be running at once within this pool.
|
|
358
|
-
*
|
|
363
|
+
* Suggested max: 100 on Pro, 20 on free plan.
|
|
364
|
+
* If set to 0, no new work will be started.
|
|
359
365
|
*/
|
|
360
366
|
maxParallelism?: number;
|
|
361
367
|
/** How much to log. This is updated on each call to `enqueue*`,
|
|
@@ -495,23 +501,25 @@ async function enqueueArgs(
|
|
|
495
501
|
typeof fn === "string" && fn.startsWith("function://")
|
|
496
502
|
? [fn, opts?.name ?? fn]
|
|
497
503
|
: [await createFunctionHandle(fn), opts?.name ?? safeFunctionName(fn)];
|
|
498
|
-
const onComplete: OnComplete | undefined = opts?.onComplete
|
|
499
|
-
? {
|
|
500
|
-
fnHandle: await createFunctionHandle(opts.onComplete),
|
|
501
|
-
context: opts.context,
|
|
502
|
-
}
|
|
503
|
-
: undefined;
|
|
504
504
|
return {
|
|
505
505
|
fnHandle,
|
|
506
506
|
fnName,
|
|
507
|
-
onComplete
|
|
507
|
+
onComplete: opts?.onComplete
|
|
508
|
+
? {
|
|
509
|
+
fnHandle: await createFunctionHandle(opts.onComplete),
|
|
510
|
+
context: opts.context,
|
|
511
|
+
}
|
|
512
|
+
: undefined,
|
|
508
513
|
runAt: getRunAt(opts),
|
|
509
514
|
retryBehavior: opts?.retryBehavior,
|
|
510
515
|
config: {
|
|
511
|
-
logLevel: opts?.logLevel
|
|
512
|
-
maxParallelism: opts?.maxParallelism
|
|
516
|
+
logLevel: opts?.logLevel,
|
|
517
|
+
maxParallelism: opts?.maxParallelism,
|
|
513
518
|
},
|
|
514
|
-
}
|
|
519
|
+
} satisfies Omit<
|
|
520
|
+
FunctionArgs<ComponentApi["lib"]["enqueue"]>,
|
|
521
|
+
"fnArgs" | "fnType"
|
|
522
|
+
>;
|
|
515
523
|
}
|
|
516
524
|
|
|
517
525
|
function getRunAt(
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type * as complete from "../complete.js";
|
|
12
|
+
import type * as config from "../config.js";
|
|
12
13
|
import type * as crons from "../crons.js";
|
|
13
14
|
import type * as danger from "../danger.js";
|
|
14
15
|
import type * as kick from "../kick.js";
|
|
@@ -29,6 +30,7 @@ import { anyApi, componentsGeneric } from "convex/server";
|
|
|
29
30
|
|
|
30
31
|
const fullApi: ApiFromModules<{
|
|
31
32
|
complete: typeof complete;
|
|
33
|
+
config: typeof config;
|
|
32
34
|
crons: typeof crons;
|
|
33
35
|
danger: typeof danger;
|
|
34
36
|
kick: typeof kick;
|
|
@@ -23,13 +23,25 @@ import type { FunctionReference } from "convex/server";
|
|
|
23
23
|
*/
|
|
24
24
|
export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
25
25
|
{
|
|
26
|
+
config: {
|
|
27
|
+
update: FunctionReference<
|
|
28
|
+
"mutation",
|
|
29
|
+
"internal",
|
|
30
|
+
{
|
|
31
|
+
logLevel?: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
32
|
+
maxParallelism?: number;
|
|
33
|
+
},
|
|
34
|
+
any,
|
|
35
|
+
Name
|
|
36
|
+
>;
|
|
37
|
+
};
|
|
26
38
|
lib: {
|
|
27
39
|
cancel: FunctionReference<
|
|
28
40
|
"mutation",
|
|
29
41
|
"internal",
|
|
30
42
|
{
|
|
31
43
|
id: string;
|
|
32
|
-
logLevel
|
|
44
|
+
logLevel?: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
33
45
|
},
|
|
34
46
|
any,
|
|
35
47
|
Name
|
|
@@ -40,7 +52,7 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
40
52
|
{
|
|
41
53
|
before?: number;
|
|
42
54
|
limit?: number;
|
|
43
|
-
logLevel
|
|
55
|
+
logLevel?: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
44
56
|
},
|
|
45
57
|
any,
|
|
46
58
|
Name
|
|
@@ -50,8 +62,8 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
50
62
|
"internal",
|
|
51
63
|
{
|
|
52
64
|
config: {
|
|
53
|
-
logLevel
|
|
54
|
-
maxParallelism
|
|
65
|
+
logLevel?: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
66
|
+
maxParallelism?: number;
|
|
55
67
|
};
|
|
56
68
|
fnArgs: any;
|
|
57
69
|
fnHandle: string;
|
|
@@ -73,8 +85,8 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
73
85
|
"internal",
|
|
74
86
|
{
|
|
75
87
|
config: {
|
|
76
|
-
logLevel
|
|
77
|
-
maxParallelism
|
|
88
|
+
logLevel?: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
89
|
+
maxParallelism?: number;
|
|
78
90
|
};
|
|
79
91
|
items: Array<{
|
|
80
92
|
fnArgs: any;
|
|
@@ -38,7 +38,7 @@ export type Doc<TableName extends TableNames> = DocumentByName<
|
|
|
38
38
|
* Convex documents are uniquely identified by their `Id`, which is accessible
|
|
39
39
|
* on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
|
|
40
40
|
*
|
|
41
|
-
* Documents can be loaded using `db.get(id)` in query and mutation functions.
|
|
41
|
+
* Documents can be loaded using `db.get(tableName, id)` in query and mutation functions.
|
|
42
42
|
*
|
|
43
43
|
* IDs are just strings at runtime, but this type can be used to distinguish them from other
|
|
44
44
|
* strings when type checking.
|
|
@@ -4,11 +4,7 @@ import type { Id } from "./_generated/dataModel.js";
|
|
|
4
4
|
import { internalMutation, type MutationCtx } from "./_generated/server.js";
|
|
5
5
|
import { kickMainLoop } from "./kick.js";
|
|
6
6
|
import { createLogger } from "./logging.js";
|
|
7
|
-
import {
|
|
8
|
-
type OnCompleteArgs,
|
|
9
|
-
type RunResult,
|
|
10
|
-
vResultValidator,
|
|
11
|
-
} from "./shared.js";
|
|
7
|
+
import { type OnCompleteArgs, type RunResult, vResult } from "./shared.js";
|
|
12
8
|
import { recordCompleted } from "./stats.js";
|
|
13
9
|
|
|
14
10
|
export type CompleteJob = Infer<typeof completeArgs.fields.jobs.element>;
|
|
@@ -16,7 +12,7 @@ export type CompleteJob = Infer<typeof completeArgs.fields.jobs.element>;
|
|
|
16
12
|
export const completeArgs = v.object({
|
|
17
13
|
jobs: v.array(
|
|
18
14
|
v.object({
|
|
19
|
-
runResult:
|
|
15
|
+
runResult: vResult,
|
|
20
16
|
workId: v.id("work"),
|
|
21
17
|
attempt: v.number(),
|
|
22
18
|
}),
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { convexTest } from "convex-test";
|
|
2
|
+
import { assert, expect, test } from "vitest";
|
|
3
|
+
import { DEFAULT_LOG_LEVEL } from "./logging.js";
|
|
4
|
+
import schema from "./schema.js";
|
|
5
|
+
import { modules } from "./setup.test.js";
|
|
6
|
+
import { DEFAULT_MAX_PARALLELISM } from "./shared.js";
|
|
7
|
+
import { getOrUpdateGlobals } from "./config.js";
|
|
8
|
+
|
|
9
|
+
test("it updates the globals when they change", async () => {
|
|
10
|
+
const t = convexTest(schema, modules);
|
|
11
|
+
await t.run(async (ctx) => {
|
|
12
|
+
await getOrUpdateGlobals(ctx, {
|
|
13
|
+
maxParallelism: DEFAULT_MAX_PARALLELISM,
|
|
14
|
+
logLevel: DEFAULT_LOG_LEVEL,
|
|
15
|
+
});
|
|
16
|
+
const globals = await ctx.db.query("globals").unique();
|
|
17
|
+
expect(globals).not.toBeNull();
|
|
18
|
+
assert(globals);
|
|
19
|
+
expect(globals.maxParallelism).toBe(DEFAULT_MAX_PARALLELISM);
|
|
20
|
+
expect(globals.logLevel).toBe(DEFAULT_LOG_LEVEL);
|
|
21
|
+
await getOrUpdateGlobals(ctx, {
|
|
22
|
+
maxParallelism: DEFAULT_MAX_PARALLELISM + 1,
|
|
23
|
+
logLevel: "ERROR",
|
|
24
|
+
});
|
|
25
|
+
const after = await ctx.db.query("globals").unique();
|
|
26
|
+
expect(after).not.toBeNull();
|
|
27
|
+
assert(after);
|
|
28
|
+
expect(after.maxParallelism).toBe(DEFAULT_MAX_PARALLELISM + 1);
|
|
29
|
+
expect(after.logLevel).toBe("ERROR");
|
|
30
|
+
});
|
|
31
|
+
});
|