evtstore
Version:
Event Sourcing with Node.JS
85 lines • 8.35 kB
JavaScript
;
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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