Stupid-simple event sourcing.
An event-driven persistence for the application layer inspired by Redux.
Note: this currently provides an in-memory implementation, not suitable for production
const { createStore, adapters: { InMemory } } = require('reventor')
// Just like Redux, a reducer takes the previous state and a
// current event to produce the next state. This reducer will be used
// to map over a set of events for a given aggregate
function reducer (previousState = {}, event) {
const { eventType, data } = event
switch (eventType) {
case 'acct:created':
return { ...data, balance: 0 }
case 'acct:deposit':
return {
...previousState,
balance: previousState.balance + data.amount
}
case 'acct:withdrawal':
return {
...previousState,
balance: previousState.balance - data.amount
}
}
default:
return previousState
}
}
const adapter = new InMemory()
const { dispatch, getState } = createStore(adapter, reducer)
module.exports = { dispatch, getState }
A function for dispatching events which takes a single event, or array of event objects.
dispatch({
eventType: 'account:create'
aggregateId: 'account:1234',
aggregateVersion: 0,
data: {
owner: {
email: 'owner@example.com',
phone: {
type: 'cell'
number: '+15628675309'
}
}
createdAt: Date.now(),
}
})
Get the state of an aggreaget.
getState('account:1234')
- Add couchdb adpater
- Add subscribe / unsubscribe methods to store
- Add postgres adapter
- Implement snapshots
- More examples
- Monitoring / management UI