@autofleet/rabbit 1.6.2 → 2.0.0-1beta

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.d.ts CHANGED
@@ -2,13 +2,24 @@
2
2
  import { Options } from 'amqplib';
3
3
  import { AmqpConnectionManager, ChannelWrapper } from 'amqp-connection-manager';
4
4
  import { EventEmitter } from 'events';
5
+ export interface IAfRabbitMq {
6
+ ack: any;
7
+ nack: any;
8
+ assertChannel: any;
9
+ assertExchange: any;
10
+ assertQueue: any;
11
+ consume: any;
12
+ consumeFromExchange: any;
13
+ publish: any;
14
+ sendToQueue: any;
15
+ }
5
16
  interface ExchangesCache {
6
17
  [key: string]: any;
7
18
  }
8
19
  export interface AfRabbitOptions {
9
20
  reconnect: boolean;
10
21
  }
11
- declare class RabbitMq {
22
+ declare class RabbitMq implements IAfRabbitMq {
12
23
  static parseMsg(msg: any): any;
13
24
  static validateName(type: string, name: string): void;
14
25
  PUBLISH_TIMEOUT: number;
@@ -22,9 +33,10 @@ declare class RabbitMq {
22
33
  exchanges: ExchangesCache;
23
34
  options: AfRabbitOptions | undefined;
24
35
  constructor(options?: AfRabbitOptions);
25
- ack: (msg: any) => Promise<void>;
26
- nack: (queue: string, options: any, deadQueueOptions: Options.AssertQueue) => (msg: any, { skipRetry, }?: any) => Promise<void>;
36
+ ack: (channel: ChannelWrapper) => (msg: any) => Promise<void>;
37
+ nack: (channel: ChannelWrapper, queue: string, options: any, deadQueueOptions: Options.AssertQueue) => (msg: any, { skipRetry, }?: any) => Promise<void>;
27
38
  getConnection(): Promise<AmqpConnectionManager>;
39
+ getNewChannel(): Promise<ChannelWrapper>;
28
40
  assertChannel(): Promise<ChannelWrapper>;
29
41
  assertExchange(exchangeName: string, options?: any): Promise<any>;
30
42
  getQueueLength(queue: string): Promise<any>;
package/dist/index.js CHANGED
@@ -52,13 +52,11 @@ class RabbitMq {
52
52
  this.PUBLISH_ERROR_MSG = `rabbit: publish timeout(${this.PUBLISH_TIMEOUT}ms) has pass, exchange: `;
53
53
  this.DISCONNECT_MSG = 'rabbit: connection disconnect';
54
54
  this.RESCONNECT_MSG = 'rabbit: reconnecting';
55
- this.ack = (msg) => __awaiter(this, void 0, void 0, function* () {
56
- if (this.channel) {
57
- yield this.channel.ack(msg);
58
- }
55
+ this.ack = (channel) => (msg) => __awaiter(this, void 0, void 0, function* () {
56
+ yield channel.ack(msg);
59
57
  });
60
- this.nack = (queue, options, deadQueueOptions) => (msg, { skipRetry = false, } = {}) => __awaiter(this, void 0, void 0, function* () {
61
- if (this.channel) {
58
+ this.nack = (channel, queue, options, deadQueueOptions) => (msg, { skipRetry = false, } = {}) => __awaiter(this, void 0, void 0, function* () {
59
+ if (channel) {
62
60
  if (!skipRetry
63
61
  && (!msg.content['x-retry-count']
64
62
  || msg.content['x-retry-count'] < options.retries)) {
@@ -70,7 +68,7 @@ class RabbitMq {
70
68
  yield this.assertQueue(deadQueue, deadQueueOptions);
71
69
  yield this.sendToQueue(deadQueue, msg.content, deadQueueOptions);
72
70
  }
73
- yield this.channel.ack(msg);
71
+ yield channel.ack(msg);
74
72
  }
75
73
  });
76
74
  this.em = new events_1.EventEmitter();
@@ -102,7 +100,7 @@ class RabbitMq {
102
100
  return;
103
101
  }
104
102
  if (this.connection !== null) {
105
- return this.connection;
103
+ return resolve(this.connection);
106
104
  }
107
105
  this.creatingConnection = true;
108
106
  const host = process.env.RABBITMQ_SERVICE_HOST || '';
@@ -124,6 +122,12 @@ class RabbitMq {
124
122
  }));
125
123
  });
126
124
  }
125
+ getNewChannel() {
126
+ return __awaiter(this, void 0, void 0, function* () {
127
+ const connection = yield this.getConnection();
128
+ return connection.createChannel({});
129
+ });
130
+ }
127
131
  assertChannel() {
128
132
  return __awaiter(this, void 0, void 0, function* () {
129
133
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
@@ -183,14 +187,14 @@ class RabbitMq {
183
187
  const optionsWithDefaults = Object.assign(Object.assign({}, defaultOptions), options);
184
188
  RabbitMq.validateName('queue', queue);
185
189
  const { limit, deadMessageTtl } = optionsWithDefaults;
186
- const channel = yield this.assertChannel();
190
+ const channel = yield this.getNewChannel();
187
191
  return channel.addSetup((c) => __awaiter(this, void 0, void 0, function* () {
188
192
  yield c.assertQueue(queue);
189
193
  yield c.prefetch(limit, true);
190
194
  return Promise.all([
191
195
  c.consume(queue, (msg) => {
192
196
  outbreak_1.newTrace(outbreak_1.traceTypes.RABBIT);
193
- callback(RabbitMq.parseMsg(msg), this.ack, this.nack(queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
197
+ callback(RabbitMq.parseMsg(msg), this.ack(channel), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
194
198
  }),
195
199
  ]);
196
200
  }));
@@ -202,7 +206,7 @@ class RabbitMq {
202
206
  RabbitMq.validateName('exchange', exchange);
203
207
  RabbitMq.validateName('queue', queue);
204
208
  const { limit, deadMessageTtl } = optionsWithDefaults;
205
- const channel = yield this.assertChannel();
209
+ const channel = yield this.getNewChannel();
206
210
  return channel.addSetup((c) => __awaiter(this, void 0, void 0, function* () {
207
211
  const assertExchange = yield assertExchangeFanout(c, exchange);
208
212
  yield c.assertQueue(queue);
@@ -212,7 +216,7 @@ class RabbitMq {
212
216
  c.bindQueue(queue, exchange, ''),
213
217
  c.consume(queue, (msg) => {
214
218
  outbreak_1.newTrace(outbreak_1.traceTypes.RABBIT);
215
- callback(RabbitMq.parseMsg(msg), this.ack, this.nack(queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
219
+ callback(RabbitMq.parseMsg(msg), this.ack(channel), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
216
220
  }),
217
221
  ]);
218
222
  }));
@@ -223,9 +227,14 @@ class RabbitMq {
223
227
  RabbitMq.validateName('exchange', exchange);
224
228
  const channel = yield this.assertChannel();
225
229
  yield this.assertExchange(exchange);
226
- return new bluebird.Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
227
- yield channel.publish(exchange, '', Buffer.from(JSON.stringify(content)));
228
- return resolve();
230
+ return new bluebird.Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
231
+ try {
232
+ yield channel.publish(exchange, '', Buffer.from(JSON.stringify(content)));
233
+ return resolve();
234
+ }
235
+ catch (e) {
236
+ reject(e);
237
+ }
229
238
  })).timeout(this.PUBLISH_TIMEOUT, `${this.PUBLISH_ERROR_MSG}${exchange}`);
230
239
  });
231
240
  }
package/dist/mock.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import 'jest';
2
- declare class RabbitMq {
3
- ack: jest.Mock<unknown>;
4
- nack: jest.Mock<unknown>;
5
- assertChannel: jest.Mock<unknown>;
6
- assertExchange: jest.Mock<unknown>;
7
- assertQueue: jest.Mock<unknown>;
8
- consume: jest.Mock<unknown>;
9
- consumeFromExchange: jest.Mock<unknown>;
10
- publish: jest.Mock<unknown>;
11
- sendToQueue: jest.Mock<unknown>;
2
+ import { IAfRabbitMq } from './index';
3
+ declare class RabbitMq implements IAfRabbitMq {
4
+ ack: any;
5
+ nack: any;
6
+ assertChannel: any;
7
+ assertExchange: any;
8
+ assertQueue: any;
9
+ consume: any;
10
+ consumeFromExchange: any;
11
+ publish: any;
12
+ sendToQueue: any;
12
13
  }
13
14
  export default RabbitMq;
package/dist/mock.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // eslint-disable-next-line import/no-extraneous-dependencies
3
4
  require("jest");
4
5
  class RabbitMq {
5
6
  constructor() {
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "1.6.2",
3
+ "version": "2.0.0-1beta",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
7
  "start": "ts-node src/index.ts",
8
8
  "example": "ts-node src/example.ts",
9
- "prepublish": "tsc",
9
+ "build": "tsc",
10
10
  "linter": "./node_modules/.bin/eslint .",
11
11
  "test": "jest --forceExit",
12
- "test-local": "RABBITMQ_SERVICE_HOST=34.76.123.137:5672 jest --forceExit",
13
- "coverage": "jest --coverage --forceExit --runInBand && rm -rf ./coverage",
12
+ "test-local": "RABBITMQ_SERVICE_HOST=10.132.0.98:5672 jest --forceExit",
13
+ "coverage": "jest --coverage --forceExit && rm -rf ./coverage",
14
14
  "dev": "nodemon"
15
15
  },
16
16
  "dependencies": {
17
17
  "@autofleet/outbreak": "0.0.6",
18
18
  "@types/amqp-connection-manager": "^2.0.10",
19
19
  "@types/amqplib": "^0.5.16",
20
- "@types/jest": "^22.0.0",
21
20
  "amqp-connection-manager": "^3.2.1",
22
21
  "amqplib": "^0.6.0",
23
- "bluebird": "^3.7.2",
24
- "jest": "^22.4.4"
22
+ "bluebird": "^3.7.2"
25
23
  },
26
24
  "devDependencies": {
25
+ "@types/jest": "^26.0.23",
27
26
  "@typescript-eslint/eslint-plugin": "^4.8.1",
28
27
  "eslint": "^7.13.0",
29
28
  "eslint-config-airbnb-typescript": "^12.0.0",
30
29
  "eslint-plugin-import": "^2.22.1",
31
- "ts-jest": "^25.4.0",
30
+ "jest": "^27.0.5",
31
+ "ts-jest": "^27.0.3",
32
32
  "ts-node": "^8.6.2",
33
33
  "typescript": "^3.8.3"
34
34
  },
package/src/index.ts CHANGED
@@ -7,6 +7,18 @@ import { EventEmitter } from 'events';
7
7
  import { newTrace, traceTypes } from '@autofleet/outbreak';
8
8
  import RabbitError from './rabbitError';
9
9
 
10
+ export interface IAfRabbitMq {
11
+ ack: any;
12
+ nack: any;
13
+ assertChannel: any;
14
+ assertExchange: any;
15
+ assertQueue: any;
16
+ consume: any;
17
+ consumeFromExchange: any;
18
+ publish: any;
19
+ sendToQueue: any;
20
+ }
21
+
10
22
  interface ExchangesCache {
11
23
  [key: string]: any
12
24
  }
@@ -26,7 +38,7 @@ const defaultOptions = {
26
38
  const assertExchangeFanout = (c: any, exchangeName: string) => c.assertExchange(exchangeName, 'fanout');
27
39
 
28
40
  const connectionCreatedConst = 'connectionCreated';
29
- class RabbitMq {
41
+ class RabbitMq implements IAfRabbitMq {
30
42
  static parseMsg(msg: any) {
31
43
  let { content } = msg;
32
44
  content = content.toString();
@@ -76,13 +88,12 @@ class RabbitMq {
76
88
  this.options = options;
77
89
  }
78
90
 
79
- public ack = async (msg: any) => {
80
- if (this.channel) {
81
- await this.channel.ack(msg);
82
- }
91
+ public ack = (channel: ChannelWrapper) => async (msg: any) => {
92
+ await channel.ack(msg);
83
93
  }
84
94
 
85
95
  public nack = (
96
+ channel: ChannelWrapper,
86
97
  queue: string,
87
98
  options: any,
88
99
  deadQueueOptions: Options.AssertQueue,
@@ -92,7 +103,7 @@ class RabbitMq {
92
103
  skipRetry = false,
93
104
  }: any = { },
94
105
  ) => {
95
- if (this.channel) {
106
+ if (channel) {
96
107
  if (
97
108
  !skipRetry
98
109
  && (!msg.content['x-retry-count']
@@ -105,7 +116,7 @@ class RabbitMq {
105
116
  await this.assertQueue(deadQueue, deadQueueOptions);
106
117
  await this.sendToQueue(deadQueue, msg.content, deadQueueOptions);
107
118
  }
108
- await this.channel.ack(msg);
119
+ await channel.ack(msg);
109
120
  }
110
121
  }
111
122
 
@@ -116,7 +127,7 @@ class RabbitMq {
116
127
  return;
117
128
  }
118
129
  if (this.connection !== null) {
119
- return this.connection;
130
+ return resolve(this.connection);
120
131
  }
121
132
  this.creatingConnection = true;
122
133
  const host: string = process.env.RABBITMQ_SERVICE_HOST || '';
@@ -137,6 +148,11 @@ class RabbitMq {
137
148
  });
138
149
  }
139
150
 
151
+ async getNewChannel() {
152
+ const connection: AmqpConnectionManager = await this.getConnection();
153
+ return connection.createChannel({});
154
+ }
155
+
140
156
  async assertChannel() {
141
157
  return new Promise<ChannelWrapper>(async (resolve, reject) => {
142
158
  if (this.channel) {
@@ -191,7 +207,7 @@ class RabbitMq {
191
207
  const optionsWithDefaults = { ...defaultOptions, ...options };
192
208
  RabbitMq.validateName('queue', queue);
193
209
  const { limit, deadMessageTtl } = optionsWithDefaults;
194
- const channel: ChannelWrapper = await this.assertChannel();
210
+ const channel: ChannelWrapper = await this.getNewChannel();
195
211
  return channel.addSetup(async (c: ConfirmChannel) => {
196
212
  await c.assertQueue(queue);
197
213
  await c.prefetch(limit, true);
@@ -200,7 +216,7 @@ class RabbitMq {
200
216
  queue,
201
217
  (msg: any) => {
202
218
  newTrace(traceTypes.RABBIT);
203
- callback(RabbitMq.parseMsg(msg), this.ack, this.nack(queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
219
+ callback(RabbitMq.parseMsg(msg), this.ack(channel), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
204
220
  },
205
221
  ),
206
222
  ]);
@@ -212,7 +228,7 @@ class RabbitMq {
212
228
  RabbitMq.validateName('exchange', exchange);
213
229
  RabbitMq.validateName('queue', queue);
214
230
  const { limit, deadMessageTtl } = optionsWithDefaults;
215
- const channel: ChannelWrapper = await this.assertChannel();
231
+ const channel: ChannelWrapper = await this.getNewChannel();
216
232
 
217
233
  return channel.addSetup(async (c: ConfirmChannel) => {
218
234
  const assertExchange = await assertExchangeFanout(c, exchange);
@@ -225,7 +241,7 @@ class RabbitMq {
225
241
  queue,
226
242
  (msg: any) => {
227
243
  newTrace(traceTypes.RABBIT);
228
- callback(RabbitMq.parseMsg(msg), this.ack, this.nack(queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
244
+ callback(RabbitMq.parseMsg(msg), this.ack(channel), this.nack(channel, queue, optionsWithDefaults, { messageTtl: deadMessageTtl }));
229
245
  },
230
246
  ),
231
247
  ]);
@@ -236,9 +252,13 @@ class RabbitMq {
236
252
  RabbitMq.validateName('exchange', exchange);
237
253
  const channel: ChannelWrapper = await this.assertChannel();
238
254
  await this.assertExchange(exchange);
239
- return new bluebird.Promise(async (resolve) => {
240
- await channel.publish(exchange, '', Buffer.from(JSON.stringify(content)));
241
- return resolve();
255
+ return new bluebird.Promise(async (resolve, reject) => {
256
+ try {
257
+ await channel.publish(exchange, '', Buffer.from(JSON.stringify(content)));
258
+ return resolve();
259
+ } catch (e) {
260
+ reject(e);
261
+ }
242
262
  }).timeout(this.PUBLISH_TIMEOUT, `${this.PUBLISH_ERROR_MSG}${exchange}`);
243
263
  }
244
264
 
package/src/mock.ts CHANGED
@@ -1,23 +1,25 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
1
2
  import 'jest';
3
+ import { IAfRabbitMq } from './index';
2
4
 
3
- class RabbitMq {
4
- public ack = jest.fn();
5
+ class RabbitMq implements IAfRabbitMq {
6
+ ack: any = jest.fn();
5
7
 
6
- public nack = jest.fn();
8
+ nack: any = jest.fn();
7
9
 
8
- public assertChannel = jest.fn();
10
+ assertChannel: any = jest.fn();
9
11
 
10
- public assertExchange = jest.fn();
12
+ assertExchange: any = jest.fn();
11
13
 
12
- public assertQueue = jest.fn();
14
+ assertQueue: any = jest.fn();
13
15
 
14
- public consume = jest.fn();
16
+ consume: any = jest.fn();
15
17
 
16
- public consumeFromExchange = jest.fn();
18
+ consumeFromExchange: any = jest.fn();
17
19
 
18
- public publish = jest.fn();
20
+ publish: any = jest.fn();
19
21
 
20
- public sendToQueue = jest.fn();
22
+ sendToQueue: any = jest.fn();
21
23
  }
22
24
 
23
25
  export default RabbitMq;
package/tsconfig.json CHANGED
@@ -6,5 +6,6 @@
6
6
  "outDir": "./dist",
7
7
  "strict": true,
8
8
  "esModuleInterop": true
9
- }
9
+ },
10
+ "exclude": ["node_modules", "**/*.test.ts"]
10
11
  }
package/.eslintrc.json DELETED
@@ -1,66 +0,0 @@
1
- {
2
- "root": true,
3
- "env": {
4
- "node": true,
5
- "jest": true
6
- },
7
- "extends": [
8
- "airbnb-base",
9
- "plugin:@typescript-eslint/recommended"
10
- ],
11
- "rules": {
12
- "import/extensions": [
13
- "error",
14
- "ignorePackages",
15
- {
16
- "js": "never",
17
- "jsx": "never",
18
- "ts": "never",
19
- "tsx": "never"
20
- }
21
- ],
22
- "@typescript-eslint/no-unused-vars": ["error"],
23
- "@typescript-eslint/no-var-requires": ["off"],
24
- "@typescript-eslint/camelcase": ["off"],
25
- "max-len": ["off"],
26
- "@typescript-eslint/explicit-function-return-type": ["off"]
27
- },
28
- "overrides": [
29
- {
30
- // enable the rule specifically for TypeScript files
31
- "files": ["src/**.js", "src/**.ts"],
32
- "rules": {
33
- "@typescript-eslint/explicit-function-return-type": ["off"],
34
- "@typescript-eslint/no-var-requires": ["off"],
35
- "@typescript-eslint/camelcase": ["off"]
36
- }
37
- }
38
- ],
39
- "parser": "@typescript-eslint/parser",
40
- "parserOptions": {
41
- "project": "./tsconfig.json",
42
- "sourceType": "module"
43
- },
44
- "ignorePatterns": ["dist/*", "node_modules/", "jest.config.js", "migrations/*", "newrelic.js"],
45
- "plugins": ["@typescript-eslint"],
46
- "settings": {
47
- "import/extensions": [
48
- "error",
49
- "ignorePackages",
50
- {
51
- "js": "never",
52
- "jsx": "never",
53
- "ts": "never",
54
- "tsx": "never"
55
- }
56
- ],
57
- "import/parsers": {
58
- "@typescript-eslint/parser": [".ts",".tsx"]
59
- },
60
- "import/resolver": {
61
- "node": {
62
- "extensions": [".js",".jsx",".ts",".tsx", ".json"]
63
- }
64
- }
65
- }
66
- }
package/dist/example.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/example.js DELETED
@@ -1,37 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const index_1 = __importDefault(require("./index"));
16
- process.env.RABBITMQ_SERVICE_HOST = '34.76.123.137:5672';
17
- const init = () => __awaiter(void 0, void 0, void 0, function* () {
18
- const rabbit = new index_1.default();
19
- yield rabbit.consumeFromExchange('test-q2', 'test-e', (msg, ack) => {
20
- console.log('consumeFromExchange: msg2', msg.content);
21
- ack(msg);
22
- });
23
- yield rabbit.consumeFromExchange('test-q', 'test-e', (msg, ack) => {
24
- console.log('consumeFromExchange: msg', msg.content);
25
- ack(msg);
26
- });
27
- yield rabbit.publish('test-e', 'hey');
28
- yield rabbit.publish('test-e', 'hey1');
29
- yield rabbit.consume('test-q-2', (msg, ack) => {
30
- console.log('consume: msg-q', msg.content);
31
- ack(msg);
32
- });
33
- yield rabbit.sendToQueue('test-q-2', 'hey-q');
34
- const getQueueLength = yield rabbit.getQueueLength('test-q2');
35
- console.log(`getQueueLength:${getQueueLength}`);
36
- });
37
- init();
@@ -1 +0,0 @@
1
- export {};
@@ -1,114 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- /* eslint-disable @typescript-eslint/ban-ts-comment,@typescript-eslint/no-unused-vars */
16
- const index_1 = __importDefault(require("./index"));
17
- jest.setTimeout(120000);
18
- const rabbit = new index_1.default();
19
- const delay = (ms = 500) => new Promise((resolve) => setTimeout(() => resolve(), ms));
20
- const callback = (eq = 'hey') => (msg, ack) => {
21
- expect(msg.content).toEqual(eq);
22
- ack(msg);
23
- };
24
- const nackcallback = ({ skipRetry = false } = {}) => (msg, ack, nack) => {
25
- console.log('msg', msg.content);
26
- expect(msg.content.ttt).toEqual('hey-q');
27
- if (skipRetry) {
28
- nack(msg, { skipRetry });
29
- }
30
- else {
31
- nack(msg);
32
- }
33
- };
34
- describe('RabbitMQ', () => {
35
- it('check exchange', () => __awaiter(void 0, void 0, void 0, function* () {
36
- const mockFn = jest.fn(callback());
37
- yield rabbit.consumeFromExchange('test-q2', 'test-e', mockFn);
38
- yield rabbit.publish('test-e', 'hey');
39
- yield delay();
40
- expect(mockFn).toBeCalled();
41
- }));
42
- it('check queue', () => __awaiter(void 0, void 0, void 0, function* () {
43
- const mockFn = jest.fn(callback('hey-q'));
44
- yield rabbit.consume('test-q-2', mockFn);
45
- yield rabbit.sendToQueue('test-q-2', 'hey-q');
46
- yield delay();
47
- expect(mockFn).toBeCalled();
48
- }));
49
- it('check retry', () => __awaiter(void 0, void 0, void 0, function* () {
50
- const mockFn = jest.fn(nackcallback());
51
- yield rabbit.consume('test-q-retry', mockFn, { retries: 3 });
52
- yield rabbit.sendToQueue('test-q-retry', { ttt: 'hey-q' });
53
- yield delay(1500);
54
- expect(mockFn).toHaveBeenCalledTimes(4); // one run then 3 times retry
55
- }));
56
- it('check skip retry', () => __awaiter(void 0, void 0, void 0, function* () {
57
- const mockFn = jest.fn(nackcallback({ skipRetry: true }));
58
- yield rabbit.consume('test-q-skip-retry', mockFn, { retries: 3 });
59
- yield rabbit.sendToQueue('test-q-skip-retry', { ttt: 'hey-q' });
60
- yield delay(1500);
61
- expect(mockFn).toHaveBeenCalledTimes(1);
62
- }));
63
- it('check nack and dead queue', () => __awaiter(void 0, void 0, void 0, function* () {
64
- const mockFn = jest.fn(nackcallback());
65
- yield rabbit.consume('test-q-nack', mockFn);
66
- yield rabbit.sendToQueue('test-q-nack', { ttt: 'hey-q' });
67
- yield delay(1000);
68
- expect(mockFn).toHaveBeenCalledTimes(2); // one run then 1 time retry
69
- yield delay();
70
- const length = yield rabbit.getQueueLength('test-q-nack-dead');
71
- expect(length.messageCount).toEqual(1);
72
- }));
73
- it('cant publish to unknown exchange', () => __awaiter(void 0, void 0, void 0, function* () {
74
- let err;
75
- try {
76
- yield rabbit.publish('', 'hey');
77
- }
78
- catch (e) {
79
- err = e;
80
- }
81
- expect(err).toBeDefined();
82
- }));
83
- it('cant publish due timeout', () => __awaiter(void 0, void 0, void 0, function* () {
84
- // @ts-ignore
85
- process.env.RABBITMQ_PUBLISH_TIMEOUT = 1;
86
- const rabbit2 = new index_1.default();
87
- let err;
88
- try {
89
- yield rabbit2.publish('test-e', 'hey');
90
- }
91
- catch (e) {
92
- err = e;
93
- }
94
- expect(err).toBeDefined();
95
- }));
96
- it('get queue length', () => __awaiter(void 0, void 0, void 0, function* () {
97
- const queueName = 'test-queue-length';
98
- const exchangeName = 'test-e2';
99
- yield rabbit.assertQueue(queueName);
100
- yield rabbit.assertExchange(exchangeName);
101
- yield rabbit.bindQueue(queueName, exchangeName);
102
- yield rabbit.publish(exchangeName, 'hey');
103
- let messageCount;
104
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
105
- expect(messageCount).toEqual(1);
106
- yield rabbit.publish(exchangeName, 'hey');
107
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
108
- expect(messageCount).toEqual(2);
109
- yield rabbit.consumeFromExchange(queueName, exchangeName, callback());
110
- yield delay();
111
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
112
- expect(messageCount).toEqual(0);
113
- }));
114
- });
package/jest.config.js DELETED
@@ -1,14 +0,0 @@
1
- module.exports = {
2
- testEnvironment: 'node',
3
- roots: ['<rootDir>/src'],
4
- transform: {
5
- '^.+\\.tsx?$': 'ts-jest',
6
- },
7
- testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(tsx?$|jsx?$)',
8
- moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
9
- coverageThreshold: {
10
- global: {
11
- lines: 75,
12
- },
13
- },
14
- }
package/nodemon.json DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "ignore": [
3
- "**/*.test.ts",
4
- "**/*.spec.ts",
5
- ".git",
6
- "node_modules"
7
- ],
8
- "watch": [
9
- "src"
10
- ],
11
- "exec": "npm start",
12
- "ext": "ts"
13
- }
package/src/example.ts DELETED
@@ -1,31 +0,0 @@
1
- import RabbitMq from './index';
2
-
3
- process.env.RABBITMQ_SERVICE_HOST = '34.76.123.137:5672';
4
-
5
- const init = async () => {
6
- const rabbit = new RabbitMq();
7
-
8
- await rabbit.consumeFromExchange('test-q2', 'test-e', (msg, ack) => {
9
- console.log('consumeFromExchange: msg2', msg.content);
10
- ack(msg);
11
- });
12
-
13
- await rabbit.consumeFromExchange('test-q', 'test-e', (msg, ack) => {
14
- console.log('consumeFromExchange: msg', msg.content);
15
- ack(msg);
16
- });
17
- await rabbit.publish('test-e', 'hey');
18
- await rabbit.publish('test-e', 'hey1');
19
-
20
- await rabbit.consume('test-q-2', (msg, ack) => {
21
- console.log('consume: msg-q', msg.content);
22
- ack(msg);
23
- });
24
-
25
- await rabbit.sendToQueue('test-q-2', 'hey-q');
26
-
27
- const getQueueLength = await rabbit.getQueueLength('test-q2');
28
- console.log(`getQueueLength:${getQueueLength}`);
29
- };
30
-
31
- init();
package/src/index.test.ts DELETED
@@ -1,113 +0,0 @@
1
- /* eslint-disable @typescript-eslint/ban-ts-comment,@typescript-eslint/no-unused-vars */
2
- import RabbitMq from './index';
3
-
4
- jest.setTimeout(120000);
5
-
6
- const rabbit = new RabbitMq();
7
-
8
- const delay = (ms = 500) => new Promise((resolve) => setTimeout(() => resolve(), ms));
9
-
10
- const callback = (eq = 'hey') => (msg: any, ack: any) => {
11
- expect(msg.content).toEqual(eq);
12
- ack(msg);
13
- };
14
-
15
- const nackcallback = ({ skipRetry = false } = { }) => (msg: any, ack: any, nack: any) => {
16
- console.log('msg', msg.content);
17
- expect(msg.content.ttt).toEqual('hey-q');
18
- if (skipRetry) {
19
- nack(msg, { skipRetry });
20
- } else {
21
- nack(msg);
22
- }
23
- };
24
-
25
- describe('RabbitMQ', () => {
26
- it('check exchange', async () => {
27
- const mockFn = jest.fn(callback());
28
- await rabbit.consumeFromExchange('test-q2', 'test-e', mockFn);
29
- await rabbit.publish('test-e', 'hey');
30
- await delay();
31
- expect(mockFn).toBeCalled();
32
- });
33
-
34
- it('check queue', async () => {
35
- const mockFn = jest.fn(callback('hey-q'));
36
- await rabbit.consume('test-q-2', mockFn);
37
- await rabbit.sendToQueue('test-q-2', 'hey-q');
38
- await delay();
39
- expect(mockFn).toBeCalled();
40
- });
41
-
42
- it('check retry', async () => {
43
- const mockFn = jest.fn(nackcallback());
44
- await rabbit.consume('test-q-retry', mockFn, { retries: 3 });
45
- await rabbit.sendToQueue('test-q-retry', { ttt: 'hey-q' });
46
- await delay(1500);
47
- expect(mockFn).toHaveBeenCalledTimes(4); // one run then 3 times retry
48
- });
49
-
50
- it('check skip retry', async () => {
51
- const mockFn = jest.fn(nackcallback({ skipRetry: true }));
52
- await rabbit.consume('test-q-skip-retry', mockFn, { retries: 3 });
53
- await rabbit.sendToQueue('test-q-skip-retry', { ttt: 'hey-q' });
54
- await delay(1500);
55
- expect(mockFn).toHaveBeenCalledTimes(1);
56
- });
57
-
58
- it('check nack and dead queue', async () => {
59
- const mockFn = jest.fn(nackcallback());
60
- await rabbit.consume('test-q-nack', mockFn);
61
- await rabbit.sendToQueue('test-q-nack', { ttt: 'hey-q' });
62
- await delay(1000);
63
- expect(mockFn).toHaveBeenCalledTimes(2); // one run then 1 time retry
64
- await delay();
65
- const length = await rabbit.getQueueLength('test-q-nack-dead');
66
- expect(length.messageCount).toEqual(1);
67
- });
68
-
69
- it('cant publish to unknown exchange', async () => {
70
- let err;
71
- try {
72
- await rabbit.publish('', 'hey');
73
- } catch (e) {
74
- err = e;
75
- }
76
- expect(err).toBeDefined();
77
- });
78
-
79
- it('cant publish due timeout', async () => {
80
- // @ts-ignore
81
- process.env.RABBITMQ_PUBLISH_TIMEOUT = 1;
82
- const rabbit2 = new RabbitMq();
83
-
84
- let err;
85
- try {
86
- await rabbit2.publish('test-e', 'hey');
87
- } catch (e) {
88
- err = e;
89
- }
90
- expect(err).toBeDefined();
91
- });
92
-
93
- it('get queue length', async () => {
94
- const queueName = 'test-queue-length';
95
- const exchangeName = 'test-e2';
96
-
97
- await rabbit.assertQueue(queueName);
98
- await rabbit.assertExchange(exchangeName);
99
- await rabbit.bindQueue(queueName, exchangeName);
100
-
101
- await rabbit.publish(exchangeName, 'hey');
102
- let messageCount: any;
103
- ({ messageCount } = await rabbit.getQueueLength(queueName));
104
- expect(messageCount).toEqual(1);
105
- await rabbit.publish(exchangeName, 'hey');
106
- ({ messageCount } = await rabbit.getQueueLength(queueName));
107
- expect(messageCount).toEqual(2);
108
- await rabbit.consumeFromExchange(queueName, exchangeName, callback());
109
- await delay();
110
- ({ messageCount } = await rabbit.getQueueLength(queueName));
111
- expect(messageCount).toEqual(0);
112
- });
113
- });