# Packages

relaybus is published as nine npm packages under the `@relaybus` scope, released together with one shared version.

| Package                                              | Purpose                                                                                                  |
| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| [`@relaybus/core`](https://berkcansavur.github.io/relaybus/packages/core)                   | The bus, dispatcher, retry policies and the in-memory store.                                             |
| [`@relaybus/nestjs`](https://berkcansavur.github.io/relaybus/packages/nestjs)               | `RelayBusModule`, the `@RelayBusConsumer` decorator, lifecycle and health.                               |
| [`@relaybus/postgres`](https://berkcansavur.github.io/relaybus/packages/postgres)           | PostgreSQL 13+ store for `pg`, Kysely, Knex, TypeORM, Drizzle and Prisma transactions.                   |
| [`@relaybus/mongodb`](https://berkcansavur.github.io/relaybus/packages/mongodb)             | MongoDB 6+ store on multi-document transactions; works with Mongoose sessions.                           |
| [`@relaybus/kafka`](https://berkcansavur.github.io/relaybus/packages/kafka)                 | Kafka transport for `@confluentinc/kafka-javascript` (recommended) and kafkajs, CloudEvents binary mode. |
| [`@relaybus/rabbitmq`](https://berkcansavur.github.io/relaybus/packages/rabbitmq)           | RabbitMQ transport with publisher confirms, reconnects, quorum queues and dead letters.                  |
| [`@relaybus/testing`](https://berkcansavur.github.io/relaybus/packages/testing)             | The store contract suite, a fake clock and an in-memory transport.                                       |
| [`@relaybus/eslint-plugin`](https://berkcansavur.github.io/relaybus/packages/eslint-plugin) | ESLint rules: no calls to other services inside a transaction, no publish outside one.                   |
| [`@relaybus/otel`](https://berkcansavur.github.io/relaybus/packages/otel)                   | OpenTelemetry metrics, backlog gauges and one trace across services.                                     |

## Typical installs

```sh
# NestJS + PostgreSQL
pnpm add @relaybus/core @relaybus/nestjs @relaybus/postgres pg

# NestJS + MongoDB
pnpm add @relaybus/core @relaybus/nestjs @relaybus/mongodb mongodb

# add a broker
pnpm add @relaybus/kafka kafkajs
pnpm add @relaybus/rabbitmq amqplib

# tests and lint rules
pnpm add -D @relaybus/testing vitest
pnpm add -D @relaybus/eslint-plugin

# metrics and traces
pnpm add @relaybus/otel @opentelemetry/api
```

Bring your own store: implement the `EventStore` interface and run the contract suite from `@relaybus/testing` against it.
