@alanszp/queue 7.9.0 → 9.0.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.
@@ -0,0 +1 @@
1
+ export declare function appIdentifier(): string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appIdentifier = void 0;
4
+ function appIdentifier() {
5
+ const appName = process.env.API_ORIGIN_NAME || "undefined";
6
+ const env = process.env.NODE_ENV || "development";
7
+ return `${appName}:${env}`;
8
+ }
9
+ exports.appIdentifier = appIdentifier;
10
+ //# sourceMappingURL=appIdentifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appIdentifier.js","sourceRoot":"","sources":["../../src/helpers/appIdentifier.ts"],"names":[],"mappings":";;;AAAA,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IAClD,OAAO,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC;AAC7B,CAAC;AAJD,sCAIC"}
@@ -1,3 +1,4 @@
1
1
  import { Queue } from "./queue";
2
2
  import { JobData, QueueOptions } from "../types";
3
- export declare function createQueue<JobType = JobData>(name: string, queueOptions?: QueueOptions): Queue;
3
+ import { SharedContext } from "@alanszp/shared-context";
4
+ export declare function createQueue<JobType = JobData>(name: string, getContext: () => SharedContext, queueOptions?: QueueOptions): Queue;
@@ -4,9 +4,9 @@ exports.createQueue = void 0;
4
4
  const queue_1 = require("./queue");
5
5
  const queueRepository_1 = require("./queueRepository");
6
6
  const connectionManager_1 = require("../connectionManager");
7
- function createQueue(name, queueOptions) {
7
+ function createQueue(name, getContext, queueOptions) {
8
8
  const connection = connectionManager_1.ConnectionManager.getInstance().getConnection();
9
- const queue = new queue_1.Queue(connection, name, connectionManager_1.ConnectionManager.getInstance().getServiceName(), queueOptions);
9
+ const queue = new queue_1.Queue(connection, name, connectionManager_1.ConnectionManager.getInstance().getServiceName(), getContext, queueOptions);
10
10
  queueRepository_1.QueueRepository.Instance.registerQueue(queue);
11
11
  return queue;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createQueue.js","sourceRoot":"","sources":["../../src/queue/createQueue.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,uDAAoD;AACpD,4DAAyD;AAGzD,SAAgB,WAAW,CAAoB,IAAY,EAAE,YAA2B;IACtF,MAAM,UAAU,GAAG,qCAAiB,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,aAAK,CAAU,UAAU,EAAE,IAAI,EAAE,qCAAiB,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,EAAE,YAAY,CAAC,CAAC;IACnH,iCAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACf,CAAC;AALD,kCAKC"}
1
+ {"version":3,"file":"createQueue.js","sourceRoot":"","sources":["../../src/queue/createQueue.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,uDAAoD;AACpD,4DAAyD;AAIzD,SAAgB,WAAW,CACzB,IAAY,EACZ,UAA+B,EAC/B,YAA2B;IAE3B,MAAM,UAAU,GAAG,qCAAiB,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,aAAK,CACrB,UAAU,EACV,IAAI,EACJ,qCAAiB,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,EAChD,UAAU,EACV,YAAY,CACb,CAAC;IACF,iCAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACf,CAAC;AAfD,kCAeC"}
@@ -1,10 +1,17 @@
1
1
  import { ConnectionOptions, JobData, QueueOptions } from "../types";
2
+ import { JobsOptions } from "bullmq";
3
+ import { SharedContext } from "@alanszp/shared-context";
2
4
  export declare class Queue<JobType = JobData> {
3
5
  private _queue;
4
6
  private name;
5
- constructor(connection: ConnectionOptions, name: string, prefix: string, queueOptions?: QueueOptions);
6
- publishJob(job: JobType): Promise<void>;
7
+ private getSharedContext;
8
+ constructor(connection: ConnectionOptions, name: string, prefix: string, getSharedContext: () => SharedContext, queueOptions?: QueueOptions);
9
+ publishJob(job: JobType, opts?: JobsOptions): Promise<void>;
7
10
  publishBulkJob(jobDatas: JobType[]): Promise<void>;
11
+ publishBulkJobWithOptions(jobDefinitions: {
12
+ jobData: JobType;
13
+ opts: JobsOptions;
14
+ }[]): Promise<void>;
8
15
  close(): Promise<void>;
9
16
  private get queue();
10
17
  }
@@ -16,8 +16,9 @@ const BULL_PREFIX = "b";
16
16
  const DEFAULT_COMPLETED_JOB_MAX_AGE_IN_SECONDS = 60 * 60 * 24 * 30;
17
17
  const DEFAULT_COMPLETED_JOB_MAX_COUNT = 500;
18
18
  class Queue {
19
- constructor(connection, name, prefix, queueOptions) {
19
+ constructor(connection, name, prefix, getSharedContext, queueOptions) {
20
20
  this.name = name;
21
+ this.getSharedContext = getSharedContext;
21
22
  this._queue = new types_1.RawQueue(name, Object.assign(Object.assign({}, (0, lodash_1.merge)({
22
23
  defaultJobOptions: {
23
24
  removeOnComplete: {
@@ -33,9 +34,12 @@ class Queue {
33
34
  connection,
34
35
  }, queueOptions || {})), { prefix: `{${prefix}}:${BULL_PREFIX}` }));
35
36
  }
36
- publishJob(job) {
37
+ publishJob(job, opts) {
37
38
  return __awaiter(this, void 0, void 0, function* () {
38
- yield this.queue.add(this.name, job);
39
+ const context = this.getSharedContext();
40
+ const lid = context.getLifecycleId();
41
+ const lch = context.getLifecycleChain();
42
+ yield this.queue.add(this.name, Object.assign(Object.assign({}, job), { lid, lch }), opts);
39
43
  });
40
44
  }
41
45
  publishBulkJob(jobDatas) {
@@ -44,6 +48,16 @@ class Queue {
44
48
  yield this.queue.addBulk(jobs);
45
49
  });
46
50
  }
51
+ publishBulkJobWithOptions(jobDefinitions) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ const jobs = jobDefinitions.map(({ jobData: data, opts }) => ({
54
+ name: this.name,
55
+ data,
56
+ opts,
57
+ }));
58
+ yield this.queue.addBulk(jobs);
59
+ });
60
+ }
47
61
  close() {
48
62
  return __awaiter(this, void 0, void 0, function* () {
49
63
  yield this.queue.close();
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA+B;AAC/B,oCAA8E;AAE9E,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,wCAAwC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACnE,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAE5C,MAAa,KAAK;IAKhB,YAAY,UAA6B,EAAE,IAAY,EAAE,MAAc,EAAE,YAA2B;QAClG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAQ,CAAU,IAAI,kCACnC,IAAA,cAAK,EACN;YACE,iBAAiB,EAAE;gBACjB,gBAAgB,EAAE;oBAChB,GAAG,EAAE,wCAAwC;oBAC7C,KAAK,EAAE,+BAA+B;iBACvC;gBACD,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE;oBACP,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,IAAI;iBACZ;aACF;YACD,UAAU;SACX,EACD,YAAY,IAAI,EAAE,CACnB,GACE,EAAE,MAAM,EAAE,IAAI,MAAM,KAAK,WAAW,EAAE,EAAE,EAC3C,CAAC;IACL,CAAC;IAEK,UAAU,CAAC,GAAY;;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;KAAA;IAEK,cAAc,CAAC,QAAmB;;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;KAAA;IAEK,KAAK;;YACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;KAAA;IAED,IAAY,KAAK;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA9CD,sBA8CC"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA+B;AAC/B,oCAA8E;AAI9E,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,wCAAwC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACnE,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAE5C,MAAa,KAAK;IAOhB,YACE,UAA6B,EAC7B,IAAY,EACZ,MAAc,EACd,gBAAqC,EACrC,YAA2B;QAE3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAEzC,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAQ,CAAU,IAAI,kCACnC,IAAA,cAAK,EACN;YACE,iBAAiB,EAAE;gBACjB,gBAAgB,EAAE;oBAChB,GAAG,EAAE,wCAAwC;oBAC7C,KAAK,EAAE,+BAA+B;iBACvC;gBACD,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE;oBACP,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,IAAI;iBACZ;aACF;YACD,UAAU;SACX,EACD,YAAY,IAAI,EAAE,CACnB,GACE,EAAE,MAAM,EAAE,IAAI,MAAM,KAAK,WAAW,EAAE,EAAE,EAC3C,CAAC;IACL,CAAC;IAEK,UAAU,CAAC,GAAY,EAAE,IAAkB;;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,kCAAO,GAAG,KAAE,GAAG,EAAE,GAAG,KAAI,IAAI,CAAC,CAAC;QAC9D,CAAC;KAAA;IAEK,cAAc,CAAC,QAAmB;;YACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;KAAA;IAEK,yBAAyB,CAC7B,cAAyD;;YAEzD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5D,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI;gBACJ,IAAI;aACL,CAAC,CAAC,CAAC;YACJ,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;KAAA;IAEK,KAAK;;YACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;KAAA;IAED,IAAY,KAAK;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAtED,sBAsEC"}
package/dist/types.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { ConnectionOptions, RedisOptions, Job, Worker as RawWorker, WorkerOptions, Queue as RawQueue, QueueOptions, } from "bullmq";
1
+ export { ConnectionOptions, RedisOptions, Job, Worker as RawWorker, WorkerOptions, Queue as RawQueue, QueueOptions, JobsOptions, } from "bullmq";
2
2
  export declare type JobData = any;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,iCAQgB;AALd,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,iCASgB;AANd,6FAAA,GAAG,OAAA;AACH,mGAAA,MAAM,OAAa;AAEnB,kGAAA,KAAK,OAAY"}
@@ -1,4 +1,7 @@
1
+ import { ILogger } from "@alanszp/logger";
1
2
  import { JobData, Job, RawWorker, WorkerOptions } from "../types";
3
+ import { SharedContext } from "@alanszp/shared-context";
4
+ import { Audit } from "@alanszp/audit";
2
5
  export interface WorkerStatus {
3
6
  running: boolean;
4
7
  paused: boolean;
@@ -7,6 +10,11 @@ export interface WorkerSetup {
7
10
  queueName: string;
8
11
  workerOptions?: WorkerOptions;
9
12
  }
13
+ export interface WorkerContext {
14
+ sharedContext: SharedContext;
15
+ baseLogger: ILogger;
16
+ audit: Audit;
17
+ }
10
18
  interface Worker<T = JobData> {
11
19
  handleJobFailed?(job: Job<T>, error: Error): Promise<void> | void;
12
20
  handleJobCompleted?(job: Job<T>): Promise<void> | void;
@@ -19,6 +27,7 @@ declare abstract class Worker<T = JobData> {
19
27
  constructor();
20
28
  abstract process(job: Job<T>): Promise<void>;
21
29
  abstract setup(): WorkerSetup;
30
+ abstract getContext(): WorkerContext;
22
31
  close(): Promise<void>;
23
32
  get status(): WorkerStatus;
24
33
  get id(): RawWorker["id"];
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.Worker = void 0;
13
13
  const connectionManager_1 = require("../connectionManager");
14
14
  const types_1 = require("../types");
15
+ const withContext_1 = require("../wrappers/withContext");
15
16
  const BULL_PREFIX = "b";
16
17
  class Worker {
17
18
  constructor() {
@@ -34,14 +35,21 @@ class Worker {
34
35
  return this.worker.id;
35
36
  }
36
37
  processJob() {
37
- return (job) => __awaiter(this, void 0, void 0, function* () {
38
- this.getLogger().info(`worker.process.job_received`, { queue: this.queueFullName, job });
38
+ return (0, withContext_1.withContext)(this.getContext(), (job) => __awaiter(this, void 0, void 0, function* () {
39
+ this.getLogger().info(`worker.process.job_received`, {
40
+ queue: this.queueFullName,
41
+ job,
42
+ });
39
43
  yield this.process(job);
40
- });
44
+ }));
41
45
  }
42
46
  processFailed(job, error) {
43
47
  return __awaiter(this, void 0, void 0, function* () {
44
- this.getLogger().warn("worker.job.failed", { queue: this.queueFullName, job, error });
48
+ this.getLogger().warn("worker.job.failed", {
49
+ queue: this.queueFullName,
50
+ job,
51
+ error,
52
+ });
45
53
  if (this.handleJobFailed) {
46
54
  yield this.handleJobFailed(job, error);
47
55
  }
@@ -49,7 +57,10 @@ class Worker {
49
57
  }
50
58
  processCompleted(job) {
51
59
  return __awaiter(this, void 0, void 0, function* () {
52
- this.getLogger().info("worker.job.completed", { queue: this.queueFullName, job });
60
+ this.getLogger().info("worker.job.completed", {
61
+ queue: this.queueFullName,
62
+ job,
63
+ });
53
64
  if (this.handleJobCompleted) {
54
65
  yield this.handleJobCompleted(job);
55
66
  }
@@ -57,7 +68,10 @@ class Worker {
57
68
  }
58
69
  processError(error) {
59
70
  return __awaiter(this, void 0, void 0, function* () {
60
- this.getLogger().error("worker.job.unhandled_exception", { queue: this.queueFullName, error });
71
+ this.getLogger().error("worker.job.unhandled_exception", {
72
+ queue: this.queueFullName,
73
+ error,
74
+ });
61
75
  if (this.handleJobError) {
62
76
  yield this.handleJobError(error);
63
77
  }
@@ -66,12 +80,19 @@ class Worker {
66
80
  run() {
67
81
  return __awaiter(this, void 0, void 0, function* () {
68
82
  try {
69
- this.getLogger().info("worker.run.starting", { queue: this.queueFullName });
83
+ this.getLogger().info("worker.run.starting", {
84
+ queue: this.queueFullName,
85
+ });
70
86
  yield this.worker.run();
71
- this.getLogger().info("worker.run.started", { queue: this.queueFullName });
87
+ this.getLogger().info("worker.run.started", {
88
+ queue: this.queueFullName,
89
+ });
72
90
  }
73
91
  catch (error) {
74
- this.getLogger().error("worker.run.error", { queue: this.queueFullName, error });
92
+ this.getLogger().error("worker.run.error", {
93
+ queue: this.queueFullName,
94
+ error,
95
+ });
75
96
  throw error;
76
97
  }
77
98
  });
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Job, JobData } from "bullmq";
2
+ import { WorkerContext } from "../worker/worker";
3
+ export declare function withContext<T = JobData>(workerContext: WorkerContext, executor: (job: Job<T>) => Promise<void>): (job: Job<T>) => Promise<void>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.withContext = void 0;
16
+ const cuid_1 = __importDefault(require("cuid"));
17
+ const appIdentifier_1 = require("../helpers/appIdentifier");
18
+ function withContext(workerContext, executor) {
19
+ return (job) => {
20
+ const { lid, lch } = job.data;
21
+ return workerContext.sharedContext.run(() => __awaiter(this, void 0, void 0, function* () {
22
+ return executor(job);
23
+ }), {
24
+ logger: workerContext.baseLogger,
25
+ audit: workerContext.audit.withState(),
26
+ lifecycleId: lid || (0, cuid_1.default)(),
27
+ lifecycleChain: lch || (0, appIdentifier_1.appIdentifier)(),
28
+ contextId: (0, cuid_1.default)(),
29
+ });
30
+ };
31
+ }
32
+ exports.withContext = withContext;
33
+ //# sourceMappingURL=withContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withContext.js","sourceRoot":"","sources":["../../src/wrappers/withContext.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,4DAAyD;AAIzD,SAAgB,WAAW,CACzB,aAA4B,EAC5B,QAAwC;IAExC,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAsC,CAAC;QAChE,OAAO,aAAa,CAAC,aAAa,CAAC,GAAG,CACpC,GAAS,EAAE;YACT,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAA,EACD;YACE,MAAM,EAAE,aAAa,CAAC,UAAU;YAChC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE;YACtC,WAAW,EAAE,GAAG,IAAI,IAAA,cAAI,GAAE;YAC1B,cAAc,EAAE,GAAG,IAAI,IAAA,6BAAa,GAAE;YACtC,SAAS,EAAE,IAAA,cAAI,GAAE;SAClB,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAnBD,kCAmBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alanszp/queue",
3
- "version": "7.9.0",
3
+ "version": "9.0.0",
4
4
  "description": "Workers and queues",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -25,10 +25,12 @@
25
25
  "typescript": "^4.3.4"
26
26
  },
27
27
  "dependencies": {
28
- "@alanszp/logger": "^7.0.0",
28
+ "@alanszp/audit": "^9.0.0",
29
+ "@alanszp/logger": "^9.0.0",
30
+ "@alanszp/shared-context": "^9.0.0",
29
31
  "bullmq": "^2.1.2",
30
32
  "ioredis": "^5.2.3",
31
33
  "lodash": "^4.17.21"
32
34
  },
33
- "gitHead": "3a3685ad54fbde5cea62d5e2cabca96f4bd8faf4"
35
+ "gitHead": "8af112076306ffc2fe14b6056aad1f26908a9394"
34
36
  }
@@ -0,0 +1,5 @@
1
+ export function appIdentifier() {
2
+ const appName = process.env.API_ORIGIN_NAME || "undefined";
3
+ const env = process.env.NODE_ENV || "development";
4
+ return `${appName}:${env}`;
5
+ }
@@ -2,10 +2,21 @@ import { Queue } from "./queue";
2
2
  import { QueueRepository } from "./queueRepository";
3
3
  import { ConnectionManager } from "../connectionManager";
4
4
  import { JobData, QueueOptions } from "../types";
5
+ import { SharedContext } from "@alanszp/shared-context";
5
6
 
6
- export function createQueue<JobType = JobData>(name: string, queueOptions?: QueueOptions): Queue {
7
+ export function createQueue<JobType = JobData>(
8
+ name: string,
9
+ getContext: () => SharedContext,
10
+ queueOptions?: QueueOptions
11
+ ): Queue {
7
12
  const connection = ConnectionManager.getInstance().getConnection();
8
- const queue = new Queue<JobType>(connection, name, ConnectionManager.getInstance().getServiceName(), queueOptions);
13
+ const queue = new Queue<JobType>(
14
+ connection,
15
+ name,
16
+ ConnectionManager.getInstance().getServiceName(),
17
+ getContext,
18
+ queueOptions
19
+ );
9
20
  QueueRepository.Instance.registerQueue(queue);
10
21
  return queue;
11
22
  }
@@ -1,5 +1,7 @@
1
1
  import { merge } from "lodash";
2
2
  import { ConnectionOptions, JobData, QueueOptions, RawQueue } from "../types";
3
+ import { JobsOptions } from "bullmq";
4
+ import { SharedContext } from "@alanszp/shared-context";
3
5
 
4
6
  const BULL_PREFIX = "b";
5
7
 
@@ -11,9 +13,19 @@ export class Queue<JobType = JobData> {
11
13
 
12
14
  private name: string;
13
15
 
14
- constructor(connection: ConnectionOptions, name: string, prefix: string, queueOptions?: QueueOptions) {
16
+ private getSharedContext: () => SharedContext;
17
+
18
+ constructor(
19
+ connection: ConnectionOptions,
20
+ name: string,
21
+ prefix: string,
22
+ getSharedContext: () => SharedContext,
23
+ queueOptions?: QueueOptions
24
+ ) {
15
25
  this.name = name;
16
26
 
27
+ this.getSharedContext = getSharedContext;
28
+
17
29
  this._queue = new RawQueue<JobType>(name, {
18
30
  ...merge(
19
31
  {
@@ -36,8 +48,11 @@ export class Queue<JobType = JobData> {
36
48
  });
37
49
  }
38
50
 
39
- async publishJob(job: JobType): Promise<void> {
40
- await this.queue.add(this.name, job);
51
+ async publishJob(job: JobType, opts?: JobsOptions): Promise<void> {
52
+ const context = this.getSharedContext();
53
+ const lid = context.getLifecycleId();
54
+ const lch = context.getLifecycleChain();
55
+ await this.queue.add(this.name, { ...job, lid, lch }, opts);
41
56
  }
42
57
 
43
58
  async publishBulkJob(jobDatas: JobType[]): Promise<void> {
@@ -45,6 +60,17 @@ export class Queue<JobType = JobData> {
45
60
  await this.queue.addBulk(jobs);
46
61
  }
47
62
 
63
+ async publishBulkJobWithOptions(
64
+ jobDefinitions: { jobData: JobType; opts: JobsOptions }[]
65
+ ): Promise<void> {
66
+ const jobs = jobDefinitions.map(({ jobData: data, opts }) => ({
67
+ name: this.name,
68
+ data,
69
+ opts,
70
+ }));
71
+ await this.queue.addBulk(jobs);
72
+ }
73
+
48
74
  async close(): Promise<void> {
49
75
  await this.queue.close();
50
76
  }
package/src/types.ts CHANGED
@@ -7,6 +7,7 @@ export {
7
7
  WorkerOptions,
8
8
  Queue as RawQueue,
9
9
  QueueOptions,
10
+ JobsOptions,
10
11
  } from "bullmq";
11
12
 
12
13
  // This may seems odd but actual Job data type from bullmq is any 🤷‍♂️
@@ -1,6 +1,9 @@
1
1
  import { ILogger } from "@alanszp/logger";
2
2
  import { ConnectionManager } from "../connectionManager";
3
3
  import { JobData, Job, RawWorker, WorkerOptions } from "../types";
4
+ import { SharedContext } from "@alanszp/shared-context";
5
+ import { Audit } from "@alanszp/audit";
6
+ import { withContext } from "../wrappers/withContext";
4
7
 
5
8
  export interface WorkerStatus {
6
9
  running: boolean;
@@ -12,6 +15,12 @@ export interface WorkerSetup {
12
15
  workerOptions?: WorkerOptions;
13
16
  }
14
17
 
18
+ export interface WorkerContext {
19
+ sharedContext: SharedContext;
20
+ baseLogger: ILogger;
21
+ audit: Audit;
22
+ }
23
+
15
24
  // optional methods
16
25
 
17
26
  interface Worker<T = JobData> {
@@ -55,6 +64,8 @@ abstract class Worker<T = JobData> {
55
64
 
56
65
  abstract setup(): WorkerSetup;
57
66
 
67
+ abstract getContext(): WorkerContext;
68
+
58
69
  public close(): Promise<void> {
59
70
  return this.worker.close();
60
71
  }
@@ -68,28 +79,41 @@ abstract class Worker<T = JobData> {
68
79
  }
69
80
 
70
81
  private processJob(): (job: Job<T>) => Promise<void> {
71
- return async (job) => {
72
- this.getLogger().info(`worker.process.job_received`, { queue: this.queueFullName, job });
82
+ return withContext(this.getContext(), async (job) => {
83
+ this.getLogger().info(`worker.process.job_received`, {
84
+ queue: this.queueFullName,
85
+ job,
86
+ });
73
87
  await this.process(job);
74
- };
88
+ });
75
89
  }
76
90
 
77
91
  async processFailed(job: Job<T>, error: Error): Promise<void> {
78
- this.getLogger().warn("worker.job.failed", { queue: this.queueFullName, job, error });
92
+ this.getLogger().warn("worker.job.failed", {
93
+ queue: this.queueFullName,
94
+ job,
95
+ error,
96
+ });
79
97
  if (this.handleJobFailed) {
80
98
  await this.handleJobFailed(job, error);
81
99
  }
82
100
  }
83
101
 
84
102
  async processCompleted(job: Job<T>): Promise<void> {
85
- this.getLogger().info("worker.job.completed", { queue: this.queueFullName, job });
103
+ this.getLogger().info("worker.job.completed", {
104
+ queue: this.queueFullName,
105
+ job,
106
+ });
86
107
  if (this.handleJobCompleted) {
87
108
  await this.handleJobCompleted(job);
88
109
  }
89
110
  }
90
111
 
91
112
  async processError(error: Error): Promise<void> {
92
- this.getLogger().error("worker.job.unhandled_exception", { queue: this.queueFullName, error });
113
+ this.getLogger().error("worker.job.unhandled_exception", {
114
+ queue: this.queueFullName,
115
+ error,
116
+ });
93
117
  if (this.handleJobError) {
94
118
  await this.handleJobError(error);
95
119
  }
@@ -97,12 +121,19 @@ abstract class Worker<T = JobData> {
97
121
 
98
122
  async run(): Promise<void> {
99
123
  try {
100
- this.getLogger().info("worker.run.starting", { queue: this.queueFullName });
124
+ this.getLogger().info("worker.run.starting", {
125
+ queue: this.queueFullName,
126
+ });
101
127
 
102
128
  await this.worker.run();
103
- this.getLogger().info("worker.run.started", { queue: this.queueFullName });
129
+ this.getLogger().info("worker.run.started", {
130
+ queue: this.queueFullName,
131
+ });
104
132
  } catch (error: unknown) {
105
- this.getLogger().error("worker.run.error", { queue: this.queueFullName, error });
133
+ this.getLogger().error("worker.run.error", {
134
+ queue: this.queueFullName,
135
+ error,
136
+ });
106
137
  throw error;
107
138
  }
108
139
  }
@@ -113,7 +144,9 @@ abstract class Worker<T = JobData> {
113
144
  // on completed: allow to do something else after a job is completed
114
145
  this.worker.on("completed", (job: Job<T>) => this.processCompleted(job));
115
146
  // on failed: when the process fails with an exception it is possible to listen for the "failed" event
116
- this.worker.on("failed", (job: Job<T>, error: Error) => this.processFailed(job, error));
147
+ this.worker.on("failed", (job: Job<T>, error: Error) =>
148
+ this.processFailed(job, error)
149
+ );
117
150
  }
118
151
 
119
152
  protected get worker(): RawWorker {
@@ -0,0 +1,25 @@
1
+ import cuid from "cuid";
2
+ import { appIdentifier } from "../helpers/appIdentifier";
3
+ import { Job, JobData } from "bullmq";
4
+ import { WorkerContext } from "../worker/worker";
5
+
6
+ export function withContext<T = JobData>(
7
+ workerContext: WorkerContext,
8
+ executor: (job: Job<T>) => Promise<void>
9
+ ): (job: Job<T>) => Promise<void> {
10
+ return (job) => {
11
+ const { lid, lch } = job.data as { lid?: string; lch?: string };
12
+ return workerContext.sharedContext.run(
13
+ async () => {
14
+ return executor(job);
15
+ },
16
+ {
17
+ logger: workerContext.baseLogger,
18
+ audit: workerContext.audit.withState(),
19
+ lifecycleId: lid || cuid(),
20
+ lifecycleChain: lch || appIdentifier(),
21
+ contextId: cuid(),
22
+ }
23
+ );
24
+ };
25
+ }