equipped 5.1.4 → 5.1.5
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 +7 -0
- package/dist/cjs/audit/events.cjs +1 -1
- package/dist/cjs/audit/events.cjs.map +1 -1
- package/dist/cjs/audit/events.min.cjs +1 -1
- package/dist/cjs/audit/events.min.cjs.map +1 -1
- package/dist/cjs/cache/pipes.cjs.map +1 -1
- package/dist/cjs/cache/pipes.min.cjs +1 -1
- package/dist/cjs/cache/pipes.min.cjs.map +1 -1
- package/dist/cjs/cache/types/redis.cjs +1 -0
- package/dist/cjs/cache/types/redis.cjs.map +1 -1
- package/dist/cjs/cache/types/redis.min.cjs +1 -1
- package/dist/cjs/cache/types/redis.min.cjs.map +1 -1
- package/dist/cjs/dbs/base/changes.cjs +3 -1
- package/dist/cjs/dbs/base/changes.cjs.map +1 -1
- package/dist/cjs/dbs/base/changes.min.cjs +1 -1
- package/dist/cjs/dbs/base/changes.min.cjs.map +1 -1
- package/dist/cjs/dbs/base/db.cjs +2 -1
- package/dist/cjs/dbs/base/db.cjs.map +1 -1
- package/dist/cjs/dbs/base/db.min.cjs +1 -1
- package/dist/cjs/dbs/base/db.min.cjs.map +1 -1
- package/dist/cjs/dbs/base/types.cjs +2 -1
- package/dist/cjs/dbs/base/types.cjs.map +1 -1
- package/dist/cjs/dbs/base/types.min.cjs +2 -1
- package/dist/cjs/dbs/base/types.min.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/changes.cjs +3 -1
- package/dist/cjs/dbs/mongo/changes.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/db.cjs +2 -1
- package/dist/cjs/dbs/mongo/db.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/db.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/db.min.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/query.cjs +3 -1
- package/dist/cjs/dbs/mongo/query.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/query.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/query.min.cjs.map +1 -1
- package/dist/cjs/dbs/pipes.cjs.map +1 -1
- package/dist/cjs/dbs/pipes.min.cjs +1 -1
- package/dist/cjs/dbs/pipes.min.cjs.map +1 -1
- package/dist/cjs/events/base.cjs.map +1 -1
- package/dist/cjs/events/base.min.cjs +1 -1
- package/dist/cjs/events/base.min.cjs.map +1 -1
- package/dist/cjs/events/pipes.cjs.map +1 -1
- package/dist/cjs/events/pipes.min.cjs +1 -1
- package/dist/cjs/events/pipes.min.cjs.map +1 -1
- package/dist/cjs/events/types/kafka.cjs.map +1 -1
- package/dist/cjs/events/types/kafka.min.cjs +1 -1
- package/dist/cjs/events/types/kafka.min.cjs.map +1 -1
- package/dist/cjs/events/types/rabbitmq.cjs.map +1 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs +1 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs.map +1 -1
- package/dist/cjs/instance/index.cjs +2 -2
- package/dist/cjs/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs +1 -1
- package/dist/cjs/instance/index.min.cjs.map +1 -1
- package/dist/cjs/instance/settings.cjs.map +1 -1
- package/dist/cjs/instance/settings.min.cjs +1 -1
- package/dist/cjs/instance/settings.min.cjs.map +1 -1
- package/dist/cjs/jobs/pipes.cjs.map +1 -1
- package/dist/cjs/jobs/pipes.min.cjs +1 -1
- package/dist/cjs/jobs/pipes.min.cjs.map +1 -1
- package/dist/cjs/jobs/types/redis.cjs +22 -17
- package/dist/cjs/jobs/types/redis.cjs.map +1 -1
- package/dist/cjs/jobs/types/redis.min.cjs +1 -1
- package/dist/cjs/jobs/types/redis.min.cjs.map +1 -1
- package/dist/cjs/server/impls/base.cjs +1 -0
- package/dist/cjs/server/impls/base.cjs.map +1 -1
- package/dist/cjs/server/impls/base.min.cjs +1 -1
- package/dist/cjs/server/impls/base.min.cjs.map +1 -1
- package/dist/cjs/server/impls/express.cjs.map +1 -1
- package/dist/cjs/server/impls/express.min.cjs +1 -1
- package/dist/cjs/server/impls/express.min.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
- package/dist/cjs/server/openapi.cjs.map +1 -1
- package/dist/cjs/server/openapi.min.cjs +2 -2
- package/dist/cjs/server/openapi.min.cjs.map +1 -1
- package/dist/cjs/server/pipes.cjs.map +1 -1
- package/dist/cjs/server/pipes.min.cjs +1 -1
- package/dist/cjs/server/pipes.min.cjs.map +1 -1
- package/dist/cjs/server/requests-auth/tokens.min.cjs +1 -1
- package/dist/cjs/server/requests-auth/tokens.min.cjs.map +1 -1
- package/dist/cjs/server/requests.cjs.map +1 -1
- package/dist/cjs/server/requests.min.cjs +1 -1
- package/dist/cjs/server/requests.min.cjs.map +1 -1
- package/dist/cjs/server/routes.cjs +2 -0
- package/dist/cjs/server/routes.cjs.map +1 -1
- package/dist/cjs/server/routes.min.cjs +1 -1
- package/dist/cjs/server/routes.min.cjs.map +1 -1
- package/dist/cjs/server/sockets.cjs.map +1 -1
- package/dist/cjs/server/sockets.min.cjs +1 -1
- package/dist/cjs/server/sockets.min.cjs.map +1 -1
- package/dist/cjs/server/types.cjs.map +1 -1
- package/dist/cjs/server/types.min.cjs +1 -1
- package/dist/cjs/server/types.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +1 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/cjs/validations/valleyed.cjs.map +1 -1
- package/dist/cjs/validations/valleyed.min.cjs +1 -1
- package/dist/cjs/validations/valleyed.min.cjs.map +1 -1
- package/dist/esm/audit/events.min.mjs +1 -1
- package/dist/esm/audit/events.min.mjs.map +1 -1
- package/dist/esm/audit/events.mjs +2 -2
- package/dist/esm/audit/events.mjs.map +1 -1
- package/dist/esm/cache/pipes.min.mjs +1 -1
- package/dist/esm/cache/pipes.min.mjs.map +1 -1
- package/dist/esm/cache/pipes.mjs.map +1 -1
- package/dist/esm/cache/types/redis.min.mjs +1 -1
- package/dist/esm/cache/types/redis.min.mjs.map +1 -1
- package/dist/esm/cache/types/redis.mjs +1 -0
- package/dist/esm/cache/types/redis.mjs.map +1 -1
- package/dist/esm/dbs/base/changes.min.mjs +1 -1
- package/dist/esm/dbs/base/changes.min.mjs.map +1 -1
- package/dist/esm/dbs/base/changes.mjs +2 -0
- package/dist/esm/dbs/base/changes.mjs.map +1 -1
- package/dist/esm/dbs/base/db.min.mjs +1 -1
- package/dist/esm/dbs/base/db.min.mjs.map +1 -1
- package/dist/esm/dbs/base/db.mjs +1 -0
- package/dist/esm/dbs/base/db.mjs.map +1 -1
- package/dist/esm/dbs/base/types.min.mjs +1 -0
- package/dist/esm/dbs/base/types.min.mjs.map +1 -1
- package/dist/esm/dbs/base/types.mjs +1 -0
- package/dist/esm/dbs/base/types.mjs.map +1 -1
- package/dist/esm/dbs/mongo/changes.min.mjs +1 -1
- package/dist/esm/dbs/mongo/changes.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/changes.mjs +2 -0
- package/dist/esm/dbs/mongo/changes.mjs.map +1 -1
- package/dist/esm/dbs/mongo/db.min.mjs +1 -1
- package/dist/esm/dbs/mongo/db.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/db.mjs +2 -1
- package/dist/esm/dbs/mongo/db.mjs.map +1 -1
- package/dist/esm/dbs/mongo/query.min.mjs +1 -1
- package/dist/esm/dbs/mongo/query.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/query.mjs +2 -0
- package/dist/esm/dbs/mongo/query.mjs.map +1 -1
- package/dist/esm/dbs/pipes.min.mjs +1 -1
- package/dist/esm/dbs/pipes.min.mjs.map +1 -1
- package/dist/esm/dbs/pipes.mjs.map +1 -1
- package/dist/esm/events/base.min.mjs +1 -1
- package/dist/esm/events/base.min.mjs.map +1 -1
- package/dist/esm/events/base.mjs.map +1 -1
- package/dist/esm/events/pipes.min.mjs +1 -1
- package/dist/esm/events/pipes.min.mjs.map +1 -1
- package/dist/esm/events/pipes.mjs.map +1 -1
- package/dist/esm/events/types/kafka.min.mjs +1 -1
- package/dist/esm/events/types/kafka.min.mjs.map +1 -1
- package/dist/esm/events/types/kafka.mjs.map +1 -1
- package/dist/esm/events/types/rabbitmq.min.mjs +1 -1
- package/dist/esm/events/types/rabbitmq.min.mjs.map +1 -1
- package/dist/esm/events/types/rabbitmq.mjs.map +1 -1
- package/dist/esm/instance/index.min.mjs +3 -3
- package/dist/esm/instance/index.min.mjs.map +1 -1
- package/dist/esm/instance/index.mjs +3 -3
- package/dist/esm/instance/index.mjs.map +1 -1
- package/dist/esm/instance/settings.min.mjs +1 -1
- package/dist/esm/instance/settings.min.mjs.map +1 -1
- package/dist/esm/instance/settings.mjs.map +1 -1
- package/dist/esm/jobs/pipes.min.mjs +1 -1
- package/dist/esm/jobs/pipes.min.mjs.map +1 -1
- package/dist/esm/jobs/pipes.mjs.map +1 -1
- package/dist/esm/jobs/types/redis.min.mjs +1 -1
- package/dist/esm/jobs/types/redis.min.mjs.map +1 -1
- package/dist/esm/jobs/types/redis.mjs +22 -17
- package/dist/esm/jobs/types/redis.mjs.map +1 -1
- package/dist/esm/server/impls/base.min.mjs +1 -1
- package/dist/esm/server/impls/base.min.mjs.map +1 -1
- package/dist/esm/server/impls/base.mjs +1 -0
- package/dist/esm/server/impls/base.mjs.map +1 -1
- package/dist/esm/server/impls/express.min.mjs +1 -1
- package/dist/esm/server/impls/express.min.mjs.map +1 -1
- package/dist/esm/server/impls/express.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.min.mjs +1 -1
- package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.mjs.map +1 -1
- package/dist/esm/server/openapi.min.mjs +3 -3
- package/dist/esm/server/openapi.min.mjs.map +1 -1
- package/dist/esm/server/openapi.mjs.map +1 -1
- package/dist/esm/server/pipes.min.mjs +1 -1
- package/dist/esm/server/pipes.min.mjs.map +1 -1
- package/dist/esm/server/pipes.mjs.map +1 -1
- package/dist/esm/server/requests-auth/tokens.min.mjs +1 -1
- package/dist/esm/server/requests-auth/tokens.min.mjs.map +1 -1
- package/dist/esm/server/requests.min.mjs +1 -1
- package/dist/esm/server/requests.min.mjs.map +1 -1
- package/dist/esm/server/requests.mjs.map +1 -1
- package/dist/esm/server/routes.min.mjs +1 -1
- package/dist/esm/server/routes.min.mjs.map +1 -1
- package/dist/esm/server/routes.mjs +3 -1
- package/dist/esm/server/routes.mjs.map +1 -1
- package/dist/esm/server/sockets.min.mjs +1 -1
- package/dist/esm/server/sockets.min.mjs.map +1 -1
- package/dist/esm/server/sockets.mjs.map +1 -1
- package/dist/esm/server/types.min.mjs +1 -1
- package/dist/esm/server/types.min.mjs.map +1 -1
- package/dist/esm/server/types.mjs.map +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.min.mjs.map +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/esm/validations/index.mjs.map +1 -1
- package/dist/esm/validations/valleyed.min.mjs +1 -1
- package/dist/esm/validations/valleyed.min.mjs.map +1 -1
- package/dist/esm/validations/valleyed.mjs.map +1 -1
- package/dist/types/audit/events.js +2 -2
- package/dist/types/cache/types/redis.js +1 -0
- package/dist/types/dbs/base/changes.js +2 -0
- package/dist/types/dbs/base/db.js +1 -0
- package/dist/types/dbs/base/types.js +1 -0
- package/dist/types/dbs/mongo/changes.js +2 -0
- package/dist/types/dbs/mongo/db.js +2 -1
- package/dist/types/dbs/mongo/query.js +2 -0
- package/dist/types/errors/index.d.ts +6 -6
- package/dist/types/{fastify-B7Edsl8N.d.ts → fastify-CDJ2WuLy.d.ts} +1 -1
- package/dist/types/index.d.ts +5 -5
- package/dist/types/instance/index.d.ts +9 -6
- package/dist/types/instance/index.js +3 -3
- package/dist/types/jobs/index.d.ts +0 -1
- package/dist/types/jobs/types/redis.js +22 -17
- package/dist/types/server/impls/base.js +1 -0
- package/dist/types/server/index.d.ts +5 -5
- package/dist/types/server/routes.js +3 -1
- package/dist/types/{validationError--mhIgeX-.d.ts → validationError-BMKfV51p.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +5 -5
- package/dist/types/validations/index.js +1 -1
- package/package.json +28 -27
- package/dist/types/{requestError-ClqSpE4c.d.ts → requestError-DqkM5BfW.d.ts} +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { type Pipe, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, type Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId({ time: ts })\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["v","Conditions","wrapQueryParams","EquippedError","Instance","createStep","step","EventAudit","db","dbName","model","queue","job","#createEvent","name","payload","context","def","validBody","ts","key","#processEvent","event","callbackWait","result","asyncHandle","err","error","from","events"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { v } from "valleyed";
|
|
2
|
-
import { Conditions, wrapQueryParams } from "../dbs/index.mjs";
|
|
2
|
+
import { Conditions, Db, wrapQueryParams } from "../dbs/index.mjs";
|
|
3
3
|
import { EquippedError } from "../errors/index.mjs";
|
|
4
4
|
import { Instance } from "../instance/index.mjs";
|
|
5
5
|
function createStep(step) {
|
|
@@ -30,7 +30,7 @@ class EventAudit {
|
|
|
30
30
|
if (!def) throw new EquippedError("audit definition not found", { name, payload });
|
|
31
31
|
const validBody = v.assert(def.pipe, payload);
|
|
32
32
|
const ts = context.at ?? /* @__PURE__ */ new Date();
|
|
33
|
-
const key = Instance.createId(ts);
|
|
33
|
+
const key = Instance.createId({ time: ts });
|
|
34
34
|
return await this.table.insertOne(
|
|
35
35
|
{
|
|
36
36
|
key,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId(ts)\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { type Pipe, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, type Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\nimport { Instance } from '../instance'\n\nexport type EventDefinition<P extends Pipe<any, any>, R> = {\n\tpipe: P\n\thandle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>\n\tsync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n\tasync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void\n}\n\nexport type EventContext = {\n\tkey: string\n\tby: string | undefined\n\tdate: Date\n}\n\nexport type EventDoc = {\n\tkey: string\n\tname: string\n\tts: number\n\tbody: unknown\n\tsteps: { status: 'start' | 'sync' | 'async' | 'error', ts: number, error?: string }[]\n\tby?: string\n}\ntype Context = { by?: string; at?: Date; }\n\nfunction createStep (step: EventDoc['steps'][number]) {\n\treturn step\n}\n\nexport class EventAudit {\n\tprivate table: Table<any, EventDoc, EventDoc & { toJSON: () => Record<string, unknown> }, any>\n\tprivate definitions: Record<string, EventDefinition<any, any>> = {}\n\tprivate asyncQueue: (() => Promise<void>)[] = []\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t) {\n\t\tthis.table = db.use({\n\t\t\tdb: dbName,\n\t\t\tcol: '__audits',\n\t\t\tmapper: (model) => ({ ...model, toJSON: () => model as Record<string, unknown> }),\n\t\t\toptions: { skipAudit: true },\n\t\t})\n\n\t\tInstance.on('start', () => {\n\t\t\tsetInterval(async () => {\n\t\t\t\tconst queue = [...this.asyncQueue]\n\t\t\t\tthis.asyncQueue = []\n\t\t\t\tawait Promise.all(queue.map((job) => job()))\n\t\t\t}, 200)\n\t\t}, 4)\n\t}\n\n\tasync #createEvent(name: string, payload: unknown, context: Context) {\n\t\tconst def = this.definitions[name]\n\t\tif (!def) throw new EquippedError('audit definition not found', { name, payload })\n\n\t\tconst validBody = v.assert(def.pipe, payload)\n\t\tconst ts = context.at ?? new Date()\n\t\tconst key = Instance.createId({ time: ts })\n\n\t\treturn await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\tname,\n\t\t\t\tts: ts.getTime(),\n\t\t\t\tbody: validBody,\n\t\t\t\tby: context.by,\n\t\t\t\tsteps: []\n\t\t\t},\n\t\t\t{ getTime: () => ts, makeId: () => key },\n\t\t)\n\t}\n\n\tasync #processEvent<R>(event: EventDoc, callbackWait: boolean) {\n\t\treturn this.db.session(async () => {\n\t\t\tconst def = this.definitions[event.name]\n\t\t\tif (!def) throw new EquippedError('audit definition not found', { event })\n\t\t\ttry {\n\t\t\t\tawait this.table.updateOne(\n\t\t\t\t\t{ key: event.key },\n\t\t\t\t\t{ $set: { steps: [createStep({ status: 'start', ts: Date.now() })] } },\n\t\t\t\t)\n\t\t\t\tconst context: EventContext = {\n\t\t\t\t\tkey: event.key,\n\t\t\t\t\tby: event.by,\n\t\t\t\t\tdate: new Date(event.ts),\n\t\t\t\t}\n\t\t\t\tconst result = await def.handle(event.body, context)\n\t\t\t\tawait def.sync?.(result, event.body, context)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'sync', ts: Date.now() }) } })\n\n\t\t\t\tconst asyncHandle = async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait def.async?.(result, event.body, context)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'async', ts: Date.now() }) } })\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (callbackWait) await asyncHandle()\n\t\t\t\telse this.asyncQueue.push(asyncHandle)\n\t\t\t\treturn result as R\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: 'error', error, ts: Date.now() }) } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync replay(from?: Date) {\n\t\tconst { results: events } = await this.table.query(\n\t\t\twrapQueryParams({\n\t\t\t\twhere: [...(from ? [{ field: 'ts', value: from.getTime(), condition: Conditions.gte }] : [])],\n\t\t\t\tsort: [{ field: 'ts', desc: false }],\n\t\t\t\tall: true,\n\t\t\t}),\n\t\t)\n\t\tfor (const event of events) await this.#processEvent(event, true)\n\t}\n\n\tasync rerun(key: string) {\n\t\tconst event = await this.table.findOne({ key })\n\t\tif (!event) throw new EquippedError('audit event not found', { key })\n\t\tawait this.#processEvent(event, true)\n\t}\n\n\tregister<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>) {\n\t\tif (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {})\n\t\tthis.definitions[name] = def\n\t\tv.compile(def.pipe)\n\t\treturn async (payload: PipeInput<P>, context: Context)=> {\n\t\t\tconst event = await this.#createEvent(name, payload, context)\n\t\t\treturn this.#processEvent<R>(event, false)\n\t\t}\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as o}from"valleyed";const
|
|
1
|
+
import{v as o}from"valleyed";const e=()=>o.meta(o.object({host:o.string(),port:o.optional(o.number()),password:o.optional(o.string()),username:o.optional(o.string()),tls:o.optional(o.boolean()),cluster:o.optional(o.boolean())}),{title:"Redis Config",$refId:"RedisConfig"});export{e as redisConfigPipe};
|
|
2
2
|
//# sourceMappingURL=pipes.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cache/pipes.ts"],"sourcesContent":["import { v, PipeOutput } from 'valleyed'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport type RedisConfig = PipeOutput<ReturnType<typeof redisConfigPipe>>\n"],"mappings":"AAAA,OAAS,KAAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/cache/pipes.ts"],"sourcesContent":["import { v, type PipeOutput } from 'valleyed'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport type RedisConfig = PipeOutput<ReturnType<typeof redisConfigPipe>>\n"],"mappings":"AAAA,OAAS,KAAAA,MAA0B,WAE5B,MAAMC,EAAkB,IAC9BD,EAAE,KACDA,EAAE,OAAO,CACR,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC3B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,IAAKA,EAAE,SAASA,EAAE,QAAQ,CAAC,EAC3B,QAASA,EAAE,SAASA,EAAE,QAAQ,CAAC,CAChC,CAAC,EACD,CAAE,MAAO,eAAgB,OAAQ,aAAc,CAChD","names":["v","redisConfigPipe"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cache/pipes.ts"],"sourcesContent":["import { v, PipeOutput } from 'valleyed'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport type RedisConfig = PipeOutput<ReturnType<typeof redisConfigPipe>>\n"],"mappings":"AAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../../src/cache/pipes.ts"],"sourcesContent":["import { v, type PipeOutput } from 'valleyed'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport type RedisConfig = PipeOutput<ReturnType<typeof redisConfigPipe>>\n"],"mappings":"AAAA,SAAS,SAA0B;AAE5B,MAAM,kBAAkB,MAC9B,EAAE;AAAA,EACD,EAAE,OAAO;AAAA,IACR,MAAM,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,IAC3B,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,IAC/B,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,IAC/B,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,IAC3B,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChC,CAAC;AAAA,EACD,EAAE,OAAO,gBAAgB,QAAQ,cAAc;AAChD;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Cluster as n,Redis as c}from"ioredis";import{EquippedError as a}from "../../errors/index.min.mjs";import{Instance as i}from "../../instance/index.min.mjs";import{Cache as p}from "../base.min.mjs";class
|
|
1
|
+
import{Cluster as n,Redis as c}from"ioredis";import{EquippedError as a}from "../../errors/index.min.mjs";import{Instance as i}from "../../instance/index.min.mjs";import{Cache as p}from "../base.min.mjs";import"../pipes";class w extends p{client;constructor(e,t){super();const s={...e.host?{host:e.host}:{},...e.port?{port:e.port}:{}},r={...t,...e.password?{password:e.password}:{},...e.username?{username:e.username}:{},...e.tls?{tls:{}}:{},lazyConnect:!0};this.client=e.cluster?new n([s],{...t,redisOptions:r,lazyConnect:!0}):new c({...r,...s}),this.client.on("error",async o=>{i.crash(new a("Redis failed with error",{},o))}),t||i.on("start",async()=>this.client.connect(),1),i.on("close",async()=>this.client.quit(),1)}getScopedKey(e){return i.get().getScopedName(e,":")}async delete(e){await this.client.del(this.getScopedKey(e))}async get(e){return await this.client.get(this.getScopedKey(e))}async set(e,t,s){s?await this.client.setex(this.getScopedKey(e),s,t):this.client.set(this.getScopedKey(e),t)}async getOrSet(e,t,s){const r=await this.get(this.getScopedKey(e));if(r)return JSON.parse(r);const o=await t();await this.set(this.getScopedKey(e),JSON.stringify(o),s)}}export{w as RedisCache};
|
|
2
2
|
//# sourceMappingURL=redis.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cache/types/redis.ts"],"sourcesContent":["import { Cluster, Redis, RedisOptions } from 'ioredis'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Cache } from '../base'\nimport { RedisConfig } from '../pipes'\n\nexport class RedisCache extends Cache {\n\tclient: Redis | Cluster\n\n\tconstructor(settings: RedisConfig, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper()\n\t\tconst node = {\n\t\t\t...(settings.host ? { host: settings.host } : {}),\n\t\t\t...(settings.port ? { port: settings.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(settings.password ? { password: settings.password } : {}),\n\t\t\t...(settings.username ? { username: settings.username } : {}),\n\t\t\t...(settings.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.client = settings.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.client.connect(), 1)\n\t\tInstance.on('close', async () => this.client.quit(), 1)\n\t}\n\n\tprivate getScopedKey(key: string): string {\n\t\treturn Instance.get().getScopedName(key, ':')\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.client.del(this.getScopedKey(key))\n\t}\n\n\tasync get(key: string) {\n\t\treturn await this.client.get(this.getScopedKey(key))\n\t}\n\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.client.set(this.getScopedKey(key), data)\n\t}\n\n\tasync getOrSet<T>(key: string, fn: () => Promise<T>, ttlInSecs?: number) {\n\t\tconst cached = await this.get(this.getScopedKey(key))\n\t\tif (cached) return JSON.parse(cached)\n\n\t\tconst result = await fn()\n\t\tawait this.set(this.getScopedKey(key), JSON.stringify(result), ttlInSecs)\n\t}\n}\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,SAAAC,
|
|
1
|
+
{"version":3,"sources":["../../../../src/cache/types/redis.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Cache } from '../base'\nimport { type RedisConfig } from '../pipes'\n\nexport class RedisCache extends Cache {\n\tclient: Redis | Cluster\n\n\tconstructor(settings: RedisConfig, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper()\n\t\tconst node = {\n\t\t\t...(settings.host ? { host: settings.host } : {}),\n\t\t\t...(settings.port ? { port: settings.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(settings.password ? { password: settings.password } : {}),\n\t\t\t...(settings.username ? { username: settings.username } : {}),\n\t\t\t...(settings.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.client = settings.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.client.connect(), 1)\n\t\tInstance.on('close', async () => this.client.quit(), 1)\n\t}\n\n\tprivate getScopedKey(key: string): string {\n\t\treturn Instance.get().getScopedName(key, ':')\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.client.del(this.getScopedKey(key))\n\t}\n\n\tasync get(key: string) {\n\t\treturn await this.client.get(this.getScopedKey(key))\n\t}\n\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.client.set(this.getScopedKey(key), data)\n\t}\n\n\tasync getOrSet<T>(key: string, fn: () => Promise<T>, ttlInSecs?: number) {\n\t\tconst cached = await this.get(this.getScopedKey(key))\n\t\tif (cached) return JSON.parse(cached)\n\n\t\tconst result = await fn()\n\t\tawait this.set(this.getScopedKey(key), JSON.stringify(result), ttlInSecs)\n\t}\n}\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,SAAAC,MAAgC,UAElD,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,UACtB,MAAiC,WAE1B,MAAMC,UAAmBD,CAAM,CACrC,OAEA,YAAYE,EAAuBC,EAAqC,CACvE,MAAM,EACN,MAAMC,EAAO,CACZ,GAAIF,EAAS,KAAO,CAAE,KAAMA,EAAS,IAAK,EAAI,CAAC,EAC/C,GAAIA,EAAS,KAAO,CAAE,KAAMA,EAAS,IAAK,EAAI,CAAC,CAChD,EACMG,EAAS,CACd,GAAGF,EACH,GAAID,EAAS,SAAW,CAAE,SAAUA,EAAS,QAAS,EAAI,CAAC,EAC3D,GAAIA,EAAS,SAAW,CAAE,SAAUA,EAAS,QAAS,EAAI,CAAC,EAC3D,GAAIA,EAAS,IAAM,CAAE,IAAK,CAAC,CAAE,EAAI,CAAC,EAClC,YAAa,EACd,EACA,KAAK,OAASA,EAAS,QACpB,IAAIN,EAAQ,CAACQ,CAAI,EAAG,CACpB,GAAGD,EACH,aAAcE,EACd,YAAa,EACd,CAAC,EACA,IAAIR,EAAM,CAAE,GAAGQ,EAAQ,GAAGD,CAAK,CAAC,EACnC,KAAK,OAAO,GAAG,QAAS,MAAOE,GAAU,CACxCP,EAAS,MAAM,IAAID,EAAc,0BAA2B,CAAC,EAAGQ,CAAK,CAAC,CACvE,CAAC,EACIH,GAAaJ,EAAS,GAAG,QAAS,SAAY,KAAK,OAAO,QAAQ,EAAG,CAAC,EAC3EA,EAAS,GAAG,QAAS,SAAY,KAAK,OAAO,KAAK,EAAG,CAAC,CACvD,CAEQ,aAAaQ,EAAqB,CACzC,OAAOR,EAAS,IAAI,EAAE,cAAcQ,EAAK,GAAG,CAC7C,CAEA,MAAM,OAAOA,EAAa,CACzB,MAAM,KAAK,OAAO,IAAI,KAAK,aAAaA,CAAG,CAAC,CAC7C,CAEA,MAAM,IAAIA,EAAa,CACtB,OAAO,MAAM,KAAK,OAAO,IAAI,KAAK,aAAaA,CAAG,CAAC,CACpD,CAEA,MAAM,IAAIA,EAAaC,EAAcC,EAAoB,CACpDA,EAAW,MAAM,KAAK,OAAO,MAAM,KAAK,aAAaF,CAAG,EAAGE,EAAWD,CAAI,EACzE,KAAK,OAAO,IAAI,KAAK,aAAaD,CAAG,EAAGC,CAAI,CAClD,CAEA,MAAM,SAAYD,EAAaG,EAAsBD,EAAoB,CACxE,MAAME,EAAS,MAAM,KAAK,IAAI,KAAK,aAAaJ,CAAG,CAAC,EACpD,GAAII,EAAQ,OAAO,KAAK,MAAMA,CAAM,EAEpC,MAAMC,EAAS,MAAMF,EAAG,EACxB,MAAM,KAAK,IAAI,KAAK,aAAaH,CAAG,EAAG,KAAK,UAAUK,CAAM,EAAGH,CAAS,CACzE,CACD","names":["Cluster","Redis","EquippedError","Instance","Cache","RedisCache","settings","extraConfig","node","common","error","key","data","ttlInSecs","fn","cached","result"]}
|
|
@@ -2,6 +2,7 @@ import { Cluster, Redis } from "ioredis";
|
|
|
2
2
|
import { EquippedError } from "../../errors/index.mjs";
|
|
3
3
|
import { Instance } from "../../instance/index.mjs";
|
|
4
4
|
import { Cache } from "../base.mjs";
|
|
5
|
+
import {} from "../pipes.mjs";
|
|
5
6
|
class RedisCache extends Cache {
|
|
6
7
|
client;
|
|
7
8
|
constructor(settings, extraConfig) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/cache/types/redis.ts"],"sourcesContent":["import { Cluster, Redis, RedisOptions } from 'ioredis'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Cache } from '../base'\nimport { RedisConfig } from '../pipes'\n\nexport class RedisCache extends Cache {\n\tclient: Redis | Cluster\n\n\tconstructor(settings: RedisConfig, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper()\n\t\tconst node = {\n\t\t\t...(settings.host ? { host: settings.host } : {}),\n\t\t\t...(settings.port ? { port: settings.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(settings.password ? { password: settings.password } : {}),\n\t\t\t...(settings.username ? { username: settings.username } : {}),\n\t\t\t...(settings.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.client = settings.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.client.connect(), 1)\n\t\tInstance.on('close', async () => this.client.quit(), 1)\n\t}\n\n\tprivate getScopedKey(key: string): string {\n\t\treturn Instance.get().getScopedName(key, ':')\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.client.del(this.getScopedKey(key))\n\t}\n\n\tasync get(key: string) {\n\t\treturn await this.client.get(this.getScopedKey(key))\n\t}\n\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.client.set(this.getScopedKey(key), data)\n\t}\n\n\tasync getOrSet<T>(key: string, fn: () => Promise<T>, ttlInSecs?: number) {\n\t\tconst cached = await this.get(this.getScopedKey(key))\n\t\tif (cached) return JSON.parse(cached)\n\n\t\tconst result = await fn()\n\t\tawait this.set(this.getScopedKey(key), JSON.stringify(result), ttlInSecs)\n\t}\n}\n"],"mappings":"AAAA,SAAS,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../../../src/cache/types/redis.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Cache } from '../base'\nimport { type RedisConfig } from '../pipes'\n\nexport class RedisCache extends Cache {\n\tclient: Redis | Cluster\n\n\tconstructor(settings: RedisConfig, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper()\n\t\tconst node = {\n\t\t\t...(settings.host ? { host: settings.host } : {}),\n\t\t\t...(settings.port ? { port: settings.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(settings.password ? { password: settings.password } : {}),\n\t\t\t...(settings.username ? { username: settings.username } : {}),\n\t\t\t...(settings.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.client = settings.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.client.connect(), 1)\n\t\tInstance.on('close', async () => this.client.quit(), 1)\n\t}\n\n\tprivate getScopedKey(key: string): string {\n\t\treturn Instance.get().getScopedName(key, ':')\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.client.del(this.getScopedKey(key))\n\t}\n\n\tasync get(key: string) {\n\t\treturn await this.client.get(this.getScopedKey(key))\n\t}\n\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.client.set(this.getScopedKey(key), data)\n\t}\n\n\tasync getOrSet<T>(key: string, fn: () => Promise<T>, ttlInSecs?: number) {\n\t\tconst cached = await this.get(this.getScopedKey(key))\n\t\tif (cached) return JSON.parse(cached)\n\n\t\tconst result = await fn()\n\t\tawait this.set(this.getScopedKey(key), JSON.stringify(result), ttlInSecs)\n\t}\n}\n"],"mappings":"AAAA,SAAS,SAAS,aAAgC;AAElD,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,eAAiC;AAE1B,MAAM,mBAAmB,MAAM;AAAA,EACrC;AAAA,EAEA,YAAY,UAAuB,aAAqC;AACvE,UAAM;AACN,UAAM,OAAO;AAAA,MACZ,GAAI,SAAS,OAAO,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MAC/C,GAAI,SAAS,OAAO,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IAChD;AACA,UAAM,SAAS;AAAA,MACd,GAAG;AAAA,MACH,GAAI,SAAS,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAC3D,GAAI,SAAS,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAC3D,GAAI,SAAS,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,MAClC,aAAa;AAAA,IACd;AACA,SAAK,SAAS,SAAS,UACpB,IAAI,QAAQ,CAAC,IAAI,GAAG;AAAA,MACpB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,aAAa;AAAA,IACd,CAAC,IACA,IAAI,MAAM,EAAE,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnC,SAAK,OAAO,GAAG,SAAS,OAAO,UAAU;AACxC,eAAS,MAAM,IAAI,cAAc,2BAA2B,CAAC,GAAG,KAAK,CAAC;AAAA,IACvE,CAAC;AACD,QAAI,CAAC,YAAa,UAAS,GAAG,SAAS,YAAY,KAAK,OAAO,QAAQ,GAAG,CAAC;AAC3E,aAAS,GAAG,SAAS,YAAY,KAAK,OAAO,KAAK,GAAG,CAAC;AAAA,EACvD;AAAA,EAEQ,aAAa,KAAqB;AACzC,WAAO,SAAS,IAAI,EAAE,cAAc,KAAK,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,KAAa;AACzB,UAAM,KAAK,OAAO,IAAI,KAAK,aAAa,GAAG,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAI,KAAa;AACtB,WAAO,MAAM,KAAK,OAAO,IAAI,KAAK,aAAa,GAAG,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,IAAI,KAAa,MAAc,WAAoB;AACxD,QAAI,UAAW,OAAM,KAAK,OAAO,MAAM,KAAK,aAAa,GAAG,GAAG,WAAW,IAAI;AAAA,QACzE,MAAK,OAAO,IAAI,KAAK,aAAa,GAAG,GAAG,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,SAAY,KAAa,IAAsB,WAAoB;AACxE,UAAM,SAAS,MAAM,KAAK,IAAI,KAAK,aAAa,GAAG,CAAC;AACpD,QAAI,OAAQ,QAAO,KAAK,MAAM,MAAM;AAEpC,UAAM,SAAS,MAAM,GAAG;AACxB,UAAM,KAAK,IAAI,KAAK,aAAa,GAAG,GAAG,KAAK,UAAU,MAAM,GAAG,SAAS;AAAA,EACzE;AACD;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import r from"axios";import{EquippedError as n}from "../../errors/index.min.mjs";const a="db-changes";class
|
|
1
|
+
import r from"axios";import"./core";import"./types";import{EquippedError as n}from "../../errors/index.min.mjs";const a="db-changes";class d{constructor(e,o,t){this.config=e;this.callbacks=o;this.mapper=t}async configureConnector(e,o){const t=r.create({baseURL:this.config.debeziumUrl});return await t.put(`/connectors/${e}/config`,{"topic.prefix":a,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...o}).then(async()=>(await t.get(`/connectors/${e}/topics`)).data[e]?.topics?.includes?.(e)??!1).catch(c=>{throw new n("Failed to configure watcher",{key:e},c)})}}export{d as DbChange,a as TopicPrefix};
|
|
2
2
|
//# sourceMappingURL=changes.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/base/changes.ts"],"sourcesContent":["import axios from 'axios'\n\nimport * as core from './core'\nimport { DbChangeConfig } from './types'\nimport { EquippedError } from '../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n"],"mappings":"AAAA,OAAOA,MAAW,
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/changes.ts"],"sourcesContent":["import axios from 'axios'\n\nimport * as core from './core'\nimport { type DbChangeConfig } from './types'\nimport { EquippedError } from '../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n"],"mappings":"AAAA,OAAOA,MAAW,QAElB,MAAsB,SACtB,MAAoC,UACpC,OAAS,iBAAAC,MAAqB,eAEvB,MAAMC,EAAc,aAEpB,MAAeC,CAA4E,CACjG,YACWC,EACAC,EACAC,EACT,CAHS,YAAAF,EACA,eAAAC,EACA,YAAAC,CACR,CAEH,MAAgB,mBAAmBC,EAAaC,EAA8B,CAC7E,MAAMC,EAAWT,EAAM,OAAO,CAAE,QAAS,KAAK,OAAO,WAAY,CAAC,EAClE,OAAO,MAAMS,EACX,IAAI,eAAeF,CAAG,UAAW,CACjC,eAAgBL,EAChB,wBAAyB,QACzB,4CAA6C,KAC7C,oCAAqC,KACrC,gBAAiB,8CACjB,+BAAgC,QAChC,kBAAmB,8CACnB,iCAAkC,QAClC,GAAGM,CACJ,CAAC,EACA,KAAK,UACU,MAAMC,EAAS,IAAI,eAAeF,CAAG,SAAS,GAC/C,KAAKA,CAAG,GAAG,QAAQ,WAAWA,CAAG,GAAK,EACpD,EACA,MAAOG,GAAQ,CACf,MAAM,IAAIT,EAAc,8BAA+B,CAAE,IAAAM,CAAI,EAAGG,CAAG,CACpE,CAAC,CACH,CACD","names":["axios","EquippedError","TopicPrefix","DbChange","config","callbacks","mapper","key","data","instance","err"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/base/changes.ts"],"sourcesContent":["import axios from 'axios'\n\nimport * as core from './core'\nimport { DbChangeConfig } from './types'\nimport { EquippedError } from '../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n"],"mappings":"AAAA,OAAO,WAAW;
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/changes.ts"],"sourcesContent":["import axios from 'axios'\n\nimport * as core from './core'\nimport { type DbChangeConfig } from './types'\nimport { EquippedError } from '../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n"],"mappings":"AAAA,OAAO,WAAW;AAElB,YAAY,UAAU;AACtB,eAAoC;AACpC,SAAS,qBAAqB;AAEvB,MAAM,cAAc;AAEpB,MAAe,SAA4E;AAAA,EACjG,YACW,QACA,WACA,QACT;AAHS;AACA;AACA;AAAA,EACR;AAAA,EAEH,MAAgB,mBAAmB,KAAa,MAA8B;AAC7E,UAAM,WAAW,MAAM,OAAO,EAAE,SAAS,KAAK,OAAO,YAAY,CAAC;AAClE,WAAO,MAAM,SACX,IAAI,eAAe,GAAG,WAAW;AAAA,MACjC,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,6CAA6C;AAAA,MAC7C,qCAAqC;AAAA,MACrC,iBAAiB;AAAA,MACjB,gCAAgC;AAAA,MAChC,mBAAmB;AAAA,MACnB,kCAAkC;AAAA,MAClC,GAAG;AAAA,IACJ,CAAC,EACA,KAAK,YAAY;AACjB,YAAM,SAAS,MAAM,SAAS,IAAI,eAAe,GAAG,SAAS;AAC7D,aAAO,OAAO,KAAK,GAAG,GAAG,QAAQ,WAAW,GAAG,KAAK;AAAA,IACrD,CAAC,EACA,MAAM,CAAC,QAAQ;AACf,YAAM,IAAI,cAAc,+BAA+B,EAAE,IAAI,GAAG,GAAG;AAAA,IACpE,CAAC;AAAA,EACH;AACD;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Instance as t}from "../../instance/index.min.mjs";class
|
|
1
|
+
import"./core";import{Instance as t}from "../../instance/index.min.mjs";class s{constructor(e){this.config=e}getScopedDb(e){return t.get().getScopedName(e).replaceAll(".","-")}}export{s as Db};
|
|
2
2
|
//# sourceMappingURL=db.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/base/db.ts"],"sourcesContent":["import * as core from './core'\nimport { DbConfig } from './types'\nimport { Instance } from '../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/db.ts"],"sourcesContent":["import * as core from './core'\nimport type { DbConfig } from './types'\nimport { Instance } from '../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"AAAA,MAAsB,SAEtB,OAAS,YAAAA,MAAgB,iBAIlB,MAAeC,CAA8B,CACnD,YAAsBC,EAAkB,CAAlB,YAAAA,CAAmB,CAE/B,YAAYC,EAAY,CACjC,OAAOH,EAAS,IAAI,EAAE,cAAcG,CAAE,EAAE,WAAW,IAAK,GAAG,CAC5D,CAOD","names":["Instance","Db","config","db"]}
|
package/dist/esm/dbs/base/db.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/base/db.ts"],"sourcesContent":["import * as core from './core'\nimport { DbConfig } from './types'\nimport { Instance } from '../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/db.ts"],"sourcesContent":["import * as core from './core'\nimport type { DbConfig } from './types'\nimport { Instance } from '../../instance'\n\nexport type TableOptions = { skipAudit?: boolean }\n\nexport abstract class Db<IdKey extends core.IdType> {\n\tconstructor(protected config: DbConfig) {}\n\n\tprotected getScopedDb(db: string) {\n\t\treturn Instance.get().getScopedName(db).replaceAll('.', '-')\n\t}\n\n\tabstract use<Model extends core.Model<IdKey>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t): core.Table<IdKey, Model, Entity>\n\n\tabstract session<T>(callback: () => Promise<T>): Promise<T>\n}\n"],"mappings":"AAAA,YAAY,UAAU;AAEtB,SAAS,gBAAgB;AAIlB,MAAe,GAA8B;AAAA,EACnD,YAAsB,QAAkB;AAAlB;AAAA,EAAmB;AAAA,EAE/B,YAAY,IAAY;AACjC,WAAO,SAAS,IAAI,EAAE,cAAc,EAAE,EAAE,WAAW,KAAK,GAAG;AAAA,EAC5D;AAOD;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/types.ts"],"sourcesContent":["import { KafkaEventBus } from '../../events'\n\nexport type DbChangeConfig = {\n\teventBus: KafkaEventBus\n\tdebeziumUrl: string\n}\n\nexport type DbConfig = {\n\tchanges?: DbChangeConfig\n}\n"],"mappings":"AAAA,MAA8B","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/base/types.ts"],"sourcesContent":["import { KafkaEventBus } from '../../events'\n\nexport type DbChangeConfig = {\n\teventBus: KafkaEventBus\n\tdebeziumUrl: string\n}\n\nexport type DbConfig = {\n\tchanges?: DbChangeConfig\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{differ as
|
|
1
|
+
import"mongodb";import{differ as m}from"valleyed";import{EquippedError as y}from "../../errors/index.min.mjs";import{Instance as s}from "../../instance/index.min.mjs";import{retry as C}from "../../utilities/index.min.mjs";import{DbChange as _,TopicPrefix as D}from "../base/changes.min.mjs";import"../base/core";class v extends _{#e=!1;constructor(u,c,r,b,g){super(c,b,g);const l=e=>e._id?{...e,_id:e._id.$oid??e._id}:void 0,h=r.dbName,d=r.collectionName,n=`${h}.${d}`,f=`${D}.${n}`,i="5f5f65717569707065645f5f",p={_id:i};c.eventBus.createStream(f,{skipScope:!0}).subscribe(async e=>{const a=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)&&(a==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):a==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:m.from(m.diff(t,o))}):a==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),s.on("start",async()=>{this.#e||(this.#e=!0,await C(async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":u.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:d}},{upsert:!0}),await r.findOneAndDelete(p),s.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,3e4).catch(e=>s.crash(new y("Failed to start db changes",{dbColName:n},e))))},10)}}export{v as MongoDbChange};
|
|
2
2
|
//# sourceMappingURL=changes.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { 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: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '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\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '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\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,MAAwC,UACxC,OAAS,UAAAA,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBACtC,MAAsB,eAIf,MAAMC,UAA6FF,CAAwB,CACjIG,GAAW,GAEX,YACCC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,MAAMH,EAAQE,EAAWC,CAAM,EAE/B,MAAMC,EAAWC,GAChBA,EAAK,IACF,CACA,GAAGA,EACH,IAAKA,EAAK,IAAI,MAAWA,EAAK,GAC/B,EACC,OAEEC,EAASL,EAAW,OACpBM,EAAUN,EAAW,eACrBO,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGb,CAAW,IAAIY,CAAS,GAEnCE,EAAS,2BACTC,EAAY,CAAE,IAAKD,CAAO,EAEhCV,EAAO,SAAS,aAAaS,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOJ,GAA2B,CAC7G,MAAMO,EAAKP,EAAK,GAEhB,IAAIQ,EAAS,KAAK,MAAMR,EAAK,QAAU,MAAM,EACzCS,EAAQ,KAAK,MAAMT,EAAK,OAAS,MAAM,EAEvCQ,IAAQA,EAAST,EAAQS,CAAM,GAC/BC,IAAOA,EAAQV,EAAQU,CAAK,GAC5B,EAAAD,GAAQ,MAAQH,GAAUI,GAAO,MAAQJ,KAEzCE,IAAO,KAAO,KAAK,UAAU,SAAWE,EAC3C,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KACR,MAAO,KAAK,OAAOA,CAAK,CACzB,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAAUC,EAC1D,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOD,CAAM,EAC1B,MAAO,KAAK,OAAOC,CAAK,EACxB,QAASvB,EAAO,KAAKA,EAAO,KAAKsB,EAAQC,CAAK,CAAC,CAChD,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAChD,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOA,CAAM,EAC1B,MAAO,IACR,CAAC,EACH,CAAC,EAEDpB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBe,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BV,EAAO,IACpC,0BAA2BS,EAC3B,gBAAiB,QAClB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMP,EAAW,iBAAiBU,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMN,EAAW,iBAAiBU,CAAS,EAC3ClB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8Be,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQtB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAgB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD","names":["differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err"]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { Collection } from "mongodb";
|
|
1
2
|
import { differ } from "valleyed";
|
|
2
3
|
import { EquippedError } from "../../errors/index.mjs";
|
|
3
4
|
import { Instance } from "../../instance/index.mjs";
|
|
4
5
|
import { retry } from "../../utilities/index.mjs";
|
|
5
6
|
import { DbChange, TopicPrefix } from "../base/changes.mjs";
|
|
7
|
+
import * as core from "../base/core.mjs";
|
|
6
8
|
class MongoDbChange extends DbChange {
|
|
7
9
|
#started = false;
|
|
8
10
|
constructor(config, change, collection, callbacks, mapper) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport { 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: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '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\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '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\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,SAAS,kBAA+B;AACxC,SAAS,cAAc;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,mBAAmB;AACtC,YAAY,UAAU;AAIf,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,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IAC/B,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,SAAS;AACf,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,QAAQ,UAAU,OAAO,QAAQ,OAAQ;AAErD,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;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{AsyncLocalStorage as h}from"node:async_hooks";import{MongoClient as S,ObjectId as g}from"mongodb";import{EquippedError as b}from "../../errors/index.min.mjs";import{Instance as w}from "../../instance/index.min.mjs";import{Db as A}from "../base/db.min.mjs";import{MongoDbChange as D}from "./changes.min.mjs";import{parseMongodbQueryParams as C}from "./query.min.mjs";const
|
|
1
|
+
import{AsyncLocalStorage as h}from"node:async_hooks";import{MongoClient as S,ObjectId as g}from"mongodb";import{EquippedError as b}from "../../errors/index.min.mjs";import{Instance as w}from "../../instance/index.min.mjs";import"../base/core";import{Db as A}from "../base/db.min.mjs";import{MongoDbChange as D}from "./changes.min.mjs";import{parseMongodbQueryParams as C}from "./query.min.mjs";const p="_id",l=new h(void 0);class F extends A{constructor(o,a){super(a);this.mongoConfig=o;this.client=new S(o.uri),w.on("start",async()=>{await this.client.connect();const m=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(m).map(async([d,u])=>{const i=this.client.db(d),e=await i.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?n.options?.changeStreamPreAndPostImages?.enabled!==y.changeStreamPreAndPostImages.enabled&&await i.command({collMod:t,...y}):await i.createCollection(t,y)})}))},3),w.on("close",async()=>this.client.close(),1)}client;#e=[];async session(o){return l.getStore()?o():this.client.withSession(async a=>l.run(a,o))}id(){return new g}use(o){const a=this.getScopedDb(o.db);return this.#e.push({db:a,col:o.col}),this.#t(o,this.client.db(a).collection(o.col))}#t(o,a){async function m(e){const n=(Array.isArray(e)?e:[e]).map(r=>o.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[p]:t,...o.options?.skipAudit?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!o.options?.skipAudit?{updatedAt:t.getTime()}:{}}}}const u=this,i={config:o,extras:{collection:a},query:async e=>{const t=await C(a,e);return{...t,results:await m(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return m(s)},findOne:async e=>(await i.findMany(e,{limit:1})).at(0)??null,findById:async e=>await i.findOne({[p]:e}),insertMany:async(e,t={})=>{const n=t.getTime?.()??new Date,r=e.map((c,f)=>y(c,t.makeId?.(f)??new g().toString(),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await i.findById(c[p])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await i.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=l.getStore(),f=(await a.find(e,{session:s,projection:{[p]:1}}).toArray()).map(I=>I[p]),M={[p]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),i.findMany(M)},updateOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?m(s):null},updateById:async(e,t,n={})=>await i.updateOne({[p]:e},t,n),upsertOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,n.makeId?.()??new g().toString(),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return m(s)},deleteMany:async(e,t={})=>{const n=await i.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?m(t):null},deleteById:async e=>await i.deleteOne({[p]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=t.getTime?.()??new Date;e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,s.makeId?.(c)??new g().toString(),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,s.makeId?.(c)??new g().toString(),r,!0)});break;default:throw new b("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:l.getStore()})},watch(e){return u.config.changes||w.crash(new b("Db changes are not enabled in the configuration.",{config:o})),new D(u.mongoConfig,u.config.changes,a,e,o.mapper)}};return i}}export{F as MongoDb};
|
|
2
2
|
//# sourceMappingURL=db.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { ClientSession, Collection, CollectionInfo, MongoClient, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport { DbConfig } from '../base/types'\nimport { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\treturn this.client.withSession(async (session) => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\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\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":["AsyncLocalStorage","MongoClient","ObjectId","EquippedError","Instance","Db","MongoDbChange","parseMongodbQueryParams","idKey","sessionStore","MongoDb","mongoConfig","dbConfig","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","filter","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","callbacks"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { ClientSession, Collection, type CollectionInfo, MongoClient, ObjectId, type OptionalUnlessRequiredId, type SortDirection, type WithId } from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\treturn this.client.withSession(async (session) => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\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\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":["AsyncLocalStorage","MongoClient","ObjectId","EquippedError","Instance","Db","MongoDbChange","parseMongodbQueryParams","idKey","sessionStore","MongoDb","mongoConfig","dbConfig","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","filter","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","callbacks"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
-
import { MongoClient, ObjectId } from "mongodb";
|
|
2
|
+
import { ClientSession, Collection, MongoClient, ObjectId } from "mongodb";
|
|
3
3
|
import { EquippedError } from "../../errors/index.mjs";
|
|
4
4
|
import { Instance } from "../../instance/index.mjs";
|
|
5
|
+
import * as core from "../base/core.mjs";
|
|
5
6
|
import { Db } from "../base/db.mjs";
|
|
6
7
|
import { MongoDbChange } from "./changes.mjs";
|
|
7
8
|
import { parseMongodbQueryParams } from "./query.mjs";
|