@effit/event-sourcing
v0.1.0-alpha.7
Published
Event sourcing primitives for the Effit framework.
Readme
@effit/event-sourcing
Event sourcing primitives for the Effit framework.
Backend-agnostic core (Aggregate, State, Event, evolve, EventStore) plus a PostgreSQL adapter under @effit/event-sourcing/postgresql/* that wires Emmett (event store) and Pongo (projection store).
Installation
pnpm add @effit/event-sourcing @effit/core effect \
@event-driven-io/emmett @event-driven-io/emmett-postgresql @event-driven-io/dumbo pgDefining an aggregate
import { Id } from '@effit/core/Id.js';
import { EventSourcing } from '@effit/event-sourcing/EventSourcing.js';
import { evolve } from '@effit/event-sourcing/evolve.js';
import { Schema } from 'effect';
export const RoundId = Id.create('RoundId');
const UnregisteredRound = EventSourcing.State('UNREGISTERED', {
id: Schema.tag(RoundId.EMPTY),
});
const PendingRound = EventSourcing.State('PENDING', {
id: RoundId,
name: Schema.NonEmptyString,
});
type Round = typeof UnregisteredRound.Type | typeof PendingRound.Type;
const RoundRegistered = EventSourcing.Event('RoundRegistered', {
roundId: RoundId,
name: Schema.NonEmptyString,
});
type RoundEvent = typeof RoundRegistered.Type;
export const Round = EventSourcing.Aggregate<RoundId, Round, RoundEvent>(
'Round',
{
idSchema: RoundId,
eventSchema: RoundRegistered,
initialState: () => UnregisteredRound.make(),
evolve: evolve<Round, RoundEvent>()({
UNREGISTERED: {
RoundRegistered: (_state, data) =>
PendingRound.make({ id: data.roundId, name: data.name }),
},
PENDING: {},
}),
},
);Reading and writing events
import { Effect } from 'effect';
import { EventStore } from '@effit/event-sourcing/EventStore.js';
const program = Effect.gen(function* () {
const store = (yield* EventStore).for(Round.Aggregate);
yield* store.create(roundId, RoundRegistered.make({ /* ... */ }));
const state = yield* store.getById(roundId);
yield* store.handle(roundId, (state) => /* ...next event... */);
});PostgreSQL adapter
Provide EmmettConfig and EmmettEventStoreLive from @effit/event-sourcing/postgresql/* to back EventStore with Emmett + Pongo. EventProjector.SingleStream / .MultiStream define projections, EventReactor defines reactors, EventConsumer composes them, and ConsumerRunner.scoped(consumers) runs the consumer process.
License
MIT © Talysson de Oliveira Cassiano
