|
@@ -1,8 +1,10 @@
|
|
|
import async from "async";
|
|
|
import BaseModule from "./BaseModule";
|
|
|
import Job from "./Job";
|
|
|
+import JobContext from "./JobContext";
|
|
|
import JobQueue from "./JobQueue";
|
|
|
import LogBook from "./LogBook";
|
|
|
+import { JobOptions } from "./types/JobOptions";
|
|
|
import { Jobs, Modules, ModuleStatus, ModuleClass } from "./types/Modules";
|
|
|
|
|
|
export default class ModuleManager {
|
|
@@ -156,19 +158,24 @@ export default class ModuleManager {
|
|
|
* @param params - Params
|
|
|
*/
|
|
|
public runJob<
|
|
|
- M extends keyof Jobs & keyof Modules,
|
|
|
- J extends keyof Jobs[M] & keyof Omit<Modules[M], keyof BaseModule>,
|
|
|
- P extends "payload" extends keyof Jobs[M][J]
|
|
|
- ? Jobs[M][J]["payload"]
|
|
|
- : undefined,
|
|
|
- R = "returns" extends keyof Jobs[M][J] ? Jobs[M][J]["returns"] : never
|
|
|
+ ModuleNameType extends keyof Jobs & keyof Modules,
|
|
|
+ JobNameType extends keyof Jobs[ModuleNameType] &
|
|
|
+ keyof Omit<Modules[ModuleNameType], keyof BaseModule>,
|
|
|
+ PayloadType extends "payload" extends keyof Jobs[ModuleNameType][JobNameType]
|
|
|
+ ? Jobs[ModuleNameType][JobNameType]["payload"] extends undefined
|
|
|
+ ? void
|
|
|
+ : Jobs[ModuleNameType][JobNameType]["payload"]
|
|
|
+ : void,
|
|
|
+ ReturnType = "returns" extends keyof Jobs[ModuleNameType][JobNameType]
|
|
|
+ ? Jobs[ModuleNameType][JobNameType]["returns"]
|
|
|
+ : never
|
|
|
>(
|
|
|
- moduleName: M,
|
|
|
- jobName: J,
|
|
|
- ...params: P extends undefined ? [] : [P, { priority?: number }?]
|
|
|
- ): Promise<R> {
|
|
|
- const [payload, options] = params;
|
|
|
- return new Promise<R>((resolve, reject) => {
|
|
|
+ moduleName: ModuleNameType,
|
|
|
+ jobName: JobNameType,
|
|
|
+ payload: PayloadType,
|
|
|
+ options?: JobOptions
|
|
|
+ ): Promise<ReturnType> {
|
|
|
+ return new Promise<ReturnType>((resolve, reject) => {
|
|
|
const module = this.modules && this.modules[moduleName];
|
|
|
if (!module) reject(new Error("Module not found."));
|
|
|
else {
|
|
@@ -180,46 +187,53 @@ export default class ModuleManager {
|
|
|
)
|
|
|
reject(new Error("Illegal job function."));
|
|
|
else {
|
|
|
- this.jobQueue.add(
|
|
|
- new Job(
|
|
|
- jobName.toString(),
|
|
|
- moduleName,
|
|
|
- (job, resolveJob, rejectJob) => {
|
|
|
- jobFunction
|
|
|
- .apply(module, [payload])
|
|
|
- .then((response: R) => {
|
|
|
- this.logBook.log({
|
|
|
- message:
|
|
|
- "Job completed successfully",
|
|
|
- type: "success",
|
|
|
- category: "jobs",
|
|
|
- data: {
|
|
|
- jobName: job.getName(),
|
|
|
- jobId: job.getUuid()
|
|
|
- }
|
|
|
- });
|
|
|
- resolveJob();
|
|
|
- resolve(response);
|
|
|
- })
|
|
|
- .catch((err: any) => {
|
|
|
- this.logBook.log({
|
|
|
- message: `Job failed with error "${err}"`,
|
|
|
- type: "error",
|
|
|
- category: "jobs",
|
|
|
- data: {
|
|
|
- jobName: job.getName(),
|
|
|
- jobId: job.getUuid()
|
|
|
- }
|
|
|
- });
|
|
|
- rejectJob();
|
|
|
- reject(err);
|
|
|
+ const job = new Job(
|
|
|
+ jobName.toString(),
|
|
|
+ module,
|
|
|
+ (job, resolveJob, rejectJob) => {
|
|
|
+ const jobContext = new JobContext(
|
|
|
+ this,
|
|
|
+ this.logBook,
|
|
|
+ job
|
|
|
+ );
|
|
|
+ jobFunction
|
|
|
+ .apply(jobContext, [payload])
|
|
|
+ .then((response: ReturnType) => {
|
|
|
+ this.logBook.log({
|
|
|
+ message: "Job completed successfully",
|
|
|
+ type: "success",
|
|
|
+ category: "jobs",
|
|
|
+ data: {
|
|
|
+ jobName: job.getName(),
|
|
|
+ jobId: job.getUuid()
|
|
|
+ }
|
|
|
});
|
|
|
- },
|
|
|
- {
|
|
|
- priority: (options && options.priority) || 10
|
|
|
- }
|
|
|
- )
|
|
|
+ resolveJob();
|
|
|
+ resolve(response);
|
|
|
+ })
|
|
|
+ .catch((err: any) => {
|
|
|
+ this.logBook.log({
|
|
|
+ message: `Job failed with error "${err}"`,
|
|
|
+ type: "error",
|
|
|
+ category: "jobs",
|
|
|
+ data: {
|
|
|
+ jobName: job.getName(),
|
|
|
+ jobId: job.getUuid()
|
|
|
+ }
|
|
|
+ });
|
|
|
+ rejectJob();
|
|
|
+ reject(err);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ {
|
|
|
+ priority: (options && options.priority) || 10
|
|
|
+ }
|
|
|
);
|
|
|
+
|
|
|
+ // If a job options.runDirectly is set to true, skip the queue and run a job directly
|
|
|
+ if (options && options.runDirectly)
|
|
|
+ this.jobQueue.runJob(job);
|
|
|
+ else this.jobQueue.add(job);
|
|
|
}
|
|
|
}
|
|
|
});
|