evtstore
Version:
Event Sourcing with Node.JS
146 lines • 13.4 kB
JavaScript
"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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