acelga-bus
Version:
An extensible typescript message bus with support for middlewares
77 lines • 3.12 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
class EventstoreClient {
constructor(client, errorLogger, backoffStrategy, streamName, startPosition = 0) {
this.startPosition = 0;
this.messagesToGet = 100;
this.handler = null;
this.client = client;
this.backoffStrategy = backoffStrategy;
this.streamName = streamName;
this.startPosition = startPosition;
this.logError = errorLogger;
this.declareConsumers();
}
setHandler(handler) {
this.handler = handler;
}
publish(eventType, event) {
return __awaiter(this, void 0, void 0, function* () {
return this.client.writeEvent(this.streamName, eventType, event);
});
}
declareConsumers() {
this.backoffStrategy.on('backoff', (number, delay) => {
return this.client.getEvents(this.streamName, this.startPosition, this.messagesToGet)
.then((events) => {
return this.processConsumedAnswer(events);
})
.catch((error) => {
return this.backoffStrategy.backoff(error);
});
});
this.backoffStrategy.on('fail', (error) => {
this.logError(error);
});
}
processConsumedAnswer(events) {
return __awaiter(this, void 0, void 0, function* () {
if (events.length === 0) {
return this.backoffStrategy.backoff();
}
yield this.processEvents(events);
this.startPosition += events.length;
this.backoffStrategy.reset();
this.backoffStrategy.backoff();
});
}
processEvents(events) {
return __awaiter(this, void 0, void 0, function* () {
if (!this.handler) {
return this.logError(new NoHanlderToProcessEvents(events));
}
for (const event of events) {
yield this.handler(event);
}
});
}
}
exports.EventstoreClient = EventstoreClient;
class NoHanlderToProcessEvents extends Error {
constructor(events) {
super();
this.stack = (new Error()).stack;
this.events = events;
this.message = 'The handler for processing events is still not set. The non-processed events are stored in attribute "events" of this error object';
}
}
exports.NoHanlderToProcessEvents = NoHanlderToProcessEvents;
//# sourceMappingURL=eventstoreConsumer.js.map