Skip to main content

Configuring EventBus adapters

MemoryEventBusAdapter​

To use the MemoryEventBusAdapter you only need to create instance of it.

./samples/memory-event-bus-adapter.ts
import { MemoryEventBusAdapter } from "eridu-tech/event-bus/memory-event-bus-adapter";

const eventBusAdapter = new MemoryEventBusAdapter();

You can also provide an EventEmitter that will be used for dispatching the events in memory:

./samples/memory-event-bus-adapter-with-emitter.ts
import { MemoryEventBusAdapter } from "eridu-tech/event-bus/memory-event-bus-adapter";
import { EventEmitter } from "node:events";

const eventEmitter = new EventEmitter<any>();
const eventBusAdapter = new MemoryEventBusAdapter({
eventEmitter,
});

Pass any ITransactionHooks (like a TransactionContext, MultiTransactionHooks) as the transactionHooks setting to make the adapter transaction aware. Events dispatch immediately outside a transaction, and inside transaction events dispatch after commit:

./samples/transaction-context.ts
import { ExecutionContext } from "eridu-tech/execution-context";
import { AlsExecutionContextAdapter } from "eridu-tech/execution-context/als-execution-context-adapter";
import { contextToken } from "eridu-tech/execution-context/contracts";
import { TransactionContext } from "eridu-tech/transaction-context";
import { KyselyTransactionAdapter } from "eridu-tech/transaction-context/kysely-transaction-adapter";
import Sqlite from "better-sqlite3";
import { Kysely, SqliteDialect } from "kysely";

const database = new Kysely<any>({
dialect: new SqliteDialect({
database: new Sqlite("DATABASE_NAME.db"),
}),
});

export const transactionContext = new TransactionContext<Kysely<any>>({
// The token the active transaction is stored under
token: contextToken("sqlite-transaction"),

// You can choose the adapter to use
adapter: new KyselyTransactionAdapter({ database }),

// The execution context that tracks the active transaction across scopes
executionContext: new ExecutionContext(new AlsExecutionContextAdapter()),
});
./samples/memory-event-bus-adapter-transaction-aware.ts
import { MemoryEventBusAdapter } from "eridu-tech/event-bus/memory-event-bus-adapter";
import { transactionContext } from "./transaction-context.js";

const eventBusAdapter = new MemoryEventBusAdapter({
// Immediately outside a transaction, after commit inside transaction
transactionHooks: transactionContext,
});
info

MemoryEventBusAdapter lets you test your app without external dependencies like Redis, ideal for local development, unit tests, integration tests and fast E2E test for the backend application.

RedisPubSubEventBusAdapter​

To use the RedisPubSubEventBusAdapter, you'll need to:

  1. Install the required dependency: ioredis package:
  2. Provide a string serializer (ISerde):
  • We recommend using SuperJsonSerdeAdapter for this purpose
./samples/redis-pub-sub-event-bus-adapter.ts
import { RedisPubSubEventBusAdapter } from "eridu-tech/event-bus/redis-pub-sub-event-bus-adapter";
import { Serde } from "eridu-tech/serde";
import { SuperJsonSerdeAdapter } from "eridu-tech/serde/super-json-serde-adapter";
import { Redis } from "ioredis";

const client = new Redis("YOUR_REDIS_CONNECTION_STRING");
const serde = new Serde(new SuperJsonSerdeAdapter());
const eventBusAdapter = new RedisPubSubEventBusAdapter({
client,
serde,
});

Pass any ITransactionHooks (like a TransactionContext, MultiTransactionHooks) as the transactionHooks setting to make the adapter transaction aware. Events dispatch immediately outside a transaction, and inside transaction events dispatch after commit:

./samples/redis-pub-sub-event-bus-adapter-transaction-aware.ts
import { RedisPubSubEventBusAdapter } from "eridu-tech/event-bus/redis-pub-sub-event-bus-adapter";
import { Serde } from "eridu-tech/serde";
import { SuperJsonSerdeAdapter } from "eridu-tech/serde/super-json-serde-adapter";
import { Redis } from "ioredis";
import { transactionContext } from "./transaction-context.js";

const client = new Redis("YOUR_REDIS_CONNECTION_STRING");
const serde = new Serde(new SuperJsonSerdeAdapter());
const eventBusAdapter = new RedisPubSubEventBusAdapter({
client,
serde,
// Immediately outside a transaction, after commit inside transaction
transactionHooks: transactionContext,
});

NoOpEventBusAdapter​

The NoOpEventBusAdapter is a no-operation implementation, it performs no actions when called.

./samples/no-op-event-bus-adapter.ts
import { NoOpEventBusAdapter } from "eridu-tech/event-bus/no-op-event-bus-adapter";

const noEventBusAdapter = new NoOpEventBusAdapter();
info

The NoOpEventBusAdapter is useful when you want to mock out or disable your EventBus class.

Further information​

For further information refer to eridu-tech/event-bus API docs.