@alanszp/queue 9.2.4 → 9.3.0

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 (63) hide show
  1. package/dist/errors/JobCannotBePromotedError.d.ts +10 -0
  2. package/dist/errors/JobCannotBePromotedError.js +25 -0
  3. package/dist/errors/JobCannotBePromotedError.js.map +1 -0
  4. package/dist/errors/JobNotFoundError.d.ts +8 -0
  5. package/dist/errors/JobNotFoundError.js +23 -0
  6. package/dist/errors/JobNotFoundError.js.map +1 -0
  7. package/dist/jobsManagement/commands/asyncCreationCommands.d.ts +7 -0
  8. package/dist/jobsManagement/commands/asyncCreationCommands.js +45 -0
  9. package/dist/jobsManagement/commands/asyncCreationCommands.js.map +1 -0
  10. package/dist/jobsManagement/commands/getCommands.d.ts +8 -0
  11. package/dist/jobsManagement/commands/getCommands.js +47 -0
  12. package/dist/jobsManagement/commands/getCommands.js.map +1 -0
  13. package/dist/jobsManagement/commands/workerHealthCommand.d.ts +2 -0
  14. package/dist/jobsManagement/commands/workerHealthCommand.js +10 -0
  15. package/dist/jobsManagement/commands/workerHealthCommand.js.map +1 -0
  16. package/dist/jobsManagement/index.d.ts +6 -0
  17. package/dist/jobsManagement/index.js +19 -0
  18. package/dist/jobsManagement/index.js.map +1 -0
  19. package/dist/jobsManagement/inputs/CreateAsyncJobInput.d.ts +11 -0
  20. package/dist/jobsManagement/inputs/CreateAsyncJobInput.js +58 -0
  21. package/dist/jobsManagement/inputs/CreateAsyncJobInput.js.map +1 -0
  22. package/dist/jobsManagement/inputs/GetJobInput.d.ts +6 -0
  23. package/dist/jobsManagement/inputs/GetJobInput.js +44 -0
  24. package/dist/jobsManagement/inputs/GetJobInput.js.map +1 -0
  25. package/dist/jobsManagement/inputs/SearchJobsInput.d.ts +14 -0
  26. package/dist/jobsManagement/inputs/SearchJobsInput.js +61 -0
  27. package/dist/jobsManagement/inputs/SearchJobsInput.js.map +1 -0
  28. package/dist/queue/createQueue.d.ts +1 -1
  29. package/dist/queue/queue.d.ts +15 -6
  30. package/dist/queue/queue.js +67 -1
  31. package/dist/queue/queue.js.map +1 -1
  32. package/dist/reporter/totalCount/ITotalCountReporter.d.ts +5 -0
  33. package/dist/reporter/totalCount/ITotalCountReporter.js +3 -0
  34. package/dist/reporter/totalCount/ITotalCountReporter.js.map +1 -0
  35. package/dist/reporter/totalCount/JobTotalCountReporter.d.ts +12 -0
  36. package/dist/reporter/totalCount/JobTotalCountReporter.js +29 -0
  37. package/dist/reporter/totalCount/JobTotalCountReporter.js.map +1 -0
  38. package/dist/reporter/totalCount/MockTotalCountReporter.d.ts +8 -0
  39. package/dist/reporter/totalCount/MockTotalCountReporter.js +21 -0
  40. package/dist/reporter/totalCount/MockTotalCountReporter.js.map +1 -0
  41. package/dist/types.d.ts +20 -1
  42. package/dist/types.js +22 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/worker/workerRepository.d.ts +2 -2
  45. package/dist/worker/workerRepository.js +7 -2
  46. package/dist/worker/workerRepository.js.map +1 -1
  47. package/package.json +5 -2
  48. package/src/errors/JobCannotBePromotedError.ts +32 -0
  49. package/src/errors/JobNotFoundError.ts +24 -0
  50. package/src/jobsManagement/commands/asyncCreationCommands.ts +58 -0
  51. package/src/jobsManagement/commands/getCommands.ts +57 -0
  52. package/src/jobsManagement/commands/workerHealthCommand.ts +10 -0
  53. package/src/jobsManagement/index.ts +6 -0
  54. package/src/jobsManagement/inputs/CreateAsyncJobInput.ts +37 -0
  55. package/src/jobsManagement/inputs/GetJobInput.ts +17 -0
  56. package/src/jobsManagement/inputs/SearchJobsInput.ts +45 -0
  57. package/src/queue/createQueue.ts +3 -3
  58. package/src/queue/queue.ts +101 -10
  59. package/src/reporter/totalCount/ITotalCountReporter.ts +5 -0
  60. package/src/reporter/totalCount/JobTotalCountReporter.ts +37 -0
  61. package/src/reporter/totalCount/MockTotalCountReporter.ts +20 -0
  62. package/src/types.ts +23 -0
  63. package/src/worker/workerRepository.ts +13 -5
@@ -0,0 +1,12 @@
1
+ import { Job } from "../../types";
2
+ import { ITotalCountReporter } from "./ITotalCountReporter";
3
+ export declare class JobTotalCountReporter<JobInstance extends Job> implements ITotalCountReporter {
4
+ private total;
5
+ private current;
6
+ private job;
7
+ constructor(job: JobInstance);
8
+ setTotal(total: number): void;
9
+ increment(n?: number): void;
10
+ reset(value?: number): void;
11
+ report(): void;
12
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JobTotalCountReporter = void 0;
4
+ class JobTotalCountReporter {
5
+ constructor(job) {
6
+ this.total = 1;
7
+ this.current = 0;
8
+ this.job = job;
9
+ }
10
+ setTotal(total) {
11
+ this.total = total;
12
+ this.reset();
13
+ }
14
+ increment(n) {
15
+ this.current += n !== null && n !== void 0 ? n : 1;
16
+ this.report();
17
+ }
18
+ reset(value) {
19
+ this.current = value !== null && value !== void 0 ? value : 0;
20
+ this.report();
21
+ }
22
+ report() {
23
+ this.job
24
+ .updateProgress({ total: this.total, current: this.current })
25
+ .catch(() => { });
26
+ }
27
+ }
28
+ exports.JobTotalCountReporter = JobTotalCountReporter;
29
+ //# sourceMappingURL=JobTotalCountReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobTotalCountReporter.js","sourceRoot":"","sources":["../../../src/reporter/totalCount/JobTotalCountReporter.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IAShC,YAAY,GAAgB;QANpB,UAAK,GAAG,CAAC,CAAC;QAEV,YAAO,GAAG,CAAC,CAAC;QAKlB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,SAAS,CAAC,CAAU;QAClB,IAAI,CAAC,OAAO,IAAI,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,GAAG;aACL,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;aAC5D,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;CACF;AAjCD,sDAiCC"}
@@ -0,0 +1,8 @@
1
+ import { ITotalCountReporter } from "./ITotalCountReporter";
2
+ export declare class MockTotalCountReporter implements ITotalCountReporter {
3
+ private total;
4
+ private progress;
5
+ setTotal(total: number): void;
6
+ increment(n?: number): void;
7
+ reset(value?: number): void;
8
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockTotalCountReporter = void 0;
4
+ class MockTotalCountReporter {
5
+ constructor() {
6
+ this.total = 1;
7
+ this.progress = 0;
8
+ }
9
+ setTotal(total) {
10
+ this.total = total;
11
+ this.reset();
12
+ }
13
+ increment(n) {
14
+ this.progress += n !== null && n !== void 0 ? n : 1;
15
+ }
16
+ reset(value) {
17
+ this.progress = value !== null && value !== void 0 ? value : 0;
18
+ }
19
+ }
20
+ exports.MockTotalCountReporter = MockTotalCountReporter;
21
+ //# sourceMappingURL=MockTotalCountReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockTotalCountReporter.js","sourceRoot":"","sources":["../../../src/reporter/totalCount/MockTotalCountReporter.ts"],"names":[],"mappings":";;;AAEA,MAAa,sBAAsB;IAAnC;QACU,UAAK,GAAG,CAAC,CAAC;QAEV,aAAQ,GAAG,CAAC,CAAC;IAcvB,CAAC;IAZC,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,SAAS,CAAC,CAAU;QAClB,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAjBD,wDAiBC"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,22 @@
1
- export { ConnectionOptions, RedisOptions, Job, Worker as RawWorker, WorkerOptions, Queue as RawQueue, QueueOptions, JobsOptions, } from "bullmq";
1
+ export { ConnectionOptions, RedisOptions, Job, Worker as RawWorker, WorkerOptions, Queue as RawQueue, QueueOptions, JobState, JobType, JobsOptions, } from "bullmq";
2
2
  export declare type JobData = unknown;
3
3
  export declare type JobReturnValue = unknown;
4
+ export declare enum JobStateEnum {
5
+ ACTIVE = "active",
6
+ DELAYED = "delayed",
7
+ WAITING = "waiting",
8
+ COMPLETED = "completed",
9
+ FAILED = "failed",
10
+ WAITING_CHILDREN = "waiting-children"
11
+ }
12
+ export declare enum JobTypeEnum {
13
+ ACTIVE = "active",
14
+ DELAYED = "delayed",
15
+ WAITING = "waiting",
16
+ COMPLETED = "completed",
17
+ FAILED = "failed",
18
+ WAITING_CHILDREN = "waiting-children",
19
+ PAUSED = "paused",
20
+ REPEAT = "repeat",
21
+ WAIT = "wait"
22
+ }
package/dist/types.js CHANGED
@@ -1,9 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RawQueue = exports.RawWorker = exports.Job = void 0;
3
+ exports.JobTypeEnum = exports.JobStateEnum = exports.RawQueue = exports.RawWorker = exports.Job = void 0;
4
4
  // decoupling from bullmq
5
5
  var bullmq_1 = require("bullmq");
6
6
  Object.defineProperty(exports, "Job", { enumerable: true, get: function () { return bullmq_1.Job; } });
7
7
  Object.defineProperty(exports, "RawWorker", { enumerable: true, get: function () { return bullmq_1.Worker; } });
8
8
  Object.defineProperty(exports, "RawQueue", { enumerable: true, get: function () { return bullmq_1.Queue; } });
9
+ var JobStateEnum;
10
+ (function (JobStateEnum) {
11
+ JobStateEnum["ACTIVE"] = "active";
12
+ JobStateEnum["DELAYED"] = "delayed";
13
+ JobStateEnum["WAITING"] = "waiting";
14
+ JobStateEnum["COMPLETED"] = "completed";
15
+ JobStateEnum["FAILED"] = "failed";
16
+ JobStateEnum["WAITING_CHILDREN"] = "waiting-children";
17
+ })(JobStateEnum = exports.JobStateEnum || (exports.JobStateEnum = {}));
18
+ var JobTypeEnum;
19
+ (function (JobTypeEnum) {
20
+ JobTypeEnum["ACTIVE"] = "active";
21
+ JobTypeEnum["DELAYED"] = "delayed";
22
+ JobTypeEnum["WAITING"] = "waiting";
23
+ JobTypeEnum["COMPLETED"] = "completed";
24
+ JobTypeEnum["FAILED"] = "failed";
25
+ JobTypeEnum["WAITING_CHILDREN"] = "waiting-children";
26
+ JobTypeEnum["PAUSED"] = "paused";
27
+ JobTypeEnum["REPEAT"] = "repeat";
28
+ JobTypeEnum["WAIT"] = "wait";
29
+ })(JobTypeEnum = exports.JobTypeEnum || (exports.JobTypeEnum = {}));
9
30
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,iCASgB;AANd,6FAAA,GAAG,OAAA;AACH,mGAAA,MAAM,OAAa;AAEnB,kGAAA,KAAK,OAAY"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,iCAWgB;AARd,6FAAA,GAAG,OAAA;AACH,mGAAA,MAAM,OAAa;AAEnB,kGAAA,KAAK,OAAY;AAWnB,IAAY,YAOX;AAPD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,uCAAuB,CAAA;IACvB,iCAAiB,CAAA;IACjB,qDAAqC,CAAA;AACvC,CAAC,EAPW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAOvB;AAED,IAAY,WAUX;AAVD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,sCAAuB,CAAA;IACvB,gCAAiB,CAAA;IACjB,oDAAqC,CAAA;IACrC,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACf,CAAC,EAVW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAUtB"}
@@ -1,5 +1,5 @@
1
1
  import { Worker, WorkerStatus } from "./worker";
2
- export declare type WokerStatusWithId = {
2
+ export declare type WorkerStatusWithId = {
3
3
  status: WorkerStatus;
4
4
  } & {
5
5
  id: string;
@@ -16,7 +16,7 @@ export declare class WorkerRepository {
16
16
  static get Instance(): WorkerRepository;
17
17
  registerWorker(queueName: string, workerClass: WorkerClass): WorkerRepository;
18
18
  getWorkersByQueues(queueNames: string[]): Worker[];
19
- getWorkerStatuses(): WokerStatusWithId[];
19
+ getWorkerStatuses(): WorkerStatusWithId[];
20
20
  getCloseConnections(): Promise<void>[];
21
21
  private get workers();
22
22
  private get activeWorkers();
@@ -32,12 +32,17 @@ class WorkerRepository {
32
32
  this._activeWorkers.push(worker);
33
33
  return worker;
34
34
  }
35
- this.getLogger().warn("worker_repository.invalid_queue_name", { queueName });
35
+ this.getLogger().warn("worker_repository.invalid_queue_name", {
36
+ queueName,
37
+ });
36
38
  return null;
37
39
  }));
38
40
  }
39
41
  getWorkerStatuses() {
40
- return this.activeWorkers.map((worker) => ({ id: worker.id, status: worker.status }));
42
+ return this.activeWorkers.map((worker) => ({
43
+ id: worker.id,
44
+ status: worker.status,
45
+ }));
41
46
  }
42
47
  getCloseConnections() {
43
48
  return this.activeWorkers.map((worker) => worker.close());
@@ -1 +1 @@
1
- {"version":3,"file":"workerRepository.js","sourceRoot":"","sources":["../../src/worker/workerRepository.ts"],"names":[],"mappings":";;;AACA,mCAA0C;AAC1C,4DAAyD;AASzD,MAAa,gBAAgB;IAS3B;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;IAC7D,CAAC;IAEM,MAAM,KAAK,QAAQ;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc,CAAC,SAAiB,EAAE,WAAwB;QAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB,CAAC,UAAoB;QACrC,IAAI,IAAA,gBAAO,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;SACX;QAED,OAAO,IAAA,gBAAO,EACZ,UAAU,CAAC,GAAG,CAAC,CAAC,SAAiB,EAAE,EAAE;YACnC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,oEAAoE;gBACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjC,OAAO,MAAM,CAAC;aACf;YACD,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AA/DD,4CA+DC"}
1
+ {"version":3,"file":"workerRepository.js","sourceRoot":"","sources":["../../src/worker/workerRepository.ts"],"names":[],"mappings":";;;AACA,mCAA0C;AAC1C,4DAAyD;AASzD,MAAa,gBAAgB;IAS3B;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,qCAAiB,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;IAC7D,CAAC;IAEM,MAAM,KAAK,QAAQ;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc,CACnB,SAAiB,EACjB,WAAwB;QAExB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB,CAAC,UAAoB;QACrC,IAAI,IAAA,gBAAO,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;SACX;QAED,OAAO,IAAA,gBAAO,EACZ,UAAU,CAAC,GAAG,CAAC,CAAC,SAAiB,EAAE,EAAE;YACnC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,oEAAoE;gBACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjC,OAAO,MAAM,CAAC;aACf;YACD,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAC5D,SAAS;aACV,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC,CAAC;IACN,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AAvED,4CAuEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alanszp/queue",
3
- "version": "9.2.4",
3
+ "version": "9.3.0",
4
4
  "description": "Workers and queues",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -20,17 +20,20 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^15.12.3",
23
+ "class-validator": "^0.13.1",
23
24
  "ts-node": "^10.0.0",
24
25
  "tslint": "^6.1.3",
25
26
  "typescript": "^4.3.4"
26
27
  },
27
28
  "dependencies": {
28
29
  "@alanszp/audit": "^9.0.0",
30
+ "@alanszp/core": "^9.2.2",
29
31
  "@alanszp/logger": "^9.0.0",
30
32
  "@alanszp/shared-context": "^9.0.0",
33
+ "@alanszp/validations": "^9.0.0",
31
34
  "bullmq": "^2.1.2",
32
35
  "ioredis": "^5.2.3",
33
36
  "lodash": "^4.17.21"
34
37
  },
35
- "gitHead": "0f35519e3073a3b4aa2b0060303eacf228d321ee"
38
+ "gitHead": "01f4cf7780357778908e8d40007747d8aa580c70"
36
39
  }
@@ -0,0 +1,32 @@
1
+ import { BaseError, RenderableContext, RenderableError } from "@alanszp/errors";
2
+ import { JobState } from "bullmq";
3
+
4
+ export class JobCannotBePromotedError
5
+ extends BaseError
6
+ implements RenderableError
7
+ {
8
+ public jobId: string;
9
+
10
+ public currentJobState: JobState | "unknown";
11
+
12
+ constructor(jobId: string, currentJobState: JobState | "unknown") {
13
+ super("JobCannotBePromotedError");
14
+ this.jobId = jobId;
15
+ this.currentJobState = currentJobState;
16
+ }
17
+
18
+ code(): string {
19
+ return "job_cannot_be_promoted_error";
20
+ }
21
+
22
+ renderMessage(): string {
23
+ return "Job not found";
24
+ }
25
+
26
+ context(): RenderableContext {
27
+ return {
28
+ jobId: this.jobId,
29
+ currentJobState: this.currentJobState,
30
+ };
31
+ }
32
+ }
@@ -0,0 +1,24 @@
1
+ import { BaseError, RenderableContext, RenderableError } from "@alanszp/errors";
2
+
3
+ export class JobNotFoundError extends BaseError implements RenderableError {
4
+ public jobId: string;
5
+
6
+ constructor(jobId: string) {
7
+ super("JobNotFoundError");
8
+ this.jobId = jobId;
9
+ }
10
+
11
+ code(): string {
12
+ return "job_not_found_error";
13
+ }
14
+
15
+ renderMessage(): string {
16
+ return "Job not found";
17
+ }
18
+
19
+ context(): RenderableContext {
20
+ return {
21
+ jobId: this.jobId,
22
+ };
23
+ }
24
+ }
@@ -0,0 +1,58 @@
1
+ import { ILogger } from "@alanszp/logger";
2
+ import { BaseModel } from "@alanszp/validations";
3
+ import { CreateAsyncJobInput } from "../inputs/CreateAsyncJobInput";
4
+ import { Queue } from "../../queue/queue";
5
+ import { Job } from "../../types";
6
+
7
+ export async function asyncJobCreationCommand<
8
+ QueueInputBody,
9
+ RealInput extends BaseModel & QueueInputBody,
10
+ AsyncInput extends CreateAsyncJobInput<RealInput>
11
+ >(
12
+ logger: ILogger,
13
+ queue: Queue<QueueInputBody>,
14
+ input: AsyncInput
15
+ ): Promise<Job<QueueInputBody>> {
16
+ const child = logger.child({
17
+ input,
18
+ queueName: queue.getName(),
19
+ });
20
+
21
+ child.info("worker.async.create_job.starting");
22
+ await input.validate();
23
+
24
+ child.debug("worker.async.create_job.validated");
25
+
26
+ const job = await queue.publishJob(input.asyncInput, {
27
+ delay: input.getDelayInMs(),
28
+ });
29
+
30
+ child.debug("worker.async.create_job.succeed", { jobId: job.id });
31
+
32
+ return job;
33
+ }
34
+
35
+ export async function immediateExecutionJobCreationCommand<
36
+ QueueInputBody,
37
+ RealInput extends QueueInputBody & BaseModel
38
+ >(
39
+ logger: ILogger,
40
+ queue: Queue<QueueInputBody>,
41
+ input: RealInput
42
+ ): Promise<Job<QueueInputBody>> {
43
+ const child = logger.child({
44
+ input,
45
+ queueName: queue.getName(),
46
+ });
47
+
48
+ child.info("worker.async.create_job.starting");
49
+ await input.validate();
50
+
51
+ child.debug("worker.async.create_job.validated");
52
+
53
+ const job = await queue.publishJob(input);
54
+
55
+ child.debug("worker.async.create_job.succeed", { jobId: job.id });
56
+
57
+ return job;
58
+ }
@@ -0,0 +1,57 @@
1
+ import { ILogger } from "@alanszp/logger";
2
+ import { GetJobInput } from "../inputs/GetJobInput";
3
+ import { SearchJobsInput } from "../inputs/SearchJobsInput";
4
+ import { ListResult } from "@alanszp/core";
5
+ import { Queue } from "../../queue/queue";
6
+ import { Job } from "../../types";
7
+
8
+ export async function getJobStatus<QueueInputBody, ReturnValue>(
9
+ logger: ILogger,
10
+ queue: Queue<QueueInputBody, ReturnValue>,
11
+ input: GetJobInput
12
+ ): Promise<Job<QueueInputBody, ReturnValue> | undefined> {
13
+ const child = logger.child({
14
+ input,
15
+ queueName: queue.getName(),
16
+ });
17
+
18
+ child.info("worker.get_job.starting");
19
+ await input.validate();
20
+
21
+ child.debug("worker.get_job.validated");
22
+
23
+ const job = await queue.getJobOrFail(input.jobId);
24
+
25
+ child.info("worker.get_job.succeed", { jobId: job?.id ?? null });
26
+
27
+ return job;
28
+ }
29
+
30
+ export async function searchJobsCommand<QueueInputBody, ReturnValue>(
31
+ logger: ILogger,
32
+ queue: Queue<QueueInputBody, ReturnValue>,
33
+ input: SearchJobsInput
34
+ ): Promise<ListResult<Job<QueueInputBody, ReturnValue>>> {
35
+ const child = logger.child({
36
+ input,
37
+ queueName: queue.getName(),
38
+ });
39
+
40
+ child.info("worker.get_job.starting");
41
+ await input.validate();
42
+
43
+ child.debug("worker.get_job.validated");
44
+
45
+ const jobs = await queue.getJobsAndCountByStatus(
46
+ input.status,
47
+ input.page,
48
+ input.pageSize
49
+ );
50
+
51
+ child.info("worker.get_job.succeed", {
52
+ jobTotal: jobs.total,
53
+ jobInPage: jobs.elements.length,
54
+ });
55
+
56
+ return jobs;
57
+ }
@@ -0,0 +1,10 @@
1
+ import {
2
+ WorkerStatusWithId,
3
+ WorkerRepository,
4
+ } from "../../worker/workerRepository";
5
+
6
+ export function workerHealthCommand(): WorkerStatusWithId[] {
7
+ const statuses = WorkerRepository.Instance.getWorkerStatuses();
8
+
9
+ return statuses;
10
+ }
@@ -0,0 +1,6 @@
1
+ export * from "./inputs/CreateAsyncJobInput";
2
+ export * from "./inputs/GetJobInput";
3
+ export * from "./inputs/SearchJobsInput";
4
+ export * from "./commands/asyncCreationCommands";
5
+ export * from "./commands/getCommands";
6
+ export * from "./commands/workerHealthCommand";
@@ -0,0 +1,37 @@
1
+ import { IsDateString, IsDefined, IsOptional } from "class-validator";
2
+ import { BaseModel } from "@alanszp/validations";
3
+ import { differenceInMilliseconds } from "date-fns";
4
+
5
+ export interface CreateAsyncJobQueryParams {
6
+ executeOn?: string;
7
+ }
8
+
9
+ export class CreateAsyncJobInput<
10
+ RealInput extends BaseModel
11
+ > extends BaseModel {
12
+ @IsDateString()
13
+ @IsOptional()
14
+ public executeOn?: string;
15
+
16
+ @IsDefined()
17
+ public asyncInput: RealInput;
18
+
19
+ constructor(asyncParams: CreateAsyncJobQueryParams, asyncInput: RealInput) {
20
+ super();
21
+ this.executeOn = asyncParams.executeOn;
22
+ this.asyncInput = asyncInput;
23
+ }
24
+
25
+ async validate(): Promise<void> {
26
+ await super.validate();
27
+
28
+ await this.asyncInput.validate();
29
+ }
30
+
31
+ getDelayInMs(): number | undefined {
32
+ if (!this.executeOn) return undefined;
33
+ const date = new Date(this.executeOn);
34
+ const delay = differenceInMilliseconds(date, new Date());
35
+ return delay > 0 ? delay : undefined;
36
+ }
37
+ }
@@ -0,0 +1,17 @@
1
+ import { IsDefined, IsString } from "class-validator";
2
+ import { BaseModel } from "@alanszp/validations";
3
+
4
+ export class GetJobInput extends BaseModel {
5
+ @IsDefined()
6
+ @IsString()
7
+ public jobId: string;
8
+
9
+ constructor(jobId: string) {
10
+ super();
11
+ this.jobId = jobId;
12
+ }
13
+
14
+ async validate(): Promise<void> {
15
+ await super.validate();
16
+ }
17
+ }
@@ -0,0 +1,45 @@
1
+ import {
2
+ IsDefined,
3
+ IsArray,
4
+ IsEnum,
5
+ IsNumber,
6
+ Min,
7
+ Max,
8
+ } from "class-validator";
9
+ import { BaseModel } from "@alanszp/validations";
10
+ import { JobTypeEnum } from "../../types";
11
+ import { assignPaginableKeys } from "@alanszp/core";
12
+
13
+ export interface SearchJobInputProps {
14
+ status: JobTypeEnum[];
15
+ page?: string | number;
16
+ pageSize?: number;
17
+ }
18
+
19
+ export class SearchJobsInput extends BaseModel {
20
+ @IsDefined()
21
+ @IsArray()
22
+ @IsEnum(JobTypeEnum, { each: true })
23
+ public status: JobTypeEnum[];
24
+
25
+ @IsDefined()
26
+ @IsNumber()
27
+ @Min(1)
28
+ public page: number;
29
+
30
+ @IsDefined()
31
+ @IsNumber()
32
+ @Min(1)
33
+ @Max(100)
34
+ public pageSize: number;
35
+
36
+ constructor({ status, page, pageSize }: SearchJobInputProps) {
37
+ super();
38
+ this.status = status;
39
+ assignPaginableKeys(this, { page, pageSize });
40
+ }
41
+
42
+ async validate(): Promise<void> {
43
+ await super.validate();
44
+ }
45
+ }
@@ -4,13 +4,13 @@ import { ConnectionManager } from "../connectionManager";
4
4
  import { JobData, QueueOptions } from "../types";
5
5
  import { SharedContext } from "@alanszp/shared-context";
6
6
 
7
- export function createQueue<JobType = JobData>(
7
+ export function createQueue<Data = JobData>(
8
8
  name: string,
9
9
  getContext: () => SharedContext,
10
10
  queueOptions?: QueueOptions
11
- ): Queue {
11
+ ): Queue<Data> {
12
12
  const connection = ConnectionManager.getInstance().getConnection();
13
- const queue = new Queue<JobType>(
13
+ const queue = new Queue<Data>(
14
14
  connection,
15
15
  name,
16
16
  ConnectionManager.getInstance().getServiceName(),