/** * Dirige cada mensaje dependiendo de el tipo de acción que contenga * Podría hacerse con varias colas, pero así se controla mejor que * las operaciones se hagan de 1 en 1. */ import { ConsumeMessage } from "amqplib"; import { SimController } from "./Sim.controller"; export class SimRouter { private readonly routes: Map Promise>; constructor(private readonly simController: SimController) { this.routes = new Map([ ["activate", this.simController.activateSim()], ["pause", this.simController.pauseSim()], ]); } /** * Enruta el mensaje a la acción correspondiente basándose en la routing key */ public route = async (msg: ConsumeMessage | null): Promise => { if (!msg) { console.error("[Router] Mensaje vacío"); return; } const action = this.extractAction(msg); if (!action) { console.error("[Router] La routing key no tiene una acción definida", msg.fields.routingKey); return; } const handler = this.routes.get(action); if (!handler) { console.error(`[Router] La acción '${action}' no tiene un controlador asociado`); return; } try { console.log("[Router] Ejecutando operación:", action); // El controlador devuelve una función (thunk) que debe ser ejecutada const executeParams = await handler(msg); if (typeof executeParams === "function") { await executeParams(); } } catch (error) { console.error(`[Router] Error al ejecutar la operación '${action}':`, error); } }; private extractAction(msg: ConsumeMessage): string | undefined { // Se asume que la acción está en la tercera posición: domain.compañia.accion return msg.fields.routingKey.split(".")[2]; } }