nmtjs 0.15.0-beta.19 → 0.15.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/jobs/job.d.ts +41 -27
- package/dist/runtime/jobs/job.js +3 -0
- package/dist/runtime/jobs/job.js.map +1 -1
- package/dist/runtime/jobs/manager.d.ts +23 -8
- package/dist/runtime/jobs/manager.js +48 -21
- package/dist/runtime/jobs/manager.js.map +1 -1
- package/dist/runtime/jobs/router.d.ts +251 -0
- package/dist/runtime/jobs/router.js +396 -0
- package/dist/runtime/jobs/router.js.map +1 -0
- package/dist/runtime/jobs/runner.d.ts +10 -5
- package/dist/runtime/jobs/runner.js +80 -57
- package/dist/runtime/jobs/runner.js.map +1 -1
- package/dist/runtime/jobs/ui.js +3 -5
- package/dist/runtime/jobs/ui.js.map +1 -1
- package/dist/runtime/server/jobs.js +1 -0
- package/dist/runtime/server/jobs.js.map +1 -1
- package/dist/runtime/workers/job.d.ts +1 -1
- package/dist/runtime/workers/job.js +8 -5
- package/dist/runtime/workers/job.js.map +1 -1
- package/package.json +12 -12
- package/src/index.ts +3 -0
- package/src/runtime/index.ts +1 -0
- package/src/runtime/jobs/job.ts +76 -20
- package/src/runtime/jobs/manager.ts +71 -28
- package/src/runtime/jobs/router.ts +835 -0
- package/src/runtime/jobs/runner.ts +119 -80
- package/src/runtime/jobs/ui.ts +3 -5
- package/src/runtime/server/jobs.ts +1 -0
- package/src/runtime/workers/job.ts +11 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createConsolePrettyDestination, createFactoryInjectable, createLazyInjectable, createValueInjectable } from '@nmtjs/core';
|
|
2
2
|
import { createTransport } from '@nmtjs/gateway';
|
|
3
|
-
import { createContractProcedure, createContractRouter, createFilter, createGuard, createHook, createJob, createMiddleware, createPlugin, createProcedure, createRootRouter, createRouter, createStep, defineApplication, defineServer } from './runtime/index.ts';
|
|
3
|
+
import { createContractProcedure, createContractRouter, createFilter, createGuard, createHook, createJob, createJobsRouter, createMiddleware, createPlugin, createProcedure, createRootRouter, createRouter, createStep, defineApplication, defineServer, jobOperation } from './runtime/index.ts';
|
|
4
4
|
export declare const neemata: {
|
|
5
5
|
app: typeof defineApplication;
|
|
6
6
|
server: typeof defineServer;
|
|
@@ -55,6 +55,9 @@ export declare const neemata: {
|
|
|
55
55
|
job: typeof createJob;
|
|
56
56
|
step: typeof createStep;
|
|
57
57
|
hook: typeof createHook;
|
|
58
|
+
jobRouter: typeof createJobsRouter & {
|
|
59
|
+
operation: typeof jobOperation;
|
|
60
|
+
};
|
|
58
61
|
};
|
|
59
62
|
export { c } from '@nmtjs/contract';
|
|
60
63
|
export { Scope } from '@nmtjs/core';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CoreInjectables, createConsolePrettyDestination, createFactoryInjectable, createLazyInjectable, createValueInjectable, } from '@nmtjs/core';
|
|
2
2
|
import { createTransport, GatewayInjectables } from '@nmtjs/gateway';
|
|
3
|
-
import { createContractProcedure, createContractRouter, createFilter, createGuard, createHook, createJob, createMiddleware, createPlugin, createProcedure, createRootRouter, createRouter, createStep, defineApplication, defineServer, RuntimeInjectables, } from "./runtime/index.js";
|
|
3
|
+
import { createContractProcedure, createContractRouter, createFilter, createGuard, createHook, createJob, createJobsRouter, createMiddleware, createPlugin, createProcedure, createRootRouter, createRouter, createStep, defineApplication, defineServer, jobOperation, RuntimeInjectables, } from "./runtime/index.js";
|
|
4
4
|
export const neemata = {
|
|
5
5
|
app: defineApplication,
|
|
6
6
|
server: defineServer,
|
|
@@ -30,6 +30,7 @@ export const neemata = {
|
|
|
30
30
|
job: createJob,
|
|
31
31
|
step: createStep,
|
|
32
32
|
hook: createHook,
|
|
33
|
+
jobRouter: Object.assign(createJobsRouter, { operation: jobOperation }),
|
|
33
34
|
};
|
|
34
35
|
export { c } from '@nmtjs/contract';
|
|
35
36
|
export { Scope } from '@nmtjs/core';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,iBAAiB;IACtB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE;QACX,GAAG,eAAe;QAClB,GAAG,kBAAkB;QACrB,GAAI,kBAAgD;KACrD;IACD,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE;QACP,OAAO;QACL,qBAAqB;QACrB,8BAAuE;KAC1E;IACD,KAAK,EAAE,qBAAqB;IAC5B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,uBAAuB;IAChC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,cAAc,EAAE,oBAAoB;IACpC,SAAS,EAAE,eAAe;IAC1B,iBAAiB,EAAE,uBAAuB;IAC1C,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,8BAA8B,EAC9B,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,iBAAiB;IACtB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE;QACX,GAAG,eAAe;QAClB,GAAG,kBAAkB;QACrB,GAAI,kBAAgD;KACrD;IACD,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE;QACP,OAAO;QACL,qBAAqB;QACrB,8BAAuE;KAC1E;IACD,KAAK,EAAE,qBAAqB;IAC5B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,uBAAuB;IAChC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,cAAc,EAAE,oBAAoB;IACpC,SAAS,EAAE,eAAe;IAC1B,iBAAiB,EAAE,uBAAuB;IAC1C,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;CACxE,CAAA;AAED,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAEL,WAAW,EACX,sBAAsB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,SAAS,EACT,UAAU,GACX,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,CAAA;AACvB,eAAe,OAAO,CAAA"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './enums.ts';
|
|
|
7
7
|
export * from './injectables.ts';
|
|
8
8
|
export * from './jobs/job.ts';
|
|
9
9
|
export * from './jobs/manager.ts';
|
|
10
|
+
export * from './jobs/router.ts';
|
|
10
11
|
export * from './jobs/step.ts';
|
|
11
12
|
export * from './pubsub/manager.ts';
|
|
12
13
|
export * from './pubsub/redis.ts';
|
package/dist/runtime/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export * from "./enums.js";
|
|
|
7
7
|
export * from "./injectables.js";
|
|
8
8
|
export * from "./jobs/job.js";
|
|
9
9
|
export * from "./jobs/manager.js";
|
|
10
|
+
export * from "./jobs/router.js";
|
|
10
11
|
export * from "./jobs/step.js";
|
|
11
12
|
export * from "./pubsub/manager.js";
|
|
12
13
|
export * from "./pubsub/redis.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA"}
|
|
@@ -7,13 +7,14 @@ import type { AnyJobStep, JobStep } from './step.ts';
|
|
|
7
7
|
import { kJobKey } from '../constants.ts';
|
|
8
8
|
type DefaultObjectType = ObjectType<{}>;
|
|
9
9
|
type DefaultResultType = Record<string, any>;
|
|
10
|
-
export type AnyJobOptions = JobOptions<string, any, any, any, any>;
|
|
10
|
+
export type AnyJobOptions = JobOptions<string, any, any, any, any, any>;
|
|
11
11
|
export interface AnyJob {
|
|
12
12
|
_: {
|
|
13
13
|
data: any;
|
|
14
14
|
result: any;
|
|
15
15
|
input: any;
|
|
16
16
|
output: any;
|
|
17
|
+
progress: any;
|
|
17
18
|
};
|
|
18
19
|
[kJobKey]: true;
|
|
19
20
|
options: AnyJobOptions;
|
|
@@ -23,96 +24,109 @@ export interface AnyJob {
|
|
|
23
24
|
dependencies: Dependencies;
|
|
24
25
|
input: AnyObjectLikeType;
|
|
25
26
|
output: AnyObjectLikeType;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
progress: AnyObjectLikeType;
|
|
28
|
+
afterEachHandler?: JobAfterEachHandler<any, any, any, any, any>;
|
|
29
|
+
beforeEachHandler?: JobBeforeEachHandler<any, any, any, any, any>;
|
|
30
|
+
onErrorHandler?: JobOnErrorHandler<any, any, any, any, any>;
|
|
31
|
+
returnHandler?: JobReturnHandler<any, any, any, any, any, any>;
|
|
30
32
|
}
|
|
31
33
|
export type JobBackoffOptions = {
|
|
32
34
|
type: 'fixed' | 'exponential';
|
|
33
35
|
delay: number;
|
|
34
36
|
jitter?: number;
|
|
35
37
|
};
|
|
36
|
-
export type JobCondition<Deps extends Dependencies = {}, Result extends DefaultResultType = {}, Data = any, Input extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
38
|
+
export type JobCondition<Deps extends Dependencies = {}, Result extends DefaultResultType = {}, Data = any, Input extends AnyObjectLikeType = AnyObjectLikeType, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
37
39
|
context: DependencyContext<Deps>;
|
|
38
40
|
data: Data;
|
|
39
41
|
input: t.infer.decode.output<Input>;
|
|
40
42
|
result: Result;
|
|
43
|
+
progress: t.infer.decode.output<Progress>;
|
|
41
44
|
}) => MaybePromise<boolean>;
|
|
42
|
-
export type JobReturnHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Output extends AnyObjectLikeType, Data> = (params: {
|
|
45
|
+
export type JobReturnHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Output extends AnyObjectLikeType, Data, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
43
46
|
context: DependencyContext<Deps>;
|
|
44
47
|
data: Data;
|
|
45
48
|
input: t.infer.decode.output<Input>;
|
|
46
49
|
result: Result;
|
|
50
|
+
progress: t.infer.decode.output<Progress>;
|
|
47
51
|
}) => MaybePromise<t.infer.encode.input<Output>>;
|
|
48
|
-
export type JobDataHandler<Deps extends Dependencies, Input extends AnyObjectLikeType, Data> = (ctx: DependencyContext<Deps>, input: t.infer.decode.output<Input>) => MaybePromise<Data>;
|
|
49
|
-
export type JobAfterEachHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data> = (params: {
|
|
52
|
+
export type JobDataHandler<Deps extends Dependencies, Input extends AnyObjectLikeType, Data, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (ctx: DependencyContext<Deps>, input: t.infer.decode.output<Input>, progress: t.infer.decode.output<Progress>) => MaybePromise<Data>;
|
|
53
|
+
export type JobAfterEachHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
50
54
|
context: DependencyContext<Deps>;
|
|
51
55
|
data: Data;
|
|
52
56
|
input: t.infer.decode.output<Input>;
|
|
53
57
|
result: Result;
|
|
58
|
+
progress: t.infer.decode.output<Progress>;
|
|
54
59
|
step: AnyJobStep;
|
|
55
60
|
stepIndex: number;
|
|
56
61
|
}) => MaybePromise<void>;
|
|
57
|
-
export type JobBeforeEachHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data> = (params: {
|
|
62
|
+
export type JobBeforeEachHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
58
63
|
context: DependencyContext<Deps>;
|
|
59
64
|
data: Data;
|
|
60
65
|
input: t.infer.decode.output<Input>;
|
|
61
66
|
result: Result;
|
|
67
|
+
progress: t.infer.decode.output<Progress>;
|
|
62
68
|
step: AnyJobStep;
|
|
63
69
|
stepIndex: number;
|
|
64
70
|
}) => MaybePromise<void>;
|
|
65
|
-
export type JobOnErrorHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data> = (params: {
|
|
71
|
+
export type JobOnErrorHandler<Deps extends Dependencies, Result extends DefaultResultType, Input extends AnyObjectLikeType, Data, Progress extends AnyObjectLikeType = AnyObjectLikeType> = (params: {
|
|
66
72
|
context: DependencyContext<Deps>;
|
|
67
73
|
data: Data;
|
|
68
74
|
input: t.infer.decode.output<Input>;
|
|
69
75
|
result: Result;
|
|
76
|
+
progress: t.infer.decode.output<Progress>;
|
|
70
77
|
step: AnyJobStep;
|
|
71
78
|
stepIndex: number;
|
|
72
79
|
error: unknown;
|
|
73
80
|
}) => MaybePromise<boolean | void>;
|
|
74
|
-
export interface JobOptions<Name extends string = string, Input extends AnyObjectLikeType = AnyObjectLikeType, Output extends AnyObjectLikeType = AnyObjectLikeType, Deps extends Dependencies = {}, Data = any> {
|
|
81
|
+
export interface JobOptions<Name extends string = string, Input extends AnyObjectLikeType = AnyObjectLikeType, Output extends AnyObjectLikeType = AnyObjectLikeType, Progress extends AnyObjectLikeType = DefaultObjectType, Deps extends Dependencies = {}, Data = any> {
|
|
75
82
|
name: Name;
|
|
76
83
|
pool: JobWorkerPool;
|
|
77
84
|
input: Input;
|
|
78
85
|
output: Output;
|
|
86
|
+
progress?: Progress;
|
|
79
87
|
concurrency?: number;
|
|
80
88
|
timeout?: number;
|
|
81
89
|
dependencies?: Deps;
|
|
82
|
-
data?: JobDataHandler<Deps, Input, Data>;
|
|
90
|
+
data?: JobDataHandler<Deps, Input, Data, Progress>;
|
|
83
91
|
attempts?: number;
|
|
84
92
|
backoff?: JobBackoffOptions;
|
|
85
93
|
oneoff?: boolean;
|
|
86
94
|
}
|
|
87
|
-
export declare class Job<in out Name extends string = string, in out Deps extends Dependencies = {}, in out Data = any, in out Input extends AnyObjectLikeType = DefaultObjectType, in out Output extends AnyObjectLikeType = DefaultObjectType, out Steps extends [...AnyJobStep[]] = [], in out Result extends DefaultResultType = {}, out Return extends boolean = false> implements AnyJob {
|
|
88
|
-
options: JobOptions<Name, Input, Output, Deps, Data>;
|
|
95
|
+
export declare class Job<in out Name extends string = string, in out Deps extends Dependencies = {}, in out Data = any, in out Input extends AnyObjectLikeType = DefaultObjectType, in out Output extends AnyObjectLikeType = DefaultObjectType, in out Progress extends AnyObjectLikeType = DefaultObjectType, out Steps extends [...AnyJobStep[]] = [], in out Result extends DefaultResultType = {}, out Return extends boolean = false> implements AnyJob {
|
|
96
|
+
options: JobOptions<Name, Input, Output, Progress, Deps, Data>;
|
|
89
97
|
stack?: string | undefined;
|
|
90
98
|
_: {
|
|
91
99
|
data: Data;
|
|
92
100
|
result: Result & t.infer.decode.output<Input>;
|
|
93
101
|
input: t.infer.decode.output<Input>;
|
|
94
102
|
output: t.infer.decode.output<Output>;
|
|
103
|
+
progress: t.infer.decode.output<Progress>;
|
|
95
104
|
};
|
|
96
105
|
[kJobKey]: true;
|
|
97
106
|
steps: Steps;
|
|
98
|
-
conditions: Map<number, JobCondition<any, any, any, any>>;
|
|
99
|
-
returnHandler?: JobReturnHandler<Deps, this['_']['result'], Input, Output, Data>;
|
|
100
|
-
afterEachHandler?: JobAfterEachHandler<Deps, this['_']['result'], Input, Data>;
|
|
101
|
-
beforeEachHandler?: JobBeforeEachHandler<Deps, this['_']['result'], Input, Data>;
|
|
102
|
-
onErrorHandler?: JobOnErrorHandler<Deps, this['_']['result'], Input, Data>;
|
|
103
|
-
constructor(options: JobOptions<Name, Input, Output, Deps, Data>, stack?: string | undefined);
|
|
107
|
+
conditions: Map<number, JobCondition<any, any, any, any, any>>;
|
|
108
|
+
returnHandler?: JobReturnHandler<Deps, this['_']['result'], Input, Output, Data, Progress>;
|
|
109
|
+
afterEachHandler?: JobAfterEachHandler<Deps, this['_']['result'], Input, Data, Progress>;
|
|
110
|
+
beforeEachHandler?: JobBeforeEachHandler<Deps, this['_']['result'], Input, Data, Progress>;
|
|
111
|
+
onErrorHandler?: JobOnErrorHandler<Deps, this['_']['result'], Input, Data, Progress>;
|
|
112
|
+
constructor(options: JobOptions<Name, Input, Output, Progress, Deps, Data>, stack?: string | undefined);
|
|
104
113
|
get name(): Name;
|
|
105
114
|
get dependencies(): Deps;
|
|
106
115
|
get input(): Input;
|
|
107
116
|
get output(): Output;
|
|
117
|
+
get progress(): Progress;
|
|
108
118
|
step<StepInput extends AnyObjectLikeType, StepOutput extends AnyObjectLikeType, StepDeps extends Dependencies, StepResult, Condition extends JobCondition<Deps, Result, this['_']['data'], Input> | undefined>(...[step, condition]: Return extends false ? [
|
|
109
119
|
step: JobStep<StepInput, StepOutput, StepDeps, this['_']['result'] extends t.infer.decode.output<StepInput> ? t.infer.decode.output<StepOutput> : TSError<'Accumulated job result does not satisfy current step input:', this['_']['result']>, this['_']['data']>,
|
|
110
120
|
condition?: Condition
|
|
111
|
-
] : [TSError<'Job has already has return statement'>]): Job<Name, Deps, Data, Input, Output, [...Steps, JobStep<StepInput, StepOutput, StepDeps, StepResult, any>], Result & (undefined extends Condition ? t.infer.decode.output<StepOutput extends undefined ? DefaultObjectType : StepOutput> : Partial<t.infer.decode.output<StepOutput extends undefined ? DefaultObjectType : StepOutput>>)>;
|
|
112
|
-
return(...[handler]: Return extends false ? Result extends t.infer.encode.input<Output> ? [
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
121
|
+
] : [TSError<'Job has already has return statement'>]): Job<Name, Deps, Data, Input, Output, Progress, [...Steps, JobStep<StepInput, StepOutput, StepDeps, StepResult, any>], Result & (undefined extends Condition ? t.infer.decode.output<StepOutput extends undefined ? DefaultObjectType : StepOutput> : Partial<t.infer.decode.output<StepOutput extends undefined ? DefaultObjectType : StepOutput>>)>;
|
|
122
|
+
return(...[handler]: Return extends false ? Result extends t.infer.encode.input<Output> ? [
|
|
123
|
+
JobReturnHandler<Deps, this['_']['result'], Input, Output, Data, Progress>?
|
|
124
|
+
] : [
|
|
125
|
+
JobReturnHandler<Deps, this['_']['result'], Input, Output, Data, Progress>
|
|
126
|
+
] : [TSError<'Job already has a return statement'>]): Job<Name, Deps, Data, Input, Output, Progress, Steps, Result, true>;
|
|
127
|
+
afterEach(handler: Return extends true ? JobAfterEachHandler<Deps, this['_']['result'], Input, Data, Progress> : TSError<'Job must have a return statement to use afterEach'>): this;
|
|
128
|
+
beforeEach(handler: Return extends true ? JobBeforeEachHandler<Deps, this['_']['result'], Input, Data, Progress> : TSError<'Job must have a return statement to use beforeEach'>): this;
|
|
129
|
+
onError(handler: Return extends true ? JobOnErrorHandler<Deps, this['_']['result'], Input, Data, Progress> : TSError<'Job must have a return statement to use onError'>): this;
|
|
116
130
|
}
|
|
117
|
-
export declare function createJob<Name extends string, Input extends AnyObjectLikeType, Output extends AnyObjectLikeType, Deps extends Dependencies = {}, Data = any>(options: JobOptions<Name, Input, Output, Deps, Data>): Job<Name, Deps, Data, Input, Output, [], {}, false>;
|
|
131
|
+
export declare function createJob<Name extends string, Input extends AnyObjectLikeType, Output extends AnyObjectLikeType, Deps extends Dependencies = {}, Data = any, Progress extends AnyObjectLikeType = DefaultObjectType>(options: JobOptions<Name, Input, Output, Progress, Deps, Data>): Job<Name, Deps, Data, Input, Output, Progress, [], {}, false>;
|
|
118
132
|
export {};
|
package/dist/runtime/jobs/job.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/runtime/jobs/job.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAIpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/runtime/jobs/job.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAIpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAkJrC,MAAM,OAAO,GAAG;IAqDL;IACA;IA1CT,CAAC,CAMC;IACF,CAAC,OAAO,CAAC,GAAG,IAAa,CAAA;IACzB,KAAK,GAAU,EAAsB,CAAA;IACrC,UAAU,GAAuD,IAAI,GAAG,EAAE,CAAA;IAC1E,aAAa,CAOZ;IACD,gBAAgB,CAMf;IACD,iBAAiB,CAMhB;IACD,cAAc,CAMb;IAED,YACS,OAA8D,EAC9D,KAAc;QADd,YAAO,GAAP,OAAO,CAAuD;QAC9D,UAAK,GAAL,KAAK,CAAS;IACpB,CAAC;IAEJ,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,IAAK,EAAW,CAAA;IAClD,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,KAAc,CAAA;IACpC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAgB,CAAA;IACtC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAoB,CAAA;IAC1C,CAAC;IAED,IAAI,CASF,GAAG,CAAC,IAAI,EAAE,SAAS,CAgBkC;QAErD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAEhE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,CAAC,CAAA;QAEzD,OAAO,IAkBN,CAAA;IACH,CAAC;IAED,MAAM,CACJ,GAAG,CAAC,OAAO,CAsBwC;QAEnD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAa,CAAA;QAChD,CAAC;QACD,OAAO,IAUN,CAAA;IACH,CAAC;IAED,SAAS,CACP,OAEgE;QAEhE,IAAI,CAAC,gBAAgB,GAAG,OAAc,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,UAAU,CACR,OAEiE;QAEjE,IAAI,CAAC,iBAAiB,GAAG,OAAc,CAAA;QACvC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,OAE8D;QAE9D,IAAI,CAAC,cAAc,GAAG,OAAc,CAAA;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAOvB,OAA8D;IAC9D,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAA;IACpC,OAAO,IAAI,GAAG,CACZ,EAAE,YAAY,EAAE,EAAU,EAAE,GAAG,OAAO,EAAE,EACxC,KAAK,CACN,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Job, JobType, QueueEventsListener } from 'bullmq';
|
|
1
|
+
import type { Job, JobState, JobType, QueueEventsListener } from 'bullmq';
|
|
2
2
|
import { Queue, QueueEvents, QueueEventsProducer } from 'bullmq';
|
|
3
3
|
import type { ServerStoreConfig } from '../server/config.ts';
|
|
4
4
|
import type { Store } from '../types.ts';
|
|
@@ -28,21 +28,29 @@ export declare class QueueJobResult<T extends AnyJob = AnyJob> {
|
|
|
28
28
|
get name(): string;
|
|
29
29
|
waitResult(): Promise<T["_"]["output"]>;
|
|
30
30
|
}
|
|
31
|
-
export type
|
|
31
|
+
export type JobItem<T extends AnyJob = AnyJob> = Pick<Job<T['_']['input'], T['_']['output'], T['options']['name']>, 'queueName' | 'priority' | 'progress' | 'name' | 'data' | 'returnvalue' | 'attemptsMade' | 'processedOn' | 'finishedOn' | 'failedReason' | 'stacktrace'> & {
|
|
32
|
+
id: string;
|
|
33
|
+
status: JobState | 'unknown';
|
|
34
|
+
};
|
|
32
35
|
export interface JobManagerInstance {
|
|
33
36
|
list<T extends AnyJob>(job: T, options?: {
|
|
34
37
|
page?: number;
|
|
35
38
|
limit?: number;
|
|
36
|
-
state?:
|
|
39
|
+
state?: JobState[];
|
|
37
40
|
}): Promise<{
|
|
38
|
-
items:
|
|
41
|
+
items: JobItem<T>[];
|
|
39
42
|
page: number;
|
|
40
43
|
limit: number;
|
|
41
44
|
pages: number;
|
|
42
45
|
total: number;
|
|
43
46
|
}>;
|
|
44
|
-
get<T extends AnyJob>(job: T, id: string): Promise<
|
|
47
|
+
get<T extends AnyJob>(job: T, id: string): Promise<JobItem<T> | null>;
|
|
45
48
|
add<T extends AnyJob>(job: T, data: T['_']['input'], options?: QueueJobAddOptions): Promise<QueueJobResult<T>>;
|
|
49
|
+
retry(job: AnyJob, id: string, options?: {
|
|
50
|
+
clearState?: boolean;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
remove(job: AnyJob, id: string): Promise<void>;
|
|
53
|
+
cancel(job: AnyJob, id: string): Promise<void>;
|
|
46
54
|
}
|
|
47
55
|
export type CustomJobsEvents = QueueEventsListener & {
|
|
48
56
|
[K in `cancel:${string}`]: (args: {}, id: string) => void;
|
|
@@ -70,19 +78,26 @@ export declare class JobManager {
|
|
|
70
78
|
limit?: number;
|
|
71
79
|
state?: JobType[];
|
|
72
80
|
}): Promise<never[] | {
|
|
73
|
-
items: Pick<Job<any, any, string>, "name" | "data" | "
|
|
81
|
+
items: (Pick<Job<any, any, string>, "name" | "data" | "progress" | "queueName" | "priority" | "returnvalue" | "attemptsMade" | "processedOn" | "finishedOn" | "failedReason" | "stacktrace"> & {
|
|
82
|
+
id: string;
|
|
83
|
+
status: JobState | "unknown";
|
|
84
|
+
})[];
|
|
74
85
|
page: number;
|
|
75
86
|
limit: number;
|
|
76
87
|
pages: number;
|
|
77
88
|
total: number;
|
|
78
89
|
}>;
|
|
79
|
-
get<T extends AnyJob>(job: T, id: string): Promise<
|
|
90
|
+
get<T extends AnyJob>(job: T, id: string): Promise<JobItem<AnyJob> | null>;
|
|
80
91
|
add<T extends AnyJob>(job: T, data: T['_']['input'], { forceMissingWorkers, jobId, priority, attempts, backoff, oneoff, delay, }?: QueueJobAddOptions): Promise<QueueJobResult<T>>;
|
|
92
|
+
retry(job: AnyJob, id: string, options?: {
|
|
93
|
+
clearState?: boolean;
|
|
94
|
+
}): Promise<void>;
|
|
95
|
+
remove(job: AnyJob, id: string): Promise<void>;
|
|
81
96
|
cancel(job: AnyJob, id: string): Promise<void>;
|
|
82
97
|
cancellationSignal(job: AnyJob, id: string): AbortSignal & {
|
|
83
98
|
[Symbol.dispose]: () => void;
|
|
84
99
|
};
|
|
85
100
|
getQueue(job: AnyJob): JobQueueEntry;
|
|
86
|
-
protected _mapJob(bullJob: Job):
|
|
101
|
+
protected _mapJob(bullJob: Job): Promise<JobItem>;
|
|
87
102
|
}
|
|
88
103
|
export {};
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
1
2
|
import { randomUUID } from 'node:crypto';
|
|
2
3
|
import { pick } from '@nmtjs/core';
|
|
3
|
-
import { t } from '@nmtjs/type';
|
|
4
4
|
import { Queue, QueueEvents, QueueEventsProducer, UnrecoverableError, } from 'bullmq';
|
|
5
|
-
import { JobWorkerPool } from "../enums.js";
|
|
6
5
|
import { createStoreClient } from "../store/index.js";
|
|
7
|
-
import { createJob } from "./job.js";
|
|
8
|
-
import { createStep } from "./step.js";
|
|
9
6
|
/**
|
|
10
7
|
* Get the dedicated BullMQ queue name for a job
|
|
11
8
|
*/
|
|
@@ -45,6 +42,9 @@ export class JobManager {
|
|
|
45
42
|
list: this.list.bind(this),
|
|
46
43
|
add: this.add.bind(this),
|
|
47
44
|
get: this.get.bind(this),
|
|
45
|
+
retry: this.retry.bind(this),
|
|
46
|
+
remove: this.remove.bind(this),
|
|
47
|
+
cancel: this.cancel.bind(this),
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
async initialize() {
|
|
@@ -94,16 +94,15 @@ export class JobManager {
|
|
|
94
94
|
if (page > totalPages)
|
|
95
95
|
return [];
|
|
96
96
|
const jobs = await queue.getJobs(state, (page - 1) * limit, page * limit - 1);
|
|
97
|
-
const items = jobs.map((job) => this._mapJob(job));
|
|
97
|
+
const items = await Promise.all(jobs.map((job) => this._mapJob(job)));
|
|
98
98
|
return { items, page, limit, pages: totalPages, total: jobsCount };
|
|
99
99
|
}
|
|
100
100
|
async get(job, id) {
|
|
101
101
|
const { queue } = this.getJobQueue(job);
|
|
102
|
-
job.steps;
|
|
103
102
|
const bullJob = await queue.getJob(id);
|
|
104
103
|
if (!bullJob)
|
|
105
104
|
return null;
|
|
106
|
-
return this._mapJob(bullJob);
|
|
105
|
+
return await this._mapJob(bullJob);
|
|
107
106
|
}
|
|
108
107
|
async add(job, data, { forceMissingWorkers = false, jobId = randomUUID(), priority, attempts = job.options.attempts, backoff = job.options.backoff, oneoff = job.options.oneoff ?? true, delay, } = {}) {
|
|
109
108
|
const { queue, events } = this.getJobQueue(job);
|
|
@@ -123,6 +122,27 @@ export class JobManager {
|
|
|
123
122
|
});
|
|
124
123
|
return new QueueJobResult({ job, bullJob, events });
|
|
125
124
|
}
|
|
125
|
+
async retry(job, id, options) {
|
|
126
|
+
const { queue } = this.getJobQueue(job);
|
|
127
|
+
const bullJob = await queue.getJob(id);
|
|
128
|
+
if (!bullJob)
|
|
129
|
+
throw new Error(`Job with id [${id}] not found`);
|
|
130
|
+
const state = await bullJob.getState();
|
|
131
|
+
// For completed jobs, clear state by default so it reruns from scratch
|
|
132
|
+
// For failed jobs, keep state by default so it resumes from checkpoint
|
|
133
|
+
const shouldClearState = options?.clearState ?? state === 'completed';
|
|
134
|
+
if (shouldClearState) {
|
|
135
|
+
await bullJob.updateProgress({});
|
|
136
|
+
}
|
|
137
|
+
await bullJob.retry();
|
|
138
|
+
}
|
|
139
|
+
async remove(job, id) {
|
|
140
|
+
const { queue } = this.getJobQueue(job);
|
|
141
|
+
const bullJob = await queue.getJob(id);
|
|
142
|
+
if (!bullJob)
|
|
143
|
+
throw new Error(`Job with id [${id}] not found`);
|
|
144
|
+
await bullJob.remove();
|
|
145
|
+
}
|
|
126
146
|
async cancel(job, id) {
|
|
127
147
|
const { custom, queue } = this.getJobQueue(job);
|
|
128
148
|
const bullJob = await queue.getJob(id);
|
|
@@ -154,20 +174,27 @@ export class JobManager {
|
|
|
154
174
|
getQueue(job) {
|
|
155
175
|
return this.getJobQueue(job);
|
|
156
176
|
}
|
|
157
|
-
_mapJob(bullJob) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
177
|
+
async _mapJob(bullJob) {
|
|
178
|
+
const status = await bullJob.getState();
|
|
179
|
+
const id = bullJob.id;
|
|
180
|
+
assert(typeof id === 'string', 'Expected job id to be a string');
|
|
181
|
+
return {
|
|
182
|
+
...pick(bullJob, {
|
|
183
|
+
queueName: true,
|
|
184
|
+
priority: true,
|
|
185
|
+
progress: true,
|
|
186
|
+
name: true,
|
|
187
|
+
data: true,
|
|
188
|
+
returnvalue: true,
|
|
189
|
+
attemptsMade: true,
|
|
190
|
+
processedOn: true,
|
|
191
|
+
finishedOn: true,
|
|
192
|
+
failedReason: true,
|
|
193
|
+
stacktrace: true,
|
|
194
|
+
}),
|
|
195
|
+
id,
|
|
196
|
+
status,
|
|
197
|
+
};
|
|
171
198
|
}
|
|
172
199
|
}
|
|
173
200
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/runtime/jobs/manager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/runtime/jobs/manager.ts"],"names":[],"mappings":"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"}
|