redis-smq 8.0.0-rc.11 → 8.0.0-rc.13

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,33 @@
1
1
 
2
2
 
3
+ ## [8.0.0-rc.13](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.12...v8.0.0-rc.13) (2023-12-23)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * **event-listeners:** unify consumer/producer event listeners
9
+
10
+ ### Documentation
11
+
12
+ * **event-listeners:** update documentation ([71100d3](https://github.com/weyoss/redis-smq/commit/71100d3aa94a61fb8ece86e439f0b120b66a6cab))
13
+
14
+
15
+ ### Codebase Refactoring
16
+
17
+ * **event-listeners:** unify consumer/producer event listeners ([9e1a181](https://github.com/weyoss/redis-smq/commit/9e1a1811dd841d4329f0ee14e979d2770a7a6358))
18
+
19
+
20
+ ### Tests
21
+
22
+ * **event-listeners:** unify consumer/producer event listeners ([2d14a07](https://github.com/weyoss/redis-smq/commit/2d14a077feda98933fb6c038bea5a33ad8d5f610))
23
+
24
+ ## [8.0.0-rc.12](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.11...v8.0.0-rc.12) (2023-12-18)
25
+
26
+
27
+ ### Misc
28
+
29
+ * update logo ([9bd373e](https://github.com/weyoss/redis-smq/commit/9bd373e693c57c8e18dddb5b0899c710e6de9492))
30
+
3
31
  ## [8.0.0-rc.11](https://github.com/weyoss/redis-smq/compare/v8.0.0-rc.10...v8.0.0-rc.11) (2023-12-18)
4
32
 
5
33
 
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <div align="center" style="text-align: center">
2
- <p><a href="https://github.com/weyoss/redis-smq"><img alt="RedisSMQ" src="./logo.png" /></a></p>
2
+ <p><a href="https://github.com/weyoss/redis-smq"><img alt="RedisSMQ" src="./logo.png?v=202312182134" /></a></p>
3
3
  <p>A simple high-performance Redis message queue for Node.js.</p>
4
4
  </div>
5
5
 
package/dist/index.cjs CHANGED
@@ -339,14 +339,10 @@ function Messages(userConfig) {
339
339
  }
340
340
 
341
341
  // src/config/event-listeners/event-listeners.ts
342
- var import_lodash4 = require("lodash");
343
- var defaultConfig4 = {
344
- consumerEventListeners: [],
345
- producerEventListeners: []
346
- };
342
+ var defaultConfig4 = [];
347
343
  function EventListeners(userConfig) {
348
- const { eventListeners = {} } = userConfig;
349
- return (0, import_lodash4.merge)({}, defaultConfig4, eventListeners);
344
+ const { eventListeners = [] } = userConfig;
345
+ return [...defaultConfig4, ...eventListeners];
350
346
  }
351
347
 
352
348
  // src/config/configuration.ts
@@ -408,11 +404,11 @@ function _destroyCommonRedisClient(cb) {
408
404
  }
409
405
 
410
406
  // types/consumer/consume-message.ts
411
- var EConsumeMessageDeadLetterCause = /* @__PURE__ */ ((EConsumeMessageDeadLetterCause3) => {
412
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["TTL_EXPIRED"] = 0] = "TTL_EXPIRED";
413
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["RETRY_THRESHOLD_EXCEEDED"] = 1] = "RETRY_THRESHOLD_EXCEEDED";
414
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["PERIODIC_MESSAGE"] = 2] = "PERIODIC_MESSAGE";
415
- return EConsumeMessageDeadLetterCause3;
407
+ var EConsumeMessageDeadLetterCause = /* @__PURE__ */ ((EConsumeMessageDeadLetterCause2) => {
408
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["TTL_EXPIRED"] = 0] = "TTL_EXPIRED";
409
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["RETRY_THRESHOLD_EXCEEDED"] = 1] = "RETRY_THRESHOLD_EXCEEDED";
410
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["PERIODIC_MESSAGE"] = 2] = "PERIODIC_MESSAGE";
411
+ return EConsumeMessageDeadLetterCause2;
416
412
  })(EConsumeMessageDeadLetterCause || {});
417
413
  var EConsumeMessageUnacknowledgedCause = /* @__PURE__ */ ((EConsumeMessageUnacknowledgedCause3) => {
418
414
  EConsumeMessageUnacknowledgedCause3[EConsumeMessageUnacknowledgedCause3["TIMEOUT"] = 0] = "TIMEOUT";
@@ -788,6 +784,10 @@ var Base = class extends import_redis_smq_common11.EventEmitter {
788
784
  } else
789
785
  cb();
790
786
  };
787
+ this.initEventListeners = (cb) => {
788
+ const { eventListeners } = Configuration.getSetConfig();
789
+ this.registerEventListeners(eventListeners, cb);
790
+ };
791
791
  this.tearDownEventListeners = (cb) => {
792
792
  import_redis_smq_common11.async.each(
793
793
  this.eventListeners,
@@ -818,7 +818,7 @@ var Base = class extends import_redis_smq_common11.EventEmitter {
818
818
  this.on("error", (err) => this.handleError(err));
819
819
  }
820
820
  goingUp() {
821
- return [this.setUpSharedRedisClient];
821
+ return [this.setUpSharedRedisClient, this.initEventListeners];
822
822
  }
823
823
  up(cb) {
824
824
  this.powerSwitch.commit();
@@ -843,20 +843,14 @@ var Base = class extends import_redis_smq_common11.EventEmitter {
843
843
  Ctors,
844
844
  (ctor, key, done) => {
845
845
  const instance = new ctor();
846
- instance.init(
847
- {
848
- instanceId: this.id,
849
- eventProvider: this
850
- },
851
- (err) => {
852
- if (err)
853
- done(err);
854
- else {
855
- this.eventListeners.push(instance);
856
- done();
857
- }
846
+ instance.init((err) => {
847
+ if (err)
848
+ done(err);
849
+ else {
850
+ this.eventListeners.push(instance);
851
+ done();
858
852
  }
859
- );
853
+ });
860
854
  },
861
855
  cb
862
856
  );
@@ -2931,20 +2925,20 @@ var ConsumeMessage = class {
2931
2925
  const consumerId = this.messageHandler.getConsumerId();
2932
2926
  this.messageHandler.emit(
2933
2927
  "messageUnacknowledged",
2934
- cause,
2935
2928
  messageId,
2936
2929
  queue,
2937
2930
  messageHandlerId,
2938
- consumerId
2931
+ consumerId,
2932
+ cause
2939
2933
  );
2940
2934
  if (reply.action === 0 /* DEAD_LETTER */) {
2941
2935
  this.messageHandler.emit(
2942
2936
  "messageDeadLettered",
2943
- reply.deadLetterCause,
2944
2937
  messageId,
2945
2938
  queue,
2946
2939
  messageHandlerId,
2947
- consumerId
2940
+ consumerId,
2941
+ reply.deadLetterCause
2948
2942
  );
2949
2943
  } else if (reply.action === 2 /* DELAY */) {
2950
2944
  this.messageHandler.emit(
@@ -3065,7 +3059,7 @@ var MessageHandler = class extends import_redis_smq_common27.EventEmitter {
3065
3059
  });
3066
3060
  this.on(
3067
3061
  "messageDeadLettered",
3068
- (cause, messageId) => {
3062
+ (messageId, queue, messageHandlerId, consumerId, cause) => {
3069
3063
  this.logger.info(
3070
3064
  `Message (ID ${messageId}) dead-lettered (cause ${cause})`
3071
3065
  );
@@ -3073,7 +3067,7 @@ var MessageHandler = class extends import_redis_smq_common27.EventEmitter {
3073
3067
  );
3074
3068
  this.on(
3075
3069
  "messageUnacknowledged",
3076
- (cause, messageId) => {
3070
+ (messageId, queue, messageHandlerId, consumerId, cause) => {
3077
3071
  this.logger.info(
3078
3072
  `Message (ID ${messageId}) unacknowledged (cause ${cause})`
3079
3073
  );
@@ -3940,12 +3934,6 @@ var Consumer = class extends Base {
3940
3934
  this.workerRunner.addWorker(new publish_scheduled_worker_default(redisClient2, true));
3941
3935
  this.workerRunner.run();
3942
3936
  };
3943
- this.initConsumerEventListeners = (cb) => {
3944
- this.registerEventListeners(
3945
- Configuration.getSetConfig().eventListeners.consumerEventListeners,
3946
- cb
3947
- );
3948
- };
3949
3937
  this.tearDownConsumerWorkers = (cb) => {
3950
3938
  if (this.workerRunner) {
3951
3939
  this.workerRunner.quit(() => {
@@ -3972,10 +3960,30 @@ var Consumer = class extends Base {
3972
3960
  this.messageHandlerRunner = useMultiplexing ? new MultiplexedMessageHandlerRunner(this, nsLogger) : new MessageHandlerRunner(this, nsLogger);
3973
3961
  this.redisKeys = redisKeys.getConsumerKeys(this.getId());
3974
3962
  }
3963
+ registerSystemEventListeners() {
3964
+ super.registerSystemEventListeners();
3965
+ this.on("messageAcknowledged", (...args) => {
3966
+ if (this.eventListeners.length)
3967
+ this.eventListeners.forEach(
3968
+ (i) => i.emit("messageAcknowledged", ...args)
3969
+ );
3970
+ });
3971
+ this.on("messageUnacknowledged", (...args) => {
3972
+ if (this.eventListeners.length)
3973
+ this.eventListeners.forEach(
3974
+ (i) => i.emit("messageUnacknowledged", ...args)
3975
+ );
3976
+ });
3977
+ this.on("messageDeadLettered", (...args) => {
3978
+ if (this.eventListeners.length)
3979
+ this.eventListeners.forEach(
3980
+ (i) => i.emit("messageDeadLettered", ...args)
3981
+ );
3982
+ });
3983
+ }
3975
3984
  goingUp() {
3976
3985
  return super.goingUp().concat([
3977
3986
  this.setUpHeartbeat,
3978
- this.initConsumerEventListeners,
3979
3987
  this.runMessageHandlers,
3980
3988
  this.setUpConsumerWorkers
3981
3989
  ]);
@@ -4061,17 +4069,12 @@ function _scheduleMessage(mixed, message, cb) {
4061
4069
 
4062
4070
  // src/lib/producer/producer.ts
4063
4071
  var Producer = class extends Base {
4064
- constructor() {
4065
- super(...arguments);
4066
- this.initProducerEventListeners = (cb) => {
4067
- this.registerEventListeners(
4068
- Configuration.getSetConfig().eventListeners.producerEventListeners,
4069
- cb
4070
- );
4071
- };
4072
- }
4073
- goingUp() {
4074
- return super.goingUp().concat([this.initProducerEventListeners]);
4072
+ registerSystemEventListeners() {
4073
+ super.registerSystemEventListeners();
4074
+ this.on("messagePublished", (...args) => {
4075
+ if (this.eventListeners.length)
4076
+ this.eventListeners.forEach((i) => i.emit("messagePublished", ...args));
4077
+ });
4075
4078
  }
4076
4079
  enqueue(redisClient2, queue, message, cb) {
4077
4080
  var _a;
@@ -4141,7 +4144,7 @@ var Producer = class extends Base {
4141
4144
  cb(err);
4142
4145
  else {
4143
4146
  this.logger.info(`Message (ID ${messageId}) has been published.`);
4144
- this.emit("messagePublished", messageId, queue);
4147
+ this.emit("messagePublished", messageId, queue, this.id);
4145
4148
  cb(null, messageId);
4146
4149
  }
4147
4150
  });
package/dist/index.d.cts CHANGED
@@ -387,29 +387,21 @@ declare enum EConsumeMessageUnacknowledgedCause {
387
387
 
388
388
  type TRedisSMQEvent = TEvent & {
389
389
  heartbeatTick: (timestamp: number, consumerId: string, heartbeatPayload: IConsumerHeartbeat) => void;
390
- messagePublished: (messageId: string, queue: IQueueParams) => void;
390
+ messagePublished: (messageId: string, queue: IQueueParams, producerId: string) => void;
391
391
  messageAcknowledged: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
392
- messageUnacknowledged: (cause: EConsumeMessageUnacknowledgedCause, messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
393
- messageDeadLettered: (cause: EConsumeMessageDeadLetterCause, messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
392
+ messageUnacknowledged: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string, cause: EConsumeMessageUnacknowledgedCause) => void;
393
+ messageDeadLettered: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string, cause: EConsumeMessageDeadLetterCause) => void;
394
394
  messageReceived: (messageId: string, queue: IQueueParams, consumerId: string) => void;
395
395
  messageRequeued: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
396
396
  messageDelayed: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
397
397
  };
398
398
 
399
- type TEventListenerInitArgs = {
400
- eventProvider: EventEmitter<TRedisSMQEvent>;
401
- instanceId: string;
402
- };
403
- interface IEventListener {
404
- init(args: TEventListenerInitArgs, cb: ICallback<void>): void;
399
+ interface IEventListener extends EventEmitter<TRedisSMQEvent> {
400
+ init(cb: ICallback<void>): void;
405
401
  quit(cb: ICallback<void>): void;
406
402
  }
407
403
 
408
- interface IEventListenersConfig {
409
- consumerEventListeners?: (new () => IEventListener)[];
410
- producerEventListeners?: (new () => IEventListener)[];
411
- }
412
- type IEventListenersConfigRequired = Required<IEventListenersConfig>;
404
+ type TEventListenersConfig = (new () => IEventListener)[];
413
405
 
414
406
  type TTopicParams = {
415
407
  topic: string;
@@ -470,13 +462,12 @@ interface IRedisSMQConfig {
470
462
  namespace?: string;
471
463
  logger?: ILoggerConfig;
472
464
  messages?: IMessagesConfig;
473
- eventListeners?: IEventListenersConfig;
465
+ eventListeners?: TEventListenersConfig;
474
466
  }
475
467
  interface IRedisSMQConfigRequired extends Required<IRedisSMQConfig> {
476
468
  messages: {
477
469
  store: IMessagesConfigStorageRequired;
478
470
  };
479
- eventListeners: IEventListenersConfigRequired;
480
471
  }
481
472
 
482
473
  declare class ConsumerError extends RedisSMQError {
@@ -587,6 +578,7 @@ declare abstract class Base extends EventEmitter<TRedisSMQEvent> {
587
578
  constructor();
588
579
  protected setUpSharedRedisClient: (cb: ICallback<void>) => void;
589
580
  protected tearDownSharedRedisClient: (cb: ICallback<void>) => void;
581
+ protected initEventListeners: (cb: ICallback<void>) => void;
590
582
  protected registerSystemEventListeners(): void;
591
583
  protected goingUp(): TFunction[];
592
584
  protected up(cb?: ICallback<boolean>): void;
@@ -696,10 +688,10 @@ declare class Consumer extends Base {
696
688
  protected heartbeat: ConsumerHeartbeat | null;
697
689
  protected workerRunner: WorkerRunner | null;
698
690
  constructor(useMultiplexing?: boolean);
691
+ protected registerSystemEventListeners(): void;
699
692
  protected setUpHeartbeat: (cb: ICallback<void>) => void;
700
693
  protected tearDownHeartbeat: (cb: ICallback<void>) => void;
701
694
  protected setUpConsumerWorkers: (cb: ICallback<void>) => void;
702
- protected initConsumerEventListeners: (cb: ICallback<void>) => void;
703
695
  protected tearDownConsumerWorkers: (cb: ICallback<void>) => void;
704
696
  protected runMessageHandlers: (cb: ICallback<void>) => void;
705
697
  protected shutdownMessageHandlers: (cb: ICallback<void>) => void;
@@ -711,8 +703,7 @@ declare class Consumer extends Base {
711
703
  }
712
704
 
713
705
  declare class Producer extends Base {
714
- protected initProducerEventListeners: (cb: ICallback<void>) => void;
715
- protected goingUp(): TUnaryFunction<ICallback<void>>[];
706
+ protected registerSystemEventListeners(): void;
716
707
  protected enqueue(redisClient: RedisClient, queue: IQueueParams, message: MessageEnvelope, cb: ICallback<void>): void;
717
708
  protected produceMessage(redisClient: RedisClient, message: MessageEnvelope, queue: IQueueParams, cb: ICallback<string>): void;
718
709
  produce(msg: ProducibleMessage, cb: ICallback<string[]>): void;
@@ -864,4 +855,4 @@ declare class Configuration {
864
855
 
865
856
  declare function disconnect(cb: ICallback<void>): void;
866
857
 
867
- export { Configuration, Consumer, ConsumerError, ConsumerMessageHandlerAlreadyExistsError, EConsumeMessageDeadLetterCause, EConsumeMessageUnacknowledgedCause, EExchangeType, EMessagePriority, EMessageProperty, EMessagePropertyStatus, EQueueProperty, EQueueType, ExchangeDirect, ExchangeError, ExchangeFanOut, ExchangeFanOutError, ExchangeInvalidDataError, ExchangeTopic, type IConsumableMessage, type IConsumerHeartbeat, type IConsumerHeartbeatPayload, type IConsumerMessageHandlerArgs, type IEventListener, type IEventListenersConfig, type IEventListenersConfigRequired, type IExchange, type IExchangeSerialized, type IMessageSerialized, type IMessageStateSerialized, type IMessagesConfig, type IMessagesConfigStorage, type IMessagesConfigStorageOptions, type IMessagesConfigStorageOptionsRequired, type IMessagesConfigStorageRequired, type IQueueMessages, type IQueueMessagesCount, type IQueueMessagesPage, type IQueueMessagesPageParams, type IQueueParams, type IQueueProperties, type IQueueRateLimit, type IRedisSMQConfig, type IRedisSMQConfigRequired, Message, MessageDeleteError, MessageDestinationQueueAlreadySetError, MessageDestinationQueueRequiredError, MessageError, MessageExchangeRequiredError, MessageNotFoundError, Namespace, Producer, ProducerError, ProducerInstanceNotRunningError, ProducerMessageNotPublishedError, ProducerMessageNotScheduledError, ProducibleMessage, Queue, QueueAcknowledgedMessages, QueueDeadLetteredMessages, QueueError, QueueExistsError, QueueHasRunningConsumersError, QueueMessageRequeueError, QueueMessages, QueueNamespaceNotFoundError, QueueNotEmptyError, QueueNotFoundError, QueuePendingMessages, QueueRateLimit, QueueRateLimitError, QueueScheduledMessages, type TConsumerMessageHandler, type TConsumerRedisKeys, type TEventListenerInitArgs, type TExchange, type TExchangeDirect, type TExchangeDirectBindingParams, type TExchangeDirectSerialized, type TExchangeFanOut, type TExchangeFanOutBindingParams, type TExchangeFanOutSerialized, type TExchangeSerialized, type TExchangeTopic, type TExchangeTopicBindingParams, type TExchangeTopicSerialized, type TMessageConsumeOptions, type TQueueConsumer, type TRedisSMQEvent, type TTopicParams, disconnect };
858
+ export { Configuration, Consumer, ConsumerError, ConsumerMessageHandlerAlreadyExistsError, EConsumeMessageDeadLetterCause, EConsumeMessageUnacknowledgedCause, EExchangeType, EMessagePriority, EMessageProperty, EMessagePropertyStatus, EQueueProperty, EQueueType, ExchangeDirect, ExchangeError, ExchangeFanOut, ExchangeFanOutError, ExchangeInvalidDataError, ExchangeTopic, type IConsumableMessage, type IConsumerHeartbeat, type IConsumerHeartbeatPayload, type IConsumerMessageHandlerArgs, type IEventListener, type IExchange, type IExchangeSerialized, type IMessageSerialized, type IMessageStateSerialized, type IMessagesConfig, type IMessagesConfigStorage, type IMessagesConfigStorageOptions, type IMessagesConfigStorageOptionsRequired, type IMessagesConfigStorageRequired, type IQueueMessages, type IQueueMessagesCount, type IQueueMessagesPage, type IQueueMessagesPageParams, type IQueueParams, type IQueueProperties, type IQueueRateLimit, type IRedisSMQConfig, type IRedisSMQConfigRequired, Message, MessageDeleteError, MessageDestinationQueueAlreadySetError, MessageDestinationQueueRequiredError, MessageError, MessageExchangeRequiredError, MessageNotFoundError, Namespace, Producer, ProducerError, ProducerInstanceNotRunningError, ProducerMessageNotPublishedError, ProducerMessageNotScheduledError, ProducibleMessage, Queue, QueueAcknowledgedMessages, QueueDeadLetteredMessages, QueueError, QueueExistsError, QueueHasRunningConsumersError, QueueMessageRequeueError, QueueMessages, QueueNamespaceNotFoundError, QueueNotEmptyError, QueueNotFoundError, QueuePendingMessages, QueueRateLimit, QueueRateLimitError, QueueScheduledMessages, type TConsumerMessageHandler, type TConsumerRedisKeys, type TEventListenersConfig, type TExchange, type TExchangeDirect, type TExchangeDirectBindingParams, type TExchangeDirectSerialized, type TExchangeFanOut, type TExchangeFanOutBindingParams, type TExchangeFanOutSerialized, type TExchangeSerialized, type TExchangeTopic, type TExchangeTopicBindingParams, type TExchangeTopicSerialized, type TMessageConsumeOptions, type TQueueConsumer, type TRedisSMQEvent, type TTopicParams, disconnect };
package/dist/index.d.ts CHANGED
@@ -387,29 +387,21 @@ declare enum EConsumeMessageUnacknowledgedCause {
387
387
 
388
388
  type TRedisSMQEvent = TEvent & {
389
389
  heartbeatTick: (timestamp: number, consumerId: string, heartbeatPayload: IConsumerHeartbeat) => void;
390
- messagePublished: (messageId: string, queue: IQueueParams) => void;
390
+ messagePublished: (messageId: string, queue: IQueueParams, producerId: string) => void;
391
391
  messageAcknowledged: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
392
- messageUnacknowledged: (cause: EConsumeMessageUnacknowledgedCause, messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
393
- messageDeadLettered: (cause: EConsumeMessageDeadLetterCause, messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
392
+ messageUnacknowledged: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string, cause: EConsumeMessageUnacknowledgedCause) => void;
393
+ messageDeadLettered: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string, cause: EConsumeMessageDeadLetterCause) => void;
394
394
  messageReceived: (messageId: string, queue: IQueueParams, consumerId: string) => void;
395
395
  messageRequeued: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
396
396
  messageDelayed: (messageId: string, queue: IQueueParams, messageHandlerId: string, consumerId: string) => void;
397
397
  };
398
398
 
399
- type TEventListenerInitArgs = {
400
- eventProvider: EventEmitter<TRedisSMQEvent>;
401
- instanceId: string;
402
- };
403
- interface IEventListener {
404
- init(args: TEventListenerInitArgs, cb: ICallback<void>): void;
399
+ interface IEventListener extends EventEmitter<TRedisSMQEvent> {
400
+ init(cb: ICallback<void>): void;
405
401
  quit(cb: ICallback<void>): void;
406
402
  }
407
403
 
408
- interface IEventListenersConfig {
409
- consumerEventListeners?: (new () => IEventListener)[];
410
- producerEventListeners?: (new () => IEventListener)[];
411
- }
412
- type IEventListenersConfigRequired = Required<IEventListenersConfig>;
404
+ type TEventListenersConfig = (new () => IEventListener)[];
413
405
 
414
406
  type TTopicParams = {
415
407
  topic: string;
@@ -470,13 +462,12 @@ interface IRedisSMQConfig {
470
462
  namespace?: string;
471
463
  logger?: ILoggerConfig;
472
464
  messages?: IMessagesConfig;
473
- eventListeners?: IEventListenersConfig;
465
+ eventListeners?: TEventListenersConfig;
474
466
  }
475
467
  interface IRedisSMQConfigRequired extends Required<IRedisSMQConfig> {
476
468
  messages: {
477
469
  store: IMessagesConfigStorageRequired;
478
470
  };
479
- eventListeners: IEventListenersConfigRequired;
480
471
  }
481
472
 
482
473
  declare class ConsumerError extends RedisSMQError {
@@ -587,6 +578,7 @@ declare abstract class Base extends EventEmitter<TRedisSMQEvent> {
587
578
  constructor();
588
579
  protected setUpSharedRedisClient: (cb: ICallback<void>) => void;
589
580
  protected tearDownSharedRedisClient: (cb: ICallback<void>) => void;
581
+ protected initEventListeners: (cb: ICallback<void>) => void;
590
582
  protected registerSystemEventListeners(): void;
591
583
  protected goingUp(): TFunction[];
592
584
  protected up(cb?: ICallback<boolean>): void;
@@ -696,10 +688,10 @@ declare class Consumer extends Base {
696
688
  protected heartbeat: ConsumerHeartbeat | null;
697
689
  protected workerRunner: WorkerRunner | null;
698
690
  constructor(useMultiplexing?: boolean);
691
+ protected registerSystemEventListeners(): void;
699
692
  protected setUpHeartbeat: (cb: ICallback<void>) => void;
700
693
  protected tearDownHeartbeat: (cb: ICallback<void>) => void;
701
694
  protected setUpConsumerWorkers: (cb: ICallback<void>) => void;
702
- protected initConsumerEventListeners: (cb: ICallback<void>) => void;
703
695
  protected tearDownConsumerWorkers: (cb: ICallback<void>) => void;
704
696
  protected runMessageHandlers: (cb: ICallback<void>) => void;
705
697
  protected shutdownMessageHandlers: (cb: ICallback<void>) => void;
@@ -711,8 +703,7 @@ declare class Consumer extends Base {
711
703
  }
712
704
 
713
705
  declare class Producer extends Base {
714
- protected initProducerEventListeners: (cb: ICallback<void>) => void;
715
- protected goingUp(): TUnaryFunction<ICallback<void>>[];
706
+ protected registerSystemEventListeners(): void;
716
707
  protected enqueue(redisClient: RedisClient, queue: IQueueParams, message: MessageEnvelope, cb: ICallback<void>): void;
717
708
  protected produceMessage(redisClient: RedisClient, message: MessageEnvelope, queue: IQueueParams, cb: ICallback<string>): void;
718
709
  produce(msg: ProducibleMessage, cb: ICallback<string[]>): void;
@@ -864,4 +855,4 @@ declare class Configuration {
864
855
 
865
856
  declare function disconnect(cb: ICallback<void>): void;
866
857
 
867
- export { Configuration, Consumer, ConsumerError, ConsumerMessageHandlerAlreadyExistsError, EConsumeMessageDeadLetterCause, EConsumeMessageUnacknowledgedCause, EExchangeType, EMessagePriority, EMessageProperty, EMessagePropertyStatus, EQueueProperty, EQueueType, ExchangeDirect, ExchangeError, ExchangeFanOut, ExchangeFanOutError, ExchangeInvalidDataError, ExchangeTopic, type IConsumableMessage, type IConsumerHeartbeat, type IConsumerHeartbeatPayload, type IConsumerMessageHandlerArgs, type IEventListener, type IEventListenersConfig, type IEventListenersConfigRequired, type IExchange, type IExchangeSerialized, type IMessageSerialized, type IMessageStateSerialized, type IMessagesConfig, type IMessagesConfigStorage, type IMessagesConfigStorageOptions, type IMessagesConfigStorageOptionsRequired, type IMessagesConfigStorageRequired, type IQueueMessages, type IQueueMessagesCount, type IQueueMessagesPage, type IQueueMessagesPageParams, type IQueueParams, type IQueueProperties, type IQueueRateLimit, type IRedisSMQConfig, type IRedisSMQConfigRequired, Message, MessageDeleteError, MessageDestinationQueueAlreadySetError, MessageDestinationQueueRequiredError, MessageError, MessageExchangeRequiredError, MessageNotFoundError, Namespace, Producer, ProducerError, ProducerInstanceNotRunningError, ProducerMessageNotPublishedError, ProducerMessageNotScheduledError, ProducibleMessage, Queue, QueueAcknowledgedMessages, QueueDeadLetteredMessages, QueueError, QueueExistsError, QueueHasRunningConsumersError, QueueMessageRequeueError, QueueMessages, QueueNamespaceNotFoundError, QueueNotEmptyError, QueueNotFoundError, QueuePendingMessages, QueueRateLimit, QueueRateLimitError, QueueScheduledMessages, type TConsumerMessageHandler, type TConsumerRedisKeys, type TEventListenerInitArgs, type TExchange, type TExchangeDirect, type TExchangeDirectBindingParams, type TExchangeDirectSerialized, type TExchangeFanOut, type TExchangeFanOutBindingParams, type TExchangeFanOutSerialized, type TExchangeSerialized, type TExchangeTopic, type TExchangeTopicBindingParams, type TExchangeTopicSerialized, type TMessageConsumeOptions, type TQueueConsumer, type TRedisSMQEvent, type TTopicParams, disconnect };
858
+ export { Configuration, Consumer, ConsumerError, ConsumerMessageHandlerAlreadyExistsError, EConsumeMessageDeadLetterCause, EConsumeMessageUnacknowledgedCause, EExchangeType, EMessagePriority, EMessageProperty, EMessagePropertyStatus, EQueueProperty, EQueueType, ExchangeDirect, ExchangeError, ExchangeFanOut, ExchangeFanOutError, ExchangeInvalidDataError, ExchangeTopic, type IConsumableMessage, type IConsumerHeartbeat, type IConsumerHeartbeatPayload, type IConsumerMessageHandlerArgs, type IEventListener, type IExchange, type IExchangeSerialized, type IMessageSerialized, type IMessageStateSerialized, type IMessagesConfig, type IMessagesConfigStorage, type IMessagesConfigStorageOptions, type IMessagesConfigStorageOptionsRequired, type IMessagesConfigStorageRequired, type IQueueMessages, type IQueueMessagesCount, type IQueueMessagesPage, type IQueueMessagesPageParams, type IQueueParams, type IQueueProperties, type IQueueRateLimit, type IRedisSMQConfig, type IRedisSMQConfigRequired, Message, MessageDeleteError, MessageDestinationQueueAlreadySetError, MessageDestinationQueueRequiredError, MessageError, MessageExchangeRequiredError, MessageNotFoundError, Namespace, Producer, ProducerError, ProducerInstanceNotRunningError, ProducerMessageNotPublishedError, ProducerMessageNotScheduledError, ProducibleMessage, Queue, QueueAcknowledgedMessages, QueueDeadLetteredMessages, QueueError, QueueExistsError, QueueHasRunningConsumersError, QueueMessageRequeueError, QueueMessages, QueueNamespaceNotFoundError, QueueNotEmptyError, QueueNotFoundError, QueuePendingMessages, QueueRateLimit, QueueRateLimitError, QueueScheduledMessages, type TConsumerMessageHandler, type TConsumerRedisKeys, type TEventListenersConfig, type TExchange, type TExchangeDirect, type TExchangeDirectBindingParams, type TExchangeDirectSerialized, type TExchangeFanOut, type TExchangeFanOutBindingParams, type TExchangeFanOutSerialized, type TExchangeSerialized, type TExchangeTopic, type TExchangeTopicBindingParams, type TExchangeTopicSerialized, type TMessageConsumeOptions, type TQueueConsumer, type TRedisSMQEvent, type TTopicParams, disconnect };
package/dist/index.js CHANGED
@@ -262,14 +262,10 @@ function Messages(userConfig) {
262
262
  }
263
263
 
264
264
  // src/config/event-listeners/event-listeners.ts
265
- import { merge as merge4 } from "lodash";
266
- var defaultConfig4 = {
267
- consumerEventListeners: [],
268
- producerEventListeners: []
269
- };
265
+ var defaultConfig4 = [];
270
266
  function EventListeners(userConfig) {
271
- const { eventListeners = {} } = userConfig;
272
- return merge4({}, defaultConfig4, eventListeners);
267
+ const { eventListeners = [] } = userConfig;
268
+ return [...defaultConfig4, ...eventListeners];
273
269
  }
274
270
 
275
271
  // src/config/configuration.ts
@@ -331,11 +327,11 @@ function _destroyCommonRedisClient(cb) {
331
327
  }
332
328
 
333
329
  // types/consumer/consume-message.ts
334
- var EConsumeMessageDeadLetterCause = /* @__PURE__ */ ((EConsumeMessageDeadLetterCause3) => {
335
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["TTL_EXPIRED"] = 0] = "TTL_EXPIRED";
336
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["RETRY_THRESHOLD_EXCEEDED"] = 1] = "RETRY_THRESHOLD_EXCEEDED";
337
- EConsumeMessageDeadLetterCause3[EConsumeMessageDeadLetterCause3["PERIODIC_MESSAGE"] = 2] = "PERIODIC_MESSAGE";
338
- return EConsumeMessageDeadLetterCause3;
330
+ var EConsumeMessageDeadLetterCause = /* @__PURE__ */ ((EConsumeMessageDeadLetterCause2) => {
331
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["TTL_EXPIRED"] = 0] = "TTL_EXPIRED";
332
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["RETRY_THRESHOLD_EXCEEDED"] = 1] = "RETRY_THRESHOLD_EXCEEDED";
333
+ EConsumeMessageDeadLetterCause2[EConsumeMessageDeadLetterCause2["PERIODIC_MESSAGE"] = 2] = "PERIODIC_MESSAGE";
334
+ return EConsumeMessageDeadLetterCause2;
339
335
  })(EConsumeMessageDeadLetterCause || {});
340
336
  var EConsumeMessageUnacknowledgedCause = /* @__PURE__ */ ((EConsumeMessageUnacknowledgedCause3) => {
341
337
  EConsumeMessageUnacknowledgedCause3[EConsumeMessageUnacknowledgedCause3["TIMEOUT"] = 0] = "TIMEOUT";
@@ -724,6 +720,10 @@ var Base = class extends EventEmitter2 {
724
720
  } else
725
721
  cb();
726
722
  };
723
+ this.initEventListeners = (cb) => {
724
+ const { eventListeners } = Configuration.getSetConfig();
725
+ this.registerEventListeners(eventListeners, cb);
726
+ };
727
727
  this.tearDownEventListeners = (cb) => {
728
728
  async2.each(
729
729
  this.eventListeners,
@@ -754,7 +754,7 @@ var Base = class extends EventEmitter2 {
754
754
  this.on("error", (err) => this.handleError(err));
755
755
  }
756
756
  goingUp() {
757
- return [this.setUpSharedRedisClient];
757
+ return [this.setUpSharedRedisClient, this.initEventListeners];
758
758
  }
759
759
  up(cb) {
760
760
  this.powerSwitch.commit();
@@ -779,20 +779,14 @@ var Base = class extends EventEmitter2 {
779
779
  Ctors,
780
780
  (ctor, key, done) => {
781
781
  const instance = new ctor();
782
- instance.init(
783
- {
784
- instanceId: this.id,
785
- eventProvider: this
786
- },
787
- (err) => {
788
- if (err)
789
- done(err);
790
- else {
791
- this.eventListeners.push(instance);
792
- done();
793
- }
782
+ instance.init((err) => {
783
+ if (err)
784
+ done(err);
785
+ else {
786
+ this.eventListeners.push(instance);
787
+ done();
794
788
  }
795
- );
789
+ });
796
790
  },
797
791
  cb
798
792
  );
@@ -2888,20 +2882,20 @@ var ConsumeMessage = class {
2888
2882
  const consumerId = this.messageHandler.getConsumerId();
2889
2883
  this.messageHandler.emit(
2890
2884
  "messageUnacknowledged",
2891
- cause,
2892
2885
  messageId,
2893
2886
  queue,
2894
2887
  messageHandlerId,
2895
- consumerId
2888
+ consumerId,
2889
+ cause
2896
2890
  );
2897
2891
  if (reply.action === 0 /* DEAD_LETTER */) {
2898
2892
  this.messageHandler.emit(
2899
2893
  "messageDeadLettered",
2900
- reply.deadLetterCause,
2901
2894
  messageId,
2902
2895
  queue,
2903
2896
  messageHandlerId,
2904
- consumerId
2897
+ consumerId,
2898
+ reply.deadLetterCause
2905
2899
  );
2906
2900
  } else if (reply.action === 2 /* DELAY */) {
2907
2901
  this.messageHandler.emit(
@@ -3028,7 +3022,7 @@ var MessageHandler = class extends EventEmitter3 {
3028
3022
  });
3029
3023
  this.on(
3030
3024
  "messageDeadLettered",
3031
- (cause, messageId) => {
3025
+ (messageId, queue, messageHandlerId, consumerId, cause) => {
3032
3026
  this.logger.info(
3033
3027
  `Message (ID ${messageId}) dead-lettered (cause ${cause})`
3034
3028
  );
@@ -3036,7 +3030,7 @@ var MessageHandler = class extends EventEmitter3 {
3036
3030
  );
3037
3031
  this.on(
3038
3032
  "messageUnacknowledged",
3039
- (cause, messageId) => {
3033
+ (messageId, queue, messageHandlerId, consumerId, cause) => {
3040
3034
  this.logger.info(
3041
3035
  `Message (ID ${messageId}) unacknowledged (cause ${cause})`
3042
3036
  );
@@ -3929,12 +3923,6 @@ var Consumer = class extends Base {
3929
3923
  this.workerRunner.addWorker(new publish_scheduled_worker_default(redisClient2, true));
3930
3924
  this.workerRunner.run();
3931
3925
  };
3932
- this.initConsumerEventListeners = (cb) => {
3933
- this.registerEventListeners(
3934
- Configuration.getSetConfig().eventListeners.consumerEventListeners,
3935
- cb
3936
- );
3937
- };
3938
3926
  this.tearDownConsumerWorkers = (cb) => {
3939
3927
  if (this.workerRunner) {
3940
3928
  this.workerRunner.quit(() => {
@@ -3961,10 +3949,30 @@ var Consumer = class extends Base {
3961
3949
  this.messageHandlerRunner = useMultiplexing ? new MultiplexedMessageHandlerRunner(this, nsLogger) : new MessageHandlerRunner(this, nsLogger);
3962
3950
  this.redisKeys = redisKeys.getConsumerKeys(this.getId());
3963
3951
  }
3952
+ registerSystemEventListeners() {
3953
+ super.registerSystemEventListeners();
3954
+ this.on("messageAcknowledged", (...args) => {
3955
+ if (this.eventListeners.length)
3956
+ this.eventListeners.forEach(
3957
+ (i) => i.emit("messageAcknowledged", ...args)
3958
+ );
3959
+ });
3960
+ this.on("messageUnacknowledged", (...args) => {
3961
+ if (this.eventListeners.length)
3962
+ this.eventListeners.forEach(
3963
+ (i) => i.emit("messageUnacknowledged", ...args)
3964
+ );
3965
+ });
3966
+ this.on("messageDeadLettered", (...args) => {
3967
+ if (this.eventListeners.length)
3968
+ this.eventListeners.forEach(
3969
+ (i) => i.emit("messageDeadLettered", ...args)
3970
+ );
3971
+ });
3972
+ }
3964
3973
  goingUp() {
3965
3974
  return super.goingUp().concat([
3966
3975
  this.setUpHeartbeat,
3967
- this.initConsumerEventListeners,
3968
3976
  this.runMessageHandlers,
3969
3977
  this.setUpConsumerWorkers
3970
3978
  ]);
@@ -4053,17 +4061,12 @@ function _scheduleMessage(mixed, message, cb) {
4053
4061
 
4054
4062
  // src/lib/producer/producer.ts
4055
4063
  var Producer = class extends Base {
4056
- constructor() {
4057
- super(...arguments);
4058
- this.initProducerEventListeners = (cb) => {
4059
- this.registerEventListeners(
4060
- Configuration.getSetConfig().eventListeners.producerEventListeners,
4061
- cb
4062
- );
4063
- };
4064
- }
4065
- goingUp() {
4066
- return super.goingUp().concat([this.initProducerEventListeners]);
4064
+ registerSystemEventListeners() {
4065
+ super.registerSystemEventListeners();
4066
+ this.on("messagePublished", (...args) => {
4067
+ if (this.eventListeners.length)
4068
+ this.eventListeners.forEach((i) => i.emit("messagePublished", ...args));
4069
+ });
4067
4070
  }
4068
4071
  enqueue(redisClient2, queue, message, cb) {
4069
4072
  var _a;
@@ -4133,7 +4136,7 @@ var Producer = class extends Base {
4133
4136
  cb(err);
4134
4137
  else {
4135
4138
  this.logger.info(`Message (ID ${messageId}) has been published.`);
4136
- this.emit("messagePublished", messageId, queue);
4139
+ this.emit("messagePublished", messageId, queue, this.id);
4137
4140
  cb(null, messageId);
4138
4141
  }
4139
4142
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redis-smq",
3
- "version": "8.0.0-rc.11",
3
+ "version": "8.0.0-rc.13",
4
4
  "description": "A simple high-performance Redis message queue for Node.js.",
5
5
  "author": "Weyoss <weyoss@protonmail.com>",
6
6
  "license": "MIT",