import { Body, Controller, HttpCode, Post, Query } from '@nestjs/common'; import { Client, ClientProxy, EventPattern, MessagePattern, Transport, } from '@nestjs/microservices'; import { from, Observable, of } from 'rxjs'; import { scan } from 'rxjs/operators'; @Controller() export class AppController { static IS_NOTIFIED = false; @Client({ transport: Transport.TCP }) client: ClientProxy; @Post() @HttpCode(200) call(@Query('command') cmd, @Body() data: number[]): Observable { return this.client.send({ cmd }, data); } @Post('stream') @HttpCode(200) stream(@Body() data: number[]): Observable { return this.client .send({ cmd: 'streaming' }, data) .pipe(scan((a, b) => a + b)); } @Post('concurrent') @HttpCode(200) concurrent(@Body() data: number[][]): Promise { const send = async (tab: number[]) => { const expected = tab.reduce((a, b) => a + b); const result = await this.client .send({ cmd: 'sum' }, tab) .toPromise(); return result === expected; }; return data .map(async tab => send(tab)) .reduce(async (a, b) => (await a) && b); } @MessagePattern({ cmd: 'sum' }) sum(data: number[]): number { return (data || []).reduce((a, b) => a + b); } @MessagePattern({ cmd: 'asyncSum' }) async asyncSum(data: number[]): Promise { return (data || []).reduce((a, b) => a + b); } @MessagePattern({ cmd: 'streamSum' }) streamSum(data: number[]): Observable { return of((data || []).reduce((a, b) => a + b)); } @MessagePattern({ cmd: 'streaming' }) streaming(data: number[]): Observable { return from(data); } @Post('notify') async sendNotification(): Promise { return this.client.emit('notification', true); } @EventPattern('notification') eventHandler(data: boolean) { AppController.IS_NOTIFIED = data; } }