@convex-dev/workpool 0.3.1-alpha.1 → 0.3.2

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.
Files changed (68) hide show
  1. package/README.md +9 -0
  2. package/dist/client/index.d.ts +9 -9
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +22 -22
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/component/_generated/api.d.ts +2 -0
  7. package/dist/component/_generated/api.d.ts.map +1 -1
  8. package/dist/component/_generated/api.js.map +1 -1
  9. package/dist/component/_generated/component.d.ts +12 -6
  10. package/dist/component/_generated/component.d.ts.map +1 -1
  11. package/dist/component/_generated/dataModel.d.ts +1 -1
  12. package/dist/component/_generated/server.d.ts.map +1 -1
  13. package/dist/component/complete.d.ts.map +1 -1
  14. package/dist/component/complete.js +13 -3
  15. package/dist/component/complete.js.map +1 -1
  16. package/dist/component/config.d.ts +16 -0
  17. package/dist/component/config.d.ts.map +1 -0
  18. package/dist/component/config.js +63 -0
  19. package/dist/component/config.js.map +1 -0
  20. package/dist/component/crons.d.ts +1 -1
  21. package/dist/component/crons.d.ts.map +1 -1
  22. package/dist/component/crons.js +2 -2
  23. package/dist/component/crons.js.map +1 -1
  24. package/dist/component/danger.d.ts.map +1 -1
  25. package/dist/component/danger.js +7 -1
  26. package/dist/component/danger.js.map +1 -1
  27. package/dist/component/kick.d.ts +1 -1
  28. package/dist/component/kick.d.ts.map +1 -1
  29. package/dist/component/kick.js +4 -29
  30. package/dist/component/kick.js.map +1 -1
  31. package/dist/component/lib.d.ts +6 -8
  32. package/dist/component/lib.d.ts.map +1 -1
  33. package/dist/component/lib.js +19 -29
  34. package/dist/component/lib.js.map +1 -1
  35. package/dist/component/loop.d.ts.map +1 -1
  36. package/dist/component/loop.js +10 -5
  37. package/dist/component/loop.js.map +1 -1
  38. package/dist/component/schema.d.ts +15 -6
  39. package/dist/component/schema.d.ts.map +1 -1
  40. package/dist/component/schema.js +13 -5
  41. package/dist/component/schema.js.map +1 -1
  42. package/dist/component/shared.d.ts +6 -9
  43. package/dist/component/shared.d.ts.map +1 -1
  44. package/dist/component/shared.js +3 -4
  45. package/dist/component/shared.js.map +1 -1
  46. package/dist/component/stats.js +1 -1
  47. package/dist/component/stats.js.map +1 -1
  48. package/package.json +33 -30
  49. package/src/client/index.ts +33 -25
  50. package/src/component/_generated/api.ts +2 -0
  51. package/src/component/_generated/component.ts +18 -6
  52. package/src/component/_generated/dataModel.ts +1 -1
  53. package/src/component/_generated/server.ts +0 -5
  54. package/src/component/complete.ts +13 -7
  55. package/src/component/config.test.ts +31 -0
  56. package/src/component/config.ts +69 -0
  57. package/src/component/crons.ts +2 -2
  58. package/src/component/danger.ts +7 -1
  59. package/src/component/kick.test.ts +2 -23
  60. package/src/component/kick.ts +4 -32
  61. package/src/component/lib.test.ts +3 -3
  62. package/src/component/lib.ts +21 -34
  63. package/src/component/loop.ts +9 -5
  64. package/src/component/recovery.test.ts +122 -122
  65. package/src/component/schema.ts +16 -7
  66. package/src/component/shared.ts +5 -7
  67. package/src/component/stats.test.ts +1 -1
  68. package/src/component/stats.ts +1 -1
@@ -20,10 +20,9 @@ export function getNextSegment() {
20
20
  export function fromSegment(segment) {
21
21
  return Number(segment) * SEGMENT_MS;
22
22
  }
23
- export const config = v.object({
23
+ export const vConfig = v.object({
24
24
  maxParallelism: v.number(),
25
25
  logLevel,
26
- cancelationBatchSize: v.optional(v.number()),
27
26
  });
28
27
  export const retryBehavior = v.object({
29
28
  maxAttempts: v.number(),
@@ -38,7 +37,7 @@ export const DEFAULT_RETRY_BEHAVIOR = {
38
37
  };
39
38
  // This ensures that the type satisfies the schema.
40
39
  const _ = {};
41
- export const vResultValidator = v.union(v.object({
40
+ export const vResult = v.union(v.object({
42
41
  kind: v.literal("success"),
43
42
  returnValue: v.any(),
44
43
  }), v.object({
@@ -47,7 +46,7 @@ export const vResultValidator = v.union(v.object({
47
46
  }), v.object({
48
47
  kind: v.literal("canceled"),
49
48
  }));
50
- export const onComplete = v.object({
49
+ export const vOnCompleteFnContext = v.object({
51
50
  fnHandle: v.string(), // mutation
52
51
  context: v.optional(v.any()),
53
52
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/component/shared.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@ export async function generateReport(ctx, console, state, { maxParallelism, logL
45
45
  .gte("segment", state.segmentCursors.incoming)
46
46
  .lt("segment", currentSegment))
47
47
  .paginate({
48
- numItems: maxParallelism,
48
+ numItems: Math.max(maxParallelism, 10),
49
49
  cursor: null,
50
50
  });
51
51
  if (pendingStart.isDone) {
@@ -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,EAAe,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D;;;GAGG;AAEH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,IAIC;IAED,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;QACxB,GAAG,IAAI;QACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,IAAiB,EACjB,KAAa;IAEb,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE;QACvB,MAAM,EAAE,IAAI,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,aAAa;QAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,IAAiB,EACjB,MAAsD;IAEtD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;QACzB,MAAM,EAAE,IAAI,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAgB,EAChB,OAAe,EACf,KAA2B,EAC3B,EAAE,cAAc,EAAE,QAAQ,EAAU;IAEpC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnC,8CAA8C;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;SACjD,KAAK,CAAC,cAAc,CAAC;SACrB,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAC1B,CAAC;SACE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;SAC7C,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CACjC;SACA,QAAQ,CAAC;QACR,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IACL,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,YAAY,CAAC,OAAO,EAAE;YACpB,GAAG,KAAK,CAAC,MAAM;YACf,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;YAC7B,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM;SAClC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,yBAAyB,EAAE;YACxE,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,cAAc;YAC1B,MAAM,EAAE,YAAY,CAAC,cAAc;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;YAC7B,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;IACxD,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE;QACvB,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM;QAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ;KACT;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,MAAO,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAS,CAAC,KAAK,EAAE,CAAC;QAEzE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,YAAY,CAAC,OAAO,EAAE;YACpB,GAAG,IAAI,CAAC,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,YAAY,CACnB,OAAe,EACf,MAA6E;IAE7E,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;IAC3C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE;QACtB,GAAG,MAAM;QACT,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KAC9D,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;IAChB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC;QACnE,MAAM,cAAc,GAAG,aAAa,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,uBAAuB,CAAC;QACzE,MAAM,YAAY,GAAG,MAAO,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAS,CAAC,KAAK,EAAE,CAAC;QACzE,MAAM,iBAAiB,GAAG,MACxB,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CACjC,CAAC,KAAK,EAAE,CAAC;QACV,MAAM,kBAAkB,GAAG,MACzB,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAClC,CAAC,KAAK,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3D,OAAO;YACL,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,cAAc,GAAG,iBAAiB;YAC3C,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,cAAc,GAAG,cAAc;YAC9C,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI;YAChC,UAAU,EAAE,aAAa,EAAE,UAAU;SACtC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
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.3.1-alpha.1",
10
+ "version": "0.3.2",
11
11
  "license": "Apache-2.0",
12
12
  "keywords": [
13
13
  "convex",
@@ -22,10 +22,11 @@
22
22
  "dev": "run-p -r 'dev:*'",
23
23
  "dev:backend": "convex dev --typecheck-components",
24
24
  "dev:frontend": "cd example && vite --clearScreen false",
25
- "dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'convex codegen --component-dir ./src/component && npm run build' --initial",
26
- "predev": "npm run dev:backend -- --until-success",
27
- "clean": "rm -rf dist *.tsbuildinfo",
25
+ "dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
26
+ "predev": "path-exists .env.local || (npm run build && convex dev --once)",
28
27
  "build": "tsc --project ./tsconfig.build.json",
28
+ "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
29
+ "build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
29
30
  "typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
30
31
  "lint": "eslint .",
31
32
  "all": "run-p -r 'dev:*' 'test:watch'",
@@ -33,10 +34,11 @@
33
34
  "test:watch": "vitest --typecheck --clearScreen false",
34
35
  "test:debug": "vitest --inspect-brk --no-file-parallelism",
35
36
  "test:coverage": "vitest run --coverage --coverage.reporter=text",
36
- "prepare": "npm run build",
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",
39
- "version": "pbcopy <<<$npm_package_version; vim CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
37
+ "preversion": "npm ci && npm run build:clean && run-p test lint typecheck",
38
+ "prepublishOnly": "npm whoami || npm login",
39
+ "alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
40
+ "release": "npm version patch && npm publish && git push --follow-tags",
41
+ "version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
40
42
  },
41
43
  "files": [
42
44
  "dist",
@@ -62,36 +64,37 @@
62
64
  }
63
65
  },
64
66
  "peerDependencies": {
65
- "convex": "^1.24.8",
67
+ "convex": "^1.31.7",
66
68
  "convex-helpers": "^0.1.94"
67
69
  },
68
70
  "devDependencies": {
69
71
  "@edge-runtime/vm": "5.0.0",
70
- "@eslint/eslintrc": "3.3.1",
71
- "@eslint/js": "9.39.1",
72
- "@types/node": "20.19.24",
73
- "@types/react": "19.2.2",
74
- "@types/react-dom": "19.2.2",
75
- "@vitejs/plugin-react": "5.1.0",
76
- "@vitest/coverage-v8": "4.0.9",
72
+ "@eslint/eslintrc": "3.3.3",
73
+ "@eslint/js": "9.39.2",
74
+ "@types/node": "24.10.11",
75
+ "@types/react": "19.2.13",
76
+ "@types/react-dom": "19.2.3",
77
+ "@vitejs/plugin-react": "5.1.3",
78
+ "@vitest/coverage-v8": "4.0.18",
77
79
  "chokidar-cli": "3.0.0",
78
- "convex": "1.29.0",
79
- "convex-helpers": "0.1.104",
80
- "convex-test": "0.0.38",
81
- "cpy-cli": "6.0.0",
82
- "eslint": "9.39.1",
80
+ "convex": "1.31.7",
81
+ "convex-helpers": "0.1.111",
82
+ "convex-test": "0.0.41",
83
+ "cpy-cli": "7.0.0",
84
+ "eslint": "9.39.2",
83
85
  "eslint-plugin-react-hooks": "7.0.1",
84
- "eslint-plugin-react-refresh": "0.4.24",
85
- "globals": "16.5.0",
86
+ "eslint-plugin-react-refresh": "0.5.0",
87
+ "globals": "17.3.0",
86
88
  "npm-run-all2": "8.0.4",
87
- "pkg-pr-new": "0.0.60",
88
- "prettier": "3.6.2",
89
- "react": "19.2.0",
90
- "react-dom": "19.2.0",
89
+ "path-exists-cli": "2.0.0",
90
+ "pkg-pr-new": "0.0.63",
91
+ "prettier": "3.8.1",
92
+ "react": "19.2.4",
93
+ "react-dom": "19.2.4",
91
94
  "typescript": "5.9.3",
92
- "typescript-eslint": "8.46.3",
93
- "vite": "7.1.12",
94
- "vitest": "4.0.9"
95
+ "typescript-eslint": "8.54.0",
96
+ "vite": "7.3.1",
97
+ "vitest": "4.0.18"
95
98
  },
96
99
  "types": "./dist/client/index.d.ts",
97
100
  "module": "./dist/client/index.js"
@@ -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 { DEFAULT_LOG_LEVEL, type LogLevel } from "../component/logging.js";
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
- vResultValidator,
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 vWorkIdValidator = v.string() as VString<WorkId>;
41
+ export const vWorkId = v.string() as VString<WorkId>;
44
42
  export {
43
+ vResult,
45
44
  DEFAULT_RETRY_BEHAVIOR,
46
- /** @deprecated Use `vResultValidator` instead. */
47
- vResultValidator as resultValidator,
48
- /** @deprecated Use `vWorkIdValidator` instead. */
49
- vWorkIdValidator as workIdValidator,
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 ?? DEFAULT_LOG_LEVEL,
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 ?? DEFAULT_LOG_LEVEL,
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: vWorkIdValidator,
345
+ workId: vWorkId,
341
346
  context: (context ?? v.optional(v.any())) as V,
342
- result: vResultValidator,
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
- * Min 1, Suggested max: 100 on Pro, 20 on the free plan.
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 ?? DEFAULT_LOG_LEVEL,
512
- maxParallelism: opts?.maxParallelism ?? DEFAULT_MAX_PARALLELISM,
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: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
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: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
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: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
54
- maxParallelism: number;
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: "DEBUG" | "TRACE" | "INFO" | "REPORT" | "WARN" | "ERROR";
77
- maxParallelism: number;
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.
@@ -107,11 +107,6 @@ export const internalAction: ActionBuilder<DataModel, "internal"> =
107
107
  */
108
108
  export const httpAction: HttpActionBuilder = httpActionGeneric;
109
109
 
110
- type GenericCtx =
111
- | GenericActionCtx<DataModel>
112
- | GenericMutationCtx<DataModel>
113
- | GenericQueryCtx<DataModel>;
114
-
115
110
  /**
116
111
  * A set of services for use within Convex query functions.
117
112
  *
@@ -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: vResultValidator,
15
+ runResult: vResult,
20
16
  workId: v.id("work"),
21
17
  attempt: v.number(),
22
18
  }),
@@ -62,6 +58,13 @@ export async function completeHandler(
62
58
  if (!retry) {
63
59
  if (work.onComplete) {
64
60
  try {
61
+ let context = work.onComplete.context;
62
+ if (context === undefined && work.payloadId) {
63
+ const payload = await ctx.db.get(work.payloadId);
64
+ if (payload) {
65
+ context = payload.context;
66
+ }
67
+ }
65
68
  const handle = work.onComplete.fnHandle as FunctionHandle<
66
69
  "mutation",
67
70
  OnCompleteArgs,
@@ -69,7 +72,7 @@ export async function completeHandler(
69
72
  >;
70
73
  await ctx.runMutation(handle, {
71
74
  workId: work._id,
72
- context: work.onComplete.context,
75
+ context,
73
76
  result: job.runResult,
74
77
  });
75
78
  console.debug(`[complete] onComplete for ${job.workId} completed`);
@@ -82,6 +85,9 @@ export async function completeHandler(
82
85
  }
83
86
  }
84
87
  recordCompleted(console, work, job.runResult.kind);
88
+ if (work.payloadId) {
89
+ await ctx.db.delete(work.payloadId);
90
+ }
85
91
  // This is the terminating state for work.
86
92
  await ctx.db.delete(job.workId);
87
93
  }
@@ -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
+ });
@@ -0,0 +1,69 @@
1
+ import { mutation, type MutationCtx } from "./_generated/server.js";
2
+ import { vConfig, DEFAULT_MAX_PARALLELISM, type Config } from "./shared.js";
3
+ import { createLogger, DEFAULT_LOG_LEVEL } from "./logging.js";
4
+ import { kickMainLoop } from "./kick.js";
5
+
6
+ export const MAX_POSSIBLE_PARALLELISM = 200;
7
+ export const MAX_PARALLELISM_SOFT_LIMIT = 100;
8
+
9
+ export const update = mutation({
10
+ args: vConfig.partial(),
11
+ handler: async (ctx, args) => {
12
+ const { globals, previousValue } = await _getOrUpdateGlobals(ctx, args);
13
+ if (args.maxParallelism && args.maxParallelism > previousValue) {
14
+ await kickMainLoop(ctx, "kick", globals);
15
+ }
16
+ },
17
+ });
18
+
19
+ export function validateConfig(config: Partial<Config>) {
20
+ if (config.maxParallelism !== undefined) {
21
+ if (config.maxParallelism > MAX_POSSIBLE_PARALLELISM) {
22
+ throw new Error(`maxParallelism must be <= ${MAX_POSSIBLE_PARALLELISM}`);
23
+ } else if (config.maxParallelism > MAX_PARALLELISM_SOFT_LIMIT) {
24
+ createLogger(config.logLevel ?? DEFAULT_LOG_LEVEL).warn(
25
+ `maxParallelism should be <= ${MAX_PARALLELISM_SOFT_LIMIT}, but is set to ${config.maxParallelism}. This will be an error in a future version.`,
26
+ );
27
+ } else if (config.maxParallelism < 0) {
28
+ throw new Error("maxParallelism must be >= 0");
29
+ }
30
+ }
31
+ }
32
+ export async function getOrUpdateGlobals(
33
+ ctx: MutationCtx,
34
+ config?: Partial<Config>,
35
+ ) {
36
+ const { globals } = await _getOrUpdateGlobals(ctx, config);
37
+ return globals;
38
+ }
39
+ async function _getOrUpdateGlobals(ctx: MutationCtx, config?: Partial<Config>) {
40
+ if (config) {
41
+ validateConfig(config);
42
+ }
43
+ const globals = await ctx.db.query("globals").unique();
44
+ const previousValue = globals?.maxParallelism ?? DEFAULT_MAX_PARALLELISM;
45
+ if (!globals) {
46
+ const id = await ctx.db.insert("globals", {
47
+ maxParallelism: config?.maxParallelism ?? DEFAULT_MAX_PARALLELISM,
48
+ logLevel: config?.logLevel ?? DEFAULT_LOG_LEVEL,
49
+ });
50
+ return { globals: (await ctx.db.get("globals", id))!, previousValue };
51
+ } else if (config) {
52
+ let updated = false;
53
+ if (
54
+ config.maxParallelism !== undefined &&
55
+ config.maxParallelism !== globals.maxParallelism
56
+ ) {
57
+ globals.maxParallelism = config.maxParallelism;
58
+ updated = true;
59
+ }
60
+ if (config.logLevel && config.logLevel !== globals.logLevel) {
61
+ globals.logLevel = config.logLevel;
62
+ updated = true;
63
+ }
64
+ if (updated) {
65
+ await ctx.db.replace("globals", globals._id, globals);
66
+ }
67
+ }
68
+ return { globals, previousValue };
69
+ }
@@ -6,7 +6,7 @@ import { RECOVERY_PERIOD_SEGMENTS } from "./loop.js";
6
6
 
7
7
  const crons = cronJobs();
8
8
 
9
- export const recover = internalMutation({
9
+ export const healthcheck = internalMutation({
10
10
  args: {},
11
11
  handler: async (ctx) => {
12
12
  const internalState = await ctx.db.query("internalState").first();
@@ -61,6 +61,6 @@ export const recover = internalMutation({
61
61
  },
62
62
  });
63
63
 
64
- crons.interval("recover", { minutes: 30 }, internal.crons.recover);
64
+ crons.interval("healthcheck", { minutes: 30 }, internal.crons.healthcheck);
65
65
 
66
66
  export default crons;
@@ -27,6 +27,9 @@ export const clearPending = internalMutation({
27
27
  await ctx.db.delete(entry._id);
28
28
  const work = await ctx.db.get(entry.workId);
29
29
  if (work) {
30
+ if (work.payloadId) {
31
+ await ctx.db.delete(work.payloadId);
32
+ }
30
33
  await ctx.db.delete(work._id);
31
34
  }
32
35
  }),
@@ -79,8 +82,11 @@ export const clearOldWork = internalMutation({
79
82
  if (pendingCancelation) {
80
83
  await ctx.db.delete(pendingCancelation._id);
81
84
  }
85
+ if (entry.payloadId) {
86
+ await ctx.db.delete(entry.payloadId);
87
+ }
82
88
  console.debug(
83
- `cleared ${entry.fnName}: ${entry.fnArgs} (${Object.entries({
89
+ `cleared ${entry.fnName}: ${entry.fnArgs ?? "(payload)"} (${Object.entries({
84
90
  pendingStart,
85
91
  pendingCompletion,
86
92
  pendingCancelation,
@@ -20,6 +20,7 @@ import {
20
20
  getNextSegment,
21
21
  toSegment,
22
22
  } from "./shared.js";
23
+ import { getOrUpdateGlobals } from "./config.js";
23
24
 
24
25
  describe("kickMainLoop", () => {
25
26
  beforeEach(() => {
@@ -47,27 +48,6 @@ describe("kickMainLoop", () => {
47
48
  });
48
49
  });
49
50
 
50
- test("it updates the globals when they change", async () => {
51
- const t = convexTest(schema, modules);
52
- await t.run(async (ctx) => {
53
- await kickMainLoop(ctx, "enqueue");
54
- const globals = await ctx.db.query("globals").unique();
55
- expect(globals).not.toBeNull();
56
- assert(globals);
57
- expect(globals.maxParallelism).toBe(DEFAULT_MAX_PARALLELISM);
58
- expect(globals.logLevel).toBe(DEFAULT_LOG_LEVEL);
59
- await kickMainLoop(ctx, "enqueue", {
60
- maxParallelism: DEFAULT_MAX_PARALLELISM + 1,
61
- logLevel: "ERROR",
62
- });
63
- const after = await ctx.db.query("globals").unique();
64
- expect(after).not.toBeNull();
65
- assert(after);
66
- expect(after.maxParallelism).toBe(DEFAULT_MAX_PARALLELISM + 1);
67
- expect(after.logLevel).toBe("ERROR");
68
- });
69
- });
70
-
71
51
  test("does not kick when already running", async () => {
72
52
  const t = convexTest(schema, modules);
73
53
  await t.run(async (ctx) => {
@@ -249,8 +229,7 @@ describe("kickMainLoop", () => {
249
229
  test("preserves state between kicks with different sources", async () => {
250
230
  const t = convexTest(schema, modules);
251
231
  await t.run(async (ctx) => {
252
- // Initial kick with custom config
253
- await kickMainLoop(ctx, "enqueue", {
232
+ await getOrUpdateGlobals(ctx, {
254
233
  maxParallelism: 5,
255
234
  logLevel: "ERROR",
256
235
  });