Template de archivos, productor - consumidor y lanzamiento paralelo de
servicios
This commit is contained in:
4
.env
4
.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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 .",
|
||||
|
||||
22
packages/.env
Normal file
22
packages/.env
Normal file
@@ -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
|
||||
18
packages/_template/config/env/index.ts
vendored
Normal file
18
packages/_template/config/env/index.ts
vendored
Normal file
@@ -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 ?? "/"),
|
||||
};
|
||||
3
packages/_template/index.ts
Normal file
3
packages/_template/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
console.log("Template")
|
||||
|
||||
export default {}
|
||||
32
packages/_template/package.json
Normal file
32
packages/_template/package.json
Normal file
@@ -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": "*"
|
||||
}
|
||||
}
|
||||
@@ -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": [
|
||||
78
packages/shared/adapters/queues/RabbitMQClient.ts
Normal file
78
packages/shared/adapters/queues/RabbitMQClient.ts
Normal file
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
45
packages/shared/config/env/index.ts
vendored
45
packages/shared/config/env/index.ts
vendored
@@ -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
|
||||
})
|
||||
});
|
||||
@@ -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
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
console.log("shared")
|
||||
export default {}
|
||||
@@ -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": "*",
|
||||
|
||||
7
packages/shared/ports/queues/AMQPclient.port.ts
Normal file
7
packages/shared/ports/queues/AMQPclient.port.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export interface AMQPclient {
|
||||
connect: () => Promise<void>;
|
||||
disconnect: () => Promise<void>;
|
||||
sendToQueue: (queue: string, msg: string, callback: () => {}) => boolean,
|
||||
}
|
||||
|
||||
|
||||
22
packages/sim-consumidor/.env
Normal file
22
packages/sim-consumidor/.env
Normal file
@@ -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
|
||||
24
packages/sim-consumidor/config/env/index.ts
vendored
Normal file
24
packages/sim-consumidor/config/env/index.ts
vendored
Normal file
@@ -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)
|
||||
36
packages/sim-consumidor/index.ts
Normal file
36
packages/sim-consumidor/index.ts
Normal file
@@ -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 {}
|
||||
32
packages/sim-consumidor/package.json
Normal file
32
packages/sim-consumidor/package.json
Normal file
@@ -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": "*"
|
||||
}
|
||||
}
|
||||
37
packages/sim-consumidor/tsconfig.json
Normal file
37
packages/sim-consumidor/tsconfig.json
Normal file
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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));
|
||||
15
packages/sim-gestor-eventos/config/env/index.ts
vendored
15
packages/sim-gestor-eventos/config/env/index.ts
vendored
@@ -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),
|
||||
};
|
||||
|
||||
@@ -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
|
||||
};
|
||||
@@ -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) {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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__/*"
|
||||
|
||||
@@ -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
|
||||
|
||||
164
yarn.lock
164
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user