{"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,OAAS,WAAAA,MAAe,0BAGxB,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAAoC,UAGtC,MAAMC,UAAyBD,CAAS,CAC9CE,GACAC,GAEA,YAAYC,EAAwB,CACnC,MAAM,EACN,KAAKD,GAAcC,EAAO,gBAC1B,KAAKF,GAAUN,EAAQ,CAACQ,EAAO,GAAG,CAAC,EAAE,cAAc,CAClD,KAAM,GACN,MAAO,MAAOC,GAA4B,CACzC,MAAMA,EAAQ,eAAe,KAAKF,GAAa,SAAU,CAAE,QAAS,EAAK,CAAC,EAC1E,MAAME,EAAQ,SAAS,CAAC,CACzB,CACD,CAAC,CACF,CAEA,aAAiDC,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYT,EAAS,IAAI,EAAE,cAAcS,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GACf,MAAM,KAAKP,GAAQ,QAAQ,KAAKC,GAAaK,EAAO,KAAK,UAAUC,CAAI,EAAG,CAAE,WAAY,EAAK,CAAC,EAC/F,UAAW,MAAOC,GAAsD,CACvE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKT,GAAQ,SAAS,MAAOG,GAA4B,CAC9D,MAAMO,EAAYL,EAAQ,OACvBV,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/EU,EACG,CAAE,MAAAK,CAAM,EAAI,MAAMR,EAAQ,YAAYO,EAAW,CAAE,QAAS,CAACL,EAAQ,OAAQ,UAAWA,EAAQ,MAAO,CAAC,EAC9G,MAAMF,EAAQ,UAAUQ,EAAO,KAAKV,GAAaK,CAAK,EACtDH,EAAQ,QACPQ,EACA,MAAOC,GAAQ,CACd,MAAMjB,EAAS,mBAAmB,SAAY,CAC7C,GAAKiB,EACL,GAAI,CACH,MAAMJ,EAAUX,EAAee,EAAI,QAAQ,SAAS,CAAC,CAAC,EACtDT,EAAQ,IAAIS,CAAG,CAChB,MAAQ,CACPT,EAAQ,KAAKS,CAAG,CACjB,CACD,CAAC,CACF,EACA,CAAE,MAAO,EAAM,CAChB,CACD,CAAC,CACF,EAEAjB,EAAS,GAAG,QAASc,EAAW,CAAC,CAClC,CACD,CACD,CACD","names":["connect","Instance","Random","parseJSONValue","EventBus","RabbitMQEventBus","#client","#columnName","config","channel","topicName","options","topic","data","onMessage","subscribe","queueName","queue","msg"]}