@convex-dev/workpool 0.2.15 → 0.2.17-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 +2 -0
- package/dist/commonjs/client/index.d.ts +1 -1
- package/dist/commonjs/component/danger.d.ts +6 -0
- package/dist/commonjs/component/danger.d.ts.map +1 -0
- package/dist/commonjs/component/danger.js +35 -0
- package/dist/commonjs/component/danger.js.map +1 -0
- package/dist/commonjs/component/stats.d.ts +1 -1
- package/dist/commonjs/component/stats.d.ts.map +1 -1
- package/dist/commonjs/component/stats.js +7 -25
- package/dist/commonjs/component/stats.js.map +1 -1
- package/dist/esm/client/index.d.ts +1 -1
- package/dist/esm/component/danger.d.ts +6 -0
- package/dist/esm/component/danger.d.ts.map +1 -0
- package/dist/esm/component/danger.js +35 -0
- package/dist/esm/component/danger.js.map +1 -0
- package/dist/esm/component/stats.d.ts +1 -1
- package/dist/esm/component/stats.d.ts.map +1 -1
- package/dist/esm/component/stats.js +7 -25
- package/dist/esm/component/stats.js.map +1 -1
- package/package.json +15 -14
- package/src/client/index.ts +1 -1
- package/src/component/_generated/api.d.ts +2 -0
- package/src/component/danger.ts +47 -0
- package/src/component/kick.test.ts +9 -2
- package/src/component/loop.test.ts +0 -1
- package/src/component/stats.ts +8 -31
package/README.md
CHANGED
|
@@ -131,6 +131,7 @@ and more typesafe when handling the "success" case.
|
|
|
131
131
|
|
|
132
132
|
You can also use this equivalent helper to define an `onComplete` mutation.
|
|
133
133
|
Note the `DataModel` type parameter, if you want ctx.db to be type safe.
|
|
134
|
+
|
|
134
135
|
```ts
|
|
135
136
|
export const emailSent = pool.defineOnComplete<DataModel>({
|
|
136
137
|
context: v.object({ emailType: v.string(), userId: v.id("users") }),
|
|
@@ -279,6 +280,7 @@ See more example usage in [example.ts](./example/convex/example.ts).
|
|
|
279
280
|
Check out the [docstrings](./src/client/index.ts), but notable options include:
|
|
280
281
|
|
|
281
282
|
- `maxParallelism`: How many actions/mutations can run at once within this pool.
|
|
283
|
+
Avoid exceeding 100 on Pro, 20 on the free plan, across all workpools and workflows.
|
|
282
284
|
- `retryActionsByDefault`: Whether to retry actions that fail by default.
|
|
283
285
|
- `defaultRetryBehavior`: The default retry behavior for enqueued actions.
|
|
284
286
|
|
|
@@ -229,7 +229,7 @@ export type RetryOption = {
|
|
|
229
229
|
};
|
|
230
230
|
export type WorkpoolOptions = {
|
|
231
231
|
/** How many actions/mutations can be running at once within this pool.
|
|
232
|
-
* Min 1,
|
|
232
|
+
* Min 1, Suggested max: 100 on Pro, 20 on the free plan.
|
|
233
233
|
*/
|
|
234
234
|
maxParallelism?: number;
|
|
235
235
|
/** How much to log. This is updated on each call to `enqueue*`,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"danger.d.ts","sourceRoot":"","sources":["../../../src/component/danger.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,YAAY;;;;iBAgCvB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { internal } from "./_generated/api.js";
|
|
3
|
+
import { internalMutation, } from "./_generated/server.js";
|
|
4
|
+
const DEFAULT_OLDER_THAN = 1000 * 60 * 60 * 24;
|
|
5
|
+
export const clearPending = internalMutation({
|
|
6
|
+
args: {
|
|
7
|
+
olderThan: v.optional(v.number()),
|
|
8
|
+
before: v.optional(v.number()),
|
|
9
|
+
cursor: v.optional(v.string()),
|
|
10
|
+
},
|
|
11
|
+
handler: async (ctx, args) => {
|
|
12
|
+
const time = args.before ?? Date.now() - (args.olderThan ?? DEFAULT_OLDER_THAN);
|
|
13
|
+
const entries = await ctx.db
|
|
14
|
+
.query("pendingStart")
|
|
15
|
+
.withIndex("by_creation_time", (q) => q.lt("_creationTime", time))
|
|
16
|
+
.paginate({
|
|
17
|
+
cursor: args.cursor ?? null,
|
|
18
|
+
numItems: 100,
|
|
19
|
+
});
|
|
20
|
+
await Promise.all(entries.page.map(async (entry) => {
|
|
21
|
+
await ctx.db.delete(entry._id);
|
|
22
|
+
const work = await ctx.db.get(entry.workId);
|
|
23
|
+
if (work) {
|
|
24
|
+
await ctx.db.delete(work._id);
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
if (!entries.isDone) {
|
|
28
|
+
await ctx.scheduler.runAfter(0, internal.danger.clearPending, {
|
|
29
|
+
before: time,
|
|
30
|
+
cursor: entries.continueCursor,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=danger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"danger.js","sourceRoot":"","sources":["../../../src/component/danger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAO,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAGL,gBAAgB,GAIjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;IAC3C,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,cAAc,CAAC;aACrB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;aACjE,QAAQ,CAAC;YACR,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QACL,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC5D,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,OAAO,CAAC,cAAc;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -25,9 +25,9 @@ export declare const calculateBacklogAndReport: import("convex/server").Register
|
|
|
25
25
|
};
|
|
26
26
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
27
27
|
running: number;
|
|
28
|
+
cursor: string;
|
|
28
29
|
startSegment: bigint;
|
|
29
30
|
endSegment: bigint;
|
|
30
|
-
cursor: string;
|
|
31
31
|
}, Promise<void>>;
|
|
32
32
|
/**
|
|
33
33
|
* Warning: this should not be used from a mutation, as it will cause conflicts.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EAGP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,MAAM,EAAuB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EAGP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,MAAM,EAAuB,MAAM,cAAc,CAAC;AAKzE;;;GAGG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,QAMF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,KAAK,EAAE,MAAM,QASd;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,QASvD;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,GAAG,CAAC,eAAe,CAAC,EAC3B,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,MAAM,iBAkCrC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAoBpC,CAAC;AAiBH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;GA4BtB,CAAC"}
|
|
@@ -5,7 +5,6 @@ import { createLogger, logLevel, shouldLog } from "./logging.js";
|
|
|
5
5
|
import { internal } from "./_generated/api.js";
|
|
6
6
|
import schema from "./schema.js";
|
|
7
7
|
import { paginator } from "convex-helpers/server/pagination";
|
|
8
|
-
const BACKLOG_BATCH_SIZE = 100;
|
|
9
8
|
/**
|
|
10
9
|
* Record stats about work execution. Intended to be queried by Axiom or Datadog.
|
|
11
10
|
* See the [README](https://github.com/get-convex/workpool) for example queries.
|
|
@@ -77,31 +76,14 @@ export const calculateBacklogAndReport = internalMutation({
|
|
|
77
76
|
logLevel,
|
|
78
77
|
},
|
|
79
78
|
handler: async (ctx, args) => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
.withIndex("segment", (q) => q.gte("segment", args.startSegment).lt("segment", args.endSegment))
|
|
83
|
-
.paginate({
|
|
84
|
-
numItems: BACKLOG_BATCH_SIZE,
|
|
85
|
-
cursor: args.cursor,
|
|
86
|
-
});
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
const pendingStart = await ctx.db.query("pendingStart").count();
|
|
87
81
|
const console = createLogger(args.logLevel);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
await ctx.scheduler.runAfter(0, internal.stats.calculateBacklogAndReport, {
|
|
97
|
-
startSegment: args.startSegment,
|
|
98
|
-
endSegment: args.endSegment,
|
|
99
|
-
cursor: pendingStart.continueCursor,
|
|
100
|
-
report: args.report,
|
|
101
|
-
running: args.running,
|
|
102
|
-
logLevel: args.logLevel,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
82
|
+
recordReport(console, {
|
|
83
|
+
...args.report,
|
|
84
|
+
running: args.running,
|
|
85
|
+
backlog: pendingStart,
|
|
86
|
+
});
|
|
105
87
|
},
|
|
106
88
|
});
|
|
107
89
|
function recordReport(console, report) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EACL,gBAAgB,EAChB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAU,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -229,7 +229,7 @@ export type RetryOption = {
|
|
|
229
229
|
};
|
|
230
230
|
export type WorkpoolOptions = {
|
|
231
231
|
/** How many actions/mutations can be running at once within this pool.
|
|
232
|
-
* Min 1,
|
|
232
|
+
* Min 1, Suggested max: 100 on Pro, 20 on the free plan.
|
|
233
233
|
*/
|
|
234
234
|
maxParallelism?: number;
|
|
235
235
|
/** How much to log. This is updated on each call to `enqueue*`,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"danger.d.ts","sourceRoot":"","sources":["../../../src/component/danger.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,YAAY;;;;iBAgCvB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { internal } from "./_generated/api.js";
|
|
3
|
+
import { internalMutation, } from "./_generated/server.js";
|
|
4
|
+
const DEFAULT_OLDER_THAN = 1000 * 60 * 60 * 24;
|
|
5
|
+
export const clearPending = internalMutation({
|
|
6
|
+
args: {
|
|
7
|
+
olderThan: v.optional(v.number()),
|
|
8
|
+
before: v.optional(v.number()),
|
|
9
|
+
cursor: v.optional(v.string()),
|
|
10
|
+
},
|
|
11
|
+
handler: async (ctx, args) => {
|
|
12
|
+
const time = args.before ?? Date.now() - (args.olderThan ?? DEFAULT_OLDER_THAN);
|
|
13
|
+
const entries = await ctx.db
|
|
14
|
+
.query("pendingStart")
|
|
15
|
+
.withIndex("by_creation_time", (q) => q.lt("_creationTime", time))
|
|
16
|
+
.paginate({
|
|
17
|
+
cursor: args.cursor ?? null,
|
|
18
|
+
numItems: 100,
|
|
19
|
+
});
|
|
20
|
+
await Promise.all(entries.page.map(async (entry) => {
|
|
21
|
+
await ctx.db.delete(entry._id);
|
|
22
|
+
const work = await ctx.db.get(entry.workId);
|
|
23
|
+
if (work) {
|
|
24
|
+
await ctx.db.delete(work._id);
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
if (!entries.isDone) {
|
|
28
|
+
await ctx.scheduler.runAfter(0, internal.danger.clearPending, {
|
|
29
|
+
before: time,
|
|
30
|
+
cursor: entries.continueCursor,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=danger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"danger.js","sourceRoot":"","sources":["../../../src/component/danger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAO,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAGL,gBAAgB,GAIjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;IAC3C,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,cAAc,CAAC;aACrB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;aACjE,QAAQ,CAAC;YACR,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QACL,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC5D,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,OAAO,CAAC,cAAc;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -25,9 +25,9 @@ export declare const calculateBacklogAndReport: import("convex/server").Register
|
|
|
25
25
|
};
|
|
26
26
|
logLevel: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
27
27
|
running: number;
|
|
28
|
+
cursor: string;
|
|
28
29
|
startSegment: bigint;
|
|
29
30
|
endSegment: bigint;
|
|
30
|
-
cursor: string;
|
|
31
31
|
}, Promise<void>>;
|
|
32
32
|
/**
|
|
33
33
|
* Warning: this should not be used from a mutation, as it will cause conflicts.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EAGP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,MAAM,EAAuB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EAGP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,MAAM,EAAuB,MAAM,cAAc,CAAC;AAKzE;;;GAGG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,QAMF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,KAAK,EAAE,MAAM,QASd;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,QASvD;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,GAAG,CAAC,eAAe,CAAC,EAC3B,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,MAAM,iBAkCrC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAoBpC,CAAC;AAiBH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;GA4BtB,CAAC"}
|
|
@@ -5,7 +5,6 @@ import { createLogger, logLevel, shouldLog } from "./logging.js";
|
|
|
5
5
|
import { internal } from "./_generated/api.js";
|
|
6
6
|
import schema from "./schema.js";
|
|
7
7
|
import { paginator } from "convex-helpers/server/pagination";
|
|
8
|
-
const BACKLOG_BATCH_SIZE = 100;
|
|
9
8
|
/**
|
|
10
9
|
* Record stats about work execution. Intended to be queried by Axiom or Datadog.
|
|
11
10
|
* See the [README](https://github.com/get-convex/workpool) for example queries.
|
|
@@ -77,31 +76,14 @@ export const calculateBacklogAndReport = internalMutation({
|
|
|
77
76
|
logLevel,
|
|
78
77
|
},
|
|
79
78
|
handler: async (ctx, args) => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
.withIndex("segment", (q) => q.gte("segment", args.startSegment).lt("segment", args.endSegment))
|
|
83
|
-
.paginate({
|
|
84
|
-
numItems: BACKLOG_BATCH_SIZE,
|
|
85
|
-
cursor: args.cursor,
|
|
86
|
-
});
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
const pendingStart = await ctx.db.query("pendingStart").count();
|
|
87
81
|
const console = createLogger(args.logLevel);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
await ctx.scheduler.runAfter(0, internal.stats.calculateBacklogAndReport, {
|
|
97
|
-
startSegment: args.startSegment,
|
|
98
|
-
endSegment: args.endSegment,
|
|
99
|
-
cursor: pendingStart.continueCursor,
|
|
100
|
-
report: args.report,
|
|
101
|
-
running: args.running,
|
|
102
|
-
logLevel: args.logLevel,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
82
|
+
recordReport(console, {
|
|
83
|
+
...args.report,
|
|
84
|
+
running: args.running,
|
|
85
|
+
backlog: pendingStart,
|
|
86
|
+
});
|
|
105
87
|
},
|
|
106
88
|
});
|
|
107
89
|
function recordReport(console, report) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EACL,gBAAgB,EAChB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAU,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.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.2.
|
|
10
|
+
"version": "0.2.17-alpha.0",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
32
32
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
33
33
|
"alpha": "rm -rf dist && npm run build && npm run test && npm version prerelease --preid alpha && npm publish --tag alpha && git push --tags",
|
|
34
|
-
"release": "rm -rf dist && npm run build && npm run test && npm version patch && npm publish && git push --tags",
|
|
34
|
+
"release": "rm -rf dist && npm run build && npm run test && npm version patch && npm publish && git push --tags && git push",
|
|
35
35
|
"prepare": "npm run build",
|
|
36
36
|
"prepack": "node node10stubs.mjs",
|
|
37
37
|
"postpack": "node node10stubs.mjs --cleanup"
|
|
@@ -64,21 +64,22 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"convex": ">=1.
|
|
67
|
+
"convex": ">=1.25.0 <1.35.0",
|
|
68
68
|
"convex-helpers": "^0.1.94"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
|
-
"@edge-runtime/vm": "
|
|
72
|
-
"@eslint/js": "
|
|
73
|
-
"@types/node": "
|
|
74
|
-
"@vitest/coverage-v8": "
|
|
75
|
-
"convex-test": "
|
|
76
|
-
"eslint": "
|
|
77
|
-
"globals": "
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"typescript
|
|
81
|
-
"
|
|
71
|
+
"@edge-runtime/vm": "5.0.0",
|
|
72
|
+
"@eslint/js": "9.31.0",
|
|
73
|
+
"@types/node": "22.16.3",
|
|
74
|
+
"@vitest/coverage-v8": "3.2.4",
|
|
75
|
+
"convex-test": "0.0.38",
|
|
76
|
+
"eslint": "9.31.0",
|
|
77
|
+
"globals": "16.3.0",
|
|
78
|
+
"pkg-pr-new": "0.0.54",
|
|
79
|
+
"prettier": "3.6.2",
|
|
80
|
+
"typescript": "5.8.3",
|
|
81
|
+
"typescript-eslint": "8.36.0",
|
|
82
|
+
"vitest": "3.2.4"
|
|
82
83
|
},
|
|
83
84
|
"main": "./dist/commonjs/client/index.js",
|
|
84
85
|
"types": "./dist/commonjs/client/index.d.ts",
|
package/src/client/index.ts
CHANGED
|
@@ -289,7 +289,7 @@ export type RetryOption = {
|
|
|
289
289
|
|
|
290
290
|
export type WorkpoolOptions = {
|
|
291
291
|
/** How many actions/mutations can be running at once within this pool.
|
|
292
|
-
* Min 1,
|
|
292
|
+
* Min 1, Suggested max: 100 on Pro, 20 on the free plan.
|
|
293
293
|
*/
|
|
294
294
|
maxParallelism?: number;
|
|
295
295
|
/** How much to log. This is updated on each call to `enqueue*`,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import type * as complete from "../complete.js";
|
|
12
12
|
import type * as crons from "../crons.js";
|
|
13
|
+
import type * as danger from "../danger.js";
|
|
13
14
|
import type * as kick from "../kick.js";
|
|
14
15
|
import type * as lib from "../lib.js";
|
|
15
16
|
import type * as logging from "../logging.js";
|
|
@@ -36,6 +37,7 @@ import type {
|
|
|
36
37
|
declare const fullApi: ApiFromModules<{
|
|
37
38
|
complete: typeof complete;
|
|
38
39
|
crons: typeof crons;
|
|
40
|
+
danger: typeof danger;
|
|
39
41
|
kick: typeof kick;
|
|
40
42
|
lib: typeof lib;
|
|
41
43
|
logging: typeof logging;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { api, internal } from "./_generated/api.js";
|
|
3
|
+
import type { Doc, Id } from "./_generated/dataModel.js";
|
|
4
|
+
import {
|
|
5
|
+
action,
|
|
6
|
+
internalAction,
|
|
7
|
+
internalMutation,
|
|
8
|
+
internalQuery,
|
|
9
|
+
mutation,
|
|
10
|
+
query,
|
|
11
|
+
} from "./_generated/server.js";
|
|
12
|
+
|
|
13
|
+
const DEFAULT_OLDER_THAN = 1000 * 60 * 60 * 24;
|
|
14
|
+
|
|
15
|
+
export const clearPending = internalMutation({
|
|
16
|
+
args: {
|
|
17
|
+
olderThan: v.optional(v.number()),
|
|
18
|
+
before: v.optional(v.number()),
|
|
19
|
+
cursor: v.optional(v.string()),
|
|
20
|
+
},
|
|
21
|
+
handler: async (ctx, args) => {
|
|
22
|
+
const time =
|
|
23
|
+
args.before ?? Date.now() - (args.olderThan ?? DEFAULT_OLDER_THAN);
|
|
24
|
+
const entries = await ctx.db
|
|
25
|
+
.query("pendingStart")
|
|
26
|
+
.withIndex("by_creation_time", (q) => q.lt("_creationTime", time))
|
|
27
|
+
.paginate({
|
|
28
|
+
cursor: args.cursor ?? null,
|
|
29
|
+
numItems: 100,
|
|
30
|
+
});
|
|
31
|
+
await Promise.all(
|
|
32
|
+
entries.page.map(async (entry) => {
|
|
33
|
+
await ctx.db.delete(entry._id);
|
|
34
|
+
const work = await ctx.db.get(entry.workId);
|
|
35
|
+
if (work) {
|
|
36
|
+
await ctx.db.delete(work._id);
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
);
|
|
40
|
+
if (!entries.isDone) {
|
|
41
|
+
await ctx.scheduler.runAfter(0, internal.danger.clearPending, {
|
|
42
|
+
before: time,
|
|
43
|
+
cursor: entries.continueCursor,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
vi,
|
|
10
10
|
} from "vitest";
|
|
11
11
|
import { internal } from "./_generated/api";
|
|
12
|
-
import { Id } from "./_generated/dataModel.js";
|
|
13
12
|
import { kickMainLoop } from "./kick.js";
|
|
14
13
|
import { DEFAULT_LOG_LEVEL } from "./logging.js";
|
|
15
14
|
import schema from "./schema.js";
|
|
@@ -276,13 +275,18 @@ describe("kickMainLoop", () => {
|
|
|
276
275
|
const runStatus = await ctx.db.query("runStatus").unique();
|
|
277
276
|
assert(runStatus);
|
|
278
277
|
const segment = getNextSegment() + 10n;
|
|
278
|
+
const scheduledId = await ctx.scheduler.runAfter(
|
|
279
|
+
10_000,
|
|
280
|
+
internal.loop.main,
|
|
281
|
+
{ generation: 0n, segment }
|
|
282
|
+
);
|
|
279
283
|
await ctx.db.patch(runStatus._id, {
|
|
280
284
|
state: {
|
|
281
285
|
generation: 0n,
|
|
282
286
|
saturated: false,
|
|
283
287
|
kind: "scheduled",
|
|
284
288
|
segment,
|
|
285
|
-
scheduledId
|
|
289
|
+
scheduledId,
|
|
286
290
|
},
|
|
287
291
|
});
|
|
288
292
|
// await all scheduled functions to run
|
|
@@ -291,6 +295,9 @@ describe("kickMainLoop", () => {
|
|
|
291
295
|
assert(afterStatus);
|
|
292
296
|
expect(afterStatus.state.kind).toBe("running");
|
|
293
297
|
assert(afterStatus.state.kind === "running");
|
|
298
|
+
const scheduledJob = await ctx.db.system.get(scheduledId);
|
|
299
|
+
assert(scheduledJob);
|
|
300
|
+
expect(scheduledJob.state.kind).toBe("canceled");
|
|
294
301
|
});
|
|
295
302
|
});
|
|
296
303
|
});
|
package/src/component/stats.ts
CHANGED
|
@@ -15,8 +15,6 @@ import { internal } from "./_generated/api.js";
|
|
|
15
15
|
import schema from "./schema.js";
|
|
16
16
|
import { paginator } from "convex-helpers/server/pagination";
|
|
17
17
|
|
|
18
|
-
const BACKLOG_BATCH_SIZE = 100;
|
|
19
|
-
|
|
20
18
|
/**
|
|
21
19
|
* Record stats about work execution. Intended to be queried by Axiom or Datadog.
|
|
22
20
|
* See the [README](https://github.com/get-convex/workpool) for example queries.
|
|
@@ -114,36 +112,15 @@ export const calculateBacklogAndReport = internalMutation({
|
|
|
114
112
|
logLevel,
|
|
115
113
|
},
|
|
116
114
|
handler: async (ctx, args) => {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
q.gte("segment", args.startSegment).lt("segment", args.endSegment)
|
|
121
|
-
)
|
|
122
|
-
.paginate({
|
|
123
|
-
numItems: BACKLOG_BATCH_SIZE,
|
|
124
|
-
cursor: args.cursor,
|
|
125
|
-
});
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
+
const pendingStart = await (ctx.db.query("pendingStart") as any).count();
|
|
117
|
+
|
|
126
118
|
const console = createLogger(args.logLevel);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
});
|
|
133
|
-
} else {
|
|
134
|
-
await ctx.scheduler.runAfter(
|
|
135
|
-
0,
|
|
136
|
-
internal.stats.calculateBacklogAndReport,
|
|
137
|
-
{
|
|
138
|
-
startSegment: args.startSegment,
|
|
139
|
-
endSegment: args.endSegment,
|
|
140
|
-
cursor: pendingStart.continueCursor,
|
|
141
|
-
report: args.report,
|
|
142
|
-
running: args.running,
|
|
143
|
-
logLevel: args.logLevel,
|
|
144
|
-
}
|
|
145
|
-
);
|
|
146
|
-
}
|
|
119
|
+
recordReport(console, {
|
|
120
|
+
...args.report,
|
|
121
|
+
running: args.running,
|
|
122
|
+
backlog: pendingStart,
|
|
123
|
+
});
|
|
147
124
|
},
|
|
148
125
|
});
|
|
149
126
|
|