equipped 5.0.31 → 5.0.32
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 +2 -2
- 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/audit/index.cjs +2 -1
- package/dist/cjs/audit/index.cjs.map +1 -1
- package/dist/cjs/audit/index.min.cjs +1 -1
- package/dist/cjs/audit/index.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/audit/index.min.mjs +1 -1
- package/dist/esm/audit/index.min.mjs.map +1 -1
- package/dist/esm/audit/index.mjs +3 -2
- package/dist/esm/audit/index.mjs.map +1 -1
- package/dist/types/audit/events.js +2 -2
- package/dist/types/audit/index.d.ts +13 -5
- package/dist/types/audit/index.js +3 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [5.0.32](https://github.com/kevinand11/equipped/compare/v5.0.31...v5.0.32) (2025-10-02)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* extend defineHandler type ([4011003](https://github.com/kevinand11/equipped/commit/40110036366fb11fa69dd430ec346cf77c5defe2))
|
|
11
|
+
|
|
5
12
|
### [5.0.31](https://github.com/kevinand11/equipped/compare/v5.0.30...v5.0.31) (2025-10-02)
|
|
6
13
|
|
|
7
14
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs"],"names":[],"mappings":"AAAA,qGAAqB;AACrB,oCAA+C;AAE/C,4CAAuD;AACvD,gDAA8B;
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs","sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<T extends string, P, R> = {\n\ttype: T\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\nexport type EventDoc<T extends string, P> = {\n\tkey: string\n\ttype: T\n\tts: number\n\tpayload: P\n\tmode: 'sync' | 'async'\n\tstatus: 'pending' | 'processing' | 'done' | 'failed'\n\terror: string | null\n\tstartedAt: number | null\n\tcompletedAt: number | null\n}\n\nexport class EventAudit<E extends Record<string, EventDefinition<string, any, any>>> {\n\tprivate table: Table<any, EventDoc<string, any>, EventDoc<string, any> & { toJSON: () => Record<string, unknown> }, any>\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t\tprivate handlers: E,\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\t\tfor (const key in handlers) v.compile(handlers[key]!.pipe)\n\t}\n\n\tasync #createEvent<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>, mode: 'sync' | 'async') {\n\t\tconst handler = this.handlers[type]\n\t\tif (!handler) throw new EquippedError('audit handler not found', { type, payload, mode })\n\n\t\tconst validPayload = v.assert(handler.pipe, payload)\n\t\tconst key = this.createId()\n\t\tconst now = new Date()\n\n\t\tconst audit = await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t\tmode,\n\t\t\t\tts: now.getTime(),\n\t\t\t\tpayload: validPayload,\n\t\t\t\tstatus: 'pending',\n\t\t\t\terror: null,\n\t\t\t\tstartedAt: null,\n\t\t\t\tcompletedAt: null,\n\t\t\t},\n\t\t\t{ getTime: () => now, makeId: () => key },\n\t\t)\n\t\treturn audit as unknown as EventDoc<K, PipeOutput<E[K]['pipe']>>\n\t}\n\n\tasync #processEvent<K extends keyof E & string>(event: EventDoc<K, PipeOutput<E[K]['pipe']>>) {\n\t\ttype HandlerResult = E[K] extends EventDefinition<string, any, infer R> ? R : never\n\t\treturn this.db.session(async () => {\n\t\t\tconst handler = this.handlers[event.type]\n\t\t\tif (!handler) throw new EquippedError('audit handler 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: { status: 'processing', startedAt: Date.now(), completedAt: null, error: null } },\n\t\t\t\t)\n\t\t\t\tconst result = await handler.handle(event.payload, {\n\t\t\t\t\tidempotencyKey: event.key.toString(),\n\t\t\t\t\tidempotencyDate: new Date(event.ts),\n\t\t\t\t})\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'done', completedAt: Date.now() } })\n\t\t\t\treturn result as HandlerResult\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'failed', error: message, completedAt: Date.now() } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'sync')\n\t\treturn this.#processEvent(event)\n\t}\n\n\tasync createAsync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'async')\n\t\tthis.#processEvent(event).catch(() => {})\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)\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)\n\t}\n\n\tcreateId() {\n\t\treturn ulid()\n\t}\n\n\tstatic defineHandler<T extends string, P, R>(type: T, def: Omit<EventDefinition<T, P, R>, 'type'>) {\n\t\treturn { ...def, type }\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _ulid = require('ulid');var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');class
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _ulid = require('ulid');var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');class v{constructor(t,e,n){this.db=t;this.handlers=n;this.table=t.use({db:e,col:"__audits",mapper:s=>({...s,toJSON:()=>s}),options:{skipAudit:!0}});for(const s in n)_valleyed.v.compile(n[s].pipe)}async#e(t,e,n){const s=this.handlers[t];if(!s)throw new (0, _indexmincjs3.EquippedError)("audit handler not found",{type:t,payload:e,mode:n});const p=_valleyed.v.assert(s.pipe,e),a=this.createId(),r=new Date;return await this.table.insertOne({key:a,type:t,mode:n,ts:r.getTime(),payload:p,status:"pending",error:null,startedAt:null,completedAt:null},{getTime:()=>r,makeId:()=>a})}async#t(t){return this.db.session(async()=>{const e=this.handlers[t.type];if(!e)throw new (0, _indexmincjs3.EquippedError)("audit handler not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{status:"processing",startedAt:Date.now(),completedAt:null,error:null}});const n=await e.handle(t.payload,{idempotencyKey:t.key.toString(),idempotencyDate:new Date(t.ts)});return await this.table.updateOne({key:t.key},{$set:{status:"done",completedAt:Date.now()}}),n}catch(n){const s=n instanceof Error?n.message:String(n);throw await this.table.updateOne({key:t.key},{$set:{status:"failed",error:s,completedAt:Date.now()}}),n}})}async createSync(t,e){const n=await this.#e(t,e,"sync");return this.#t(n)}async createAsync(t,e){const n=await this.#e(t,e,"async");this.#t(n).catch(()=>{})}async replay(t){const{results:e}=await this.table.query(_indexmincjs.wrapQueryParams.call(void 0, {where:[...t?[{field:"ts",value:t.getTime(),condition:_indexmincjs.Conditions.gte}]:[]],sort:[{field:"ts",desc:!1}],all:!0}));for(const n of e)await this.#t(n)}async rerun(t){const e=await this.table.findOne({key:t});if(!e)throw new (0, _indexmincjs3.EquippedError)("audit event not found",{key:t});await this.#t(e)}createId(){return _ulid.ulid.call(void 0, )}static defineHandler(t,e){return{...e,type:t}}}exports.EventAudit = v;
|
|
2
2
|
//# sourceMappingURL=events.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"names":["db","handlers","model","key","#createEvent","mode","handler","type","EquippedError","v","now","validPayload","event","err","message","payload","#processEvent","from","events","Conditions","ulid"],"mappings":"AAAA,qGAAqB,oCAC0B,mDAGtC,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"names":["db","handlers","model","key","#createEvent","mode","handler","type","EquippedError","v","now","validPayload","event","err","message","payload","#processEvent","from","events","Conditions","ulid","def"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.min.cjs","sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<T extends string, P, R> = {\n\ttype: T\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\nexport type EventDoc<T extends string, P> = {\n\tkey: string\n\ttype: T\n\tts: number\n\tpayload: P\n\tmode: 'sync' | 'async'\n\tstatus: 'pending' | 'processing' | 'done' | 'failed'\n\terror: string | null\n\tstartedAt: number | null\n\tcompletedAt: number | null\n}\n\nexport class EventAudit<E extends Record<string, EventDefinition<string, any, any>>> {\n\tprivate table: Table<any, EventDoc<string, any>, EventDoc<string, any> & { toJSON: () => Record<string, unknown> }, any>\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t\tprivate handlers: E,\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\t\tfor (const key in handlers) v.compile(handlers[key]!.pipe)\n\t}\n\n\tasync #createEvent<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>, mode: 'sync' | 'async') {\n\t\tconst handler = this.handlers[type]\n\t\tif (!handler) throw new EquippedError('audit handler not found', { type, payload, mode })\n\n\t\tconst validPayload = v.assert(handler.pipe, payload)\n\t\tconst key = this.createId()\n\t\tconst now = new Date()\n\n\t\tconst audit = await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t\tmode,\n\t\t\t\tts: now.getTime(),\n\t\t\t\tpayload: validPayload,\n\t\t\t\tstatus: 'pending',\n\t\t\t\terror: null,\n\t\t\t\tstartedAt: null,\n\t\t\t\tcompletedAt: null,\n\t\t\t},\n\t\t\t{ getTime: () => now, makeId: () => key },\n\t\t)\n\t\treturn audit as unknown as EventDoc<K, PipeOutput<E[K]['pipe']>>\n\t}\n\n\tasync #processEvent<K extends keyof E & string>(event: EventDoc<K, PipeOutput<E[K]['pipe']>>) {\n\t\ttype HandlerResult = E[K] extends EventDefinition<string, any, infer R> ? R : never\n\t\treturn this.db.session(async () => {\n\t\t\tconst handler = this.handlers[event.type]\n\t\t\tif (!handler) throw new EquippedError('audit handler 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: { status: 'processing', startedAt: Date.now(), completedAt: null, error: null } },\n\t\t\t\t)\n\t\t\t\tconst result = await handler.handle(event.payload, {\n\t\t\t\t\tidempotencyKey: event.key.toString(),\n\t\t\t\t\tidempotencyDate: new Date(event.ts),\n\t\t\t\t})\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'done', completedAt: Date.now() } })\n\t\t\t\treturn result as HandlerResult\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'failed', error: message, completedAt: Date.now() } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'sync')\n\t\treturn this.#processEvent(event)\n\t}\n\n\tasync createAsync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'async')\n\t\tthis.#processEvent(event).catch(() => {})\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)\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)\n\t}\n\n\tcreateId() {\n\t\treturn ulid()\n\t}\n\n\tstatic defineHandler<T extends string, P, R>(type: T, def: Omit<EventDefinition<T, P, R>, 'type'>) {\n\t\treturn { ...def, type }\n\t}\n}\n"]}
|
package/dist/cjs/audit/index.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _eventscjs = require('./events.cjs');
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
exports.EventAudit = _eventscjs.EventAudit; exports.EventDefinition = _eventscjs.EventDefinition;
|
|
5
6
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/index.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/index.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs"],"names":[],"mappings":"AAAA,kHAA4C;ACC5C;AACE;AACA;AACF,iGAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.cjs","sourcesContent":["export { EventAudit, EventDefinition } from './events'\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _eventsmincjs = require('./events.min.cjs');exports.EventAudit = _eventsmincjs.EventAudit;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _eventsmincjs = require('./events.min.cjs');exports.EventAudit = _eventsmincjs.EventAudit; exports.EventDefinition = _eventsmincjs.EventDefinition;
|
|
2
2
|
//# sourceMappingURL=index.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,yHAA4C,uGAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/index.min.cjs","sourcesContent":["export { EventAudit, EventDefinition } from './events'\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ulid as d}from"ulid";import{v as o}from"valleyed";import{Conditions as c,wrapQueryParams as u}from "../dbs/index.min.mjs";import{EquippedError as
|
|
1
|
+
import{ulid as d}from"ulid";import{v as o}from"valleyed";import{Conditions as c,wrapQueryParams as u}from "../dbs/index.min.mjs";import{EquippedError as i}from "../errors/index.min.mjs";class v{constructor(t,e,n){this.db=t;this.handlers=n;this.table=t.use({db:e,col:"__audits",mapper:s=>({...s,toJSON:()=>s}),options:{skipAudit:!0}});for(const s in n)o.compile(n[s].pipe)}table;async#e(t,e,n){const s=this.handlers[t];if(!s)throw new i("audit handler not found",{type:t,payload:e,mode:n});const p=o.assert(s.pipe,e),a=this.createId(),r=new Date;return await this.table.insertOne({key:a,type:t,mode:n,ts:r.getTime(),payload:p,status:"pending",error:null,startedAt:null,completedAt:null},{getTime:()=>r,makeId:()=>a})}async#t(t){return this.db.session(async()=>{const e=this.handlers[t.type];if(!e)throw new i("audit handler not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{status:"processing",startedAt:Date.now(),completedAt:null,error:null}});const n=await e.handle(t.payload,{idempotencyKey:t.key.toString(),idempotencyDate:new Date(t.ts)});return await this.table.updateOne({key:t.key},{$set:{status:"done",completedAt:Date.now()}}),n}catch(n){const s=n instanceof Error?n.message:String(n);throw await this.table.updateOne({key:t.key},{$set:{status:"failed",error:s,completedAt:Date.now()}}),n}})}async createSync(t,e){const n=await this.#e(t,e,"sync");return this.#t(n)}async createAsync(t,e){const n=await this.#e(t,e,"async");this.#t(n).catch(()=>{})}async replay(t){const{results:e}=await this.table.query(u({where:[...t?[{field:"ts",value:t.getTime(),condition:c.gte}]:[]],sort:[{field:"ts",desc:!1}],all:!0}));for(const n of e)await this.#t(n)}async rerun(t){const e=await this.table.findOne({key:t});if(!e)throw new i("audit event not found",{key:t});await this.#t(e)}createId(){return d()}static defineHandler(t,e){return{...e,type:t}}}export{v as EventAudit};
|
|
2
2
|
//# sourceMappingURL=events.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<P, R> = {\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<T extends string, P, R> = {\n\ttype: T\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\nexport type EventDoc<T extends string, P> = {\n\tkey: string\n\ttype: T\n\tts: number\n\tpayload: P\n\tmode: 'sync' | 'async'\n\tstatus: 'pending' | 'processing' | 'done' | 'failed'\n\terror: string | null\n\tstartedAt: number | null\n\tcompletedAt: number | null\n}\n\nexport class EventAudit<E extends Record<string, EventDefinition<string, any, any>>> {\n\tprivate table: Table<any, EventDoc<string, any>, EventDoc<string, any> & { toJSON: () => Record<string, unknown> }, any>\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t\tprivate handlers: E,\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\t\tfor (const key in handlers) v.compile(handlers[key]!.pipe)\n\t}\n\n\tasync #createEvent<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>, mode: 'sync' | 'async') {\n\t\tconst handler = this.handlers[type]\n\t\tif (!handler) throw new EquippedError('audit handler not found', { type, payload, mode })\n\n\t\tconst validPayload = v.assert(handler.pipe, payload)\n\t\tconst key = this.createId()\n\t\tconst now = new Date()\n\n\t\tconst audit = await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t\tmode,\n\t\t\t\tts: now.getTime(),\n\t\t\t\tpayload: validPayload,\n\t\t\t\tstatus: 'pending',\n\t\t\t\terror: null,\n\t\t\t\tstartedAt: null,\n\t\t\t\tcompletedAt: null,\n\t\t\t},\n\t\t\t{ getTime: () => now, makeId: () => key },\n\t\t)\n\t\treturn audit as unknown as EventDoc<K, PipeOutput<E[K]['pipe']>>\n\t}\n\n\tasync #processEvent<K extends keyof E & string>(event: EventDoc<K, PipeOutput<E[K]['pipe']>>) {\n\t\ttype HandlerResult = E[K] extends EventDefinition<string, any, infer R> ? R : never\n\t\treturn this.db.session(async () => {\n\t\t\tconst handler = this.handlers[event.type]\n\t\t\tif (!handler) throw new EquippedError('audit handler 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: { status: 'processing', startedAt: Date.now(), completedAt: null, error: null } },\n\t\t\t\t)\n\t\t\t\tconst result = await handler.handle(event.payload, {\n\t\t\t\t\tidempotencyKey: event.key.toString(),\n\t\t\t\t\tidempotencyDate: new Date(event.ts),\n\t\t\t\t})\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'done', completedAt: Date.now() } })\n\t\t\t\treturn result as HandlerResult\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'failed', error: message, completedAt: Date.now() } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'sync')\n\t\treturn this.#processEvent(event)\n\t}\n\n\tasync createAsync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'async')\n\t\tthis.#processEvent(event).catch(() => {})\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)\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)\n\t}\n\n\tcreateId() {\n\t\treturn ulid()\n\t}\n\n\tstatic defineHandler<T extends string, P, R>(type: T, def: Omit<EventDefinition<T, P, R>, 'type'>) {\n\t\treturn { ...def, type }\n\t}\n}\n"],"mappings":"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","names":["ulid","v","Conditions","wrapQueryParams","EquippedError","EventAudit","db","dbName","handlers","model","key","#createEvent","type","payload","mode","handler","validPayload","now","#processEvent","event","result","err","message","from","events","def"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<P, R> = {\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"sourcesContent":["import { ulid } from 'ulid'\nimport { Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Conditions, Db, Table, wrapQueryParams } from '../dbs'\nimport { EquippedError } from '../errors'\n\nexport type EventDefinition<T extends string, P, R> = {\n\ttype: T\n\tpipe: Pipe<any, P>\n\thandle: (payload: P, context: { idempotencyKey: string; idempotencyDate: Date }) => Promise<R>\n}\n\nexport type EventDoc<T extends string, P> = {\n\tkey: string\n\ttype: T\n\tts: number\n\tpayload: P\n\tmode: 'sync' | 'async'\n\tstatus: 'pending' | 'processing' | 'done' | 'failed'\n\terror: string | null\n\tstartedAt: number | null\n\tcompletedAt: number | null\n}\n\nexport class EventAudit<E extends Record<string, EventDefinition<string, any, any>>> {\n\tprivate table: Table<any, EventDoc<string, any>, EventDoc<string, any> & { toJSON: () => Record<string, unknown> }, any>\n\n\tconstructor(\n\t\tprivate db: Db<any>,\n\t\tdbName: string,\n\t\tprivate handlers: E,\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\t\tfor (const key in handlers) v.compile(handlers[key]!.pipe)\n\t}\n\n\tasync #createEvent<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>, mode: 'sync' | 'async') {\n\t\tconst handler = this.handlers[type]\n\t\tif (!handler) throw new EquippedError('audit handler not found', { type, payload, mode })\n\n\t\tconst validPayload = v.assert(handler.pipe, payload)\n\t\tconst key = this.createId()\n\t\tconst now = new Date()\n\n\t\tconst audit = await this.table.insertOne(\n\t\t\t{\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t\tmode,\n\t\t\t\tts: now.getTime(),\n\t\t\t\tpayload: validPayload,\n\t\t\t\tstatus: 'pending',\n\t\t\t\terror: null,\n\t\t\t\tstartedAt: null,\n\t\t\t\tcompletedAt: null,\n\t\t\t},\n\t\t\t{ getTime: () => now, makeId: () => key },\n\t\t)\n\t\treturn audit as unknown as EventDoc<K, PipeOutput<E[K]['pipe']>>\n\t}\n\n\tasync #processEvent<K extends keyof E & string>(event: EventDoc<K, PipeOutput<E[K]['pipe']>>) {\n\t\ttype HandlerResult = E[K] extends EventDefinition<string, any, infer R> ? R : never\n\t\treturn this.db.session(async () => {\n\t\t\tconst handler = this.handlers[event.type]\n\t\t\tif (!handler) throw new EquippedError('audit handler 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: { status: 'processing', startedAt: Date.now(), completedAt: null, error: null } },\n\t\t\t\t)\n\t\t\t\tconst result = await handler.handle(event.payload, {\n\t\t\t\t\tidempotencyKey: event.key.toString(),\n\t\t\t\t\tidempotencyDate: new Date(event.ts),\n\t\t\t\t})\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'done', completedAt: Date.now() } })\n\t\t\t\treturn result as HandlerResult\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\t\tawait this.table.updateOne({ key: event.key }, { $set: { status: 'failed', error: message, completedAt: Date.now() } })\n\t\t\t\tthrow err\n\t\t\t}\n\t\t})\n\t}\n\n\tasync createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'sync')\n\t\treturn this.#processEvent(event)\n\t}\n\n\tasync createAsync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>) {\n\t\tconst event = await this.#createEvent(type, payload, 'async')\n\t\tthis.#processEvent(event).catch(() => {})\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)\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)\n\t}\n\n\tcreateId() {\n\t\treturn ulid()\n\t}\n\n\tstatic defineHandler<T extends string, P, R>(type: T, def: Omit<EventDefinition<T, P, R>, 'type'>) {\n\t\treturn { ...def, type }\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventAudit as
|
|
1
|
+
import{EventAudit as i,EventDefinition as n}from "./events.min.mjs";export{i as EventAudit,n as EventDefinition};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/index.ts"],"sourcesContent":["export { EventAudit } from './events'\n"],"mappings":"AAAA,OAAS,cAAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/index.ts"],"sourcesContent":["export { EventAudit, EventDefinition } from './events'\n"],"mappings":"AAAA,OAAS,cAAAA,EAAY,mBAAAC,MAAuB","names":["EventAudit","EventDefinition"]}
|
package/dist/esm/audit/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/index.ts"],"sourcesContent":["export { EventAudit } from './events'\n"],"mappings":"AAAA,SAAS,
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/index.ts"],"sourcesContent":["export { EventAudit, EventDefinition } from './events'\n"],"mappings":"AAAA,SAAS,YAAY,uBAAuB;","names":[]}
|
|
@@ -6,25 +6,33 @@ import '../kafka-zsC3c8ar.js';
|
|
|
6
6
|
import '../overrides-6Hxg764S.js';
|
|
7
7
|
import '../base-CfeyC14V.js';
|
|
8
8
|
|
|
9
|
-
type EventDefinition<P, R> = {
|
|
9
|
+
type EventDefinition<T extends string, P, R> = {
|
|
10
|
+
type: T;
|
|
10
11
|
pipe: Pipe<any, P>;
|
|
11
12
|
handle: (payload: P, context: {
|
|
12
13
|
idempotencyKey: string;
|
|
13
14
|
idempotencyDate: Date;
|
|
14
15
|
}) => Promise<R>;
|
|
15
16
|
};
|
|
16
|
-
declare class EventAudit<E extends Record<string, EventDefinition<any, any>>> {
|
|
17
|
+
declare class EventAudit<E extends Record<string, EventDefinition<string, any, any>>> {
|
|
17
18
|
#private;
|
|
18
19
|
private db;
|
|
19
20
|
private handlers;
|
|
20
21
|
private table;
|
|
21
22
|
constructor(db: Db<any>, dbName: string, handlers: E);
|
|
22
|
-
createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>): Promise<E[K] extends EventDefinition<any, infer R> ? R : never>;
|
|
23
|
+
createSync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>): Promise<E[K] extends EventDefinition<string, any, infer R> ? R : never>;
|
|
23
24
|
createAsync<K extends keyof E & string>(type: K, payload: PipeInput<E[K]['pipe']>): Promise<void>;
|
|
24
25
|
replay(from?: Date): Promise<void>;
|
|
25
26
|
rerun(key: string): Promise<void>;
|
|
26
27
|
createId(): string;
|
|
27
|
-
static defineHandler<P, R>(def: EventDefinition<P, R>):
|
|
28
|
+
static defineHandler<T extends string, P, R>(type: T, def: Omit<EventDefinition<T, P, R>, 'type'>): {
|
|
29
|
+
type: T;
|
|
30
|
+
pipe: Pipe<any, P>;
|
|
31
|
+
handle: (payload: P, context: {
|
|
32
|
+
idempotencyKey: string;
|
|
33
|
+
idempotencyDate: Date;
|
|
34
|
+
}) => Promise<R>;
|
|
35
|
+
};
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
export { EventAudit };
|
|
38
|
+
export { EventAudit, type EventDefinition };
|