UNPKG

evtstore

Version:

Event Sourcing with Node.JS

66 lines 6.08 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLG1EQUE4QztBQUM5Qyx5REFBNEQ7QUFFNUQsU0FBZ0IsY0FBYyxDQUM1QixJQUE2QixFQUM3QixHQUFrQztJQUVsQyxTQUFTLE9BQU8sQ0FBQyxRQUFnQixFQUFFLFVBQTZCLEVBQUU7UUFDaEUsT0FBTyxJQUFJLDRCQUFZLENBQUM7WUFDdEIsUUFBUTtZQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPO1FBQ1AsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztLQUN0QixDQUFBO0FBQ0gsQ0FBQztBQWpCRCx3Q0FpQkM7QUFFRCxTQUFTLE9BQU8sQ0FDZCxJQUF5QixFQUN6QixPQUFnQztJQUVoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBcUIsQ0FBQTtJQUN6RCxNQUFNLE9BQU8sR0FBa0MsRUFBUyxDQUFBO0lBQ3hELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXBELElBQUksV0FBVyxJQUFJLE9BQU8sRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUE7S0FDOUY7SUFFRCxNQUFNLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUEsMENBQXVCLEVBQU8sSUFBSSxDQUFDLENBQUE7SUFFN0UsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEVBQVU7UUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEMsTUFBTSxJQUFJLEdBQThCLEVBQVMsQ0FB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