evtstore
Version:
Event Sourcing with Node.JS
113 lines • 10 kB
JavaScript
;
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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