UNPKG

@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
"use strict"; 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); }