Microservices
Microservice are a type of architecture (opposite to monolithic) where the application is structured as a set of services that are in communication in between each other.
In Peque.ts, Microservices are applications that doesn't run via HTTP, and at this moment the available transports are:
- MQTT
 - Redis Pub/Sub
 - Apache Kafka
 - Peque SMB
 
The roadmap of transports to be supported is the following:
- Custom brokers
 
Microservices, anyway, are provider classes decorated with the @Microservice() decorator that extends the MicroserviceHandler class.
@Microservice({ broker: 'mqtt://localhost:1883', transport: 'mqtt' })
export class TestMicroservice extends MicroserviceHandler implements OnProviderInit, OnProviderDestroy {
  start(): void {
    // Start logic, if needed.
  }
  onProviderInit(): void {
    console.log('I have been initialized', TestMicroservice.name);
  }
  onProviderDestroy(): void {
    console.log('I have been destroyed', TestMicroservice.name);
  }
  @ConsumeEvent('test_event')
  test(data: EventPayload<any>) {
    console.log(JSON.stringify(data));
    this.produce({
      event: 'test_event_produced',
      data: { timestamp: Date.now(), name: 'Simone Di Cicco' },
      timestamp: Date.now(),
    });
  }
  @ProduceEvent('produce_test_event')
  produceEvent(data: EventPayload<any>) {
    return { your: 'data'}
  }
  
  produceTestNoDecorator() {
    this.produceEvent('produce_test_event', { your: 'data' });
  }
}
Bootstrap
The Microservices will be started by the PequeFactory, like the web-server.
import { TestMicroservice } from './microservices/test-microservice';
import { PequeFactory } from 'peque.ts';
async function startUp() {
  await PequeFactory.createMicroservices({ services: [TestMicroservice] }).start();
}
startUp();
Hybrid web-server/microservices applications are possible as well.
import { PequeFactory } from 'peque.ts';
import { TestMicroservice } from './microservices/test-microservice';
import { TestRedisMicroservice } from './microservices/test-redis-microservice';
import { TestServerGuard } from './modules/guards/test-server.guard';
import { TestRootModule } from './modules/root/test-root.module';
async function startUp() {
  await PequeFactory.createServer({
    rootModule: TestRootModule,
    cors: true,
    swagger: {
      folder: '/doc',
      info: {
        title: 'Test API',
        description: 'Test API description',
        contacts: {
          name: 'Simone Di Cicco',
          email: 'simone.dicicco@gmail.com',
        },
        version: '1.0.0',
      },
      servers: [{ url: 'https://api.test.com/' }],
      tags: [
        {
          name: 'Tag',
          description: 'Description',
        },
      ],
    },
    logger: {
      consoleOutput: true,
      level: 'debug',
      active: true,
      engine: 'true',
    },
    isCpuClustered: false,
    guards: [TestServerGuard],
    showOriginalErrorObject: true,
  }).start();
  await PequeFactory.createMicroservices({ services: [TestMicroservice, TestRedisMicroservice] }).start();
}
startUp();
Events
Consume
Events can be intercepted via the @ConsumeEvent() decorator.
There is no need to specify the transport, as the one specified from at microservice level will be used.
Produce
Events can be produced by the @ProduceEvent() decorator or the this.produceEvent() method
(inherited by the MicroserviceHandler). The transport, as for the consume event, is inherited by the microservice configuration.