@autofleet/rabbit 1.6.1 → 1.7.0

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
@@ -23,7 +23,7 @@ declare class RabbitMq {
23
23
  options: AfRabbitOptions | undefined;
24
24
  constructor(options?: AfRabbitOptions);
25
25
  ack: (msg: any) => Promise<void>;
26
- nack: (queue: string, options: any, deadQueueOptions: Options.AssertQueue) => (msg: any) => Promise<void>;
26
+ nack: (queue: string, options: any, deadQueueOptions: Options.AssertQueue) => (msg: any, { skipRetry, }?: any) => Promise<void>;
27
27
  getConnection(): Promise<AmqpConnectionManager>;
28
28
  assertChannel(): Promise<ChannelWrapper>;
29
29
  assertExchange(exchangeName: string, options?: any): Promise<any>;
package/dist/index.js CHANGED
@@ -57,9 +57,11 @@ class RabbitMq {
57
57
  yield this.channel.ack(msg);
58
58
  }
59
59
  });
60
- this.nack = (queue, options, deadQueueOptions) => (msg) => __awaiter(this, void 0, void 0, function* () {
60
+ this.nack = (queue, options, deadQueueOptions) => (msg, { skipRetry = false, } = {}) => __awaiter(this, void 0, void 0, function* () {
61
61
  if (this.channel) {
62
- if (!msg.content['x-retry-count'] || msg.content['x-retry-count'] < options.retries) {
62
+ if (!skipRetry
63
+ && (!msg.content['x-retry-count']
64
+ || msg.content['x-retry-count'] < options.retries)) {
63
65
  msg.content['x-retry-count'] = msg.content['x-retry-count'] ? msg.content['x-retry-count'] + 1 : 1;
64
66
  yield this.sendToQueue(queue, msg.content);
65
67
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/index.ts CHANGED
@@ -82,9 +82,22 @@ class RabbitMq {
82
82
  }
83
83
  }
84
84
 
85
- public nack = (queue: string, options: any, deadQueueOptions: Options.AssertQueue) => async (msg: any) => {
85
+ public nack = (
86
+ queue: string,
87
+ options: any,
88
+ deadQueueOptions: Options.AssertQueue,
89
+ ) => async (
90
+ msg: any,
91
+ {
92
+ skipRetry = false,
93
+ }: any = { },
94
+ ) => {
86
95
  if (this.channel) {
87
- if (!msg.content['x-retry-count'] || msg.content['x-retry-count'] < options.retries) {
96
+ if (
97
+ !skipRetry
98
+ && (!msg.content['x-retry-count']
99
+ || msg.content['x-retry-count'] < options.retries)
100
+ ) {
88
101
  msg.content['x-retry-count'] = msg.content['x-retry-count'] ? msg.content['x-retry-count'] + 1 : 1;
89
102
  await this.sendToQueue(queue, msg.content);
90
103
  } else {
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,102 +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 = () => (msg, ack, nack) => {
25
- console.log('msg', msg.content);
26
- expect(msg.content.ttt).toEqual('hey-q');
27
- nack(msg);
28
- };
29
- describe('RabbitMQ', () => {
30
- it('check exchange', () => __awaiter(void 0, void 0, void 0, function* () {
31
- const mockFn = jest.fn(callback());
32
- yield rabbit.consumeFromExchange('test-q2', 'test-e', mockFn);
33
- yield rabbit.publish('test-e', 'hey');
34
- yield delay();
35
- expect(mockFn).toBeCalled();
36
- }));
37
- it('check queue', () => __awaiter(void 0, void 0, void 0, function* () {
38
- const mockFn = jest.fn(callback('hey-q'));
39
- yield rabbit.consume('test-q-2', mockFn);
40
- yield rabbit.sendToQueue('test-q-2', 'hey-q');
41
- yield delay();
42
- expect(mockFn).toBeCalled();
43
- }));
44
- it('check retry', () => __awaiter(void 0, void 0, void 0, function* () {
45
- const mockFn = jest.fn(nackcallback());
46
- yield rabbit.consume('test-q-retry', mockFn, { retries: 3 });
47
- yield rabbit.sendToQueue('test-q-retry', { ttt: 'hey-q' });
48
- yield delay(1500);
49
- expect(mockFn).toHaveBeenCalledTimes(4); // one run then 3 times retry
50
- }));
51
- it('check nack and dead queue', () => __awaiter(void 0, void 0, void 0, function* () {
52
- const mockFn = jest.fn(nackcallback());
53
- yield rabbit.consume('test-q-nack', mockFn);
54
- yield rabbit.sendToQueue('test-q-nack', { ttt: 'hey-q' });
55
- yield delay(1000);
56
- expect(mockFn).toHaveBeenCalledTimes(2); // one run then 1 time retry
57
- yield delay();
58
- const length = yield rabbit.getQueueLength('test-q-nack-dead');
59
- expect(length.messageCount).toEqual(1);
60
- }));
61
- it('cant publish to unknown exchange', () => __awaiter(void 0, void 0, void 0, function* () {
62
- let err;
63
- try {
64
- yield rabbit.publish('', 'hey');
65
- }
66
- catch (e) {
67
- err = e;
68
- }
69
- expect(err).toBeDefined();
70
- }));
71
- it('cant publish due timeout', () => __awaiter(void 0, void 0, void 0, function* () {
72
- // @ts-ignore
73
- process.env.RABBITMQ_PUBLISH_TIMEOUT = 1;
74
- const rabbit2 = new index_1.default();
75
- let err;
76
- try {
77
- yield rabbit2.publish('test-e', 'hey');
78
- }
79
- catch (e) {
80
- err = e;
81
- }
82
- expect(err).toBeDefined();
83
- }));
84
- it('get queue length', () => __awaiter(void 0, void 0, void 0, function* () {
85
- const queueName = 'test-queue-length';
86
- const exchangeName = 'test-e2';
87
- yield rabbit.assertQueue(queueName);
88
- yield rabbit.assertExchange(exchangeName);
89
- yield rabbit.bindQueue(queueName, exchangeName);
90
- yield rabbit.publish(exchangeName, 'hey');
91
- let messageCount;
92
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
93
- expect(messageCount).toEqual(1);
94
- yield rabbit.publish(exchangeName, 'hey');
95
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
96
- expect(messageCount).toEqual(2);
97
- yield rabbit.consumeFromExchange(queueName, exchangeName, callback());
98
- yield delay();
99
- ({ messageCount } = yield rabbit.getQueueLength(queueName));
100
- expect(messageCount).toEqual(0);
101
- }));
102
- });
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,101 +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 = () => (msg: any, ack: any, nack: any) => {
16
- console.log('msg', msg.content);
17
- expect(msg.content.ttt).toEqual('hey-q');
18
- nack(msg);
19
- };
20
-
21
- describe('RabbitMQ', () => {
22
- it('check exchange', async () => {
23
- const mockFn = jest.fn(callback());
24
- await rabbit.consumeFromExchange('test-q2', 'test-e', mockFn);
25
- await rabbit.publish('test-e', 'hey');
26
- await delay();
27
- expect(mockFn).toBeCalled();
28
- });
29
-
30
- it('check queue', async () => {
31
- const mockFn = jest.fn(callback('hey-q'));
32
- await rabbit.consume('test-q-2', mockFn);
33
- await rabbit.sendToQueue('test-q-2', 'hey-q');
34
- await delay();
35
- expect(mockFn).toBeCalled();
36
- });
37
-
38
- it('check retry', async () => {
39
- const mockFn = jest.fn(nackcallback());
40
- await rabbit.consume('test-q-retry', mockFn, { retries: 3 });
41
- await rabbit.sendToQueue('test-q-retry', { ttt: 'hey-q' });
42
- await delay(1500);
43
- expect(mockFn).toHaveBeenCalledTimes(4); // one run then 3 times retry
44
- });
45
-
46
- it('check nack and dead queue', async () => {
47
- const mockFn = jest.fn(nackcallback());
48
- await rabbit.consume('test-q-nack', mockFn);
49
- await rabbit.sendToQueue('test-q-nack', { ttt: 'hey-q' });
50
- await delay(1000);
51
- expect(mockFn).toHaveBeenCalledTimes(2); // one run then 1 time retry
52
- await delay();
53
- const length = await rabbit.getQueueLength('test-q-nack-dead');
54
- expect(length.messageCount).toEqual(1);
55
- });
56
-
57
- it('cant publish to unknown exchange', async () => {
58
- let err;
59
- try {
60
- await rabbit.publish('', 'hey');
61
- } catch (e) {
62
- err = e;
63
- }
64
- expect(err).toBeDefined();
65
- });
66
-
67
- it('cant publish due timeout', async () => {
68
- // @ts-ignore
69
- process.env.RABBITMQ_PUBLISH_TIMEOUT = 1;
70
- const rabbit2 = new RabbitMq();
71
-
72
- let err;
73
- try {
74
- await rabbit2.publish('test-e', 'hey');
75
- } catch (e) {
76
- err = e;
77
- }
78
- expect(err).toBeDefined();
79
- });
80
-
81
- it('get queue length', async () => {
82
- const queueName = 'test-queue-length';
83
- const exchangeName = 'test-e2';
84
-
85
- await rabbit.assertQueue(queueName);
86
- await rabbit.assertExchange(exchangeName);
87
- await rabbit.bindQueue(queueName, exchangeName);
88
-
89
- await rabbit.publish(exchangeName, 'hey');
90
- let messageCount: any;
91
- ({ messageCount } = await rabbit.getQueueLength(queueName));
92
- expect(messageCount).toEqual(1);
93
- await rabbit.publish(exchangeName, 'hey');
94
- ({ messageCount } = await rabbit.getQueueLength(queueName));
95
- expect(messageCount).toEqual(2);
96
- await rabbit.consumeFromExchange(queueName, exchangeName, callback());
97
- await delay();
98
- ({ messageCount } = await rabbit.getQueueLength(queueName));
99
- expect(messageCount).toEqual(0);
100
- });
101
- });