redis-smq 7.0.1 → 7.0.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 7.0.5 (2022-07-20)
4
+
5
+ * Remove code redundancies (55eec79)
6
+ * Update event listeners docs (e308848)
7
+ * Refactor IEventListener interface, clean up (14dbf30)
8
+
9
+ ## 7.0.4 (2022-07-14)
10
+
11
+ * Fix dev dependencies (e42d072)
12
+ * Update installation info (12c6170)
13
+ * Make redis-smq-common as a peer dependency (ade08af)
14
+
15
+ ## 7.0.3 (2022-07-13)
16
+
17
+ * Fix consuming-messages/test00012 (4c9dfb8)
18
+
19
+ ## 7.0.2 (2022-07-13)
20
+
21
+ * Bump up redis-smq-common to v1.0.1 (e3fbb10)
22
+ * Bump up typescript to v4.7.4 (0f69254)
23
+ * Fix npm vulnerability warnings (9925be0)
24
+ * Clean up examples (72ea0fb)
25
+
3
26
  ## 7.0.1 (2022-06-18)
4
27
 
5
28
  * Update migrating.md (9065d5f)
package/README.md CHANGED
@@ -76,7 +76,7 @@ things more simple to use and removing any confusions that can occur while worki
76
76
  ## Installation
77
77
 
78
78
  ```text
79
- npm install redis-smq --save
79
+ npm install redis-smq-common redis-smq --save
80
80
  ```
81
81
 
82
82
  Considerations:
@@ -82,5 +82,5 @@ export declare const redisKeys: {
82
82
  };
83
83
  getMainKeys(): Record<"keyQueues" | "keyProcessingQueues" | "keyHeartbeats" | "keyHeartbeatConsumerWeight" | "keyScheduledMessages" | "keyScheduledMessageWeight" | "keyLockConsumerWorkersRunner" | "keyDelayedMessages" | "keyRequeueMessages" | "keyNamespaces" | "keyQueueSettingsRateLimit" | "keyQueueSettingsPriorityQueuing", string>;
84
84
  validateNamespace(ns: string): string;
85
- validateRedisKey(key?: string | undefined): string;
85
+ validateRedisKey(key?: string): string;
86
86
  };
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from 'events';
3
- import { IConfig, IRequiredConfig } from '../../types';
3
+ import { IConfig, IEventListener, IRequiredConfig } from '../../types';
4
4
  import { PowerManager, RedisClient } from 'redis-smq-common';
5
5
  import { ICallback, ICompatibleLogger, TFunction, TUnaryFunction } from 'redis-smq-common/dist/types';
6
6
  export declare abstract class Base extends EventEmitter {
@@ -9,15 +9,18 @@ export declare abstract class Base extends EventEmitter {
9
9
  protected sharedRedisClient: RedisClient | null;
10
10
  protected logger: ICompatibleLogger;
11
11
  protected config: IRequiredConfig;
12
+ protected eventListeners: IEventListener[];
12
13
  constructor(config: IConfig);
13
14
  protected setUpSharedRedisClient: (cb: ICallback<void>) => void;
14
15
  protected tearDownSharedRedisClient: (cb: ICallback<void>) => void;
15
- protected registerEventsHandlers(): void;
16
+ protected registerSystemEventListeners(): void;
16
17
  protected goingUp(): TFunction[];
17
18
  protected up(cb?: ICallback<boolean>): void;
18
19
  protected goingDown(): TUnaryFunction<ICallback<void>>[];
19
20
  protected down(cb?: ICallback<boolean>): void;
20
21
  protected getSharedRedisClient(): RedisClient;
22
+ protected registerEventListeners(Ctors: (new () => IEventListener)[], cb: ICallback<void>): void;
23
+ protected tearDownEventListeners: (cb: ICallback<void>) => void;
21
24
  handleError(err: Error): void;
22
25
  run(cb?: ICallback<boolean>): void;
23
26
  shutdown(cb?: ICallback<boolean>): void;
@@ -10,6 +10,7 @@ class Base extends events_1.EventEmitter {
10
10
  constructor(config) {
11
11
  super();
12
12
  this.sharedRedisClient = null;
13
+ this.eventListeners = [];
13
14
  this.setUpSharedRedisClient = (cb) => {
14
15
  (0, redis_smq_common_1.createClientInstance)(this.config.redis, (err, client) => {
15
16
  if (err)
@@ -32,13 +33,23 @@ class Base extends events_1.EventEmitter {
32
33
  else
33
34
  cb();
34
35
  };
36
+ this.tearDownEventListeners = (cb) => {
37
+ redis_smq_common_1.async.each(this.eventListeners, (listener, index, done) => listener.quit(done), (err) => {
38
+ if (err)
39
+ cb(err);
40
+ else {
41
+ this.eventListeners = [];
42
+ cb();
43
+ }
44
+ });
45
+ };
35
46
  this.id = (0, uuid_1.v4)();
36
47
  this.powerManager = new redis_smq_common_1.PowerManager(false);
37
48
  this.config = (0, configuration_1.getConfiguration)(config);
38
49
  this.logger = redis_smq_common_1.logger.getNamespacedLogger(this.config.logger, `${this.constructor.name.toLowerCase()}:${this.id}`);
39
- this.registerEventsHandlers();
50
+ this.registerSystemEventListeners();
40
51
  }
41
- registerEventsHandlers() {
52
+ registerSystemEventListeners() {
42
53
  this.on(events_2.events.GOING_UP, () => this.logger.info(`Going up...`));
43
54
  this.on(events_2.events.UP, () => this.logger.info(`Up and running...`));
44
55
  this.on(events_2.events.GOING_DOWN, () => this.logger.info(`Going down...`));
@@ -54,7 +65,7 @@ class Base extends events_1.EventEmitter {
54
65
  cb && cb(null, true);
55
66
  }
56
67
  goingDown() {
57
- return [this.tearDownSharedRedisClient];
68
+ return [this.tearDownEventListeners, this.tearDownSharedRedisClient];
58
69
  }
59
70
  down(cb) {
60
71
  this.powerManager.commit();
@@ -66,6 +77,23 @@ class Base extends events_1.EventEmitter {
66
77
  throw new redis_smq_common_1.errors.PanicError('Expected an instance of RedisClient');
67
78
  return this.sharedRedisClient;
68
79
  }
80
+ registerEventListeners(Ctors, cb) {
81
+ redis_smq_common_1.async.eachOf(Ctors, (ctor, key, done) => {
82
+ const instance = new ctor();
83
+ instance.init({
84
+ instanceId: this.id,
85
+ eventProvider: this,
86
+ config: this.getConfig(),
87
+ }, (err) => {
88
+ if (err)
89
+ done(err);
90
+ else {
91
+ this.eventListeners.push(instance);
92
+ done();
93
+ }
94
+ });
95
+ }, cb);
96
+ }
69
97
  handleError(err) {
70
98
  if (this.powerManager.isGoingUp() || this.powerManager.isRunning()) {
71
99
  throw err;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { IEventListener, IRequiredConfig, TConsumerMessageHandler, TQueueParams } from '../../../../types';
2
+ import { IRequiredConfig, TConsumerMessageHandler, TQueueParams } from '../../../../types';
3
3
  import { EventEmitter } from 'events';
4
4
  import { TCleanUpStatus } from './processing-queue';
5
5
  import { DequeueMessage } from './dequeue-message';
@@ -19,12 +19,9 @@ export declare class MessageHandler extends EventEmitter {
19
19
  protected dequeueMessage: DequeueMessage;
20
20
  protected consumeMessage: ConsumeMessage;
21
21
  protected handler: TConsumerMessageHandler;
22
- protected eventListeners: IEventListener[];
23
22
  constructor(consumer: Consumer, queue: TQueueParams, handler: TConsumerMessageHandler, dequeueRedisClient: RedisClient, sharedRedisClient: RedisClient, logger: ICompatibleLogger);
24
23
  protected registerEventsHandlers(): void;
25
- protected initEventListeners(): void;
26
24
  protected cleanUp(cb: ICallback<void>): void;
27
- protected tearDownEventListeners(cb: ICallback<void>): void;
28
25
  handleError(err: Error): void;
29
26
  dequeue(): void;
30
27
  run(cb: ICallback<void>): void;
@@ -10,11 +10,9 @@ const dequeue_message_1 = require("./dequeue-message");
10
10
  const consume_message_1 = require("./consume-message");
11
11
  const redis_smq_common_1 = require("redis-smq-common");
12
12
  const retry_message_1 = require("./retry-message");
13
- const event_provider_1 = require("../../../common/event-listeners/event-provider");
14
13
  class MessageHandler extends events_2.EventEmitter {
15
14
  constructor(consumer, queue, handler, dequeueRedisClient, sharedRedisClient, logger) {
16
15
  super();
17
- this.eventListeners = [];
18
16
  this.id = (0, uuid_1.v4)();
19
17
  this.consumer = consumer;
20
18
  this.consumerId = consumer.getId();
@@ -27,7 +25,6 @@ class MessageHandler extends events_2.EventEmitter {
27
25
  this.dequeueMessage = new dequeue_message_1.DequeueMessage(this, dequeueRedisClient);
28
26
  this.consumeMessage = new consume_message_1.ConsumeMessage(this, dequeueRedisClient, logger);
29
27
  this.registerEventsHandlers();
30
- this.initEventListeners();
31
28
  }
32
29
  registerEventsHandlers() {
33
30
  this.on(events_1.events.UP, () => {
@@ -58,12 +55,6 @@ class MessageHandler extends events_2.EventEmitter {
58
55
  });
59
56
  this.on(events_1.events.DOWN, () => this.logger.info('Down.'));
60
57
  }
61
- initEventListeners() {
62
- this.getConfig().eventListeners.consumerEventListeners.forEach((ctor) => {
63
- const plugin = new ctor(this.sharedRedisClient, this.consumerId, this.queue, new event_provider_1.EventProvider(this));
64
- this.eventListeners.push(plugin);
65
- });
66
- }
67
58
  cleanUp(cb) {
68
59
  MessageHandler.cleanUp(this.getConfig(), this.sharedRedisClient, this.consumerId, this.queue, undefined, (err, reply) => {
69
60
  if (err)
@@ -78,16 +69,6 @@ class MessageHandler extends events_2.EventEmitter {
78
69
  cb();
79
70
  });
80
71
  }
81
- tearDownEventListeners(cb) {
82
- redis_smq_common_1.async.each(this.eventListeners, (listener, index, done) => listener.quit(done), (err) => {
83
- if (err)
84
- cb(err);
85
- else {
86
- this.eventListeners = [];
87
- cb();
88
- }
89
- });
90
- }
91
72
  handleError(err) {
92
73
  if (this.powerManager.isRunning() || this.powerManager.isGoingUp()) {
93
74
  this.emit(events_1.events.ERROR, err);
@@ -113,7 +94,6 @@ class MessageHandler extends events_2.EventEmitter {
113
94
  this.powerManager.goingDown();
114
95
  redis_smq_common_1.async.waterfall([
115
96
  (cb) => this.dequeueMessage.quit(cb),
116
- (cb) => this.tearDownEventListeners(cb),
117
97
  (cb) => this.cleanUp(cb),
118
98
  (cb) => this.dequeueRedisClient.halt(cb),
119
99
  ], (err) => {
@@ -23,7 +23,6 @@ class MultiplexedMessageHandler extends message_handler_1.MessageHandler {
23
23
  this.powerManager.goingDown();
24
24
  redis_smq_common_1.async.waterfall([
25
25
  (cb) => this.dequeueMessage.quit(cb),
26
- (cb) => this.tearDownEventListeners(cb),
27
26
  (cb) => this.cleanUp(cb),
28
27
  ], (err) => {
29
28
  if (err)
@@ -13,6 +13,7 @@ export declare class Consumer extends Base {
13
13
  protected setUpHeartbeat: (cb: ICallback<void>) => void;
14
14
  protected tearDownHeartbeat: (cb: ICallback<void>) => void;
15
15
  protected setUpConsumerWorkers: (cb: ICallback<void>) => void;
16
+ protected initConsumerEventListeners: (cb: ICallback<void>) => void;
16
17
  protected tearDownConsumerWorkers: (cb: ICallback<void>) => void;
17
18
  protected runMessageHandlers: (cb: ICallback<void>) => void;
18
19
  protected shutdownMessageHandlers: (cb: ICallback<void>) => void;
@@ -55,6 +55,9 @@ class Consumer extends base_1.Base {
55
55
  this.workerRunner.addWorker(new schedule_worker_1.default(redisClient, true));
56
56
  this.workerRunner.run();
57
57
  };
58
+ this.initConsumerEventListeners = (cb) => {
59
+ this.registerEventListeners(this.config.eventListeners.consumerEventListeners, cb);
60
+ };
58
61
  this.tearDownConsumerWorkers = (cb) => {
59
62
  if (this.workerRunner) {
60
63
  this.workerRunner.quit(() => {
@@ -87,6 +90,7 @@ class Consumer extends base_1.Base {
87
90
  .goingUp()
88
91
  .concat([
89
92
  this.setUpHeartbeat,
93
+ this.initConsumerEventListeners,
90
94
  this.runMessageHandlers,
91
95
  this.setUpConsumerWorkers,
92
96
  ]);
@@ -1,14 +1,12 @@
1
- import { IConfig, IEventListener } from '../../../types';
1
+ import { IConfig } from '../../../types';
2
2
  import { Message } from '../message/message';
3
3
  import { Base } from '../base';
4
4
  import { RedisClient } from 'redis-smq-common';
5
5
  import { ICallback, TUnaryFunction } from 'redis-smq-common/dist/types';
6
6
  export declare class Producer extends Base {
7
- protected eventListeners: IEventListener[];
8
7
  constructor(config?: IConfig);
9
- protected initEventListeners: (cb: ICallback<void>) => void;
8
+ protected initProducerEventListeners: (cb: ICallback<void>) => void;
10
9
  protected goingUp(): TUnaryFunction<ICallback<void>>[];
11
- protected goingDown(): TUnaryFunction<ICallback<void>>[];
12
10
  protected enqueue(redisClient: RedisClient, message: Message, cb: ICallback<void>): void;
13
11
  produce(message: Message, cb: ICallback<void>): void;
14
12
  }
@@ -11,32 +11,16 @@ const message_already_published_error_1 = require("./errors/message-already-publ
11
11
  const redis_client_1 = require("../../common/redis-client/redis-client");
12
12
  const schedule_message_1 = require("./schedule-message");
13
13
  const queue_1 = require("../queue-manager/queue");
14
- const event_provider_1 = require("../../common/event-listeners/event-provider");
15
14
  class Producer extends base_1.Base {
16
15
  constructor(config = {}) {
17
16
  super(config);
18
- this.eventListeners = [];
19
- this.initEventListeners = (cb) => {
20
- const sharedRedisClient = this.getSharedRedisClient();
21
- this.config.eventListeners.producerEventListeners.forEach((ctor) => this.eventListeners.push(new ctor(sharedRedisClient, this.id, new event_provider_1.EventProvider(this))));
22
- cb();
17
+ this.initProducerEventListeners = (cb) => {
18
+ this.registerEventListeners(this.config.eventListeners.producerEventListeners, cb);
23
19
  };
24
20
  this.run();
25
21
  }
26
22
  goingUp() {
27
- return super.goingUp().concat([this.initEventListeners]);
28
- }
29
- goingDown() {
30
- return [
31
- (cb) => redis_smq_common_1.async.each(this.eventListeners, (listener, idx, done) => listener.quit(done), (err) => {
32
- if (err)
33
- cb(err);
34
- else {
35
- this.eventListeners = [];
36
- cb();
37
- }
38
- }),
39
- ].concat(super.goingDown());
23
+ return super.goingUp().concat([this.initProducerEventListeners]);
40
24
  }
41
25
  enqueue(redisClient, message, cb) {
42
26
  var _a;
@@ -1,16 +1,18 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { Message } from '../src/lib/message/message';
3
4
  import { redisKeys } from '../src/common/redis-keys/redis-keys';
4
5
  import { ICallback, TLoggerConfig, TRedisConfig } from 'redis-smq-common/dist/types';
5
- import { RedisClient } from 'redis-smq-common';
6
- export interface IEventProvider {
7
- on(event: string, listener: (...args: any[]) => void): void;
8
- }
6
+ import { EventEmitter } from 'events';
7
+ export declare type TEventListenerInitArgs = {
8
+ eventProvider: EventEmitter;
9
+ config: IRequiredConfig;
10
+ instanceId: string;
11
+ };
9
12
  export interface IEventListener {
13
+ init(args: TEventListenerInitArgs, cb: ICallback<void>): void;
10
14
  quit(cb: ICallback<void>): void;
11
15
  }
12
- export declare type TConsumerEventListenerConstructor = new (redisClient: RedisClient, consumerId: string, queue: TQueueParams, eventProvider: IEventProvider) => IEventListener;
13
- export declare type TProducerEventListenerConstructor = new (redisClient: RedisClient, producerId: string, eventProvider: IEventProvider) => IEventListener;
14
16
  export interface IMessagesConfig {
15
17
  store?: boolean | IMessagesConfigStore;
16
18
  }
@@ -23,8 +25,8 @@ export interface IMessagesConfigStore {
23
25
  deadLettered?: boolean | IMessagesConfigStoreOptions;
24
26
  }
25
27
  export interface IEventListenersConfig {
26
- consumerEventListeners?: TConsumerEventListenerConstructor[];
27
- producerEventListeners?: TProducerEventListenerConstructor[];
28
+ consumerEventListeners?: (new () => IEventListener)[];
29
+ producerEventListeners?: (new () => IEventListener)[];
28
30
  }
29
31
  export interface IConfig {
30
32
  redis?: TRedisConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redis-smq",
3
- "version": "7.0.1",
3
+ "version": "7.0.5",
4
4
  "description": "A simple high-performance Redis message queue for Node.js.",
5
5
  "author": "Weyoss <weyoss@protonmail.com>",
6
6
  "license": "MIT",
@@ -36,9 +36,11 @@
36
36
  "bluebird": "3.7.2",
37
37
  "cron-parser": "3.5.0",
38
38
  "lodash": "4.17.21",
39
- "redis-smq-common": "1.0.0",
40
39
  "uuid": "8.3.2"
41
40
  },
41
+ "peerDependencies": {
42
+ "redis-smq-common": "^1.0.1"
43
+ },
42
44
  "devDependencies": {
43
45
  "@types/bluebird": "3.5.36",
44
46
  "@types/debug": "4.1.7",
@@ -57,11 +59,12 @@
57
59
  "jest": "27.2.4",
58
60
  "lint-staged": "11.1.2",
59
61
  "prettier": "2.4.1",
62
+ "redis-smq-common": "^1.0.1",
60
63
  "supertest": "6.1.6",
61
64
  "ts-jest": "27.0.5",
62
65
  "ts-node": "10.2.1",
63
66
  "type-coverage": "2.19.0",
64
- "typescript": "4.4.3"
67
+ "typescript": "4.7.4"
65
68
  },
66
69
  "scripts": {
67
70
  "build:clean": "rimraf dist",
@@ -1,8 +0,0 @@
1
- /// <reference types="node" />
2
- import { IEventProvider } from '../../../types';
3
- import { EventEmitter } from 'events';
4
- export declare class EventProvider implements IEventProvider {
5
- protected eventEmitter: EventEmitter;
6
- constructor(eventEmitter: EventEmitter);
7
- on(event: string, listener: (...args: any[]) => void): void;
8
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventProvider = void 0;
4
- class EventProvider {
5
- constructor(eventEmitter) {
6
- this.eventEmitter = eventEmitter;
7
- }
8
- on(event, listener) {
9
- this.eventEmitter.on(event, listener);
10
- }
11
- }
12
- exports.EventProvider = EventProvider;
13
- //# sourceMappingURL=event-provider.js.map