redis-smq 7.0.4 → 7.0.7
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 +21 -0
- package/README.md +18 -16
- package/dist/misc/health-check/combined-run.js +48 -26
- package/dist/src/lib/base.d.ts +6 -3
- package/dist/src/lib/base.js +56 -38
- package/dist/src/lib/consumer/consumer-message-handler/message-handler.d.ts +1 -4
- package/dist/src/lib/consumer/consumer-message-handler/message-handler.js +0 -20
- package/dist/src/lib/consumer/consumer-message-handler/multiplexed-message-handler/multiplexed-message-handler.js +0 -1
- package/dist/src/lib/consumer/consumer.d.ts +1 -0
- package/dist/src/lib/consumer/consumer.js +4 -0
- package/dist/src/lib/producer/errors/producer-not-running.error.d.ts +4 -0
- package/dist/src/lib/producer/errors/producer-not-running.error.js +11 -0
- package/dist/src/lib/producer/producer.d.ts +1 -5
- package/dist/src/lib/producer/producer.js +20 -45
- package/dist/types/index.d.ts +10 -8
- package/package.json +3 -3
- package/dist/misc/health-check/on-off.d.ts +0 -1
- package/dist/misc/health-check/on-off.js +0 -58
- package/dist/src/common/event-listeners/event-provider.d.ts +0 -8
- package/dist/src/common/event-listeners/event-provider.js +0 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 7.0.7 (2022-08-10)
|
|
4
|
+
|
|
5
|
+
* Bump up redis-smq-common to v1.0.2 (ff385ad)
|
|
6
|
+
* Update docs (3871e8f)
|
|
7
|
+
|
|
8
|
+
## 7.0.6 (2022-08-08)
|
|
9
|
+
|
|
10
|
+
* Improve consumer/producer shutdown handling (36278ce)
|
|
11
|
+
* Update docs (51dfd16)
|
|
12
|
+
* Update examples (208934b)
|
|
13
|
+
* Fix tests (573e340)
|
|
14
|
+
* Add and use ProducerNotRunningError error class (e89facd)
|
|
15
|
+
* Fix a potential MaxListenersExceededWarning exception throwing (011a21b)
|
|
16
|
+
* Make producers to be run manually before producing messages (c989449)
|
|
17
|
+
|
|
18
|
+
## 7.0.5 (2022-07-20)
|
|
19
|
+
|
|
20
|
+
* Remove code redundancies (55eec79)
|
|
21
|
+
* Update event listeners docs (e308848)
|
|
22
|
+
* Refactor IEventListener interface, clean up (14dbf30)
|
|
23
|
+
|
|
3
24
|
## 7.0.4 (2022-07-14)
|
|
4
25
|
|
|
5
26
|
* Fix dev dependencies (e42d072)
|
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.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
22
|
-
const
|
|
23
|
-
producer.produce(
|
|
24
|
-
}
|
|
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
|
|
28
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
package/dist/src/lib/base.d.ts
CHANGED
|
@@ -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
|
-
|
|
12
|
+
protected eventListeners: IEventListener[];
|
|
13
|
+
constructor(config?: IConfig);
|
|
13
14
|
protected setUpSharedRedisClient: (cb: ICallback<void>) => void;
|
|
14
15
|
protected tearDownSharedRedisClient: (cb: ICallback<void>) => void;
|
|
15
|
-
protected
|
|
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;
|
package/dist/src/lib/base.js
CHANGED
|
@@ -7,9 +7,10 @@ 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
|
+
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.
|
|
50
|
+
this.registerSystemEventListeners();
|
|
40
51
|
}
|
|
41
|
-
|
|
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,52 +77,59 @@ 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;
|
|
72
100
|
}
|
|
73
101
|
}
|
|
74
102
|
run(cb) {
|
|
75
|
-
|
|
76
|
-
|
|
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
|
+
});
|
|
77
117
|
}
|
|
78
118
|
else {
|
|
79
|
-
|
|
80
|
-
if (r) {
|
|
81
|
-
this.emit(events_2.events.GOING_UP);
|
|
82
|
-
const tasks = this.goingUp();
|
|
83
|
-
redis_smq_common_1.async.waterfall(tasks, (err) => {
|
|
84
|
-
if (err) {
|
|
85
|
-
if (cb)
|
|
86
|
-
cb(err);
|
|
87
|
-
else
|
|
88
|
-
this.emit(events_2.events.ERROR, err);
|
|
89
|
-
}
|
|
90
|
-
else
|
|
91
|
-
this.up(cb);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
cb && cb(null, r);
|
|
96
|
-
}
|
|
119
|
+
cb && cb(null, r);
|
|
97
120
|
}
|
|
98
121
|
}
|
|
99
122
|
shutdown(cb) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const tasks = this.goingDown();
|
|
108
|
-
redis_smq_common_1.async.waterfall(tasks, () => {
|
|
109
|
-
this.down(cb);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
else
|
|
113
|
-
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
|
+
});
|
|
114
130
|
}
|
|
131
|
+
else
|
|
132
|
+
cb && cb(null, r);
|
|
115
133
|
}
|
|
116
134
|
isRunning() {
|
|
117
135
|
return this.powerManager.isRunning();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import {
|
|
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
|
]);
|
|
@@ -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,14 +1,10 @@
|
|
|
1
|
-
import { IConfig, IEventListener } 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
|
-
protected
|
|
8
|
-
constructor(config?: IConfig);
|
|
9
|
-
protected initEventListeners: (cb: ICallback<void>) => void;
|
|
6
|
+
protected initProducerEventListeners: (cb: ICallback<void>) => void;
|
|
10
7
|
protected goingUp(): TUnaryFunction<ICallback<void>>[];
|
|
11
|
-
protected goingDown(): TUnaryFunction<ICallback<void>>[];
|
|
12
8
|
protected enqueue(redisClient: RedisClient, message: Message, cb: ICallback<void>): void;
|
|
13
9
|
produce(message: Message, cb: ICallback<void>): void;
|
|
14
10
|
}
|
|
@@ -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,32 +10,16 @@ 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");
|
|
14
|
-
const
|
|
13
|
+
const producer_not_running_error_1 = require("./errors/producer-not-running.error");
|
|
15
14
|
class Producer extends base_1.Base {
|
|
16
|
-
constructor(
|
|
17
|
-
super(
|
|
18
|
-
this.
|
|
19
|
-
|
|
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();
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.initProducerEventListeners = (cb) => {
|
|
18
|
+
this.registerEventListeners(this.config.eventListeners.producerEventListeners, cb);
|
|
23
19
|
};
|
|
24
|
-
this.run();
|
|
25
20
|
}
|
|
26
21
|
goingUp() {
|
|
27
|
-
return super.goingUp().concat([this.
|
|
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());
|
|
22
|
+
return super.goingUp().concat([this.initProducerEventListeners]);
|
|
40
23
|
}
|
|
41
24
|
enqueue(redisClient, message, cb) {
|
|
42
25
|
var _a;
|
|
@@ -71,18 +54,20 @@ class Producer extends base_1.Base {
|
|
|
71
54
|
cb(new message_already_published_error_1.MessageAlreadyPublishedError());
|
|
72
55
|
}
|
|
73
56
|
else {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
+
};
|
|
86
71
|
const redisClient = this.getSharedRedisClient();
|
|
87
72
|
if (message.isSchedulable()) {
|
|
88
73
|
(0, schedule_message_1.scheduleMessage)(redisClient, message, (err) => {
|
|
@@ -104,17 +89,7 @@ class Producer extends base_1.Base {
|
|
|
104
89
|
}
|
|
105
90
|
});
|
|
106
91
|
}
|
|
107
|
-
};
|
|
108
|
-
if (!this.powerManager.isUp()) {
|
|
109
|
-
if (this.powerManager.isGoingUp()) {
|
|
110
|
-
this.once(events_1.events.UP, proceed);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
cb(new redis_smq_common_1.errors.PanicError(`Producer ID ${this.getId()} is not running`));
|
|
114
|
-
}
|
|
115
92
|
}
|
|
116
|
-
else
|
|
117
|
-
proceed();
|
|
118
93
|
}
|
|
119
94
|
}
|
|
120
95
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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 {
|
|
6
|
-
export
|
|
7
|
-
|
|
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?:
|
|
27
|
-
producerEventListeners?:
|
|
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.
|
|
3
|
+
"version": "7.0.7",
|
|
4
4
|
"description": "A simple high-performance Redis message queue for Node.js.",
|
|
5
5
|
"author": "Weyoss <weyoss@protonmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"uuid": "8.3.2"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"redis-smq-common": "^1.0.
|
|
42
|
+
"redis-smq-common": "^1.0.2"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/bluebird": "3.5.36",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"jest": "27.2.4",
|
|
60
60
|
"lint-staged": "11.1.2",
|
|
61
61
|
"prettier": "2.4.1",
|
|
62
|
-
"redis-smq-common": "^1.0.
|
|
62
|
+
"redis-smq-common": "^1.0.2",
|
|
63
63
|
"supertest": "6.1.6",
|
|
64
64
|
"ts-jest": "27.0.5",
|
|
65
65
|
"ts-node": "10.2.1",
|
|
@@ -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
|
|
@@ -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
|