@aarek/nest-stan
TypeScript icon, indicating that this package has built-in type declarations

0.0.1-alpha1 • Public • Published

@aarek/nest-stan

Table of Contents

Description

Wrapper around node-nats-streaming for NestJS.

Usage

Install

npm install --save @aarek/nest-stan

or

yarn add @aarek/nest-stan

Module initialization

@Module({
  imports: [
    NestStanModule.forRoot({
      clientId: 'client-id-test1',
      clusterId: 'test-cluster',
      stanOptions: {
        url: 'nats://localhost:4222'
      }
    })
  ]
})
export class AppModule {}

or

@Module({
  imports: [
    NestStanModule.forRootAsync({
      imports: [ConfigModule]
      inject: [ConfigService],
      useFactory: (config: ConfigService) => config.nestStanConfig(),
    }),
  ]
})
export class AppModule {}

Handling messages

Nest Stan gives you two decorators StanSubscribe and AsyncStanSubscribe. AsyncStanSubscribe will automatically acknowledge message after successful Promise resolve. Both decorators accepts subject as first argument and optional OptionsBuilder as second argument. OptionsBuilder is a function accepting node-nats-streaming SubscriptionOptions and should return SubscriptionOptions.

ex.:

@StanSubscribe('subject', options =>
  options.setStartAtTimeDelta(30 * 1000),
)
export class Subscriber implements IStanSubscriber<Message> {
  handle(message: Message, context: IMessageHandlerContext): void {
    // Handle message
    return;
  }
}
@AsyncStanSubscribe('subject', options =>
  options
    .setStartAtTimeDelta(30 * 1000)
    .setDurableName(AsyncSubscriber.name),
)
export class AsyncSubscriber implements IStanSubscriber<Message> {
  async handle(message: Message, context: IMessageHandlerContext): Promise<void> {
    // Handle message
    return;
  }
}

Publishing messages

In order to publish messages you first need to import NestStanModule for subjects that you would like to publish to:

@Module({
  imports: [NestStanModule.forSubjects(['subject'])],
  controllers: [TestController],
  providers: [],
})
export class TestModule {}

Nest Stan provides you with InjectPublisher decorator to inject publishers:

@Controller()
class TestController {
  constructor(
    @InjectPublisher('subject') private readonly publisher: IStanPublisher<Message>,
  ) {}

  @Post()
  async publishMessage() {
    const message: Message = {
      foo: 'bar',
    }

    await this.publisher.publish(message)
  }
}

Connection status

In order to check what is the current status of connection you can use InjectConnectionStatusIndicator:

@Injectable()
export class StanConnectionIndicator extends HealthIndicator {
  constructor(
    @InjectConnectionStatusIndicator() private readonly connectionStatus: ConnectionStatusIndicator
  ) {
    super();
  }

  async isHealthy(key: string): Promise<HealthIndicatorResult> {
    const isHealthy = this.connectionStatus.getStatus() === ConnectionStatus.CONNECTED;
    const lastError = this.connectionStatus.lastError()

    return this.getStatus(key, isHealthy, { lastError });
  }
}

ToDo

  • [ ] Add linter
  • [ ] Add classes documentation
  • [ ] Implement github actions
  • [ ] Collect coverage
  • [ ] Provide example app

Package Sidebar

Install

npm i @aarek/nest-stan

Weekly Downloads

2

Version

0.0.1-alpha1

License

MIT

Unpacked Size

47 kB

Total Files

66

Last publish

Collaborators

  • aarek