UNPKG

evtstore

Version:

Event Sourcing with Node.JS

85 lines 8.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.migrate = exports.createProvider = void 0; const mongodb_1 = require("mongodb"); const error_1 = require("./error"); const util_1 = require("./util"); function createProvider(opts) { const events = Promise.resolve(opts.events); const bookmarks = Promise.resolve(opts.bookmarks); const onError = opts.onError || (() => { /* NOOP */ }); const createEvents = (0, util_1.createEventsMapper)(new mongodb_1.Timestamp({ t: 0, i: 0 })); return { limit: opts.limit, driver: 'mongo', onError, getPosition: (bm) => getPos(bm, bookmarks), setPosition: (bm, pos) => setPos(bm, pos, bookmarks), getEventsFor: async (stream, id, fromPosition) => { const query = { stream, aggregateId: id, }; if (fromPosition !== undefined) { query.position = { $gt: fromPosition }; } const results = await events.then((coll) => coll.find(query).sort({ position: 1 }).toArray()); return results; }, getLastEventFor: async (stream, id) => { const query = {}; query.stream = { $in: (0, util_1.toArray)(stream) }; if (id) { query.aggregateId = id; } const results = await events.then((coll) => coll.find(query).sort({ position: -1 }).limit(1).toArray()); return results[0]; }, getEventsFrom: async (stream, position, lim) => events.then((coll) => { const filter = { stream: { $in: (0, util_1.toArray)(stream) }, position: { $gt: position }, }; const query = coll.find(filter).sort({ position: 1 }); const limit = lim !== null && lim !== void 0 ? lim : opts.limit; if (limit) { query.limit(limit); } return query.toArray(); }), createEvents, append: async (_stream, _aggId, _version, newEvents) => { try { await events.then((coll) => coll.insertMany(newEvents)); return newEvents; } catch (ex) { if (ex instanceof mongodb_1.MongoError && ex.code === 11000) throw new error_1.VersionError(); throw ex; } }, }; } exports.createProvider = createProvider; async function migrate(events, bookmarks) { const eventColl = await events; const bookmarkColl = await bookmarks; await bookmarkColl.createIndex({ bookmark: 1 }, { name: 'bookmark-index', unique: true }); await eventColl.createIndex({ stream: 1, position: 1 }, { name: 'stream-position-index', unique: true }); await eventColl.createIndex({ stream: 1, aggregateId: 1, version: 1 }, { name: 'stream-id-version-index', unique: true }); } exports.migrate = migrate; async function getPos(bm, bookmarks) { const record = await bookmarks.then((coll) => coll.findOne({ bookmark: bm })); if (record) return record.position; return new mongodb_1.Timestamp({ t: 1, i: 0 }); } async function setPos(bm, pos, bookmarks) { await bookmarks.then((coll) => coll.updateOne({ bookmark: bm }, { $set: { position: pos } }, { upsert: true })); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb25nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBbUU7QUFFbkUsbUNBQXNDO0FBQ3RDLGlDQUFvRDtBQWNwRCxTQUFnQixjQUFjLENBQWtCLElBQWdCO0lBQzlELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzNDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sT0FBTyxHQUNYLElBQUksQ0FBQyxPQUFPO1FBQ1osQ0FBQyxHQUFHLEVBQUU7WUFDSixVQUFVO1FBQ1osQ0FBQyxDQUFDLENBQUE7SUFFSixNQUFNLFlBQVksR0FBRyxJQUFBLHlCQUFrQixFQUFJLElBQUksbUJBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxPQUFPO1FBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sRUFBRSxPQUFPO1FBQ2YsT0FBTztRQUNQLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUM7UUFDMUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDO1FBQ3BELFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBMEI7Z0JBQ25DLE1BQU07Z0JBQ04sV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQTtZQUVELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsS0FBSyxDQUFD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