acelga-bus
Version:
An extensible typescript message bus with support for middlewares
76 lines • 3.22 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 MiddlewareChain {
constructor() {
this.middlewares = [];
this.alwaysLast = [];
this.alwaysFirst = [];
}
getAll() {
return Array.from(this.middlewares);
}
push(middleware) {
const allMiddlewares = this.getCenterMiddlewares();
allMiddlewares.push(middleware);
this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
pushAndKeepLast(middleware, force) {
const allMiddlewares = this.getCenterMiddlewares();
if (this.alwaysLast.length !== 0 && !force) {
this.alwaysLast.unshift(middleware);
return this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
this.alwaysLast.push(middleware);
return this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
unshift(middleware) {
const allMiddlewares = this.getCenterMiddlewares();
allMiddlewares.unshift(middleware);
this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
unshiftAndKeepFirst(middleware, force) {
const allMiddlewares = this.getCenterMiddlewares();
if (this.alwaysFirst.length !== 0 && !force) {
this.alwaysFirst.push(middleware);
return this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
this.alwaysFirst.unshift(middleware);
return this.rebuildMiddlewaresFromCenter(allMiddlewares);
}
remove(middleware) {
this.middlewares = this.middlewares.filter(mid => mid !== middleware);
if (this.alwaysLast.includes(middleware)) {
this.alwaysLast = this.alwaysLast.filter(midd => midd !== middleware);
}
if (this.alwaysFirst.includes(middleware)) {
this.alwaysFirst = this.alwaysFirst.filter(midd => midd !== middleware);
}
}
getCenterMiddlewares() {
return this.middlewares.slice(this.alwaysFirst.length, this.middlewares.length - this.alwaysLast.length);
}
rebuildMiddlewaresFromCenter(center) {
this.middlewares = [...this.alwaysFirst, ...center, ...this.alwaysLast];
}
execute(item) {
return __awaiter(this, void 0, void 0, function* () {
let resultingEvent = item;
for (const middleware of this.middlewares) {
if (!resultingEvent)
break;
resultingEvent = yield middleware(resultingEvent);
}
return resultingEvent;
});
}
}
exports.MiddlewareChain = MiddlewareChain;
//# sourceMappingURL=middlewareChain.js.map