UNPKG

evtstore

Version:

Event Sourcing with Node.JS

113 lines 10 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPersistedAggregate = exports.createProvidedAggregate = exports.createAggregate = void 0; const common_1 = require("./common"); function createAggregate(opts) { return { stream: opts.stream, aggregate: opts.create, fold: opts.fold, version: opts.version, persistAggregate: !!opts.persistAggregate, }; } exports.createAggregate = createAggregate; function createProvidedAggregate(opts) { const aggregateCache = new Map(); async function getAggregate(id) { const provider = await opts.provider; const cached = opts.useCache && aggregateCache.get(id); if (cached) { const events = await (0, common_1.getAllEventsFor)(provider, opts.stream, id, cached.position); if (!events.length) { return cached.aggregate; } const lastEvent = events.slice(-1)[0]; const aggregate = events.reduce(toNextAggregate, cached.aggregate); aggregateCache.set(id, { aggregate, position: lastEvent.position }); return aggregate; } const events = await (0, common_1.getAllEventsFor)(provider, opts.stream, id); const next = { ...opts.aggregate(), aggregateId: id, version: 0 }; const aggregate = events.reduce(toNextAggregate, next); if (events.length > 0) { const lastEvent = events.slice(-1)[0]; aggregateCache.set(id, { aggregate, position: lastEvent.position }); } return aggregate; } function toNextAggregate(prev, ev) { return { ...prev, ...opts.fold(ev.event, prev, (0, common_1.toMeta)(ev)), version: ev.version, aggregateId: ev.aggregateId, }; } return { stream: opts.stream, getAggregate, toNextAggregate, provider: opts.provider }; } exports.createProvidedAggregate = createProvidedAggregate; function createPersistedAggregate(opts) { const aggregateCache = new Map(); /** * We will attempt to retrieve the persisted version of the aggregate from the last event * The persisted aggregate is only valid if: * 1. The version passed to createPersistedAggregate function matches the version on the persisted version * 2. */ async function getPersistedAggregate(id) { const provider = await opts.provider; const lastEvent = await provider.getLastEventFor(opts.stream, id); if (!lastEvent) { return { ...opts.aggregate(), aggregateId: id, version: 0 }; } if (!lastEvent.event.__persisted) { return getAggregate(id); } const lastAgg = lastEvent.event.__persisted; if (lastAgg.__pv !== opts.version) { return getAggregate(id); } return lastAgg; } async function getAggregate(id) { const provider = await opts.provider; const cached = opts.useCache && aggregateCache.get(id); if (cached) { const events = await (0, common_1.getAllEventsFor)(provider, opts.stream, id, cached.position); if (!events.length) { return cached.aggregate; } const lastEvent = events.slice(-1)[0]; const aggregate = events.reduce(toNextAggregate, cached.aggregate); aggregateCache.set(id, { aggregate, position: lastEvent.position }); return aggregate; } const events = await (0, common_1.getAllEventsFor)(provider, opts.stream, id); const next = { ...opts.aggregate(), aggregateId: id, version: 0 }; const aggregate = events.reduce(toNextAggregate, next); if (events.length > 0) { const lastEvent = events.slice(-1)[0]; aggregateCache.set(id, { aggregate, position: lastEvent.position }); } return aggregate; } function toNextAggregate(next, ev) { return { ...next, ...opts.fold(ev.event, next, (0, common_1.toMeta)(ev)), version: ev.version, aggregateId: ev.aggregateId, }; } return { stream: opts.stream, getAggregate: getPersistedAggregate, toNextAggregate, provider: opts.provider, version: opts.version, persistAggregate: !!opts.persistAggregate, }; } exports.createPersistedAggregate = createPersistedAggregate; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWFnZ3JlZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNyZWF0ZS1hZ2dyZWdhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQWtEO0FBb0JsRCxTQUFnQixlQUFlLENBQzdCLElBQXNCO0lBRXRCLE9BQU87UUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtRQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztRQUNyQixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtLQUMxQyxDQUFBO0FBQ0gsQ0FBQztBQVZELDBDQVVDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQ3JDLElBR0M7SUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBMkQsQ0FBQTtJQUV6RixLQUFLLFVBQVUsWUFBWSxDQUFDLEVBQVU7UUFDcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFBO1FBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN0RCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx3QkFBZSxFQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQTthQUN4QjtZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMs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