{"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,SAAS,eAAe;AAExB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAAoC;AAGtC,MAAM,sBAAsB,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAChC,UAAM;AACN,SAAK,UAAU,IAAI,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,GAAG,QAAQ,UAAU,QAAQ,SAAS,QAAQ;AAAA,IAC1D,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,SAAwB;AACvC,cAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,cAAM,SAAS,QAAQ;AACvB,cAAM,SAAS,KAAK;AAAA,UACnB;AAAA,UACA,UAAU,CAAC,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QAC3C,CAAC;AACD,eAAO;AAAA,MACR;AAAA,MACA,WAAW,CAAC,cAAsD;AACjE,cAAM,YAAY,YAAY;AAC7B,gBAAM,KAAK,aAAa,KAAK;AAC7B,gBAAM,UAAU,QAAQ,SACrB,SAAS,IAAI,EAAE,cAAc,GAAG,SAAS,IAAI,EAAE,EAAE,WAAW,OAAO,OAAO,EAAE,CAAC,EAAE,IAC/E;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAE/D,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,UAAU,EAAE,MAAM,CAAC;AAElC,gBAAM,SAAS,IAAI;AAAA,YAClB,aAAa,OAAO,EAAE,QAAQ,MAAM;AACnC,oBAAM,SAAS,mBAAmB,YAAY;AAC7C,oBAAI,CAAC,QAAQ,MAAO;AACpB,sBAAM,UAAU,eAAe,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,cACzD,CAAC,EAAE;AAAA,gBAAM,CAAC,UACT,SAAS,MAAM,IAAI,cAAc,gCAAgC,EAAE,OAAO,SAAS,QAAQ,GAAG,KAAK,CAAC;AAAA,cACrG;AAAA,YACD;AAAA,UACD,CAAC;AAED,cAAI,QAAQ;AACX,qBAAS;AAAA,cACR;AAAA,cACA,YAAY;AACX,sBAAM,SAAS,WAAW;AAC1B,sBAAM,KAAK,aAAa,OAAO;AAAA,cAChC;AAAA,cACA;AAAA,YACD;AAAA,QACF;AACA,iBAAS,GAAG,SAAS,WAAW,CAAC;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,YAAY;AACjB,QAAI,CAAC,KAAK;AACT,WAAK,UAAU,YAAY;AAC1B,cAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,cAAM,MAAM,QAAQ;AACpB,eAAO;AAAA,MACR,GAAG;AACJ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,aAAa,OAAe;AACjC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,IAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,aAAa,SAAiB;AACnC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnD;AACD;","names":[]}