0.0.20 • Published 5 years ago
@faustt/event-store v0.0.20
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
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