@convex-dev/workpool 0.2.19-alpha.1 → 0.2.19-alpha.3

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 (196) hide show
  1. package/README.md +1 -0
  2. package/dist/{commonjs/client → client}/index.d.ts +13 -11
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/{commonjs/client → client}/index.js +6 -7
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/{commonjs/client → client}/utils.d.ts +2 -2
  7. package/dist/client/utils.d.ts.map +1 -0
  8. package/dist/client/utils.js.map +1 -0
  9. package/dist/component/_generated/api.d.ts +151 -0
  10. package/dist/component/_generated/api.d.ts.map +1 -0
  11. package/dist/component/_generated/api.js.map +1 -0
  12. package/dist/component/_generated/dataModel.d.ts +60 -0
  13. package/dist/component/_generated/server.d.ts +149 -0
  14. package/dist/component/_generated/server.d.ts.map +1 -0
  15. package/dist/component/_generated/server.js.map +1 -0
  16. package/dist/{commonjs/component → component}/complete.d.ts +2 -2
  17. package/dist/component/complete.d.ts.map +1 -0
  18. package/dist/{commonjs/component → component}/complete.js +1 -1
  19. package/dist/component/complete.js.map +1 -0
  20. package/dist/component/convex.config.d.ts.map +1 -0
  21. package/dist/component/convex.config.js.map +1 -0
  22. package/dist/component/crons.d.ts.map +1 -0
  23. package/dist/{esm/component → component}/crons.js +4 -4
  24. package/dist/component/crons.js.map +1 -0
  25. package/dist/component/danger.d.ts.map +1 -0
  26. package/dist/component/danger.js.map +1 -0
  27. package/dist/{esm/component → component}/kick.d.ts +2 -2
  28. package/dist/component/kick.d.ts.map +1 -0
  29. package/dist/component/kick.js.map +1 -0
  30. package/dist/{esm/component → component}/lib.d.ts +1 -1
  31. package/dist/component/lib.d.ts.map +1 -0
  32. package/dist/{commonjs/component → component}/lib.js +3 -4
  33. package/dist/component/lib.js.map +1 -0
  34. package/dist/{commonjs/component → component}/logging.d.ts +1 -1
  35. package/dist/component/logging.d.ts.map +1 -0
  36. package/dist/component/logging.js.map +1 -0
  37. package/dist/{commonjs/component → component}/loop.d.ts +2 -2
  38. package/dist/component/loop.d.ts.map +1 -0
  39. package/dist/{commonjs/component → component}/loop.js +1 -1
  40. package/dist/component/loop.js.map +1 -0
  41. package/dist/{esm/component → component}/recovery.d.ts +2 -2
  42. package/dist/component/recovery.d.ts.map +1 -0
  43. package/dist/{commonjs/component → component}/recovery.js +1 -1
  44. package/dist/component/recovery.js.map +1 -0
  45. package/dist/{commonjs/component → component}/schema.d.ts.map +1 -1
  46. package/dist/component/schema.js.map +1 -0
  47. package/dist/{commonjs/component → component}/shared.d.ts +2 -2
  48. package/dist/component/shared.d.ts.map +1 -0
  49. package/dist/component/shared.js.map +1 -0
  50. package/dist/{esm/component → component}/stats.d.ts +4 -4
  51. package/dist/component/stats.d.ts.map +1 -0
  52. package/dist/{commonjs/component → component}/stats.js +0 -3
  53. package/dist/component/stats.js.map +1 -0
  54. package/dist/component/worker.d.ts.map +1 -0
  55. package/dist/component/worker.js.map +1 -0
  56. package/package.json +42 -39
  57. package/src/client/index.ts +32 -29
  58. package/src/client/utils.ts +7 -7
  59. package/src/component/_generated/api.d.ts +1 -0
  60. package/src/component/complete.test.ts +6 -6
  61. package/src/component/complete.ts +9 -5
  62. package/src/component/crons.ts +4 -4
  63. package/src/component/kick.test.ts +3 -3
  64. package/src/component/kick.ts +2 -2
  65. package/src/component/lib.test.ts +6 -6
  66. package/src/component/lib.ts +15 -5
  67. package/src/component/logging.test.ts +1 -1
  68. package/src/component/logging.ts +1 -1
  69. package/src/component/loop.test.ts +7 -7
  70. package/src/component/loop.ts +8 -8
  71. package/src/component/recovery.test.ts +9 -9
  72. package/src/component/recovery.ts +2 -2
  73. package/src/component/shared.ts +2 -2
  74. package/src/component/stats.test.ts +11 -11
  75. package/src/component/stats.ts +4 -7
  76. package/src/test.ts +3 -0
  77. package/dist/commonjs/client/index.d.ts.map +0 -1
  78. package/dist/commonjs/client/index.js.map +0 -1
  79. package/dist/commonjs/client/utils.d.ts.map +0 -1
  80. package/dist/commonjs/client/utils.js.map +0 -1
  81. package/dist/commonjs/component/_generated/api.d.ts +0 -12
  82. package/dist/commonjs/component/_generated/api.d.ts.map +0 -1
  83. package/dist/commonjs/component/_generated/api.js.map +0 -1
  84. package/dist/commonjs/component/_generated/server.d.ts +0 -64
  85. package/dist/commonjs/component/_generated/server.d.ts.map +0 -1
  86. package/dist/commonjs/component/_generated/server.js.map +0 -1
  87. package/dist/commonjs/component/complete.d.ts.map +0 -1
  88. package/dist/commonjs/component/complete.js.map +0 -1
  89. package/dist/commonjs/component/convex.config.d.ts.map +0 -1
  90. package/dist/commonjs/component/convex.config.js.map +0 -1
  91. package/dist/commonjs/component/crons.d.ts.map +0 -1
  92. package/dist/commonjs/component/crons.js +0 -61
  93. package/dist/commonjs/component/crons.js.map +0 -1
  94. package/dist/commonjs/component/danger.d.ts.map +0 -1
  95. package/dist/commonjs/component/danger.js.map +0 -1
  96. package/dist/commonjs/component/kick.d.ts +0 -9
  97. package/dist/commonjs/component/kick.d.ts.map +0 -1
  98. package/dist/commonjs/component/kick.js.map +0 -1
  99. package/dist/commonjs/component/lib.d.ts +0 -79
  100. package/dist/commonjs/component/lib.d.ts.map +0 -1
  101. package/dist/commonjs/component/lib.js.map +0 -1
  102. package/dist/commonjs/component/logging.d.ts.map +0 -1
  103. package/dist/commonjs/component/logging.js.map +0 -1
  104. package/dist/commonjs/component/loop.d.ts.map +0 -1
  105. package/dist/commonjs/component/loop.js.map +0 -1
  106. package/dist/commonjs/component/recovery.d.ts +0 -53
  107. package/dist/commonjs/component/recovery.d.ts.map +0 -1
  108. package/dist/commonjs/component/recovery.js.map +0 -1
  109. package/dist/commonjs/component/schema.js.map +0 -1
  110. package/dist/commonjs/component/shared.d.ts.map +0 -1
  111. package/dist/commonjs/component/shared.js.map +0 -1
  112. package/dist/commonjs/component/stats.d.ts +0 -45
  113. package/dist/commonjs/component/stats.d.ts.map +0 -1
  114. package/dist/commonjs/component/stats.js.map +0 -1
  115. package/dist/commonjs/component/worker.d.ts.map +0 -1
  116. package/dist/commonjs/component/worker.js.map +0 -1
  117. package/dist/commonjs/package.json +0 -3
  118. package/dist/esm/client/index.d.ts +0 -429
  119. package/dist/esm/client/index.d.ts.map +0 -1
  120. package/dist/esm/client/index.js +0 -317
  121. package/dist/esm/client/index.js.map +0 -1
  122. package/dist/esm/client/utils.d.ts +0 -16
  123. package/dist/esm/client/utils.d.ts.map +0 -1
  124. package/dist/esm/client/utils.js +0 -9
  125. package/dist/esm/client/utils.js.map +0 -1
  126. package/dist/esm/component/_generated/api.d.ts +0 -12
  127. package/dist/esm/component/_generated/api.d.ts.map +0 -1
  128. package/dist/esm/component/_generated/api.js +0 -22
  129. package/dist/esm/component/_generated/api.js.map +0 -1
  130. package/dist/esm/component/_generated/server.d.ts +0 -64
  131. package/dist/esm/component/_generated/server.d.ts.map +0 -1
  132. package/dist/esm/component/_generated/server.js +0 -74
  133. package/dist/esm/component/_generated/server.js.map +0 -1
  134. package/dist/esm/component/complete.d.ts +0 -89
  135. package/dist/esm/component/complete.d.ts.map +0 -1
  136. package/dist/esm/component/complete.js +0 -88
  137. package/dist/esm/component/complete.js.map +0 -1
  138. package/dist/esm/component/convex.config.d.ts +0 -3
  139. package/dist/esm/component/convex.config.d.ts.map +0 -1
  140. package/dist/esm/component/convex.config.js +0 -4
  141. package/dist/esm/component/convex.config.js.map +0 -1
  142. package/dist/esm/component/crons.d.ts +0 -4
  143. package/dist/esm/component/crons.d.ts.map +0 -1
  144. package/dist/esm/component/crons.js.map +0 -1
  145. package/dist/esm/component/danger.d.ts +0 -11
  146. package/dist/esm/component/danger.d.ts.map +0 -1
  147. package/dist/esm/component/danger.js +0 -92
  148. package/dist/esm/component/danger.js.map +0 -1
  149. package/dist/esm/component/kick.d.ts.map +0 -1
  150. package/dist/esm/component/kick.js +0 -102
  151. package/dist/esm/component/kick.js.map +0 -1
  152. package/dist/esm/component/lib.d.ts.map +0 -1
  153. package/dist/esm/component/lib.js +0 -179
  154. package/dist/esm/component/lib.js.map +0 -1
  155. package/dist/esm/component/logging.d.ts +0 -16
  156. package/dist/esm/component/logging.d.ts.map +0 -1
  157. package/dist/esm/component/logging.js +0 -71
  158. package/dist/esm/component/logging.js.map +0 -1
  159. package/dist/esm/component/loop.d.ts +0 -14
  160. package/dist/esm/component/loop.d.ts.map +0 -1
  161. package/dist/esm/component/loop.js +0 -503
  162. package/dist/esm/component/loop.js.map +0 -1
  163. package/dist/esm/component/recovery.d.ts.map +0 -1
  164. package/dist/esm/component/recovery.js +0 -97
  165. package/dist/esm/component/recovery.js.map +0 -1
  166. package/dist/esm/component/schema.d.ts +0 -228
  167. package/dist/esm/component/schema.d.ts.map +0 -1
  168. package/dist/esm/component/schema.js +0 -79
  169. package/dist/esm/component/schema.js.map +0 -1
  170. package/dist/esm/component/shared.d.ts +0 -140
  171. package/dist/esm/component/shared.d.ts.map +0 -1
  172. package/dist/esm/component/shared.js +0 -79
  173. package/dist/esm/component/shared.js.map +0 -1
  174. package/dist/esm/component/stats.d.ts.map +0 -1
  175. package/dist/esm/component/stats.js +0 -129
  176. package/dist/esm/component/stats.js.map +0 -1
  177. package/dist/esm/component/worker.d.ts +0 -16
  178. package/dist/esm/component/worker.d.ts.map +0 -1
  179. package/dist/esm/component/worker.js +0 -76
  180. package/dist/esm/component/worker.js.map +0 -1
  181. package/dist/esm/package.json +0 -3
  182. /package/dist/{commonjs/client → client}/utils.js +0 -0
  183. /package/dist/{commonjs/component → component}/_generated/api.js +0 -0
  184. /package/dist/{commonjs/component → component}/_generated/server.js +0 -0
  185. /package/dist/{commonjs/component → component}/convex.config.d.ts +0 -0
  186. /package/dist/{commonjs/component → component}/convex.config.js +0 -0
  187. /package/dist/{commonjs/component → component}/crons.d.ts +0 -0
  188. /package/dist/{commonjs/component → component}/danger.d.ts +0 -0
  189. /package/dist/{commonjs/component → component}/danger.js +0 -0
  190. /package/dist/{commonjs/component → component}/kick.js +0 -0
  191. /package/dist/{commonjs/component → component}/logging.js +0 -0
  192. /package/dist/{commonjs/component → component}/schema.d.ts +0 -0
  193. /package/dist/{commonjs/component → component}/schema.js +0 -0
  194. /package/dist/{commonjs/component → component}/shared.js +0 -0
  195. /package/dist/{commonjs/component → component}/worker.d.ts +0 -0
  196. /package/dist/{commonjs/component → component}/worker.js +0 -0
@@ -1,71 +0,0 @@
1
- import { v } from "convex/values";
2
- export const DEFAULT_LOG_LEVEL = "REPORT";
3
- // NOTE: the ordering here is important! A config level of "INFO" will log
4
- // "INFO", "REPORT", "WARN",and "ERROR" events.
5
- export const logLevel = v.union(v.literal("DEBUG"), v.literal("TRACE"), v.literal("INFO"), v.literal("REPORT"), v.literal("WARN"), v.literal("ERROR"));
6
- const logLevelOrder = logLevel.members.map((l) => l.value);
7
- const logLevelByName = logLevelOrder.reduce((acc, l, i) => {
8
- acc[l] = i;
9
- return acc;
10
- }, {});
11
- export function shouldLog(config, level) {
12
- return logLevelByName[config] <= logLevelByName[level];
13
- }
14
- const DEBUG = logLevelByName["DEBUG"];
15
- const TRACE = logLevelByName["TRACE"];
16
- const INFO = logLevelByName["INFO"];
17
- const REPORT = logLevelByName["REPORT"];
18
- const WARN = logLevelByName["WARN"];
19
- const ERROR = logLevelByName["ERROR"];
20
- export function createLogger(level) {
21
- const levelIndex = logLevelByName[level ?? DEFAULT_LOG_LEVEL];
22
- if (levelIndex === undefined) {
23
- throw new Error(`Invalid log level: ${level}`);
24
- }
25
- return {
26
- debug: (...args) => {
27
- if (levelIndex <= DEBUG) {
28
- console.debug(...args);
29
- }
30
- },
31
- info: (...args) => {
32
- if (levelIndex <= INFO) {
33
- console.info(...args);
34
- }
35
- },
36
- warn: (...args) => {
37
- if (levelIndex <= WARN) {
38
- console.warn(...args);
39
- }
40
- },
41
- error: (...args) => {
42
- if (levelIndex <= ERROR) {
43
- console.error(...args);
44
- }
45
- },
46
- time: (label) => {
47
- if (levelIndex <= TRACE) {
48
- console.time(label);
49
- }
50
- },
51
- timeEnd: (label) => {
52
- if (levelIndex <= TRACE) {
53
- console.timeEnd(label);
54
- }
55
- },
56
- event: (event, payload) => {
57
- const fullPayload = {
58
- component: "workpool",
59
- event,
60
- ...payload,
61
- };
62
- if (levelIndex === REPORT && event === "report") {
63
- console.info(JSON.stringify(fullPayload));
64
- }
65
- else if (levelIndex <= INFO) {
66
- console.info(JSON.stringify(fullPayload));
67
- }
68
- },
69
- };
70
- }
71
- //# sourceMappingURL=logging.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/component/logging.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { WithoutSystemFields } from "convex/server";
2
- import { Doc } from "./_generated/dataModel.js";
3
- export declare const RECOVERY_PERIOD_SEGMENTS: bigint;
4
- export declare const INITIAL_STATE: WithoutSystemFields<Doc<"internalState">>;
5
- export declare const main: import("convex/server").RegisteredMutation<"internal", {
6
- generation: bigint;
7
- segment: bigint;
8
- }, Promise<void>>;
9
- export declare const updateRunStatus: import("convex/server").RegisteredMutation<"internal", {
10
- generation: bigint;
11
- segment: bigint;
12
- }, Promise<void>>;
13
- export declare function withJitter(delay: number): number;
14
- //# sourceMappingURL=loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../../src/component/loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,GAAG,EAAM,MAAM,2BAA2B,CAAC;AA0BpD,eAAO,MAAM,wBAAwB,QAAwB,CAAC;AAE9D,eAAO,MAAM,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,CAanE,CAAC;AAGF,eAAO,MAAM,IAAI;;;iBAyEf,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBA6H1B,CAAC;AA0XH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC"}
@@ -1,503 +0,0 @@
1
- import { v } from "convex/values";
2
- import { internal } from "./_generated/api.js";
3
- import { internalMutation } from "./_generated/server.js";
4
- import { createLogger, DEFAULT_LOG_LEVEL, } from "./logging.js";
5
- import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, getNextSegment, max, toSegment, } from "./shared.js";
6
- import { recordCompleted, generateReport, recordStarted } from "./stats.js";
7
- const CANCELLATION_BATCH_SIZE = 64; // the only queue that can get unbounded.
8
- const SECOND = 1000;
9
- const MINUTE = 60 * SECOND;
10
- const RECOVERY_THRESHOLD_MS = 5 * MINUTE; // attempt to recover jobs this old.
11
- export const RECOVERY_PERIOD_SEGMENTS = toSegment(1 * MINUTE); // how often to check.
12
- const CURSOR_BUFFER_SEGMENTS = toSegment(30 * SECOND); // buffer for cursor updates.
13
- export const INITIAL_STATE = {
14
- generation: 0n,
15
- segmentCursors: { incoming: 0n, completion: 0n, cancelation: 0n },
16
- lastRecovery: 0n,
17
- report: {
18
- completed: 0,
19
- succeeded: 0,
20
- failed: 0,
21
- retries: 0,
22
- canceled: 0,
23
- lastReportTs: 0,
24
- },
25
- running: [],
26
- };
27
- // There should only ever be at most one of these scheduled or running.
28
- export const main = internalMutation({
29
- args: { generation: v.int64(), segment: v.int64() },
30
- handler: async (ctx, { generation, segment }) => {
31
- // State will be modified and patched at the end of the function.
32
- const state = await getOrCreateState(ctx);
33
- if (generation !== state.generation) {
34
- throw new Error(`generation mismatch: ${generation} !== ${state.generation}`);
35
- }
36
- state.generation++;
37
- const runStatus = await getOrCreateRunningStatus(ctx);
38
- if (runStatus.state.kind !== "running") {
39
- await ctx.db.patch(runStatus._id, {
40
- state: { kind: "running" },
41
- });
42
- }
43
- const globals = await getGlobals(ctx);
44
- const console = createLogger(globals.logLevel);
45
- const delayMs = Date.now() - fromSegment(segment);
46
- console.debug(`[main] generation ${generation} behind: ${delayMs}ms`);
47
- // Read pendingCompletions, including retry handling.
48
- console.time("[main] pendingCompletion");
49
- const toCancel = await handleCompletions(ctx, state, segment, console);
50
- console.timeEnd("[main] pendingCompletion");
51
- // Read pendingCancelation, deleting from pendingStart. If it's still running, queue to cancel.
52
- console.time("[main] pendingCancelation");
53
- await handleCancelation(ctx, state, segment, console, toCancel);
54
- console.timeEnd("[main] pendingCancelation");
55
- if (state.running.length === 0) {
56
- // If there's nothing active, reset lastRecovery.
57
- state.lastRecovery = segment;
58
- }
59
- else if (segment - state.lastRecovery >= RECOVERY_PERIOD_SEGMENTS) {
60
- // Otherwise schedule recovery for any old jobs.
61
- await handleRecovery(ctx, state, console);
62
- state.lastRecovery = segment;
63
- }
64
- // Read pendingStart up to max capacity. Update the config, and incomingSegmentCursor.
65
- console.time("[main] pendingStart");
66
- await handleStart(ctx, state, segment, console, globals);
67
- console.timeEnd("[main] pendingStart");
68
- if (Date.now() - state.report.lastReportTs >= MINUTE) {
69
- // If minute rollover since last report, log report.
70
- // Try to avoid clock skew by shifting by a minute.
71
- let lastReportTs = state.report.lastReportTs + MINUTE;
72
- if (Date.now() > lastReportTs + MINUTE / 2) {
73
- // It's been a while, let's start fresh.
74
- lastReportTs = Date.now();
75
- }
76
- await generateReport(ctx, console, state, globals);
77
- state.report = {
78
- completed: 0,
79
- succeeded: 0,
80
- failed: 0,
81
- retries: 0,
82
- canceled: 0,
83
- lastReportTs,
84
- };
85
- }
86
- await ctx.db.replace(state._id, state);
87
- await ctx.scheduler.runAfter(0, internal.loop.updateRunStatus, {
88
- generation: state.generation,
89
- segment,
90
- });
91
- // TODO: if there were more cancellations, schedule main directly.
92
- },
93
- });
94
- export const updateRunStatus = internalMutation({
95
- args: { generation: v.int64(), segment: v.int64() },
96
- handler: async (ctx, { generation, segment }) => {
97
- const globals = await getGlobals(ctx);
98
- const console = createLogger(globals.logLevel);
99
- const maxParallelism = globals.maxParallelism;
100
- const state = await getOrCreateState(ctx);
101
- if (generation !== state.generation) {
102
- throw new Error(`generation mismatch: ${generation} !== ${state.generation}`);
103
- }
104
- console.time("[updateRunStatus] outstandingCancelations");
105
- const outstandingCancelations = await getNextUp(ctx, "pendingCancelation", {
106
- start: state.segmentCursors.cancelation,
107
- end: segment,
108
- });
109
- console.timeEnd("[updateRunStatus] outstandingCancelations");
110
- if (outstandingCancelations) {
111
- await ctx.scheduler.runAfter(0, internal.loop.main, {
112
- generation,
113
- segment,
114
- });
115
- return;
116
- }
117
- // TODO: check for current segment (or from args) first, to avoid OCCs.
118
- console.time("[updateRunStatus] nextSegmentIsActionable");
119
- const nextSegment = max(segment + 1n, getCurrentSegment());
120
- const nextIsActionable = await nextSegmentIsActionable(ctx, state, maxParallelism, nextSegment);
121
- console.timeEnd("[updateRunStatus] nextSegmentIsActionable");
122
- if (nextIsActionable) {
123
- await ctx.scheduler.runAt(boundScheduledTime(fromSegment(nextSegment), console), internal.loop.main, {
124
- generation,
125
- segment: nextSegment,
126
- });
127
- return;
128
- }
129
- console.time("[updateRunStatus] oldSegmentIsActionable");
130
- const [oldIsActionable, cursors] = await oldSegmentIsActionable(ctx, state, maxParallelism);
131
- console.timeEnd("[updateRunStatus] oldSegmentIsActionable");
132
- if (oldIsActionable) {
133
- await ctx.db.patch(state._id, {
134
- segmentCursors: {
135
- ...state.segmentCursors,
136
- ...cursors,
137
- },
138
- });
139
- await ctx.scheduler.runAfter(0, internal.loop.main, {
140
- generation,
141
- segment: getCurrentSegment(),
142
- });
143
- return;
144
- }
145
- // Find next actionable segment (min next segment).
146
- console.time("[updateRunStatus] findNextSegment");
147
- const actionableTables = ["pendingCompletion", "pendingCancelation"];
148
- if (state.running.length < maxParallelism) {
149
- actionableTables.push("pendingStart");
150
- }
151
- const docs = await Promise.all(actionableTables.map(async (tableName) => getNextUp(ctx, tableName, { start: nextSegment })));
152
- console.timeEnd("[updateRunStatus] findNextSegment");
153
- let targetSegment = docs.map((d) => d?.segment).sort()[0];
154
- const runStatus = await getOrCreateRunningStatus(ctx);
155
- const saturated = state.running.length >= maxParallelism;
156
- if (targetSegment !== undefined || state.running.length > 0) {
157
- // If there's something to do, schedule for next actionable segment.
158
- // Or the next recovery, whichever comes first.
159
- const nextRecoverySegment = state.lastRecovery + RECOVERY_PERIOD_SEGMENTS;
160
- if (!targetSegment || targetSegment > nextRecoverySegment) {
161
- targetSegment = nextRecoverySegment;
162
- }
163
- const scheduledId = await ctx.scheduler.runAt(boundScheduledTime(fromSegment(targetSegment), console), internal.loop.main, { generation, segment: targetSegment });
164
- if (targetSegment > getNextSegment()) {
165
- await ctx.db.patch(runStatus._id, {
166
- state: {
167
- kind: "scheduled",
168
- scheduledId,
169
- saturated,
170
- generation,
171
- segment: targetSegment,
172
- },
173
- });
174
- }
175
- else {
176
- console.debug(`[updateRunStatus] staying running because it's the next segment`);
177
- }
178
- return;
179
- }
180
- // There seems to be nothing in the future to do, so go idle.
181
- await ctx.db.patch(runStatus._id, {
182
- state: { kind: "idle", generation },
183
- });
184
- },
185
- });
186
- async function nextSegmentIsActionable(ctx, state, maxParallelism, end) {
187
- // First, try with our cursor range, up to end.
188
- if (await getNextUp(ctx, "pendingCancelation", {
189
- start: state.segmentCursors.cancelation,
190
- end,
191
- })) {
192
- return true;
193
- }
194
- if (await getNextUp(ctx, "pendingCompletion", {
195
- start: state.segmentCursors.completion,
196
- end,
197
- })) {
198
- return true;
199
- }
200
- if (state.running.length < maxParallelism) {
201
- if (await getNextUp(ctx, "pendingStart", {
202
- start: state.segmentCursors.incoming,
203
- end,
204
- })) {
205
- return true;
206
- }
207
- }
208
- return false;
209
- }
210
- async function oldSegmentIsActionable(ctx, state, maxParallelism) {
211
- // Next, we look for out-of-order additions we may have missed.
212
- const oldCompletion = await getNextUp(ctx, "pendingCompletion", {
213
- end: state.segmentCursors.completion,
214
- });
215
- if (oldCompletion) {
216
- return [true, { completion: oldCompletion.segment }];
217
- }
218
- const oldCancelation = await getNextUp(ctx, "pendingCancelation", {
219
- end: state.segmentCursors.cancelation,
220
- });
221
- if (oldCancelation) {
222
- return [true, { cancelation: oldCancelation.segment }];
223
- }
224
- if (state.running.length < maxParallelism) {
225
- const oldStart = await getNextUp(ctx, "pendingStart", {
226
- end: state.segmentCursors.incoming,
227
- });
228
- if (oldStart) {
229
- return [true, { incoming: oldStart.segment }];
230
- }
231
- }
232
- return [false, {}];
233
- }
234
- // Fetch the next item. If only one of start & end are provided, it's exclusive.
235
- async function getNextUp(ctx, table, range) {
236
- return ctx.db
237
- .query(table)
238
- .withIndex("segment", (q) => range.start !== undefined
239
- ? range.end !== undefined
240
- ? q
241
- .gte("segment", range.start - CURSOR_BUFFER_SEGMENTS)
242
- .lte("segment", range.end)
243
- : q.gt("segment", range.start - CURSOR_BUFFER_SEGMENTS)
244
- : range.end !== undefined
245
- ? q.lt("segment", range.end)
246
- : q)
247
- .first();
248
- }
249
- /**
250
- * Handles the completion of pending completions.
251
- * This only processes work that succeeded or failed, not canceled.
252
- */
253
- async function handleCompletions(ctx, state, segment, console) {
254
- const startSegment = state.segmentCursors.completion - CURSOR_BUFFER_SEGMENTS;
255
- // This won't be too many because the jobs all correspond to being scheduled
256
- // by a single main (the previous one), so they're limited by MAX_PARALLELISM.
257
- const completed = await ctx.db
258
- .query("pendingCompletion")
259
- .withIndex("segment", (q) => q.gte("segment", startSegment).lte("segment", segment))
260
- .collect();
261
- state.segmentCursors.completion = segment;
262
- // Completions that were going to be retried but have since been canceled.
263
- const toCancel = [];
264
- await Promise.all(completed.map(async (c) => {
265
- await ctx.db.delete(c._id);
266
- const running = state.running.find((r) => r.workId === c.workId);
267
- if (!running) {
268
- console.error(`[main] completing ${c.workId} but it's not in "running"`);
269
- return;
270
- }
271
- if (c.retry) {
272
- // Only check for work if it's going to be retried.
273
- const work = await ctx.db.get(c.workId);
274
- if (!work) {
275
- console.warn(`[main] ${c.workId} is gone, but trying to complete`);
276
- return;
277
- }
278
- const retried = await rescheduleJob(ctx, work, console);
279
- if (retried) {
280
- state.report.retries++;
281
- recordCompleted(console, work, "retrying");
282
- }
283
- else {
284
- // We don't retry if it's been canceled in the mean time.
285
- state.report.canceled++;
286
- toCancel.push({
287
- workId: c.workId,
288
- runResult: { kind: "canceled" },
289
- attempt: work.attempts,
290
- });
291
- }
292
- }
293
- else {
294
- if (c.runResult.kind === "success") {
295
- state.report.succeeded++;
296
- }
297
- else if (c.runResult.kind === "failed") {
298
- state.report.failed++;
299
- }
300
- }
301
- }));
302
- // We do this after so the stats above know if it was in progress.
303
- const before = state.running.length;
304
- state.running = state.running.filter((r) => !completed.some((c) => c.workId === r.workId));
305
- const numCompleted = before - state.running.length;
306
- state.report.completed += numCompleted;
307
- console.debug(`[main] completed ${numCompleted} work`);
308
- return toCancel;
309
- }
310
- async function handleCancelation(ctx, state, segment, console, toCancel) {
311
- const start = state.segmentCursors.cancelation - CURSOR_BUFFER_SEGMENTS;
312
- const canceled = await ctx.db
313
- .query("pendingCancelation")
314
- .withIndex("segment", (q) => q.gte("segment", start).lte("segment", segment))
315
- .take(CANCELLATION_BATCH_SIZE);
316
- state.segmentCursors.cancelation = canceled.at(-1)?.segment ?? segment;
317
- if (canceled.length) {
318
- console.debug(`[main] attempting to cancel ${canceled.length}`);
319
- }
320
- const canceledWork = new Set();
321
- const runResult = { kind: "canceled" };
322
- const jobs = toCancel.concat(...(await Promise.all(canceled.map(async ({ _id, _creationTime, workId }) => {
323
- await ctx.db.delete(_id);
324
- if (canceledWork.has(workId)) {
325
- // We shouldn't have multiple pending cancelations for the same work.
326
- console.error(`[main] ${workId} already canceled`);
327
- return null;
328
- }
329
- const work = await ctx.db.get(workId);
330
- if (!work) {
331
- console.warn(`[main] ${workId} is gone, but trying to cancel`);
332
- return null;
333
- }
334
- // Ensure it doesn't retry.
335
- await ctx.db.patch(workId, { canceled: true });
336
- // Ensure it doesn't start.
337
- const pendingStart = await ctx.db
338
- .query("pendingStart")
339
- .withIndex("workId", (q) => q.eq("workId", workId))
340
- .unique();
341
- if (pendingStart && !canceledWork.has(workId)) {
342
- state.report.canceled++;
343
- await ctx.db.delete(pendingStart._id);
344
- canceledWork.add(workId);
345
- return { workId, runResult, attempt: work.attempts };
346
- }
347
- return null;
348
- }))).flatMap((r) => (r ? [r] : [])));
349
- if (jobs.length) {
350
- await ctx.scheduler.runAfter(0, internal.complete.complete, { jobs });
351
- }
352
- }
353
- async function handleRecovery(ctx, state, console) {
354
- const missing = new Set();
355
- const oldEnoughToConsider = Date.now() - RECOVERY_THRESHOLD_MS;
356
- const jobs = (await Promise.all(state.running.map(async (r) => {
357
- if (r.started >= oldEnoughToConsider) {
358
- return null;
359
- }
360
- const work = await ctx.db.get(r.workId);
361
- if (!work) {
362
- missing.add(r.workId);
363
- console.error(`[main] ${r.workId} already gone (skipping recovery)`);
364
- return null;
365
- }
366
- return { ...r, attempt: work.attempts };
367
- }))).flatMap((r) => (r ? [r] : []));
368
- state.running = state.running.filter((r) => !missing.has(r.workId));
369
- if (jobs.length) {
370
- await ctx.scheduler.runAfter(0, internal.recovery.recover, { jobs });
371
- }
372
- }
373
- async function handleStart(ctx, state, segment, console, { maxParallelism, logLevel }) {
374
- // Schedule as many as needed to reach maxParallelism.
375
- const toSchedule = maxParallelism - state.running.length;
376
- const pending = toSchedule > 0
377
- ? await ctx.db
378
- .query("pendingStart")
379
- .withIndex("segment", (q) => q
380
- .gte("segment", state.segmentCursors.incoming - CURSOR_BUFFER_SEGMENTS)
381
- .lte("segment", segment))
382
- .take(toSchedule)
383
- : [];
384
- if (pending) {
385
- if (pending.length > 0) {
386
- state.segmentCursors.incoming = pending.at(-1).segment;
387
- }
388
- else if (toSchedule > 0) {
389
- // We have no more pending work, update to now
390
- state.segmentCursors.incoming = segment;
391
- }
392
- }
393
- console.debug(`[main] scheduling ${pending.length} pending work`);
394
- // Start new work.
395
- state.running.push(...(await Promise.all(pending.map(async ({ _id, workId, segment }) => {
396
- if (state.running.some((r) => r.workId === workId)) {
397
- console.error(`[main] ${workId} already running (skipping start)`);
398
- return null;
399
- }
400
- const lagMs = Date.now() - fromSegment(segment);
401
- const scheduledId = await beginWork(ctx, workId, logLevel, lagMs);
402
- await ctx.db.delete(_id);
403
- return { scheduledId, workId, started: Date.now() };
404
- }))).flatMap((r) => (r ? [r] : [])));
405
- }
406
- async function beginWork(ctx, workId, logLevel, lagMs) {
407
- const console = createLogger(logLevel);
408
- const work = await ctx.db.get(workId);
409
- if (!work) {
410
- throw new Error("work not found");
411
- }
412
- recordStarted(console, work, lagMs);
413
- const { attempts: attempt, fnHandle, fnArgs } = work;
414
- const args = { workId, fnHandle, fnArgs, logLevel, attempt };
415
- if (work.fnType === "action") {
416
- return ctx.scheduler.runAfter(0, internal.worker.runActionWrapper, args);
417
- }
418
- else if (work.fnType === "mutation" || work.fnType === "query") {
419
- return ctx.scheduler.runAfter(0, internal.worker.runMutationWrapper, {
420
- ...args,
421
- fnType: work.fnType,
422
- });
423
- }
424
- else {
425
- throw new Error(`Unexpected fnType ${work.fnType}`);
426
- }
427
- }
428
- /**
429
- * Reschedules a job for retry.
430
- * If it's been canceled in the mean time, don't retry.
431
- * @returns true if the job was rescheduled, false if it was not.
432
- */
433
- async function rescheduleJob(ctx, work, console) {
434
- const pendingCancelation = await ctx.db
435
- .query("pendingCancelation")
436
- .withIndex("workId", (q) => q.eq("workId", work._id))
437
- .unique();
438
- if (pendingCancelation) {
439
- // If there's an un-processed cancelation request, don't retry.
440
- console.warn(`[main] ${work._id} in pendingCancelation so not retrying`);
441
- return false;
442
- }
443
- if (work.canceled) {
444
- return false;
445
- }
446
- if (!work.retryBehavior) {
447
- console.warn(`[main] ${work._id} has no retryBehavior so not retrying`);
448
- return false;
449
- }
450
- const existing = await ctx.db
451
- .query("pendingStart")
452
- .withIndex("workId", (q) => q.eq("workId", work._id))
453
- .first();
454
- if (existing) {
455
- // Not sure why this would ever happen, but ensure uniqueness explicitly.
456
- console.error(`[main] ${work._id} already in pendingStart so not retrying`);
457
- return false;
458
- }
459
- const backoffMs = work.retryBehavior.initialBackoffMs *
460
- Math.pow(work.retryBehavior.base, work.attempts - 1);
461
- const nextAttempt = withJitter(backoffMs);
462
- const startTime = boundScheduledTime(Date.now() + nextAttempt, console);
463
- const segment = toSegment(startTime);
464
- await ctx.db.insert("pendingStart", {
465
- workId: work._id,
466
- segment,
467
- });
468
- return true;
469
- }
470
- export function withJitter(delay) {
471
- return delay * (0.5 + Math.random());
472
- }
473
- async function getGlobals(ctx) {
474
- const globals = await ctx.db.query("globals").unique();
475
- if (!globals) {
476
- return {
477
- maxParallelism: DEFAULT_MAX_PARALLELISM,
478
- logLevel: DEFAULT_LOG_LEVEL,
479
- };
480
- }
481
- return globals;
482
- }
483
- async function getOrCreateState(ctx) {
484
- const state = await ctx.db.query("internalState").unique();
485
- if (state)
486
- return state;
487
- const globals = await getGlobals(ctx);
488
- const console = createLogger(globals.logLevel);
489
- console.error("No internalState in running loop! Re-creating empty one...");
490
- return (await ctx.db.get(await ctx.db.insert("internalState", INITIAL_STATE)));
491
- }
492
- async function getOrCreateRunningStatus(ctx) {
493
- const runStatus = await ctx.db.query("runStatus").unique();
494
- if (runStatus)
495
- return runStatus;
496
- const globals = await getGlobals(ctx);
497
- const console = createLogger(globals.logLevel);
498
- console.error("No runStatus in running loop! Re-creating one...");
499
- return (await ctx.db.get(await ctx.db.insert("runStatus", { state: { kind: "running" } })));
500
- }
501
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
502
- const console = "THIS IS A REMINDER TO USE createLogger";
503
- //# sourceMappingURL=loop.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../../src/component/loop.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../src/component/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAK,MAAM,eAAe,CAAC;AACzC,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAIvE,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,iBAgErC"}