redis-smq 8.0.0-rc.27 → 8.0.0-rc.29
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 +47 -0
- package/CONTRIBUTING.md +20 -0
- package/README.md +77 -110
- package/dist/cjs/src/common/redis-client/redis-client.d.ts +11 -0
- package/dist/cjs/src/common/redis-client/{redis-client-instance.js → redis-client.js} +25 -13
- package/dist/cjs/src/common/redis-client/scripts/scripts.d.ts +2 -0
- package/dist/cjs/src/common/redis-client/scripts/scripts.js +22 -63
- package/dist/cjs/src/lib/consumer/consumer/consumer.d.ts +4 -2
- package/dist/cjs/src/lib/consumer/consumer/consumer.js +12 -8
- package/dist/cjs/src/lib/consumer/consumer/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/consumer/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/consumer-heartbeat/consumer-heartbeat.d.ts +4 -3
- package/dist/cjs/src/lib/consumer/consumer-heartbeat/consumer-heartbeat.js +7 -13
- package/dist/cjs/src/lib/consumer/consumer-heartbeat/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/consumer-heartbeat/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/consumer-queues.d.ts +1 -3
- package/dist/cjs/src/lib/consumer/consumer-queues.js +12 -28
- package/dist/cjs/src/lib/consumer/message-handler/consume-message/consume-message.d.ts +5 -3
- package/dist/cjs/src/lib/consumer/message-handler/consume-message/consume-message.js +5 -5
- package/dist/cjs/src/lib/consumer/message-handler/consume-message/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/message-handler/consume-message/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/message-handler/dequeue-message/dequeue-message.d.ts +6 -4
- package/dist/cjs/src/lib/consumer/message-handler/dequeue-message/dequeue-message.js +24 -22
- package/dist/cjs/src/lib/consumer/message-handler/dequeue-message/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/message-handler/dequeue-message/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/message-handler/message-handler/even-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/message-handler/message-handler/even-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/message-handler/message-handler/message-handler.d.ts +5 -3
- package/dist/cjs/src/lib/consumer/message-handler/message-handler/message-handler.js +20 -20
- package/dist/cjs/src/lib/consumer/message-handler/multiplexed-message-handler.d.ts +3 -1
- package/dist/cjs/src/lib/consumer/message-handler/multiplexed-message-handler.js +3 -3
- package/dist/cjs/src/lib/consumer/message-handler/processing-queue/processing-queue.js +66 -70
- package/dist/cjs/src/lib/consumer/message-handler-runner/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/consumer/message-handler-runner/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/consumer/message-handler-runner/message-handler-runner.d.ts +5 -1
- package/dist/cjs/src/lib/consumer/message-handler-runner/message-handler-runner.js +8 -7
- package/dist/cjs/src/lib/consumer/message-handler-runner/multiplexed-message-handler-runner.d.ts +3 -1
- package/dist/cjs/src/lib/consumer/message-handler-runner/multiplexed-message-handler-runner.js +3 -3
- package/dist/cjs/src/lib/consumer/workers/worker.d.ts +2 -2
- package/dist/cjs/src/lib/consumer/workers/worker.js +2 -2
- package/dist/cjs/src/lib/consumer-groups/consumer-groups.d.ts +4 -4
- package/dist/cjs/src/lib/consumer-groups/consumer-groups.js +3 -3
- package/dist/{esm/src/lib/event-bus/event-bus-redis-instance.d.ts → cjs/src/lib/event-bus/event-bus.d.ts} +2 -2
- package/dist/cjs/src/lib/event-bus/{event-bus-redis-instance.js → event-bus.js} +4 -4
- package/dist/cjs/src/lib/event-bus/index.d.ts +1 -1
- package/dist/cjs/src/lib/event-bus/index.js +1 -1
- package/dist/cjs/src/lib/exchange/exchange-abstract.d.ts +2 -2
- package/dist/cjs/src/lib/exchange/exchange-abstract.js +2 -2
- package/dist/cjs/src/lib/message/message.d.ts +2 -2
- package/dist/cjs/src/lib/message/message.js +2 -2
- package/dist/cjs/src/lib/namespace/namespace.d.ts +2 -2
- package/dist/cjs/src/lib/namespace/namespace.js +75 -95
- package/dist/cjs/src/lib/producer/event-bus-publisher.d.ts +2 -1
- package/dist/cjs/src/lib/producer/event-bus-publisher.js +1 -3
- package/dist/cjs/src/lib/producer/producer.d.ts +5 -3
- package/dist/cjs/src/lib/producer/producer.js +97 -102
- package/dist/cjs/src/lib/producer/queue-consumer-groups-cache.d.ts +6 -3
- package/dist/cjs/src/lib/producer/queue-consumer-groups-cache.js +4 -6
- package/dist/cjs/src/lib/queue/queue.d.ts +4 -4
- package/dist/cjs/src/lib/queue/queue.js +56 -74
- package/dist/cjs/src/lib/queue-messages/queue-messages-paginator/queue-messages-paginator-abstract.d.ts +2 -2
- package/dist/cjs/src/lib/queue-messages/queue-messages-paginator/queue-messages-paginator-abstract.js +2 -2
- package/dist/cjs/src/lib/queue-messages/queue-pending-messages/queue-pending-messages.d.ts +2 -2
- package/dist/cjs/src/lib/queue-messages/queue-pending-messages/queue-pending-messages.js +2 -2
- package/dist/cjs/src/lib/queue-rate-limit/queue-rate-limit.d.ts +2 -2
- package/dist/cjs/src/lib/queue-rate-limit/queue-rate-limit.js +2 -2
- package/dist/esm/src/common/redis-client/redis-client.d.ts +11 -0
- package/dist/esm/src/common/redis-client/{redis-client-instance.js → redis-client.js} +23 -11
- package/dist/esm/src/common/redis-client/scripts/scripts.d.ts +2 -0
- package/dist/esm/src/common/redis-client/scripts/scripts.js +21 -40
- package/dist/esm/src/lib/consumer/consumer/consumer.d.ts +4 -2
- package/dist/esm/src/lib/consumer/consumer/consumer.js +11 -9
- package/dist/esm/src/lib/consumer/consumer/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/consumer/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/consumer-heartbeat/consumer-heartbeat.d.ts +4 -3
- package/dist/esm/src/lib/consumer/consumer-heartbeat/consumer-heartbeat.js +8 -15
- package/dist/esm/src/lib/consumer/consumer-heartbeat/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/consumer-heartbeat/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/consumer-queues.d.ts +1 -3
- package/dist/esm/src/lib/consumer/consumer-queues.js +13 -29
- package/dist/esm/src/lib/consumer/message-handler/consume-message/consume-message.d.ts +5 -3
- package/dist/esm/src/lib/consumer/message-handler/consume-message/consume-message.js +5 -5
- package/dist/esm/src/lib/consumer/message-handler/consume-message/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/message-handler/consume-message/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/message-handler/dequeue-message/dequeue-message.d.ts +6 -4
- package/dist/esm/src/lib/consumer/message-handler/dequeue-message/dequeue-message.js +17 -15
- package/dist/esm/src/lib/consumer/message-handler/dequeue-message/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/message-handler/dequeue-message/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/message-handler/message-handler/even-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/message-handler/message-handler/even-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/message-handler/message-handler/message-handler.d.ts +5 -3
- package/dist/esm/src/lib/consumer/message-handler/message-handler/message-handler.js +21 -20
- package/dist/esm/src/lib/consumer/message-handler/multiplexed-message-handler.d.ts +3 -1
- package/dist/esm/src/lib/consumer/message-handler/multiplexed-message-handler.js +3 -3
- package/dist/esm/src/lib/consumer/message-handler/processing-queue/processing-queue.js +66 -70
- package/dist/esm/src/lib/consumer/message-handler-runner/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/consumer/message-handler-runner/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/consumer/message-handler-runner/message-handler-runner.d.ts +5 -1
- package/dist/esm/src/lib/consumer/message-handler-runner/message-handler-runner.js +8 -5
- package/dist/esm/src/lib/consumer/message-handler-runner/multiplexed-message-handler-runner.d.ts +3 -1
- package/dist/esm/src/lib/consumer/message-handler-runner/multiplexed-message-handler-runner.js +3 -3
- package/dist/esm/src/lib/consumer/workers/worker.d.ts +2 -2
- package/dist/esm/src/lib/consumer/workers/worker.js +2 -2
- package/dist/esm/src/lib/consumer-groups/consumer-groups.d.ts +4 -4
- package/dist/esm/src/lib/consumer-groups/consumer-groups.js +4 -4
- package/dist/{cjs/src/lib/event-bus/event-bus-redis-instance.d.ts → esm/src/lib/event-bus/event-bus.d.ts} +2 -2
- package/dist/esm/src/lib/event-bus/{event-bus-redis-instance.js → event-bus.js} +2 -2
- package/dist/esm/src/lib/event-bus/index.d.ts +1 -1
- package/dist/esm/src/lib/event-bus/index.js +1 -1
- package/dist/esm/src/lib/exchange/exchange-abstract.d.ts +2 -2
- package/dist/esm/src/lib/exchange/exchange-abstract.js +2 -2
- package/dist/esm/src/lib/message/message.d.ts +2 -2
- package/dist/esm/src/lib/message/message.js +2 -2
- package/dist/esm/src/lib/namespace/namespace.d.ts +2 -2
- package/dist/esm/src/lib/namespace/namespace.js +75 -95
- package/dist/esm/src/lib/producer/event-bus-publisher.d.ts +2 -1
- package/dist/esm/src/lib/producer/event-bus-publisher.js +1 -3
- package/dist/esm/src/lib/producer/producer.d.ts +5 -3
- package/dist/esm/src/lib/producer/producer.js +85 -90
- package/dist/esm/src/lib/producer/queue-consumer-groups-cache.d.ts +6 -3
- package/dist/esm/src/lib/producer/queue-consumer-groups-cache.js +4 -6
- package/dist/esm/src/lib/queue/queue.d.ts +4 -4
- package/dist/esm/src/lib/queue/queue.js +57 -75
- package/dist/esm/src/lib/queue-messages/queue-messages-paginator/queue-messages-paginator-abstract.d.ts +2 -2
- package/dist/esm/src/lib/queue-messages/queue-messages-paginator/queue-messages-paginator-abstract.js +2 -2
- package/dist/esm/src/lib/queue-messages/queue-pending-messages/queue-pending-messages.d.ts +2 -2
- package/dist/esm/src/lib/queue-messages/queue-pending-messages/queue-pending-messages.js +2 -2
- package/dist/esm/src/lib/queue-rate-limit/queue-rate-limit.d.ts +2 -2
- package/dist/esm/src/lib/queue-rate-limit/queue-rate-limit.js +2 -2
- package/package.json +6 -3
- package/dist/cjs/src/common/redis-client/redis-client-factory.d.ts +0 -4
- package/dist/cjs/src/common/redis-client/redis-client-factory.js +0 -15
- package/dist/cjs/src/common/redis-client/redis-client-instance.d.ts +0 -10
- package/dist/cjs/src/lib/event-bus/event-bus-redis-factory.d.ts +0 -4
- package/dist/cjs/src/lib/event-bus/event-bus-redis-factory.js +0 -15
- package/dist/esm/src/common/redis-client/redis-client-factory.d.ts +0 -4
- package/dist/esm/src/common/redis-client/redis-client-factory.js +0 -11
- package/dist/esm/src/common/redis-client/redis-client-instance.d.ts +0 -10
- package/dist/esm/src/lib/event-bus/event-bus-redis-factory.d.ts +0 -4
- package/dist/esm/src/lib/event-bus/event-bus-redis-factory.js +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
## [8.0.0-rc.29](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.28...v8.0.0-rc.29) (2025-02-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **deps:** regenerate package-lock.json ([dc55c81](https://github.com/weyoss/redis-smq/commit/dc55c8101e9b57d2607ee47a78db7861d17623ab))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Documentation
|
|
12
|
+
|
|
13
|
+
* **api:** update API documentation and references ([08f85ae](https://github.com/weyoss/redis-smq/commit/08f85ae0c963497d4200fcdfdeccc4aa83d3e60b))
|
|
14
|
+
* **contributing:** update guidelines and improve language ([c2feb57](https://github.com/weyoss/redis-smq/commit/c2feb57429513abb4b8973fc0bb6000377712f2c))
|
|
15
|
+
* **README:** update installation and usage instructions ([cfe19e4](https://github.com/weyoss/redis-smq/commit/cfe19e4f88cf5a5059ecb8567f1cbc16524008de))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Codebase Refactoring
|
|
19
|
+
|
|
20
|
+
* remove unnecessary factory patterns ([3ed3a7d](https://github.com/weyoss/redis-smq/commit/3ed3a7d8056fae3c253f8af5b6b5f3f0d591945f))
|
|
21
|
+
* **tests:** update imports and usage of EventBus and RedisClient ([f9dca11](https://github.com/weyoss/redis-smq/commit/f9dca11015e3d02fddccc8f442facb2bf008236a))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Misc
|
|
25
|
+
|
|
26
|
+
* **deps:** update redis-smq-common to 3.0.0-rc.17 ([324d6f1](https://github.com/weyoss/redis-smq/commit/324d6f12fc82da8762f442c110a9351cce3c3505))
|
|
27
|
+
|
|
28
|
+
## [8.0.0-rc.28](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.27...v8.0.0-rc.28) (2025-02-05)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Bug Fixes
|
|
32
|
+
|
|
33
|
+
* **message:** revert back shutdown method to arrow function ([c4e5ceb](https://github.com/weyoss/redis-smq/commit/c4e5cebb4d9fbd91889618669765698cb80cd044))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
### Documentation
|
|
37
|
+
|
|
38
|
+
* **api:** enhance class documentation with detailed descriptions and examples ([67f8a21](https://github.com/weyoss/redis-smq/commit/67f8a21c039e41301e8bfcf2c4ffc4319b02424d))
|
|
39
|
+
* **api:** separate error classes from main classes ([4aa850e](https://github.com/weyoss/redis-smq/commit/4aa850ed5411906d4a38c32a673cf2021498c294))
|
|
40
|
+
* **README:** update HTTP REST API reference link ([9e20a6c](https://github.com/weyoss/redis-smq/commit/9e20a6c08bf47b1a581129f922c9922c64cb7e3d))
|
|
41
|
+
* update logo, improve content readability ([7c921d4](https://github.com/weyoss/redis-smq/commit/7c921d406e05961d92769f2a43c40f7fa955d5fa))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Codebase Refactoring
|
|
45
|
+
|
|
46
|
+
* improve code structure and readability ([5b4a47c](https://github.com/weyoss/redis-smq/commit/5b4a47cdc1139507a724d1d48202f6d8c6074174))
|
|
47
|
+
|
|
1
48
|
# Changelog
|
|
2
49
|
|
|
3
50
|
## [8.0.0-rc.27](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.26...v8.0.0-rc.27) (2025-01-09)
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Contributions
|
|
2
|
+
|
|
3
|
+
If you want to make RedisSMQ project better, your contributions are very welcome!
|
|
4
|
+
|
|
5
|
+
## Pull requests
|
|
6
|
+
|
|
7
|
+
It is best to open an issue in GitHub about what you want to implement / change or to suggest new features.
|
|
8
|
+
|
|
9
|
+
Before submitting any pull request please make sure that your code does not stick out and consistent with the project
|
|
10
|
+
coding style. You can check the status of your coding style by simply running `npm run lint`.
|
|
11
|
+
|
|
12
|
+
Cover your code with new tests if needed. Only fully tested changes are accepted.
|
|
13
|
+
|
|
14
|
+
Each time when you are ready to submit your changes don't forget to run `npm test` to check that your code is complying
|
|
15
|
+
with eslint project rules and that all the tests are successfully completed.
|
|
16
|
+
|
|
17
|
+
## Bugs
|
|
18
|
+
|
|
19
|
+
If you find any bugs, please do not hesitate to open an issue in GitHub including the case to reproduce the bug
|
|
20
|
+
when possible.
|
package/README.md
CHANGED
|
@@ -1,142 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
> Currently, RedisSMQ is going under heavy development. Pre-releases at any time may introduce new commits with breaking changes.
|
|
3
|
-
> The master branch always reflects the most recent changes. To view the latest release reference see [RedisSMQ v7.2.3](https://github.com/weyoss/redis-smq/tree/v7.2.3)
|
|
4
|
-
|
|
5
|
-
<div align="center" style="text-align: center">
|
|
6
|
-
<p><a href="https://github.com/weyoss/redis-smq"><img alt="RedisSMQ" src="./logo.png?v=202312182134" /></a></p>
|
|
7
|
-
<p>A simple high-performance Redis message queue for Node.js.</p>
|
|
8
|
-
<p>
|
|
9
|
-
<a href="https://github.com/weyoss/redis-smq/actions/workflows/tests.yml"><img src="https://github.com/weyoss/redis-smq/actions/workflows/tests.yml/badge.svg" alt="Tests" style="max-width:100%;" /></a>
|
|
10
|
-
<a href="https://github.com/weyoss/redis-smq/actions/workflows/codeql.yml" rel="nofollow"><img src="https://github.com/weyoss/redis-smq/actions/workflows/codeql.yml/badge.svg" alt="Code quality" /></a>
|
|
11
|
-
<a href="https://codecov.io/github/weyoss/redis-smq?branch=master" rel="nofollow"><img src="https://img.shields.io/codecov/c/github/weyoss/redis-smq" alt="Coverage Status" /></a>
|
|
12
|
-
<a href="https://npmjs.org/package/redis-smq" rel="nofollow"><img src="https://img.shields.io/npm/v/redis-smq.svg" alt="NPM version" /></a>
|
|
13
|
-
<a href="https://npmjs.org/package/redis-smq" rel="nofollow"><img src="https://img.shields.io/npm/dm/redis-smq.svg" alt="NPM downloads" /></a>
|
|
14
|
-
</p>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
|
-
# RedisSMQ
|
|
18
|
-
|
|
19
|
-
RedisSMQ is a Node.js library for queuing messages (aka jobs) and processing them asynchronously with consumers. Backed by Redis, it allows scaling up your typical applications with ease of use.
|
|
20
|
-
|
|
21
|
-
## Features
|
|
22
|
-
|
|
23
|
-
* [High-performance message processing](docs/performance.md).
|
|
24
|
-
* Flexible Producer/Consumer model which offers [Multi-Queue Producers](docs/producing-messages.md) & [Multi-Queue Consumers](docs/consuming-messages.md).
|
|
25
|
-
* RedisSMQ offers different exchange types: [Direct Exchange](docs/message-exchanges.md#direct-exchange), [Topic Exchange](docs/message-exchanges.md#topic-exchange), and [FanOut Exchange](docs/message-exchanges.md#fanout-exchange) for publishing a message to one or multiple queues.
|
|
26
|
-
* Supports [Point-2-Point](docs/queue-delivery-models.md#point-2-point-delivery-model) and [Pub/Sub](docs/queue-delivery-models.md#pubsub-delivery-model) [delivery models](docs/queue-delivery-models.md).
|
|
27
|
-
* Both [delivery models](docs/queue-delivery-models.md) are reliable. For cases of failure, while delivering/consuming messages, [at-least-once](docs/api/classes/ProducibleMessage.md#setretrythreshold) and [at-most-once](docs/api/classes/ProducibleMessage.md#setretrythreshold) modes may be configured.
|
|
28
|
-
* [3 queuing strategies](docs/queues.md): [FIFO queues](docs/queues.md#fifo-first-in-first-out-queues), [LIFO queues](docs/queues.md#lifo-last-in-first-out-queues), and [Priority Queues](docs/queues.md#priority-queues).
|
|
29
|
-
* [Message Handler Worker Threads](docs/message-handler-worker-threads.md) which allow sandboxing and running your message handler from a separate isolated thread and without affecting the performance of other message handlers from the same consumer.
|
|
30
|
-
* Messages can be [set to expire](docs/api/classes/ProducibleMessage.md#setttl) when not delivered within a given amount of time or to have a [consumption timeout](docs/api/classes/ProducibleMessage.md#setconsumetimeout) while being in process.
|
|
31
|
-
* Queues may be [rate Limited](docs/queue-rate-limiting.md) to control the rate at which the messages are consumed.
|
|
32
|
-
* Has a builtin [scheduler](docs/scheduling-messages.md) allowing messages [to be delayed](docs/api/classes/ProducibleMessage.md#setscheduleddelay), [to be delivered for N times](docs/api/classes/ProducibleMessage.md#setscheduledrepeat) with an optional [period between deliveries](docs/api/classes/ProducibleMessage.md#setscheduledrepeatperiod), or simply [to be scheduled using CRON expressions](docs/api/classes/ProducibleMessage.md#setscheduledcron).
|
|
33
|
-
* Provides [an HTTP interface](https://github.com/weyoss/redis-smq-rest-api) to interact with the message queue using a RESTful API.
|
|
34
|
-
* RedisSMQ can be managed also from your [web browser](https://github.com/weyoss/redis-smq-monitor-client).
|
|
35
|
-
* Either [node-redis](https://github.com/redis/node-redis) or [ioredis](https://github.com/luin/ioredis) can be used as a Redis client.
|
|
36
|
-
* [Highly optimized](https://lgtm.com/projects/g/weyoss/redis-smq/context:javascript), implemented using pure callbacks, with small memory footprint and no memory leaks. See [Callback vs Promise vs Async/Await benchmarks](https://gist.github.com/weyoss/24f9ecbda175d943a48cb7ec38bde821).
|
|
37
|
-
* [Both ESM & CJS modules are supported](docs/esm-cjs-modules.md).
|
|
38
|
-
|
|
39
|
-
## RedisSMQ Use Case: Multi-Queue Producers & Multi-Queue Consumers
|
|
40
|
-
|
|
41
|
-

|
|
42
|
-
|
|
43
|
-
## What's new?
|
|
44
|
-
|
|
45
|
-
:rocket: RC's are now available for RedisSMQ v8! The v8 release will bring major improvements and new features. Some of them are:
|
|
46
|
-
|
|
47
|
-
- [x] Message queue codebase refactoring and optimizations.
|
|
48
|
-
- [x] Message storage and handling improvements.
|
|
49
|
-
- [x] Message status which allows to retrieve, at any time, the status of a message by its ID.
|
|
50
|
-
- [x] [Pub/Sub Delivery Model and Consumer Groups](docs/queue-delivery-models.md#pubsub-delivery-model).
|
|
51
|
-
- [x] Message handlers sandboxing and message processing performance improvement with [Message Handler Worker Threads](docs/message-handler-worker-threads.md).
|
|
52
|
-
- [x] Cross-system event propagation based on [EventBus](docs/event-bus.md).
|
|
53
|
-
- [x] Better error handling aiming at reporting fatal errors to the application whenever it is possible and without crashing the main process.
|
|
54
|
-
- [x] [ESM Modules Support](docs/esm-cjs-modules.md).
|
|
55
|
-
|
|
56
|
-
Current RedisSMQ v8 RC status:
|
|
57
|
-
|
|
58
|
-
- [x] RedisSMQ Common Library
|
|
59
|
-
- [x] RedisSMQ
|
|
60
|
-
- [x] [RESTful API](https://github.com/weyoss/redis-smq-rest-api)
|
|
61
|
-
- [ ] Web UI (WIP)
|
|
62
|
-
|
|
63
|
-
If you wish to get the latest updates early feel free to try RedisSMQ v8 RC. Do not hesitate to report any bug or issue if encountered.
|
|
64
|
-
|
|
65
|
-
Otherwise, stay with [RedisSMQ v7](https://github.com/weyoss/redis-smq/tree/v7.2.3) if you are looking for a fully working release with an HTTP API and a Web UI.
|
|
66
|
-
|
|
67
|
-
## Installation
|
|
1
|
+
[](https://github.com/weyoss/redis-smq)
|
|
68
2
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
3
|
+
A High-Performance Redis Simple Message Queue for Node.js
|
|
4
|
+
|
|
5
|
+
[](https://github.com/weyoss/redis-smq/actions/workflows/tests.yml)
|
|
6
|
+
[](https://github.com/weyoss/redis-smq/actions/workflows/codeql.yml)
|
|
7
|
+
[](https://codecov.io/github/weyoss/redis-smq?branch=master)
|
|
8
|
+
[](https://github.com/weyoss/redis-smq/releases)
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
**Key Features**
|
|
12
|
+
|
|
13
|
+
- 🚀 [High-performance message processing](docs/performance.md)
|
|
14
|
+
- 🔄 [Flexible producer/consumer model with multi-queue producers and consumers](docs/consuming-messages.md)
|
|
15
|
+
- 🔀 [Different exchange types (Direct, Topic, FanOut) for publishing messages to one or multiple queues](docs/message-exchanges.md)
|
|
16
|
+
- 📬 [Two delivery models (Point-2-Point and Pub/Sub)](docs/queue-delivery-models.md) with reliable delivery and configurable retry modes
|
|
17
|
+
- 📊 [Three queuing strategies (FIFO, LIFO, Priority Queues)](docs/queues.md)
|
|
18
|
+
- 🧵 [Message handler worker threads for sandboxing and performance improvement](docs/message-handler-worker-threads.md)
|
|
19
|
+
- ⏱️ [Message expiration and consumption timeout](docs/messages.md)
|
|
20
|
+
- 🚦 [Queue rate limiting for controlling message consumption rates](docs/queue-rate-limiting.md)
|
|
21
|
+
- 🕰️ [Built-in scheduler for delayed message delivery and repeating messages](docs/scheduling-messages.md)
|
|
22
|
+
- 🌐 [RESTful API](docs/redis-smq-rest-api.md) and [Web UI](docs/redis-smq-web-ui.md) for interacting with the message queue
|
|
23
|
+
- 📦 [Support for ESM and CJS modules](docs/esm-cjs-modules.md)
|
|
24
|
+
|
|
25
|
+
**Use Cases**
|
|
72
26
|
|
|
73
|
-
|
|
27
|
+
- Managing background tasks, such as email sending or data processing.
|
|
28
|
+
- Efficiently scheduling and retrying tasks.
|
|
29
|
+
- Communication between multiple services in microservices architectures.
|
|
30
|
+
- Handling real-time events in gaming, IoT, or analytics systems.
|
|
74
31
|
|
|
75
|
-
|
|
76
|
-
- Minimal Redis server version is 4.0.0.
|
|
32
|
+
**Installation**
|
|
77
33
|
|
|
78
|
-
|
|
34
|
+
To get started with RedisSMQ, you can install the library using npm:
|
|
35
|
+
```bash
|
|
36
|
+
npm i redis-smq@rc
|
|
37
|
+
```
|
|
79
38
|
|
|
80
|
-
|
|
39
|
+
Don't forget to install a Redis client. Choose either node-redis or ioredis:
|
|
81
40
|
|
|
82
|
-
|
|
41
|
+
```shell
|
|
42
|
+
npm install @redis/client
|
|
43
|
+
# or
|
|
44
|
+
npm install ioredis
|
|
45
|
+
```
|
|
83
46
|
|
|
84
|
-
|
|
47
|
+
**Configuration**
|
|
85
48
|
|
|
86
|
-
|
|
49
|
+
Set up the RedisSMQ configuration during your application bootstrap:
|
|
87
50
|
|
|
88
51
|
```javascript
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
52
|
+
'use strict';
|
|
53
|
+
const { Configuration, ERedisConfigClient } = require('redis-smq');
|
|
54
|
+
|
|
55
|
+
const config = {
|
|
56
|
+
redis: {
|
|
57
|
+
// Using ioredis as the Redis client
|
|
58
|
+
client: ERedisConfigClient.IOREDIS,
|
|
59
|
+
// Add any other ioredis options here
|
|
60
|
+
options: {
|
|
61
|
+
host: '127.0.0.1',
|
|
62
|
+
port: 6379,
|
|
63
|
+
},
|
|
96
64
|
},
|
|
97
|
-
|
|
98
|
-
```
|
|
65
|
+
};
|
|
99
66
|
|
|
100
|
-
|
|
67
|
+
Configuration.getSetConfig(config);
|
|
68
|
+
```
|
|
101
69
|
|
|
102
|
-
|
|
70
|
+
**Usage**
|
|
103
71
|
|
|
104
|
-
|
|
72
|
+
Here's a basic example to create a queue, produce a message, and consume it:
|
|
105
73
|
|
|
106
74
|
```javascript
|
|
75
|
+
// Creating a queue
|
|
76
|
+
const queue = new Queue();
|
|
77
|
+
queue.save('my_queue', EQueueType.LIFO_QUEUE, EQueueDeliveryModel.POINT_TO_POINT, (err) => {
|
|
78
|
+
if (err) console.error(err);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Producing a message
|
|
107
82
|
const msg = new ProducibleMessage();
|
|
108
83
|
msg.setQueue('my_queue').setBody('Hello Word!');
|
|
109
84
|
producer.produce(msg, (err, ids) => {
|
|
110
|
-
|
|
111
|
-
|
|
85
|
+
if (err) console.error(err);
|
|
86
|
+
else console.log(`Produced message IDs are: ${ids.join(', ')}`);
|
|
112
87
|
});
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
See [Producing Messages](docs/producing-messages.md) for more details.
|
|
116
88
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```javascript
|
|
89
|
+
// Consuming a message
|
|
120
90
|
const consumer = new Consumer();
|
|
121
91
|
const messageHandler = (msg, cb) => {
|
|
122
|
-
|
|
123
|
-
|
|
92
|
+
console.log(msg.body);
|
|
93
|
+
cb(); // Acknowledging
|
|
124
94
|
};
|
|
125
95
|
consumer.consume('my_queue', messageHandler, (err) => {
|
|
126
|
-
|
|
96
|
+
if (err) console.error(err);
|
|
127
97
|
});
|
|
128
98
|
```
|
|
99
|
+
**Documentation**
|
|
129
100
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
## Documentation
|
|
133
|
-
|
|
134
|
-
See [RedisSMQ Docs](docs/README.md) for more details.
|
|
101
|
+
For more information, visit the [RedisSMQ Docs](docs/README.md).
|
|
135
102
|
|
|
136
|
-
|
|
103
|
+
**Contributing**
|
|
137
104
|
|
|
138
|
-
|
|
105
|
+
Interested in contributing to this project? Please check out our [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
139
106
|
|
|
140
|
-
|
|
107
|
+
**License**
|
|
141
108
|
|
|
142
|
-
[MIT](https://github.com/weyoss/redis-smq/blob/master/LICENSE)
|
|
109
|
+
RedisSMQ is released under the [MIT License](https://github.com/weyoss/redis-smq/blob/master/LICENSE).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventEmitter, ICallback, IRedisClient, IRedisConfig, TRedisClientEvent } from 'redis-smq-common';
|
|
2
|
+
export declare class RedisClient extends EventEmitter<Pick<TRedisClientEvent, 'error'>> {
|
|
3
|
+
protected instance: IRedisClient | null;
|
|
4
|
+
protected locked: boolean;
|
|
5
|
+
protected createClient(config: IRedisConfig, cb: ICallback<IRedisClient>): void;
|
|
6
|
+
init: (cb: ICallback<void>) => void;
|
|
7
|
+
getSetInstance: (cb: ICallback<IRedisClient>) => void;
|
|
8
|
+
shutdown: (cb: ICallback<void>) => void;
|
|
9
|
+
getInstance(): IRedisClient | Error;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=redis-client.d.ts.map
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.RedisClient = void 0;
|
|
4
4
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
5
5
|
const index_js_1 = require("../../config/index.js");
|
|
6
6
|
const redis_client_instance_lock_error_js_1 = require("./errors/redis-client-instance-lock.error.js");
|
|
7
|
-
|
|
7
|
+
const scripts_js_1 = require("./scripts/scripts.js");
|
|
8
|
+
class RedisClient extends redis_smq_common_1.EventEmitter {
|
|
8
9
|
constructor() {
|
|
9
10
|
super(...arguments);
|
|
10
11
|
this.instance = null;
|
|
@@ -16,17 +17,15 @@ class RedisClientInstance extends redis_smq_common_1.EventEmitter {
|
|
|
16
17
|
if (!this.locked) {
|
|
17
18
|
if (!this.instance) {
|
|
18
19
|
this.locked = true;
|
|
19
|
-
|
|
20
|
+
this.createClient(index_js_1.Configuration.getSetConfig().redis, (err, client) => {
|
|
20
21
|
this.locked = false;
|
|
21
22
|
if (err)
|
|
22
|
-
cb(err);
|
|
23
|
-
|
|
24
|
-
cb(new redis_smq_common_1.CallbackEmptyReplyError());
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
cb(null, this.instance);
|
|
29
|
-
}
|
|
23
|
+
return cb(err);
|
|
24
|
+
if (!client)
|
|
25
|
+
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
|
|
26
|
+
this.instance = client;
|
|
27
|
+
this.instance.on('error', (err) => this.emit('error', err));
|
|
28
|
+
cb(null, this.instance);
|
|
30
29
|
});
|
|
31
30
|
}
|
|
32
31
|
else
|
|
@@ -46,11 +45,24 @@ class RedisClientInstance extends redis_smq_common_1.EventEmitter {
|
|
|
46
45
|
cb();
|
|
47
46
|
};
|
|
48
47
|
}
|
|
48
|
+
createClient(config, cb) {
|
|
49
|
+
(0, redis_smq_common_1.createRedisClient)(config, (err, client) => {
|
|
50
|
+
if (err)
|
|
51
|
+
return cb(err);
|
|
52
|
+
if (!client)
|
|
53
|
+
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
|
|
54
|
+
(0, scripts_js_1.loadScriptFiles)(client, (err) => {
|
|
55
|
+
if (err)
|
|
56
|
+
return cb(err);
|
|
57
|
+
cb(null, client);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
49
61
|
getInstance() {
|
|
50
62
|
if (!this.instance)
|
|
51
63
|
return new redis_smq_common_1.PanicError(`Use first getSetInstance() to initialize the RedisClientInstance class`);
|
|
52
64
|
return this.instance;
|
|
53
65
|
}
|
|
54
66
|
}
|
|
55
|
-
exports.
|
|
56
|
-
//# sourceMappingURL=redis-client
|
|
67
|
+
exports.RedisClient = RedisClient;
|
|
68
|
+
//# sourceMappingURL=redis-client.js.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ICallback, IRedisClient } from 'redis-smq-common';
|
|
1
2
|
export declare enum ELuaScriptName {
|
|
2
3
|
PUBLISH_SCHEDULED_MESSAGE = "PUBLISH_SCHEDULED_MESSAGE",
|
|
3
4
|
PUBLISH_MESSAGE = "PUBLISH_MESSAGE",
|
|
@@ -14,4 +15,5 @@ export declare enum ELuaScriptName {
|
|
|
14
15
|
CLEANUP_OFFLINE_CONSUMER = "CLEANUP_OFFLINE_CONSUMER",
|
|
15
16
|
SET_QUEUE_RATE_LIMIT = "SET_QUEUE_RATE_LIMIT"
|
|
16
17
|
}
|
|
18
|
+
export declare function loadScriptFiles(redisClient: IRedisClient, cb: ICallback<void>): void;
|
|
17
19
|
//# sourceMappingURL=scripts.d.ts.map
|
|
@@ -1,30 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.ELuaScriptName = void 0;
|
|
27
|
-
const fs = __importStar(require("fs"));
|
|
3
|
+
exports.loadScriptFiles = exports.ELuaScriptName = void 0;
|
|
28
4
|
const path_1 = require("path");
|
|
29
5
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
30
6
|
var ELuaScriptName;
|
|
@@ -44,42 +20,25 @@ var ELuaScriptName;
|
|
|
44
20
|
ELuaScriptName["CLEANUP_OFFLINE_CONSUMER"] = "CLEANUP_OFFLINE_CONSUMER";
|
|
45
21
|
ELuaScriptName["SET_QUEUE_RATE_LIMIT"] = "SET_QUEUE_RATE_LIMIT";
|
|
46
22
|
})(ELuaScriptName = exports.ELuaScriptName || (exports.ELuaScriptName = {}));
|
|
47
|
-
redis_smq_common_1.
|
|
48
|
-
|
|
49
|
-
.
|
|
50
|
-
|
|
51
|
-
.
|
|
52
|
-
.
|
|
53
|
-
|
|
54
|
-
.
|
|
55
|
-
.
|
|
56
|
-
|
|
57
|
-
.
|
|
58
|
-
.
|
|
59
|
-
|
|
60
|
-
.
|
|
61
|
-
.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
.toString());
|
|
69
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.ACKNOWLEDGE_MESSAGE, fs
|
|
70
|
-
.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/acknowledge-message.lua'))
|
|
71
|
-
.toString());
|
|
72
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.DELETE_MESSAGE, fs.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/delete-message.lua')).toString());
|
|
73
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.FETCH_MESSAGE_FOR_PROCESSING, fs
|
|
74
|
-
.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/fetch-message-for-processing.lua'))
|
|
75
|
-
.toString());
|
|
76
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.DELETE_CONSUMER_GROUP, fs
|
|
77
|
-
.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/delete-consumer-group.lua'))
|
|
78
|
-
.toString());
|
|
79
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.CLEANUP_OFFLINE_CONSUMER, fs
|
|
80
|
-
.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/cleanup-offline-consumer.lua'))
|
|
81
|
-
.toString());
|
|
82
|
-
redis_smq_common_1.RedisClientAbstract.addScript(ELuaScriptName.SET_QUEUE_RATE_LIMIT, fs
|
|
83
|
-
.readFileSync((0, path_1.resolve)((0, redis_smq_common_1.getDirname)(), './lua/set-queue-rate-limit.lua'))
|
|
84
|
-
.toString());
|
|
23
|
+
const dirname = (0, redis_smq_common_1.getDirname)();
|
|
24
|
+
const scriptFileMap = {
|
|
25
|
+
[ELuaScriptName.PUBLISH_SCHEDULED_MESSAGE]: (0, path_1.resolve)(dirname, './lua/publish-scheduled-message.lua'),
|
|
26
|
+
[ELuaScriptName.PUBLISH_MESSAGE]: (0, path_1.resolve)(dirname, './lua/publish-message.lua'),
|
|
27
|
+
[ELuaScriptName.REQUEUE_MESSAGE]: (0, path_1.resolve)(dirname, './lua/requeue-message.lua'),
|
|
28
|
+
[ELuaScriptName.SCHEDULE_MESSAGE]: (0, path_1.resolve)(dirname, './lua/schedule-message.lua'),
|
|
29
|
+
[ELuaScriptName.HAS_QUEUE_RATE_EXCEEDED]: (0, path_1.resolve)(dirname, './lua/has-queue-rate-exceeded.lua'),
|
|
30
|
+
[ELuaScriptName.CREATE_QUEUE]: (0, path_1.resolve)(dirname, './lua/create-queue.lua'),
|
|
31
|
+
[ELuaScriptName.INIT_CONSUMER_QUEUE]: (0, path_1.resolve)(dirname, './lua/init-consumer-queue.lua'),
|
|
32
|
+
[ELuaScriptName.HANDLE_PROCESSING_QUEUE]: (0, path_1.resolve)(dirname, './lua/handle-processing-queue.lua'),
|
|
33
|
+
[ELuaScriptName.ACKNOWLEDGE_MESSAGE]: (0, path_1.resolve)(dirname, './lua/acknowledge-message.lua'),
|
|
34
|
+
[ELuaScriptName.DELETE_MESSAGE]: (0, path_1.resolve)(dirname, './lua/delete-message.lua'),
|
|
35
|
+
[ELuaScriptName.FETCH_MESSAGE_FOR_PROCESSING]: (0, path_1.resolve)(dirname, './lua/fetch-message-for-processing.lua'),
|
|
36
|
+
[ELuaScriptName.DELETE_CONSUMER_GROUP]: (0, path_1.resolve)(dirname, './lua/delete-consumer-group.lua'),
|
|
37
|
+
[ELuaScriptName.CLEANUP_OFFLINE_CONSUMER]: (0, path_1.resolve)(dirname, './lua/cleanup-offline-consumer.lua'),
|
|
38
|
+
[ELuaScriptName.SET_QUEUE_RATE_LIMIT]: (0, path_1.resolve)(dirname, './lua/set-queue-rate-limit.lua'),
|
|
39
|
+
};
|
|
40
|
+
function loadScriptFiles(redisClient, cb) {
|
|
41
|
+
redisClient.loadScriptFiles(scriptFileMap, (err) => cb(err));
|
|
42
|
+
}
|
|
43
|
+
exports.loadScriptFiles = loadScriptFiles;
|
|
85
44
|
//# sourceMappingURL=scripts.js.map
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { ICallback, ILogger, Runnable, TRedisClientEvent, TUnaryFunction } from 'redis-smq-common';
|
|
2
2
|
import { TConsumerEvent } from '../../../common/index.js';
|
|
3
|
+
import { RedisClient } from '../../../common/redis-client/redis-client.js';
|
|
4
|
+
import { EventBus } from '../../event-bus/index.js';
|
|
3
5
|
import { IQueueParsedParams, TQueueExtendedParams } from '../../queue/index.js';
|
|
4
6
|
import { ConsumerHeartbeat } from '../consumer-heartbeat/consumer-heartbeat.js';
|
|
5
7
|
import { MessageHandlerRunner } from '../message-handler-runner/message-handler-runner.js';
|
|
@@ -7,8 +9,8 @@ import { TConsumerMessageHandler } from '../types/index.js';
|
|
|
7
9
|
export declare class Consumer extends Runnable<TConsumerEvent> {
|
|
8
10
|
protected messageHandlerRunner: MessageHandlerRunner;
|
|
9
11
|
protected logger: ILogger;
|
|
10
|
-
protected redisClient:
|
|
11
|
-
protected eventBus:
|
|
12
|
+
protected redisClient: RedisClient;
|
|
13
|
+
protected eventBus: EventBus | null;
|
|
12
14
|
protected heartbeat: ConsumerHeartbeat | null;
|
|
13
15
|
constructor(enableMultiplexing?: boolean);
|
|
14
16
|
protected onRedisError: TRedisClientEvent['error'];
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Consumer = void 0;
|
|
4
4
|
const redis_smq_common_1 = require("redis-smq-common");
|
|
5
|
-
const
|
|
5
|
+
const redis_client_js_1 = require("../../../common/redis-client/redis-client.js");
|
|
6
6
|
const index_js_1 = require("../../../config/index.js");
|
|
7
|
-
const
|
|
7
|
+
const index_js_2 = require("../../event-bus/index.js");
|
|
8
8
|
const _parse_queue_extended_params_js_1 = require("../../queue/_/_parse-queue-extended-params.js");
|
|
9
9
|
const consumer_heartbeat_js_1 = require("../consumer-heartbeat/consumer-heartbeat.js");
|
|
10
10
|
const message_handler_runner_js_1 = require("../message-handler-runner/message-handler-runner.js");
|
|
@@ -13,12 +13,14 @@ const event_bus_publisher_js_1 = require("./event-bus-publisher.js");
|
|
|
13
13
|
class Consumer extends redis_smq_common_1.Runnable {
|
|
14
14
|
constructor(enableMultiplexing) {
|
|
15
15
|
super();
|
|
16
|
+
this.eventBus = null;
|
|
16
17
|
this.heartbeat = null;
|
|
17
18
|
this.onRedisError = (error) => {
|
|
18
19
|
this.handleError(error);
|
|
19
20
|
};
|
|
20
21
|
this.setUpHeartbeat = (cb) => {
|
|
21
|
-
|
|
22
|
+
var _a;
|
|
23
|
+
this.heartbeat = new consumer_heartbeat_js_1.ConsumerHeartbeat(this, this.redisClient, this.logger, (_a = this.eventBus) !== null && _a !== void 0 ? _a : null);
|
|
22
24
|
this.heartbeat.on('consumerHeartbeat.error', (err) => this.handleError(err));
|
|
23
25
|
this.heartbeat.run((err) => cb(err));
|
|
24
26
|
};
|
|
@@ -55,14 +57,16 @@ class Consumer extends redis_smq_common_1.Runnable {
|
|
|
55
57
|
};
|
|
56
58
|
const config = index_js_1.Configuration.getSetConfig();
|
|
57
59
|
this.logger = redis_smq_common_1.logger.getLogger(config.logger, `consumer:${this.id}:message-handler`);
|
|
58
|
-
this.redisClient =
|
|
60
|
+
this.redisClient = new redis_client_js_1.RedisClient();
|
|
61
|
+
this.redisClient.on('error', this.onRedisError);
|
|
59
62
|
if (index_js_1.Configuration.getSetConfig().eventBus.enabled) {
|
|
60
|
-
this.eventBus =
|
|
61
|
-
|
|
63
|
+
this.eventBus = new index_js_2.EventBus();
|
|
64
|
+
this.eventBus.on('error', this.onRedisError);
|
|
65
|
+
(0, event_bus_publisher_js_1.eventBusPublisher)(this, this.eventBus, this.logger);
|
|
62
66
|
}
|
|
63
67
|
this.messageHandlerRunner = enableMultiplexing
|
|
64
|
-
? new multiplexed_message_handler_runner_js_1.MultiplexedMessageHandlerRunner(this, this.logger)
|
|
65
|
-
: new message_handler_runner_js_1.MessageHandlerRunner(this, this.logger);
|
|
68
|
+
? new multiplexed_message_handler_runner_js_1.MultiplexedMessageHandlerRunner(this, this.redisClient, this.logger, this.eventBus)
|
|
69
|
+
: new message_handler_runner_js_1.MessageHandlerRunner(this, this.redisClient, this.logger, this.eventBus);
|
|
66
70
|
this.messageHandlerRunner.on('consumer.messageHandlerRunner.error', (err) => this.handleError(err));
|
|
67
71
|
}
|
|
68
72
|
goingUp() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ILogger } from 'redis-smq-common';
|
|
2
|
+
import { EventBus } from '../../event-bus/index.js';
|
|
2
3
|
import { Consumer } from './consumer.js';
|
|
3
|
-
export declare function eventBusPublisher(consumer: Consumer, logger: ILogger): void;
|
|
4
|
+
export declare function eventBusPublisher(consumer: Consumer, eventBus: EventBus, logger: ILogger): void;
|
|
4
5
|
//# sourceMappingURL=event-bus-publisher.d.ts.map
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.eventBusPublisher = void 0;
|
|
4
|
-
|
|
5
|
-
function eventBusPublisher(consumer, logger) {
|
|
6
|
-
const eventBus = (0, event_bus_redis_factory_js_1.EventBusRedisFactory)(consumer.getId(), () => void 0);
|
|
4
|
+
function eventBusPublisher(consumer, eventBus, logger) {
|
|
7
5
|
const up = (...args) => {
|
|
8
6
|
const instance = eventBus.getInstance();
|
|
9
7
|
if (instance instanceof Error)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { ICallback, ILogger, IRedisClient, Runnable, Timer } from 'redis-smq-common';
|
|
2
2
|
import { TConsumerHeartbeatEvent } from '../../../common/index.js';
|
|
3
|
+
import { RedisClient } from '../../../common/redis-client/redis-client.js';
|
|
4
|
+
import { EventBus } from '../../event-bus/index.js';
|
|
3
5
|
import { Consumer } from '../consumer/consumer.js';
|
|
4
6
|
import { IConsumerHeartbeat } from '../types/index.js';
|
|
5
7
|
export declare class ConsumerHeartbeat extends Runnable<TConsumerHeartbeatEvent> {
|
|
@@ -8,9 +10,8 @@ export declare class ConsumerHeartbeat extends Runnable<TConsumerHeartbeatEvent>
|
|
|
8
10
|
protected keyConsumerHeartbeat: string;
|
|
9
11
|
protected consumer: Consumer;
|
|
10
12
|
protected logger: ILogger;
|
|
11
|
-
protected redisClient:
|
|
12
|
-
|
|
13
|
-
constructor(consumer: Consumer, logger: ILogger);
|
|
13
|
+
protected redisClient: RedisClient;
|
|
14
|
+
constructor(consumer: Consumer, redisClient: RedisClient, logger: ILogger, eventBus: EventBus | null);
|
|
14
15
|
protected getLogger(): ILogger;
|
|
15
16
|
protected getPayload(): IConsumerHeartbeat;
|
|
16
17
|
protected beat(): void;
|