@httpc/kit
Version:
httpc toolbox for building function-based API with minimal code and end-to-end type safety
67 lines (66 loc) • 2.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handle = void 0;
const server_1 = require("@httpc/server");
const tsyringe_1 = require("tsyringe");
const di_1 = require("../di");
function handle(event) {
return (target, property) => {
if (!event) {
event = Reflect.getMetadata("design:paramtypes", target, property)?.[0];
}
const eventName = event && new event().$event_name;
if (!eventName) {
throw new Error("Invalid EventConstructor");
}
tsyringe_1.container.registerInstance((0, di_1.KEY)("IInitialize"), {
initialize() {
const bus = (0, di_1.RESOLVE)(tsyringe_1.container, "IEventBus");
bus.addListener(eventName, (payload) => {
let instance;
try {
instance = resolveInContext(target.constructor);
}
catch (err) {
getLogger(instance)?.error(err);
return;
}
execute(() => instance[property].call(instance, payload));
});
getLogger()?.verbose("Registered %s(%s.%s)", eventName, target.constructor.name, property);
}
});
};
}
exports.handle = handle;
let logger;
function getLogger(service) {
if (service && service.logger && typeof service.logger.log === "function") {
return service.logger;
}
if (!logger) {
try {
logger = (0, di_1.RESOLVE)(tsyringe_1.container, "ILogService").createLogger("Handlers");
}
catch { }
}
return logger;
}
function resolveInContext(target) {
const container = (0, server_1.useContext)("optional")?.container || tsyringe_1.container;
if (!container) {
throw new server_1.HttpCServerError("invalidState", "Missing container");
}
return container.resolve(target);
}
function execute(func) {
async function wrap() {
try {
await func();
}
catch (err) {
getLogger()?.error(err);
}
}
return setImmediate(wrap);
}