{"version":3,"sources":["../../../../src/events/types/rabbitmq.ts"],"sourcesContent":["import type { ChannelWrapper } from 'amqp-connection-manager'\nimport { connect } from 'amqp-connection-manager'\nimport type { ConfirmChannel } from 'amqplib'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { RabbitMQConfig } from '../pipes'\n\nexport class RabbitMQEventBus extends EventBus {\n\t#client: ChannelWrapper\n\t#columnName: string\n\n\tconstructor(config: RabbitMQConfig) {\n\t\tsuper()\n\t\tthis.#columnName = config.eventColumnName\n\t\tthis.#client = connect([config.uri]).createChannel({\n\t\t\tjson: false,\n\t\t\tsetup: async (channel: ConfirmChannel) => {\n\t\t\t\tawait channel.assertExchange(this.#columnName, 'direct', { durable: true })\n\t\t\t\tawait channel.prefetch(1)\n\t\t\t},\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) =>\n\t\t\t\tawait this.#client.publish(this.#columnName, topic, JSON.stringify(data), { persistent: true }),\n\t\t\tsubscribe: async (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#client.addSetup(async (channel: ConfirmChannel) => {\n\t\t\t\t\t\tconst queueName = options.fanout\n\t\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t\t: topic\n\t\t\t\t\t\tconst { queue } = await channel.assertQueue(queueName, { durable: !options.fanout, exclusive: options.fanout })\n\t\t\t\t\t\tawait channel.bindQueue(queue, this.#columnName, topic)\n\t\t\t\t\t\tchannel.consume(\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\tasync (msg) => {\n\t\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\t\tif (!msg) return\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(msg.content.toString()))\n\t\t\t\t\t\t\t\t\t\tchannel.ack(msg)\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\tchannel.nack(msg)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ noAck: false },\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n}\n"],"mappings":"AACA,SAAS,eAAe;AAGxB,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAAoC;AAGtC,MAAM,yBAAyB,SAAS;AAAA,EAC9C;AAAA,EACA;AAAA,EAEA,YAAY,QAAwB;AACnC,UAAM;AACN,SAAK,cAAc,OAAO;AAC1B,SAAK,UAAU,QAAQ,CAAC,OAAO,GAAG,CAAC,EAAE,cAAc;AAAA,MAClD,MAAM;AAAA,MACN,OAAO,OAAO,YAA4B;AACzC,cAAM,QAAQ,eAAe,KAAK,aAAa,UAAU,EAAE,SAAS,KAAK,CAAC;AAC1E,cAAM,QAAQ,SAAS,CAAC;AAAA,MACzB;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,aAAiD,WAA2B,UAAkC,CAAC,GAAG;AACjH,UAAM,QAAQ,QAAQ,YAAY,YAAY,SAAS,IAAI,EAAE,cAAc,SAAS;AACpF,WAAO;AAAA,MACN,SAAS,OAAO,SACf,MAAM,KAAK,QAAQ,QAAQ,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI,GAAG,EAAE,YAAY,KAAK,CAAC;AAAA,MAC/F,WAAW,OAAO,cAAsD;AACvE,cAAM,YAAY,YAAY;AAC7B,gBAAM,KAAK,QAAQ,SAAS,OAAO,YAA4B;AAC9D,kBAAM,YAAY,QAAQ,SACvB,SAAS,IAAI,EAAE,cAAc,GAAG,SAAS,IAAI,EAAE,EAAE,WAAW,OAAO,OAAO,EAAE,CAAC,EAAE,IAC/E;AACH,kBAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,YAAY,WAAW,EAAE,SAAS,CAAC,QAAQ,QAAQ,WAAW,QAAQ,OAAO,CAAC;AAC9G,kBAAM,QAAQ,UAAU,OAAO,KAAK,aAAa,KAAK;AACtD,oBAAQ;AAAA,cACP;AAAA,cACA,OAAO,QAAQ;AACd,sBAAM,SAAS,mBAAmB,YAAY;AAC7C,sBAAI,CAAC,IAAK;AACV,sBAAI;AACH,0BAAM,UAAU,eAAe,IAAI,QAAQ,SAAS,CAAC,CAAC;AACtD,4BAAQ,IAAI,GAAG;AAAA,kBAChB,QAAQ;AACP,4BAAQ,KAAK,GAAG;AAAA,kBACjB;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,cACA,EAAE,OAAO,MAAM;AAAA,YAChB;AAAA,UACD,CAAC;AAAA,QACF;AAEA,iBAAS,GAAG,SAAS,WAAW,CAAC;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AACD;","names":[]}