@convex-dev/workpool 0.4.6 → 0.4.7-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/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/complete.d.ts.map +1 -1
- package/dist/component/complete.js +8 -7
- package/dist/component/complete.js.map +1 -1
- package/dist/component/danger.js +7 -7
- package/dist/component/danger.js.map +1 -1
- package/dist/component/future.d.ts +11 -0
- package/dist/component/future.d.ts.map +1 -0
- package/dist/component/future.js +21 -0
- package/dist/component/future.js.map +1 -0
- package/dist/component/kick.d.ts +3 -3
- package/dist/component/kick.d.ts.map +1 -1
- package/dist/component/kick.js +14 -16
- package/dist/component/kick.js.map +1 -1
- package/dist/component/lib.d.ts.map +1 -1
- package/dist/component/lib.js +13 -13
- package/dist/component/lib.js.map +1 -1
- package/dist/component/loop.d.ts +44 -1
- package/dist/component/loop.d.ts.map +1 -1
- package/dist/component/loop.js +171 -217
- package/dist/component/loop.js.map +1 -1
- package/dist/component/recovery.d.ts.map +1 -1
- package/dist/component/recovery.js +2 -2
- package/dist/component/recovery.js.map +1 -1
- 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/dist/component/worker.js +1 -1
- package/dist/component/worker.js.map +1 -1
- package/package.json +8 -12
- package/src/component/_generated/api.ts +2 -0
- package/src/component/complete.test.ts +13 -13
- package/src/component/complete.ts +13 -7
- package/src/component/danger.ts +7 -7
- package/src/component/future.ts +38 -0
- package/src/component/kick.test.ts +17 -20
- package/src/component/kick.ts +20 -17
- package/src/component/lib.test.ts +7 -7
- package/src/component/lib.ts +12 -15
- package/src/component/loop.test.ts +695 -1127
- package/src/component/loop.ts +212 -283
- package/src/component/recovery.test.ts +3 -3
- package/src/component/recovery.ts +5 -2
- package/src/component/schema.ts +2 -1
- package/src/component/stateMachine.test.ts +1246 -0
- package/src/component/stats.test.ts +4 -4
- package/src/component/worker.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/component/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI5E,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;sBAShB,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO;;;;;;;iBAGlB,CAAC;AAGH,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/component/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI5E,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;sBAShB,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO;;;;;;;iBAGlB,CAAC;AAGH,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,YAAY,CAAC,iBAmErC"}
|
|
@@ -46,7 +46,7 @@ export async function recoveryHandler(ctx, { jobs }) {
|
|
|
46
46
|
console.debug(`${preamble} already in pendingCompletion, skipping`);
|
|
47
47
|
continue;
|
|
48
48
|
}
|
|
49
|
-
const work = await ctx.db.get(job.workId);
|
|
49
|
+
const work = await ctx.db.get("work", job.workId);
|
|
50
50
|
if (work === null) {
|
|
51
51
|
// Completion already executed w/o retries, no need to do anything.
|
|
52
52
|
console.warn(`${preamble} work not found, skipping`);
|
|
@@ -57,7 +57,7 @@ export async function recoveryHandler(ctx, { jobs }) {
|
|
|
57
57
|
console.warn(`${preamble} attempts mismatch, skipping`);
|
|
58
58
|
continue;
|
|
59
59
|
}
|
|
60
|
-
const scheduled = await ctx.db.system.get(job.scheduledId);
|
|
60
|
+
const scheduled = await ctx.db.system.get("_scheduled_functions", job.scheduledId);
|
|
61
61
|
if (scheduled === null) {
|
|
62
62
|
console.warn(`${preamble} not found in _scheduled_functions`);
|
|
63
63
|
completionJobs.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/component/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,CAAC,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAoB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAoB,eAAe,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,KAAK,CACX,CAAC,CAAC,MAAM,CAAC;QACP,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC;QACzC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACH;CACF,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC;IACtC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAC;AAEH,4BAA4B;AAC5B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAgB,EAChB,EAAE,IAAI,EAA8B;IAEpC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,cAAc,GAAkB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,4BAA4B,GAAG,CAAC,WAAW,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC;QACtF,MAAM,iBAAiB,GAAG,MAAM,GAAG,CAAC,EAAE;aACnC,KAAK,CAAC,mBAAmB,CAAC;aAC1B,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;aACtD,KAAK,EAAE,CAAC;QACX,IAAI,iBAAiB,EAAE,CAAC;YACtB,sDAAsD;YACtD,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,yCAAyC,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/component/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,wBA8FG"}
|
package/dist/component/schema.js
CHANGED
|
@@ -10,6 +10,7 @@ export default defineSchema({
|
|
|
10
10
|
internalState: defineTable({
|
|
11
11
|
// Ensure that only one main is running at a time.
|
|
12
12
|
generation: v.int64(),
|
|
13
|
+
// Track where we've scanned to, so we skip tombstones on re-scan.
|
|
13
14
|
segmentCursors: v.object({
|
|
14
15
|
incoming: segment,
|
|
15
16
|
completion: segment,
|
|
@@ -31,7 +32,7 @@ export default defineSchema({
|
|
|
31
32
|
started: v.number(),
|
|
32
33
|
})),
|
|
33
34
|
}),
|
|
34
|
-
// Singleton, written by `
|
|
35
|
+
// Singleton, written by `main` when scheduling, by client or worker otherwise.
|
|
35
36
|
// Safe to read from kickLoop, since it should update infrequently.
|
|
36
37
|
runStatus: defineTable({
|
|
37
38
|
state: v.union(v.object({ kind: v.literal("running") }), v.object({
|
|
@@ -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,OAAO,EACP,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,8CAA8C;AAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AAE1B,eAAe,YAAY,CAAC;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;IAC7B,4CAA4C;IAC5C,aAAa,EAAE,WAAW,CAAC;QACzB,kDAAkD;QAClD,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE;QACrB,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC;YACvB,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,OAAO;YACnB,WAAW,EAAE,OAAO;SACrB,CAAC;QACF,YAAY,EAAE,OAAO;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;YACrE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,+CAA+C;YACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,2BAA2B;YAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,mCAAmC;YACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,yBAAyB;YAC/C,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;SACzB,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC;YACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC,CACH;KACF,CAAC;IAEF
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/component/worker.js
CHANGED
|
@@ -18,7 +18,7 @@ export const runMutationWrapper = internalMutation({
|
|
|
18
18
|
let fnArgs = args.fnArgs;
|
|
19
19
|
if (!fnArgs) {
|
|
20
20
|
assert(args.payloadId);
|
|
21
|
-
const payload = await ctx.db.get(args.payloadId);
|
|
21
|
+
const payload = await ctx.db.get("payload", args.payloadId);
|
|
22
22
|
assert(payload?.args);
|
|
23
23
|
fnArgs = payload.args;
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/component/worker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;IACjD,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1D,QAAQ;QACR,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/component/worker.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.4.
|
|
10
|
+
"version": "0.4.7-alpha.0",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -19,11 +19,10 @@
|
|
|
19
19
|
],
|
|
20
20
|
"type": "module",
|
|
21
21
|
"scripts": {
|
|
22
|
-
"dev": "
|
|
23
|
-
"dev:backend": "convex dev --typecheck-components",
|
|
22
|
+
"dev": "convex dev --start 'npm run dev:build'",
|
|
24
23
|
"dev:frontend": "cd example && vite --clearScreen false",
|
|
25
24
|
"dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
|
|
26
|
-
"predev": "
|
|
25
|
+
"predev": "convex init && npm run build:codegen",
|
|
27
26
|
"build": "tsc --project ./tsconfig.build.json",
|
|
28
27
|
"build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
|
|
29
28
|
"build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
|
|
@@ -31,12 +30,11 @@
|
|
|
31
30
|
"lint": "eslint .",
|
|
32
31
|
"format": "prettier --write .",
|
|
33
32
|
"format:check": "prettier --check .",
|
|
34
|
-
"all": "run-p -r 'dev:*' 'test:watch'",
|
|
35
33
|
"test": "vitest run --typecheck",
|
|
36
34
|
"test:watch": "vitest --typecheck --clearScreen false",
|
|
37
35
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
38
36
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
39
|
-
"preversion": "npm ci && npm run build:clean && run
|
|
37
|
+
"preversion": "npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck",
|
|
40
38
|
"alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
|
|
41
39
|
"release": "npm version patch && npm publish && git push --follow-tags",
|
|
42
40
|
"version": "(npm whoami || npm login) && vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
|
|
@@ -69,6 +67,7 @@
|
|
|
69
67
|
"convex-helpers": "^0.1.94"
|
|
70
68
|
},
|
|
71
69
|
"devDependencies": {
|
|
70
|
+
"@convex-dev/eslint-plugin": "^2.0.0",
|
|
72
71
|
"@edge-runtime/vm": "5.0.0",
|
|
73
72
|
"@eslint/eslintrc": "3.3.3",
|
|
74
73
|
"@eslint/js": "10.0.1",
|
|
@@ -78,23 +77,20 @@
|
|
|
78
77
|
"@vitejs/plugin-react": "5.1.3",
|
|
79
78
|
"@vitest/coverage-v8": "4.0.18",
|
|
80
79
|
"chokidar-cli": "3.0.0",
|
|
81
|
-
"convex": "1.
|
|
80
|
+
"convex": "1.35.1",
|
|
82
81
|
"convex-helpers": "0.1.111",
|
|
83
|
-
"convex-test": "0.0.
|
|
84
|
-
"cpy-cli": "7.0.0",
|
|
82
|
+
"convex-test": "0.0.51",
|
|
85
83
|
"eslint": "10.0.2",
|
|
86
84
|
"eslint-plugin-react-hooks": "7.1.0-canary-3f0b9e61-20260317",
|
|
87
85
|
"eslint-plugin-react-refresh": "0.5.0",
|
|
88
86
|
"globals": "17.3.0",
|
|
89
|
-
"npm-run-all2": "8.0.4",
|
|
90
|
-
"path-exists-cli": "2.0.0",
|
|
91
87
|
"pkg-pr-new": "0.0.63",
|
|
92
88
|
"prettier": "3.8.1",
|
|
93
89
|
"react": "19.2.4",
|
|
94
90
|
"react-dom": "19.2.4",
|
|
95
91
|
"typescript": "5.9.3",
|
|
96
92
|
"typescript-eslint": "8.56.1",
|
|
97
|
-
"vite": "7.3.
|
|
93
|
+
"vite": "7.3.2",
|
|
98
94
|
"vitest": "4.0.18"
|
|
99
95
|
},
|
|
100
96
|
"types": "./dist/client/index.d.ts",
|
|
@@ -12,6 +12,7 @@ import type * as complete from "../complete.js";
|
|
|
12
12
|
import type * as config from "../config.js";
|
|
13
13
|
import type * as crons from "../crons.js";
|
|
14
14
|
import type * as danger from "../danger.js";
|
|
15
|
+
import type * as future from "../future.js";
|
|
15
16
|
import type * as kick from "../kick.js";
|
|
16
17
|
import type * as lib from "../lib.js";
|
|
17
18
|
import type * as logging from "../logging.js";
|
|
@@ -33,6 +34,7 @@ const fullApi: ApiFromModules<{
|
|
|
33
34
|
config: typeof config;
|
|
34
35
|
crons: typeof crons;
|
|
35
36
|
danger: typeof danger;
|
|
37
|
+
future: typeof future;
|
|
36
38
|
kick: typeof kick;
|
|
37
39
|
lib: typeof lib;
|
|
38
40
|
logging: typeof logging;
|
|
@@ -69,7 +69,7 @@ describe("complete", () => {
|
|
|
69
69
|
|
|
70
70
|
// Verify work was deleted
|
|
71
71
|
await t.run(async (ctx) => {
|
|
72
|
-
const work = await ctx.db.get(workId);
|
|
72
|
+
const work = await ctx.db.get("work", workId);
|
|
73
73
|
expect(work).toBeNull();
|
|
74
74
|
});
|
|
75
75
|
|
|
@@ -119,7 +119,7 @@ describe("complete", () => {
|
|
|
119
119
|
|
|
120
120
|
// Verify work was not deleted (since it should be retried)
|
|
121
121
|
await t.run(async (ctx) => {
|
|
122
|
-
const work = await ctx.db.get(workId);
|
|
122
|
+
const work = await ctx.db.get("work", workId);
|
|
123
123
|
expect(work).not.toBeNull();
|
|
124
124
|
expect(work?.attempts).toBe(1); // Incremented from 0
|
|
125
125
|
});
|
|
@@ -157,9 +157,9 @@ describe("complete", () => {
|
|
|
157
157
|
|
|
158
158
|
// Update the work to simulate it's already been attempted once
|
|
159
159
|
await t.run(async (ctx) => {
|
|
160
|
-
const work = await ctx.db.get(workId);
|
|
160
|
+
const work = await ctx.db.get("work", workId);
|
|
161
161
|
if (work) {
|
|
162
|
-
await ctx.db.patch(work._id, { attempts: 1 });
|
|
162
|
+
await ctx.db.patch("work", work._id, { attempts: 1 });
|
|
163
163
|
}
|
|
164
164
|
});
|
|
165
165
|
|
|
@@ -178,7 +178,7 @@ describe("complete", () => {
|
|
|
178
178
|
|
|
179
179
|
// Verify work was deleted (since max attempts reached)
|
|
180
180
|
await t.run(async (ctx) => {
|
|
181
|
-
const work = await ctx.db.get(workId);
|
|
181
|
+
const work = await ctx.db.get("work", workId);
|
|
182
182
|
expect(work).toBeNull();
|
|
183
183
|
});
|
|
184
184
|
|
|
@@ -223,7 +223,7 @@ describe("complete", () => {
|
|
|
223
223
|
|
|
224
224
|
// Verify work was deleted
|
|
225
225
|
await t.run(async (ctx) => {
|
|
226
|
-
const work = await ctx.db.get(workId);
|
|
226
|
+
const work = await ctx.db.get("work", workId);
|
|
227
227
|
expect(work).toBeNull();
|
|
228
228
|
});
|
|
229
229
|
|
|
@@ -346,11 +346,11 @@ describe("complete", () => {
|
|
|
346
346
|
// Verify both jobs were processed correctly
|
|
347
347
|
await t.run(async (ctx) => {
|
|
348
348
|
// First job should be deleted
|
|
349
|
-
const work1 = await ctx.db.get(workId1);
|
|
349
|
+
const work1 = await ctx.db.get("work", workId1);
|
|
350
350
|
expect(work1).toBeNull();
|
|
351
351
|
|
|
352
352
|
// Second job should still exist (for retry)
|
|
353
|
-
const work2 = await ctx.db.get(workId2);
|
|
353
|
+
const work2 = await ctx.db.get("work", workId2);
|
|
354
354
|
expect(work2).not.toBeNull();
|
|
355
355
|
expect(work2?.attempts).toBe(1);
|
|
356
356
|
|
|
@@ -378,9 +378,9 @@ describe("complete", () => {
|
|
|
378
378
|
|
|
379
379
|
// Update the work to have a different attempt number
|
|
380
380
|
await t.run(async (ctx) => {
|
|
381
|
-
const work = await ctx.db.get(workId);
|
|
381
|
+
const work = await ctx.db.get("work", workId);
|
|
382
382
|
if (work) {
|
|
383
|
-
await ctx.db.patch(work._id, { attempts: 5 });
|
|
383
|
+
await ctx.db.patch("work", work._id, { attempts: 5 });
|
|
384
384
|
}
|
|
385
385
|
});
|
|
386
386
|
|
|
@@ -399,7 +399,7 @@ describe("complete", () => {
|
|
|
399
399
|
|
|
400
400
|
// Verify work was not modified
|
|
401
401
|
await t.run(async (ctx) => {
|
|
402
|
-
const work = await ctx.db.get(workId);
|
|
402
|
+
const work = await ctx.db.get("work", workId);
|
|
403
403
|
expect(work).not.toBeNull();
|
|
404
404
|
expect(work?.attempts).toBe(5); // Should remain unchanged
|
|
405
405
|
});
|
|
@@ -449,7 +449,7 @@ describe("complete", () => {
|
|
|
449
449
|
// Verify the first call was processed correctly
|
|
450
450
|
await t.run(async (ctx) => {
|
|
451
451
|
// Work should still exist (for retry)
|
|
452
|
-
const work = await ctx.db.get(workId);
|
|
452
|
+
const work = await ctx.db.get("work", workId);
|
|
453
453
|
expect(work).not.toBeNull();
|
|
454
454
|
expect(work?.attempts).toBe(1); // Incremented from 0
|
|
455
455
|
|
|
@@ -491,7 +491,7 @@ describe("complete", () => {
|
|
|
491
491
|
// Verify the second call was not processed
|
|
492
492
|
await t.run(async (ctx) => {
|
|
493
493
|
// Work should still have the same attempt count
|
|
494
|
-
const work = await ctx.db.get(workId);
|
|
494
|
+
const work = await ctx.db.get("work", workId);
|
|
495
495
|
expect(work).not.toBeNull();
|
|
496
496
|
expect(work?.attempts).toBe(1); // Still 1, not incremented again
|
|
497
497
|
|
|
@@ -5,7 +5,12 @@ import { internal } from "./_generated/api.js";
|
|
|
5
5
|
import { internalMutation, type MutationCtx } from "./_generated/server.js";
|
|
6
6
|
import { kickMainLoop } from "./kick.js";
|
|
7
7
|
import { createLogger } from "./logging.js";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
getCurrentSegment,
|
|
10
|
+
type OnCompleteArgs,
|
|
11
|
+
type RunResult,
|
|
12
|
+
vResult,
|
|
13
|
+
} from "./shared.js";
|
|
9
14
|
import { recordCompleted } from "./stats.js";
|
|
10
15
|
import { assert } from "convex-helpers";
|
|
11
16
|
|
|
@@ -40,7 +45,7 @@ export async function completeHandler(
|
|
|
40
45
|
const jobAndWorks = (
|
|
41
46
|
await Promise.all(
|
|
42
47
|
args.jobs.map(async (job) => {
|
|
43
|
-
const work = await ctx.db.get(job.workId);
|
|
48
|
+
const work = await ctx.db.get("work", job.workId);
|
|
44
49
|
if (!work) {
|
|
45
50
|
console.warn(
|
|
46
51
|
`[complete] ${job.workId} is done, but its work is gone`,
|
|
@@ -103,7 +108,7 @@ export async function completeHandler(
|
|
|
103
108
|
await Promise.all(
|
|
104
109
|
ourBatch.map(async ({ work, job }) => {
|
|
105
110
|
work.attempts++;
|
|
106
|
-
await ctx.db.patch(work._id, { attempts: work.attempts });
|
|
111
|
+
await ctx.db.patch("work", work._id, { attempts: work.attempts });
|
|
107
112
|
const pendingCompletion = await ctx.db
|
|
108
113
|
.query("pendingCompletion")
|
|
109
114
|
.withIndex("workId", (q) => q.eq("workId", job.workId))
|
|
@@ -124,7 +129,7 @@ export async function completeHandler(
|
|
|
124
129
|
// Retrieve large context if stored separately
|
|
125
130
|
let context = work.onComplete.context;
|
|
126
131
|
if (context === undefined && work.payloadId) {
|
|
127
|
-
const payload = await ctx.db.get(work.payloadId);
|
|
132
|
+
const payload = await ctx.db.get("payload", work.payloadId);
|
|
128
133
|
if (payload) {
|
|
129
134
|
context = payload.context;
|
|
130
135
|
}
|
|
@@ -176,11 +181,11 @@ export async function completeHandler(
|
|
|
176
181
|
// Clean up any large data that was stored separately.
|
|
177
182
|
// TODO: consider async deletion in the future to avoid bandwidth limits.
|
|
178
183
|
if (work.payloadId) {
|
|
179
|
-
await ctx.db.delete(work.payloadId);
|
|
184
|
+
await ctx.db.delete("payload", work.payloadId);
|
|
180
185
|
}
|
|
181
186
|
|
|
182
187
|
// This is the terminating state for work.
|
|
183
|
-
await ctx.db.delete(job.workId);
|
|
188
|
+
await ctx.db.delete("work", job.workId);
|
|
184
189
|
}
|
|
185
190
|
if (job.runResult.kind !== "canceled") {
|
|
186
191
|
pendingCompletions.push({
|
|
@@ -192,7 +197,8 @@ export async function completeHandler(
|
|
|
192
197
|
}),
|
|
193
198
|
);
|
|
194
199
|
if (pendingCompletions.length > 0) {
|
|
195
|
-
|
|
200
|
+
await kickMainLoop(ctx, "complete");
|
|
201
|
+
const segment = getCurrentSegment();
|
|
196
202
|
await Promise.all(
|
|
197
203
|
pendingCompletions.map((completion) =>
|
|
198
204
|
ctx.db.insert("pendingCompletion", {
|
package/src/component/danger.ts
CHANGED
|
@@ -24,7 +24,7 @@ export const clearPending = internalMutation({
|
|
|
24
24
|
.withIndex("by_creation_time", (q) => q.lte("_creationTime", time))
|
|
25
25
|
.order("desc")) {
|
|
26
26
|
i++;
|
|
27
|
-
const work = await ctx.db.get(entry.workId);
|
|
27
|
+
const work = await ctx.db.get("work", entry.workId);
|
|
28
28
|
totalBytes +=
|
|
29
29
|
getConvexSize(entry) + getConvexSize(work) + (work?.payloadSize ?? 0);
|
|
30
30
|
if (i > MAX_ROWS_READ || totalBytes > MAX_BYTES_READ) {
|
|
@@ -33,7 +33,7 @@ export const clearPending = internalMutation({
|
|
|
33
33
|
console.log(`Continuing after ${i} entries, ${totalBytes} bytes`);
|
|
34
34
|
break;
|
|
35
35
|
}
|
|
36
|
-
await ctx.db.delete(entry._id);
|
|
36
|
+
await ctx.db.delete("pendingStart", entry._id);
|
|
37
37
|
if (work) {
|
|
38
38
|
// Clean up any large data stored separately
|
|
39
39
|
if (work.payloadId) {
|
|
@@ -95,17 +95,17 @@ export const clearOldWork = internalMutation({
|
|
|
95
95
|
break;
|
|
96
96
|
}
|
|
97
97
|
if (pendingStart) {
|
|
98
|
-
await ctx.db.delete(pendingStart._id);
|
|
98
|
+
await ctx.db.delete("pendingStart", pendingStart._id);
|
|
99
99
|
}
|
|
100
100
|
if (pendingCompletion) {
|
|
101
|
-
await ctx.db.delete(pendingCompletion._id);
|
|
101
|
+
await ctx.db.delete("pendingCompletion", pendingCompletion._id);
|
|
102
102
|
}
|
|
103
103
|
if (pendingCancelation) {
|
|
104
|
-
await ctx.db.delete(pendingCancelation._id);
|
|
104
|
+
await ctx.db.delete("pendingCancelation", pendingCancelation._id);
|
|
105
105
|
}
|
|
106
106
|
// Clean up any large data stored separately
|
|
107
107
|
if (entry.payloadId) {
|
|
108
|
-
await ctx.db.delete(entry.payloadId);
|
|
108
|
+
await ctx.db.delete("payload", entry.payloadId);
|
|
109
109
|
}
|
|
110
110
|
console.debug(
|
|
111
111
|
`cleared ${entry.fnName}: ${entry.fnArgs} (${Object.entries({
|
|
@@ -117,7 +117,7 @@ export const clearOldWork = internalMutation({
|
|
|
117
117
|
.map(([name]) => name)
|
|
118
118
|
.join(", ")})`,
|
|
119
119
|
);
|
|
120
|
-
await ctx.db.delete(entry._id);
|
|
120
|
+
await ctx.db.delete("work", entry._id);
|
|
121
121
|
}
|
|
122
122
|
if (hasMore) {
|
|
123
123
|
await ctx.scheduler.runAfter(0, internal.danger.clearOldWork, {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type FunctionReference,
|
|
3
|
+
type FunctionReturnType,
|
|
4
|
+
type OptionalRestArgs,
|
|
5
|
+
getFunctionAddress,
|
|
6
|
+
} from "convex/server";
|
|
7
|
+
import { convexToJson, jsonToConvex } from "convex/values";
|
|
8
|
+
|
|
9
|
+
declare const Convex: {
|
|
10
|
+
asyncSyscall: (op: string, jsonArgs: string) => Promise<string>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Run a query without creating a read dependency. Concurrent writes to the
|
|
15
|
+
* data the query reads will NOT cause the calling mutation to retry via OCC.
|
|
16
|
+
*
|
|
17
|
+
* Tradeoff: a concurrent transaction that hasn't yet committed at snapshot
|
|
18
|
+
* time may insert data this query won't see. If missing such inserts could
|
|
19
|
+
* break correctness, use ctx.runQuery (which takes a dependency) instead.
|
|
20
|
+
*/
|
|
21
|
+
export async function runSnapshotQuery<
|
|
22
|
+
Query extends FunctionReference<"query", "public" | "internal">,
|
|
23
|
+
>(
|
|
24
|
+
query: Query,
|
|
25
|
+
...args: OptionalRestArgs<Query>
|
|
26
|
+
): Promise<FunctionReturnType<Query>> {
|
|
27
|
+
const queryArgs = (args[0] ?? {}) as Record<string, unknown>;
|
|
28
|
+
const syscallArgs = {
|
|
29
|
+
udfType: "snapshotQuery",
|
|
30
|
+
args: convexToJson(queryArgs as never),
|
|
31
|
+
...getFunctionAddress(query),
|
|
32
|
+
};
|
|
33
|
+
const resultStr = await Convex.asyncSyscall(
|
|
34
|
+
"1.0/runUdf",
|
|
35
|
+
JSON.stringify(syscallArgs),
|
|
36
|
+
);
|
|
37
|
+
return jsonToConvex(JSON.parse(resultStr)) as FunctionReturnType<Query>;
|
|
38
|
+
}
|
|
@@ -16,7 +16,6 @@ import { modules } from "./setup.test.js";
|
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_MAX_PARALLELISM,
|
|
18
18
|
fromSegment,
|
|
19
|
-
getCurrentSegment,
|
|
20
19
|
getNextSegment,
|
|
21
20
|
toSegment,
|
|
22
21
|
} from "./shared.js";
|
|
@@ -58,12 +57,11 @@ describe("kickMainLoop", () => {
|
|
|
58
57
|
expect(runStatus.state.kind).toBe("running");
|
|
59
58
|
|
|
60
59
|
// Second kick should not change state
|
|
61
|
-
|
|
60
|
+
await kickMainLoop(ctx, "enqueue");
|
|
62
61
|
const afterStatus = await ctx.db.query("runStatus").unique();
|
|
63
62
|
assert(afterStatus);
|
|
64
63
|
expect(afterStatus.state.kind).toBe("running");
|
|
65
64
|
expect(afterStatus._id).toBe(runStatus._id);
|
|
66
|
-
expect(segment).toBe(getNextSegment());
|
|
67
65
|
});
|
|
68
66
|
});
|
|
69
67
|
|
|
@@ -89,7 +87,7 @@ describe("kickMainLoop", () => {
|
|
|
89
87
|
segment: futureSegment,
|
|
90
88
|
},
|
|
91
89
|
);
|
|
92
|
-
await ctx.db.patch(runStatus._id, {
|
|
90
|
+
await ctx.db.patch("runStatus", runStatus._id, {
|
|
93
91
|
state: {
|
|
94
92
|
kind: "scheduled",
|
|
95
93
|
scheduledId,
|
|
@@ -100,8 +98,7 @@ describe("kickMainLoop", () => {
|
|
|
100
98
|
});
|
|
101
99
|
|
|
102
100
|
// Kick should reschedule to run sooner
|
|
103
|
-
|
|
104
|
-
expect(segment).toBe(getCurrentSegment());
|
|
101
|
+
await kickMainLoop(ctx, "enqueue");
|
|
105
102
|
|
|
106
103
|
const afterStatus = await ctx.db.query("runStatus").unique();
|
|
107
104
|
assert(afterStatus);
|
|
@@ -131,7 +128,7 @@ describe("kickMainLoop", () => {
|
|
|
131
128
|
segment: nearFutureSegment,
|
|
132
129
|
},
|
|
133
130
|
);
|
|
134
|
-
await ctx.db.patch(runStatus._id, {
|
|
131
|
+
await ctx.db.patch("runStatus", runStatus._id, {
|
|
135
132
|
state: {
|
|
136
133
|
kind: "scheduled",
|
|
137
134
|
scheduledId,
|
|
@@ -142,8 +139,7 @@ describe("kickMainLoop", () => {
|
|
|
142
139
|
});
|
|
143
140
|
|
|
144
141
|
// Kick should not change state when saturated
|
|
145
|
-
|
|
146
|
-
expect(segment).toBe(getNextSegment());
|
|
142
|
+
await kickMainLoop(ctx, "enqueue");
|
|
147
143
|
const afterStatus = await ctx.db.query("runStatus").unique();
|
|
148
144
|
assert(afterStatus);
|
|
149
145
|
expect(afterStatus.state.kind).toBe("scheduled");
|
|
@@ -161,7 +157,7 @@ describe("kickMainLoop", () => {
|
|
|
161
157
|
// Delete runStatus
|
|
162
158
|
const runStatus = await ctx.db.query("runStatus").unique();
|
|
163
159
|
assert(runStatus);
|
|
164
|
-
await ctx.db.delete(runStatus._id);
|
|
160
|
+
await ctx.db.delete("runStatus", runStatus._id);
|
|
165
161
|
|
|
166
162
|
// Kick should recreate runStatus
|
|
167
163
|
await kickMainLoop(ctx, "complete");
|
|
@@ -181,7 +177,7 @@ describe("kickMainLoop", () => {
|
|
|
181
177
|
// Delete globals
|
|
182
178
|
const globals = await ctx.db.query("globals").unique();
|
|
183
179
|
assert(globals);
|
|
184
|
-
await ctx.db.delete(globals._id);
|
|
180
|
+
await ctx.db.delete("globals", globals._id);
|
|
185
181
|
|
|
186
182
|
// Kick should recreate globals
|
|
187
183
|
await kickMainLoop(ctx, "complete");
|
|
@@ -195,16 +191,14 @@ describe("kickMainLoop", () => {
|
|
|
195
191
|
|
|
196
192
|
test("handles race conditions between multiple kicks", async () => {
|
|
197
193
|
const t = convexTest(schema, modules);
|
|
198
|
-
// Run kicks in separate transactions to simulate concurrent access
|
|
199
|
-
|
|
194
|
+
// Run kicks in separate transactions to simulate concurrent access.
|
|
195
|
+
// None should throw; the loser transactions just observe the winner's
|
|
196
|
+
// running state and return early.
|
|
197
|
+
await Promise.all(
|
|
200
198
|
Array.from({ length: 10 }, () =>
|
|
201
|
-
t.
|
|
202
|
-
const segment = await kickMainLoop(ctx, "enqueue");
|
|
203
|
-
return segment;
|
|
204
|
-
}),
|
|
199
|
+
t.mutation((ctx) => kickMainLoop(ctx, "enqueue")),
|
|
205
200
|
),
|
|
206
201
|
);
|
|
207
|
-
expect(segments.filter((s) => s === getCurrentSegment())).toHaveLength(1);
|
|
208
202
|
|
|
209
203
|
// Check final state in a new transaction
|
|
210
204
|
await t.run(async (ctx) => {
|
|
@@ -259,7 +253,7 @@ describe("kickMainLoop", () => {
|
|
|
259
253
|
internal.loop.main,
|
|
260
254
|
{ generation: 0n, segment },
|
|
261
255
|
);
|
|
262
|
-
await ctx.db.patch(runStatus._id, {
|
|
256
|
+
await ctx.db.patch("runStatus", runStatus._id, {
|
|
263
257
|
state: {
|
|
264
258
|
generation: 0n,
|
|
265
259
|
saturated: false,
|
|
@@ -274,7 +268,10 @@ describe("kickMainLoop", () => {
|
|
|
274
268
|
assert(afterStatus);
|
|
275
269
|
expect(afterStatus.state.kind).toBe("running");
|
|
276
270
|
assert(afterStatus.state.kind === "running");
|
|
277
|
-
const scheduledJob = await ctx.db.system.get(
|
|
271
|
+
const scheduledJob = await ctx.db.system.get(
|
|
272
|
+
"_scheduled_functions",
|
|
273
|
+
scheduledId,
|
|
274
|
+
);
|
|
278
275
|
assert(scheduledJob);
|
|
279
276
|
expect(scheduledJob.state.kind).toBe("canceled");
|
|
280
277
|
});
|