@convex-dev/workpool 0.2.0 → 0.2.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.
- package/README.md +86 -3
- package/dist/commonjs/client/index.d.ts +32 -6
- package/dist/commonjs/client/index.d.ts.map +1 -1
- package/dist/commonjs/client/index.js +28 -2
- package/dist/commonjs/client/index.js.map +1 -1
- package/dist/commonjs/component/complete.d.ts.map +1 -1
- package/dist/commonjs/component/complete.js +9 -7
- package/dist/commonjs/component/complete.js.map +1 -1
- package/dist/commonjs/component/kick.d.ts +3 -2
- package/dist/commonjs/component/kick.d.ts.map +1 -1
- package/dist/commonjs/component/kick.js +12 -9
- package/dist/commonjs/component/kick.js.map +1 -1
- package/dist/commonjs/component/lib.d.ts +3 -3
- package/dist/commonjs/component/lib.d.ts.map +1 -1
- package/dist/commonjs/component/lib.js +25 -19
- package/dist/commonjs/component/lib.js.map +1 -1
- package/dist/commonjs/component/logging.d.ts +3 -2
- package/dist/commonjs/component/logging.d.ts.map +1 -1
- package/dist/commonjs/component/logging.js +34 -15
- package/dist/commonjs/component/logging.js.map +1 -1
- package/dist/commonjs/component/loop.js +10 -10
- package/dist/commonjs/component/loop.js.map +1 -1
- package/dist/commonjs/component/recovery.d.ts +29 -0
- package/dist/commonjs/component/recovery.d.ts.map +1 -1
- package/dist/commonjs/component/recovery.js +69 -66
- package/dist/commonjs/component/recovery.js.map +1 -1
- package/dist/commonjs/component/schema.d.ts +11 -11
- package/dist/commonjs/component/shared.d.ts +4 -4
- package/dist/commonjs/component/shared.d.ts.map +1 -1
- package/dist/commonjs/component/shared.js +2 -2
- package/dist/commonjs/component/shared.js.map +1 -1
- package/dist/commonjs/component/stats.d.ts +20 -21
- package/dist/commonjs/component/stats.d.ts.map +1 -1
- package/dist/commonjs/component/stats.js +86 -38
- package/dist/commonjs/component/stats.js.map +1 -1
- package/dist/commonjs/component/worker.d.ts +2 -2
- package/dist/esm/client/index.d.ts +32 -6
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +28 -2
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/component/complete.d.ts.map +1 -1
- package/dist/esm/component/complete.js +9 -7
- package/dist/esm/component/complete.js.map +1 -1
- package/dist/esm/component/kick.d.ts +3 -2
- package/dist/esm/component/kick.d.ts.map +1 -1
- package/dist/esm/component/kick.js +12 -9
- package/dist/esm/component/kick.js.map +1 -1
- package/dist/esm/component/lib.d.ts +3 -3
- package/dist/esm/component/lib.d.ts.map +1 -1
- package/dist/esm/component/lib.js +25 -19
- package/dist/esm/component/lib.js.map +1 -1
- package/dist/esm/component/logging.d.ts +3 -2
- package/dist/esm/component/logging.d.ts.map +1 -1
- package/dist/esm/component/logging.js +34 -15
- package/dist/esm/component/logging.js.map +1 -1
- package/dist/esm/component/loop.js +10 -10
- package/dist/esm/component/loop.js.map +1 -1
- package/dist/esm/component/recovery.d.ts +29 -0
- package/dist/esm/component/recovery.d.ts.map +1 -1
- package/dist/esm/component/recovery.js +69 -66
- package/dist/esm/component/recovery.js.map +1 -1
- package/dist/esm/component/schema.d.ts +11 -11
- package/dist/esm/component/shared.d.ts +4 -4
- package/dist/esm/component/shared.d.ts.map +1 -1
- package/dist/esm/component/shared.js +2 -2
- package/dist/esm/component/shared.js.map +1 -1
- package/dist/esm/component/stats.d.ts +20 -21
- package/dist/esm/component/stats.d.ts.map +1 -1
- package/dist/esm/component/stats.js +86 -38
- package/dist/esm/component/stats.js.map +1 -1
- package/dist/esm/component/worker.d.ts +2 -2
- package/package.json +6 -7
- package/src/client/index.ts +66 -36
- package/src/component/_generated/api.d.ts +6 -6
- package/src/component/complete.ts +18 -7
- package/src/component/kick.test.ts +17 -7
- package/src/component/kick.ts +14 -11
- package/src/component/lib.ts +33 -26
- package/src/component/logging.test.ts +16 -0
- package/src/component/logging.ts +45 -23
- package/src/component/loop.test.ts +12 -12
- package/src/component/loop.ts +11 -11
- package/src/component/recovery.test.ts +6 -11
- package/src/component/recovery.ts +77 -69
- package/src/component/shared.ts +2 -2
- package/src/component/stats.test.ts +345 -0
- package/src/component/stats.ts +111 -41
package/README.md
CHANGED
|
@@ -117,6 +117,11 @@ export const emailSent = internalMutation({
|
|
|
117
117
|
});
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
Note: the `onComplete` handler runs in a different transaction than the job
|
|
121
|
+
enqueued. If you want to run it in the same transaction, you can do that work
|
|
122
|
+
at the end of the enqueued function, before returning. This is generally faster
|
|
123
|
+
and more typesafe when handling the "success" case.
|
|
124
|
+
|
|
120
125
|
#### Idempotency?
|
|
121
126
|
|
|
122
127
|
Idempotent actions are actions that can be run multiple times safely. This typically
|
|
@@ -263,8 +268,8 @@ The retry options work like this:
|
|
|
263
268
|
- If it fails, it will wait _around_ `initialBackoffMs` and then try again.
|
|
264
269
|
- Each subsequent retry waits `initialBackoffMs * base^<retryNumber - 1>`.
|
|
265
270
|
- The standard base is 2.
|
|
266
|
-
- The actual wait time uses "jitter" to avoid all retries happening at once
|
|
267
|
-
if they all
|
|
271
|
+
- The actual wait time uses "jitter" to avoid all retries happening at once
|
|
272
|
+
if they all fail at the same time.
|
|
268
273
|
|
|
269
274
|
You can override the retry behavior per-call with the `retry` option.
|
|
270
275
|
|
|
@@ -307,6 +312,10 @@ The status will be one of:
|
|
|
307
312
|
- `{ kind: "running"; previousAttempts: number }`: The function is currently running.
|
|
308
313
|
- `{ kind: "finished" }`: The function has succeeded, failed, or been canceled.
|
|
309
314
|
|
|
315
|
+
To get the result of your function, you can either write to the database from
|
|
316
|
+
within your function, call or schedule another function from there, or use the
|
|
317
|
+
`onComplete` handler to respond to the job result.
|
|
318
|
+
|
|
310
319
|
## Canceling work
|
|
311
320
|
|
|
312
321
|
You can cancel work by calling `pool.cancel(id)` or all of them with
|
|
@@ -314,8 +323,82 @@ You can cancel work by calling `pool.cancel(id)` or all of them with
|
|
|
314
323
|
|
|
315
324
|
This will avoid starting or retrying, but will not stop in-progress work.
|
|
316
325
|
|
|
317
|
-
|
|
326
|
+
## Monitoring the workpool
|
|
327
|
+
|
|
328
|
+
If you want to know the status of your workpool, here are some queries to use
|
|
329
|
+
for [Axiom](https://axiom.co/docs/send-data/convex).
|
|
330
|
+
Just replace `your-dataset` with your dataset's name (which is also
|
|
331
|
+
what you enter in the log streaming configuration in the Convex dashboard).
|
|
332
|
+
|
|
333
|
+
Note: these are optimized for monitors. For dashboards, you might want to change
|
|
334
|
+
`bin(_time, X)` to `bin_auto(_time)`.
|
|
335
|
+
|
|
336
|
+
### Is it backlogged
|
|
337
|
+
|
|
338
|
+
Reports the current backlog length, where "backlog" is tasks that are past due,
|
|
339
|
+
not including tasks that have been scheduled for the future. This reports the
|
|
340
|
+
max for 1 minute intervals (which is roughly how often the report is generated).
|
|
341
|
+
|
|
342
|
+
```txt
|
|
343
|
+
['your-dataset']
|
|
344
|
+
| extend parsed_message = iff(isnotnull(parse_json(trim("'", tostring(["data.message"])))),
|
|
345
|
+
parse_json(trim("'", tostring(["data.message"]))),
|
|
346
|
+
parse_json('{}') )
|
|
347
|
+
| where parsed_message["component"] == "workpool" and parsed_message["event"] == "report"
|
|
348
|
+
| summarize max_backlog = max(toint(parsed_message["backlog"]))
|
|
349
|
+
by bin(_time, 1m), workpool = tostring(["data.function.component_path"])
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Are functions failing (after retries)
|
|
318
353
|
|
|
354
|
+
Reports the overall average failure rate per registered workpool in 5 minute intervals.
|
|
355
|
+
|
|
356
|
+
```txt
|
|
357
|
+
['your-dataset']
|
|
358
|
+
| extend parsed_message = iff(isnotnull(parse_json(trim("'", tostring(["data.message"])))),
|
|
359
|
+
parse_json(trim("'", tostring(["data.message"]))),
|
|
360
|
+
parse_json('{}') )
|
|
361
|
+
| where parsed_message["component"] == "workpool" and parsed_message["event"] == "report"
|
|
362
|
+
| extend permanentFailureRate = parsed_message["permanentFailureRate"]
|
|
363
|
+
| summarize avg(todouble(permanentFailureRate))
|
|
364
|
+
by bin(\_time, 5m), workpool = tostring(["data.function.component_path"])
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Are functions retrying a lot
|
|
368
|
+
|
|
369
|
+
Reports the ratio (0 to 1) of failures per function, in 5 minute intervals.
|
|
370
|
+
Note: to get this data, set the workpool `logLevel` to `"INFO"` (or `"DEBUG"`).
|
|
371
|
+
|
|
372
|
+
```txt
|
|
373
|
+
['your-dataset']
|
|
374
|
+
| extend parsed_message = iff( isnotnull(parse_json(trim("'", tostring(["data.message"])))),
|
|
375
|
+
parse_json(trim("'", tostring(["data.message"]))),
|
|
376
|
+
parse_json('{}') )
|
|
377
|
+
| where parsed_message["component"] == "workpool" and (parsed_message["event"] == "completed") and parsed_message["status"] != "canceled"
|
|
378
|
+
| summarize failure_ratio = avg(iff(parsed_message["status"] != "success", 1, 0))
|
|
379
|
+
by bin(_time, 5m), function = tostring(parsed_message["fnName"])
|
|
319
380
|
```
|
|
320
381
|
|
|
382
|
+
### Is there a big delay between being enqueued and starting
|
|
383
|
+
|
|
384
|
+
Reports the average time between enqueueing work and it actually starting.
|
|
385
|
+
Note: to get this data, set the workpool `logLevel` to `"INFO"` (or `"DEBUG"`).
|
|
386
|
+
|
|
387
|
+
```txt
|
|
388
|
+
['your-dataset']
|
|
389
|
+
| extend parsed_message = iff(isnotnull(parse_json(trim("'", tostring(["data.message"])))),
|
|
390
|
+
parse_json(trim("'", tostring(["data.message"]))),
|
|
391
|
+
parse_json('{}') )
|
|
392
|
+
| where parsed_message["component"] == "workpool" and parsed_message["event"] == "started"
|
|
393
|
+
| summarize start_lag_seconds = avg(todouble(parsed_message["startLag"])/1000)
|
|
394
|
+
by bin(_time, 1m), function = tostring(parsed_message["fnName"])
|
|
321
395
|
```
|
|
396
|
+
|
|
397
|
+
While similar to the backlog size, this is a more concrete value, since the
|
|
398
|
+
events in the backlog may take variable amounts of time. This is a more user-
|
|
399
|
+
visible metric, though it is a "lagging" indicator - this will be high when the
|
|
400
|
+
backlog was large enough to delay the processing of an entry. So alerting on
|
|
401
|
+
the backlog size will give you a faster indicator, while this is a metric of the
|
|
402
|
+
severity of the incident.
|
|
403
|
+
|
|
404
|
+
<!-- END: Include on https://convex.dev/components -->
|
|
@@ -4,7 +4,8 @@ import { Mounts } from "../component/_generated/api.js";
|
|
|
4
4
|
import { type LogLevel } from "../component/logging.js";
|
|
5
5
|
import { runResult as resultValidator, type RetryBehavior, RunResult, Status } from "../component/shared.js";
|
|
6
6
|
import { RunMutationCtx, RunQueryCtx, UseApi } from "./utils.js";
|
|
7
|
-
export { resultValidator, type RunResult };
|
|
7
|
+
export { resultValidator, type RunResult, type RetryBehavior };
|
|
8
|
+
export { retryBehavior as vRetryBehavior } from "../component/shared.js";
|
|
8
9
|
export declare const DEFAULT_RETRY_BEHAVIOR: RetryBehavior;
|
|
9
10
|
export type WorkId = string & {
|
|
10
11
|
__isWorkId: true;
|
|
@@ -32,17 +33,20 @@ export declare class Workpool {
|
|
|
32
33
|
maxParallelism?: number;
|
|
33
34
|
/** How much to log. This is updated on each call to `enqueue*`,
|
|
34
35
|
* `status`, or `cancel*`.
|
|
35
|
-
* Default is
|
|
36
|
-
* With INFO, you can see events for started and completed work
|
|
37
|
-
* be parsed by tools like
|
|
36
|
+
* Default is REPORT, which logs warnings, errors, and a periodic report.
|
|
37
|
+
* With INFO, you can also see events for started and completed work.
|
|
38
|
+
* Stats generated can be parsed by tools like
|
|
39
|
+
* [Axiom](https://axiom.co) for monitoring.
|
|
38
40
|
* With DEBUG, you can see timers and internal events for work being
|
|
39
41
|
* scheduled.
|
|
40
42
|
*/
|
|
41
43
|
logLevel?: LogLevel;
|
|
42
|
-
/** Default retry behavior for enqueued actions.
|
|
44
|
+
/** Default retry behavior for enqueued actions.
|
|
45
|
+
* See {@link RetryBehavior}.
|
|
46
|
+
*/
|
|
43
47
|
defaultRetryBehavior?: RetryBehavior;
|
|
44
48
|
/** Whether to retry actions that fail by default. Default: false.
|
|
45
|
-
* NOTE: Only
|
|
49
|
+
* NOTE: Only enable this if your actions are idempotent.
|
|
46
50
|
* See the docs (README.md) for more details.
|
|
47
51
|
*/
|
|
48
52
|
retryActionsByDefault?: boolean;
|
|
@@ -79,8 +83,30 @@ export declare class Workpool {
|
|
|
79
83
|
* and scheduling via `runAt` or `runAfter`.
|
|
80
84
|
*/
|
|
81
85
|
enqueueMutation<Args extends DefaultFunctionArgs, ReturnType>(ctx: RunMutationCtx, fn: FunctionReference<"mutation", FunctionVisibility, Args, ReturnType>, fnArgs: Args, options?: CallbackOptions & SchedulerOptions): Promise<WorkId>;
|
|
86
|
+
/**
|
|
87
|
+
* Cancels a work item. If it's already started, it will be allowed to finish
|
|
88
|
+
* but will not be retried.
|
|
89
|
+
*
|
|
90
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
91
|
+
* @param id - The ID of the work to cancel.
|
|
92
|
+
*/
|
|
82
93
|
cancel(ctx: RunMutationCtx, id: WorkId): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Cancels all pending work items. See {@link cancel}.
|
|
96
|
+
*
|
|
97
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
98
|
+
*/
|
|
83
99
|
cancelAll(ctx: RunMutationCtx): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Gets the status of a work item.
|
|
102
|
+
*
|
|
103
|
+
* @param ctx - The query context that can call ctx.runQuery.
|
|
104
|
+
* @param id - The ID of the work to get the status of.
|
|
105
|
+
* @returns The status of the work item. One of:
|
|
106
|
+
* - `{ state: "pending", previousAttempts: number }`
|
|
107
|
+
* - `{ state: "running", previousAttempts: number }`
|
|
108
|
+
* - `{ state: "finished" }`
|
|
109
|
+
*/
|
|
84
110
|
status(ctx: RunQueryCtx, id: WorkId): Promise<Status>;
|
|
85
111
|
}
|
|
86
112
|
export type SchedulerOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAIL,SAAS,IAAI,eAAe,EAC5B,KAAK,aAAa,EAClB,SAAS,EAET,MAAM,EACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAIL,SAAS,IAAI,eAAe,EAC5B,KAAK,aAAa,EAClB,SAAS,EAET,MAAM,EACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,CAAC;AAC/D,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGzE,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AACF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,CAAC;AACnD,eAAO,MAAM,eAAe,6BAAgC,CAAC;AAE7D,qBAAa,QAAQ;IAajB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IAbjB;;;;;;;;;;OAUG;gBAEO,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,qCAAqC;IAChE,OAAO,EAAE;QACf;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;;;;;WAQG;QACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB;;WAEG;QACH,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC;;;WAGG;QACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC;IAEH;;;;;;;;;OASG;IACG,aAAa,CAAC,IAAI,SAAS,mBAAmB,EAAE,UAAU,EAC9D,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,CAAC,EACrE,MAAM,EAAE,IAAI,EACZ,OAAO,CAAC,EAAE;QACR;;;;WAIG;QACH,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;KACjC,GAAG,eAAe,GACjB,gBAAgB,GACjB,OAAO,CAAC,MAAM,CAAC;IAuBlB;;;;;;;;;;;;OAYG;IACG,eAAe,CAAC,IAAI,SAAS,mBAAmB,EAAE,UAAU,EAChE,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,CAAC,EACvE,MAAM,EAAE,IAAI,EACZ,OAAO,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAC3C,OAAO,CAAC,MAAM,CAAC;IAgBlB;;;;;;OAMG;IACG,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;;;;;;;;OASG;IACG,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5D;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACD;IACE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAC5B,UAAU,EACV,kBAAkB,EAClB,cAAc,CACf,GAAG,IAAI,CAAC;IAET;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { v } from "convex/values";
|
|
|
3
3
|
import { DEFAULT_LOG_LEVEL, logLevel, } from "../component/logging.js";
|
|
4
4
|
import { DEFAULT_MAX_PARALLELISM, runResult as resultValidator, } from "../component/shared.js";
|
|
5
5
|
export { resultValidator };
|
|
6
|
+
export { retryBehavior as vRetryBehavior } from "../component/shared.js";
|
|
6
7
|
// Attempts will run with delay [0, 250, 500, 1000, 2000] (ms)
|
|
7
8
|
export const DEFAULT_RETRY_BEHAVIOR = {
|
|
8
9
|
maxAttempts: 5,
|
|
@@ -86,21 +87,48 @@ export class Workpool {
|
|
|
86
87
|
});
|
|
87
88
|
return id;
|
|
88
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Cancels a work item. If it's already started, it will be allowed to finish
|
|
92
|
+
* but will not be retried.
|
|
93
|
+
*
|
|
94
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
95
|
+
* @param id - The ID of the work to cancel.
|
|
96
|
+
*/
|
|
89
97
|
async cancel(ctx, id) {
|
|
90
98
|
await ctx.runMutation(this.component.lib.cancel, {
|
|
91
99
|
id,
|
|
92
100
|
logLevel: this.options.logLevel ?? getDefaultLogLevel(),
|
|
93
101
|
});
|
|
94
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Cancels all pending work items. See {@link cancel}.
|
|
105
|
+
*
|
|
106
|
+
* @param ctx - The mutation or action context that can call ctx.runMutation.
|
|
107
|
+
*/
|
|
95
108
|
async cancelAll(ctx) {
|
|
96
109
|
await ctx.runMutation(this.component.lib.cancelAll, {
|
|
97
110
|
logLevel: this.options.logLevel ?? getDefaultLogLevel(),
|
|
98
111
|
});
|
|
99
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Gets the status of a work item.
|
|
115
|
+
*
|
|
116
|
+
* @param ctx - The query context that can call ctx.runQuery.
|
|
117
|
+
* @param id - The ID of the work to get the status of.
|
|
118
|
+
* @returns The status of the work item. One of:
|
|
119
|
+
* - `{ state: "pending", previousAttempts: number }`
|
|
120
|
+
* - `{ state: "running", previousAttempts: number }`
|
|
121
|
+
* - `{ state: "finished" }`
|
|
122
|
+
*/
|
|
100
123
|
async status(ctx, id) {
|
|
101
124
|
return ctx.runQuery(this.component.lib.status, { id });
|
|
102
125
|
}
|
|
103
126
|
}
|
|
127
|
+
// ensure OnCompleteArgs satisfies SharedOnCompleteArgs
|
|
128
|
+
const _ = {};
|
|
129
|
+
//
|
|
130
|
+
// Helper functions
|
|
131
|
+
//
|
|
104
132
|
function getRetryBehavior(defaultRetryBehavior, retryActionsByDefault, retryOverride) {
|
|
105
133
|
const defaultRetry = defaultRetryBehavior ?? DEFAULT_RETRY_BEHAVIOR;
|
|
106
134
|
const retryByDefault = retryActionsByDefault ?? false;
|
|
@@ -122,8 +150,6 @@ async function defaultEnqueueArgs(fn, { logLevel, maxParallelism }) {
|
|
|
122
150
|
},
|
|
123
151
|
};
|
|
124
152
|
}
|
|
125
|
-
// ensure OnCompleteArgs satisfies SharedOnCompleteArgs
|
|
126
|
-
const _ = {};
|
|
127
153
|
function getRunAt(options) {
|
|
128
154
|
if (!options) {
|
|
129
155
|
return Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAIpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,CAAC,EAAW,MAAM,eAAe,CAAC;AAE3C,OAAO,EACL,iBAAiB,EAEjB,QAAQ,GACT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,uBAAuB,EAEvB,SAAS,IAAI,eAAe,GAK7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/component/complete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAK,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/component/complete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAK,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMvE,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEzE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAQvB,CAAC;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,KAAK,CAAC,OAAO,YAAY,CAAC,iBAiFjC;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;iBAGnB,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { v } from "convex/values";
|
|
|
2
2
|
import { internalMutation } from "./_generated/server.js";
|
|
3
3
|
import { kickMainLoop } from "./kick.js";
|
|
4
4
|
import { createLogger } from "./logging.js";
|
|
5
|
-
import {
|
|
5
|
+
import { runResult } from "./shared.js";
|
|
6
6
|
import { recordCompleted } from "./stats.js";
|
|
7
7
|
export const completeArgs = v.object({
|
|
8
8
|
jobs: v.array(v.object({
|
|
@@ -14,7 +14,7 @@ export const completeArgs = v.object({
|
|
|
14
14
|
export async function completeHandler(ctx, args) {
|
|
15
15
|
const globals = await ctx.db.query("globals").unique();
|
|
16
16
|
const console = createLogger(globals?.logLevel);
|
|
17
|
-
|
|
17
|
+
const pendingCompletions = [];
|
|
18
18
|
await Promise.all(args.jobs.map(async (job) => {
|
|
19
19
|
const work = await ctx.db.get(job.workId);
|
|
20
20
|
if (!work) {
|
|
@@ -60,17 +60,19 @@ export async function completeHandler(ctx, args) {
|
|
|
60
60
|
await ctx.db.delete(job.workId);
|
|
61
61
|
}
|
|
62
62
|
if (job.runResult.kind !== "canceled") {
|
|
63
|
-
|
|
63
|
+
pendingCompletions.push({
|
|
64
64
|
runResult: job.runResult,
|
|
65
65
|
workId: job.workId,
|
|
66
|
-
segment: nextSegment(),
|
|
67
66
|
retry,
|
|
68
67
|
});
|
|
69
|
-
anyPendingCompletions = true;
|
|
70
68
|
}
|
|
71
69
|
}));
|
|
72
|
-
if (
|
|
73
|
-
await kickMainLoop(ctx, "complete");
|
|
70
|
+
if (pendingCompletions.length > 0) {
|
|
71
|
+
const segment = await kickMainLoop(ctx, "complete");
|
|
72
|
+
await Promise.all(pendingCompletions.map((completion) => ctx.db.insert("pendingCompletion", {
|
|
73
|
+
...completion,
|
|
74
|
+
segment,
|
|
75
|
+
})));
|
|
74
76
|
}
|
|
75
77
|
}
|
|
76
78
|
export const complete = internalMutation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/component/complete.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,CAAC,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/component/complete.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MutationCtx } from "./_generated/server.js";
|
|
2
2
|
import { Config } from "./shared.js";
|
|
3
3
|
/**
|
|
4
|
-
* Called from outside the loop
|
|
4
|
+
* Called from outside the loop.
|
|
5
|
+
* Returns the soonest segment to enqueue work for the main loop.
|
|
5
6
|
*/
|
|
6
|
-
export declare function kickMainLoop(ctx: MutationCtx, source: "enqueue" | "cancel" | "complete", config?: Partial<Config>): Promise<
|
|
7
|
+
export declare function kickMainLoop(ctx: MutationCtx, source: "enqueue" | "cancel" | "complete", config?: Partial<Config>): Promise<bigint>;
|
|
7
8
|
export declare const forceKick: import("convex/server").RegisteredMutation<"internal", {}, Promise<void>>;
|
|
8
9
|
//# sourceMappingURL=kick.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kick.d.ts","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAEL,MAAM,
|
|
1
|
+
{"version":3,"file":"kick.d.ts","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAEL,MAAM,EAKP,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,EACzC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GACvB,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAED,eAAO,MAAM,SAAS,2EAOpB,CAAC"}
|
|
@@ -2,29 +2,30 @@ import { internal } from "./_generated/api.js";
|
|
|
2
2
|
import { internalMutation } from "./_generated/server.js";
|
|
3
3
|
import { createLogger, DEFAULT_LOG_LEVEL } from "./logging.js";
|
|
4
4
|
import { INITIAL_STATE } from "./loop.js";
|
|
5
|
-
import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment,
|
|
5
|
+
import { boundScheduledTime, DEFAULT_MAX_PARALLELISM, fromSegment, getCurrentSegment, getNextSegment, } from "./shared.js";
|
|
6
6
|
/**
|
|
7
|
-
* Called from outside the loop
|
|
7
|
+
* Called from outside the loop.
|
|
8
|
+
* Returns the soonest segment to enqueue work for the main loop.
|
|
8
9
|
*/
|
|
9
10
|
export async function kickMainLoop(ctx, source, config) {
|
|
10
11
|
const globals = await getOrUpdateGlobals(ctx, config);
|
|
11
12
|
const console = createLogger(globals.logLevel);
|
|
12
13
|
const runStatus = await getOrCreateRunStatus(ctx);
|
|
14
|
+
const next = getNextSegment();
|
|
13
15
|
// Only kick to run now if we're scheduled or idle.
|
|
14
16
|
if (runStatus.state.kind === "running") {
|
|
15
17
|
console.debug(`[${source}] main is actively running, so we don't need to kick it`);
|
|
16
|
-
return;
|
|
18
|
+
return next;
|
|
17
19
|
}
|
|
18
|
-
const segment = nextSegment();
|
|
19
20
|
// main is scheduled to run later, so we should cancel it and reschedule.
|
|
20
21
|
if (runStatus.state.kind === "scheduled") {
|
|
21
22
|
if (source === "enqueue" && runStatus.state.saturated) {
|
|
22
23
|
console.debug(`[${source}] main is saturated, so we don't need to kick it`);
|
|
23
|
-
return;
|
|
24
|
+
return next;
|
|
24
25
|
}
|
|
25
|
-
if (runStatus.state.segment <=
|
|
26
|
+
if (runStatus.state.segment <= next) {
|
|
26
27
|
console.debug(`[${source}] main is scheduled to run soon enough, so we don't need to kick it`);
|
|
27
|
-
return;
|
|
28
|
+
return next;
|
|
28
29
|
}
|
|
29
30
|
console.debug(`[${source}] main is scheduled to run later, so reschedule it to run now`);
|
|
30
31
|
const scheduled = await ctx.db.system.get(runStatus.state.scheduledId);
|
|
@@ -39,11 +40,13 @@ export async function kickMainLoop(ctx, source, config) {
|
|
|
39
40
|
console.debug(`[${source}] main was idle, so run it now`);
|
|
40
41
|
}
|
|
41
42
|
await ctx.db.patch(runStatus._id, { state: { kind: "running" } });
|
|
42
|
-
const
|
|
43
|
+
const current = getCurrentSegment();
|
|
44
|
+
const scheduledTime = boundScheduledTime(fromSegment(current), console);
|
|
43
45
|
await ctx.scheduler.runAt(scheduledTime, internal.loop.main, {
|
|
44
46
|
generation: runStatus.state.generation,
|
|
45
|
-
segment,
|
|
47
|
+
segment: current,
|
|
46
48
|
});
|
|
49
|
+
return current;
|
|
47
50
|
}
|
|
48
51
|
export const forceKick = internalMutation({
|
|
49
52
|
args: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kick.js","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAe,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAElB,uBAAuB,EACvB,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"kick.js","sourceRoot":"","sources":["../../../src/component/kick.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,16 +15,16 @@ export declare const enqueue: import("convex/server").RegisteredMutation<"public
|
|
|
15
15
|
runAt: number;
|
|
16
16
|
config: {
|
|
17
17
|
maxParallelism: number;
|
|
18
|
-
logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
18
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
19
19
|
};
|
|
20
20
|
}, Promise<import("convex/values").GenericId<"work">>>;
|
|
21
21
|
export declare const cancel: import("convex/server").RegisteredMutation<"public", {
|
|
22
22
|
id: import("convex/values").GenericId<"work">;
|
|
23
|
-
logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
23
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
24
24
|
}, Promise<void>>;
|
|
25
25
|
export declare const cancelAll: import("convex/server").RegisteredMutation<"public", {
|
|
26
26
|
before?: number | undefined;
|
|
27
|
-
logLevel: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
27
|
+
logLevel: "DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR";
|
|
28
28
|
}, Promise<void>>;
|
|
29
29
|
export declare const status: import("convex/server").RegisteredQuery<"public", {
|
|
30
30
|
id: import("convex/values").GenericId<"work">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;sDAkClB,CAAC;AAEH,eAAO,MAAM,MAAM;;;iBAejB,CAAC;AAGH,eAAO,MAAM,SAAS;;;iBAmCpB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;GAyBjB,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
|
+
import { api } from "./_generated/api.js";
|
|
2
3
|
import { mutation, query } from "./_generated/server.js";
|
|
3
|
-
import { nextSegment, onComplete, retryBehavior, config, status as statusValidator, toSegment, boundScheduledTime, max, } from "./shared.js";
|
|
4
|
-
import { logLevel } from "./logging.js";
|
|
5
4
|
import { kickMainLoop } from "./kick.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { createLogger, logLevel } from "./logging.js";
|
|
6
|
+
import { boundScheduledTime, config, getNextSegment, max, onComplete, retryBehavior, status as statusValidator, toSegment, } from "./shared.js";
|
|
8
7
|
import { recordEnqueued } from "./stats.js";
|
|
9
8
|
const MAX_POSSIBLE_PARALLELISM = 100;
|
|
10
9
|
export const enqueue = mutation({
|
|
@@ -33,11 +32,11 @@ export const enqueue = mutation({
|
|
|
33
32
|
...workArgs,
|
|
34
33
|
attempts: 0,
|
|
35
34
|
});
|
|
35
|
+
const limit = await kickMainLoop(ctx, "enqueue", config);
|
|
36
36
|
await ctx.db.insert("pendingStart", {
|
|
37
37
|
workId,
|
|
38
|
-
segment: max(toSegment(runAt),
|
|
38
|
+
segment: max(toSegment(runAt), limit),
|
|
39
39
|
});
|
|
40
|
-
await kickMainLoop(ctx, "enqueue", config);
|
|
41
40
|
recordEnqueued(console, { workId, fnName: workArgs.fnName, runAt });
|
|
42
41
|
return workId;
|
|
43
42
|
},
|
|
@@ -48,11 +47,14 @@ export const cancel = mutation({
|
|
|
48
47
|
logLevel,
|
|
49
48
|
},
|
|
50
49
|
handler: async (ctx, { id, logLevel }) => {
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
53
|
-
await kickMainLoop(ctx, "cancel", { logLevel });
|
|
50
|
+
const shouldCancel = await shouldCancelWorkItem(ctx, id, logLevel);
|
|
51
|
+
if (shouldCancel) {
|
|
52
|
+
const segment = await kickMainLoop(ctx, "cancel", { logLevel });
|
|
53
|
+
await ctx.db.insert("pendingCancelation", {
|
|
54
|
+
workId: id,
|
|
55
|
+
segment,
|
|
56
|
+
});
|
|
54
57
|
}
|
|
55
|
-
// TODO: stats event
|
|
56
58
|
},
|
|
57
59
|
});
|
|
58
60
|
const PAGE_SIZE = 64;
|
|
@@ -60,16 +62,24 @@ export const cancelAll = mutation({
|
|
|
60
62
|
args: { logLevel, before: v.optional(v.number()) },
|
|
61
63
|
handler: async (ctx, { logLevel, before }) => {
|
|
62
64
|
const beforeTime = before ?? Date.now();
|
|
63
|
-
const segment = nextSegment();
|
|
64
65
|
const pageOfWork = await ctx.db
|
|
65
66
|
.query("work")
|
|
66
67
|
.withIndex("by_creation_time", (q) => q.lte("_creationTime", beforeTime))
|
|
67
68
|
.order("desc")
|
|
68
69
|
.take(PAGE_SIZE);
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
const shouldCancel = await Promise.all(pageOfWork.map(async ({ _id }) => shouldCancelWorkItem(ctx, _id, logLevel)));
|
|
71
|
+
let segment = getNextSegment();
|
|
72
|
+
if (shouldCancel.some((c) => c)) {
|
|
73
|
+
segment = await kickMainLoop(ctx, "cancel", { logLevel });
|
|
72
74
|
}
|
|
75
|
+
await Promise.all(pageOfWork.map(({ _id }, index) => {
|
|
76
|
+
if (shouldCancel[index]) {
|
|
77
|
+
return ctx.db.insert("pendingCancelation", {
|
|
78
|
+
workId: _id,
|
|
79
|
+
segment,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}));
|
|
73
83
|
if (pageOfWork.length === PAGE_SIZE) {
|
|
74
84
|
await ctx.scheduler.runAfter(0, api.lib.cancelAll, {
|
|
75
85
|
logLevel,
|
|
@@ -104,7 +114,7 @@ export const status = query({
|
|
|
104
114
|
return { state: "running", previousAttempts: work.attempts };
|
|
105
115
|
},
|
|
106
116
|
});
|
|
107
|
-
async function
|
|
117
|
+
async function shouldCancelWorkItem(ctx, workId, logLevel) {
|
|
108
118
|
const console = createLogger(logLevel);
|
|
109
119
|
// No-op if the work doesn't exist or has completed.
|
|
110
120
|
const work = await ctx.db.get(workId);
|
|
@@ -120,10 +130,6 @@ async function cancelWorkItem(ctx, workId, segment, logLevel) {
|
|
|
120
130
|
console.warn(`[cancel] work ${workId} has already been canceled`);
|
|
121
131
|
return false;
|
|
122
132
|
}
|
|
123
|
-
await ctx.db.insert("pendingCancelation", {
|
|
124
|
-
workId,
|
|
125
|
-
segment,
|
|
126
|
-
});
|
|
127
133
|
return true;
|
|
128
134
|
}
|
|
129
135
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/component/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Infer } from "convex/values";
|
|
2
2
|
export declare const DEFAULT_LOG_LEVEL: LogLevel;
|
|
3
|
+
export declare const logLevel: import("convex/values").VUnion<"DEBUG" | "INFO" | "REPORT" | "WARN" | "ERROR", [import("convex/values").VLiteral<"DEBUG", "required">, import("convex/values").VLiteral<"INFO", "required">, import("convex/values").VLiteral<"REPORT", "required">, import("convex/values").VLiteral<"WARN", "required">, import("convex/values").VLiteral<"ERROR", "required">], "required", never>;
|
|
4
|
+
export type LogLevel = Infer<typeof logLevel>;
|
|
3
5
|
export type Logger = {
|
|
4
6
|
debug: (...args: unknown[]) => void;
|
|
5
7
|
info: (...args: unknown[]) => void;
|
|
@@ -9,7 +11,6 @@ export type Logger = {
|
|
|
9
11
|
timeEnd: (label: string) => void;
|
|
10
12
|
event: (event: string, payload: Record<string, unknown>) => void;
|
|
11
13
|
};
|
|
14
|
+
export declare function shouldLog(config: LogLevel, level: LogLevel): boolean;
|
|
12
15
|
export declare function createLogger(level?: LogLevel): Logger;
|
|
13
|
-
export declare const logLevel: import("convex/values").VUnion<"DEBUG" | "INFO" | "WARN" | "ERROR", [import("convex/values").VLiteral<"DEBUG", "required">, import("convex/values").VLiteral<"INFO", "required">, import("convex/values").VLiteral<"WARN", "required">, import("convex/values").VLiteral<"ERROR", "required">], "required", never>;
|
|
14
|
-
export type LogLevel = Infer<typeof logLevel>;
|
|
15
16
|
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/component/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/component/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,QAAmB,CAAC;AAIpD,eAAO,MAAM,QAAQ,uXAMpB,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAE9C,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAClE,CAAC;AAUF,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,WAE1D;AAOD,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAiDrD"}
|