0.0.20 • Published 5 years ago

@faustt/event-store v0.0.20

Weekly downloads
-
License
MIT
Repository
github
Last release
5 years ago

Introduction

Event sourcing is a powerful technique that has a lot of data analysis benefits. One drawback of event sourcing is that it is oftentimes tiresome to setup, let alone implement. This package tries to address this issue by providing a robust library that works both on the server (Memory) and browser (Memory or IndexedDB).

Example Usage

See the Examples Folder for more concrete examples.

import { EventStore, Aggregator, Event } from "@faustt/event-store";

// Declare some events.
// They are automatically made available to the event store.
declare global {
    namespace Faustt.EventStore {
        interface Events {
            "Transaction:Saved": {
                id: string;
                description: string;
                amount: number;
            };
            "Transaction:Deleted": {
                id: string;
            };
            "TransactionGroup:Saved": {
                id: string;
                name: string;
            };
            "TransactionGroup:Deleted": {
                id: string;
            };
        }
    }
}

interface Transaction {
    id: string;
    description: string;
    amount: number;
}

// Aggregators derive data from an event stream.
class Transactions implements Aggregator {
    public result: Transaction[] = [];

    public async process(event: Event): Promise<void> {
        switch (event.type) {
            case "Transaction:Saved":
                this.transactions.set(event.payload.id, event.payload);
                break;

            case "Transaction:Deleted":
                this.transactions.delete(event.payload.id);
                break;
        }
    }

    public async after(): Promise<void> {
        this.result = [...this.transactions.values()];
    }

    private transactions = new Map<string, Transaction>();
}

// Basic mapping function that computes the balance after a list of transactions.
function computeBalance(transactions: Transaction[]): number {
    return transactions.reduce((a, b) => a + b.amount, 0);
}

export async function main(args: string[]): Promise<void> {
    const store = new EventStore();

    // Events are automatically timestamped and kept in order.

    await store.emit("Transaction:Saved", {
        id: "test-1",
        description: "Test",
        amount: 10,
    });

    await store.emit("Transaction:Saved", {
        id: "test-2",
        description: "Test",
        amount: 50,
    });

    await store.emit("Transaction:Deleted", {
        id: "test-1",
    });

    await store.emit("Transaction:Saved", {
        id: "test-3",
        description: "Test",
        amount: 13,
    });

    // Log the balance after the aggregated transactions.

    await store
        .aggregate(Transactions)
        .then(computeBalance)
        .then((balance) => console.log(balance));
}

Maintainer

Tobias Faust

0.0.20

5 years ago

0.0.19

5 years ago

0.0.17

5 years ago

0.0.18

5 years ago

0.0.16

5 years ago

0.0.15

5 years ago

0.0.14

5 years ago

0.0.11

5 years ago

0.0.12

5 years ago

0.0.13

5 years ago

0.0.10

5 years ago

0.0.9

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.1

5 years ago

0.0.2

5 years ago

0.0.0

5 years ago