UNPKG

evtstore

Version:

Event Sourcing with Node.JS

138 lines 11.4 kB
"use strict"; 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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