UNPKG

evtstore

Version:

Event Sourcing with Node.JS

146 lines 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventHandler = void 0; const common_1 = require("./common"); const util_1 = require("../provider/util"); const POLL = 1000; const CRASH = 10000; class EventHandler { constructor(opts) { var _a, _b, _c; this.provider = null; this.running = false; this.tailStream = false; this.alwaysTailStream = false; this.continueOnError = false; this.__handlers = {}; this.hooks = {}; this.handle = (type, cb) => { this.__handlers[type] = cb; }; this.handlers = (body) => { const keys = Object.keys(body); for (const key of keys) { this.__handlers[key] = body[key]; } }; this.start = () => { this.running = true; }; this.stop = () => { this.running = false; }; this.reset = () => { this.position = undefined; }; this.runOnce = async (runningCount = 0) => { if (this.hooks.preRun) { await this.hooks.preRun(); } if (!this.position) { this.position = await this.getPosition(); } const events = await this.provider.getEventsFrom(this.streams, this.position); let eventsHandled = 0; const onError = (ex) => { ex.event = events[eventsHandled]; if (this.continueOnError) { const bookmarkName = typeof this.bookmark === 'string' ? this.bookmark : this.bookmark.name; this.provider.onError(ex, this.streams.join(', '), bookmarkName, ex.event); return; } throw ex; }; for (const event of events) { const handler = this.__handlers[event.event.type]; if (handler) { await Promise.resolve(handler(event.aggregateId, event.event, (0, common_1.toMeta)(event))).catch(onError); eventsHandled++; } this.position = event.position; await this.setPosition(); } if (this.hooks.postRun) { await this.hooks.postRun(events.length, eventsHandled); } if (events.length > 0) { return this.runOnce(events.length + runningCount); } return events.length + runningCount; }; this.getPosition = async () => { if (this.bookmark === common_1.MemoryBookmark) { if (this.position) return this.position; if (this.alwaysTailStream) { const event = await this.provider.getLastEventFor(this.streams); this.position = (event === null || event === void 0 ? void 0 : event.position) || 0; return event; } const notExistantBookmark = new Date().toISOString(); const position = await this.provider.getPosition(notExistantBookmark); this.position = position; return position; } if (this.alwaysTailStream) { const event = await this.provider.getLastEventFor(this.streams); if (event) return event.position; } const bm = typeof this.bookmark === 'string' ? await this.provider.getPosition(this.bookmark) : await this.bookmark.getPosition(); // If this is a new handler without a position, we may need to start from the end of the stream(s) history if (this.tailStream && (0, util_1.isPositionZero)(bm)) { const event = await this.provider.getLastEventFor(this.streams); return (event === null || event === void 0 ? void 0 : event.position) || bm; } // Otherwise return the start of the beginning of the stream(s) history return bm; }; this.setPosition = async () => { if (this.bookmark === common_1.MemoryBookmark) { return; } if (typeof this.bookmark === 'string') { await this.provider.setPosition(this.bookmark, this.position); return; } await this.bookmark.setPosition(this.position); }; this.run = async () => { if (!this.running) { setTimeout(this.run, POLL); return; } try { const handled = await this.runOnce(); setTimeout(this.run, handled === 0 ? POLL : 0); } catch (ex) { const bookmarkName = typeof this.bookmark === 'string' ? this.bookmark : this.bookmark.name; this.provider.onError(ex, this.streams.join(', '), bookmarkName, ex.event); setTimeout(this.run, CRASH); } }; this.bookmark = opts.bookmark; this.streams = (0, util_1.toArray)(opts.stream); this.hooks = opts.hooks || {}; this.provider = opts.provider; this.name = typeof opts.bookmark === 'string' ? opts.bookmark : opts.bookmark.name; this.tailStream = (_a = opts.tailStream) !== null && _a !== void 0 ? _a : false; this.alwaysTailStream = (_b = opts.alwaysTailStream) !== null && _b !== void 0 ? _b : false; this.continueOnError = (_c = opts.continueOnError) !== null && _c !== void 0 ? _c : false; if (this.streams.length === 0) { throw new Error('Cannot create event handler subscribed to no streams'); } if ('then' in opts.provider) { opts.provider.then((prv) => { this.provider = prv; }); } this.run(); } } exports.EventHandler = EventHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV2ZW50LWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBV0EscUNBQWlEO0FBQ2pELDJDQUEwRDtBQUUxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUE7QUFDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFBO0FBU25CLE1BQWEsWUFBWTtJQWdCdkIsWUFBWSxJQUFnQjs7UUFacEIsYUFBUSxHQUFnQixJQUFXLENBQUE7UUFFbkMsWUFBTyxHQUFHLEtBQUssQ0FBQTtRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIscUJBQWdCLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBRXZCLGVBQVUsR0FFZCxFQUFFLENBQUE7UUFDRSxVQUFLLEdBQWlCLEVBQUUsQ0FBQTtRQXlCaEMsV0FBTSxHQUFHLENBQ1AsSUFBTyxFQUNQLEVBQTZFLEVBQzdFLEVBQUU7WUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQVMsQ0FBQTtRQUNuQyxDQUFDLENBQUE7UUFFRCxhQUFRLEdBQUcsQ0FBQyxJQUFvQixFQUFFLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXFCLENBQUE7WUFDbEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBUSxDQUFBO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLENBQUMsQ0FBQTtRQUVELFNBQUksR0FBRyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUN0QixDQUFDLENB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