@tmorin/ceb-messaging-simple
Version:
The package is part of the `<ceb/>` library. It provides an implementation of the messaging model leveraging on a vanilla TypeScript/JavaScript environment.
78 lines • 2.99 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
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) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SimpleQueryBus = exports.SimpleQueryBusSymbol = void 0;
const common_1 = require("./common");
/**
* The symbol used to register {@link SimpleQueryBus}.
*/
exports.SimpleQueryBusSymbol = Symbol.for("ceb/inversion/SimpleQueryBus");
class SimpleQueryBus {
constructor(emitter, handlers = new Map()) {
this.emitter = emitter;
this.handlers = handlers;
}
get observe() {
return this.emitter;
}
execute(query, options) {
return __awaiter(this, void 0, void 0, function* () {
this.emitter.emit("query_received", {
bus: this,
query,
});
const handler = this.resolveHandler(query);
const opts = Object.assign({ timeout: 500 }, options);
const result = yield (0, common_1.waitForReturn)(() => __awaiter(this, void 0, void 0, function* () { return yield handler(query); }), opts.timeout).catch((error) => {
this.emitter.emit("query_handler_failed", {
bus: this,
query,
error,
});
throw error;
});
// @ts-ignore
return result;
});
}
handle(queryType, handler) {
if (this.handlers.has(queryType)) {
throw new Error(`the query type ${queryType} is already handled`);
}
this.handlers.set(queryType, handler);
return {
remove: () => {
this.handlers.delete(queryType);
},
};
}
dispose() {
return __awaiter(this, void 0, void 0, function* () {
this.handlers.clear();
this.emitter.emit("disposed", { bus: this });
});
}
resolveHandler(query) {
const handler = this.handlers.get(query.headers.messageType);
if (handler) {
return handler;
}
const error = new Error(`handler not found for ${query.headers.messageType}`);
this.emitter.emit("query_handler_not_found", {
bus: this,
query,
error,
});
throw error;
}
}
exports.SimpleQueryBus = SimpleQueryBus;
//# sourceMappingURL=query.js.map