npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nestjs-cqrx

v3.0.3

Published

CQRS for NestJS

Downloads

30

Readme

nestjs-cqrx

EventStoreDB NestJS CQRS module.

Based on

  • https://github.com/nordfjord/nestjs-cqrs-es
  • https://github.com/cqrx/cqrx

Features

  • Asynchronous commit/publish
  • Event handler decorator
  • Single event for read/write

Install

npm install --save nestjs-cqrx

Usage

import { CqrxModule } from 'nestjs-cqrx';

@Module({
  imports: [
    CqrxModule.forRoot({
      eventstoreDbConnectionString: 'esdb://localhost:2113?tls=false',
    }),
  ],
})
export class AppModule {}

You can generate connection string on Connection details page

Example of User model

import { ConflictException } from '@nestjs/common';
import { AggregateRoot, EventHandler } from 'nestjs-cqrx';

import { UserRegistered } from '../events';

export class User extends AggregateRoot {
  protected static readonly streamName: string = 'user';
  isRegistered = false;
  email!: string;
  password!: string;

  @EventHandler(UserRegistered)
  createUser(event: UserRegistered): void {
    this.isRegistered = true;
    this.email = event.data.email;
    this.password = event.data.password;
  }

  register(email: string, password: string) {
    if (this.isRegistered) {
      throw new ConflictException();
    }

    this.apply(
      new UserRegistered({
        email,
        password,
      }),
    );
  }
}

Example of usage

const user = new User('123');
user.apply(new UserRegistered({ data }));
await userAggregateRepository.save(user);
// Or you can create aggregate from repository
// In this case you can use commit method
const user = userAggregateRepository.create('123');
user.apply(new UserRegistered({ data }));
await user.commit();

Example of events

import { Event } from 'nestjs-cqrx';

type UserRegisteredDto = { email: string; password: string };

export class UserRegistered extends Event<UserRegisteredDto> {}
@Module({
  imports: [
    CqrxModule.forFeature(
      [User],
      // Subscribe and transform events from eventstore
      [['UserRegistered', event => new UserRegistered(event)]],
    ),
  ],
})
export class UserModule {}
// Signature of transformers
type Transformer = [
  /* Recorded event type */ string,
  /* Function which accept stream event (plain object) */ (
    event: RecordedEvent,
  ) => Event,
];

['UserRegistered', event => new UserRegistered(event)] can be shorthanded to UserRegistered

Note: If you have decorator EventsHandler (from @nestjs/cqrs) of some event, it will be automatically added to transform service.

Example apps pros/cons

example / example-tick-tack-toe-cqrx

[+] good option (save event to db, subscribe to event from db)
[–] synchronous (we must wait when event will be saved then reply to client)

nest-cqrs-example

[+] official nestjs/cqrs implementation, command handlers (fire new command via saga)
[+] faster, we reply processing to client, and do command on
[–] can emit only 1 event from saga

Similar Projects

  • https://github.com/cqrx/cqrx
  • https://github.com/nordfjord/nestjs-cqrs-es

Development

  • docker-compose up
  • http://localhost:2113/web/index.html#/dashboard

Resources

  • https://github.com/bradsheppard/nestjs-async-cqrs
  • https://github.com/valueadd-poland/nestjs-packages/tree/master/packages/typed-cqrs
  • https://github.com/ArkerLabs/event-sourcing-nestjs
  • https://github.com/amehat?tab=repositories&q=cqrs
  • https://github.com/orhanveli/nestjs-saga-pattern-example
  • https://github.com/tuanitpro/nestjs-sagas-cqrs
  • https://github.com/ntxinh/nestjs-cqrs-es
  • https://github.com/ArkerLabs/event-sourcing-nestjs-graphql-example
  • https://github.com/oskardudycz/EventSourcing.JVM/tree/main/samples/event-sourcing-esdb-simple
  • https://github.com/PrestaShopCorp/nestjs-geteventstore

Todo

  • read from specific position
  • find lib for creating errors
  • better to split on read/write events
  • reducer (similar to evolve of emmet)

License

MIT License (c) 2024