equipped 5.0.27 → 5.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [5.0.29](https://github.com/kevinand11/equipped/compare/v5.0.28...v5.0.29) (2025-08-28)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * use snapshot mode of always ([cf3f132](https://github.com/kevinand11/equipped/commit/cf3f13204549661846fc440096f974f371269f84))
11
+
12
+ ### [5.0.28](https://github.com/kevinand11/equipped/compare/v5.0.27...v5.0.28) (2025-08-18)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * error when processing event ([12e867f](https://github.com/kevinand11/equipped/commit/12e867fbaf0bf5240d12227ffd394777f2996663))
18
+
5
19
  ### [5.0.27](https://github.com/kevinand11/equipped/compare/v5.0.26...v5.0.27) (2025-08-13)
6
20
 
7
21
 
@@ -55,7 +55,7 @@ class MongoDbChange extends _changescjs.DbChange {
55
55
  "capture.mode": "change_streams_update_full_with_pre_image",
56
56
  "mongodb.connection.string": config.uri,
57
57
  "collection.include.list": dbColName,
58
- "snapshot.mode": "when_needed"
58
+ "snapshot.mode": "always"
59
59
  });
60
60
  if (started) return { done: true, value: true };
61
61
  await collection.findOneAndUpdate(condition, { $set: { colName } }, { upsert: true });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AAAA,mtBAA6C;AAC7C,oCAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AAK/B,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,EAAK,MAAA,kBAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK,KAAG;AAAA,IACzC,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEH,IAAA;AACC,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAQ+B;AAC1B,EAAA;AACQ,IAAA;AACJ,EAAA;AACA,IAAA;AACR,EAAA;AACD;AC/BuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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})\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AAAA,mtBAA6C;AAC7C,oCAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AAK/B,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,EAAK,MAAA,kBAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK,KAAG;AAAA,IACzC,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEH,IAAA;AACC,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAQ+B;AAC1B,EAAA;AACQ,IAAA;AACJ,EAAA;AACA,IAAA;AACR,EAAA;AACD;AC/BuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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': 'always',\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _mongodb = require('mongodb');var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');class z extends _changesmincjs.DbChange{#e=!1;constructor(h,d,r,g,_){super(d,g,_);const l=e=>e._id?{...e,_id:b(_nullishCoalesce(e._id.$oid, () => (e._id)))}:void 0,C=r.dbName,f=r.collectionName,n=`${C}.${f}`,m=`${_changesmincjs.TopicPrefix}.${n}`,a=b("5f5f65717569707065645f5f"),p={_id:a};d.eventBus.createStream(m,{skipScope:!0}).subscribe(async e=>{const s=e.op;let t=JSON.parse(_nullishCoalesce(e.before, () => ("null"))),o=JSON.parse(_nullishCoalesce(e.after, () => ("null")));t&&(t=l(t)),o&&(o=l(o)),!(_optionalChain([t, 'optionalAccess', _2 => _2.__id])===a||_optionalChain([o, 'optionalAccess', _3 => _3.__id])===a)&&(s==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):s==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:_valleyed.differ.from(_valleyed.differ.diff(t,o))}):s==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),_indexmincjs3.Instance.on("start",async()=>{this.#e||(this.#e=!0,await _indexmincjs5.retry.call(void 0, async()=>await this.configureConnector(m,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":h.uri,"collection.include.list":n,"snapshot.mode":"when_needed"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:f}},{upsert:!0}),await r.findOneAndDelete(p),_indexmincjs3.Instance.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,1e4).catch(e=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Failed to start db changes",{dbColName:n},e))))},10)}}const b=i=>{try{return new (0, _mongodb.ObjectId)(i)}catch (e2){return i}};exports.MongoDbChange = z;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _mongodb = require('mongodb');var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');class z extends _changesmincjs.DbChange{#e=!1;constructor(h,d,r,g,C){super(d,g,C);const l=e=>e._id?{...e,_id:b(_nullishCoalesce(e._id.$oid, () => (e._id)))}:void 0,_=r.dbName,f=r.collectionName,n=`${_}.${f}`,m=`${_changesmincjs.TopicPrefix}.${n}`,i=b("5f5f65717569707065645f5f"),p={_id:i};d.eventBus.createStream(m,{skipScope:!0}).subscribe(async e=>{const s=e.op;let t=JSON.parse(_nullishCoalesce(e.before, () => ("null"))),o=JSON.parse(_nullishCoalesce(e.after, () => ("null")));t&&(t=l(t)),o&&(o=l(o)),!(_optionalChain([t, 'optionalAccess', _2 => _2.__id])===i||_optionalChain([o, 'optionalAccess', _3 => _3.__id])===i)&&(s==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):s==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:_valleyed.differ.from(_valleyed.differ.diff(t,o))}):s==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),_indexmincjs3.Instance.on("start",async()=>{this.#e||(this.#e=!0,await _indexmincjs5.retry.call(void 0, async()=>await this.configureConnector(m,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":h.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:f}},{upsert:!0}),await r.findOneAndDelete(p),_indexmincjs3.Instance.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,1e4).catch(e=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Failed to start db changes",{dbColName:n},e))))},10)}}const b=a=>{try{return new (0, _mongodb.ObjectId)(a)}catch (e2){return a}};exports.MongoDbChange = z;
2
2
  //# sourceMappingURL=changes.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","colName","collection","topic","dbColName","TestId"],"mappings":"AAAA,mtBAA6C,oCACtB,yDAGd,4DACa,6DACgB,wDAe9BA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACYA,CAAAA,CAAK,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,KAAQ,CACzC,CAAA,CACC,CAAA,CAAA,CAAA,CAAA,CAAA,MAEsB,CAAA,CAAA,CAAA,EAAA,CAAA,CACpBC,GAAUC,CAAW,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,GACT,CAAA,IAAS,SAAA,CAAID,CAAO,KAChCE,CAAAA,CAAQ,CAAA,KAAc,CAAA,CAAIC,CAAS,CAAA,CAAA,CAGnCC,MADQ,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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})\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","colName","collection","topic","dbColName","TestId"],"mappings":"AAAA,mtBAA6C,oCACtB,yDAGd,4DACa,6DACgB,wDAe9BA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACYA,CAAAA,CAAK,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,KAAQ,CACzC,CAAA,CACC,CAAA,CAAA,CAAA,CAAA,CAAA,MAEsB,CAAA,CAAA,CAAA,EAAA,CAAA,CACpBC,GAAUC,CAAW,CAAA,GAAA,CAAA,CAAA,GAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,GACT,CAAA,IAAS,SAAA,CAAID,CAAO,KAChCE,CAAAA,CAAQ,CAAA,KAAc,CAAA,CAAIC,CAAS,CAAA,CAAA,CAGnCC,MADQ,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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': 'always',\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);
2
2
  var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);
3
- var _indexcjs = require('../../instance/index.cjs');
4
- var _indexcjs3 = require('../../utilities/index.cjs');
3
+ var _indexcjs = require('../../errors/index.cjs');
4
+ var _indexcjs3 = require('../../instance/index.cjs');
5
+ var _indexcjs5 = require('../../utilities/index.cjs');
5
6
  var _basecjs = require('../base.cjs');
6
7
  class KafkaEventBus extends _basecjs.EventBus {
7
8
  #client;
@@ -16,7 +17,7 @@ class KafkaEventBus extends _basecjs.EventBus {
16
17
  }) : new _kafkajs2.default.Kafka({ ...kafkaSettings, logLevel: _kafkajs2.default.logLevel.NOTHING });
17
18
  }
18
19
  createStream(topicName, options = {}) {
19
- const topic = options.skipScope ? topicName : _indexcjs.Instance.get().getScopedName(topicName);
20
+ const topic = options.skipScope ? topicName : _indexcjs3.Instance.get().getScopedName(topicName);
20
21
  return {
21
22
  publish: async (data) => {
22
23
  try {
@@ -34,20 +35,22 @@ class KafkaEventBus extends _basecjs.EventBus {
34
35
  subscribe: (onMessage) => {
35
36
  const subscribe = async () => {
36
37
  await this.#createTopic(topic);
37
- const groupId = options.fanout ? _indexcjs.Instance.get().getScopedName(`${_indexcjs.Instance.get().id}-fanout-${_indexcjs3.Random.string(10)}`) : topic;
38
+ const groupId = options.fanout ? _indexcjs3.Instance.get().getScopedName(`${_indexcjs3.Instance.get().id}-fanout-${_indexcjs5.Random.string(10)}`) : topic;
38
39
  const consumer = this.#client.consumer(this.#confluent ? { kafkaJS: { groupId } } : { groupId });
39
40
  await consumer.connect();
40
41
  await consumer.subscribe({ topic });
41
42
  await consumer.run({
42
43
  eachMessage: async ({ message }) => {
43
- _indexcjs.Instance.resolveBeforeCrash(async () => {
44
+ await _indexcjs3.Instance.resolveBeforeCrash(async () => {
44
45
  if (!message.value) return;
45
- await onMessage(_indexcjs3.parseJSONValue.call(void 0, message.value.toString()));
46
- });
46
+ await onMessage(_indexcjs5.parseJSONValue.call(void 0, message.value.toString()));
47
+ }).catch(
48
+ (error) => _indexcjs3.Instance.crash(new (0, _indexcjs.EquippedError)("Error processing kafka event", { topic, groupId, options }, error))
49
+ );
47
50
  }
48
51
  });
49
52
  if (options.fanout)
50
- _indexcjs.Instance.on(
53
+ _indexcjs3.Instance.on(
51
54
  "close",
52
55
  async () => {
53
56
  await consumer.disconnect();
@@ -56,7 +59,7 @@ class KafkaEventBus extends _basecjs.EventBus {
56
59
  10
57
60
  );
58
61
  };
59
- _indexcjs.Instance.on("start", subscribe, 2);
62
+ _indexcjs3.Instance.on("start", subscribe, 2);
60
63
  }
61
64
  };
62
65
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs"],"names":[],"mappings":"AAAA,4SAAsB;AACtB,oFAAkB;AAElB,oDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,cAAA,QAAsB,kBAAS;AAAA,EAC3C,CAAA,MAAA;AAAA,EACA,CAAA,SAAA;AAAA,EACA,CAAA,KAAA;AAAA,EACA,WAAA,CAAY,MAAA,EAAqB;AAChC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,GAAG,cAAc,EAAA,EAAI,MAAA;AAChD,IAAA,IAAA,CAAK,CAAA,UAAA,EAAa,SAAA;AAClB,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,EACZ,IAAI,yBAAA,CAAU,OAAA,CAAQ,KAAA,CAAM;AAAA,MAC5B,OAAA,EAAS,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,yBAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,QAAQ;AAAA,IAC3E,CAAC,EAAA,EACA,IAAI,iBAAA,CAAM,KAAA,CAAM,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,iBAAA,CAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GAAwB;AACvC,QAAA,IAAI;AACH,UAAA,MAAM,SAAA,EAAW,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,CAAA;AACvC,UAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAA;AACvB,UAAA,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,YACnB,KAAA;AAAA,YACA,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACR,EAAA,UAAQ;AACP,UAAA,OAAO,KAAA;AAAA,QACR;AAAA,MACD,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,SAAA,EAAA,GAAsD;AACjE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,WAAA,CAAa,KAAK,CAAA;AAC7B,UAAA,MAAM,QAAA,EAAU,OAAA,CAAQ,OAAA,EACrB,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAE4B,UAAA;AAErC,UAAA;AACW,UAAA;AAEf,UAAA;AACkB,YAAA;AACK,cAAA;AACnB,gBAAA;AACoC,gBAAA;AACxD,cAAA;AACF,YAAA;AACA,UAAA;AAEW,UAAA;AACF,YAAA;AACR,cAAA;AACY,cAAA;AACe,gBAAA;AACK,gBAAA;AAChC,cAAA;AACA,cAAA;AACD,YAAA;AACF,QAAA;AACiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AAEkB,EAAA;AACC,IAAA;AACgB,MAAA;AACP,MAAA;AAC3B,IAAA;AACY,IAAA;AACb,EAAA;AAEkC,EAAA;AACE,IAAA;AAC4B,IAAA;AAChE,EAAA;AAEoC,EAAA;AACA,IAAA;AACa,IAAA;AAAE,IAAA;AACnD,EAAA;AACD;ACbyE;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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\tInstance.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})\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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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",null]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs"],"names":[],"mappings":"AAAA,4SAAsB;AACtB,oFAAkB;AAElB,kDAA8B;AAC9B,qDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,cAAA,QAAsB,kBAAS;AAAA,EAC3C,CAAA,MAAA;AAAA,EACA,CAAA,SAAA;AAAA,EACA,CAAA,KAAA;AAAA,EACA,WAAA,CAAY,MAAA,EAAqB;AAChC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,GAAG,cAAc,EAAA,EAAI,MAAA;AAChD,IAAA,IAAA,CAAK,CAAA,UAAA,EAAa,SAAA;AAClB,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,EACZ,IAAI,yBAAA,CAAU,OAAA,CAAQ,KAAA,CAAM;AAAA,MAC5B,OAAA,EAAS,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,yBAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,QAAQ;AAAA,IAC3E,CAAC,EAAA,EACA,IAAI,iBAAA,CAAM,KAAA,CAAM,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,iBAAA,CAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GAAwB;AACvC,QAAA,IAAI;AACH,UAAA,MAAM,SAAA,EAAW,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,CAAA;AACvC,UAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAA;AACvB,UAAA,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,YACnB,KAAA;AAAA,YACA,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACR,EAAA,UAAQ;AACP,UAAA,OAAO,KAAA;AAAA,QACR;AAAA,MACD,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,SAAA,EAAA,GAAsD;AACjE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,WAAA,CAAa,KAAK,CAAA;AAC7B,UAAA,MAAM,QAAA,EAAU,OAAA,CAAQ,OAAA,EACrB,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAE4B,UAAA;AAErC,UAAA;AACW,UAAA;AAEf,UAAA;AACkB,YAAA;AACW,cAAA;AACzB,gBAAA;AACoC,gBAAA;AACtD,cAAA;AAC+B,gBAAA;AAClC,cAAA;AACD,YAAA;AACA,UAAA;AAEW,UAAA;AACF,YAAA;AACR,cAAA;AACY,cAAA;AACe,gBAAA;AACK,gBAAA;AAChC,cAAA;AACA,cAAA;AACD,YAAA;AACF,QAAA;AACiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AAEkB,EAAA;AACC,IAAA;AACgB,MAAA;AACP,MAAA;AAC3B,IAAA;AACY,IAAA;AACb,EAAA;AAEkC,EAAA;AACE,IAAA;AAC4B,IAAA;AAChE,EAAA;AAEoC,EAAA;AACA,IAAA;AACa,IAAA;AAAE,IAAA;AACnD,EAAA;AACD;ACbyE;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class E extends _basemincjs.EventBus{#t;#e;#a;constructor(t){super();const{confluent:a=!1,...e}=t;this.#e=a,this.#t=a?new _kafkajavascript2.default.KafkaJS.Kafka({kafkaJS:{...e,logLevel:_kafkajavascript2.default.KafkaJS.logLevel.NOTHING}}):new _kafkajs2.default.Kafka({...e,logLevel:_kafkajs2.default.logLevel.NOTHING})}createStream(t,a={}){const e=a.skipScope?t:_indexmincjs.Instance.get().getScopedName(t);return{publish:async o=>{try{const s=this.#t.producer();return await s.connect(),await s.send({topic:e,messages:[{value:JSON.stringify(o)}]}),!0}catch (e2){return!1}},subscribe:o=>{const s=async()=>{await this.#s(e);const r=a.fanout?_indexmincjs.Instance.get().getScopedName(`${_indexmincjs.Instance.get().id}-fanout-${_indexmincjs3.Random.string(10)}`):e,i=this.#t.consumer(this.#e?{kafkaJS:{groupId:r}}:{groupId:r});await i.connect(),await i.subscribe({topic:e}),await i.run({eachMessage:async({message:c})=>{_indexmincjs.Instance.resolveBeforeCrash(async()=>{c.value&&await o(_indexmincjs3.parseJSONValue.call(void 0, c.value.toString()))})}}),a.fanout&&_indexmincjs.Instance.on("close",async()=>{await i.disconnect(),await this.#i(r)},10)};_indexmincjs.Instance.on("start",s,2)}}}async#n(){return this.#a||(this.#a=this.#t.admin(),await this.#a.connect()),this.#a}async#s(t){await(await this.#n()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#n()).deleteGroups([t]).catch(()=>{})}}exports.KafkaEventBus = E;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class N extends _basemincjs.EventBus{#a;#e;#t;constructor(t){super();const{confluent:a=!1,...e}=t;this.#e=a,this.#a=a?new _kafkajavascript2.default.KafkaJS.Kafka({kafkaJS:{...e,logLevel:_kafkajavascript2.default.KafkaJS.logLevel.NOTHING}}):new _kafkajs2.default.Kafka({...e,logLevel:_kafkajs2.default.logLevel.NOTHING})}createStream(t,a={}){const e=a.skipScope?t:_indexmincjs3.Instance.get().getScopedName(t);return{publish:async r=>{try{const s=this.#a.producer();return await s.connect(),await s.send({topic:e,messages:[{value:JSON.stringify(r)}]}),!0}catch (e2){return!1}},subscribe:r=>{const s=async()=>{await this.#s(e);const i=a.fanout?_indexmincjs3.Instance.get().getScopedName(`${_indexmincjs3.Instance.get().id}-fanout-${_indexmincjs5.Random.string(10)}`):e,o=this.#a.consumer(this.#e?{kafkaJS:{groupId:i}}:{groupId:i});await o.connect(),await o.subscribe({topic:e}),await o.run({eachMessage:async({message:c})=>{await _indexmincjs3.Instance.resolveBeforeCrash(async()=>{c.value&&await r(_indexmincjs5.parseJSONValue.call(void 0, c.value.toString()))}).catch(m=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Error processing kafka event",{topic:e,groupId:i,options:a},m)))}}),a.fanout&&_indexmincjs3.Instance.on("close",async()=>{await o.disconnect(),await this.#i(i)},10)};_indexmincjs3.Instance.on("start",s,2)}}}async#n(){return this.#t||(this.#t=this.#a.admin(),await this.#t.connect()),this.#t}async#s(t){await(await this.#n()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#n()).deleteGroups([t]).catch(()=>{})}}exports.KafkaEventBus = N;
2
2
  //# sourceMappingURL=kafka.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["confluent","config","#confluent","#client","Confluent","kafkaSettings","Kafka","topic","options","data","producer","onMessage","subscribe","Instance","Random"],"mappings":"AAAA,4SAAsB,oFACJ,2DAIT,6DAC+B,6CAOvC,MACC,EAAA,QACM,oBAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAA,WAAwCC,CAAAA,CAChD,CAAA,CAAA,KAAKC,CAAaF,CAAAA,CAClB,KAAKG,CAAAA,SACEC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,IACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAKC,CAAAA,CAAe,CAAA,CAAA,CAAA,CAAA,IAAA,yBAAUD,CAAAA,OAAU,CAAA,KAAQ,CAAA,CAAA,OAAS,CAAA,CAAA,GAClE,CAAA,CACA,QAAU,CAAA,yBAAA,CAAA,OAA0B,CAAA,QAAUE,CAAAA,OAAM,CAAA,CAAA,CAAS,CAAA,IAAA,iBAAA,CAAQ,KAGzE,CAAA,CAAA,GAAA,CAAA,CAAA,QAA8G,CAAC,iBAAA,CAAG,QAC3GC,CAAQC,OAAQ,CAAA,CAAA,CAAA,YAAuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CACpF,CAAA,CAAA,SACC,CAAA,CAAA,CAAA,qBAAS,CAAA,GAAA,CAAA,CAAOC,CAAAA,aAERC,CAAAA,CAAW,CAAA,CAAA,MAAa,CAAA,OAAA,CAAS,MACvC,CAAA,EAAA,CAAA,GAAA,CAAA,MAAe,CAAA,CAAA,IAAQ,CACvB,CAAA,CAAA,CAAA,QAAe,CAAA,CAAK,CACnB,OAAAH,MACA,CAAA,CAAA,OAAa,CAAA,CAAA,CAAO,MAAK,CAAA,CAAA,IAAA,CAAA,CAAA,KAC1B,CAAC,CAAA,CACM,QACA,CACP,CAAA,CAAA,KAAO,CACR,IAED,CAAA,SAAYI,CAAAA,CAAsD,CACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,CAAAA,CAAY,UAAA,CAAA,MACjB,CAAA,CAAA,CAAA,CAAM,CAAA,SAAuB,CAC7B,CAAA,EAAA,CAAA,MAAwB,CAAA,CAAA,KACrBC,CAAAA,CAAS,EAAA,CAAA,MAAM,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,MAAY,CAAA,CAAA,CAAI,CAAA,MAAI,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAWC,CAAAA,aAAmB,CAAA,CAC/EP,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.min.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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\tInstance.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})\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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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"]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["KafkaEventBus","kafkaSettings","config","#client","Confluent","Instance","producer","data","onMessage","#createTopic","Random","topic"],"mappings":"AAAA,4SAAsB,oFACJ,yDAGT,4DAEQ,6DAIJA,6CAMX,MAAQ,EAAA,QAAY,oBAAO,CAAA,CAAA,CAAGC,CAAc,CAAA,CAAIC,CAAAA,CAChD,CAAA,CAAA,WACA,CAAA,CAAKC,CAAAA,CAAAA,KACF,CAAA,CAAIC,CAAAA,KAAU,CAAA,SAAc,CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,GAAS,CAAE,CAAA,CAAA,CAAGH,CAAAA,IAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAUG,IAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAA,yBAAA,CAAA,OAAS,CAAA,KAClE,CACA,CAAA,OAAU,CAAA,CAAA,GAAQ,CAAA,CAAA,QAAkB,CAAA,yBAAA,CAAA,OAAgB,CAAA,QAAS,CAAA,OAGjE,CAAA,CAAA,CAAA,CAAA,IAAA,iBAAA,CAAA,KAA8G,CAAC,CAAA,GAC9G,CAAA,CAAA,QAAsB,CAAA,iBAAA,CAAA,QAAwBC,CAAAA,OAAe,CAAA,CAAA,CAAA,YAAuB,CAAA,CACpF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CACN,MAAA,CAAA,CAAS,CAAA,CAAA,SACR,CAAA,CAAI,CACH,sBAAA,CAAA,GAAA,CAAMC,CAAAA,CAAW,aAAa,CAAA,CAAA,CAAA,CAAS,MACvC,CAAA,OAAA,CAAMA,MAAS,CAAA,EAAA,CAAQ,GACvB,CAAA,MAAe,CAAA,CAAA,IACd,CAAA,CAAA,CAAA,CAAA,QACA,CAAA,CAAA,CAAA,OAAa,MAAO,CAAA,CAAK,OAAA,CAAA,CAAA,CAAUC,MACnC,CACM,CAAA,IACR,CAAA,CAAA,KACC,CAAA,CAAA,CAAO,QAGT,CAAA,CAAA,CAAA,KAAYC,CAAAA,IACX,CAAA,SAAkB,CAAA,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,UAAM,CAAKC,MACX,CAAA,CAAA,CAAA,CAAA,CAAA,SAAwB,CAAA,CAAA,EACrBJ,CAAS,MAAM,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,MAAiBA,IAAS,CAAI,CAAA,CAAE,CAAA,CAAE,CAAA,CAAA,MAAA,CAAA,CAAA,CAAWK,CAAAA,MAAO,CAAA,sBAAO,CAAA,GAAG,CAAE,CAAA,CAC/EC,aAC2B,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.min.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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"]}
@@ -29,7 +29,7 @@ class RabbitMQEventBus extends _basecjs.EventBus {
29
29
  channel.consume(
30
30
  queue,
31
31
  async (msg) => {
32
- _indexcjs.Instance.resolveBeforeCrash(async () => {
32
+ await _indexcjs.Instance.resolveBeforeCrash(async () => {
33
33
  if (!msg) return;
34
34
  try {
35
35
  await onMessage(_indexcjs3.parseJSONValue.call(void 0, msg.content.toString()));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/rabbitmq.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs"],"names":[],"mappings":"AACA,yIAAwB;AAGxB,oDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,iBAAA,QAAyB,kBAAS;AAAA,EAC9C,CAAA,MAAA;AAAA,EACA,CAAA,UAAA;AAAA,EAEA,WAAA,CAAY,MAAA,EAAwB;AACnC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,eAAA;AAC1B,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,4CAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,MAClD,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,MAAA,CAAO,OAAA,EAAA,GAA4B;AACzC,QAAA,MAAM,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,EAAU,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AAC1E,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAAA,MACzB;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GACf,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,MAC/F,SAAA,EAAW,MAAA,CAAO,SAAA,EAAA,GAAsD;AACvE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,OAAA,EAAA,GAA4B;AAC9D,YAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,OAAA,EACvB,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAEyB,YAAA;AACH,YAAA;AAC9C,YAAA;AACP,cAAA;AACe,cAAA;AAC0B,gBAAA;AAC7B,kBAAA;AACN,kBAAA;AACmD,oBAAA;AACvC,oBAAA;AACR,kBAAA;AACS,oBAAA;AACjB,kBAAA;AACA,gBAAA;AACF,cAAA;AACe,cAAA;AAChB,YAAA;AACA,UAAA;AACF,QAAA;AAEiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACX6E;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs","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, StreamOptions } from '../base'\nimport { 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\tInstance.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",null]}
1
+ {"version":3,"sources":["../../../../src/events/types/rabbitmq.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs"],"names":[],"mappings":"AACA,yIAAwB;AAGxB,oDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,iBAAA,QAAyB,kBAAS;AAAA,EAC9C,CAAA,MAAA;AAAA,EACA,CAAA,UAAA;AAAA,EAEA,WAAA,CAAY,MAAA,EAAwB;AACnC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,eAAA;AAC1B,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,4CAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,MAClD,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,MAAA,CAAO,OAAA,EAAA,GAA4B;AACzC,QAAA,MAAM,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,EAAU,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AAC1E,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAAA,MACzB;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GACf,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,MAC/F,SAAA,EAAW,MAAA,CAAO,SAAA,EAAA,GAAsD;AACvE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,OAAA,EAAA,GAA4B;AAC9D,YAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,OAAA,EACvB,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAEyB,YAAA;AACH,YAAA;AAC9C,YAAA;AACP,cAAA;AACe,cAAA;AACgC,gBAAA;AACnC,kBAAA;AACN,kBAAA;AACmD,oBAAA;AACvC,oBAAA;AACR,kBAAA;AACS,oBAAA;AACjB,kBAAA;AACA,gBAAA;AACF,cAAA;AACe,cAAA;AAChB,YAAA;AACA,UAAA;AACF,QAAA;AAEiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACX6E;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs","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, StreamOptions } from '../base'\nimport { 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",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _amqpconnectionmanager = require('amqp-connection-manager');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class g extends _basemincjs.EventBus{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=_amqpconnectionmanager.connect.call(void 0, [e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:_indexmincjs.Instance.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?_indexmincjs.Instance.get().getScopedName(`${_indexmincjs.Instance.get().id}-fanout-${_indexmincjs3.Random.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{_indexmincjs.Instance.resolveBeforeCrash(async()=>{if(r)try{await i(_indexmincjs3.parseJSONValue.call(void 0, r.content.toString())),a.ack(r)}catch (e2){a.nack(r)}})},{noAck:!1})})};_indexmincjs.Instance.on("start",c,2)}}}}exports.RabbitMQEventBus = g;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _amqpconnectionmanager = require('amqp-connection-manager');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class g extends _basemincjs.EventBus{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=_amqpconnectionmanager.connect.call(void 0, [e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:_indexmincjs.Instance.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?_indexmincjs.Instance.get().getScopedName(`${_indexmincjs.Instance.get().id}-fanout-${_indexmincjs3.Random.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{await _indexmincjs.Instance.resolveBeforeCrash(async()=>{if(r)try{await i(_indexmincjs3.parseJSONValue.call(void 0, r.content.toString())),a.ack(r)}catch (e2){a.nack(r)}})},{noAck:!1})})};_indexmincjs.Instance.on("start",c,2)}}}}exports.RabbitMQEventBus = g;
2
2
  //# sourceMappingURL=rabbitmq.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/rabbitmq.ts"],"names":["config","#client","channel","#columnName","topicName","options","data","topic","onMessage","queueName","Instance","Random"],"mappings":"AACA,yIAAwB,2DAKf,6DAC+B,6CAOH,MAC7B,EACN,QAAmBA,oBAAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAC1B,CAAA,CAAA,CAAA,CAAKC,KAAkB,CAACD,CAAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,eACpC,CAAM,IACN,CAAA,CAAA,CAAA,CAAA,4CAAO,CAAA,CAAA,CAAA,GAAOE,CAAAA,CAA4B,CACzC,aAAc,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAe,KAAKC,CAAAA,MAAa,CAAA,EAAA,CAAA,MAAY,CAAA,CAAA,cACrDD,CAAQ,IAAA,CAAA,CAAA,CAAA,CAAA,QAKjB,CAAA,CAAA,OAAA,CAAA,CAAA,CAAiDE,CAAAA,CAA2BC,CAAAA,MAC3E,CAAA,CAAA,QAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CACpF,CAAA,CAAA,SACC,CAAA,CAAA,CAAA,qBAAS,CAAA,GAAA,CAAA,CAAOC,CAAAA,aACJL,CAAAA,CAAAA,CAAQ,CAAA,MAAA,CAAQ,OAAKE,CAAaI,MAAO,CAAK,EAAA,MAAA,IAAc,CAAG,CAAE,CAAA,CAAA,OAAA,CAAA,IAAkB,CAAA,CAC/F,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,SAAkBC,CAAsD,CACvE,CAAA,CAAA,CAAA,UAAkB,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,SAAM,CAAKP,MAAQ,CAAA,EAAA,CAAA,MAAS,CAAA,CAAOC,KAClC,CAAA,CAAA,EAAA,CAAMO,MAAoB,IAAA,CACvBC,CAAAA,CAAS,CAAA,QAAM,CAAA,MAAA,CAAA,EAAA,CAAc,MAAY,CAAA,CAAA,CAAI,CAAA,MAAI,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAWC,CAAAA,aAAmB,CAAA,CAC/EJ,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.min.cjs","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, StreamOptions } from '../base'\nimport { 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\tInstance.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"]}
1
+ {"version":3,"sources":["../../../../src/events/types/rabbitmq.ts"],"names":["config","#client","channel","#columnName","topicName","options","data","topic","onMessage","queueName","Instance","Random"],"mappings":"AACA,yIAAwB,2DAKf,6DAC+B,6CAOH,MAC7B,EACN,QAAmBA,oBAAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAC1B,CAAA,CAAA,CAAA,CAAKC,KAAkB,CAACD,CAAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,eACpC,CAAM,IACN,CAAA,CAAA,CAAA,CAAA,4CAAO,CAAA,CAAA,CAAA,GAAOE,CAAAA,CAA4B,CACzC,aAAc,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAe,KAAKC,CAAAA,MAAa,CAAA,EAAA,CAAA,MAAY,CAAA,CAAA,cACrDD,CAAQ,IAAA,CAAA,CAAA,CAAA,CAAA,QAKjB,CAAA,CAAA,OAAA,CAAA,CAAA,CAAiDE,CAAAA,CAA2BC,CAAAA,MAC3E,CAAA,CAAA,QAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CACpF,CAAA,CAAA,SACC,CAAA,CAAA,CAAA,qBAAS,CAAA,GAAA,CAAA,CAAOC,CAAAA,aACJL,CAAAA,CAAAA,CAAQ,CAAA,MAAA,CAAQ,OAAKE,CAAaI,MAAO,CAAK,EAAA,MAAA,IAAc,CAAG,CAAE,CAAA,CAAA,OAAA,CAAA,IAAkB,CAAA,CAC/F,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,SAAkBC,CAAsD,CACvE,CAAA,CAAA,CAAA,UAAkB,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,SAAM,CAAKP,MAAQ,CAAA,EAAA,CAAA,MAAS,CAAA,CAAOC,KAClC,CAAA,CAAA,EAAA,CAAMO,MAAoB,IAAA,CACvBC,CAAAA,CAAS,CAAA,QAAM,CAAA,MAAA,CAAA,EAAA,CAAc,MAAY,CAAA,CAAA,CAAI,CAAA,MAAI,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAWC,CAAAA,aAAmB,CAAA,CAC/EJ,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.min.cjs","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, StreamOptions } from '../base'\nimport { 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"]}
@@ -1,2 +1,2 @@
1
- import{ObjectId as y}from"mongodb";import{differ as u}from"valleyed";import{EquippedError as D}from "../../errors/index.min.mjs";import{Instance as c}from "../../instance/index.min.mjs";import{retry as w}from "../../utilities/index.min.mjs";import{DbChange as M,TopicPrefix as k}from "../base/changes.min.mjs";class z extends M{#e=!1;constructor(h,d,r,g,_){super(d,g,_);const l=e=>e._id?{...e,_id:b(e._id.$oid??e._id)}:void 0,C=r.dbName,f=r.collectionName,n=`${C}.${f}`,m=`${k}.${n}`,a=b("5f5f65717569707065645f5f"),p={_id:a};d.eventBus.createStream(m,{skipScope:!0}).subscribe(async e=>{const s=e.op;let t=JSON.parse(e.before??"null"),o=JSON.parse(e.after??"null");t&&(t=l(t)),o&&(o=l(o)),!(t?.__id===a||o?.__id===a)&&(s==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):s==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:u.from(u.diff(t,o))}):s==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),c.on("start",async()=>{this.#e||(this.#e=!0,await w(async()=>await this.configureConnector(m,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":h.uri,"collection.include.list":n,"snapshot.mode":"when_needed"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:f}},{upsert:!0}),await r.findOneAndDelete(p),c.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,1e4).catch(e=>c.crash(new D("Failed to start db changes",{dbColName:n},e))))},10)}}const b=i=>{try{return new y(i)}catch{return i}};export{z as MongoDbChange};
1
+ import{ObjectId as y}from"mongodb";import{differ as u}from"valleyed";import{EquippedError as D}from "../../errors/index.min.mjs";import{Instance as c}from "../../instance/index.min.mjs";import{retry as w}from "../../utilities/index.min.mjs";import{DbChange as M,TopicPrefix as k}from "../base/changes.min.mjs";class z extends M{#e=!1;constructor(h,d,r,g,C){super(d,g,C);const l=e=>e._id?{...e,_id:b(e._id.$oid??e._id)}:void 0,_=r.dbName,f=r.collectionName,n=`${_}.${f}`,m=`${k}.${n}`,i=b("5f5f65717569707065645f5f"),p={_id:i};d.eventBus.createStream(m,{skipScope:!0}).subscribe(async e=>{const s=e.op;let t=JSON.parse(e.before??"null"),o=JSON.parse(e.after??"null");t&&(t=l(t)),o&&(o=l(o)),!(t?.__id===i||o?.__id===i)&&(s==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):s==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:u.from(u.diff(t,o))}):s==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),c.on("start",async()=>{this.#e||(this.#e=!0,await w(async()=>await this.configureConnector(m,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":h.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:f}},{upsert:!0}),await r.findOneAndDelete(p),c.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,1e4).catch(e=>c.crash(new D("Failed to start db changes",{dbColName:n},e))))},10)}}const b=a=>{try{return new y(a)}catch{return a}};export{z as MongoDbChange};
2
2
  //# sourceMappingURL=changes.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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})\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"],"mappings":"AAAA,OAA6B,YAAAA,MAAgB,UAC7C,OAAS,UAAAC,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBAK/B,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,IAAKC,EAAOD,EAAK,IAAI,MAAWA,EAAK,GAAG,CACzC,EACC,OAEEE,EAASN,EAAW,OACpBO,EAAUP,EAAW,eACrBQ,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGd,CAAW,IAAIa,CAAS,GAGnCE,EAASL,EADD,0BACa,EACrBM,EAAY,CAAE,IAAKD,CAAO,EAEhCX,EAAO,SAAS,aAAaU,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOL,GAA2B,CAC7G,MAAMQ,EAAKR,EAAK,GAEhB,IAAIS,EAAS,KAAK,MAAMT,EAAK,QAAU,MAAM,EACzCU,EAAQ,KAAK,MAAMV,EAAK,OAAS,MAAM,EAEvCS,IAAQA,EAASV,EAAQU,CAAM,GAC/BC,IAAOA,EAAQX,EAAQW,CAAK,GAC5B,EAAAD,GAAQ,OAASH,GAAUI,GAAO,OAASJ,KAE3CE,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,QAASxB,EAAO,KAAKA,EAAO,KAAKuB,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,EAEDrB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBgB,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BX,EAAO,IACpC,0BAA2BU,EAC3B,gBAAiB,aAClB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMR,EAAW,iBAAiBW,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMP,EAAW,iBAAiBW,CAAS,EAC3CnB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8BgB,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQvB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAiB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD,CAQA,MAAMV,EAAUW,GAAe,CAC9B,GAAI,CACH,OAAO,IAAI3B,EAAS2B,CAAE,CACvB,MAAQ,CACP,OAAOA,CACR,CACD","names":["ObjectId","differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","makeId","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err","id"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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': 'always',\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"],"mappings":"AAAA,OAA6B,YAAAA,MAAgB,UAC7C,OAAS,UAAAC,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBAK/B,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,IAAKC,EAAOD,EAAK,IAAI,MAAWA,EAAK,GAAG,CACzC,EACC,OAEEE,EAASN,EAAW,OACpBO,EAAUP,EAAW,eACrBQ,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGd,CAAW,IAAIa,CAAS,GAGnCE,EAASL,EADD,0BACa,EACrBM,EAAY,CAAE,IAAKD,CAAO,EAEhCX,EAAO,SAAS,aAAaU,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOL,GAA2B,CAC7G,MAAMQ,EAAKR,EAAK,GAEhB,IAAIS,EAAS,KAAK,MAAMT,EAAK,QAAU,MAAM,EACzCU,EAAQ,KAAK,MAAMV,EAAK,OAAS,MAAM,EAEvCS,IAAQA,EAASV,EAAQU,CAAM,GAC/BC,IAAOA,EAAQX,EAAQW,CAAK,GAC5B,EAAAD,GAAQ,OAASH,GAAUI,GAAO,OAASJ,KAE3CE,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,QAASxB,EAAO,KAAKA,EAAO,KAAKuB,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,EAEDrB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBgB,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BX,EAAO,IACpC,0BAA2BU,EAC3B,gBAAiB,QAClB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMR,EAAW,iBAAiBW,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMP,EAAW,iBAAiBW,CAAS,EAC3CnB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8BgB,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQvB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAiB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD,CAQA,MAAMV,EAAUW,GAAe,CAC9B,GAAI,CACH,OAAO,IAAI3B,EAAS2B,CAAE,CACvB,MAAQ,CACP,OAAOA,CACR,CACD","names":["ObjectId","differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","makeId","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err","id"]}
@@ -55,7 +55,7 @@ class MongoDbChange extends DbChange {
55
55
  "capture.mode": "change_streams_update_full_with_pre_image",
56
56
  "mongodb.connection.string": config.uri,
57
57
  "collection.include.list": dbColName,
58
- "snapshot.mode": "when_needed"
58
+ "snapshot.mode": "always"
59
59
  });
60
60
  if (started) return { done: true, value: true };
61
61
  await collection.findOneAndUpdate(condition, { $set: { colName } }, { upsert: true });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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})\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"],"mappings":"AAAA,SAA6B,gBAAgB;AAC7C,SAAS,cAAc;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,mBAAmB;AAK/B,MAAM,sBAA6F,SAAwB;AAAA,EACjI,WAAW;AAAA,EAEX,YACC,QACA,QACA,YACA,WACA,QACC;AACD,UAAM,QAAQ,WAAW,MAAM;AAE/B,UAAM,UAAU,CAAC,SAChB,KAAK,MACF;AAAA,MACA,GAAG;AAAA,MACH,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,KAAK,GAAG;AAAA,IACzC,IACC;AAEJ,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAU,WAAW;AAC3B,UAAM,YAAY,GAAG,MAAM,IAAI,OAAO;AACtC,UAAM,QAAQ,GAAG,WAAW,IAAI,SAAS;AAEzC,UAAM,QAAQ;AACd,UAAM,SAAS,OAAO,KAAK;AAC3B,UAAM,YAAY,EAAE,KAAK,OAAO;AAEhC,WAAO,SAAS,aAAa,OAAgB,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,OAAO,SAA2B;AAC7G,YAAM,KAAK,KAAK;AAEhB,UAAI,SAAS,KAAK,MAAM,KAAK,UAAU,MAAM;AAC7C,UAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM;AAE3C,UAAI,OAAQ,UAAS,QAAQ,MAAM;AACnC,UAAI,MAAO,SAAQ,QAAQ,KAAK;AAChC,UAAI,QAAQ,SAAS,UAAU,OAAO,SAAS,OAAQ;AAEvD,UAAI,OAAO,OAAO,KAAK,UAAU,WAAW;AAC3C,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ;AAAA,UACR,OAAO,KAAK,OAAO,KAAK;AAAA,QACzB,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW,UAAU;AAC1D,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO,KAAK,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,QAChD,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW;AAChD,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR,CAAC;AAAA,IACH,CAAC;AAED,aAAS;AAAA,MACR;AAAA,MACA,YAAY;AACX,YAAI,KAAK,SAAU;AACnB,aAAK,WAAW;AAEhB,cAAM;AAAA,UACL,YAAY;AACX,kBAAM,UAAU,MAAM,KAAK,mBAAmB,OAAO;AAAA,cACpD,mBAAmB;AAAA,cACnB,gBAAgB;AAAA,cAChB,6BAA6B,OAAO;AAAA,cACpC,2BAA2B;AAAA,cAC3B,iBAAiB;AAAA,YAClB,CAAC;AAED,gBAAI,QAAS,QAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAC9C,kBAAM,WAAW,iBAAiB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAS,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC3F,kBAAM,WAAW,iBAAiB,SAAS;AAC3C,qBAAS,IAAI,EAAE,IAAI,KAAK,8BAA8B,SAAS,cAAc;AAC7E,mBAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACD,EAAE,MAAM,CAAC,QAAQ,SAAS,MAAM,IAAI,cAAc,8BAA8B,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,MACrG;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAQA,MAAM,SAAS,CAAC,OAAe;AAC9B,MAAI;AACH,WAAO,IAAI,SAAS,EAAE;AAAA,EACvB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter, ObjectId } 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 { DbChangeConfig } from '../base/types'\nimport { 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: makeId(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 hexId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst TestId = makeId(hexId)\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': 'always',\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\t10_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\nconst makeId = (id: string) => {\n\ttry {\n\t\treturn new ObjectId(id)\n\t} catch {\n\t\treturn id\n\t}\n}\n"],"mappings":"AAAA,SAA6B,gBAAgB;AAC7C,SAAS,cAAc;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,mBAAmB;AAK/B,MAAM,sBAA6F,SAAwB;AAAA,EACjI,WAAW;AAAA,EAEX,YACC,QACA,QACA,YACA,WACA,QACC;AACD,UAAM,QAAQ,WAAW,MAAM;AAE/B,UAAM,UAAU,CAAC,SAChB,KAAK,MACF;AAAA,MACA,GAAG;AAAA,MACH,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,KAAK,GAAG;AAAA,IACzC,IACC;AAEJ,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAU,WAAW;AAC3B,UAAM,YAAY,GAAG,MAAM,IAAI,OAAO;AACtC,UAAM,QAAQ,GAAG,WAAW,IAAI,SAAS;AAEzC,UAAM,QAAQ;AACd,UAAM,SAAS,OAAO,KAAK;AAC3B,UAAM,YAAY,EAAE,KAAK,OAAO;AAEhC,WAAO,SAAS,aAAa,OAAgB,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,OAAO,SAA2B;AAC7G,YAAM,KAAK,KAAK;AAEhB,UAAI,SAAS,KAAK,MAAM,KAAK,UAAU,MAAM;AAC7C,UAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM;AAE3C,UAAI,OAAQ,UAAS,QAAQ,MAAM;AACnC,UAAI,MAAO,SAAQ,QAAQ,KAAK;AAChC,UAAI,QAAQ,SAAS,UAAU,OAAO,SAAS,OAAQ;AAEvD,UAAI,OAAO,OAAO,KAAK,UAAU,WAAW;AAC3C,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ;AAAA,UACR,OAAO,KAAK,OAAO,KAAK;AAAA,QACzB,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW,UAAU;AAC1D,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO,KAAK,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,QAChD,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW;AAChD,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR,CAAC;AAAA,IACH,CAAC;AAED,aAAS;AAAA,MACR;AAAA,MACA,YAAY;AACX,YAAI,KAAK,SAAU;AACnB,aAAK,WAAW;AAEhB,cAAM;AAAA,UACL,YAAY;AACX,kBAAM,UAAU,MAAM,KAAK,mBAAmB,OAAO;AAAA,cACpD,mBAAmB;AAAA,cACnB,gBAAgB;AAAA,cAChB,6BAA6B,OAAO;AAAA,cACpC,2BAA2B;AAAA,cAC3B,iBAAiB;AAAA,YAClB,CAAC;AAED,gBAAI,QAAS,QAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAC9C,kBAAM,WAAW,iBAAiB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAS,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC3F,kBAAM,WAAW,iBAAiB,SAAS;AAC3C,qBAAS,IAAI,EAAE,IAAI,KAAK,8BAA8B,SAAS,cAAc;AAC7E,mBAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACD,EAAE,MAAM,CAAC,QAAQ,SAAS,MAAM,IAAI,cAAc,8BAA8B,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,MACrG;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAQA,MAAM,SAAS,CAAC,OAAe;AAC9B,MAAI;AACH,WAAO,IAAI,SAAS,EAAE;AAAA,EACvB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;","names":[]}
@@ -1,2 +1,2 @@
1
- import f from"@confluentinc/kafka-javascript";import u from"kafkajs";import{Instance as n}from "../../instance/index.min.mjs";import{Random as m,parseJSONValue as d}from "../../utilities/index.min.mjs";import{EventBus as l}from "../base.min.mjs";class E extends l{#t;#e;#a;constructor(t){super();const{confluent:a=!1,...e}=t;this.#e=a,this.#t=a?new f.KafkaJS.Kafka({kafkaJS:{...e,logLevel:f.KafkaJS.logLevel.NOTHING}}):new u.Kafka({...e,logLevel:u.logLevel.NOTHING})}createStream(t,a={}){const e=a.skipScope?t:n.get().getScopedName(t);return{publish:async o=>{try{const s=this.#t.producer();return await s.connect(),await s.send({topic:e,messages:[{value:JSON.stringify(o)}]}),!0}catch{return!1}},subscribe:o=>{const s=async()=>{await this.#s(e);const r=a.fanout?n.get().getScopedName(`${n.get().id}-fanout-${m.string(10)}`):e,i=this.#t.consumer(this.#e?{kafkaJS:{groupId:r}}:{groupId:r});await i.connect(),await i.subscribe({topic:e}),await i.run({eachMessage:async({message:c})=>{n.resolveBeforeCrash(async()=>{c.value&&await o(d(c.value.toString()))})}}),a.fanout&&n.on("close",async()=>{await i.disconnect(),await this.#i(r)},10)};n.on("start",s,2)}}}async#n(){return this.#a||(this.#a=this.#t.admin(),await this.#a.connect()),this.#a}async#s(t){await(await this.#n()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#n()).deleteGroups([t]).catch(()=>{})}}export{E as KafkaEventBus};
1
+ import f from"@confluentinc/kafka-javascript";import u from"kafkajs";import{EquippedError as d}from "../../errors/index.min.mjs";import{Instance as n}from "../../instance/index.min.mjs";import{Random as p,parseJSONValue as l}from "../../utilities/index.min.mjs";import{EventBus as k}from "../base.min.mjs";class N extends k{#a;#e;#t;constructor(t){super();const{confluent:a=!1,...e}=t;this.#e=a,this.#a=a?new f.KafkaJS.Kafka({kafkaJS:{...e,logLevel:f.KafkaJS.logLevel.NOTHING}}):new u.Kafka({...e,logLevel:u.logLevel.NOTHING})}createStream(t,a={}){const e=a.skipScope?t:n.get().getScopedName(t);return{publish:async r=>{try{const s=this.#a.producer();return await s.connect(),await s.send({topic:e,messages:[{value:JSON.stringify(r)}]}),!0}catch{return!1}},subscribe:r=>{const s=async()=>{await this.#s(e);const i=a.fanout?n.get().getScopedName(`${n.get().id}-fanout-${p.string(10)}`):e,o=this.#a.consumer(this.#e?{kafkaJS:{groupId:i}}:{groupId:i});await o.connect(),await o.subscribe({topic:e}),await o.run({eachMessage:async({message:c})=>{await n.resolveBeforeCrash(async()=>{c.value&&await r(l(c.value.toString()))}).catch(m=>n.crash(new d("Error processing kafka event",{topic:e,groupId:i,options:a},m)))}}),a.fanout&&n.on("close",async()=>{await o.disconnect(),await this.#i(i)},10)};n.on("start",s,2)}}}async#n(){return this.#t||(this.#t=this.#a.admin(),await this.#t.connect()),this.#t}async#s(t){await(await this.#n()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#n()).deleteGroups([t]).catch(()=>{})}}export{N as KafkaEventBus};
2
2
  //# sourceMappingURL=kafka.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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\tInstance.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})\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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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,OAAOA,MAAe,iCACtB,OAAOC,MAAW,UAElB,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAA+B,UAGjC,MAAMC,UAAsBD,CAAS,CAC3CE,GACAC,GACAC,GACA,YAAYC,EAAqB,CAChC,MAAM,EACN,KAAM,CAAE,UAAAC,EAAY,GAAO,GAAGC,CAAc,EAAIF,EAChD,KAAKF,GAAaG,EAClB,KAAKJ,GAAUI,EACZ,IAAIX,EAAU,QAAQ,MAAM,CAC5B,QAAS,CAAE,GAAGY,EAAe,SAAUZ,EAAU,QAAQ,SAAS,OAAQ,CAC3E,CAAC,EACA,IAAIC,EAAM,MAAM,CAAE,GAAGW,EAAe,SAAUX,EAAM,SAAS,OAAQ,CAAC,CAC1E,CAEA,aAAiDY,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYX,EAAS,IAAI,EAAE,cAAcW,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GAAwB,CACvC,GAAI,CACH,MAAMC,EAAW,KAAKV,GAAQ,SAAS,EACvC,aAAMU,EAAS,QAAQ,EACvB,MAAMA,EAAS,KAAK,CACnB,MAAAF,EACA,SAAU,CAAC,CAAE,MAAO,KAAK,UAAUC,CAAI,CAAE,CAAC,CAC3C,CAAC,EACM,EACR,MAAQ,CACP,MAAO,EACR,CACD,EACA,UAAYE,GAAsD,CACjE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKC,GAAaL,CAAK,EAC7B,MAAMM,EAAUP,EAAQ,OACrBZ,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/EY,EACGO,EAAW,KAAKf,GAAQ,SAAS,KAAKC,GAAc,CAAE,QAAS,CAAE,QAAAa,CAAQ,CAAE,EAAY,CAAE,QAAAA,CAAQ,CAAC,EAExG,MAAMC,EAAS,QAAQ,EACvB,MAAMA,EAAS,UAAU,CAAE,MAAAP,CAAM,CAAC,EAElC,MAAMO,EAAS,IAAI,CAClB,YAAa,MAAO,CAAE,QAAAC,CAAQ,IAAM,CACnCrB,EAAS,mBAAmB,SAAY,CAClCqB,EAAQ,OACb,MAAML,EAAUd,EAAemB,EAAQ,MAAM,SAAS,CAAC,CAAC,CACzD,CAAC,CACF,CACD,CAAC,EAEGT,EAAQ,QACXZ,EAAS,GACR,QACA,SAAY,CACX,MAAMoB,EAAS,WAAW,EAC1B,MAAM,KAAKE,GAAaH,CAAO,CAChC,EACA,EACD,CACF,EACAnB,EAAS,GAAG,QAASiB,EAAW,CAAC,CAClC,CACD,CACD,CAEA,KAAMM,IAAY,CACjB,OAAK,KAAKhB,KACT,KAAKA,GAAS,KAAKF,GAAQ,MAAM,EACjC,MAAM,KAAKE,GAAO,QAAQ,GAEpB,KAAKA,EACb,CAEA,KAAMW,GAAaL,EAAe,CAEjC,MADc,MAAM,KAAKU,GAAU,GACvB,aAAa,CAAE,OAAQ,CAAC,CAAE,MAAAV,CAAM,CAAC,EAAG,QAAS,GAAK,CAAC,CAChE,CAEA,KAAMS,GAAaH,EAAiB,CAEnC,MADc,MAAM,KAAKI,GAAU,GACvB,aAAa,CAACJ,CAAO,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnD,CACD","names":["Confluent","Kafka","Instance","Random","parseJSONValue","EventBus","KafkaEventBus","#client","#confluent","#admin","config","confluent","kafkaSettings","topicName","options","topic","data","producer","onMessage","subscribe","#createTopic","groupId","consumer","message","#deleteGroup","#getAdmin"]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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,OAAOA,MAAe,iCACtB,OAAOC,MAAW,UAElB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAA+B,UAGjC,MAAMC,UAAsBD,CAAS,CAC3CE,GACAC,GACAC,GACA,YAAYC,EAAqB,CAChC,MAAM,EACN,KAAM,CAAE,UAAAC,EAAY,GAAO,GAAGC,CAAc,EAAIF,EAChD,KAAKF,GAAaG,EAClB,KAAKJ,GAAUI,EACZ,IAAIZ,EAAU,QAAQ,MAAM,CAC5B,QAAS,CAAE,GAAGa,EAAe,SAAUb,EAAU,QAAQ,SAAS,OAAQ,CAC3E,CAAC,EACA,IAAIC,EAAM,MAAM,CAAE,GAAGY,EAAe,SAAUZ,EAAM,SAAS,OAAQ,CAAC,CAC1E,CAEA,aAAiDa,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYX,EAAS,IAAI,EAAE,cAAcW,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GAAwB,CACvC,GAAI,CACH,MAAMC,EAAW,KAAKV,GAAQ,SAAS,EACvC,aAAMU,EAAS,QAAQ,EACvB,MAAMA,EAAS,KAAK,CACnB,MAAAF,EACA,SAAU,CAAC,CAAE,MAAO,KAAK,UAAUC,CAAI,CAAE,CAAC,CAC3C,CAAC,EACM,EACR,MAAQ,CACP,MAAO,EACR,CACD,EACA,UAAYE,GAAsD,CACjE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKC,GAAaL,CAAK,EAC7B,MAAMM,EAAUP,EAAQ,OACrBZ,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/EY,EACGO,EAAW,KAAKf,GAAQ,SAAS,KAAKC,GAAc,CAAE,QAAS,CAAE,QAAAa,CAAQ,CAAE,EAAY,CAAE,QAAAA,CAAQ,CAAC,EAExG,MAAMC,EAAS,QAAQ,EACvB,MAAMA,EAAS,UAAU,CAAE,MAAAP,CAAM,CAAC,EAElC,MAAMO,EAAS,IAAI,CAClB,YAAa,MAAO,CAAE,QAAAC,CAAQ,IAAM,CACnC,MAAMrB,EAAS,mBAAmB,SAAY,CACxCqB,EAAQ,OACb,MAAML,EAAUd,EAAemB,EAAQ,MAAM,SAAS,CAAC,CAAC,CACzD,CAAC,EAAE,MAAOC,GACTtB,EAAS,MAAM,IAAID,EAAc,+BAAgC,CAAE,MAAAc,EAAO,QAAAM,EAAS,QAAAP,CAAQ,EAAGU,CAAK,CAAC,CACrG,CACD,CACD,CAAC,EAEGV,EAAQ,QACXZ,EAAS,GACR,QACA,SAAY,CACX,MAAMoB,EAAS,WAAW,EAC1B,MAAM,KAAKG,GAAaJ,CAAO,CAChC,EACA,EACD,CACF,EACAnB,EAAS,GAAG,QAASiB,EAAW,CAAC,CAClC,CACD,CACD,CAEA,KAAMO,IAAY,CACjB,OAAK,KAAKjB,KACT,KAAKA,GAAS,KAAKF,GAAQ,MAAM,EACjC,MAAM,KAAKE,GAAO,QAAQ,GAEpB,KAAKA,EACb,CAEA,KAAMW,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":["Confluent","Kafka","EquippedError","Instance","Random","parseJSONValue","EventBus","KafkaEventBus","#client","#confluent","#admin","config","confluent","kafkaSettings","topicName","options","topic","data","producer","onMessage","subscribe","#createTopic","groupId","consumer","message","error","#deleteGroup","#getAdmin"]}
@@ -1,5 +1,6 @@
1
1
  import Confluent from "@confluentinc/kafka-javascript";
2
2
  import Kafka from "kafkajs";
3
+ import { EquippedError } from "../../errors/index.mjs";
3
4
  import { Instance } from "../../instance/index.mjs";
4
5
  import { Random, parseJSONValue } from "../../utilities/index.mjs";
5
6
  import { EventBus } from "../base.mjs";
@@ -40,10 +41,12 @@ class KafkaEventBus extends EventBus {
40
41
  await consumer.subscribe({ topic });
41
42
  await consumer.run({
42
43
  eachMessage: async ({ message }) => {
43
- Instance.resolveBeforeCrash(async () => {
44
+ await Instance.resolveBeforeCrash(async () => {
44
45
  if (!message.value) return;
45
46
  await onMessage(parseJSONValue(message.value.toString()));
46
- });
47
+ }).catch(
48
+ (error) => Instance.crash(new EquippedError("Error processing kafka event", { topic, groupId, options }, error))
49
+ );
47
50
  }
48
51
  });
49
52
  if (options.fanout)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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\tInstance.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})\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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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,OAAO,eAAe;AACtB,OAAO,WAAW;AAElB,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAA+B;AAGjC,MAAM,sBAAsB,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAChC,UAAM;AACN,UAAM,EAAE,YAAY,OAAO,GAAG,cAAc,IAAI;AAChD,SAAK,aAAa;AAClB,SAAK,UAAU,YACZ,IAAI,UAAU,QAAQ,MAAM;AAAA,MAC5B,SAAS,EAAE,GAAG,eAAe,UAAU,UAAU,QAAQ,SAAS,QAAQ;AAAA,IAC3E,CAAC,IACA,IAAI,MAAM,MAAM,EAAE,GAAG,eAAe,UAAU,MAAM,SAAS,QAAQ,CAAC;AAAA,EAC1E;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,YAAI;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,KAAK;AAAA,YACnB;AAAA,YACA,UAAU,CAAC,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC;AACD,iBAAO;AAAA,QACR,QAAQ;AACP,iBAAO;AAAA,QACR;AAAA,MACD;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,KAAK,aAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAY,EAAE,QAAQ,CAAC;AAExG,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,UAAU,EAAE,MAAM,CAAC;AAElC,gBAAM,SAAS,IAAI;AAAA,YAClB,aAAa,OAAO,EAAE,QAAQ,MAAM;AACnC,uBAAS,mBAAmB,YAAY;AACvC,oBAAI,CAAC,QAAQ,MAAO;AACpB,sBAAM,UAAU,eAAe,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,cACzD,CAAC;AAAA,YACF;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,QAAQ;AACjB,WAAK,SAAS,KAAK,QAAQ,MAAM;AACjC,YAAM,KAAK,OAAO,QAAQ;AAAA,IAC3B;AACA,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":[]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\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\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\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(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { 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 = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\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,OAAO,eAAe;AACtB,OAAO,WAAW;AAElB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAA+B;AAGjC,MAAM,sBAAsB,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAChC,UAAM;AACN,UAAM,EAAE,YAAY,OAAO,GAAG,cAAc,IAAI;AAChD,SAAK,aAAa;AAClB,SAAK,UAAU,YACZ,IAAI,UAAU,QAAQ,MAAM;AAAA,MAC5B,SAAS,EAAE,GAAG,eAAe,UAAU,UAAU,QAAQ,SAAS,QAAQ;AAAA,IAC3E,CAAC,IACA,IAAI,MAAM,MAAM,EAAE,GAAG,eAAe,UAAU,MAAM,SAAS,QAAQ,CAAC;AAAA,EAC1E;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,YAAI;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,KAAK;AAAA,YACnB;AAAA,YACA,UAAU,CAAC,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC;AACD,iBAAO;AAAA,QACR,QAAQ;AACP,iBAAO;AAAA,QACR;AAAA,MACD;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,KAAK,aAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAY,EAAE,QAAQ,CAAC;AAExG,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,QAAQ;AACjB,WAAK,SAAS,KAAK,QAAQ,MAAM;AACjC,YAAM,KAAK,OAAO,QAAQ;AAAA,IAC3B;AACA,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":[]}
@@ -1,2 +1,2 @@
1
- import{connect as m}from"amqp-connection-manager";import{Instance as n}from "../../instance/index.min.mjs";import{Random as p,parseJSONValue as f}from "../../utilities/index.min.mjs";import{EventBus as b}from "../base.min.mjs";class g extends b{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=m([e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:n.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?n.get().getScopedName(`${n.get().id}-fanout-${p.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{n.resolveBeforeCrash(async()=>{if(r)try{await i(f(r.content.toString())),a.ack(r)}catch{a.nack(r)}})},{noAck:!1})})};n.on("start",c,2)}}}}export{g as RabbitMQEventBus};
1
+ import{connect as m}from"amqp-connection-manager";import{Instance as n}from "../../instance/index.min.mjs";import{Random as p,parseJSONValue as f}from "../../utilities/index.min.mjs";import{EventBus as b}from "../base.min.mjs";class g extends b{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=m([e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:n.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?n.get().getScopedName(`${n.get().id}-fanout-${p.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{await n.resolveBeforeCrash(async()=>{if(r)try{await i(f(r.content.toString())),a.ack(r)}catch{a.nack(r)}})},{noAck:!1})})};n.on("start",c,2)}}}}export{g as RabbitMQEventBus};
2
2
  //# sourceMappingURL=rabbitmq.min.mjs.map
@@ -1 +1 @@
1
- {"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, StreamOptions } from '../base'\nimport { 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\tInstance.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,MAA+B,UAGjC,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,CACdjB,EAAS,mBAAmB,SAAY,CACvC,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"]}
1
+ {"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, StreamOptions } from '../base'\nimport { 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,MAA+B,UAGjC,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"]}
@@ -29,7 +29,7 @@ class RabbitMQEventBus extends EventBus {
29
29
  channel.consume(
30
30
  queue,
31
31
  async (msg) => {
32
- Instance.resolveBeforeCrash(async () => {
32
+ await Instance.resolveBeforeCrash(async () => {
33
33
  if (!msg) return;
34
34
  try {
35
35
  await onMessage(parseJSONValue(msg.content.toString()));
@@ -1 +1 @@
1
- {"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, StreamOptions } from '../base'\nimport { 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\tInstance.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,gBAA+B;AAGjC,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,yBAAS,mBAAmB,YAAY;AACvC,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":[]}
1
+ {"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, StreamOptions } from '../base'\nimport { 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,gBAA+B;AAGjC,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":[]}
@@ -55,7 +55,7 @@ class MongoDbChange extends DbChange {
55
55
  "capture.mode": "change_streams_update_full_with_pre_image",
56
56
  "mongodb.connection.string": config.uri,
57
57
  "collection.include.list": dbColName,
58
- "snapshot.mode": "when_needed"
58
+ "snapshot.mode": "always"
59
59
  });
60
60
  if (started) return { done: true, value: true };
61
61
  await collection.findOneAndUpdate(condition, { $set: { colName } }, { upsert: true });
@@ -1,5 +1,6 @@
1
1
  import Confluent from "@confluentinc/kafka-javascript";
2
2
  import Kafka from "kafkajs";
3
+ import { EquippedError } from "../../errors/index.js";
3
4
  import { Instance } from "../../instance/index.js";
4
5
  import { Random, parseJSONValue } from "../../utilities/index.js";
5
6
  import { EventBus } from "../base.js";
@@ -40,10 +41,12 @@ class KafkaEventBus extends EventBus {
40
41
  await consumer.subscribe({ topic });
41
42
  await consumer.run({
42
43
  eachMessage: async ({ message }) => {
43
- Instance.resolveBeforeCrash(async () => {
44
+ await Instance.resolveBeforeCrash(async () => {
44
45
  if (!message.value) return;
45
46
  await onMessage(parseJSONValue(message.value.toString()));
46
- });
47
+ }).catch(
48
+ (error) => Instance.crash(new EquippedError("Error processing kafka event", { topic, groupId, options }, error))
49
+ );
47
50
  }
48
51
  });
49
52
  if (options.fanout)
@@ -29,7 +29,7 @@ class RabbitMQEventBus extends EventBus {
29
29
  channel.consume(
30
30
  queue,
31
31
  async (msg) => {
32
- Instance.resolveBeforeCrash(async () => {
32
+ await Instance.resolveBeforeCrash(async () => {
33
33
  if (!msg) return;
34
34
  try {
35
35
  await onMessage(parseJSONValue(msg.content.toString()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "equipped",
3
- "version": "5.0.27",
3
+ "version": "5.0.29",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "type": "module",