@autofleet/rabbit 3.1.1 → 3.1.2

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/dist/index.js CHANGED
@@ -139,7 +139,7 @@ class RabbitMq {
139
139
  };
140
140
  }
141
141
  async getConnection() {
142
- return new Promise(async (resolve) => {
142
+ return new Promise(async (resolve, reject) => {
143
143
  if (this.blockReconnect) {
144
144
  debug('rabbit: block reconnect');
145
145
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -158,12 +158,30 @@ class RabbitMq {
158
158
  if (this.creatingConnection) {
159
159
  debug('rabbit: creating connection emi');
160
160
  this.em.once(consts_1.CONNECTION_CREATED_CONST, resolve);
161
+ this.em.once(consts_1.CONNECTION_FAILED_CONST, reject);
161
162
  return;
162
163
  }
163
164
  this.creatingConnection = true;
165
+ let isResolved = false;
164
166
  debug('rabbit: creating connection', { HOST, USERNAME, HEARTBEAT });
165
167
  const connection = await amqp_connection_manager_1.connect([`amqp://${USERNAME}:${PASSWORD}@${HOST}?heartbeat=${HEARTBEAT}}`]);
166
168
  this.connection = connection;
169
+ this.connection.on('error', (err) => {
170
+ logger_1.default.error('rabbit: connection error', { err });
171
+ if (!isResolved) {
172
+ isResolved = true;
173
+ reject(err);
174
+ this.em.emit(consts_1.CONNECTION_FAILED_CONST, err);
175
+ }
176
+ });
177
+ this.connection.on('connectFailed', (err) => {
178
+ logger_1.default.error('rabbit: connection connectFailed', { err });
179
+ if (!isResolved) {
180
+ isResolved = true;
181
+ reject(err);
182
+ this.em.emit(consts_1.CONNECTION_FAILED_CONST, err);
183
+ }
184
+ });
167
185
  this.connection.on('disconnect', ({ err }) => {
168
186
  debug('rabbit: connection closed');
169
187
  this.exchanges = {};
@@ -183,6 +201,7 @@ class RabbitMq {
183
201
  await this.loadConsumers();
184
202
  this.creatingConnection = false;
185
203
  this.em.emit(consts_1.CONNECTION_CREATED_CONST, connection);
204
+ isResolved = true;
186
205
  resolve(connection);
187
206
  });
188
207
  });
@@ -191,8 +210,13 @@ class RabbitMq {
191
210
  return new Promise(async (resolve, reject) => {
192
211
  const connection = await this.getConnection();
193
212
  const channel = connection.createChannel({});
213
+ let isResolved = false;
194
214
  channel.on('error', (err) => {
195
215
  logger_1.default.error(`rabbit: channel ${name} error`, { err });
216
+ if (!isResolved) {
217
+ isResolved = true;
218
+ reject(err);
219
+ }
196
220
  });
197
221
  channel.on('close', (...args) => {
198
222
  logger_1.default.error(`rabbit: channel ${name} closed`, { args });
@@ -202,6 +226,7 @@ class RabbitMq {
202
226
  });
203
227
  channel.once('connect', () => {
204
228
  debug(`rabbit: channel ${name} CONNECTED`);
229
+ isResolved = true;
205
230
  resolve(channel);
206
231
  });
207
232
  });
@@ -241,14 +266,12 @@ class RabbitMq {
241
266
  return channel.checkQueue(queue);
242
267
  }
243
268
  async deleteQueue(queue) {
244
- return new Promise(async (resolve, reject) => {
245
- RabbitMq.validateName('queue', queue);
246
- const channel = await this.assertChannel();
247
- logger_1.default.info('rabbit: deleting queue', { queue });
248
- const deleteQueueRes = await channel.deleteQueue(queue);
249
- debug('queue deleted', deleteQueueRes);
250
- resolve(deleteQueueRes);
251
- });
269
+ RabbitMq.validateName('queue', queue);
270
+ const channel = await this.assertChannel();
271
+ logger_1.default.info('rabbit: deleting queue', { queue });
272
+ const deleteQueueRes = await channel.deleteQueue(queue);
273
+ debug('queue deleted', deleteQueueRes);
274
+ return deleteQueueRes;
252
275
  }
253
276
  async bindQueue(queue, exchange) {
254
277
  const channel = await this.assertChannel();
@@ -6,6 +6,7 @@ export declare const USER_TRACING_HEADER = "x-af-user-id";
6
6
  export declare const USER_OBJECT = "userObject";
7
7
  export declare const DEFAULT_USE_CONSUME_WITH_LOCK = false;
8
8
  export declare const CONNECTION_CREATED_CONST = "connectionCreated";
9
+ export declare const CONNECTION_FAILED_CONST = "connectionFailed";
9
10
  export declare const DEFAULT_OPTIONS: {
10
11
  limit: number;
11
12
  retries: number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_OPTIONS = exports.CONNECTION_CREATED_CONST = exports.DEFAULT_USE_CONSUME_WITH_LOCK = exports.USER_OBJECT = exports.USER_TRACING_HEADER = exports.TRACING_HEADER = exports.RETRY_HEADER = exports.DEFAULT_LOCK_TIMEOUT = exports.DEFAULT_DEAD_TTL_TWO_DAYS = void 0;
3
+ exports.DEFAULT_OPTIONS = exports.CONNECTION_FAILED_CONST = exports.CONNECTION_CREATED_CONST = exports.DEFAULT_USE_CONSUME_WITH_LOCK = exports.USER_OBJECT = exports.USER_TRACING_HEADER = exports.TRACING_HEADER = exports.RETRY_HEADER = exports.DEFAULT_LOCK_TIMEOUT = exports.DEFAULT_DEAD_TTL_TWO_DAYS = void 0;
4
4
  exports.DEFAULT_DEAD_TTL_TWO_DAYS = 60000 * 60 * 12;
5
5
  exports.DEFAULT_LOCK_TIMEOUT = 1000 * 5;
6
6
  exports.RETRY_HEADER = 'x-retry-count';
@@ -9,6 +9,7 @@ exports.USER_TRACING_HEADER = 'x-af-user-id';
9
9
  exports.USER_OBJECT = 'userObject';
10
10
  exports.DEFAULT_USE_CONSUME_WITH_LOCK = false;
11
11
  exports.CONNECTION_CREATED_CONST = 'connectionCreated';
12
+ exports.CONNECTION_FAILED_CONST = 'connectionFailed';
12
13
  exports.DEFAULT_OPTIONS = {
13
14
  limit: 1,
14
15
  retries: 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ import getRedisInstance, { RedisConfig } from './lib/redis';
17
17
  import { assertExchangeFanout, rand, wrapSetImmediate } from './lib/utils';
18
18
  import {
19
19
  CONNECTION_CREATED_CONST,
20
+ CONNECTION_FAILED_CONST,
20
21
  DEFAULT_LOCK_TIMEOUT,
21
22
  DEFAULT_OPTIONS,
22
23
  RETRY_HEADER,
@@ -259,7 +260,7 @@ class RabbitMq implements IAfRabbitMq {
259
260
  }
260
261
 
261
262
  async getConnection() {
262
- return new Promise<AmqpConnectionManager>(async (resolve) => {
263
+ return new Promise<AmqpConnectionManager>(async (resolve, reject) => {
263
264
  if (this.blockReconnect) {
264
265
  debug('rabbit: block reconnect');
265
266
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -278,12 +279,32 @@ class RabbitMq implements IAfRabbitMq {
278
279
  if (this.creatingConnection) {
279
280
  debug('rabbit: creating connection emi');
280
281
  this.em.once(CONNECTION_CREATED_CONST, resolve);
282
+ this.em.once(CONNECTION_FAILED_CONST, reject);
281
283
  return;
282
284
  }
283
285
  this.creatingConnection = true;
286
+ let isResolved = false;
284
287
  debug('rabbit: creating connection', { HOST, USERNAME, HEARTBEAT });
285
288
  const connection: AmqpConnectionManager = await connect([`amqp://${USERNAME}:${PASSWORD}@${HOST}?heartbeat=${HEARTBEAT}}`]);
286
289
  this.connection = connection;
290
+ this.connection.on('error', (err) => {
291
+ logger.error('rabbit: connection error', { err });
292
+ if (!isResolved) {
293
+ isResolved = true;
294
+ reject(err);
295
+ this.em.emit(CONNECTION_FAILED_CONST, err);
296
+ }
297
+ });
298
+
299
+ this.connection.on('connectFailed', (err) => {
300
+ logger.error('rabbit: connection connectFailed', { err });
301
+ if (!isResolved) {
302
+ isResolved = true;
303
+ reject(err);
304
+ this.em.emit(CONNECTION_FAILED_CONST, err);
305
+ }
306
+ });
307
+
287
308
  this.connection.on('disconnect', ({ err }) => {
288
309
  debug('rabbit: connection closed');
289
310
  this.exchanges = {};
@@ -302,6 +323,7 @@ class RabbitMq implements IAfRabbitMq {
302
323
  await this.loadConsumers();
303
324
  this.creatingConnection = false;
304
325
  this.em.emit(CONNECTION_CREATED_CONST, connection);
326
+ isResolved = true;
305
327
  resolve(connection);
306
328
  });
307
329
  });
@@ -312,8 +334,13 @@ class RabbitMq implements IAfRabbitMq {
312
334
  const connection: AmqpConnectionManager = await this.getConnection();
313
335
  const channel = connection.createChannel({});
314
336
 
337
+ let isResolved = false;
315
338
  channel.on('error', (err) => {
316
339
  logger.error(`rabbit: channel ${name} error`, { err });
340
+ if (!isResolved) {
341
+ isResolved = true;
342
+ reject(err);
343
+ }
317
344
  });
318
345
  channel.on('close', (...args) => {
319
346
  logger.error(`rabbit: channel ${name} closed`, { args });
@@ -323,6 +350,7 @@ class RabbitMq implements IAfRabbitMq {
323
350
  });
324
351
  channel.once('connect', () => {
325
352
  debug(`rabbit: channel ${name} CONNECTED`);
353
+ isResolved = true;
326
354
  resolve(channel);
327
355
  });
328
356
  });
@@ -366,14 +394,12 @@ class RabbitMq implements IAfRabbitMq {
366
394
  }
367
395
 
368
396
  private async deleteQueue(queue: string) {
369
- return new Promise(async (resolve, reject) => {
370
- RabbitMq.validateName('queue', queue);
371
- const channel: ChannelWrapper = await this.assertChannel();
372
- logger.info('rabbit: deleting queue', { queue });
373
- const deleteQueueRes = await channel.deleteQueue(queue);
374
- debug('queue deleted', deleteQueueRes);
375
- resolve(deleteQueueRes);
376
- });
397
+ RabbitMq.validateName('queue', queue);
398
+ const channel: ChannelWrapper = await this.assertChannel();
399
+ logger.info('rabbit: deleting queue', { queue });
400
+ const deleteQueueRes = await channel.deleteQueue(queue);
401
+ debug('queue deleted', deleteQueueRes);
402
+ return deleteQueueRes;
377
403
  }
378
404
 
379
405
  async bindQueue(queue: string, exchange: string) {
package/src/lib/consts.ts CHANGED
@@ -6,6 +6,7 @@ export const USER_TRACING_HEADER = 'x-af-user-id';
6
6
  export const USER_OBJECT = 'userObject';
7
7
  export const DEFAULT_USE_CONSUME_WITH_LOCK = false;
8
8
  export const CONNECTION_CREATED_CONST = 'connectionCreated';
9
+ export const CONNECTION_FAILED_CONST = 'connectionFailed';
9
10
  export const DEFAULT_OPTIONS = {
10
11
  limit: 1,
11
12
  retries: 1,