From 707467fc6fbde6adb39d275984454962bf4dac09 Mon Sep 17 00:00:00 2001 From: Alvar San Martin Date: Mon, 12 Jan 2026 13:08:56 +0100 Subject: [PATCH] Template de archivos, productor - consumidor y lanzamiento paralelo de servicios --- .env | 4 +- deployment/Dockerfile.dev | 1 + deployment/local/docker/docker-compose.yaml | 3 +- package.json | 4 +- packages/.env | 22 +++ .../{sim-gestor-eventos => _template}/.env | 0 .../config/env/env-validators.ts | 0 packages/_template/config/env/index.ts | 18 ++ packages/_template/index.ts | 3 + packages/_template/package.json | 32 ++++ packages/{shared => _template}/tsconfig.json | 6 +- .../shared/adapters/queues/RabbitMQClient.ts | 78 +++++++++ packages/shared/config/env/index.ts | 45 ----- packages/shared/config/event-bus/index.ts | 12 -- packages/shared/index.ts | 2 - packages/shared/package.json | 6 +- .../shared/ports/queues/AMQPclient.port.ts | 7 + packages/sim-consumidor/.env | 22 +++ packages/sim-consumidor/config/env/index.ts | 24 +++ packages/sim-consumidor/index.ts | 36 ++++ packages/sim-consumidor/package.json | 32 ++++ packages/sim-consumidor/tsconfig.json | 37 ++++ .../config/env/env-validators.ts | 7 - .../sim-gestor-eventos/config/env/index.ts | 15 +- .../config/event-bus/index.ts | 12 -- packages/sim-gestor-eventos/index.ts | 69 ++------ packages/sim-gestor-eventos/package.json | 2 +- packages/sim-gestor-eventos/tsconfig.json | 9 +- run.local.sh | 2 +- yarn.lock | 164 +++++++++++------- 30 files changed, 459 insertions(+), 215 deletions(-) create mode 100644 packages/.env rename packages/{sim-gestor-eventos => _template}/.env (100%) rename packages/{shared => _template}/config/env/env-validators.ts (100%) create mode 100644 packages/_template/config/env/index.ts create mode 100644 packages/_template/index.ts create mode 100644 packages/_template/package.json rename packages/{shared => _template}/tsconfig.json (85%) create mode 100644 packages/shared/adapters/queues/RabbitMQClient.ts delete mode 100644 packages/shared/config/env/index.ts delete mode 100644 packages/shared/config/event-bus/index.ts delete mode 100644 packages/shared/index.ts create mode 100644 packages/shared/ports/queues/AMQPclient.port.ts create mode 100644 packages/sim-consumidor/.env create mode 100644 packages/sim-consumidor/config/env/index.ts create mode 100644 packages/sim-consumidor/index.ts create mode 100644 packages/sim-consumidor/package.json create mode 100644 packages/sim-consumidor/tsconfig.json delete mode 100644 packages/sim-gestor-eventos/config/env/env-validators.ts delete mode 100644 packages/sim-gestor-eventos/config/event-bus/index.ts diff --git a/.env b/.env index 18bc3ed..c654b08 100644 --- a/.env +++ b/.env @@ -1,11 +1,11 @@ PORT=3000 - RABBITMQ_USER=guest RABBITMQ_PASSWORD=guest ENVIORMENT=development -RABBITMQ_HOST=rabbitmq-sim-broker +#RABBITMQ_HOST=rabbitmq-sim-broker +RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 RABBITMQ_USER=guest RABBITMQ_PASSWORD=guest diff --git a/deployment/Dockerfile.dev b/deployment/Dockerfile.dev index 6d1fc53..3b70d1b 100644 --- a/deployment/Dockerfile.dev +++ b/deployment/Dockerfile.dev @@ -13,6 +13,7 @@ COPY package*.json ./ # copia el codigo en general COPY .tsconfig*.json ./ COPY ./packages ./packages +COPY ./.env* ./ RUN yarn && cat package.json CMD ["yarn", "run", "dev"] diff --git a/deployment/local/docker/docker-compose.yaml b/deployment/local/docker/docker-compose.yaml index ccf585d..f0eb946 100644 --- a/deployment/local/docker/docker-compose.yaml +++ b/deployment/local/docker/docker-compose.yaml @@ -30,7 +30,6 @@ services: sim-gateway: container_name: sim-gateway volumes: - - ./:/usr/local/app - ./node_modules:/usr/local/node_modules build: context: ./ @@ -41,7 +40,7 @@ services: watch: - path: ./packages action: sync - target: /usr/local/app/src + target: /usr/local/app/packages - path: ./package.json action: rebuild ports: diff --git a/package.json b/package.json index 1b55878..2991d6b 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "sim-cola-eventos", + "name": "sim-eventos", "packageManager": "yarn@4.12.0", "workspaces": [ "packages/*" @@ -9,7 +9,7 @@ "build": "npx tsc", "start": "node dist/index.js", "typecheck": "npx tsc --noEmit", - "dev": "yarn workspaces foreach -A run dev", + "dev": "yarn workspaces foreach -A -p run dev", "lint": "eslint .", "lint:fix": "eslint --fix .", "format": "prettier --write .", diff --git a/packages/.env b/packages/.env new file mode 100644 index 0000000..c654b08 --- /dev/null +++ b/packages/.env @@ -0,0 +1,22 @@ +PORT=3000 +RABBITMQ_USER=guest +RABBITMQ_PASSWORD=guest + +ENVIORMENT=development + +#RABBITMQ_HOST=rabbitmq-sim-broker +RABBITMQ_HOST=localhost +RABBITMQ_PORT=5672 +RABBITMQ_USER=guest +RABBITMQ_PASSWORD=guest +RABBITMQ_SECURE=false +RABBITMQ_VHOST=sim-vhost + +# Hay cosas que unificar de varios servicios +POSTGRES_DB=postgres +POSTGRES_DATABASE=postres +POSTGRES_HOST=postgresql-sim-1 +POSTGRES_PORT=5432 +DEV_POSTGRES_PORT=5432 +POSTGRES_USER=postgres +POSTGRES_PASSWORD=1234 diff --git a/packages/sim-gestor-eventos/.env b/packages/_template/.env similarity index 100% rename from packages/sim-gestor-eventos/.env rename to packages/_template/.env diff --git a/packages/shared/config/env/env-validators.ts b/packages/_template/config/env/env-validators.ts similarity index 100% rename from packages/shared/config/env/env-validators.ts rename to packages/_template/config/env/env-validators.ts diff --git a/packages/_template/config/env/index.ts b/packages/_template/config/env/index.ts new file mode 100644 index 0000000..66c173e --- /dev/null +++ b/packages/_template/config/env/index.ts @@ -0,0 +1,18 @@ +export const env = { + ENVIRONMENT: process.env.ENVIORMENT, + POSTGRES_USER: process.env.POSTGRES_USER, + POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD, + POSTGRES_PORT: process.env.POSTGRES_PORT, + POSTGRES_HOST: process.env.POSTGRES_HOST, + POSTGRES_DATABASE: process.env.POSTGRES_DATABASE, + RABBITMQ_HOST: String(process.env.RABBITMQ_HOST ?? "localhost"), + RABBITMQ_USER: String(process.env.RABBITMQ_USER ?? "guest"), + RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "guest"), + RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"), + RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"), + RABBITMQ_MODULENAME: process.env.MODULENAME, + RABBITMQ_TTL: process.env.RABBITMQ_TTL, + RABBITMQ_SECURE: process.env.RABBITMQ_SECURE, + RABBITMQ_RETRY_INTERVAL: process.env.RABBITMQ_INTERVAL, + RABBITMQ_VHOST: String(process.env.RABBITMQ_VHOST ?? "/"), +}; diff --git a/packages/_template/index.ts b/packages/_template/index.ts new file mode 100644 index 0000000..35acb93 --- /dev/null +++ b/packages/_template/index.ts @@ -0,0 +1,3 @@ +console.log("Template") + +export default {} diff --git a/packages/_template/package.json b/packages/_template/package.json new file mode 100644 index 0000000..261b983 --- /dev/null +++ b/packages/_template/package.json @@ -0,0 +1,32 @@ +{ + "name": "sim-template", + "version": "1.0.0", + "description": "Template de la estructura de archivos", + "main": "index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "tsx index.ts" + }, + "author": "", + "license": "ISC", + "packageManager": "yarn@4.12.0", + "dependencies": { + "@tsconfig/node22": "*", + "amqplib": "^0.10.9", + "cors": "*", + "dotenv": "*", + "express": "*", + "typescript": "*" + }, + "devDependencies": { + "@types/amqplib": "^0.10.8", + "@types/cors": "*", + "@types/express": "*", + "@types/node": "*", + "@types/supertest": "*", + "prettier": "*", + "supertest": "*", + "tsx": "*", + "vitest": "*" + } +} diff --git a/packages/shared/tsconfig.json b/packages/_template/tsconfig.json similarity index 85% rename from packages/shared/tsconfig.json rename to packages/_template/tsconfig.json index 01f4a5d..7298f86 100644 --- a/packages/shared/tsconfig.json +++ b/packages/_template/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "../../dist/shared", + "outDir": "../../dist/sim-gestor-eventos", "baseUrl": ".", "paths": { "#adapters/*": [ @@ -17,8 +17,8 @@ "__tests__/*" ], "#shared/*": [ - "./*" - ] + "../shared/*" + ], } }, "exclude": [ diff --git a/packages/shared/adapters/queues/RabbitMQClient.ts b/packages/shared/adapters/queues/RabbitMQClient.ts new file mode 100644 index 0000000..37b373a --- /dev/null +++ b/packages/shared/adapters/queues/RabbitMQClient.ts @@ -0,0 +1,78 @@ +import client, { ChannelModel, ConfirmChannel, connect, Connection } from "amqplib" + +const PREFETCH_LIMIT = 1 + +export class RabbitConnection { + connection?: ChannelModel + channel?: ConfirmChannel + connected: Boolean = false + + private connectionOptions: { + hostname: string, + port: number, + secure: boolean, + username: string, + password: string, + vhost: string + } + + constructor(opts: typeof this.connectionOptions) { + this.connectionOptions = opts + this.checkStructure(); + } + + /** + * Verificacion que la estructura definida en el JSON corresponde con + * la esperada + * TODO: Faltan las colas fijas segĂșn las operaciones + */ + private checkStructure() { + this.channel?.assertQueue("sim.queue") + this.channel?.assertExchange("sim.exchange", "direct") + } + + public async connect() { + this.connection = await this.createConnection(); + if (this.connection == undefined) throw new Error("[RMQ] Error crecreando la conexion") + this.channel = await this.createConfirmChannel() + } + + protected async createConnection() { + const { hostname, port, secure } = { ...this.connectionOptions } + const { username, password } = { ...this.connectionOptions }; + const protocol = secure ? 'amqps' : 'amqp'; + const vhost = this.connectionOptions.vhost + + const connection = await client.connect({ + protocol, + hostname, + port, + username, + password, + vhost + }); + + connection.on('error', (error: unknown) => { + console.error(`[RMQ] Rabbitmq connection error :: ${error}`); + Promise.reject(error); + }); + + return connection; + } + + protected async createConfirmChannel() { + const channel = await this.connection?.createConfirmChannel() + await channel?.prefetch(PREFETCH_LIMIT) + + if (channel == undefined) throw new Error("[RMQ] Error crecreando el canal") + + channel.on('error', (error: unknown) => { + console.error(`[RMQ] Rabbitmq channel error :: ${error}`); + Promise.reject(error); + }); + + return channel; + + } +} + diff --git a/packages/shared/config/env/index.ts b/packages/shared/config/env/index.ts deleted file mode 100644 index 77d79a2..0000000 --- a/packages/shared/config/env/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { bool, cleanEnv, num, port, str } from 'envalid'; - -import { USER_ROLES } from '#shared/domain/models/authorizer-user.entity'; - -import { ensureEnvString } from './env-validators'; - -export const env = cleanEnv(process.env, { - ENVIRONMENT: str({ - choices: ['local', 'development', 'production'] - }), - USE_IN_MEMORY_REPOSITORIES: bool(), - ALERTS_API_PORT: port(), - COMPANIES_COMMAND_URL: ensureEnvString(), - DEVICES_COMMAND_URL: ensureEnvString(), - USERS_COMMAND_URL: ensureEnvString(), - REDIS_PASSWORD: ensureEnvString(), - REDIS_PORT: port(), - REDIS_HOST: ensureEnvString(), - POSTGRES_USER: ensureEnvString(), - POSTGRES_PASSWORD: ensureEnvString(), - POSTGRES_PORT: port(), - POSTGRES_HOST: ensureEnvString(), - POSTGRES_DATABASE: ensureEnvString(), - RABBITMQ_HOST: ensureEnvString(), - RABBITMQ_USER: ensureEnvString(), - RABBITMQ_PASSWORD: ensureEnvString(), - RABBITMQ_EXCHANGE: ensureEnvString(), - RABBITMQ_PORT: port(), - RABBITMQ_MODULENAME: ensureEnvString(), - RABBITMQ_TTL: port(), - RABBITMQ_SECURE: bool(), - RABBITMQ_RETRY_INTERVAL: num(), - SYSTEM_USER_ID: ensureEnvString(), - SYSTEM_USER_EMAIL: ensureEnvString(), - SYSTEM_USER_ROLE: str({ - choices: [ - USER_ROLES.ADMIN, - USER_ROLES.CLIENT, - USER_ROLES.DELEGATION_MANAGER, - USER_ROLES.OPERATOR, - USER_ROLES.ROOM_STAFF - ], - default: USER_ROLES.ADMIN - }) -}); diff --git a/packages/shared/config/event-bus/index.ts b/packages/shared/config/event-bus/index.ts deleted file mode 100644 index 23af5b3..0000000 --- a/packages/shared/config/event-bus/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { env } from '#api/config/env'; - -export const eventBusConfig = { - host: env.RABBITMQ_HOST, - user: env.RABBITMQ_USER, - password: env.RABBITMQ_PASSWORD, - exchange: env.RABBITMQ_EXCHANGE, - port: env.RABBITMQ_PORT, - modulename: env.RABBITMQ_MODULENAME, - ttl: env.RABBITMQ_TTL, - secure: env.RABBITMQ_SECURE -}; diff --git a/packages/shared/index.ts b/packages/shared/index.ts deleted file mode 100644 index 2a261d1..0000000 --- a/packages/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -console.log("shared") -export default {} diff --git a/packages/shared/package.json b/packages/shared/package.json index 73d0b8f..5d4b363 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -2,23 +2,23 @@ "name": "sim-shared", "version": "1.0.0", "description": "", - "main": "src/app.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "tsx index.ts" + "dev": "echo \" Shared no es un modulo ejecutable \" " }, "author": "", "license": "ISC", - "private": true, "packageManager": "yarn@4.12.0", "dependencies": { "@tsconfig/node22": "*", + "amqplib": "^0.10.9", "cors": "*", "dotenv": "*", "express": "*", "typescript": "*" }, "devDependencies": { + "@types/amqplib": "^0.10.8", "@types/cors": "*", "@types/express": "*", "@types/node": "*", diff --git a/packages/shared/ports/queues/AMQPclient.port.ts b/packages/shared/ports/queues/AMQPclient.port.ts new file mode 100644 index 0000000..0c20aec --- /dev/null +++ b/packages/shared/ports/queues/AMQPclient.port.ts @@ -0,0 +1,7 @@ +export interface AMQPclient { + connect: () => Promise; + disconnect: () => Promise; + sendToQueue: (queue: string, msg: string, callback: () => {}) => boolean, +} + + diff --git a/packages/sim-consumidor/.env b/packages/sim-consumidor/.env new file mode 100644 index 0000000..c654b08 --- /dev/null +++ b/packages/sim-consumidor/.env @@ -0,0 +1,22 @@ +PORT=3000 +RABBITMQ_USER=guest +RABBITMQ_PASSWORD=guest + +ENVIORMENT=development + +#RABBITMQ_HOST=rabbitmq-sim-broker +RABBITMQ_HOST=localhost +RABBITMQ_PORT=5672 +RABBITMQ_USER=guest +RABBITMQ_PASSWORD=guest +RABBITMQ_SECURE=false +RABBITMQ_VHOST=sim-vhost + +# Hay cosas que unificar de varios servicios +POSTGRES_DB=postgres +POSTGRES_DATABASE=postres +POSTGRES_HOST=postgresql-sim-1 +POSTGRES_PORT=5432 +DEV_POSTGRES_PORT=5432 +POSTGRES_USER=postgres +POSTGRES_PASSWORD=1234 diff --git a/packages/sim-consumidor/config/env/index.ts b/packages/sim-consumidor/config/env/index.ts new file mode 100644 index 0000000..0e98485 --- /dev/null +++ b/packages/sim-consumidor/config/env/index.ts @@ -0,0 +1,24 @@ +import { loadEnvFile } from "node:process"; +loadEnvFile("../../.env") + + +export const env = { + ENVIRONMENT: process.env.ENVIORMENT, + POSTGRES_USER: process.env.POSTGRES_USER, + POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD, + POSTGRES_PORT: process.env.POSTGRES_PORT, + POSTGRES_HOST: process.env.POSTGRES_HOST, + POSTGRES_DATABASE: process.env.POSTGRES_DATABASE, + RABBITMQ_HOST: String(process.env.RABBITMQ_HOST ?? "localhost"), + RABBITMQ_USER: String(process.env.RABBITMQ_USER ?? "guest"), + RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "guest"), + RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"), + RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"), + RABBITMQ_MODULENAME: process.env.MODULENAME, + RABBITMQ_TTL: process.env.RABBITMQ_TTL, + RABBITMQ_SECURE: process.env.RABBITMQ_SECURE, + RABBITMQ_RETRY_INTERVAL: process.env.RABBITMQ_INTERVAL, + RABBITMQ_VHOST: String(process.env.RABBITMQ_VHOST), +}; + +console.log("Consumidor", env) diff --git a/packages/sim-consumidor/index.ts b/packages/sim-consumidor/index.ts new file mode 100644 index 0000000..6346a98 --- /dev/null +++ b/packages/sim-consumidor/index.ts @@ -0,0 +1,36 @@ +import { env } from "./config/env" +import { RabbitConnection } from "#shared/adapters/queues/RabbitMQClient" +import { ConsumeMessage } from "amqplib" + +const rmqUser = env.RABBITMQ_USER +const rmqPass = env.RABBITMQ_PASSWORD +const rmqHost = env.RABBITMQ_HOST +const rmqPort = Number(env.RABBITMQ_PORT) +const rmqSecure = false +const rmqVhost = env.RABBITMQ_VHOST + + +async function test() { + console.log("iniciado Consumidor", env) + const rbmq = new RabbitConnection({ + username: rmqUser, + password: rmqPass, + vhost: String(rmqVhost), + hostname: rmqHost, + port: rmqPort, + secure: rmqSecure + }) + await rbmq.connect() + console.log("[Consumidor] iniciado") + + await rbmq.channel?.consume("sim.queue", (buff: ConsumeMessage | null) => { + const decoded = buff?.content.toString() + console.log(" [Consumidor] Mensaje recibido ", decoded) + }) + +} + + + +test() +export default {} diff --git a/packages/sim-consumidor/package.json b/packages/sim-consumidor/package.json new file mode 100644 index 0000000..aa72fd7 --- /dev/null +++ b/packages/sim-consumidor/package.json @@ -0,0 +1,32 @@ +{ + "name": "sim-consumidor", + "version": "1.0.0", + "description": "consumidor generico de envetos de RMQ", + "main": "index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "tsx watch index.ts " + }, + "author": "", + "license": "ISC", + "packageManager": "yarn@4.12.0", + "dependencies": { + "@tsconfig/node22": "*", + "amqplib": "^0.10.9", + "cors": "*", + "dotenv": "*", + "express": "*", + "typescript": "*" + }, + "devDependencies": { + "@types/amqplib": "^0.10.8", + "@types/cors": "*", + "@types/express": "*", + "@types/node": "*", + "@types/supertest": "*", + "prettier": "*", + "supertest": "*", + "tsx": "*", + "vitest": "*" + } +} diff --git a/packages/sim-consumidor/tsconfig.json b/packages/sim-consumidor/tsconfig.json new file mode 100644 index 0000000..7761702 --- /dev/null +++ b/packages/sim-consumidor/tsconfig.json @@ -0,0 +1,37 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/sim-consumidor", + "baseUrl": ".", + "paths": { + "#config/*": [ + "config/*" + ], + "#adapters/*": [ + "adapters/*" + ], + "#domain/*": [ + "domain/*" + ], + "#ports/*": [ + "ports/*" + ], + "#tests/*": [ + "__tests__/*" + ], + "#shared/*": [ + "../shared/*" + ], + } + }, + "exclude": [ + "node_modules" + ], + "include": [ + "**/*.ts", + "src/**/*.d.ts" + ], + "files": [ + "index.ts" + ] +} diff --git a/packages/sim-gestor-eventos/config/env/env-validators.ts b/packages/sim-gestor-eventos/config/env/env-validators.ts deleted file mode 100644 index 38e9454..0000000 --- a/packages/sim-gestor-eventos/config/env/env-validators.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { makeValidator } from 'envalid'; - -import { isValidEnvString, isValidEnvStringArray } from '#shared/domain/utils/env-validators'; - -export const ensureEnvStringArray = makeValidator((value: unknown) => isValidEnvStringArray(value)); - -export const ensureEnvString = makeValidator((value: unknown) => isValidEnvString(value)); diff --git a/packages/sim-gestor-eventos/config/env/index.ts b/packages/sim-gestor-eventos/config/env/index.ts index 68d2407..46631b0 100644 --- a/packages/sim-gestor-eventos/config/env/index.ts +++ b/packages/sim-gestor-eventos/config/env/index.ts @@ -1,3 +1,6 @@ +import { loadEnvFile } from "node:process"; +loadEnvFile("../../.env") + export const env = { ENVIRONMENT: process.env.ENVIORMENT, POSTGRES_USER: process.env.POSTGRES_USER, @@ -5,14 +8,14 @@ export const env = { POSTGRES_PORT: process.env.POSTGRES_PORT, POSTGRES_HOST: process.env.POSTGRES_HOST, POSTGRES_DATABASE: process.env.POSTGRES_DATABASE, - RABBITMQ_HOST: process.env.RABBITMQ_HOST, - RABBITMQ_USER: process.env.RABBITMQ_USER, - RABBITMQ_PASSWORD: process.env.RABBITMQ_PASSWORD, - RABBITMQ_EXCHANGE: process.env.RABBITMQ_EXCHANGE, - RABBITMQ_PORT: process.env.RABBITMQ_PORT, + RABBITMQ_HOST: String(process.env.RABBITMQ_HOST ?? "localhost"), + RABBITMQ_USER: String(process.env.RABBITMQ_USER ?? "guest"), + RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "guest"), + RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"), + RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"), RABBITMQ_MODULENAME: process.env.MODULENAME, RABBITMQ_TTL: process.env.RABBITMQ_TTL, RABBITMQ_SECURE: process.env.RABBITMQ_SECURE, RABBITMQ_RETRY_INTERVAL: process.env.RABBITMQ_INTERVAL, - RABBITMQ_VHOST: process.env.RABBITMQ_VHOST, + RABBITMQ_VHOST: String(process.env.RABBITMQ_VHOST), }; diff --git a/packages/sim-gestor-eventos/config/event-bus/index.ts b/packages/sim-gestor-eventos/config/event-bus/index.ts deleted file mode 100644 index 23af5b3..0000000 --- a/packages/sim-gestor-eventos/config/event-bus/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { env } from '#api/config/env'; - -export const eventBusConfig = { - host: env.RABBITMQ_HOST, - user: env.RABBITMQ_USER, - password: env.RABBITMQ_PASSWORD, - exchange: env.RABBITMQ_EXCHANGE, - port: env.RABBITMQ_PORT, - modulename: env.RABBITMQ_MODULENAME, - ttl: env.RABBITMQ_TTL, - secure: env.RABBITMQ_SECURE -}; diff --git a/packages/sim-gestor-eventos/index.ts b/packages/sim-gestor-eventos/index.ts index dbaea1c..c482507 100644 --- a/packages/sim-gestor-eventos/index.ts +++ b/packages/sim-gestor-eventos/index.ts @@ -1,5 +1,5 @@ -import client, { ChannelModel, ConfirmChannel, connect, Connection } from "amqplib" -import { env } from "config/env" +import { env } from "#config/env" +import { RabbitConnection } from "#shared/adapters/queues/RabbitMQClient" const rmqUser = env.RABBITMQ_USER const rmqPass = env.RABBITMQ_PASSWORD @@ -9,63 +9,22 @@ const rmqSecure = false const rmqVhost = env.RABBITMQ_VHOST -const PREFETCH_LIMIT = 1 - -class RabbitConnection { - connection?: ChannelModel - channel?: ConfirmChannel - connected: Boolean = false - - public async connect() { - this.connection = await this.createConnection(); - if (this.connection == undefined) throw new Error("[RMQ] Error crecreando la conexion") - this.channel = await this.createConfirmChannel() - } - - protected async createConnection() { - const { hostname, port, secure } = { hostname: rmqHost, port: rmqPort, secure: rmqSecure } - const { username, password } = { username: rmqUser, password: rmqPass }; - const protocol = secure ? 'amqps' : 'amqp'; - const vhost = rmqVhost - - const connection = await client.connect({ - protocol, - hostname, - port, - username, - password, - vhost - }); - - connection.on('error', (error: unknown) => { - console.error(`[RMQ] Rabbitmq connection error :: ${error}`); - Promise.reject(error); - }); - - return connection; - } - - protected async createConfirmChannel() { - const channel = await this.connection?.createConfirmChannel() - await channel?.prefetch(PREFETCH_LIMIT) - - if (channel == undefined) throw new Error("[RMQ] Error crecreando el canal") - - channel.on('error', (error: unknown) => { - console.error(`[RMQ] Rabbitmq channel error :: ${error}`); - Promise.reject(error); - }); - - return channel; - - } -} +console.log("[Generador] Iniciando") async function test() { - const rbmq = new RabbitConnection() + + const rbmq = new RabbitConnection({ + username: rmqUser, + password: rmqPass, + vhost: String(rmqVhost), + hostname: rmqHost, + port: rmqPort, + secure: rmqSecure + }) + await rbmq.connect() - console.log("enviando") + console.log("[Generador] enviando --") rbmq.channel?.sendToQueue("sim.queue", Buffer.from("test"), {}, function (err, ok) { diff --git a/packages/sim-gestor-eventos/package.json b/packages/sim-gestor-eventos/package.json index c2acb46..1872e50 100644 --- a/packages/sim-gestor-eventos/package.json +++ b/packages/sim-gestor-eventos/package.json @@ -5,7 +5,7 @@ "main": "index.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "tsx index.ts" + "dev": "tsx watch index.ts" }, "author": "", "license": "ISC", diff --git a/packages/sim-gestor-eventos/tsconfig.json b/packages/sim-gestor-eventos/tsconfig.json index 7298f86..9f829e5 100644 --- a/packages/sim-gestor-eventos/tsconfig.json +++ b/packages/sim-gestor-eventos/tsconfig.json @@ -4,14 +4,17 @@ "outDir": "../../dist/sim-gestor-eventos", "baseUrl": ".", "paths": { + "#config/*": [ + "config/*" + ], "#adapters/*": [ - "src/adapters/*" + "adapters/*" ], "#domain/*": [ - "src/domain/*" + "domain/*" ], "#ports/*": [ - "src/ports/*" + "ports/*" ], "#tests/*": [ "__tests__/*" diff --git a/run.local.sh b/run.local.sh index 0bf5620..2cd97eb 100755 --- a/run.local.sh +++ b/run.local.sh @@ -1,2 +1,2 @@ #/bin/bash -docker compose -f deployment/local/docker/docker-compose.yaml --project-directory ./ up +docker compose -f deployment/local/docker/docker-compose.yaml --project-directory ./ up --watch diff --git a/yarn.lock b/yarn.lock index 67134f4..ada2c1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -515,14 +515,14 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:^5.0.0": - version: 5.1.0 - resolution: "@types/express-serve-static-core@npm:5.1.0" + version: 5.1.1 + resolution: "@types/express-serve-static-core@npm:5.1.1" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/c0b5b7ebc15b222f51e5705da2b8a5180335bf70927cc83c065784331aa9291984db1bfa4a14f5ba31b538dcb543561d9280046051fa4c9b7256eb971293e735 + checksum: 10/7f3d8cf7e68764c9f3e8f6a12825b69ccf5287347fc1c20b29803d4f08a4abc1153ae11d7258852c61aad50f62ef72d4c1b9c97092b0a90462c3dddec2f6026c languageName: node linkType: hard @@ -552,11 +552,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^25.0.3": - version: 25.0.3 - resolution: "@types/node@npm:25.0.3" + version: 25.0.6 + resolution: "@types/node@npm:25.0.6" dependencies: undici-types: "npm:~7.16.0" - checksum: 10/5889b00f398eff4d4af28c3e5e97976f65c39a63fa3d7011f35cbf8640675fa6835e5dd47dce94d6ba48667711ddcd1f5c9bc5d93233e6a8e9ea1e502e8aa5a4 + checksum: 10/19d6dcaccc49b8d9efd987d6e7573f84cf3665fbe88adc0eb08e87d3682a36a4a6997a5ead2a11c79eb891c0e0c5260caef23bd262e5772708d95330d5b7ddf1 languageName: node linkType: hard @@ -615,25 +615,25 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/expect@npm:4.0.16" +"@vitest/expect@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/expect@npm:4.0.17" dependencies: "@standard-schema/spec": "npm:^1.0.0" "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.16" - "@vitest/utils": "npm:4.0.16" + "@vitest/spy": "npm:4.0.17" + "@vitest/utils": "npm:4.0.17" chai: "npm:^6.2.1" tinyrainbow: "npm:^3.0.3" - checksum: 10/1da98c86d394a4955bef381ac2c63a52d2eec0086f55e18858083da928cfdf51e7a30bfd88b1814e861906dae44d089aeab0fcc67b2597a4a8073c70cd14bdf7 + checksum: 10/f260fefea527aae652be8d71ff188d45f958b7299a4577d1c3ed15bc87e6b20a6abb30ec6419c826259863d8bdbc1122e82cc499fb9eb63aaa43d3a5be1b7f76 languageName: node linkType: hard -"@vitest/mocker@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/mocker@npm:4.0.16" +"@vitest/mocker@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/mocker@npm:4.0.17" dependencies: - "@vitest/spy": "npm:4.0.16" + "@vitest/spy": "npm:4.0.17" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.21" peerDependencies: @@ -644,54 +644,54 @@ __metadata: optional: true vite: optional: true - checksum: 10/3a34c6571ef278b80d33feabb8389d6cf7cfd248fe592b8b2a373650ab460b95805fde65e6bd76aebc75729fc0c94b4d8b9bba25fa55e21c2745ae03c10316bf + checksum: 10/4d938c298dd7e63d23efc56a81e254a8a453b0157b378d4b7af57a40dd2687c24a0e1f2e2499f8d17fe302e6d6d515e67c6a5fbfbff75dee2cfd51c37cf4c7dc languageName: node linkType: hard -"@vitest/pretty-format@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/pretty-format@npm:4.0.16" +"@vitest/pretty-format@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/pretty-format@npm:4.0.17" dependencies: tinyrainbow: "npm:^3.0.3" - checksum: 10/914d5d35fb3b0aa67f8e6065ac3d1f1798b7774e1ad9d1e873e7c6efdc7925c98e0f8188bb13c4f3feb4d80b756c337f7a55cd4f78c50fe786330d0aaede7cfd + checksum: 10/e50925f44168b8108a5094e44fd739b7183457c101eb020e88b5556a2f857808d0c9d045113aec83815a20d4aaaf9b7a522a1c651ce111de18daa686891b37a0 languageName: node linkType: hard -"@vitest/runner@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/runner@npm:4.0.16" +"@vitest/runner@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/runner@npm:4.0.17" dependencies: - "@vitest/utils": "npm:4.0.16" + "@vitest/utils": "npm:4.0.17" pathe: "npm:^2.0.3" - checksum: 10/2aed39bb46ba747bd4fd5acf081e9e500192fec19c1887399f6a1701bbfdab05f3d3b45c00e4af5b90a0832853c959a0f64e676b05c67f5457b7c6984f844aa2 + checksum: 10/75c62ac09b506d2707baad72c9a8ca6addb9bb179548d9ec9af3f7f2303b2e03f4001480c9657325718b15f2997fc39168c027d8d88794c0f8c04800c640c055 languageName: node linkType: hard -"@vitest/snapshot@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/snapshot@npm:4.0.16" +"@vitest/snapshot@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/snapshot@npm:4.0.17" dependencies: - "@vitest/pretty-format": "npm:4.0.16" + "@vitest/pretty-format": "npm:4.0.17" magic-string: "npm:^0.30.21" pathe: "npm:^2.0.3" - checksum: 10/30f2977c96645c018b9d1f658e758f4f886ac63966dca909e9f736d6c9d6d0a6dabdeaedf9abcc13e1000458e4069283632c0140033972847dc1f4b4ac38e076 + checksum: 10/0cda8970f484bdc5777347cc317f020dc7773ddf0cea996ab5fff453966310c64e9a97854b04998cf0635e8118c12e2235c7a5f921fdfc288dc63dc27c3116d8 languageName: node linkType: hard -"@vitest/spy@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/spy@npm:4.0.16" - checksum: 10/76cbabfdd77adf16904d5c128de67abca650bbc2ed36acc68fca548dc51844c7fc1ac516e384d07341b25ae39318c7c2feb499ffa7283a1a838f762cb0cda6ab +"@vitest/spy@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/spy@npm:4.0.17" + checksum: 10/23313980c512b00c08a1c64f6ed15dc7c295bb7b09feab571a3cc96536de2f07432109256717f9deb7f1b8c9ba9ac28f7e617cf639654bc564f6ea5a341ad8f4 languageName: node linkType: hard -"@vitest/utils@npm:4.0.16": - version: 4.0.16 - resolution: "@vitest/utils@npm:4.0.16" +"@vitest/utils@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/utils@npm:4.0.17" dependencies: - "@vitest/pretty-format": "npm:4.0.16" + "@vitest/pretty-format": "npm:4.0.17" tinyrainbow: "npm:^3.0.3" - checksum: 10/07fb3c96867656ff080df7ae6056a8dc23931d0f8bc16e15994c576c580dc6e2dcf71af0964fee197ea7eea4f4ad72c256f56cd3b81599f9e0ba63a228968d50 + checksum: 10/b8b96f8c2c4fee13f4ef4927e56bbf98c2d4f3a61428d9721c5578c96e2a0953892dfccfad3e0c1a7b3105e3d24f93f826f8338c82c72b9f8bc32b50bc9072a1 languageName: node linkType: hard @@ -1457,11 +1457,11 @@ __metadata: linkType: hard "iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": - version: 0.7.1 - resolution: "iconv-lite@npm:0.7.1" + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" dependencies: safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10/bf9bfa10132b591d7b43cc2cc6700cd72d848b7943c3f38db05527d04c224eb44d1d92101f76d25eac7fabc67cb918320b93808b0be47e45cf7257df0a5ec54c + checksum: 10/24c937b532f868e938386b62410b303b7c767ce3d08dc2829cbe59464d5a26ef86ae5ad1af6b34eec43ddfea39e7d101638644b0178d67262fa87015d59f983a languageName: node linkType: hard @@ -2156,9 +2156,31 @@ __metadata: languageName: node linkType: hard -"sim-cola-eventos@workspace:.": +"sim-consumidor@workspace:packages/sim-consumidor": version: 0.0.0-use.local - resolution: "sim-cola-eventos@workspace:." + resolution: "sim-consumidor@workspace:packages/sim-consumidor" + dependencies: + "@tsconfig/node22": "npm:*" + "@types/amqplib": "npm:^0.10.8" + "@types/cors": "npm:*" + "@types/express": "npm:*" + "@types/node": "npm:*" + "@types/supertest": "npm:*" + amqplib: "npm:^0.10.9" + cors: "npm:*" + dotenv: "npm:*" + express: "npm:*" + prettier: "npm:*" + supertest: "npm:*" + tsx: "npm:*" + typescript: "npm:*" + vitest: "npm:*" + languageName: unknown + linkType: soft + +"sim-eventos@workspace:.": + version: 0.0.0-use.local + resolution: "sim-eventos@workspace:." dependencies: "@tsconfig/node22": "npm:^22.0.5" "@types/cors": "npm:^2.8.19" @@ -2203,10 +2225,34 @@ __metadata: resolution: "sim-shared@workspace:packages/shared" dependencies: "@tsconfig/node22": "npm:*" + "@types/amqplib": "npm:^0.10.8" "@types/cors": "npm:*" "@types/express": "npm:*" "@types/node": "npm:*" "@types/supertest": "npm:*" + amqplib: "npm:^0.10.9" + cors: "npm:*" + dotenv: "npm:*" + express: "npm:*" + prettier: "npm:*" + supertest: "npm:*" + tsx: "npm:*" + typescript: "npm:*" + vitest: "npm:*" + languageName: unknown + linkType: soft + +"sim-template@workspace:packages/_template": + version: 0.0.0-use.local + resolution: "sim-template@workspace:packages/_template" + dependencies: + "@tsconfig/node22": "npm:*" + "@types/amqplib": "npm:^0.10.8" + "@types/cors": "npm:*" + "@types/express": "npm:*" + "@types/node": "npm:*" + "@types/supertest": "npm:*" + amqplib: "npm:^0.10.9" cors: "npm:*" dotenv: "npm:*" express: "npm:*" @@ -2514,16 +2560,16 @@ __metadata: linkType: hard "vitest@npm:*, vitest@npm:^4.0.16": - version: 4.0.16 - resolution: "vitest@npm:4.0.16" + version: 4.0.17 + resolution: "vitest@npm:4.0.17" dependencies: - "@vitest/expect": "npm:4.0.16" - "@vitest/mocker": "npm:4.0.16" - "@vitest/pretty-format": "npm:4.0.16" - "@vitest/runner": "npm:4.0.16" - "@vitest/snapshot": "npm:4.0.16" - "@vitest/spy": "npm:4.0.16" - "@vitest/utils": "npm:4.0.16" + "@vitest/expect": "npm:4.0.17" + "@vitest/mocker": "npm:4.0.17" + "@vitest/pretty-format": "npm:4.0.17" + "@vitest/runner": "npm:4.0.17" + "@vitest/snapshot": "npm:4.0.17" + "@vitest/spy": "npm:4.0.17" + "@vitest/utils": "npm:4.0.17" es-module-lexer: "npm:^1.7.0" expect-type: "npm:^1.2.2" magic-string: "npm:^0.30.21" @@ -2541,10 +2587,10 @@ __metadata: "@edge-runtime/vm": "*" "@opentelemetry/api": ^1.9.0 "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.16 - "@vitest/browser-preview": 4.0.16 - "@vitest/browser-webdriverio": 4.0.16 - "@vitest/ui": 4.0.16 + "@vitest/browser-playwright": 4.0.17 + "@vitest/browser-preview": 4.0.17 + "@vitest/browser-webdriverio": 4.0.17 + "@vitest/ui": 4.0.17 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -2568,7 +2614,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/22b3806988ab186be4a6a133903a70c62835198e8e749f6ed751957d23bc1e3f0466e310a1a79d0b70a354b2e308e574486191eb39711257b3fe61e4fe00d1c8 + checksum: 10/792cf5ecdb2c0c2a61fc7beacec800413dcc5b68ad5e18f74795cdbfe513d58e3b6e437571c728c9992920f52d0640a5264aaf8c3702454b2637ff93451cf567 languageName: node linkType: hard