@autofleet/rabbit 2.1.16-beta → 2.2.0-beta-1

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/.env ADDED
File without changes
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { Options } from 'amqplib';
2
+ import { Options, ConsumeMessage } from 'amqplib';
3
3
  import { AmqpConnectionManager, ChannelWrapper } from 'amqp-connection-manager';
4
4
  import { EventEmitter } from 'events';
5
5
  import { RedisConfig } from './redis';
@@ -24,6 +24,15 @@ interface QueuesCache {
24
24
  declare type CustomMessageHeaders = {
25
25
  redisTimestampValidationKey?: string;
26
26
  };
27
+ declare type RedisLockType = (args0?: string, arg1?: number) => Promise<any>;
28
+ interface ConsumeOptions {
29
+ retries?: number;
30
+ deadMessageTtl?: number;
31
+ limit?: number;
32
+ lockTimeout?: number;
33
+ useConsumeWithLock?: boolean;
34
+ }
35
+ declare type CallbackFunction = (msg: ConsumeMessage, ack: Function, nack: Function) => Promise<any>;
27
36
  export interface AfRabbitOptions {
28
37
  reconnect: boolean;
29
38
  }
@@ -46,9 +55,10 @@ declare class RabbitMq implements IAfRabbitMq {
46
55
  queues: QueuesCache;
47
56
  options: AfRabbitOptions | undefined;
48
57
  redisClient: any;
58
+ redisLock?: RedisLockType;
49
59
  constructor(options?: AfRabbitOptions, redisConfig?: RedisConfig);
50
60
  private shouldConsumeMessageByTimestamp;
51
- ack: (channel: ChannelWrapper, shouldUpdateRedisTimestamp?: boolean) => (msg: any) => Promise<void>;
61
+ ack: (channel: ChannelWrapper, shouldUpdateRedisTimestamp?: boolean) => (msg: ConsumeMessage) => Promise<any>;
52
62
  nack: (channel: ChannelWrapper, queue: string, options: any, deadQueueOptions: Options.AssertQueue) => (msg: any, { skipRetry, }?: any) => Promise<void>;
53
63
  getConnection(): Promise<AmqpConnectionManager>;
54
64
  getNewChannel(): Promise<ChannelWrapper>;
@@ -57,9 +67,11 @@ declare class RabbitMq implements IAfRabbitMq {
57
67
  getQueueLength(queue: string): Promise<import("amqplib").Replies.AssertQueue>;
58
68
  bindQueue(queue: string, exchange: string): Promise<void>;
59
69
  assertQueue(queueName: string, options?: Options.AssertQueue): Promise<any>;
60
- consume(queue: string, callback: (msg: any, ack: Function, nack: Function) => any, options?: any): Promise<void>;
61
- consumeFromExchange(queue: string, exchange: string, callback: (msg: any, ack: Function, nack: Function) => any, options?: any): Promise<void>;
62
- publish(exchange: string, content: any, customHeaders?: any): Promise<void>;
70
+ consume(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any>;
71
+ private consumeWithLock;
72
+ private consumeFromRabbit;
73
+ consumeFromExchange(queue: string, exchange: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any>;
74
+ publish(exchange: string, content: any, customHeaders?: any): Promise<any>;
63
75
  sendToQueue(queue: string, content: any, options?: any, customHeaders?: any): Promise<boolean>;
64
76
  isConnected(): Promise<boolean>;
65
77
  }
package/dist/index.js CHANGED
@@ -15,9 +15,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  /* eslint-disable @typescript-eslint/ban-ts-comment,@typescript-eslint/ban-types,@typescript-eslint/no-unused-vars,consistent-return,no-async-promise-executor,no-param-reassign,no-empty */
16
16
  // eslint-disable-next-line max-classes-per-file
17
17
  const moment_1 = __importDefault(require("moment"));
18
+ const redis_lock_1 = __importDefault(require("redis-lock"));
18
19
  const amqp_connection_manager_1 = require("amqp-connection-manager");
19
20
  const events_1 = require("events");
20
21
  // import { newTrace, traceTypes } from '@autofleet/outbreak';
22
+ const util_1 = require("util");
21
23
  const logger_1 = __importDefault(require("./logger"));
22
24
  const rabbitError_1 = __importDefault(require("./rabbitError"));
23
25
  const redis_1 = __importDefault(require("./redis"));
@@ -27,9 +29,9 @@ const defaultOptions = {
27
29
  retries: 1,
28
30
  deadMessageTtl: DEFAULT_DEAD_TTL_TWO_DAYS,
29
31
  };
30
- const SECONDS_TO_MILLISECONDS = 1000;
31
32
  const assertExchangeFanout = (c, exchangeName) => c.assertExchange(exchangeName, 'fanout');
32
33
  const connectionCreatedConst = 'connectionCreated';
34
+ const DEFAULT_LOCK_TIMEOUT = 1000;
33
35
  class RabbitMq {
34
36
  constructor(options, redisConfig) {
35
37
  this.PUBLISH_TIMEOUT = Number(process.env.RABBITMQ_PUBLISH_TIMEOUT) || 60000;
@@ -37,15 +39,18 @@ class RabbitMq {
37
39
  this.DISCONNECT_MSG = 'rabbit: connection disconnect';
38
40
  this.RESCONNECT_MSG = 'rabbit: reconnecting';
39
41
  this.shouldConsumeMessageByTimestamp = (msg) => __awaiter(this, void 0, void 0, function* () {
40
- const { properties: { timestamp, headers } } = msg;
41
- if (timestamp && (headers === null || headers === void 0 ? void 0 : headers.redisTimestampValidationKey) && this.redisClient) {
42
- const lastMessageTimestamp = yield this.redisClient.getAsync(headers.redisTimestampValidationKey);
43
- logger_1.default.info('rabbit: checking if should consume params', {
44
- msg, timestamp, headers, lastMessageTimestamp,
45
- });
46
- return !lastMessageTimestamp || (parseInt(lastMessageTimestamp, 10) <= parseInt(timestamp, 10));
42
+ if (msg) {
43
+ const { properties: { timestamp, headers } } = msg;
44
+ if (timestamp && (headers === null || headers === void 0 ? void 0 : headers.redisTimestampValidationKey) && this.redisClient) {
45
+ const lastMessageTimestamp = yield this.redisClient.getAsync(headers.redisTimestampValidationKey);
46
+ logger_1.default.info('rabbit: checking if should consume params', {
47
+ msg, timestamp, headers, lastMessageTimestamp,
48
+ });
49
+ return !lastMessageTimestamp || (parseInt(lastMessageTimestamp, 10) <= parseInt(timestamp, 10));
50
+ }
51
+ return true;
47
52
  }
48
- return true;
53
+ return false;
49
54
  });
50
55
  this.ack = (channel, shouldUpdateRedisTimestamp = false) => (msg) => __awaiter(this, void 0, void 0, function* () {
51
56
  yield channel.ack(msg);
@@ -79,6 +84,9 @@ class RabbitMq {
79
84
  this.queues = {};
80
85
  this.options = options;
81
86
  this.redisClient = redisConfig && redis_1.default(redisConfig);
87
+ if (this.redisClient) {
88
+ this.redisLock = util_1.promisify(redis_lock_1.default(this.redisClient));
89
+ }
82
90
  }
83
91
  static parseMsg(msg) {
84
92
  let { content } = msg;
@@ -121,11 +129,11 @@ class RabbitMq {
121
129
  this.exchanges = {};
122
130
  this.queues = {};
123
131
  if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.reconnect) {
124
- console.error(`${this.RESCONNECT_MSG}${err && ` - ${err}`}`);
132
+ logger_1.default.error(`${this.RESCONNECT_MSG}${err && ` - ${err}`}`);
125
133
  this.connection = null;
126
134
  }
127
135
  else {
128
- console.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);
136
+ logger_1.default.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);
129
137
  }
130
138
  });
131
139
  this.creatingConnection = false;
@@ -198,6 +206,45 @@ class RabbitMq {
198
206
  });
199
207
  }
200
208
  consume(queue, callback, options) {
209
+ return __awaiter(this, void 0, void 0, function* () {
210
+ if (options && options.useConsumeWithLock) {
211
+ return this.consumeWithLock(queue, callback, options);
212
+ }
213
+ return this.consumeFromRabbit(queue, callback, options);
214
+ });
215
+ }
216
+ consumeWithLock(queue, callback, options) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ if (!this.redisLock) {
219
+ throw new Error('Usage of consumeWithLock requires RedisInstance');
220
+ }
221
+ const lockTimeout = options && options.lockTimeout ? options.lockTimeout : DEFAULT_LOCK_TIMEOUT;
222
+ logger_1.default.info(`Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
223
+ return this.consumeFromRabbit(queue, (msg, ack, nack) => __awaiter(this, void 0, void 0, function* () {
224
+ if (!msg) {
225
+ return null;
226
+ }
227
+ const { properties: { timestamp, headers } } = msg;
228
+ let releaseLock = null;
229
+ try {
230
+ if (timestamp && (headers === null || headers === void 0 ? void 0 : headers.redisTimestampValidationKey)) {
231
+ if (this.redisLock) {
232
+ releaseLock = yield this.redisLock(headers.redisTimestampValidationKey, lockTimeout);
233
+ yield callback(msg, ack, nack);
234
+ yield releaseLock();
235
+ }
236
+ }
237
+ }
238
+ catch (err) {
239
+ if (releaseLock) {
240
+ yield releaseLock();
241
+ }
242
+ throw err;
243
+ }
244
+ }), options);
245
+ });
246
+ }
247
+ consumeFromRabbit(queue, callback, options) {
201
248
  return __awaiter(this, void 0, void 0, function* () {
202
249
  const optionsWithDefaults = Object.assign(Object.assign({}, defaultOptions), options);
203
250
  RabbitMq.validateName('queue', queue);
@@ -208,20 +255,20 @@ class RabbitMq {
208
255
  yield c.prefetch(limit, true);
209
256
  return Promise.all([
210
257
  c.consume(queue, (msg) => __awaiter(this, void 0, void 0, function* () {
211
- if (msg) {
212
- const parsedMessage = RabbitMq.parseMsg(msg);
213
- // newTrace(traceTypes.RABBIT);
214
- const shouldConsume = yield this.shouldConsumeMessageByTimestamp(parsedMessage);
215
- logger_1.default.info('rabbit: trying to consume', { queue, shouldConsume, msg });
216
- if (!shouldConsume) {
217
- return this.ack(channel)(msg);
218
- }
219
- try {
220
- yield callback(parsedMessage, this.ack(channel, true), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
221
- }
222
- catch (e) {
223
- yield this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl })(msg);
224
- }
258
+ if (!msg) {
259
+ return null;
260
+ }
261
+ const parsedMessage = RabbitMq.parseMsg(msg);
262
+ const shouldConsume = yield this.shouldConsumeMessageByTimestamp(parsedMessage);
263
+ logger_1.default.info('rabbit: trying to consume', { queue, shouldConsume, msg });
264
+ if (!shouldConsume) {
265
+ return this.ack(channel)(msg);
266
+ }
267
+ try {
268
+ yield callback(parsedMessage, this.ack(channel, true), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
269
+ }
270
+ catch (e) {
271
+ yield this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl })(msg);
225
272
  }
226
273
  })),
227
274
  ]);
@@ -242,16 +289,7 @@ class RabbitMq {
242
289
  yield c.prefetch(limit, true);
243
290
  return Promise.all([
244
291
  c.bindQueue(queue, exchange, ''),
245
- c.consume(queue, (msg) => __awaiter(this, void 0, void 0, function* () {
246
- const parsedMessage = RabbitMq.parseMsg(msg);
247
- // newTrace(traceTypes.RABBIT);
248
- const shouldConsume = yield this.shouldConsumeMessageByTimestamp(parsedMessage);
249
- logger_1.default.info('rabbit: trying to consume', { queue, shouldConsume, msg });
250
- if (!shouldConsume) {
251
- return this.ack(channel)(msg);
252
- }
253
- callback(parsedMessage, this.ack(channel, true), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
254
- })),
292
+ this.consume(queue, callback, options),
255
293
  ]);
256
294
  }));
257
295
  });
package/dump.rdb ADDED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "2.1.16-beta",
3
+ "version": "2.2.0-beta-1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@autofleet/logger": "^1.2.8",
19
- "@types/amqp-connection-manager": "^2.0.10",
19
+ "@types/amqp-connection-manager": "^2.0.12",
20
20
  "@types/amqplib": "^0.5.16",
21
21
  "@types/uuid": "^8.3.3",
22
22
  "amqp-connection-manager": "^3.7.0",
@@ -24,6 +24,7 @@
24
24
  "bluebird": "^3.7.2",
25
25
  "moment": "^2.29.1",
26
26
  "redis": "^3.1.2",
27
+ "redis-lock": "^0.1.4",
27
28
  "uuid": "^8.3.2"
28
29
  },
29
30
  "devDependencies": {
package/src/index.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  /* eslint-disable @typescript-eslint/ban-ts-comment,@typescript-eslint/ban-types,@typescript-eslint/no-unused-vars,consistent-return,no-async-promise-executor,no-param-reassign,no-empty */
2
2
  // eslint-disable-next-line max-classes-per-file
3
3
  import moment from 'moment';
4
- import { ConfirmChannel, Options } from 'amqplib';
4
+ import RedisLock from 'redis-lock';
5
+ import { ConfirmChannel, Options, ConsumeMessage } from 'amqplib';
5
6
  import { AmqpConnectionManager, ChannelWrapper, connect } from 'amqp-connection-manager';
6
7
  import { EventEmitter } from 'events';
7
8
  // import { newTrace, traceTypes } from '@autofleet/outbreak';
9
+ import { promisify } from 'util';
8
10
  import logger from './logger';
9
11
  import RabbitError from './rabbitError';
10
12
  import getRedisInstance, { RedisConfig } from './redis';
@@ -33,6 +35,19 @@ type CustomMessageHeaders = {
33
35
  redisTimestampValidationKey?: string;
34
36
  }
35
37
 
38
+ type RedisLockType = (args0?: string, arg1?: number) => Promise<any>
39
+
40
+ type ConsumeMessageOrNull = ConsumeMessage | null;
41
+ interface ConsumeOptions {
42
+ retries?: number;
43
+ deadMessageTtl?: number;
44
+ limit?: number;
45
+ lockTimeout?: number;
46
+ useConsumeWithLock?: boolean;
47
+ }
48
+
49
+ type CallbackFunction = (msg: ConsumeMessage, ack: Function, nack: Function) => Promise<any>
50
+
36
51
  export interface AfRabbitOptions {
37
52
  reconnect: boolean;
38
53
  }
@@ -44,13 +59,15 @@ const defaultOptions = {
44
59
  retries: 1,
45
60
  deadMessageTtl: DEFAULT_DEAD_TTL_TWO_DAYS,
46
61
  };
47
- const SECONDS_TO_MILLISECONDS = 1000;
48
62
 
49
63
  const assertExchangeFanout = (c: any, exchangeName: string) => c.assertExchange(exchangeName, 'fanout');
50
64
 
51
65
  const connectionCreatedConst = 'connectionCreated';
66
+
67
+ const DEFAULT_LOCK_TIMEOUT = 1000;
68
+
52
69
  class RabbitMq implements IAfRabbitMq {
53
- static parseMsg(msg: any) {
70
+ static parseMsg(msg: any) : any {
54
71
  let { content } = msg;
55
72
  content = content.toString();
56
73
 
@@ -101,6 +118,8 @@ class RabbitMq implements IAfRabbitMq {
101
118
 
102
119
  redisClient: any;
103
120
 
121
+ redisLock?: RedisLockType;
122
+
104
123
  constructor(options?: AfRabbitOptions, redisConfig?: RedisConfig) {
105
124
  this.em = new EventEmitter();
106
125
  this.channel = null;
@@ -110,21 +129,27 @@ class RabbitMq implements IAfRabbitMq {
110
129
  this.queues = {};
111
130
  this.options = options;
112
131
  this.redisClient = redisConfig && getRedisInstance(redisConfig);
132
+ if (this.redisClient) {
133
+ this.redisLock = promisify(RedisLock(this.redisClient)) as RedisLockType;
134
+ }
113
135
  }
114
136
 
115
- private shouldConsumeMessageByTimestamp = async (msg: any) => {
116
- const { properties: { timestamp, headers } } = msg;
117
- if (timestamp && headers?.redisTimestampValidationKey && this.redisClient) {
118
- const lastMessageTimestamp = await this.redisClient.getAsync(headers.redisTimestampValidationKey);
119
- logger.info('rabbit: checking if should consume params', {
120
- msg, timestamp, headers, lastMessageTimestamp,
121
- });
122
- return !lastMessageTimestamp || (parseInt(lastMessageTimestamp, 10) <= parseInt(timestamp, 10));
137
+ private shouldConsumeMessageByTimestamp = async (msg: ConsumeMessageOrNull) => {
138
+ if (msg) {
139
+ const { properties: { timestamp, headers } } = msg;
140
+ if (timestamp && headers?.redisTimestampValidationKey && this.redisClient) {
141
+ const lastMessageTimestamp = await this.redisClient.getAsync(headers.redisTimestampValidationKey);
142
+ logger.info('rabbit: checking if should consume params', {
143
+ msg, timestamp, headers, lastMessageTimestamp,
144
+ });
145
+ return !lastMessageTimestamp || (parseInt(lastMessageTimestamp, 10) <= parseInt(timestamp, 10));
146
+ }
147
+ return true;
123
148
  }
124
- return true;
149
+ return false;
125
150
  }
126
151
 
127
- public ack = (channel: ChannelWrapper, shouldUpdateRedisTimestamp = false) => async (msg: any) => {
152
+ public ack = (channel: ChannelWrapper, shouldUpdateRedisTimestamp = false) => async (msg: ConsumeMessage) : Promise<any> => {
128
153
  await channel.ack(msg);
129
154
  const { properties: { timestamp, headers } } = msg;
130
155
  if (shouldUpdateRedisTimestamp && timestamp && headers?.redisTimestampValidationKey && this.redisClient) {
@@ -181,10 +206,10 @@ class RabbitMq implements IAfRabbitMq {
181
206
  this.exchanges = {};
182
207
  this.queues = {};
183
208
  if (this.options?.reconnect) {
184
- console.error(`${this.RESCONNECT_MSG}${err && ` - ${err}`}`);
209
+ logger.error(`${this.RESCONNECT_MSG}${err && ` - ${err}`}`);
185
210
  this.connection = null;
186
211
  } else {
187
- console.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);
212
+ logger.error(`${this.DISCONNECT_MSG}${err && ` - ${err}`}`);
188
213
  }
189
214
  });
190
215
  this.creatingConnection = false;
@@ -250,7 +275,46 @@ class RabbitMq implements IAfRabbitMq {
250
275
  return queue;
251
276
  }
252
277
 
253
- async consume(queue: string, callback: (msg: any, ack: Function, nack: Function) => any, options?: any) {
278
+ async consume(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
279
+ if (options && options.useConsumeWithLock) {
280
+ return this.consumeWithLock(queue, callback, options);
281
+ }
282
+ return this.consumeFromRabbit(queue, callback, options);
283
+ }
284
+
285
+ private async consumeWithLock(queue: string, callback: CallbackFunction, options?: ConsumeOptions) : Promise<any> {
286
+ if (!this.redisLock) {
287
+ throw new Error('Usage of consumeWithLock requires RedisInstance');
288
+ }
289
+ const lockTimeout = options && options.lockTimeout ? options.lockTimeout : DEFAULT_LOCK_TIMEOUT;
290
+ logger.info(`Consuming with lock from queue ${queue} with lockTimeout: ${lockTimeout}ms`);
291
+ return this.consumeFromRabbit(queue, async (msg, ack, nack) => {
292
+ if (!msg) {
293
+ return null;
294
+ }
295
+ const { properties: { timestamp, headers } } = msg;
296
+ let releaseLock = null;
297
+ try {
298
+ if (timestamp && headers?.redisTimestampValidationKey) {
299
+ if (this.redisLock) {
300
+ releaseLock = await this.redisLock(
301
+ headers.redisTimestampValidationKey,
302
+ lockTimeout,
303
+ );
304
+ await callback(msg, ack, nack);
305
+ await releaseLock();
306
+ }
307
+ }
308
+ } catch (err) {
309
+ if (releaseLock) {
310
+ await releaseLock();
311
+ }
312
+ throw err;
313
+ }
314
+ }, options);
315
+ }
316
+
317
+ private async consumeFromRabbit(queue: string, callback: CallbackFunction, options?: ConsumeOptions): Promise<any> {
254
318
  const optionsWithDefaults = { ...defaultOptions, ...options };
255
319
  RabbitMq.validateName('queue', queue);
256
320
  const { limit, deadMessageTtl } = optionsWithDefaults;
@@ -261,33 +325,32 @@ class RabbitMq implements IAfRabbitMq {
261
325
  return Promise.all([
262
326
  c.consume(
263
327
  queue,
264
- async (msg: any) => {
265
- if (msg) {
266
- const parsedMessage = RabbitMq.parseMsg(msg);
267
- // newTrace(traceTypes.RABBIT);
268
- const shouldConsume = await this.shouldConsumeMessageByTimestamp(parsedMessage);
269
- logger.info('rabbit: trying to consume', { queue, shouldConsume, msg });
270
- if (!shouldConsume) {
271
- return this.ack(channel)(msg);
272
- }
273
- try {
274
- await callback(
275
- parsedMessage,
276
- this.ack(channel, true),
277
- this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }),
278
- );
279
- } catch (e) {
280
- await this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl })(msg);
281
- }
328
+ async (msg: ConsumeMessageOrNull) => {
329
+ if (!msg) {
330
+ return null;
331
+ }
332
+ const parsedMessage = RabbitMq.parseMsg(msg);
333
+ const shouldConsume = await this.shouldConsumeMessageByTimestamp(parsedMessage);
334
+ logger.info('rabbit: trying to consume', { queue, shouldConsume, msg });
335
+ if (!shouldConsume) {
336
+ return this.ack(channel)(msg);
337
+ }
338
+ try {
339
+ await callback(
340
+ parsedMessage,
341
+ this.ack(channel, true),
342
+ this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }),
343
+ );
344
+ } catch (e) {
345
+ await this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl })(msg);
282
346
  }
283
347
  },
284
-
285
348
  ),
286
349
  ]);
287
350
  });
288
351
  }
289
352
 
290
- async consumeFromExchange(queue: string, exchange: string, callback: (msg: any, ack: Function, nack: Function) => any, options?: any) {
353
+ async consumeFromExchange(queue: string, exchange: string, callback: CallbackFunction, options?: ConsumeOptions) : Promise<any> {
291
354
  const optionsWithDefaults = { ...defaultOptions, ...options };
292
355
  RabbitMq.validateName('exchange', exchange);
293
356
  RabbitMq.validateName('queue', queue);
@@ -301,24 +364,16 @@ class RabbitMq implements IAfRabbitMq {
301
364
  await c.prefetch(limit, true);
302
365
  return Promise.all([
303
366
  c.bindQueue(queue, exchange, ''),
304
- c.consume(
367
+ this.consume(
305
368
  queue,
306
- async (msg: any) => {
307
- const parsedMessage = RabbitMq.parseMsg(msg);
308
- // newTrace(traceTypes.RABBIT);
309
- const shouldConsume = await this.shouldConsumeMessageByTimestamp(parsedMessage);
310
- logger.info('rabbit: trying to consume', { queue, shouldConsume, msg });
311
- if (!shouldConsume) {
312
- return this.ack(channel)(msg);
313
- }
314
- callback(parsedMessage, this.ack(channel, true), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
315
- },
369
+ callback,
370
+ options,
316
371
  ),
317
372
  ]);
318
373
  });
319
374
  }
320
375
 
321
- async publish(exchange: string, content: any, customHeaders?: any) {
376
+ async publish(exchange: string, content: any, customHeaders?: any) : Promise<any> {
322
377
  RabbitMq.validateName('exchange', exchange);
323
378
  const channel: ChannelWrapper = await this.assertChannel();
324
379
  await this.assertExchange(exchange);
@@ -327,7 +382,7 @@ class RabbitMq implements IAfRabbitMq {
327
382
  RabbitMq.getPublishOptions(customHeaders));
328
383
  }
329
384
 
330
- async sendToQueue(queue: string, content: any, options?: any, customHeaders?: any) {
385
+ async sendToQueue(queue: string, content: any, options?: any, customHeaders?: any) : Promise<boolean> {
331
386
  RabbitMq.validateName('queue', queue);
332
387
  const channel: ChannelWrapper = await this.assertChannel();
333
388
  await this.assertQueue(queue, options);
@@ -0,0 +1,4 @@
1
+ declare module 'redis-lock' {
2
+ const lock: any;
3
+ export = lock;
4
+ }