evtstore
Version:
Event Sourcing with Node.JS
66 lines • 6.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDomainV1 = void 0;
const event_handler_1 = require("./event-handler");
const create_aggregate_1 = require("./create-aggregate");
function createDomainV1(opts, cmd) {
function handler(bookmark, options = {}) {
return new event_handler_1.EventHandler({
bookmark,
provider: opts.provider,
stream: opts.stream,
...options,
});
}
return {
handler,
...wrapCmd(opts, cmd),
};
}
exports.createDomainV1 = createDomainV1;
function wrapCmd(opts, handler) {
const commands = Object.keys(handler);
const wrapped = {};
const providerAsync = Promise.resolve(opts.provider);
if ('aggregate' in handler) {
throw new Error(`Invalid command body: Command handler function cannot be named "aggregate"`);
}
const { getAggregate, toNextAggregate } = (0, create_aggregate_1.createProvidedAggregate)(opts);
async function getExecAggregate(id) {
const aggregate = await getAggregate(id);
const body = {};
for (const command of commands) {
body[command] = async (cmdBody) => {
const cmdResult = await handler[command]({ ...cmdBody, aggregateId: id, type: command }, aggregate);
const nextAggregate = await handleCommandResult(cmdResult, aggregate);
return { ...body, aggregate: nextAggregate };
};
}
return { ...body, aggregate };
}
// Prepare the command handlers that accept an aggregateId and a command body
for (const type of commands) {
wrapped[type] = async (id, body) => {
const agg = await getAggregate(id);
const cmdResult = await handler[type]({ ...body, aggregateId: id, type }, agg);
const nextAggregate = await handleCommandResult(cmdResult, agg);
return nextAggregate;
};
}
async function handleCommandResult(cmdResult, aggregate) {
const id = aggregate.aggregateId;
let nextAggregate = { ...aggregate };
if (cmdResult) {
const events = Array.isArray(cmdResult) ? cmdResult : [cmdResult];
const provider = await providerAsync;
let nextVersion = aggregate.version + 1;
const newEvents = provider.createEvents(opts.stream, id, nextVersion, events);
const storeEvents = await provider.append(opts.stream, id, nextVersion, newEvents);
const nextAggregate = storeEvents.reduce(toNextAggregate, aggregate);
return nextAggregate;
}
return nextAggregate;
}
return { command: wrapped, getAggregate: getExecAggregate };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLG1EQUE4QztBQUM5Qyx5REFBNEQ7QUFFNUQsU0FBZ0IsY0FBYyxDQUM1QixJQUE2QixFQUM3QixHQUFrQztJQUVsQyxTQUFTLE9BQU8sQ0FBQyxRQUFnQixFQUFFLFVBQTZCLEVBQUU7UUFDaEUsT0FBTyxJQUFJLDRCQUFZLENBQUM7WUFDdEIsUUFBUTtZQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPO1FBQ1AsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztLQUN0QixDQUFBO0FBQ0gsQ0FBQztBQWpCRCx3Q0FpQkM7QUFFRCxTQUFTLE9BQU8sQ0FDZCxJQUF5QixFQUN6QixPQUFnQztJQUVoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBcUIsQ0FBQTtJQUN6RCxNQUFNLE9BQU8sR0FBa0MsRUFBUyxDQUFBO0lBQ3hELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXBELElBQUksV0FBVyxJQUFJLE9BQU8sRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUE7S0FDOUY7SUFFRCxNQUFNLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUEsMENBQXVCLEVBQU8sSUFBSSxDQUFDLENBQUE7SUFFN0UsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEVBQVU7UUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEMsTUFBTSxJQUFJLEdBQThCLEVBQVMsQ0FBQTtRQUVqRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRTtZQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FDdEMsRUFBRSxHQUFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDOUMsU0FBUyxDQUNWLENBQUE7Z0JBQ0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7Z0JBRXJFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUE7WUFDOUMsQ0FBQyxDQUFBO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUE7SUFDL0IsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNqQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUVsQyxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDOUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDL0QsT0FBTyxhQUFhLENBQUE7UUFDdEIsQ0FBQyxDQUFBO0tBQ0Y7SUFFRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsU0FBeUIsRUFBRSxTQUE0QjtRQUN4RixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFBO1FBQ2hDLElBQUksYUFBYSxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQTtRQUVwQyxJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQTtZQUNwQyxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQTtZQUV2QyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUM3RSxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ2xGLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3BFLE9BQU8sYUFBYSxDQUFBO1NBQ3JCO1FBRUQsT0FBTyxhQUFhLENBQUE7SUFDdEIsQ0FBQztJQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUFBO0FBQzdELENBQUMifQ==