UNPKG

@httpc/kit

Version:

httpc toolbox for building function-based API with minimal code and end-to-end type safety

63 lines (62 loc) 2.11 kB
import { HttpCServerError, useContext } from "@httpc/server"; import { container as globalContainer } from "tsyringe"; import { KEY, RESOLVE } from "../di"; export 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"); } globalContainer.registerInstance(KEY("IInitialize"), { initialize() { const bus = RESOLVE(globalContainer, "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); } }); }; } let logger; function getLogger(service) { if (service && service.logger && typeof service.logger.log === "function") { return service.logger; } if (!logger) { try { logger = RESOLVE(globalContainer, "ILogService").createLogger("Handlers"); } catch { } } return logger; } function resolveInContext(target) { const container = useContext("optional")?.container || globalContainer; if (!container) { throw new 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); }