@convex-dev/workpool 0.2.0-beta.0 → 0.2.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.
Files changed (110) hide show
  1. package/README.md +87 -18
  2. package/dist/commonjs/client/index.d.ts +33 -8
  3. package/dist/commonjs/client/index.d.ts.map +1 -1
  4. package/dist/commonjs/client/index.js +37 -7
  5. package/dist/commonjs/client/index.js.map +1 -1
  6. package/dist/commonjs/component/complete.d.ts +89 -0
  7. package/dist/commonjs/component/complete.d.ts.map +1 -0
  8. package/dist/commonjs/component/complete.js +82 -0
  9. package/dist/commonjs/component/complete.js.map +1 -0
  10. package/dist/commonjs/component/kick.d.ts +3 -3
  11. package/dist/commonjs/component/kick.d.ts.map +1 -1
  12. package/dist/commonjs/component/kick.js +17 -12
  13. package/dist/commonjs/component/kick.js.map +1 -1
  14. package/dist/commonjs/component/lib.d.ts +6 -6
  15. package/dist/commonjs/component/lib.d.ts.map +1 -1
  16. package/dist/commonjs/component/lib.js +53 -24
  17. package/dist/commonjs/component/lib.js.map +1 -1
  18. package/dist/commonjs/component/logging.d.ts +3 -2
  19. package/dist/commonjs/component/logging.d.ts.map +1 -1
  20. package/dist/commonjs/component/logging.js +34 -16
  21. package/dist/commonjs/component/logging.js.map +1 -1
  22. package/dist/commonjs/component/loop.d.ts +1 -14
  23. package/dist/commonjs/component/loop.d.ts.map +1 -1
  24. package/dist/commonjs/component/loop.js +216 -179
  25. package/dist/commonjs/component/loop.js.map +1 -1
  26. package/dist/commonjs/component/recovery.d.ts +45 -0
  27. package/dist/commonjs/component/recovery.d.ts.map +1 -1
  28. package/dist/commonjs/component/recovery.js +88 -65
  29. package/dist/commonjs/component/recovery.js.map +1 -1
  30. package/dist/commonjs/component/schema.d.ts +17 -13
  31. package/dist/commonjs/component/schema.d.ts.map +1 -1
  32. package/dist/commonjs/component/schema.js +5 -3
  33. package/dist/commonjs/component/schema.js.map +1 -1
  34. package/dist/commonjs/component/shared.d.ts +24 -15
  35. package/dist/commonjs/component/shared.d.ts.map +1 -1
  36. package/dist/commonjs/component/shared.js +20 -7
  37. package/dist/commonjs/component/shared.js.map +1 -1
  38. package/dist/commonjs/component/stats.d.ts +36 -29
  39. package/dist/commonjs/component/stats.d.ts.map +1 -1
  40. package/dist/commonjs/component/stats.js +110 -52
  41. package/dist/commonjs/component/stats.js.map +1 -1
  42. package/dist/commonjs/component/worker.d.ts +4 -14
  43. package/dist/commonjs/component/worker.d.ts.map +1 -1
  44. package/dist/commonjs/component/worker.js +23 -36
  45. package/dist/commonjs/component/worker.js.map +1 -1
  46. package/dist/esm/client/index.d.ts +33 -8
  47. package/dist/esm/client/index.d.ts.map +1 -1
  48. package/dist/esm/client/index.js +37 -7
  49. package/dist/esm/client/index.js.map +1 -1
  50. package/dist/esm/component/complete.d.ts +89 -0
  51. package/dist/esm/component/complete.d.ts.map +1 -0
  52. package/dist/esm/component/complete.js +82 -0
  53. package/dist/esm/component/complete.js.map +1 -0
  54. package/dist/esm/component/kick.d.ts +3 -3
  55. package/dist/esm/component/kick.d.ts.map +1 -1
  56. package/dist/esm/component/kick.js +17 -12
  57. package/dist/esm/component/kick.js.map +1 -1
  58. package/dist/esm/component/lib.d.ts +6 -6
  59. package/dist/esm/component/lib.d.ts.map +1 -1
  60. package/dist/esm/component/lib.js +53 -24
  61. package/dist/esm/component/lib.js.map +1 -1
  62. package/dist/esm/component/logging.d.ts +3 -2
  63. package/dist/esm/component/logging.d.ts.map +1 -1
  64. package/dist/esm/component/logging.js +34 -16
  65. package/dist/esm/component/logging.js.map +1 -1
  66. package/dist/esm/component/loop.d.ts +1 -14
  67. package/dist/esm/component/loop.d.ts.map +1 -1
  68. package/dist/esm/component/loop.js +216 -179
  69. package/dist/esm/component/loop.js.map +1 -1
  70. package/dist/esm/component/recovery.d.ts +45 -0
  71. package/dist/esm/component/recovery.d.ts.map +1 -1
  72. package/dist/esm/component/recovery.js +88 -65
  73. package/dist/esm/component/recovery.js.map +1 -1
  74. package/dist/esm/component/schema.d.ts +17 -13
  75. package/dist/esm/component/schema.d.ts.map +1 -1
  76. package/dist/esm/component/schema.js +5 -3
  77. package/dist/esm/component/schema.js.map +1 -1
  78. package/dist/esm/component/shared.d.ts +24 -15
  79. package/dist/esm/component/shared.d.ts.map +1 -1
  80. package/dist/esm/component/shared.js +20 -7
  81. package/dist/esm/component/shared.js.map +1 -1
  82. package/dist/esm/component/stats.d.ts +36 -29
  83. package/dist/esm/component/stats.d.ts.map +1 -1
  84. package/dist/esm/component/stats.js +110 -52
  85. package/dist/esm/component/stats.js.map +1 -1
  86. package/dist/esm/component/worker.d.ts +4 -14
  87. package/dist/esm/component/worker.d.ts.map +1 -1
  88. package/dist/esm/component/worker.js +23 -36
  89. package/dist/esm/component/worker.js.map +1 -1
  90. package/package.json +12 -12
  91. package/src/client/index.ts +82 -43
  92. package/src/component/README.md +15 -15
  93. package/src/component/_generated/api.d.ts +10 -5
  94. package/src/component/complete.test.ts +508 -0
  95. package/src/component/complete.ts +109 -0
  96. package/src/component/kick.test.ts +29 -19
  97. package/src/component/kick.ts +25 -17
  98. package/src/component/lib.test.ts +262 -17
  99. package/src/component/lib.ts +68 -30
  100. package/src/component/logging.test.ts +16 -0
  101. package/src/component/logging.ts +45 -24
  102. package/src/component/loop.test.ts +1158 -0
  103. package/src/component/loop.ts +292 -224
  104. package/src/component/recovery.test.ts +536 -0
  105. package/src/component/recovery.ts +100 -75
  106. package/src/component/schema.ts +6 -4
  107. package/src/component/shared.ts +23 -8
  108. package/src/component/stats.test.ts +345 -0
  109. package/src/component/stats.ts +149 -56
  110. package/src/component/worker.ts +25 -38
@@ -1,6 +1,7 @@
1
1
  import { v } from "convex/values";
2
2
  import { logLevel } from "./logging.js";
3
- const SEGMENT_MS = 250;
3
+ export const DEFAULT_MAX_PARALLELISM = 10;
4
+ const SEGMENT_MS = 100;
4
5
  export const SECOND = 1000;
5
6
  export const MINUTE = 60 * SECOND;
6
7
  export const HOUR = 60 * MINUTE;
@@ -9,10 +10,10 @@ export const YEAR = 365 * DAY;
9
10
  export function toSegment(ms) {
10
11
  return BigInt(Math.floor(ms / SEGMENT_MS));
11
12
  }
12
- export function currentSegment() {
13
+ export function getCurrentSegment() {
13
14
  return toSegment(Date.now());
14
15
  }
15
- export function nextSegment() {
16
+ export function getNextSegment() {
16
17
  return toSegment(Date.now()) + 1n;
17
18
  }
18
19
  export function fromSegment(segment) {
@@ -44,22 +45,34 @@ export const onComplete = v.object({
44
45
  });
45
46
  export const status = v.union(v.union(v.object({
46
47
  state: v.literal("pending"),
47
- attempt: v.number(),
48
+ previousAttempts: v.number(),
48
49
  }), v.object({
49
50
  state: v.literal("running"),
50
- attempt: v.number(),
51
+ previousAttempts: v.number(),
51
52
  }), v.object({
52
53
  state: v.literal("finished"),
53
54
  })));
54
55
  export function boundScheduledTime(ms, console) {
55
56
  if (ms < Date.now() - YEAR) {
56
- console.warn("runAt is too far in the past, defaulting to now", ms);
57
+ console.error("scheduled time is too old, defaulting to now", ms);
57
58
  return Date.now();
58
59
  }
59
60
  if (ms > Date.now() + 4 * YEAR) {
60
- console.warn("runAt is too far in the future, defaulting to 1 year from now", ms);
61
+ console.error("scheduled time is too far in the future, defaulting to 1 year from now", ms);
61
62
  return Date.now() + YEAR;
62
63
  }
63
64
  return ms;
64
65
  }
66
+ /**
67
+ * Returns the smaller of two bigint values.
68
+ */
69
+ export function min(a, b) {
70
+ return a > b ? b : a;
71
+ }
72
+ /**
73
+ * Returns the larger of two bigint values.
74
+ */
75
+ export function max(a, b) {
76
+ return a < b ? b : a;
77
+ }
65
78
  //# sourceMappingURL=shared.js.map
@@ -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":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAU,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEhD,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,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,QAAQ;CACT,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAkBH,mDAAmD;AACnD,MAAM,CAAC,GAAG,EAAyD,CAAC;AAEpE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAC9B,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1B,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE;CACrB,CAAC,EACF,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,EACF,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CAC5B,CAAC,CACH,CAAC;AAGF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;CAC7B,CAAC,CAAC;AAmBH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAC3B,CAAC,CAAC,KAAK,CACL,CAAC,CAAC,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;CAC7B,CAAC,EACF,CAAC,CAAC,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;CAC7B,CAAC,EACF,CAAC,CAAC,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CAC7B,CAAC,CACH,CACF,CAAC;AAGF,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,OAAe;IAC5D,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;KACnB;IACD,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;QAC9B,OAAO,CAAC,KAAK,CACX,wEAAwE,EACxE,EAAE,CACH,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KAC1B;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAmB,CAAI,EAAE,CAAI;IAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAmB,CAAI,EAAE,CAAI;IAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -1,38 +1,45 @@
1
- import { Doc } from "./_generated/dataModel.js";
1
+ import { Doc, Id } from "./_generated/dataModel.js";
2
+ import { MutationCtx } from "./_generated/server.js";
3
+ import { Config } from "./shared.js";
4
+ import { Logger } from "./logging.js";
2
5
  /**
3
6
  * Record stats about work execution. Intended to be queried by Axiom or Datadog.
7
+ * See the [README](https://github.com/get-convex/workpool) for example queries.
4
8
  */
5
- /**
6
- * Sample axiom dashboard query:
7
-
8
- workpool
9
- | extend parsed_message = iff(
10
- isnotnull(parse_json(trim("'", tostring(["data.message"])))),
11
- parse_json(trim("'", tostring(["data.message"]))),
12
- parse_json('{}')
13
- )
14
- | extend lagSinceEnqueued = parsed_message["lagSinceEnqueued"]
15
- | extend fnName = parsed_message["fnName"]
16
- | summarize avg(todouble(lagSinceEnqueued)) by bin_auto(_time), tostring(fnName)
17
-
18
- */
19
- export declare function recordStarted(work: Doc<"work">): string;
20
- export declare function recordCompleted(work: Doc<"work">, status: "success" | "failed" | "canceled"): string;
21
- export declare function recordReport(state: Doc<"internalState">): string;
22
- /**
23
- * Warning: this should not be used from a mutation, as it will cause conflicts.
24
- * Use this to debug or diagnose your queue length when it's backed up.
25
- */
26
- export declare const queueLength: import("convex/server").RegisteredQuery<"internal", {}, Promise<any>>;
9
+ export declare function recordEnqueued(console: Logger, data: {
10
+ workId: Id<"work">;
11
+ fnName: string;
12
+ runAt: number;
13
+ }): void;
14
+ export declare function recordStarted(console: Logger, work: Doc<"work">, lagMs: number): void;
15
+ export declare function recordCompleted(console: Logger, work: Doc<"work">, status: "success" | "failed" | "canceled" | "retrying"): void;
16
+ export declare function generateReport(ctx: MutationCtx, console: Logger, state: Doc<"internalState">, { maxParallelism, logLevel }: Config): Promise<void>;
17
+ export declare const calculateBacklogAndReport: import("convex/server").RegisteredMutation<"internal", {
18
+ report: {
19
+ failed: number;
20
+ canceled: number;
21
+ completed: number;
22
+ succeeded: number;
23
+ retries: number;
24
+ lastReportTs: number;
25
+ };
26
+ logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
27
+ running: number;
28
+ startSegment: bigint;
29
+ endSegment: bigint;
30
+ cursor: string;
31
+ }, Promise<void>>;
27
32
  /**
28
33
  * Warning: this should not be used from a mutation, as it will cause conflicts.
29
34
  * Use this while developing to see the state of the queue.
30
35
  */
31
- export declare const debugCounts: import("convex/server").RegisteredQuery<"internal", {}, Promise<{
32
- pendingStart: any;
33
- inProgressWork: number;
34
- pendingCompletion: any;
35
- pendingCancelation: any;
36
- active: number;
36
+ export declare const diagnostics: import("convex/server").RegisteredQuery<"internal", {}, Promise<{
37
+ canceling: any;
38
+ waiting: any;
39
+ running: number;
40
+ completing: any;
41
+ spareCapacity: number;
42
+ runStatus: "running" | "scheduled" | "idle" | undefined;
43
+ generation: bigint | undefined;
37
44
  }>>;
38
45
  //# sourceMappingURL=stats.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAGhD;;GAEG;AAEH;;;;;;;;;;;;;GAaG;AAEH,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CASvD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GACxC,MAAM,CASR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,eAAe,CAAC,GAAG,MAAM,CAahE;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,uEAOtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;GAuBtB,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;AAOzE;;;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;;;;;;;;;;;;;;iBAyCpC,CAAC;AAiBH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;GA4BtB,CAAC"}
@@ -1,88 +1,146 @@
1
1
  import { v } from "convex/values";
2
- import { internalQuery } from "./_generated/server.js";
2
+ import { internalMutation, internalQuery, } from "./_generated/server.js";
3
+ import { DEFAULT_MAX_PARALLELISM, getCurrentSegment, } from "./shared.js";
4
+ import { createLogger, logLevel, shouldLog } from "./logging.js";
5
+ import { internal } from "./_generated/api.js";
6
+ import schema from "./schema.js";
7
+ import { paginator } from "convex-helpers/server/pagination";
8
+ const BACKLOG_BATCH_SIZE = 100;
3
9
  /**
4
10
  * Record stats about work execution. Intended to be queried by Axiom or Datadog.
11
+ * See the [README](https://github.com/get-convex/workpool) for example queries.
5
12
  */
6
- /**
7
- * Sample axiom dashboard query:
8
-
9
- workpool
10
- | extend parsed_message = iff(
11
- isnotnull(parse_json(trim("'", tostring(["data.message"])))),
12
- parse_json(trim("'", tostring(["data.message"]))),
13
- parse_json('{}')
14
- )
15
- | extend lagSinceEnqueued = parsed_message["lagSinceEnqueued"]
16
- | extend fnName = parsed_message["fnName"]
17
- | summarize avg(todouble(lagSinceEnqueued)) by bin_auto(_time), tostring(fnName)
18
-
19
- */
20
- export function recordStarted(work) {
21
- return JSON.stringify({
13
+ export function recordEnqueued(console, data) {
14
+ console.event("enqueued", {
15
+ ...data,
16
+ enqueuedAt: Date.now(),
17
+ });
18
+ }
19
+ export function recordStarted(console, work, lagMs) {
20
+ console.event("started", {
22
21
  workId: work._id,
23
- event: "started",
24
22
  fnName: work.fnName,
25
23
  enqueuedAt: work._creationTime,
26
24
  startedAt: Date.now(),
27
- lagSinceEnqueued: Date.now() - work._creationTime,
25
+ startLag: lagMs,
28
26
  });
29
27
  }
30
- export function recordCompleted(work, status) {
31
- return JSON.stringify({
28
+ export function recordCompleted(console, work, status) {
29
+ console.event("completed", {
32
30
  workId: work._id,
33
- event: "completed",
34
31
  fnName: work.fnName,
35
32
  completedAt: Date.now(),
33
+ attempts: work.attempts,
36
34
  status,
37
- lagSinceEnqueued: Date.now() - work._creationTime,
38
35
  });
39
36
  }
40
- export function recordReport(state) {
41
- const { completed, succeeded, failed, retries, canceled } = state.report;
42
- const withoutRetries = completed - retries;
43
- return JSON.stringify({
44
- event: "report",
45
- completed,
46
- succeeded,
47
- failed,
48
- retries,
49
- canceled,
50
- failureRate: completed ? (failed + retries) / completed : 0,
51
- permanentFailureRate: withoutRetries ? failed / withoutRetries : 0,
37
+ export async function generateReport(ctx, console, state, { maxParallelism, logLevel }) {
38
+ if (!shouldLog(logLevel, "REPORT")) {
39
+ // Don't waste time if we're not going to log.
40
+ return;
41
+ }
42
+ const currentSegment = getCurrentSegment();
43
+ const pendingStart = await paginator(ctx.db, schema)
44
+ .query("pendingStart")
45
+ .withIndex("segment", (q) => q
46
+ .gte("segment", state.segmentCursors.incoming)
47
+ .lt("segment", currentSegment))
48
+ .paginate({
49
+ numItems: maxParallelism,
50
+ cursor: null,
52
51
  });
52
+ if (pendingStart.isDone) {
53
+ recordReport(console, {
54
+ ...state.report,
55
+ running: state.running.length,
56
+ backlog: pendingStart.page.length,
57
+ });
58
+ }
59
+ else {
60
+ await ctx.scheduler.runAfter(0, internal.stats.calculateBacklogAndReport, {
61
+ startSegment: state.segmentCursors.incoming,
62
+ endSegment: currentSegment,
63
+ cursor: pendingStart.continueCursor,
64
+ report: state.report,
65
+ running: state.running.length,
66
+ logLevel,
67
+ });
68
+ }
53
69
  }
54
- /**
55
- * Warning: this should not be used from a mutation, as it will cause conflicts.
56
- * Use this to debug or diagnose your queue length when it's backed up.
57
- */
58
- export const queueLength = internalQuery({
59
- args: {},
60
- returns: v.number(),
61
- handler: async (ctx) => {
62
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
- return ctx.db.query("pendingStart").count();
70
+ export const calculateBacklogAndReport = internalMutation({
71
+ args: {
72
+ startSegment: v.int64(),
73
+ endSegment: v.int64(),
74
+ cursor: v.string(),
75
+ report: schema.tables.internalState.validator.fields.report,
76
+ running: v.number(),
77
+ logLevel,
78
+ },
79
+ handler: async (ctx, args) => {
80
+ const pendingStart = await paginator(ctx.db, schema)
81
+ .query("pendingStart")
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
+ });
87
+ const console = createLogger(args.logLevel);
88
+ if (pendingStart.isDone) {
89
+ recordReport(console, {
90
+ ...args.report,
91
+ running: args.running,
92
+ backlog: pendingStart.page.length,
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
+ }
64
105
  },
65
106
  });
107
+ function recordReport(console, report) {
108
+ const { completed, failed, retries } = report;
109
+ const withoutRetries = completed - retries;
110
+ const failureRate = completed ? (failed + retries) / completed : 0;
111
+ const permanentFailureRate = withoutRetries ? failed / withoutRetries : 0;
112
+ console.event("report", {
113
+ ...report,
114
+ failureRate: Number(failureRate.toFixed(4)),
115
+ permanentFailureRate: Number(permanentFailureRate.toFixed(4)),
116
+ });
117
+ }
66
118
  /**
67
119
  * Warning: this should not be used from a mutation, as it will cause conflicts.
68
120
  * Use this while developing to see the state of the queue.
69
121
  */
70
- export const debugCounts = internalQuery({
122
+ export const diagnostics = internalQuery({
71
123
  args: {},
72
124
  returns: v.any(),
73
125
  handler: async (ctx) => {
74
- const inProgressWork = (await ctx.db.query("internalState").unique())?.running.length ?? 0;
126
+ const global = await ctx.db.query("globals").unique();
127
+ const internalState = await ctx.db.query("internalState").unique();
128
+ const inProgressWork = internalState?.running.length ?? 0;
129
+ const maxParallelism = global?.maxParallelism ?? DEFAULT_MAX_PARALLELISM;
75
130
  /* eslint-disable @typescript-eslint/no-explicit-any */
76
131
  const pendingStart = await ctx.db.query("pendingStart").count();
77
132
  const pendingCompletion = await ctx.db.query("pendingCompletion").count();
78
133
  const pendingCancelation = await ctx.db.query("pendingCancelation").count();
134
+ const runStatus = await ctx.db.query("runStatus").unique();
79
135
  /* eslint-enable @typescript-eslint/no-explicit-any */
80
136
  return {
81
- pendingStart,
82
- inProgressWork,
83
- pendingCompletion,
84
- pendingCancelation,
85
- active: inProgressWork - pendingCompletion,
137
+ canceling: pendingCancelation,
138
+ waiting: pendingStart,
139
+ running: inProgressWork - pendingCompletion,
140
+ completing: pendingCompletion,
141
+ spareCapacity: maxParallelism - inProgressWork,
142
+ runStatus: runStatus?.state.kind,
143
+ generation: internalState?.generation,
86
144
  };
87
145
  },
88
146
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/component/stats.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,15 @@
1
1
  export declare const runMutationWrapper: import("convex/server").RegisteredMutation<"internal", {
2
- logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
2
+ logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
3
3
  fnHandle: string;
4
4
  workId: import("convex/values").GenericId<"work">;
5
5
  fnArgs: any;
6
+ attempt: number;
6
7
  }, Promise<void>>;
7
8
  export declare const runActionWrapper: import("convex/server").RegisteredAction<"internal", {
8
- logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
9
+ logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
9
10
  fnHandle: string;
10
11
  workId: import("convex/values").GenericId<"work">;
11
12
  fnArgs: any;
12
- }, Promise<void>>;
13
- export declare const saveResult: import("convex/server").RegisteredMutation<"internal", {
14
- workId: import("convex/values").GenericId<"work">;
15
- runResult: {
16
- kind: "success";
17
- returnValue: any;
18
- } | {
19
- kind: "failed";
20
- error: string;
21
- } | {
22
- kind: "canceled";
23
- };
13
+ attempt: number;
24
14
  }, Promise<void>>;
25
15
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,kBAAkB;;;;;iBA0B7B,CAAC;AASH,eAAO,MAAM,gBAAgB;;;;;iBA2B3B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;iBAarB,CAAC"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,kBAAkB;;;;;;iBA4B7B,CAAC;AASH,eAAO,MAAM,gBAAgB;;;;;;iBA4B3B,CAAC"}
@@ -1,33 +1,33 @@
1
1
  import { v } from "convex/values";
2
2
  import { internal } from "./_generated/api.js";
3
3
  import { internalAction, internalMutation } from "./_generated/server.js";
4
- import { kickMainLoop } from "./kick.js";
5
4
  import { createLogger, logLevel } from "./logging.js";
6
- import { nextSegment, runResult } from "./shared.js";
7
5
  export const runMutationWrapper = internalMutation({
8
6
  args: {
9
7
  workId: v.id("work"),
10
8
  fnHandle: v.string(),
11
9
  fnArgs: v.any(),
12
10
  logLevel,
11
+ attempt: v.number(),
13
12
  },
14
- handler: async (ctx, { workId, fnHandle: handleStr, fnArgs, logLevel }) => {
15
- const console = createLogger(logLevel);
16
- const fnHandle = handleStr;
13
+ handler: async (ctx, { workId, attempt, ...args }) => {
14
+ const console = createLogger(args.logLevel);
15
+ const fnHandle = args.fnHandle;
17
16
  try {
18
- const returnValue = await ctx.runMutation(fnHandle, fnArgs);
17
+ const returnValue = await ctx.runMutation(fnHandle, args.fnArgs);
19
18
  // NOTE: we could run the `saveResult` handler here, or call `ctx.runMutation`,
20
19
  // but we want the mutation to be a separate transaction to reduce the window for OCCs.
21
- await ctx.scheduler.runAfter(0, internal.worker.saveResult, {
22
- workId,
23
- runResult: { kind: "success", returnValue },
20
+ await ctx.scheduler.runAfter(0, internal.complete.complete, {
21
+ jobs: [
22
+ { workId, runResult: { kind: "success", returnValue }, attempt },
23
+ ],
24
24
  });
25
25
  }
26
26
  catch (e) {
27
27
  console.error(e);
28
- await ctx.scheduler.runAfter(0, internal.worker.saveResult, {
29
- workId,
30
- runResult: { kind: "failed", error: formatError(e) },
28
+ const runResult = { kind: "failed", error: formatError(e) };
29
+ await ctx.scheduler.runAfter(0, internal.complete.complete, {
30
+ jobs: [{ workId, runResult, attempt }],
31
31
  });
32
32
  }
33
33
  },
@@ -44,43 +44,30 @@ export const runActionWrapper = internalAction({
44
44
  fnHandle: v.string(),
45
45
  fnArgs: v.any(),
46
46
  logLevel,
47
+ attempt: v.number(),
47
48
  },
48
- handler: async (ctx, { workId, fnHandle: handleStr, fnArgs, logLevel }) => {
49
- const console = createLogger(logLevel);
50
- const fnHandle = handleStr;
49
+ handler: async (ctx, { workId, attempt, ...args }) => {
50
+ const console = createLogger(args.logLevel);
51
+ const fnHandle = args.fnHandle;
51
52
  try {
52
- const returnValue = await ctx.runAction(fnHandle, fnArgs);
53
+ const returnValue = await ctx.runAction(fnHandle, args.fnArgs);
53
54
  // NOTE: we could run `ctx.runMutation`, but we want to guarantee execution,
54
55
  // and `ctx.scheduler.runAfter` won't OCC.
55
- await ctx.scheduler.runAfter(0, internal.worker.saveResult, {
56
- workId,
57
- runResult: { kind: "success", returnValue },
56
+ const runResult = { kind: "success", returnValue };
57
+ await ctx.scheduler.runAfter(0, internal.complete.complete, {
58
+ jobs: [{ workId, runResult, attempt }],
58
59
  });
59
60
  }
60
61
  catch (e) {
61
62
  console.error(e);
62
63
  // We let the main loop handle the retries.
63
- await ctx.scheduler.runAfter(0, internal.worker.saveResult, {
64
- workId,
65
- runResult: { kind: "failed", error: formatError(e) },
64
+ const runResult = { kind: "failed", error: formatError(e) };
65
+ await ctx.scheduler.runAfter(0, internal.complete.complete, {
66
+ jobs: [{ workId, runResult, attempt }],
66
67
  });
67
68
  }
68
69
  },
69
70
  });
70
- export const saveResult = internalMutation({
71
- args: {
72
- workId: v.id("work"),
73
- runResult,
74
- },
75
- handler: async (ctx, { workId, runResult }) => {
76
- await ctx.db.insert("pendingCompletion", {
77
- runResult,
78
- workId,
79
- segment: nextSegment(),
80
- });
81
- await kickMainLoop(ctx, "saveResult");
82
- },
83
- });
84
71
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
85
72
  const console = "THIS IS A REMINDER TO USE createLogger";
86
73
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/component/worker.ts"],"names":[],"mappings":"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"}
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.2.0-beta.0",
10
+ "version": "0.2.1",
11
11
  "license": "Apache-2.0",
12
12
  "keywords": [
13
13
  "convex",
@@ -24,14 +24,15 @@
24
24
  "build:cjs": "tsc --project ./commonjs.json && echo '{\\n \"type\": \"commonjs\"\\n}' > dist/commonjs/package.json",
25
25
  "dev": "cd example; npm run dev",
26
26
  "typecheck": "tsc --noEmit",
27
- "prepare": "npm run build",
28
- "prepack": "node node10stubs.mjs",
29
- "postpack": "node node10stubs.mjs --cleanup",
30
- "test": "vitest",
31
27
  "lint": "tsc --noEmit && eslint . && prettier --check .",
32
28
  "format": "prettier --write .",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest",
33
31
  "test:debug": "vitest --inspect-brk --no-file-parallelism",
34
- "test:coverage": "vitest run --coverage --coverage.reporter=text"
32
+ "test:coverage": "vitest run --coverage --coverage.reporter=text",
33
+ "prepare": "npm run build",
34
+ "prepack": "node node10stubs.mjs",
35
+ "postpack": "node node10stubs.mjs --cleanup"
35
36
  },
36
37
  "files": [
37
38
  "dist",
@@ -61,11 +62,14 @@
61
62
  }
62
63
  },
63
64
  "peerDependencies": {
64
- "convex": ">=1.17.0 <1.25.0"
65
+ "convex": ">=1.17.0 <1.25.0",
66
+ "convex-helpers": "^0.1.71"
65
67
  },
66
68
  "devDependencies": {
69
+ "@edge-runtime/vm": "^4.0.4",
67
70
  "@eslint/js": "^9.9.1",
68
71
  "@types/node": "^18.17.0",
72
+ "@vitest/coverage-v8": "^2.1.9",
69
73
  "convex-test": "^0.0.36-alpha.0",
70
74
  "eslint": "^9.9.1",
71
75
  "globals": "^15.9.0",
@@ -76,9 +80,5 @@
76
80
  },
77
81
  "main": "./dist/commonjs/client/index.js",
78
82
  "types": "./dist/commonjs/client/index.d.ts",
79
- "module": "./dist/esm/client/index.js",
80
- "dependencies": {
81
- "@edge-runtime/vm": "^4.0.4",
82
- "@vitest/coverage-v8": "^2.1.9"
83
- }
83
+ "module": "./dist/esm/client/index.js"
84
84
  }