https://github.com/nestjstools/messaging-google-pubsub-extension
Extension for @nestjstools/messaging to handle and dispatch messages over Google pubsub protocol
https://github.com/nestjstools/messaging-google-pubsub-extension
google-pubsub messaging nestjs nestjs-pubsub nodejs service-bus
Last synced: about 2 months ago
JSON representation
Extension for @nestjstools/messaging to handle and dispatch messages over Google pubsub protocol
- Host: GitHub
- URL: https://github.com/nestjstools/messaging-google-pubsub-extension
- Owner: nestjstools
- Created: 2025-05-13T14:24:32.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2025-07-15T14:03:51.000Z (3 months ago)
- Last Synced: 2025-08-08T19:59:44.419Z (about 2 months ago)
- Topics: google-pubsub, messaging, nestjs, nestjs-pubsub, nodejs, service-bus
- Language: TypeScript
- Homepage: https://nestjstools.gitbook.io/nestjstools-messaging-docs
- Size: 237 KB
- Stars: 1
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# @nestjstools/messaging-google-pubsub-extension
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.
---
## Documentation
https://nestjstools.gitbook.io/nestjstools-messaging-docs
---
## Installation
```bash
npm install @nestjstools/messaging @nestjstools/messaging-google-pubsub-extension
```or
```bash
yarn add @nestjstools/messaging @nestjstools/messaging-google-pubsub-extension
```
## Google PubSub Integration: Messaging Configuration Example---
```typescript
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 {}
```## Dispatch messages via bus (example)
```typescript
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';
}
}
```### Handler for your message
```typescript
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{handle(message: CreateUser): Promise {
console.log(message);
// TODO Logic there
}
}
```---
### Key Features:
* **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.
---## 📨 Communicating Beyond a NestJS Application (Cross-Language Messaging)
### To enable communication with a Handler from services written in other languages, follow these steps:
1. **Publish a Message to the Topic**
2. **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:```ts
@MessageHandler('my_app_command.create_user') // <-- Use this value as the routing key
```---
## 🔧 Send additional attributes into your message```ts
this.pubSubMessageBus.dispatch(new RoutingMessage(new CreateUser('id'), 'my_app_command.create_user', new GooglePubSubMessageOptions({YourAttribute: 'value'})));
```
---## Configuration options
### GooglePubSubChannel
#### **GooglePubSubChannelConfig**
| **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. | |---
## Real world working example with RabbitMQ & Redis - but might be helpful to understand how it works
https://github.com/nestjstools/messaging-rabbitmq-example