@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 +15 -3
- package/dist/index.js +24 -15
- package/dist/mock.d.ts +11 -10
- package/dist/mock.js +1 -0
- package/package.json +8 -8
- package/src/index.ts +35 -15
- package/src/mock.ts +12 -10
- package/tsconfig.json +2 -1
- package/.eslintrc.json +0 -66
- package/dist/example.d.ts +0 -1
- package/dist/example.js +0 -37
- package/dist/index.test.d.ts +0 -1
- package/dist/index.test.js +0 -114
- package/jest.config.js +0 -14
- package/nodemon.json +0 -13
- package/src/example.ts +0 -31
- package/src/index.test.ts +0 -113
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
|
-
|
|
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 (
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
228
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autofleet/rabbit",
|
|
3
|
-
"version": "
|
|
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
|
-
"
|
|
9
|
+
"build": "tsc",
|
|
10
10
|
"linter": "./node_modules/.bin/eslint .",
|
|
11
11
|
"test": "jest --forceExit",
|
|
12
|
-
"test-local": "RABBITMQ_SERVICE_HOST=
|
|
13
|
-
"coverage": "jest --coverage --forceExit
|
|
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
|
-
"
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
241
|
-
|
|
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
|
-
|
|
5
|
+
class RabbitMq implements IAfRabbitMq {
|
|
6
|
+
ack: any = jest.fn();
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
nack: any = jest.fn();
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
assertChannel: any = jest.fn();
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
assertExchange: any = jest.fn();
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
assertQueue: any = jest.fn();
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
consume: any = jest.fn();
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
consumeFromExchange: any = jest.fn();
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
publish: any = jest.fn();
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
sendToQueue: any = jest.fn();
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export default RabbitMq;
|
package/tsconfig.json
CHANGED
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();
|
package/dist/index.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/index.test.js
DELETED
|
@@ -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
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
|
-
});
|