DDD and Event Sourcing primitives for nodejs
npm install ddd-es-node --save
Define events.
import { EntityEvent } from "ddd-es-node"; export class OrderCancelledEvent extends EntityEvent { }
Create domain entities.
import { Entity } from "ddd-es-node"; import { OrderCancelledEvent } from "./events"; export class Order extends Entity { private cancelled : boolean; constructor(id) { super(id, (self, event) => { if(event instanceof OrderCancelledEvent) { this.cancelled = true; } }); } public cancel() { if(this.cancelled) { throw new Error('Order already cancelled'); } else { this.dispatch(new OrderCancelledEvent()); } } }
Load entities and execute commands.
import { defaultEsContext } from "ddd-es-node"; import { Order } from "./orders"; const { entityRepository } = defaultEsContext; export const cancelOrder = (id) : void => { return entityRepository .load(Order, id) .then((order : Order) => order.cancel()); };
Add event subscribers.
import { defaultEsContext, EntityEvent } from "ddd-es-node"; import { OrderCancelledEvent } from "./events"; const { eventBus } = defaultEsContext; eventBus.subscribe((event : EntityEvent) => { if (event instanceof OrderCancelledEvent) { // do something } }, { replay: true });