JSPM

  • Created
  • Published
  • Downloads 340
  • Score
    100M100P100Q102171F
  • License MIT

Event-sourced data store handling library

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

pipeline Quality Gate Status

Coverage Reliability Rating

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.