evtstore
Version:
Event Sourcing with Node.JS
138 lines • 11.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.migrate = exports.createProvider = void 0;
const error_1 = require("./error");
const util_1 = require("./util");
function createProvider(opts) {
const onError = opts.onError ||
(() => {
/* NOOP */
});
return {
limit: opts.limit,
driver: 'knex',
onError,
getPosition: async (bm) => {
const result = await opts.bookmarks().select().where('bookmark', bm).first();
if (result)
return result.position;
return 0;
},
setPosition: async (bm, pos) => {
const updates = await opts.bookmarks().update({ position: pos }).where('bookmark', bm);
if (updates === 0) {
await opts.bookmarks().insert({ bookmark: bm, position: pos });
}
},
getEventsFor: async (stream, aggregateId, fromPosition) => {
const query = opts
.events()
.select()
.where({ stream, aggregate_id: aggregateId })
.orderBy('version', 'asc');
if (fromPosition !== undefined) {
query.andWhere('position', '>', fromPosition);
}
const rows = await query;
return rows.map(mapToEvent);
},
getLastEventFor: async (stream, aggregateId) => {
let query = opts
.events()
.select()
.whereIn('stream', (0, util_1.toArray)(stream))
.orderBy('position', 'desc')
.limit(1);
if (aggregateId) {
query = query.andWhere({ aggregate_id: aggregateId });
}
const rows = await query;
return rows.map(mapToEvent)[0];
},
getEventsFrom: async (stream, position, lim) => {
const limit = lim !== null && lim !== void 0 ? lim : opts.limit;
const query = opts
.events()
.select()
.whereIn('stream', (0, util_1.toArray)(stream))
.andWhere('position', '>', position)
.orderBy('position', 'asc');
if (limit)
query.limit(limit);
const events = await query;
return events.map(mapToEvent);
},
createEvents: (0, util_1.createEventsMapper)(0),
append: async (_stream, _aggregateId, _version, newEvents) => {
try {
const toInsert = newEvents.map((storeEvent) => ({
stream: storeEvent.stream,
aggregate_id: storeEvent.aggregateId,
event: JSON.stringify(storeEvent.event),
version: storeEvent.version,
timestamp: storeEvent.timestamp,
}));
const results = await opts.events().insert(toInsert, ['position']);
let index = 0;
for (const result of results) {
newEvents[index].position = result;
index++;
}
return newEvents;
}
catch (ex) {
// TODO: Verify version conflict error
throw new error_1.VersionError(ex.message);
}
},
};
}
exports.createProvider = createProvider;
async function migrate(opts) {
if (!opts.bookmarks && !opts.events)
return;
await opts.client.transaction(async (trx) => {
if (opts.events) {
const eventsExists = await trx.schema.hasTable(opts.events);
if (!eventsExists) {
const q1 = trx.schema.createTable(opts.events, (tbl) => {
tbl.bigIncrements('position').primary();
tbl.integer('version');
tbl.string('stream');
tbl.string('aggregate_id');
tbl.dateTime('timestamp');
tbl.text('event');
});
const q2 = trx.schema.table(opts.events, (tbl) => {
tbl.unique(['stream', 'position']);
tbl.unique(['stream', 'aggregate_id', 'version']);
});
await q1;
await q2;
}
}
if (opts.bookmarks) {
const bookmarkExists = await trx.schema.hasTable(opts.bookmarks);
if (!bookmarkExists) {
const q1 = trx.schema.createTable(opts.bookmarks, (tbl) => {
tbl.string('bookmark').primary();
tbl.bigInteger('position');
});
await q1;
}
}
await trx.commit();
});
}
exports.migrate = migrate;
function mapToEvent(row) {
return {
aggregateId: row.aggregate_id,
event: JSON.parse(row.event),
position: row.position,
stream: row.stream,
timestamp: row.timestamp,
version: row.version,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia25leC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImtuZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsbUNBQXNDO0FBQ3RDLGlDQUFvRDtBQW9CcEQsU0FBZ0IsY0FBYyxDQUFrQixJQUFhO0lBQzNELE1BQU0sT0FBTyxHQUNYLElBQUksQ0FBQyxPQUFPO1FBQ1osQ0FBQyxHQUFHLEVBQUU7WUFDSixVQUFVO1FBQ1osQ0FBQyxDQUFDLENBQUE7SUFDSixPQUFPO1FBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTztRQUNQLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUM1RSxJQUFJLE1BQU07Z0JBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFBO1lBQ2xDLE9BQU8sQ0FBQyxDQUFBO1FBQ1YsQ0FBQztRQUNELFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFFdEYsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO2FBQy9EO1FBQ0gsQ0FBQztRQUNELFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxF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