{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,MAAwC,UACxC,OAAS,UAAAA,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBACtC,MAAsB,eAIf,MAAMC,UAA6FF,CAAwB,CACjIG,GAAW,GAEX,YACCC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,MAAMH,EAAQE,EAAWC,CAAM,EAE/B,MAAMC,EAAWC,GAChBA,EAAK,IACF,CACA,GAAGA,EACH,IAAKA,EAAK,IAAI,MAAWA,EAAK,GAC/B,EACC,OAEEC,EAASL,EAAW,OACpBM,EAAUN,EAAW,eACrBO,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGb,CAAW,IAAIY,CAAS,GAEnCE,EAAS,2BACTC,EAAY,CAAE,IAAKD,CAAO,EAEhCV,EAAO,SAAS,aAAaS,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOJ,GAA2B,CAC7G,MAAMO,EAAKP,EAAK,GAEhB,IAAIQ,EAAS,KAAK,MAAMR,EAAK,QAAU,MAAM,EACzCS,EAAQ,KAAK,MAAMT,EAAK,OAAS,MAAM,EAEvCQ,IAAQA,EAAST,EAAQS,CAAM,GAC/BC,IAAOA,EAAQV,EAAQU,CAAK,GAC5B,EAAAD,GAAQ,MAAQH,GAAUI,GAAO,MAAQJ,KAEzCE,IAAO,KAAO,KAAK,UAAU,SAAWE,EAC3C,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KACR,MAAO,KAAK,OAAOA,CAAK,CACzB,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAAUC,EAC1D,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOD,CAAM,EAC1B,MAAO,KAAK,OAAOC,CAAK,EACxB,QAASvB,EAAO,KAAKA,EAAO,KAAKsB,EAAQC,CAAK,CAAC,CAChD,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAChD,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOA,CAAM,EAC1B,MAAO,IACR,CAAC,EACH,CAAC,EAEDpB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBe,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BV,EAAO,IACpC,0BAA2BS,EAC3B,gBAAiB,cACjB,gBAAiB,aACjB,iBAAkBA,EAClB,wBAAyB,QACzB,qBAAsB,GACvB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMP,EAAW,iBAAiBU,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMN,EAAW,iBAAiBU,CAAS,EAC3ClB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8Be,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQtB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAgB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD","names":["differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err"]}