equipped 5.0.35 → 5.1.0
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 +2 -0
- package/dist/cjs/audit/events.cjs +43 -42
- 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/instance/index.cjs +4 -4
- package/dist/cjs/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs +3 -3
- package/dist/cjs/instance/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 +42 -41
- package/dist/esm/audit/events.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/types/audit/events.js +42 -41
- package/dist/types/audit/index.d.ts +6 -6
- package/dist/types/errors/index.d.ts +4 -4
- package/dist/types/{fastify-fV8eHFNl.d.ts → fastify-gQShnQHf.d.ts} +1 -1
- package/dist/types/index.d.ts +6 -6
- package/dist/types/instance/index.d.ts +4 -4
- package/dist/types/instance/index.js +3 -3
- package/dist/types/server/index.d.ts +3 -3
- package/dist/types/{validationError-Ztplzq8d.d.ts → validationError--mhIgeX-.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +2 -2
- package/package.json +1 -1
- package/dist/types/{requests-HlupG2_s.d.ts → requestError-ClqSpE4c.d.ts} +22 -22
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
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.1.0](https://github.com/kevinand11/equipped/compare/v5.0.35...v5.1.0) (2025-10-04)
|
|
6
|
+
|
|
5
7
|
### [5.0.35](https://github.com/kevinand11/equipped/compare/v5.0.34...v5.0.35) (2025-10-03)
|
|
6
8
|
|
|
7
9
|
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _valleyed = require('valleyed');
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');
|
|
2
2
|
var _indexcjs = require('../dbs/index.cjs');
|
|
3
3
|
var _indexcjs3 = require('../errors/index.cjs');
|
|
4
4
|
var _indexcjs5 = require('../instance/index.cjs');
|
|
5
|
+
function createStep(step) {
|
|
6
|
+
return step;
|
|
7
|
+
}
|
|
5
8
|
class EventAudit {
|
|
6
9
|
constructor(db, dbName) {;EventAudit.prototype.__init.call(this);
|
|
7
10
|
this.db = db;
|
|
@@ -13,48 +16,53 @@ class EventAudit {
|
|
|
13
16
|
});
|
|
14
17
|
}
|
|
15
18
|
|
|
16
|
-
__init() {this.
|
|
17
|
-
async #createEvent(
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
19
|
+
__init() {this.definitions = {}}
|
|
20
|
+
async #createEvent(name, payload, context) {
|
|
21
|
+
const def = this.definitions[name];
|
|
22
|
+
if (!def) throw new (0, _indexcjs3.EquippedError)("audit definition not found", { name, payload });
|
|
23
|
+
const validBody = _valleyed.v.assert(def.pipe, payload);
|
|
24
|
+
const ts = _nullishCoalesce(context.at, () => ( /* @__PURE__ */ new Date()));
|
|
25
|
+
const key = _indexcjs5.Instance.createId(ts);
|
|
23
26
|
return await this.table.insertOne(
|
|
24
27
|
{
|
|
25
28
|
key,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
by: _nullishCoalesce(context.by, () => ( null)),
|
|
32
|
-
error: null,
|
|
33
|
-
startedAt: null,
|
|
34
|
-
completedAt: null
|
|
29
|
+
name,
|
|
30
|
+
ts: ts.getTime(),
|
|
31
|
+
body: validBody,
|
|
32
|
+
by: context.by,
|
|
33
|
+
steps: []
|
|
35
34
|
},
|
|
36
|
-
{ getTime: () =>
|
|
35
|
+
{ getTime: () => ts, makeId: () => key }
|
|
37
36
|
);
|
|
38
37
|
}
|
|
39
|
-
async #processEvent(event) {
|
|
38
|
+
async #processEvent(event, callbackWait) {
|
|
40
39
|
return this.db.session(async () => {
|
|
41
|
-
const
|
|
42
|
-
if (!
|
|
40
|
+
const def = this.definitions[event.name];
|
|
41
|
+
if (!def) throw new (0, _indexcjs3.EquippedError)("audit definition not found", { event });
|
|
43
42
|
try {
|
|
44
43
|
await this.table.updateOne(
|
|
45
44
|
{ key: event.key },
|
|
46
|
-
{ $set: { status: "
|
|
45
|
+
{ $set: { steps: [createStep({ status: "start", ts: Date.now() })] } }
|
|
47
46
|
);
|
|
48
|
-
const
|
|
47
|
+
const context = {
|
|
49
48
|
key: event.key,
|
|
50
49
|
by: event.by,
|
|
51
50
|
date: new Date(event.ts)
|
|
51
|
+
};
|
|
52
|
+
const result = await def.handle(event.body, context);
|
|
53
|
+
await _optionalChain([def, 'access', _ => _.sync, 'optionalCall', _2 => _2(result, event.body, context)]);
|
|
54
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "sync", ts: Date.now() }) } });
|
|
55
|
+
const asyncHandle = Promise.try(() => _optionalChain([def, 'access', _3 => _3.async, 'optionalCall', _4 => _4(result, event.body, context)])).then(async () => {
|
|
56
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "async", ts: Date.now() }) } });
|
|
57
|
+
}).catch(async (err) => {
|
|
58
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
59
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
52
60
|
});
|
|
53
|
-
|
|
61
|
+
if (callbackWait) await asyncHandle;
|
|
54
62
|
return result;
|
|
55
63
|
} catch (err) {
|
|
56
|
-
const
|
|
57
|
-
await this.table.updateOne({ key: event.key }, { $
|
|
64
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
65
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
58
66
|
throw err;
|
|
59
67
|
}
|
|
60
68
|
});
|
|
@@ -67,27 +75,20 @@ class EventAudit {
|
|
|
67
75
|
all: true
|
|
68
76
|
})
|
|
69
77
|
);
|
|
70
|
-
for (const event of events) await this.#processEvent(event);
|
|
78
|
+
for (const event of events) await this.#processEvent(event, true);
|
|
71
79
|
}
|
|
72
80
|
async rerun(key) {
|
|
73
81
|
const event = await this.table.findOne({ key });
|
|
74
82
|
if (!event) throw new (0, _indexcjs3.EquippedError)("audit event not found", { key });
|
|
75
|
-
await this.#processEvent(event);
|
|
83
|
+
await this.#processEvent(event, true);
|
|
76
84
|
}
|
|
77
|
-
register(
|
|
78
|
-
if (this.
|
|
79
|
-
this.
|
|
80
|
-
_valleyed.v.compile(
|
|
81
|
-
return {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return this.#processEvent(event);
|
|
85
|
-
},
|
|
86
|
-
async: async (payload, context) => {
|
|
87
|
-
const event = await this.#createEvent(type, payload, "async", context);
|
|
88
|
-
this.#processEvent(event).catch(() => {
|
|
89
|
-
});
|
|
90
|
-
}
|
|
85
|
+
register(name, def) {
|
|
86
|
+
if (this.definitions[name]) throw new (0, _indexcjs3.EquippedError)(`${name} already has a registered handler`, {});
|
|
87
|
+
this.definitions[name] = def;
|
|
88
|
+
_valleyed.v.compile(def.pipe);
|
|
89
|
+
return async (payload, context) => {
|
|
90
|
+
const event = await this.#createEvent(name, payload, context);
|
|
91
|
+
return this.#processEvent(event, false);
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts","/home/runner/work/equipped/equipped/dist/cjs/audit/events.cjs"],"names":[],"mappings":"AAAA,
|
|
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 { 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\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\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 = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\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(async (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\tif (callbackWait) await 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",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');var _indexmincjs5 = require('../instance/index.min.cjs');class
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _valleyed = require('valleyed');var _indexmincjs = require('../dbs/index.min.cjs');var _indexmincjs3 = require('../errors/index.min.cjs');var _indexmincjs5 = require('../instance/index.min.cjs');function m(p){return p}class v{constructor(t,e){;v.prototype.__init.call(this);this.db=t;this.table=t.use({db:e,col:"__audits",mapper:n=>({...n,toJSON:()=>n}),options:{skipAudit:!0}})}__init() {this.definitions={}}async#e(t,e,n){const s=this.definitions[t];if(!s)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{name:t,payload:e});const i=_valleyed.v.assert(s.pipe,e),r=_nullishCoalesce(n.at, () => (new Date)),a=_indexmincjs5.Instance.createId(r);return await this.table.insertOne({key:a,name:t,ts:r.getTime(),body:i,by:n.by,steps:[]},{getTime:()=>r,makeId:()=>a})}async#t(t,e){return this.db.session(async()=>{const n=this.definitions[t.name];if(!n)throw new (0, _indexmincjs3.EquippedError)("audit definition not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{steps:[{status:"start",ts:Date.now()}]}});const s={key:t.key,by:t.by,date:new Date(t.ts)},i=await n.handle(t.body,s);await _optionalChain([n, 'access', _ => _.sync, 'optionalCall', _2 => _2(i,t.body,s)]),await this.table.updateOne({key:t.key},{$push:{steps:{status:"sync",ts:Date.now()}}});const r=Promise.try(()=>_optionalChain([n, 'access', _3 => _3.async, 'optionalCall', _4 => _4(i,t.body,s)])).then(async()=>{await this.table.updateOne({key:t.key},{$push:{steps:{status:"async",ts:Date.now()}}})}).catch(async a=>{const u=a instanceof Error?a.message:String(a);await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:u,ts:Date.now()}}})});return e&&await r,i}catch(s){const i=s instanceof Error?s.message:String(s);throw await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:i,ts:Date.now()}}}),s}})}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,!0)}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,!0)}register(t,e){if(this.definitions[t])throw new (0, _indexmincjs3.EquippedError)(`${t} already has a registered handler`,{});return this.definitions[t]=e,_valleyed.v.compile(e.pipe),async(n,s)=>{const i=await this.#e(t,n,s);return this.#t(i,!1)}}}exports.EventAudit = v;
|
|
2
2
|
//# sourceMappingURL=events.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/audit/events.ts"],"names":["model","
|
|
1
|
+
{"version":3,"sources":["../../../src/audit/events.ts"],"names":["db","model","#createEvent","name","def","EquippedError","payload","context","key","ts","validBody","#processEvent","callbackWait","event","result","asyncHandle","err","error","from","events","wrapQueryParams"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/audit/events.min.cjs","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\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\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 = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\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(async (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\tif (callbackWait) await 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"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _pino = require('pino'); var _pino2 = _interopRequireDefault(_pino);
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pino = require('pino'); var _pino2 = _interopRequireDefault(_pino);
|
|
2
2
|
var _ulid = require('ulid');
|
|
3
3
|
var _valleyed = require('valleyed');
|
|
4
|
+
var _indexcjs = require('../errors/index.cjs');
|
|
4
5
|
var _hookscjs = require('./hooks.cjs');
|
|
5
6
|
|
|
6
7
|
|
|
@@ -10,7 +11,6 @@ var _hookscjs = require('./hooks.cjs');
|
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
var _settingscjs = require('./settings.cjs');
|
|
13
|
-
var _indexcjs = require('../errors/index.cjs');
|
|
14
14
|
class Instance {
|
|
15
15
|
static #id;
|
|
16
16
|
static #instance;
|
|
@@ -127,8 +127,8 @@ ${settingsValidity.error.toString()}`, {
|
|
|
127
127
|
console.error(error);
|
|
128
128
|
process.exit(1);
|
|
129
129
|
}
|
|
130
|
-
static createId() {
|
|
131
|
-
return _ulid.ulid.call(void 0, );
|
|
130
|
+
static createId(time) {
|
|
131
|
+
return _ulid.ulid.call(void 0, _optionalChain([time, 'optionalAccess', _ => _.getTime, 'call', _2 => _2()]));
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts","/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts","/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs","sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends PipeInput<ReturnType<typeof cachePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T['type']]\n\t}\n\n\tcreateJobs<T extends PipeInput<ReturnType<typeof jobsPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T['type']]\n\t}\n\n\tcreateEventBus<T extends PipeInput<ReturnType<typeof eventBusPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T['type']]\n\t}\n\n\tcreateDb<T extends PipeInput<ReturnType<typeof dbPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T['db']['type']]\n\t}\n\n\tcreateServer<T extends PipeInput<ReturnType<typeof serverTypePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T['type']]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(time?: Date) {\n\t\treturn ulid(time?.getTime())\n\t}\n}\n",null]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _pino = require('pino'); var _pino2 = _interopRequireDefault(_pino);var _ulid = require('ulid');var _valleyed = require('valleyed');var
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pino = require('pino'); var _pino2 = _interopRequireDefault(_pino);var _ulid = require('ulid');var _valleyed = require('valleyed');var _indexmincjs = require('../errors/index.min.cjs');var _hooksmincjs = require('./hooks.min.cjs');var _settingsmincjs = require('./settings.min.cjs');class t{static#e;static#r;static#t= exports.Instance ={};constructor(e){t.#r=this,this.settings=Object.freeze(e),this.log=_pino2.default.call(void 0, {level:this.settings.log.level,serializers:{err:_pino2.default.stdSerializers.err,error:_pino2.default.stdSerializers.err,req:_pino2.default.stdSerializers.req,res:_pino2.default.stdSerializers.res},mixin:()=>({instanceId:t.#e})}),t.#s()}alias(e){if(t.#e!==void 0)return t.crash(new (0, _indexmincjs.EquippedError)("Instance already has an alias",{}));t.#e=e}get id(){return t.#e===void 0?t.crash(new (0, _indexmincjs.EquippedError)("Instance doesnt have an alias yet",{})):t.#e}getScopedName(e,r="."){return[this.settings.app.name,e].join(r)}createCache(e){return _valleyed.v.assert(_settingsmincjs.cachePipe.call(void 0, ),e)}createJobs(e){return _valleyed.v.assert(_settingsmincjs.jobsPipe.call(void 0, ),e)}createEventBus(e){return _valleyed.v.assert(_settingsmincjs.eventBusPipe.call(void 0, ),e)}createDb(e){return _valleyed.v.assert(_settingsmincjs.dbPipe.call(void 0, ),e)}createServer(e){return _valleyed.v.assert(_settingsmincjs.serverTypePipe.call(void 0, ),e)}async start(){try{await _hooksmincjs.runHooks.call(void 0, _nullishCoalesce(t.#t.setup, () => ([]))),await _hooksmincjs.runHooks.call(void 0, _nullishCoalesce(t.#t.start, () => ([])))}catch(e){t.crash(new (0, _indexmincjs.EquippedError)("Error starting instance",{},e))}}static envs(e){const r=_valleyed.v.validate(e,process.env);return r.valid||t.crash(new (0, _indexmincjs.EquippedError)(`Environment variables are not valid
|
|
2
|
+
${r.error.toString()}`,{messages:r.error.messages})),r.value}static create(e){if(t.#r)return t.crash(new (0, _indexmincjs.EquippedError)("Instance has been initialized already",{}));const r=_valleyed.v.validate(_settingsmincjs.instanceSettingsPipe.call(void 0, ),e);return r.valid||t.crash(new (0, _indexmincjs.EquippedError)(`Settings are not valid
|
|
3
|
+
${r.error.toString()}`,{messages:r.error.messages})),new t(r.value)}static get(){return t.#r?t.#r:t.crash(new (0, _indexmincjs.EquippedError)("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static on(e,r,n){t.#t[e]??=[],t.#t[e].push({cb:r,order:n})}static#s(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([r,n])=>{process.on(r,async()=>{await _hooksmincjs.runHooks.call(void 0, _nullishCoalesce(t.#t.close, () => ([])),()=>{}),process.exit(128+n)})})}static resolveBeforeCrash(e){const r=e();return t.on("close",async()=>await r,10),r}static crash(e){console.error(e),process.exit(1)}static createId(e){return _ulid.ulid.call(void 0, _optionalChain([e, 'optionalAccess', _ => _.getTime, 'call', _2 => _2()]))}}exports.Instance = t;
|
|
4
4
|
//# sourceMappingURL=index.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts"],"names":["#hooks","Instance","#instance","settings","pino","id","#id","EquippedError","input","v","cachePipe","jobsPipe","dbPipe","serverTypePipe","runHooks","error","envValidity"],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts"],"names":["#hooks","Instance","#instance","settings","pino","id","#id","EquippedError","input","v","cachePipe","jobsPipe","dbPipe","serverTypePipe","runHooks","error","envValidity"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.min.cjs","sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends PipeInput<ReturnType<typeof cachePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T['type']]\n\t}\n\n\tcreateJobs<T extends PipeInput<ReturnType<typeof jobsPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T['type']]\n\t}\n\n\tcreateEventBus<T extends PipeInput<ReturnType<typeof eventBusPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T['type']]\n\t}\n\n\tcreateDb<T extends PipeInput<ReturnType<typeof dbPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T['db']['type']]\n\t}\n\n\tcreateServer<T extends PipeInput<ReturnType<typeof serverTypePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T['type']]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(time?: Date) {\n\t\treturn ulid(time?.getTime())\n\t}\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as
|
|
1
|
+
import{v as y}from"valleyed";import{Conditions as c,wrapQueryParams as d}from "../dbs/index.min.mjs";import{EquippedError as o}from "../errors/index.min.mjs";import{Instance as w}from "../instance/index.min.mjs";function m(p){return p}class v{constructor(t,e){this.db=t;this.table=t.use({db:e,col:"__audits",mapper:n=>({...n,toJSON:()=>n}),options:{skipAudit:!0}})}table;definitions={};async#e(t,e,n){const s=this.definitions[t];if(!s)throw new o("audit definition not found",{name:t,payload:e});const i=y.assert(s.pipe,e),r=n.at??new Date,a=w.createId(r);return await this.table.insertOne({key:a,name:t,ts:r.getTime(),body:i,by:n.by,steps:[]},{getTime:()=>r,makeId:()=>a})}async#t(t,e){return this.db.session(async()=>{const n=this.definitions[t.name];if(!n)throw new o("audit definition not found",{event:t});try{await this.table.updateOne({key:t.key},{$set:{steps:[{status:"start",ts:Date.now()}]}});const s={key:t.key,by:t.by,date:new Date(t.ts)},i=await n.handle(t.body,s);await n.sync?.(i,t.body,s),await this.table.updateOne({key:t.key},{$push:{steps:{status:"sync",ts:Date.now()}}});const r=Promise.try(()=>n.async?.(i,t.body,s)).then(async()=>{await this.table.updateOne({key:t.key},{$push:{steps:{status:"async",ts:Date.now()}}})}).catch(async a=>{const u=a instanceof Error?a.message:String(a);await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:u,ts:Date.now()}}})});return e&&await r,i}catch(s){const i=s instanceof Error?s.message:String(s);throw await this.table.updateOne({key:t.key},{$push:{steps:{status:"error",error:i,ts:Date.now()}}}),s}})}async replay(t){const{results:e}=await this.table.query(d({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,!0)}async rerun(t){const e=await this.table.findOne({key:t});if(!e)throw new o("audit event not found",{key:t});await this.#t(e,!0)}register(t,e){if(this.definitions[t])throw new o(`${t} already has a registered handler`,{});return this.definitions[t]=e,y.compile(e.pipe),async(n,s)=>{const i=await this.#e(t,n,s);return this.#t(i,!1)}}}export{v as EventAudit};
|
|
2
2
|
//# sourceMappingURL=events.min.mjs.map
|
|
@@ -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}\n\nexport type EventContext = {\n\tkey: string\n\tby: string |
|
|
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\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\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 = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\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(async (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\tif (callbackWait) await 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","#createEvent","name","payload","context","def","validBody","ts","key","#processEvent","event","callbackWait","result","asyncHandle","err","error","from","events"]}
|
|
@@ -2,6 +2,9 @@ import { v } from "valleyed";
|
|
|
2
2
|
import { Conditions, wrapQueryParams } from "../dbs/index.mjs";
|
|
3
3
|
import { EquippedError } from "../errors/index.mjs";
|
|
4
4
|
import { Instance } from "../instance/index.mjs";
|
|
5
|
+
function createStep(step) {
|
|
6
|
+
return step;
|
|
7
|
+
}
|
|
5
8
|
class EventAudit {
|
|
6
9
|
constructor(db, dbName) {
|
|
7
10
|
this.db = db;
|
|
@@ -13,48 +16,53 @@ class EventAudit {
|
|
|
13
16
|
});
|
|
14
17
|
}
|
|
15
18
|
table;
|
|
16
|
-
|
|
17
|
-
async #createEvent(
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
19
|
+
definitions = {};
|
|
20
|
+
async #createEvent(name, payload, context) {
|
|
21
|
+
const def = this.definitions[name];
|
|
22
|
+
if (!def) throw new EquippedError("audit definition not found", { name, payload });
|
|
23
|
+
const validBody = v.assert(def.pipe, payload);
|
|
24
|
+
const ts = context.at ?? /* @__PURE__ */ new Date();
|
|
25
|
+
const key = Instance.createId(ts);
|
|
23
26
|
return await this.table.insertOne(
|
|
24
27
|
{
|
|
25
28
|
key,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
by: context.by ?? null,
|
|
32
|
-
error: null,
|
|
33
|
-
startedAt: null,
|
|
34
|
-
completedAt: null
|
|
29
|
+
name,
|
|
30
|
+
ts: ts.getTime(),
|
|
31
|
+
body: validBody,
|
|
32
|
+
by: context.by,
|
|
33
|
+
steps: []
|
|
35
34
|
},
|
|
36
|
-
{ getTime: () =>
|
|
35
|
+
{ getTime: () => ts, makeId: () => key }
|
|
37
36
|
);
|
|
38
37
|
}
|
|
39
|
-
async #processEvent(event) {
|
|
38
|
+
async #processEvent(event, callbackWait) {
|
|
40
39
|
return this.db.session(async () => {
|
|
41
|
-
const
|
|
42
|
-
if (!
|
|
40
|
+
const def = this.definitions[event.name];
|
|
41
|
+
if (!def) throw new EquippedError("audit definition not found", { event });
|
|
43
42
|
try {
|
|
44
43
|
await this.table.updateOne(
|
|
45
44
|
{ key: event.key },
|
|
46
|
-
{ $set: { status: "
|
|
45
|
+
{ $set: { steps: [createStep({ status: "start", ts: Date.now() })] } }
|
|
47
46
|
);
|
|
48
|
-
const
|
|
47
|
+
const context = {
|
|
49
48
|
key: event.key,
|
|
50
49
|
by: event.by,
|
|
51
50
|
date: new Date(event.ts)
|
|
51
|
+
};
|
|
52
|
+
const result = await def.handle(event.body, context);
|
|
53
|
+
await def.sync?.(result, event.body, context);
|
|
54
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "sync", ts: Date.now() }) } });
|
|
55
|
+
const asyncHandle = Promise.try(() => def.async?.(result, event.body, context)).then(async () => {
|
|
56
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "async", ts: Date.now() }) } });
|
|
57
|
+
}).catch(async (err) => {
|
|
58
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
59
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
52
60
|
});
|
|
53
|
-
|
|
61
|
+
if (callbackWait) await asyncHandle;
|
|
54
62
|
return result;
|
|
55
63
|
} catch (err) {
|
|
56
|
-
const
|
|
57
|
-
await this.table.updateOne({ key: event.key }, { $
|
|
64
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
65
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
58
66
|
throw err;
|
|
59
67
|
}
|
|
60
68
|
});
|
|
@@ -67,27 +75,20 @@ class EventAudit {
|
|
|
67
75
|
all: true
|
|
68
76
|
})
|
|
69
77
|
);
|
|
70
|
-
for (const event of events) await this.#processEvent(event);
|
|
78
|
+
for (const event of events) await this.#processEvent(event, true);
|
|
71
79
|
}
|
|
72
80
|
async rerun(key) {
|
|
73
81
|
const event = await this.table.findOne({ key });
|
|
74
82
|
if (!event) throw new EquippedError("audit event not found", { key });
|
|
75
|
-
await this.#processEvent(event);
|
|
83
|
+
await this.#processEvent(event, true);
|
|
76
84
|
}
|
|
77
|
-
register(
|
|
78
|
-
if (this.
|
|
79
|
-
this.
|
|
80
|
-
v.compile(
|
|
81
|
-
return {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return this.#processEvent(event);
|
|
85
|
-
},
|
|
86
|
-
async: async (payload, context) => {
|
|
87
|
-
const event = await this.#createEvent(type, payload, "async", context);
|
|
88
|
-
this.#processEvent(event).catch(() => {
|
|
89
|
-
});
|
|
90
|
-
}
|
|
85
|
+
register(name, def) {
|
|
86
|
+
if (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {});
|
|
87
|
+
this.definitions[name] = def;
|
|
88
|
+
v.compile(def.pipe);
|
|
89
|
+
return async (payload, context) => {
|
|
90
|
+
const event = await this.#createEvent(name, payload, context);
|
|
91
|
+
return this.#processEvent(event, false);
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
94
|
}
|
|
@@ -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}\n\nexport type EventContext = {\n\tkey: string\n\tby: string |
|
|
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\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\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 = Promise.try(() => def.async?.(result, event.body, context))\n\t\t\t\t\t.then(async () => {\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(async (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\tif (callbackWait) await 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,4 +1,4 @@
|
|
|
1
|
-
import a from"pino";import{ulid as p}from"ulid";import{v as s}from"valleyed";import{runHooks as o}from "./hooks.min.mjs";import{cachePipe as c,dbPipe as d,eventBusPipe as u,instanceSettingsPipe as l,jobsPipe as y,serverTypePipe as g}from "./settings.min.mjs";
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
import a from"pino";import{ulid as p}from"ulid";import{v as s}from"valleyed";import{EquippedError as i}from "../errors/index.min.mjs";import{runHooks as o}from "./hooks.min.mjs";import{cachePipe as c,dbPipe as d,eventBusPipe as u,instanceSettingsPipe as l,jobsPipe as y,serverTypePipe as g}from "./settings.min.mjs";class t{static#e;static#r;static#t={};settings;log;constructor(e){t.#r=this,this.settings=Object.freeze(e),this.log=a({level:this.settings.log.level,serializers:{err:a.stdSerializers.err,error:a.stdSerializers.err,req:a.stdSerializers.req,res:a.stdSerializers.res},mixin:()=>({instanceId:t.#e})}),t.#s()}alias(e){if(t.#e!==void 0)return t.crash(new i("Instance already has an alias",{}));t.#e=e}get id(){return t.#e===void 0?t.crash(new i("Instance doesnt have an alias yet",{})):t.#e}getScopedName(e,r="."){return[this.settings.app.name,e].join(r)}createCache(e){return s.assert(c(),e)}createJobs(e){return s.assert(y(),e)}createEventBus(e){return s.assert(u(),e)}createDb(e){return s.assert(d(),e)}createServer(e){return s.assert(g(),e)}async start(){try{await o(t.#t.setup??[]),await o(t.#t.start??[])}catch(e){t.crash(new i("Error starting instance",{},e))}}static envs(e){const r=s.validate(e,process.env);return r.valid||t.crash(new i(`Environment variables are not valid
|
|
2
|
+
${r.error.toString()}`,{messages:r.error.messages})),r.value}static create(e){if(t.#r)return t.crash(new i("Instance has been initialized already",{}));const r=s.validate(l(),e);return r.valid||t.crash(new i(`Settings are not valid
|
|
3
|
+
${r.error.toString()}`,{messages:r.error.messages})),new t(r.value)}static get(){return t.#r?t.#r:t.crash(new i("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static on(e,r,n){t.#t[e]??=[],t.#t[e].push({cb:r,order:n})}static#s(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([r,n])=>{process.on(r,async()=>{await o(t.#t.close??[],()=>{}),process.exit(128+n)})})}static resolveBeforeCrash(e){const r=e();return t.on("close",async()=>await r,10),r}static crash(e){console.error(e),process.exit(1)}static createId(e){return p(e?.getTime())}}export{t as Instance};
|
|
4
4
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends PipeInput<ReturnType<typeof cachePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T['type']]\n\t}\n\n\tcreateJobs<T extends PipeInput<ReturnType<typeof jobsPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T['type']]\n\t}\n\n\tcreateEventBus<T extends PipeInput<ReturnType<typeof eventBusPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T['type']]\n\t}\n\n\tcreateDb<T extends PipeInput<ReturnType<typeof dbPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T['db']['type']]\n\t}\n\n\tcreateServer<T extends PipeInput<ReturnType<typeof serverTypePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T['type']]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(time?: Date) {\n\t\treturn ulid(time?.getTime())\n\t}\n}\n"],"mappings":"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","names":["pino","ulid","v","EquippedError","runHooks","cachePipe","dbPipe","eventBusPipe","instanceSettingsPipe","jobsPipe","serverTypePipe","Instance","#id","#instance","#hooks","settings","#registerOnExitHandler","id","name","key","input","error","envsPipe","envValidity","settingsValidity","event","cb","order","signal","code","value","time"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import pino from "pino";
|
|
2
2
|
import { ulid } from "ulid";
|
|
3
3
|
import { v } from "valleyed";
|
|
4
|
+
import { EquippedError } from "../errors/index.mjs";
|
|
4
5
|
import { runHooks } from "./hooks.mjs";
|
|
5
6
|
import {
|
|
6
7
|
cachePipe,
|
|
@@ -10,7 +11,6 @@ import {
|
|
|
10
11
|
jobsPipe,
|
|
11
12
|
serverTypePipe
|
|
12
13
|
} from "./settings.mjs";
|
|
13
|
-
import { EquippedError } from "../errors/index.mjs";
|
|
14
14
|
class Instance {
|
|
15
15
|
static #id;
|
|
16
16
|
static #instance;
|
|
@@ -127,8 +127,8 @@ ${settingsValidity.error.toString()}`, {
|
|
|
127
127
|
console.error(error);
|
|
128
128
|
process.exit(1);
|
|
129
129
|
}
|
|
130
|
-
static createId() {
|
|
131
|
-
return ulid();
|
|
130
|
+
static createId(time) {
|
|
131
|
+
return ulid(time?.getTime());
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { ConditionalObjectKeys, Pipe, PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { HookCb, HookEvent, HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\tCacheTypes,\n\tdbPipe,\n\tDbTypes,\n\teventBusPipe,\n\tEventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\tJobTypes,\n\tserverTypePipe,\n\tServerTypes,\n\tSettings,\n\tSettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends PipeInput<ReturnType<typeof cachePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T['type']]\n\t}\n\n\tcreateJobs<T extends PipeInput<ReturnType<typeof jobsPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T['type']]\n\t}\n\n\tcreateEventBus<T extends PipeInput<ReturnType<typeof eventBusPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T['type']]\n\t}\n\n\tcreateDb<T extends PipeInput<ReturnType<typeof dbPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T['db']['type']]\n\t}\n\n\tcreateServer<T extends PipeInput<ReturnType<typeof serverTypePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T['type']]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(time?: Date) {\n\t\treturn ulid(time?.getTime())\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,6 +2,9 @@ import { v } from "valleyed";
|
|
|
2
2
|
import { Conditions, wrapQueryParams } from "../dbs/index.js";
|
|
3
3
|
import { EquippedError } from "../errors/index.js";
|
|
4
4
|
import { Instance } from "../instance/index.js";
|
|
5
|
+
function createStep(step) {
|
|
6
|
+
return step;
|
|
7
|
+
}
|
|
5
8
|
class EventAudit {
|
|
6
9
|
constructor(db, dbName) {
|
|
7
10
|
this.db = db;
|
|
@@ -13,48 +16,53 @@ class EventAudit {
|
|
|
13
16
|
});
|
|
14
17
|
}
|
|
15
18
|
table;
|
|
16
|
-
|
|
17
|
-
async #createEvent(
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
19
|
+
definitions = {};
|
|
20
|
+
async #createEvent(name, payload, context) {
|
|
21
|
+
const def = this.definitions[name];
|
|
22
|
+
if (!def) throw new EquippedError("audit definition not found", { name, payload });
|
|
23
|
+
const validBody = v.assert(def.pipe, payload);
|
|
24
|
+
const ts = context.at ?? /* @__PURE__ */ new Date();
|
|
25
|
+
const key = Instance.createId(ts);
|
|
23
26
|
return await this.table.insertOne(
|
|
24
27
|
{
|
|
25
28
|
key,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
by: context.by ?? null,
|
|
32
|
-
error: null,
|
|
33
|
-
startedAt: null,
|
|
34
|
-
completedAt: null
|
|
29
|
+
name,
|
|
30
|
+
ts: ts.getTime(),
|
|
31
|
+
body: validBody,
|
|
32
|
+
by: context.by,
|
|
33
|
+
steps: []
|
|
35
34
|
},
|
|
36
|
-
{ getTime: () =>
|
|
35
|
+
{ getTime: () => ts, makeId: () => key }
|
|
37
36
|
);
|
|
38
37
|
}
|
|
39
|
-
async #processEvent(event) {
|
|
38
|
+
async #processEvent(event, callbackWait) {
|
|
40
39
|
return this.db.session(async () => {
|
|
41
|
-
const
|
|
42
|
-
if (!
|
|
40
|
+
const def = this.definitions[event.name];
|
|
41
|
+
if (!def) throw new EquippedError("audit definition not found", { event });
|
|
43
42
|
try {
|
|
44
43
|
await this.table.updateOne(
|
|
45
44
|
{ key: event.key },
|
|
46
|
-
{ $set: { status: "
|
|
45
|
+
{ $set: { steps: [createStep({ status: "start", ts: Date.now() })] } }
|
|
47
46
|
);
|
|
48
|
-
const
|
|
47
|
+
const context = {
|
|
49
48
|
key: event.key,
|
|
50
49
|
by: event.by,
|
|
51
50
|
date: new Date(event.ts)
|
|
51
|
+
};
|
|
52
|
+
const result = await def.handle(event.body, context);
|
|
53
|
+
await def.sync?.(result, event.body, context);
|
|
54
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "sync", ts: Date.now() }) } });
|
|
55
|
+
const asyncHandle = Promise.try(() => def.async?.(result, event.body, context)).then(async () => {
|
|
56
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "async", ts: Date.now() }) } });
|
|
57
|
+
}).catch(async (err) => {
|
|
58
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
59
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
52
60
|
});
|
|
53
|
-
|
|
61
|
+
if (callbackWait) await asyncHandle;
|
|
54
62
|
return result;
|
|
55
63
|
} catch (err) {
|
|
56
|
-
const
|
|
57
|
-
await this.table.updateOne({ key: event.key }, { $
|
|
64
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
65
|
+
await this.table.updateOne({ key: event.key }, { $push: { steps: createStep({ status: "error", error, ts: Date.now() }) } });
|
|
58
66
|
throw err;
|
|
59
67
|
}
|
|
60
68
|
});
|
|
@@ -67,27 +75,20 @@ class EventAudit {
|
|
|
67
75
|
all: true
|
|
68
76
|
})
|
|
69
77
|
);
|
|
70
|
-
for (const event of events) await this.#processEvent(event);
|
|
78
|
+
for (const event of events) await this.#processEvent(event, true);
|
|
71
79
|
}
|
|
72
80
|
async rerun(key) {
|
|
73
81
|
const event = await this.table.findOne({ key });
|
|
74
82
|
if (!event) throw new EquippedError("audit event not found", { key });
|
|
75
|
-
await this.#processEvent(event);
|
|
83
|
+
await this.#processEvent(event, true);
|
|
76
84
|
}
|
|
77
|
-
register(
|
|
78
|
-
if (this.
|
|
79
|
-
this.
|
|
80
|
-
v.compile(
|
|
81
|
-
return {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return this.#processEvent(event);
|
|
85
|
-
},
|
|
86
|
-
async: async (payload, context) => {
|
|
87
|
-
const event = await this.#createEvent(type, payload, "async", context);
|
|
88
|
-
this.#processEvent(event).catch(() => {
|
|
89
|
-
});
|
|
90
|
-
}
|
|
85
|
+
register(name, def) {
|
|
86
|
+
if (this.definitions[name]) throw new EquippedError(`${name} already has a registered handler`, {});
|
|
87
|
+
this.definitions[name] = def;
|
|
88
|
+
v.compile(def.pipe);
|
|
89
|
+
return async (payload, context) => {
|
|
90
|
+
const event = await this.#createEvent(name, payload, context);
|
|
91
|
+
return this.#processEvent(event, false);
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
94
|
}
|
|
@@ -9,27 +9,27 @@ import '../base-CfeyC14V.js';
|
|
|
9
9
|
type EventDefinition<P extends Pipe<any, any>, R> = {
|
|
10
10
|
pipe: P;
|
|
11
11
|
handle: (payload: PipeOutput<P>, context: EventContext) => R | Promise<R>;
|
|
12
|
+
sync?: (result: R, payload: PipeOutput<P>, context: EventContext) => void;
|
|
13
|
+
async?: (result: R, payload: PipeOutput<P>, context: EventContext) => void;
|
|
12
14
|
};
|
|
13
15
|
type EventContext = {
|
|
14
16
|
key: string;
|
|
15
|
-
by: string |
|
|
17
|
+
by: string | undefined;
|
|
16
18
|
date: Date;
|
|
17
19
|
};
|
|
18
20
|
type Context = {
|
|
19
21
|
by?: string;
|
|
22
|
+
at?: Date;
|
|
20
23
|
};
|
|
21
24
|
declare class EventAudit {
|
|
22
25
|
#private;
|
|
23
26
|
private db;
|
|
24
27
|
private table;
|
|
25
|
-
private
|
|
28
|
+
private definitions;
|
|
26
29
|
constructor(db: Db<any>, dbName: string);
|
|
27
30
|
replay(from?: Date): Promise<void>;
|
|
28
31
|
rerun(key: string): Promise<void>;
|
|
29
|
-
register<P extends Pipe<any, any>, R>(
|
|
30
|
-
sync: (payload: PipeInput<P>, context: Context) => Promise<R>;
|
|
31
|
-
async: (payload: PipeInput<P>, context: Context) => Promise<void>;
|
|
32
|
-
};
|
|
32
|
+
register<P extends Pipe<any, any>, R>(name: string, def: EventDefinition<P, R>): (payload: PipeInput<P>, context: Context) => Promise<R>;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export { EventAudit, type EventDefinition };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { p as RequestError } from '../
|
|
2
|
-
export { E as EquippedError } from '../
|
|
3
|
-
export { V as ValidationError } from '../validationError
|
|
1
|
+
import { p as RequestError } from '../requestError-ClqSpE4c.js';
|
|
2
|
+
export { E as EquippedError } from '../requestError-ClqSpE4c.js';
|
|
3
|
+
export { V as ValidationError } from '../validationError--mhIgeX-.js';
|
|
4
|
+
import 'valleyed';
|
|
4
5
|
import 'node:stream';
|
|
5
6
|
import '@fastify/cookie';
|
|
6
|
-
import 'valleyed';
|
|
7
7
|
import '../overrides-6Hxg764S.js';
|
|
8
8
|
import '../types/index.js';
|
|
9
9
|
import '../base-CfeyC14V.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import { b as RouteDef, k as RouterConfig, j as RouteConfig, m as RouteDefHandler, l as MergeRouteDefs, c as Route, S as ServerConfig, R as Request, d as Response, g as MethodsEnum } from './
|
|
2
|
+
import { b as RouteDef, k as RouterConfig, j as RouteConfig, m as RouteDefHandler, l as MergeRouteDefs, c as Route, S as ServerConfig, R as Request, d as Response, g as MethodsEnum } from './requestError-ClqSpE4c.js';
|
|
3
3
|
import { FastifyRequest, FastifyReply } from 'fastify';
|
|
4
4
|
import * as supertest_lib_agent from 'supertest/lib/agent';
|
|
5
5
|
import http from 'http';
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export { Instance } from './instance/index.js';
|
|
2
2
|
import 'pino';
|
|
3
3
|
import 'valleyed';
|
|
4
|
-
import './
|
|
5
|
-
import './overrides-6Hxg764S.js';
|
|
6
|
-
import './kafka-zsC3c8ar.js';
|
|
7
|
-
import './events/index.js';
|
|
8
|
-
import './requests-HlupG2_s.js';
|
|
4
|
+
import './requestError-ClqSpE4c.js';
|
|
9
5
|
import 'node:stream';
|
|
10
6
|
import '@fastify/cookie';
|
|
7
|
+
import './overrides-6Hxg764S.js';
|
|
11
8
|
import './types/index.js';
|
|
9
|
+
import './base-CfeyC14V.js';
|
|
12
10
|
import './base-8yVXb67P.js';
|
|
13
|
-
import './
|
|
11
|
+
import './kafka-zsC3c8ar.js';
|
|
12
|
+
import './events/index.js';
|
|
13
|
+
import './fastify-gQShnQHf.js';
|
|
14
14
|
import 'express';
|
|
15
15
|
import 'fastify';
|
|
16
16
|
import 'supertest/lib/agent';
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Logger } from 'pino';
|
|
2
2
|
import * as valleyed from 'valleyed';
|
|
3
3
|
import { PipeOutput, ConditionalObjectKeys, PipeInput, Pipe } from 'valleyed';
|
|
4
|
+
import { e as BaseTokensUtility, B as BaseApiKeysUtility, E as EquippedError } from '../requestError-ClqSpE4c.js';
|
|
4
5
|
import { E as EventBus } from '../base-CfeyC14V.js';
|
|
5
6
|
import { K as KafkaEventBus } from '../kafka-zsC3c8ar.js';
|
|
6
7
|
import { RabbitMQEventBus } from '../events/index.js';
|
|
7
|
-
import {
|
|
8
|
-
import { E as ExpressServer, F as FastifyServer } from '../fastify-fV8eHFNl.js';
|
|
8
|
+
import { E as ExpressServer, F as FastifyServer } from '../fastify-gQShnQHf.js';
|
|
9
9
|
import { InMemoryCache, RedisCache } from '../cache/index.js';
|
|
10
10
|
import { M as MongoDb } from '../db-B3v890eW.js';
|
|
11
11
|
import { RedisJob } from '../jobs/index.js';
|
|
12
|
-
import '../overrides-6Hxg764S.js';
|
|
13
12
|
import 'node:stream';
|
|
14
13
|
import '@fastify/cookie';
|
|
14
|
+
import '../overrides-6Hxg764S.js';
|
|
15
15
|
import '../types/index.js';
|
|
16
16
|
import '../base-8yVXb67P.js';
|
|
17
17
|
import 'express';
|
|
@@ -178,7 +178,7 @@ declare class Instance {
|
|
|
178
178
|
static on(event: HookEvent, cb: HookCb, order: number): void;
|
|
179
179
|
static resolveBeforeCrash<T>(cb: () => Promise<T>): Promise<T>;
|
|
180
180
|
static crash(error: EquippedError): never;
|
|
181
|
-
static createId(): string;
|
|
181
|
+
static createId(time?: Date): string;
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
export { Instance };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import pino from "pino";
|
|
2
2
|
import { ulid } from "ulid";
|
|
3
3
|
import { v } from "valleyed";
|
|
4
|
+
import { EquippedError } from "../errors/index.js";
|
|
4
5
|
import { runHooks } from "./hooks.js";
|
|
5
6
|
import {
|
|
6
7
|
cachePipe,
|
|
@@ -10,7 +11,6 @@ import {
|
|
|
10
11
|
jobsPipe,
|
|
11
12
|
serverTypePipe
|
|
12
13
|
} from "./settings.js";
|
|
13
|
-
import { EquippedError } from "../errors/index.js";
|
|
14
14
|
class Instance {
|
|
15
15
|
static #id;
|
|
16
16
|
static #instance;
|
|
@@ -127,8 +127,8 @@ ${settingsValidity.error.toString()}`, {
|
|
|
127
127
|
console.error(error);
|
|
128
128
|
process.exit(1);
|
|
129
129
|
}
|
|
130
|
-
static createId() {
|
|
131
|
-
return ulid();
|
|
130
|
+
static createId(time) {
|
|
131
|
+
return ulid(time?.getTime());
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { E as ExpressServer, F as FastifyServer, O as OnJoinFn, R as Router, S as Server, a as SocketCallbacks, b as SocketEmitter } from '../fastify-
|
|
2
|
-
import { R as Request, a as RouteDefToReqRes, b as RouteDef, S as ServerConfig, c as Route } from '../
|
|
3
|
-
export { B as BaseApiKeysUtility, e as BaseTokensUtility, C as CacheTokensUtility, i as DefaultCookies, D as DefaultHeaders, I as IncomingFile, l as MergeRouteDefs, M as Methods, g as MethodsEnum, d as Response, j as RouteConfig, m as RouteDefHandler, k as RouterConfig, f as StatusCodes, h as StatusCodesEnum, o as makeErrorMiddleware, n as makeMiddleware, s as serverConfigPipe } from '../
|
|
1
|
+
export { E as ExpressServer, F as FastifyServer, O as OnJoinFn, R as Router, S as Server, a as SocketCallbacks, b as SocketEmitter } from '../fastify-gQShnQHf.js';
|
|
2
|
+
import { R as Request, a as RouteDefToReqRes, b as RouteDef, S as ServerConfig, c as Route } from '../requestError-ClqSpE4c.js';
|
|
3
|
+
export { B as BaseApiKeysUtility, e as BaseTokensUtility, C as CacheTokensUtility, i as DefaultCookies, D as DefaultHeaders, I as IncomingFile, l as MergeRouteDefs, M as Methods, g as MethodsEnum, d as Response, j as RouteConfig, m as RouteDefHandler, k as RouterConfig, f as StatusCodes, h as StatusCodesEnum, o as makeErrorMiddleware, n as makeMiddleware, s as serverConfigPipe } from '../requestError-ClqSpE4c.js';
|
|
4
4
|
import 'express';
|
|
5
5
|
import 'fastify';
|
|
6
6
|
import 'supertest/lib/agent';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Pipe, PipeInput, PipeOutput, PipeError } from 'valleyed';
|
|
2
2
|
export * from 'valleyed';
|
|
3
3
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
|
-
import { I as IncomingFile, R as Request, d as Response, a as RouteDefToReqRes, b as RouteDef } from '../
|
|
5
|
-
import { V as ValidationError } from '../validationError
|
|
4
|
+
import { I as IncomingFile, R as Request, d as Response, a as RouteDefToReqRes, b as RouteDef } from '../requestError-ClqSpE4c.js';
|
|
5
|
+
import { V as ValidationError } from '../validationError--mhIgeX-.js';
|
|
6
6
|
import 'node:stream';
|
|
7
7
|
import '@fastify/cookie';
|
|
8
8
|
import '../overrides-6Hxg764S.js';
|
package/package.json
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { Readable } from 'node:stream';
|
|
2
|
-
import { SerializeOptions } from '@fastify/cookie';
|
|
3
1
|
import * as valleyed from 'valleyed';
|
|
4
2
|
import { PipeOutput, Pipe, Prettify, IsInTypeList, PipeInput, DistributiveOmit } from 'valleyed';
|
|
3
|
+
import { Readable } from 'node:stream';
|
|
4
|
+
import { SerializeOptions } from '@fastify/cookie';
|
|
5
5
|
import { A as AuthUser, a as RefreshUser } from './overrides-6Hxg764S.js';
|
|
6
6
|
import { Enum } from './types/index.js';
|
|
7
7
|
import { E as EventBus } from './base-CfeyC14V.js';
|
|
8
8
|
import { C as Cache } from './base-8yVXb67P.js';
|
|
9
9
|
|
|
10
|
+
declare class EquippedError extends Error {
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly context: Record<string, unknown>;
|
|
13
|
+
readonly cause?: unknown | undefined;
|
|
14
|
+
constructor(message: string, context: Record<string, unknown>, cause?: unknown | undefined);
|
|
15
|
+
}
|
|
16
|
+
|
|
10
17
|
declare abstract class BaseApiKeysUtility {
|
|
11
18
|
abstract verifyApiKey(apiKey: string): Promise<AuthUser>;
|
|
12
19
|
}
|
|
@@ -116,26 +123,6 @@ declare const serverConfigPipe: () => valleyed.Pipe<{
|
|
|
116
123
|
}>;
|
|
117
124
|
type ServerConfig = PipeOutput<ReturnType<typeof serverConfigPipe>>;
|
|
118
125
|
|
|
119
|
-
declare class EquippedError extends Error {
|
|
120
|
-
readonly message: string;
|
|
121
|
-
readonly context: Record<string, unknown>;
|
|
122
|
-
readonly cause?: unknown | undefined;
|
|
123
|
-
constructor(message: string, context: Record<string, unknown>, cause?: unknown | undefined);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
declare abstract class RequestError extends EquippedError {
|
|
127
|
-
readonly message: string;
|
|
128
|
-
readonly serializedErrors: {
|
|
129
|
-
message: string;
|
|
130
|
-
field?: string;
|
|
131
|
-
}[];
|
|
132
|
-
abstract readonly statusCode: StatusCodesEnum;
|
|
133
|
-
protected constructor(message: string, serializedErrors: {
|
|
134
|
-
message: string;
|
|
135
|
-
field?: string;
|
|
136
|
-
}[], cause?: unknown);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
126
|
declare const Methods: {
|
|
140
127
|
readonly head: "head";
|
|
141
128
|
readonly get: "get";
|
|
@@ -337,4 +324,17 @@ declare class Response<Def extends RouteDefToReqRes<any>> {
|
|
|
337
324
|
set cookieValues(values: DefaultCookies);
|
|
338
325
|
}
|
|
339
326
|
|
|
327
|
+
declare abstract class RequestError extends EquippedError {
|
|
328
|
+
readonly message: string;
|
|
329
|
+
readonly serializedErrors: {
|
|
330
|
+
message: string;
|
|
331
|
+
field?: string;
|
|
332
|
+
}[];
|
|
333
|
+
abstract readonly statusCode: StatusCodesEnum;
|
|
334
|
+
protected constructor(message: string, serializedErrors: {
|
|
335
|
+
message: string;
|
|
336
|
+
field?: string;
|
|
337
|
+
}[], cause?: unknown);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
340
|
export { BaseApiKeysUtility as B, CacheTokensUtility as C, type DefaultHeaders as D, EquippedError as E, type IncomingFile as I, Methods as M, Request as R, type ServerConfig as S, type RouteDefToReqRes as a, type RouteDef as b, type Route as c, Response as d, BaseTokensUtility as e, StatusCodes as f, type MethodsEnum as g, type StatusCodesEnum as h, type DefaultCookies as i, type RouteConfig as j, type RouterConfig as k, type MergeRouteDefs as l, type RouteDefHandler as m, makeMiddleware as n, makeErrorMiddleware as o, RequestError as p, serverConfigPipe as s };
|