{"version":3,"file":"index.mjs","sources":["../../src/base.ts","../../src/producer.ts","../../src/consumer.ts","../../src/tools/uuidv7.ts","../../src/rpc.ts"],"sourcesContent":["import amqp from 'amqplib'\nimport type { ExchangeParams, QueueParams, RabbitMQConfig } from './types'\n\nexport abstract class RabbitMQBase {\n  protected connection!: amqp.ChannelModel\n  protected channel!: amqp.Channel\n  protected config: RabbitMQConfig\n\n  constructor(config: RabbitMQConfig) {\n    this.config = {\n      channel: { prefetchCount: 1 },\n      ...config\n    }\n  }\n\n  async connect(): Promise<void> {\n    throw new Error('Need override this function')\n  }\n\n  /**\n   * Initialize all exchanges from the config\n   * @protected\n   */\n  protected async setupExchanges(): Promise<void> {\n    for (const exchange of this.config.exchanges) {\n      await this.registerExchange(exchange)\n    }\n  }\n\n  async registerExchange(\n    exchange: ExchangeParams\n  ): Promise<void> {\n    await this.channel.assertExchange(\n      exchange.name,\n      exchange.type,\n      exchange.options || {}\n    )\n  }\n\n  /**\n   * Initialize queues from config\n   * @protected\n   */\n  protected async setupQueues(): Promise<void> {\n    for (const queue of this.config.queues) {\n      await this.registerQueue(queue)\n    }\n  }\n\n  async registerQueue(\n    queue: QueueParams\n  ): Promise<amqp.Replies.AssertQueue> {\n    let assertsOptions: amqp.Options.AssertQueue = {\n      maxPriority: queue.maxPriority ?? 10\n    }\n\n    // @todo fix this\n    if (assertsOptions.maxPriority) {\n      assertsOptions = {\n        arguments: {\n          'x-max-priority': assertsOptions.maxPriority\n        },\n        ...assertsOptions\n      }\n    }\n\n    if (queue.deadLetter) {\n      assertsOptions = {\n        arguments: {\n          'x-dead-letter-exchange': queue.deadLetter.exchange,\n          'x-dead-letter-routing-key': queue.deadLetter.routingKey || ''\n        },\n        ...assertsOptions\n      }\n    }\n\n    const q = await this.channel.assertQueue(\n      queue.name || '',\n      {\n        ...assertsOptions,\n        ...queue.options\n      }\n    )\n\n    for (const binding of queue.bindings) {\n      if (binding.headers) {\n        await this.channel.bindQueue(\n          q.queue,\n          binding.exchange,\n          binding.routingKey || '',\n          binding.headers\n        )\n      } else {\n        await this.channel.bindQueue(\n          q.queue,\n          binding.exchange,\n          binding.routingKey || ''\n        )\n      }\n    }\n\n    return q\n  }\n\n  async disconnect(): Promise<void> {\n    await this.channel?.close()\n    await this.connection?.close()\n    console.log('[RabbitMQ::Base] disconnect')\n  }\n}\n","import amqp from 'amqplib'\nimport { RabbitMQBase } from './base'\nimport type { ExchangeParams, MessageOptions } from './types'\n\nexport class RabbitMQProducer extends RabbitMQBase {\n  private exchanges = new Map<string, ExchangeParams>()\n\n  public async initialize(): Promise<void> {\n    await this.connect()\n    await this.setupExchanges()\n  }\n\n  override async connect(): Promise<void> {\n    try {\n      console.log('[RabbitMQ::Producer] connect ...')\n\n      this.connection = await amqp.connect(this.config.connection.url)\n      this.channel = await this.connection.createChannel()\n      await this.channel.prefetch(this.config.channel!.prefetchCount!)\n      console.log('[RabbitMQ::Producer] connected successfully')\n    } catch (error) {\n      const problem = error instanceof Error ? error : new Error(`[RabbitMQ::Producer] connected error`, { cause: error })\n\n      console.error(problem)\n      throw problem\n    }\n  }\n\n  override async registerExchange(\n    exchange: ExchangeParams\n  ): Promise<void> {\n    await super.registerExchange(exchange)\n    this.exchanges.set(exchange.name, exchange)\n  }\n\n  async publish<T>(\n    exchangeName: string,\n    routingKey: string,\n    message: T,\n    options: MessageOptions = {}\n  ): Promise<boolean> {\n    // if (!this.exchanges.has(exchangeName)) {\n    //   throw new Error(`[RabbitMQProducer] Exchange ${exchangeName} not registered`)\n    // }\n\n    return this.channel.publish(\n      exchangeName,\n      routingKey,\n      Buffer.from(JSON.stringify(message)),\n      {\n        priority: 5,\n        ...options\n      }\n    )\n  }\n}\n","import amqp from 'amqplib'\nimport { RabbitMQBase } from './base'\nimport type { MessageHandler } from './types'\n\nexport class RabbitMQConsumer extends RabbitMQBase {\n  private retries = 0\n  private handlers = new Map<string, MessageHandler>()\n\n  public async initialize(): Promise<void> {\n    await this.connect()\n    await this.setupExchanges()\n    await this.setupQueues()\n  }\n\n  override async connect(): Promise<void> {\n    try {\n      console.log('[RabbitMQ::Consumer] connect ...')\n\n      this.connection = await amqp.connect(this.config.connection.url)\n      this.channel = await this.connection.createChannel()\n      await this.channel.prefetch(this.config.channel!.prefetchCount!)\n\n      this.connection.on(\n        'close',\n        () => this.handleReconnect()\n      )\n      console.log('[RabbitMQ::Consumer] connected successfully')\n      this.retries = 0\n    } catch (error) {\n      const problem = error instanceof Error ? error : new Error(`[RabbitMQ::Consumer] connected error`, { cause: error })\n\n      console.error(problem)\n      if (\n        problem.message.includes('ENOTFOUND')\n        || problem.message.includes('ECONNREFUSED')\n      ) {\n        throw problem\n      }\n\n      this.handleReconnect()\n    }\n  }\n\n  private handleReconnect(): void {\n    if (this.retries >= (this.config.connection.maxRetries || 5)) {\n      throw new Error('[RabbitMQ::Consumer] Max connection retries exceeded')\n    }\n\n    setTimeout(() => {\n      this.retries++\n      console.log(`[RabbitMQ::Consumer] reconnecting attempt ${this.retries}`)\n      this.connect()\n    }, this.config.connection.reconnectInterval || 5000)\n  }\n\n  registerHandler<T>(\n    queueName: string,\n    handler: MessageHandler<T>\n  ): void {\n    this.handlers.set(queueName, handler)\n  }\n\n  unRegisterHandler(queueName: string): void {\n    if (this.handlers.has(queueName)) {\n      this.handlers.delete(queueName)\n    }\n  }\n\n  async consume(\n    queueName: string\n  ): Promise<amqp.Replies.Consume> {\n    return this.channel.consume(\n      queueName,\n      async (msg) => {\n        if (!msg) return\n\n        // msg.fields.exchange\n        const handler = this.handlers.get(queueName)\n        if (handler) {\n          try {\n            const content = JSON.parse(msg.content.toString())\n            await handler(\n              content,\n              () => this.channel.ack(msg),\n              () => this.channel.nack(msg, false, false)\n            )\n          } catch (error) {\n            console.error(`[RabbitMQ] Error processing message: ${error instanceof Error ? error.message : error}`)\n            this.channel.nack(msg, false, false)\n          }\n        }\n      }\n    )\n  }\n}\n","/**\n * uuid v7\n */\nconst byteToHex: string[] = []\nfor (let i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).slice(1))\n}\n\nfunction sfc32(a: number, b: number, c: number, d: number) {\n  return () => {\n    // eslint-disable-next-line\n    a |= 0; b |= 0; c |= 0; d |= 0;\n    // eslint-disable-next-line\n    const t = (a + b | 0) + d | 0;\n    // eslint-disable-next-line\n    d = d + 1 | 0;\n    a = b ^ b >>> 9;\n    // eslint-disable-next-line\n    b = c + (c << 3) | 0;\n    // eslint-disable-next-line\n    c = (c << 21 | c >>> 11) + t | 0;\n    return t >>> 0;\n  };\n}\n\nexport default function uuidv7(): string {\n  const bytes = new Uint8Array(16)\n  const timestamp = BigInt(Date.now());\n  const perf = BigInt(Math.floor(performance.now() * 1000) % 0xffff);\n  const combinedTime = (timestamp << 16n) | perf;\n\n  bytes[0] = Number((combinedTime >> 40n) & 0xffn)\n  bytes[1] = Number((combinedTime >> 32n) & 0xffn)\n  bytes[2] = Number((combinedTime >> 24n) & 0xffn)\n  bytes[3] = Number((combinedTime >> 16n) & 0xffn)\n  bytes[4] = Number((combinedTime >> 8n) & 0xffn)\n  bytes[5] = Number(combinedTime & 0xffn)\n\n  const seed = (Math.random() * 0xffffffff ^ Date.now() ^ performance.now()) >>> 0\n  const rand = sfc32(0x9E3779B9, 0x243F6A88, 0xB7E15162, seed)\n  const randView = new DataView(bytes.buffer)\n\n  randView.setUint32(6, rand());\n  randView.setUint32(10, rand());\n  randView.setUint16(14, rand());\n\n  bytes[6] = 0x70 | (bytes[6] & 0x0f)\n  bytes[8] = 0x80 | (bytes[8] & 0x3f)\n\n  return (\n    byteToHex[bytes[0]] +\n    byteToHex[bytes[1]] +\n    byteToHex[bytes[2]] +\n    byteToHex[bytes[3]] +\n    '-' +\n    byteToHex[bytes[4]] +\n    byteToHex[bytes[5]] +\n    '-' +\n    byteToHex[bytes[6]] +\n    byteToHex[bytes[7]] +\n    '-' +\n    byteToHex[bytes[8]] +\n    byteToHex[bytes[9]] +\n    '-' +\n    byteToHex[bytes[10]] +\n    byteToHex[bytes[11]] +\n    byteToHex[bytes[12]] +\n    byteToHex[bytes[13]] +\n    byteToHex[bytes[14]] +\n    byteToHex[bytes[15]]\n  ).toLowerCase()\n}\n","import uuidv7 from './tools/uuidv7'\nimport type { RabbitMQProducer } from './producer'\nimport type { RabbitMQConsumer } from './consumer'\n\nexport class RabbitRPC {\n  constructor(\n    private producer: RabbitMQProducer,\n    private consumer: RabbitMQConsumer\n  ) {}\n\n  async call<T>(\n    exchange: string,\n    routingKey: string,\n    payload: any,\n    timeout = 5000\n  ): Promise<T> {\n    const correlationId = uuidv7()\n    const queueName = `rps-${correlationId}`\n    const replyQueue = await this.consumer.registerQueue({\n      name: queueName,\n      bindings: [\n        {\n          exchange: 'amq.direct',\n          routingKey: queueName\n        }\n      ],\n      options: { exclusive: true }\n    })\n\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(\n        () => reject(new Error('[RabbitRPC] timeout')),\n        timeout\n      )\n\n      const handler = async (\n        msg: any,\n        ack: () => void\n      ) => {\n        if (msg.correlationId === correlationId) {\n          if (timer) {\n            clearTimeout(timer)\n          }\n          this.consumer.unRegisterHandler(replyQueue.queue)\n          ack()\n          resolve(msg)\n        }\n      }\n\n      this.consumer.registerHandler(replyQueue.queue, handler)\n\n      this.producer.publish(\n        exchange,\n        routingKey,\n        payload,\n        {\n          correlationId,\n          replyTo: replyQueue.queue\n        }\n      )\n    })\n  }\n}\n"],"names":[],"mappings":"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"}