A NestJS library for managing asynchronous and synchronous messages with support for buses, handlers, channels, and consumers. This library simplifies building scalable and decoupled applications by facilitating robust message handling pipelines while ensuring flexibility and reliability.
https://nestjstools.gitbook.io/nestjstools-messaging-docs
npm install @nestjstools/messaging @nestjstools/messaging-google-pubsub-extension
or
yarn add @nestjstools/messaging @nestjstools/messaging-google-pubsub-extension
import { Module } from '@nestjs/common';
import { MessagingModule } from '@nestjstools/messaging';
import { SendMessageHandler } from './handlers/send-message.handler';
import { MessagingGooglePubSubExtensionModule, GooglePubSubChannelConfig } from '@nestjstools/messaging-google-pubsub-extension';
@Module({
imports: [
MessagingGooglePubSubExtensionModule, // Importing the GooglePubSub extension module
MessagingModule.forRoot({
buses: [
{
name: 'message.bus',
channels: ['pubsub-command'],
},
],
channels: [
new GooglePubSubChannelConfig({
name: 'pubsub-command',
enableConsumer: true, // Enable if you want to consume messages
autoCreate: true, // Auto-create queue if it doesn't exist
credentials: { // Optional
projectId: 'x',
},
topicName: 'eventTopic',
subscriptionName: 'eventSubscriptionTopic',
}),
],
debug: true, // Optional: Enable debugging for Messaging operations
}),
],
})
export class AppModule {}
import { Controller, Get } from '@nestjs/common';
import { CreateUser } from './application/command/create-user';
import { IMessageBus, MessageBus, RoutingMessage } from '@nestjstools/messaging';
@Controller()
export class AppController {
constructor(
@MessageBus('message.bus') private pubsubMessageBus: IMessageBus,
) {}
@Get('/pubsub')
createUser(): string {
this.pubsubMessageBus.dispatch(new RoutingMessage(new CreateUser('John FROM pubsub'), 'my_app_command.create_user'));
return 'Message sent';
}
}
import { CreateUser } from '../create-user';
import { IMessageBus, IMessageHandler, MessageBus, MessageHandler, RoutingMessage, DenormalizeMessage } from '@nestjstools/messaging';
@MessageHandler('my_app_command.create_user')
export class CreateUserHandler implements IMessageHandler<CreateUser>{
handle(message: CreateUser): Promise<void> {
console.log(message);
// TODO Logic there
}
}
-
Google Cloud Pub/Sub Integration Seamlessly send and receive messages using Google Cloud Pub/Sub within your NestJS application.
-
Local Development Support with Emulator Supports running against the Google Pub/Sub emulator for local development and testing (via PUBSUB_EMULATOR_HOST).
-
Automatic Topic and Subscription Creation Automatically creates Pub/Sub topics and subscriptions when autoCreate: true is set in the configuration.
-
Named Buses & Channel Routing Supports custom-named message buses and routing of messages across multiple channels for event-driven architecture.
-
Easily configure projectId, topicName, and subscriptionName for full control over Pub/Sub setup.
To enable communication with a Handler from services written in other languages, follow these steps:
-
Publish a Message to the Topic
-
Include the Routing Key Header Your message must include a header attribute named
messaging-routing-key
. The value should correspond to the routing key defined in your NestJS message handler:@MessageHandler('my_app_command.create_user') // <-- Use this value as the routing key
this.pubSubMessageBus.dispatch(new RoutingMessage(new CreateUser('id'), 'my_app_command.create_user', new GooglePubSubMessageOptions({YourAttribute: 'value'})));
Property | Description | Default Value |
---|---|---|
name |
The name of the messaging channel within your app (used for internal routing). | |
credentials |
Google Cloud Pub/Sub credentials (e.g., { projectId: 'my-project' } ). |
|
enableConsumer |
Whether to enable message consumption (i.e., subscribing and processing messages from Pub/Sub). | true |
autoCreate |
Automatically create the topic and subscription if they do not exist in the Pub/Sub environment. | true |
topicName |
The name of the Google Pub/Sub topic to publish messages to. | |
subscriptionName |
The name of the subscription used to consume messages from the topic. |