Nats

πŸ“¨ Nats Channel Integration

This extension enables seamless integration between @nestjstools/messaging and Nats.


πŸš€ Installation

Install both the core messaging package and the NATS extension:

npm install @nestjstools/messaging @nestjstools/messaging-nats-extension

or

yarn add @nestjstools/messaging @nestjstools/messaging-nats-extension

βš™οΈ Basic Setup Example

import { Module } from '@nestjs/common';
import { MessagingModule } from '@nestjstools/messaging';
import { MessagingNatsExtensionModule, NatsChannelConfig } from "@nestjstools/messaging-nats-extension";

@Module({
  imports: [
    MessagingNatsExtensionModule,
    MessagingModule.forRoot({
      buses: [
        {
          name: 'nats-event.bus',
          channels: ['nats-event'],
        },
      ],
      channels: [
        new NatsChannelConfig({
          name: 'nats-event',
          enableConsumer: true,
          connectionUris: ['nats://localhost:4222'],
          subscriberName: 'nats-core',
        }),
      ],
      debug: true,
    }),
  ],
})
export class AppModule {}

πŸ“¬ Dispatching Messages

Use @MessageBus to inject and use the bus:

import { Controller, Get } from '@nestjs/common';
import { IMessageBus, MessageBus, RoutingMessage } from '@nestjstools/messaging';
import { CreateUser } from './application/command/create-user';

@Controller()
export class AppController {
  constructor(
    @MessageBus('nats-event.bus') private natsMessageBus: IMessageBus,
  ) {}

  @Get('/nats')
  createUser(): string {
    this.natsMessageBus.dispatch(
      new RoutingMessage(
        new CreateUser('John FROM Nats'),
        'my_app_command.create_user'
      )
    );

    return 'Message sent';
  }
}

🧰 Message Handler

To handle dispatched messages, use @MessageHandler:

import { MessageHandler, IMessageHandler } from '@nestjstools/messaging';
import { CreateUser } from '../create-user';

@MessageHandler('my_app_command.create_user')
export class CreateUserHandler implements IMessageHandler<CreateUser> {
  async handle(message: CreateUser): Promise<void> {
    console.log(message);
    // Implement your business logic here
  }
}

πŸ” Cross-Language Messaging

Enable interoperability with services in other languages:

  1. Publish a Message via NATS.

  2. Include the Routing Header:

    messaging-routing-key: my_app_command.create_user
  3. The message will be routed to the corresponding handler automatically.


πŸ”„ Routing Strategy

Routing depends on the subscriberName:

  • Static Routing:

    • Uses subscriberName directly as subject.

  • Wildcard Routing:

    • Uses message.messageRoutingKey for dynamic routing.

subscriberName = 'order.*';
message.messageRoutingKey = 'order.created';
// Publishes to subject: 'order.created'

πŸ› οΈ NatsChannel Configuration Options

Property
Description
Default

name

Channel name (e.g., 'nats-event').

β€”

enableConsumer

Whether to consume messages from this channel.

true

connectionUris

Array of NATS server URIs (e.g., ['nats://localhost:4222']).

β€”

subscriberName

Queue group / subject name or pattern (e.g., 'order.*', 'my-sub').

β€”

Last updated