{"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\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\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,iCAExB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAAoC,UAGtC,MAAMC,UAAsBD,CAAS,CAC3CE,GACAC,GACA,YAAYC,EAAqB,CAChC,MAAM,EACN,KAAKF,GAAU,IAAIP,EAAQ,MAAM,CAChC,QAAS,CAAE,GAAGS,EAAQ,SAAUT,EAAQ,SAAS,OAAQ,CAC1D,CAAC,CACF,CAEA,aAAiDU,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYR,EAAS,IAAI,EAAE,cAAcQ,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GAAwB,CACvC,MAAMC,EAAW,KAAKP,GAAQ,SAAS,EACvC,aAAMO,EAAS,QAAQ,EACvB,MAAMA,EAAS,KAAK,CACnB,MAAAF,EACA,SAAU,CAAC,CAAE,MAAO,KAAK,UAAUC,CAAI,CAAE,CAAC,CAC3C,CAAC,EACM,EACR,EACA,UAAYE,GAAsD,CACjE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKC,GAAaL,CAAK,EAC7B,MAAMM,EAAUP,EAAQ,OACrBT,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/ES,EACGO,EAAW,KAAKZ,GAAQ,SAAS,CAAE,QAAS,CAAE,QAAAW,CAAQ,CAAE,CAAC,EAE/D,MAAMC,EAAS,QAAQ,EACvB,MAAMA,EAAS,UAAU,CAAE,MAAAP,CAAM,CAAC,EAElC,MAAMO,EAAS,IAAI,CAClB,YAAa,MAAO,CAAE,QAAAC,CAAQ,IAAM,CACnC,MAAMlB,EAAS,mBAAmB,SAAY,CACxCkB,EAAQ,OACb,MAAML,EAAUX,EAAegB,EAAQ,MAAM,SAAS,CAAC,CAAC,CACzD,CAAC,EAAE,MAAOC,GACTnB,EAAS,MAAM,IAAID,EAAc,+BAAgC,CAAE,MAAAW,EAAO,QAAAM,EAAS,QAAAP,CAAQ,EAAGU,CAAK,CAAC,CACrG,CACD,CACD,CAAC,EAEGV,EAAQ,QACXT,EAAS,GACR,QACA,SAAY,CACX,MAAMiB,EAAS,WAAW,EAC1B,MAAM,KAAKG,GAAaJ,CAAO,CAChC,EACA,EACD,CACF,EACAhB,EAAS,GAAG,QAASc,EAAW,CAAC,CAClC,CACD,CACD,CAEA,KAAMO,IAAY,CACjB,OAAK,KAAKf,KACT,KAAKA,IAAU,SAAY,CAC1B,MAAMgB,EAAQ,KAAKjB,GAAQ,MAAM,EACjC,aAAMiB,EAAM,QAAQ,EACbA,CACR,GAAG,GACG,KAAKhB,EACb,CAEA,KAAMS,GAAaL,EAAe,CAEjC,MADc,MAAM,KAAKW,GAAU,GACvB,aAAa,CAAE,OAAQ,CAAC,CAAE,MAAAX,CAAM,CAAC,EAAG,QAAS,GAAK,CAAC,CAChE,CAEA,KAAMU,GAAaJ,EAAiB,CAEnC,MADc,MAAM,KAAKK,GAAU,GACvB,aAAa,CAACL,CAAO,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnD,CACD","names":["KafkaJS","EquippedError","Instance","Random","parseJSONValue","EventBus","KafkaEventBus","#client","#admin","config","topicName","options","topic","data","producer","onMessage","subscribe","#createTopic","groupId","consumer","message","error","#deleteGroup","#getAdmin","admin"]}