redis-smq 7.0.5 → 7.0.6

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,15 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 7.0.6 (2022-08-08)
4
+
5
+ * Improve consumer/producer shutdown handling (36278ce)
6
+ * Update docs (51dfd16)
7
+ * Update examples (208934b)
8
+ * Fix tests (573e340)
9
+ * Add and use ProducerNotRunningError error class (e89facd)
10
+ * Fix a potential MaxListenersExceededWarning exception throwing (011a21b)
11
+ * Make producers to be run manually before producing messages (c989449)
12
+
3
13
  ## 7.0.5 (2022-07-20)
4
14
 
5
15
  * Remove code redundancies (55eec79)
package/README.md CHANGED
@@ -141,25 +141,27 @@ Before publishing a message do not forget to set the destination queue of the me
141
141
  'use strict';
142
142
  const {Message, Producer} = require('redis-smq');
143
143
 
144
- const message = new Message();
145
-
146
- message
147
- .setBody({hello: 'world'})
148
- .setTTL(3600000) // in millis
149
- .setQueue('test_queue');
150
-
151
- message.getId() // null
152
-
153
144
  const producer = new Producer();
154
- producer.produce(message, (err) => {
155
- if (err) console.log(err);
156
- else {
157
- const msgId = message.getId(); // string
158
- console.log('Successfully produced. Message ID is ', msgId);
159
- }
160
- });
145
+ producer.run((err) => {
146
+ if (err) throw err;
147
+ const message = new Message();
148
+ message
149
+ .setBody({hello: 'world'})
150
+ .setTTL(3600000) // in millis
151
+ .setQueue('test_queue');
152
+ message.getId() // null
153
+ producer.produce(message, (err) => {
154
+ if (err) console.log(err);
155
+ else {
156
+ const msgId = message.getId(); // string
157
+ console.log('Successfully produced. Message ID is ', msgId);
158
+ }
159
+ });
160
+ })
161
161
  ```
162
162
 
163
+ Starting with v7.0.6, before producing messages you need first to run your producer instance.
164
+
163
165
  See [Producer Reference](/docs/api/producer.md) for more details.
164
166
 
165
167
  #### Consumer Class
@@ -1,40 +1,62 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const __1 = require("../..");
4
3
  const redis_smq_common_1 = require("redis-smq-common");
5
- redis_smq_common_1.logger.setLogger(console);
6
- const config = {
7
- logger: {
8
- enabled: false,
9
- },
10
- messages: {
11
- store: true,
12
- },
13
- };
14
- const producer = new __1.Producer(config);
15
- const consumer = new __1.Consumer(config);
16
- consumer.run();
17
- const produce = (err) => {
4
+ const __1 = require("../..");
5
+ const events_1 = require("../../src/common/events/events");
6
+ const queue = `queue_${Date.now()}`;
7
+ const producer = new __1.Producer();
8
+ const produceForever = (err) => {
18
9
  if (err)
19
10
  console.log(err);
20
11
  else {
21
- setTimeout(() => {
22
- const m = new __1.Message().setBody(Date.now()).setQueue(queue);
23
- producer.produce(m, produce);
24
- }, 1000);
12
+ if (producer.isGoingUp() || producer.isRunning()) {
13
+ const message = new __1.Message().setBody('some data').setQueue(queue);
14
+ producer.produce(message, produceForever);
15
+ }
25
16
  }
26
17
  };
27
- const queue = `queue_${Date.now()}`;
28
- __1.QueueManager.createInstance(config, (err, queueManager) => {
18
+ const consumer = new __1.Consumer();
19
+ consumer.consume(queue, (message, cb) => cb(), (err) => err && console.log(err));
20
+ consumer.on(events_1.events.UP, () => {
21
+ console.log('UP');
22
+ });
23
+ consumer.on(events_1.events.DOWN, () => {
24
+ console.log('DOWN');
25
+ });
26
+ const serialOnOff = (cb) => redis_smq_common_1.async.waterfall([
27
+ (cb) => consumer.run((err) => cb(err)),
28
+ (cb) => consumer.shutdown((err) => cb(err)),
29
+ (cb) => consumer.run((err) => cb(err)),
30
+ (cb) => consumer.shutdown((err) => cb(err)),
31
+ (cb) => consumer.run((err) => cb(err)),
32
+ (cb) => consumer.shutdown((err) => cb(err)),
33
+ (cb) => consumer.run((err) => cb(err)),
34
+ (cb) => consumer.shutdown((err) => cb(err)),
35
+ (cb) => consumer.run((err) => cb(err)),
36
+ (cb) => consumer.shutdown((err) => cb(err)),
37
+ ], cb);
38
+ let queueManager = null;
39
+ redis_smq_common_1.async.waterfall([
40
+ (cb) => __1.QueueManager.createInstance({}, (err, instance) => {
41
+ if (err)
42
+ cb(err);
43
+ else {
44
+ queueManager = instance;
45
+ queueManager === null || queueManager === void 0 ? void 0 : queueManager.queue.create(queue, false, cb);
46
+ }
47
+ }),
48
+ (cb) => producer.run((err) => cb(err)),
49
+ (cb) => {
50
+ produceForever();
51
+ serialOnOff(cb);
52
+ },
53
+ ], (err) => {
29
54
  if (err)
30
55
  console.log(err);
31
56
  else {
32
- queueManager === null || queueManager === void 0 ? void 0 : queueManager.queue.create(queue, false, (err) => {
33
- if (err)
34
- console.log(err);
35
- else
36
- consumer.consume(queue, (msg, cb) => cb(), produce);
37
- });
57
+ producer.shutdown();
58
+ consumer.shutdown();
59
+ queueManager === null || queueManager === void 0 ? void 0 : queueManager.quit(() => void 0);
38
60
  }
39
61
  });
40
62
  //# sourceMappingURL=combined-run.js.map
@@ -10,7 +10,7 @@ export declare abstract class Base extends EventEmitter {
10
10
  protected logger: ICompatibleLogger;
11
11
  protected config: IRequiredConfig;
12
12
  protected eventListeners: IEventListener[];
13
- constructor(config: IConfig);
13
+ constructor(config?: IConfig);
14
14
  protected setUpSharedRedisClient: (cb: ICallback<void>) => void;
15
15
  protected tearDownSharedRedisClient: (cb: ICallback<void>) => void;
16
16
  protected registerSystemEventListeners(): void;
@@ -7,7 +7,7 @@ const events_2 = require("../common/events/events");
7
7
  const configuration_1 = require("../config/configuration");
8
8
  const redis_smq_common_1 = require("redis-smq-common");
9
9
  class Base extends events_1.EventEmitter {
10
- constructor(config) {
10
+ constructor(config = {}) {
11
11
  super();
12
12
  this.sharedRedisClient = null;
13
13
  this.eventListeners = [];
@@ -100,46 +100,36 @@ class Base extends events_1.EventEmitter {
100
100
  }
101
101
  }
102
102
  run(cb) {
103
- if (this.powerManager.isGoingDown()) {
104
- this.once(events_2.events.DOWN, () => this.run(cb));
103
+ const r = this.powerManager.goingUp();
104
+ if (r) {
105
+ this.emit(events_2.events.GOING_UP);
106
+ const tasks = this.goingUp();
107
+ redis_smq_common_1.async.waterfall(tasks, (err) => {
108
+ if (err) {
109
+ if (cb)
110
+ cb(err);
111
+ else
112
+ this.emit(events_2.events.ERROR, err);
113
+ }
114
+ else
115
+ this.up(cb);
116
+ });
105
117
  }
106
118
  else {
107
- const r = this.powerManager.goingUp();
108
- if (r) {
109
- this.emit(events_2.events.GOING_UP);
110
- const tasks = this.goingUp();
111
- redis_smq_common_1.async.waterfall(tasks, (err) => {
112
- if (err) {
113
- if (cb)
114
- cb(err);
115
- else
116
- this.emit(events_2.events.ERROR, err);
117
- }
118
- else
119
- this.up(cb);
120
- });
121
- }
122
- else {
123
- cb && cb(null, r);
124
- }
119
+ cb && cb(null, r);
125
120
  }
126
121
  }
127
122
  shutdown(cb) {
128
- if (this.powerManager.isGoingUp()) {
129
- this.once(events_2.events.UP, () => this.shutdown(cb));
130
- }
131
- else {
132
- const r = this.powerManager.goingDown();
133
- if (r) {
134
- this.emit(events_2.events.GOING_DOWN);
135
- const tasks = this.goingDown();
136
- redis_smq_common_1.async.waterfall(tasks, () => {
137
- this.down(cb);
138
- });
139
- }
140
- else
141
- cb && cb(null, r);
123
+ const r = this.powerManager.goingDown();
124
+ if (r) {
125
+ this.emit(events_2.events.GOING_DOWN);
126
+ const tasks = this.goingDown();
127
+ redis_smq_common_1.async.waterfall(tasks, () => {
128
+ this.down(cb);
129
+ });
142
130
  }
131
+ else
132
+ cb && cb(null, r);
143
133
  }
144
134
  isRunning() {
145
135
  return this.powerManager.isRunning();
@@ -0,0 +1,4 @@
1
+ import { errors } from 'redis-smq-common';
2
+ export declare class ProducerNotRunningError extends errors.RedisSMQError {
3
+ constructor(msg?: string);
4
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProducerNotRunningError = void 0;
4
+ const redis_smq_common_1 = require("redis-smq-common");
5
+ class ProducerNotRunningError extends redis_smq_common_1.errors.RedisSMQError {
6
+ constructor(msg = `Producer instance is not running. Before producing messages you need to run your producer instance.`) {
7
+ super(msg);
8
+ }
9
+ }
10
+ exports.ProducerNotRunningError = ProducerNotRunningError;
11
+ //# sourceMappingURL=producer-not-running.error.js.map
@@ -1,10 +1,8 @@
1
- import { IConfig } from '../../../types';
2
1
  import { Message } from '../message/message';
3
2
  import { Base } from '../base';
4
3
  import { RedisClient } from 'redis-smq-common';
5
4
  import { ICallback, TUnaryFunction } from 'redis-smq-common/dist/types';
6
5
  export declare class Producer extends Base {
7
- constructor(config?: IConfig);
8
6
  protected initProducerEventListeners: (cb: ICallback<void>) => void;
9
7
  protected goingUp(): TUnaryFunction<ICallback<void>>[];
10
8
  protected enqueue(redisClient: RedisClient, message: Message, cb: ICallback<void>): void;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Producer = void 0;
4
4
  const events_1 = require("../../common/events/events");
5
5
  const base_1 = require("../base");
6
- const redis_smq_common_1 = require("redis-smq-common");
7
6
  const redis_keys_1 = require("../../common/redis-keys/redis-keys");
8
7
  const message_not_published_error_1 = require("./errors/message-not-published.error");
9
8
  const message_queue_required_error_1 = require("./errors/message-queue-required.error");
@@ -11,13 +10,13 @@ const message_already_published_error_1 = require("./errors/message-already-publ
11
10
  const redis_client_1 = require("../../common/redis-client/redis-client");
12
11
  const schedule_message_1 = require("./schedule-message");
13
12
  const queue_1 = require("../queue-manager/queue");
13
+ const producer_not_running_error_1 = require("./errors/producer-not-running.error");
14
14
  class Producer extends base_1.Base {
15
- constructor(config = {}) {
16
- super(config);
15
+ constructor() {
16
+ super(...arguments);
17
17
  this.initProducerEventListeners = (cb) => {
18
18
  this.registerEventListeners(this.config.eventListeners.producerEventListeners, cb);
19
19
  };
20
- this.run();
21
20
  }
22
21
  goingUp() {
23
22
  return super.goingUp().concat([this.initProducerEventListeners]);
@@ -55,18 +54,20 @@ class Producer extends base_1.Base {
55
54
  cb(new message_already_published_error_1.MessageAlreadyPublishedError());
56
55
  }
57
56
  else {
58
- const queueParams = queue_1.Queue.getParams(this.config, queue);
59
- message.setQueue(queueParams);
60
- const messageId = message.getSetMetadata().getId();
61
- const callback = (err) => {
62
- if (err)
63
- cb(err);
64
- else {
65
- this.emit(events_1.events.MESSAGE_PUBLISHED, message);
66
- cb();
67
- }
68
- };
69
- const proceed = () => {
57
+ if (!this.powerManager.isUp())
58
+ cb(new producer_not_running_error_1.ProducerNotRunningError());
59
+ else {
60
+ const queueParams = queue_1.Queue.getParams(this.config, queue);
61
+ message.setQueue(queueParams);
62
+ const messageId = message.getSetMetadata().getId();
63
+ const callback = (err) => {
64
+ if (err)
65
+ cb(err);
66
+ else {
67
+ this.emit(events_1.events.MESSAGE_PUBLISHED, message);
68
+ cb();
69
+ }
70
+ };
70
71
  const redisClient = this.getSharedRedisClient();
71
72
  if (message.isSchedulable()) {
72
73
  (0, schedule_message_1.scheduleMessage)(redisClient, message, (err) => {
@@ -88,17 +89,7 @@ class Producer extends base_1.Base {
88
89
  }
89
90
  });
90
91
  }
91
- };
92
- if (!this.powerManager.isUp()) {
93
- if (this.powerManager.isGoingUp()) {
94
- this.once(events_1.events.UP, proceed);
95
- }
96
- else {
97
- cb(new redis_smq_common_1.errors.PanicError(`Producer ID ${this.getId()} is not running`));
98
- }
99
92
  }
100
- else
101
- proceed();
102
93
  }
103
94
  }
104
95
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redis-smq",
3
- "version": "7.0.5",
3
+ "version": "7.0.6",
4
4
  "description": "A simple high-performance Redis message queue for Node.js.",
5
5
  "author": "Weyoss <weyoss@protonmail.com>",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- export {};
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const redis_smq_common_1 = require("redis-smq-common");
4
- const __1 = require("../..");
5
- const events_1 = require("../../src/common/events/events");
6
- const queue = `queue_${Date.now()}`;
7
- const producer = new __1.Producer();
8
- const produceForever = (err) => {
9
- if (err)
10
- console.log(err);
11
- else {
12
- if (producer.isGoingUp() || producer.isRunning()) {
13
- const message = new __1.Message().setBody('some data').setQueue(queue);
14
- producer.produce(message, produceForever);
15
- }
16
- }
17
- };
18
- const consumer = new __1.Consumer();
19
- consumer.consume(queue, (message, cb) => cb(), (err) => err && console.log(err));
20
- consumer.on(events_1.events.UP, () => {
21
- console.log('UP');
22
- });
23
- consumer.on(events_1.events.DOWN, () => {
24
- console.log('DOWN');
25
- });
26
- const serialOnOff = (cb) => redis_smq_common_1.async.waterfall([
27
- (cb) => consumer.run((err) => cb(err)),
28
- (cb) => consumer.shutdown((err) => cb(err)),
29
- (cb) => consumer.run((err) => cb(err)),
30
- (cb) => consumer.shutdown((err) => cb(err)),
31
- (cb) => consumer.run((err) => cb(err)),
32
- (cb) => consumer.shutdown((err) => cb(err)),
33
- (cb) => consumer.run((err) => cb(err)),
34
- (cb) => consumer.shutdown((err) => cb(err)),
35
- (cb) => consumer.run((err) => cb(err)),
36
- (cb) => consumer.shutdown((err) => cb(err)),
37
- ], cb);
38
- redis_smq_common_1.async.waterfall([
39
- (cb) => __1.QueueManager.createInstance({}, (err, queueManager) => {
40
- if (err)
41
- cb(err);
42
- else
43
- queueManager === null || queueManager === void 0 ? void 0 : queueManager.queue.create(queue, false, cb);
44
- }),
45
- (cb) => {
46
- produceForever();
47
- serialOnOff(cb);
48
- },
49
- ], (err) => {
50
- if (err)
51
- console.log(err);
52
- else {
53
- producer.shutdown();
54
- consumer.shutdown();
55
- __1.QueueManager.createInstance({}, (err, queueManager) => queueManager === null || queueManager === void 0 ? void 0 : queueManager.quit(() => void 0));
56
- }
57
- });
58
- //# sourceMappingURL=on-off.js.map