70 lines
1.8 KiB
TypeScript
70 lines
1.8 KiB
TypeScript
import { RabbitMQEventBus, RMQConnectionParams } from "sim-shared/infrastructure/RabbitMQEventBus.js"
|
|
import { Channel } from "amqp-connection-manager"
|
|
import { env } from "./env/index.js"
|
|
|
|
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
|
|
|
|
export const rmqConnOptions = <RMQConnectionParams>{
|
|
username: rmqUser,
|
|
password: rmqPass,
|
|
vhost: rmqVhost,
|
|
hostname: rmqHost,
|
|
port: rmqPort,
|
|
secure: rmqSecure,
|
|
}
|
|
|
|
export const rabbitmqEventBus = new RabbitMQEventBus({
|
|
connectionParams: rmqConnOptions,
|
|
buildStructure: buildQueues,
|
|
maxRetry: 5
|
|
})
|
|
|
|
async function buildQueues(channel: Channel) {
|
|
const QUEUES = {
|
|
NOS: "sim.nos",
|
|
NOSDLX: "sim.nos.dlx",
|
|
NOSDEL: "sim.nos.delayed",
|
|
}
|
|
|
|
const EXCHANGES = {
|
|
MAIN: "sim.exchange",
|
|
DLX: "sim.ex.nos.dlx",
|
|
DEL: "sim.ex.nos.delayed"
|
|
}
|
|
|
|
const DELAY = 10 * 1000
|
|
const BASE_NOS_KEY = "sim.nos.#"
|
|
|
|
await channel.assertExchange(EXCHANGES.DEL, "topic")
|
|
await channel.assertExchange(EXCHANGES.DLX, "topic")
|
|
await channel.assertExchange(EXCHANGES.MAIN, "topic")
|
|
|
|
await channel.assertQueue(QUEUES.NOS)
|
|
await channel.assertQueue(QUEUES.NOSDLX)
|
|
await channel.assertQueue(QUEUES.NOSDEL, {
|
|
durable: true,
|
|
arguments: {
|
|
'x-message-ttl': DELAY,
|
|
'x-dead-letter-exchange': EXCHANGES.MAIN,
|
|
}
|
|
})
|
|
|
|
// Cola dead-letter
|
|
await channel.bindQueue(QUEUES.NOSDLX, EXCHANGES.DLX, "sim.nos.#")
|
|
// Cola delay
|
|
await channel.bindQueue(QUEUES.NOSDEL, EXCHANGES.DEL, BASE_NOS_KEY)
|
|
// Cola nos -> main exchange
|
|
await channel.bindQueue(QUEUES.NOS, EXCHANGES.MAIN, BASE_NOS_KEY)
|
|
|
|
}
|
|
|
|
export async function startRMQClient() {
|
|
await rabbitmqEventBus.connect()
|
|
return rabbitmqEventBus
|
|
}
|