Package Exports
- @getanthill/event-source
- @getanthill/event-source/dist/bundle.cjs.js
- @getanthill/event-source/dist/bundle.esm.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@getanthill/event-source) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
getanthill
Event-Source
Getting Started
Install the package
npm install -S @getanthill/event-source
Define your class
The following will be extended with the Event-Source functionalities.
// src/models/Users.ts
import { EventSourcedFactory } from '@getanthill/event-source';
/**
* This is the main reducer for your events.
* > f(state_{i}, event) = state_{i+1}
*/
const reducer = (state, event) => {
if (event.type === 'CREATED') {
return {
firstname: event.firstname,
};
}
return state;
};
export default class Users extends EventSourced('users', reducer) {
/**
* Create a new user
* @param {string} firstname The user firstname
* @return {Promise<object>} Updated state
*/
create(firstname) {
return this.handle(() => [
{
type: 'CREATED',
firstname,
},
]);
}
}
Use your Event-Sourced class
// src/business/users.ts
import Users from '../models/Users';
/**
* Create a user
*
* @param {object} db MongoDb connection
* @param {string} firstname User firstname
* @return {Promise<object>} State after success
*/
function createUser(db, firstname) {
const user = new Users(db, 1); // 1 = correlation_id
return user.create('John');
}
In your database, we will now have access to the events in the collection
users_events
:
db.users_events.find().pretty();
{
"type": "CREATED",
"correlation_id": 1,
"version": 0,
"firstname": "John",
"created_at": "2020-11-01T06:05:43.210Z"
}
and also the final resulting state of your object:
db.users.find().pretty();
{
"correlation_id": 1,
"version": 0,
"firstname": "John"
}
Conclusion
Now that you are able to have a fully Event-Source featured class, you can
read further on what is possible to create with this library and how to custom
a bit some features such as the correlation_id
naming.