Skip to content

Commit 8ec7c5b

Browse files
chore: resolve conflicts (merge)
2 parents 89d84d2 + 17c5044 commit 8ec7c5b

19 files changed

Lines changed: 751 additions & 9 deletions
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import * as express from 'express';
2+
import * as request from 'supertest';
3+
import { Test } from '@nestjs/testing';
4+
import { INestApplication } from '@nestjs/common';
5+
import { Transport } from '@nestjs/microservices';
6+
import { RMQController } from '../src/rmq/rmq.controller';
7+
import { RMQBroadcastController } from '../src/rmq/rmq-broadcast.controller';
8+
9+
describe('RabbitMQ transport', () => {
10+
let server;
11+
let app: INestApplication;
12+
13+
beforeEach(async () => {
14+
const module = await Test.createTestingModule({
15+
controllers: [RMQBroadcastController],
16+
}).compile();
17+
18+
server = express();
19+
app = module.createNestApplication(server);
20+
app.connectMicroservice({
21+
transport: Transport.RMQ,
22+
options: {
23+
urls: [`amqp://admin:admin@localhost`],
24+
queue: 'test',
25+
queueOptions: { durable: false },
26+
},
27+
});
28+
app.connectMicroservice({
29+
transport: Transport.RMQ,
30+
options: {
31+
urls: [`amqp://admin:admin@localhost`],
32+
queue: 'test',
33+
queueOptions: { durable: false },
34+
},
35+
});
36+
await app.startAllMicroservicesAsync();
37+
await app.init();
38+
});
39+
40+
it(`Broadcast (2 subscribers)`, () => {
41+
return request(server)
42+
.get('/broadcast')
43+
.expect(200, '2');
44+
});
45+
46+
afterEach(async () => {
47+
await app.close();
48+
});
49+
});
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as express from 'express';
2+
import * as request from 'supertest';
3+
import { Test } from '@nestjs/testing';
4+
import { INestApplication } from '@nestjs/common';
5+
import { Transport } from '@nestjs/microservices';
6+
import { RMQController } from '../src/rmq/rmq.controller';
7+
8+
describe('RabbimMQ transport', () => {
9+
let server;
10+
let app: INestApplication;
11+
12+
beforeEach(async () => {
13+
const module = await Test.createTestingModule({
14+
controllers: [RMQController],
15+
}).compile();
16+
17+
server = express();
18+
app = module.createNestApplication(server);
19+
app.connectMicroservice({
20+
transport: Transport.RMQ,
21+
options: {
22+
urls: [`amqp://admin:admin@localhost`],
23+
queue: 'test',
24+
queueOptions: { durable: false },
25+
},
26+
});
27+
await app.startAllMicroservicesAsync();
28+
await app.init();
29+
});
30+
31+
it(`/POST`, () => {
32+
return request(server)
33+
.post('/?command=sum')
34+
.send([1, 2, 3, 4, 5])
35+
.expect(200, '15');
36+
});
37+
38+
it(`/POST (Promise/async)`, () => {
39+
return request(server)
40+
.post('/?command=asyncSum')
41+
.send([1, 2, 3, 4, 5])
42+
.expect(200)
43+
.expect(200, '15');
44+
});
45+
46+
it(`/POST (Observable stream)`, () => {
47+
return request(server)
48+
.post('/?command=streamSum')
49+
.send([1, 2, 3, 4, 5])
50+
.expect(200, '15');
51+
});
52+
53+
it(`/POST (concurrent)`, () => {
54+
return request(server)
55+
.post('/concurrent')
56+
.send([
57+
[1, 2, 3, 4, 5],
58+
[6, 7, 8, 9, 10],
59+
[11, 12, 13, 14, 15],
60+
[16, 17, 18, 19, 20],
61+
[21, 22, 23, 24, 25],
62+
])
63+
.expect(200, 'true');
64+
});
65+
66+
it(`/POST (streaming)`, () => {
67+
return request(server)
68+
.post('/stream')
69+
.send([1, 2, 3, 4, 5])
70+
.expect(200, '15');
71+
});
72+
73+
afterEach(async () => {
74+
await app.close();
75+
});
76+
});
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Controller, Get } from '@nestjs/common';
2+
import {
3+
Client,
4+
MessagePattern,
5+
ClientProxy,
6+
Transport,
7+
ClientProxyFactory,
8+
} from '@nestjs/microservices';
9+
import { Observable } from 'rxjs';
10+
import { scan, take } from 'rxjs/operators';
11+
12+
@Controller()
13+
export class RMQBroadcastController {
14+
client: ClientProxy;
15+
16+
constructor() {
17+
this.client = ClientProxyFactory.create({
18+
transport: Transport.RMQ,
19+
options: {
20+
urls: [`amqp://admin:admin@localhost`],
21+
queue: 'test',
22+
queueOptions: { durable: false },
23+
},
24+
});
25+
}
26+
27+
@Get('broadcast')
28+
multicats() {
29+
return this.client
30+
.send<number>({ cmd: 'broadcast' }, {})
31+
.pipe(scan((a, b) => a + b), take(2));
32+
}
33+
34+
@MessagePattern({ cmd: 'broadcast' })
35+
replyBroadcast(): Observable<number> {
36+
return new Observable(observer => observer.next(1));
37+
}
38+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { Controller, Get, Post, Body, Query, HttpCode } from '@nestjs/common';
2+
import {
3+
Client,
4+
MessagePattern,
5+
ClientProxy,
6+
Transport,
7+
ClientProxyFactory,
8+
} from '@nestjs/microservices';
9+
import { Observable, of, from } from 'rxjs';
10+
import { scan } from 'rxjs/operators';
11+
12+
@Controller()
13+
export class RMQController {
14+
client: ClientProxy;
15+
16+
constructor() {
17+
this.client = ClientProxyFactory.create({
18+
transport: Transport.RMQ,
19+
options: {
20+
urls: [`amqp://admin:admin@localhost`],
21+
queue: 'test',
22+
queueOptions: { durable: false },
23+
},
24+
});
25+
}
26+
27+
@Post()
28+
@HttpCode(200)
29+
call(@Query('command') cmd, @Body() data: number[]) {
30+
return this.client.send<number>({ cmd }, data);
31+
}
32+
33+
@Post('stream')
34+
@HttpCode(200)
35+
stream(@Body() data: number[]): Observable<number> {
36+
return this.client
37+
.send<number>({ cmd: 'streaming' }, data)
38+
.pipe(scan((a, b) => a + b));
39+
}
40+
41+
@Post('concurrent')
42+
@HttpCode(200)
43+
concurrent(@Body() data: number[][]): Promise<boolean> {
44+
const send = async (tab: number[]) => {
45+
const expected = tab.reduce((a, b) => a + b);
46+
const result = await this.client
47+
.send<number>({ cmd: 'sum' }, tab)
48+
.toPromise();
49+
50+
return result === expected;
51+
};
52+
return data
53+
.map(async tab => await send(tab))
54+
.reduce(async (a, b) => (await a) && (await b));
55+
}
56+
57+
@MessagePattern({ cmd: 'sum' })
58+
sum(data: number[]): number {
59+
return (data || []).reduce((a, b) => a + b);
60+
}
61+
62+
@MessagePattern({ cmd: 'asyncSum' })
63+
async asyncSum(data: number[]): Promise<number> {
64+
return (data || []).reduce((a, b) => a + b);
65+
}
66+
67+
@MessagePattern({ cmd: 'streamSum' })
68+
streamSum(data: number[]): Observable<number> {
69+
return of((data || []).reduce((a, b) => a + b));
70+
}
71+
72+
@MessagePattern({ cmd: 'streaming' })
73+
streaming(data: number[]): Observable<number> {
74+
return from(data);
75+
}
76+
}

package-lock.json

Lines changed: 83 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"@nestjs/testing": "5.1.0",
4141
"@nestjs/websockets": "5.1.0",
4242
"@nuxtjs/opencollective": "^0.1.0",
43+
"amqp-connection-manager": "^2.1.1",
44+
"amqplib": "^0.5.2",
4345
"axios": "^0.17.1",
4446
"cache-manager": "^2.9.0",
4547
"class-transformer": "^0.1.8",
@@ -75,6 +77,7 @@
7577
"uuid": "^3.3.2"
7678
},
7779
"devDependencies": {
80+
"@types/amqplib": "^0.5.7",
7881
"@types/cache-manager": "^1.2.6",
7982
"@types/chai": "^3.5.2",
8083
"@types/chai-as-promised": "0.0.31",

packages/common/enums/transport.enum.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ export enum Transport {
44
NATS,
55
MQTT,
66
GRPC,
7+
RMQ
78
}

0 commit comments

Comments
 (0)