equipped 5.0.26 → 5.0.28
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 +15 -0
- package/dist/cjs/dbs/pipes.cjs +17 -17
- package/dist/cjs/dbs/pipes.cjs.map +1 -1
- package/dist/cjs/dbs/pipes.min.cjs +1 -1
- package/dist/cjs/dbs/pipes.min.cjs.map +1 -1
- package/dist/cjs/events/types/kafka.cjs +12 -9
- package/dist/cjs/events/types/kafka.cjs.map +1 -1
- package/dist/cjs/events/types/kafka.min.cjs +1 -1
- package/dist/cjs/events/types/kafka.min.cjs.map +1 -1
- package/dist/cjs/events/types/rabbitmq.cjs +1 -1
- package/dist/cjs/events/types/rabbitmq.cjs.map +1 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs +1 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs.map +1 -1
- package/dist/cjs/server/impls/base.cjs +13 -11
- package/dist/cjs/server/impls/base.cjs.map +1 -1
- package/dist/cjs/server/impls/base.min.cjs +1 -1
- package/dist/cjs/server/impls/base.min.cjs.map +1 -1
- package/dist/esm/dbs/pipes.min.mjs +1 -1
- package/dist/esm/dbs/pipes.min.mjs.map +1 -1
- package/dist/esm/dbs/pipes.mjs +17 -17
- package/dist/esm/dbs/pipes.mjs.map +1 -1
- package/dist/esm/events/types/kafka.min.mjs +1 -1
- package/dist/esm/events/types/kafka.min.mjs.map +1 -1
- package/dist/esm/events/types/kafka.mjs +5 -2
- package/dist/esm/events/types/kafka.mjs.map +1 -1
- package/dist/esm/events/types/rabbitmq.min.mjs +1 -1
- package/dist/esm/events/types/rabbitmq.min.mjs.map +1 -1
- package/dist/esm/events/types/rabbitmq.mjs +1 -1
- package/dist/esm/events/types/rabbitmq.mjs.map +1 -1
- package/dist/esm/server/impls/base.min.mjs +1 -1
- package/dist/esm/server/impls/base.min.mjs.map +1 -1
- package/dist/esm/server/impls/base.mjs +13 -11
- package/dist/esm/server/impls/base.mjs.map +1 -1
- package/dist/types/{core-VE67ynvC.d.ts → core-BuPovjLX.d.ts} +16 -30
- package/dist/types/{db-CmGSoEjh.d.ts → db-Gck93XBL.d.ts} +1 -1
- package/dist/types/dbs/index.d.ts +3 -3
- package/dist/types/dbs/pipes.js +17 -17
- package/dist/types/events/types/kafka.js +5 -2
- package/dist/types/events/types/rabbitmq.js +1 -1
- package/dist/types/{fastify-aW8KHCpj.d.ts → fastify-B7DQ55s8.d.ts} +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/instance/index.d.ts +3 -3
- package/dist/types/server/impls/base.js +13 -11
- package/dist/types/server/index.d.ts +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
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.28](https://github.com/kevinand11/equipped/compare/v5.0.27...v5.0.28) (2025-08-18)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* error when processing event ([12e867f](https://github.com/kevinand11/equipped/commit/12e867fbaf0bf5240d12227ffd394777f2996663))
|
|
11
|
+
|
|
12
|
+
### [5.0.27](https://github.com/kevinand11/equipped/compare/v5.0.26...v5.0.27) (2025-08-13)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* compile request and response pipes before server starts ([79fbe2d](https://github.com/kevinand11/equipped/commit/79fbe2d8c6f0a1eb2bb07d4ce5447be02d8f90fc))
|
|
18
|
+
* recursive fn not defined when validating queryParams ([d7b4650](https://github.com/kevinand11/equipped/commit/d7b4650b7604f0097bf8d481febc6646aec697fc))
|
|
19
|
+
|
|
5
20
|
### [5.0.26](https://github.com/kevinand11/equipped/compare/v5.0.25...v5.0.26) (2025-08-11)
|
|
6
21
|
|
|
7
22
|
|
package/dist/cjs/dbs/pipes.cjs
CHANGED
|
@@ -17,24 +17,24 @@ var Conditions = /* @__PURE__ */ ((Conditions2) => {
|
|
|
17
17
|
Conditions2["exists"] = "exists";
|
|
18
18
|
return Conditions2;
|
|
19
19
|
})(Conditions || {});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
value: _valleyed.v.array(queryWhereBlock)
|
|
32
|
-
}),
|
|
33
|
-
regular: queryWhere
|
|
20
|
+
const queryKeys = _valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.in(["and" /* and */, "or" /* or */]), "and" /* and */), "and" /* and */);
|
|
21
|
+
const queryWhere = _valleyed.v.object({
|
|
22
|
+
field: _valleyed.v.string(),
|
|
23
|
+
value: _valleyed.v.any(),
|
|
24
|
+
condition: _valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.in(Object.values(Conditions)), "eq" /* eq */), "eq" /* eq */)
|
|
25
|
+
});
|
|
26
|
+
const queryWhereBlock = _valleyed.v.recursive(
|
|
27
|
+
() => _valleyed.v.discriminate((d) => Object.values(QueryKeys).includes(d.condition) ? "block" : "regular", {
|
|
28
|
+
block: _valleyed.v.object({
|
|
29
|
+
condition: queryKeys,
|
|
30
|
+
value: _valleyed.v.array(queryWhereBlock)
|
|
34
31
|
}),
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
|
|
32
|
+
regular: queryWhere
|
|
33
|
+
}),
|
|
34
|
+
"QueryWhereBlock"
|
|
35
|
+
);
|
|
36
|
+
const queryWhereClause = _valleyed.v.defaults(_valleyed.v.array(queryWhereBlock), []);
|
|
37
|
+
function queryParamsPipe() {
|
|
38
38
|
return _valleyed.v.meta(
|
|
39
39
|
_valleyed.v.object({
|
|
40
40
|
all: _valleyed.v.defaults(_valleyed.v.boolean(), false),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/dbs/pipes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/pipes.cjs"],"names":["QueryKeys","Conditions"],"mappings":"AAAA,6GAAsE;AAEtE,iDAAyB;AAElB,IAAK,UAAA,kBAAL,CAAA,CAAKA,UAAAA,EAAAA,GAAL;AACN,EAAAA,UAAAA,CAAA,KAAA,EAAA,EAAM,KAAA;AACN,EAAAA,UAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AAFM,EAAA,OAAAA,UAAAA;AAAA,CAAA,CAAA,CAAA,UAAA,GAAA,CAAA,CAAA,CAAA;AAKL,IAAK,WAAA,kBAAL,CAAA,CAAKC,WAAAA,EAAAA,GAAL;AACN,EAAAA,WAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AACL,EAAAA,WAAAA,CAAA,KAAA,EAAA,EAAM,KAAA;AACN,EAAAA,WAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AACL,EAAAA,WAAAA,CAAA,KAAA,EAAA,EAAM,KAAA;AACN,EAAAA,WAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AACL,EAAAA,WAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AACL,EAAAA,WAAAA,CAAA,IAAA,EAAA,EAAK,IAAA;AACL,EAAAA,WAAAA,CAAA,KAAA,EAAA,EAAM,KAAA;AACN,EAAAA,WAAAA,CAAA,QAAA,EAAA,EAAS,QAAA;AATE,EAAA,OAAAA,WAAAA;AAAA,CAAA,CAAA,CAAA,WAAA,GAAA,CAAA,CAAA,CAAA;
|
|
1
|
+
{"version":3,"sources":["../../../src/dbs/pipes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/pipes.cjs"],"names":["QueryKeys","Conditions"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/pipes.cjs","sourcesContent":["import { ConditionalObjectKeys, Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\n\nexport enum QueryKeys {\n\tand = 'and',\n\tor = 'or',\n}\n\nexport enum Conditions {\n\tlt = 'lt',\n\tlte = 'lte',\n\tgt = 'gt',\n\tgte = 'gte',\n\teq = 'eq',\n\tne = 'ne',\n\tin = 'in',\n\tnin = 'nin',\n\texists = 'exists',\n}\n\nconst queryKeys = v.catch(v.defaults(v.in([QueryKeys.and, QueryKeys.or]), QueryKeys.and), QueryKeys.and)\nconst queryWhere = v.object({\n\tfield: v.string(),\n\tvalue: v.any(),\n\tcondition: v.catch(v.defaults(v.in(Object.values(Conditions)), Conditions.eq), Conditions.eq),\n})\nconst queryWhereBlock = v.recursive(\n\t() =>\n\t\tv.discriminate((d) => (Object.values(QueryKeys).includes(d.condition as any) ? 'block' : 'regular'), {\n\t\t\tblock: v.object({\n\t\t\t\tcondition: queryKeys,\n\t\t\t\tvalue: v.array(queryWhereBlock),\n\t\t\t}),\n\t\t\tregular: queryWhere,\n\t\t}),\n\t'QueryWhereBlock',\n) as Pipe<\n\t| {\n\t\t\tcondition: PipeInput<typeof queryKeys>\n\t\t\tvalue: PipeInput<typeof queryWhere>[]\n\t }\n\t| PipeInput<typeof queryWhere>,\n\t| {\n\t\t\tcondition: PipeOutput<typeof queryKeys>\n\t\t\tvalue: PipeOutput<typeof queryWhere>[]\n\t }\n\t| PipeOutput<typeof queryWhere>\n>\n\nconst queryWhereClause = v.defaults(v.array(queryWhereBlock), [])\n\nexport function queryParamsPipe() {\n\treturn v.meta(\n\t\tv\n\t\t\t.object({\n\t\t\t\tall: v.defaults(v.boolean(), false),\n\t\t\t\tlimit: v.lazy(() => {\n\t\t\t\t\tconst pagLimit = Instance.get().settings.utils.paginationDefaultLimit\n\t\t\t\t\treturn v.catch(v.defaults(v.number().pipe(v.lte(pagLimit)), pagLimit), pagLimit)\n\t\t\t\t}),\n\t\t\t\tpage: v.catch(v.defaults(v.number().pipe(v.gte(1)), 1), 1),\n\t\t\t\tsearch: v.defaults(\n\t\t\t\t\tv.nullish(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tvalue: v.string(),\n\t\t\t\t\t\t\tfields: v.array(v.string()),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tnull,\n\t\t\t\t),\n\t\t\t\tsort: v.defaults(\n\t\t\t\t\tv.array(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tfield: v.string(),\n\t\t\t\t\t\t\tdesc: v.defaults(v.boolean(), false),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\t[],\n\t\t\t\t),\n\t\t\t\twhereType: queryKeys,\n\t\t\t\twhere: queryWhereClause,\n\t\t\t})\n\t\t\t.pipe((p) => ({ ...p, auth: <(typeof p)['where']>[], authType: QueryKeys.and })),\n\t\t{ title: 'Query Params', $refId: 'QueryParams' },\n\t)\n}\n\nexport function queryResultsPipe<T>(model: Pipe<any, T>) {\n\treturn v.object({\n\t\tpages: v.object({\n\t\t\tcurrent: v.number(),\n\t\t\tstart: v.number(),\n\t\t\tlast: v.number(),\n\t\t\tprevious: v.nullable(v.number()),\n\t\t\tnext: v.nullable(v.number()),\n\t\t}),\n\t\tdocs: v.object({\n\t\t\tlimit: v.number(),\n\t\t\ttotal: v.number(),\n\t\t\tcount: v.number(),\n\t\t}),\n\t\tresults: v.array(model),\n\t})\n}\n\nexport function wrapQueryParams(params: QueryParamsInput): QueryParams {\n\treturn v.assert(queryParamsPipe(), params)\n}\n\nexport type QueryParams = PipeOutput<ReturnType<typeof queryParamsPipe>>\nexport type QueryParamsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof queryParamsPipe>>>\nexport type QueryWhereClause = QueryParams['where'][number]\nexport type QueryWhere = Extract<QueryWhereClause, { field: string }>\nexport type QueryWhereBlock = Exclude<QueryWhereClause, { field: string }>\nexport type QueryResults<T> = PipeOutput<ReturnType<typeof queryResultsPipe<T>>>\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeOutput<ReturnType<typeof mongoDbConfigPipe>>\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _valleyed = require('valleyed');var _indexmincjs = require('../instance/index.min.cjs');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _valleyed = require('valleyed');var _indexmincjs = require('../instance/index.min.cjs');var a=(u=>(u.and="and",u.or="or",u))(a||{}),n= exports.Conditions =(r=>(r.lt="lt",r.lte="lte",r.gt="gt",r.gte="gte",r.eq="eq",r.ne="ne",r.in="in",r.nin="nin",r.exists="exists",r))(n||{});const p=_valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.in(["and","or"]),"and"),"and"),s=_valleyed.v.object({field:_valleyed.v.string(),value:_valleyed.v.any(),condition:_valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.in(Object.values(n)),"eq"),"eq")}),o=_valleyed.v.recursive(()=>_valleyed.v.discriminate(t=>Object.values(a).includes(t.condition)?"block":"regular",{block:_valleyed.v.object({condition:p,value:_valleyed.v.array(o)}),regular:s}),"QueryWhereBlock"),y=_valleyed.v.defaults(_valleyed.v.array(o),[]);function l(){return _valleyed.v.meta(_valleyed.v.object({all:_valleyed.v.defaults(_valleyed.v.boolean(),!1),limit:_valleyed.v.lazy(()=>{const t=_indexmincjs.Instance.get().settings.utils.paginationDefaultLimit;return _valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.number().pipe(_valleyed.v.lte(t)),t),t)}),page:_valleyed.v.catch(_valleyed.v.defaults(_valleyed.v.number().pipe(_valleyed.v.gte(1)),1),1),search:_valleyed.v.defaults(_valleyed.v.nullish(_valleyed.v.object({value:_valleyed.v.string(),fields:_valleyed.v.array(_valleyed.v.string())})),null),sort:_valleyed.v.defaults(_valleyed.v.array(_valleyed.v.object({field:_valleyed.v.string(),desc:_valleyed.v.defaults(_valleyed.v.boolean(),!1)})),[]),whereType:p,where:y}).pipe(t=>({...t,auth:[],authType:"and"})),{title:"Query Params",$refId:"QueryParams"})}function d(t){return _valleyed.v.object({pages:_valleyed.v.object({current:_valleyed.v.number(),start:_valleyed.v.number(),last:_valleyed.v.number(),previous:_valleyed.v.nullable(_valleyed.v.number()),next:_valleyed.v.nullable(_valleyed.v.number())}),docs:_valleyed.v.object({limit:_valleyed.v.number(),total:_valleyed.v.number(),count:_valleyed.v.number()}),results:_valleyed.v.array(t)})}function h(t){return _valleyed.v.assert(l(),t)}const q=()=>_valleyed.v.meta(_valleyed.v.object({uri:_valleyed.v.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});exports.Conditions = n; exports.QueryKeys = a; exports.mongoDbConfigPipe = q; exports.queryParamsPipe = l; exports.queryResultsPipe = d; exports.wrapQueryParams = h;
|
|
2
2
|
//# sourceMappingURL=pipes.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/dbs/pipes.ts"],"names":["QueryKeys","Conditions","
|
|
1
|
+
{"version":3,"sources":["../../../src/dbs/pipes.ts"],"names":["QueryKeys","Conditions","queryKeys","v","queryWhere","queryWhereBlock","d","queryParamsPipe","Instance","pagLimit","p","model","wrapQueryParams","params","mongoDbConfigPipe"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/pipes.min.cjs","sourcesContent":["import { ConditionalObjectKeys, Pipe, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\n\nexport enum QueryKeys {\n\tand = 'and',\n\tor = 'or',\n}\n\nexport enum Conditions {\n\tlt = 'lt',\n\tlte = 'lte',\n\tgt = 'gt',\n\tgte = 'gte',\n\teq = 'eq',\n\tne = 'ne',\n\tin = 'in',\n\tnin = 'nin',\n\texists = 'exists',\n}\n\nconst queryKeys = v.catch(v.defaults(v.in([QueryKeys.and, QueryKeys.or]), QueryKeys.and), QueryKeys.and)\nconst queryWhere = v.object({\n\tfield: v.string(),\n\tvalue: v.any(),\n\tcondition: v.catch(v.defaults(v.in(Object.values(Conditions)), Conditions.eq), Conditions.eq),\n})\nconst queryWhereBlock = v.recursive(\n\t() =>\n\t\tv.discriminate((d) => (Object.values(QueryKeys).includes(d.condition as any) ? 'block' : 'regular'), {\n\t\t\tblock: v.object({\n\t\t\t\tcondition: queryKeys,\n\t\t\t\tvalue: v.array(queryWhereBlock),\n\t\t\t}),\n\t\t\tregular: queryWhere,\n\t\t}),\n\t'QueryWhereBlock',\n) as Pipe<\n\t| {\n\t\t\tcondition: PipeInput<typeof queryKeys>\n\t\t\tvalue: PipeInput<typeof queryWhere>[]\n\t }\n\t| PipeInput<typeof queryWhere>,\n\t| {\n\t\t\tcondition: PipeOutput<typeof queryKeys>\n\t\t\tvalue: PipeOutput<typeof queryWhere>[]\n\t }\n\t| PipeOutput<typeof queryWhere>\n>\n\nconst queryWhereClause = v.defaults(v.array(queryWhereBlock), [])\n\nexport function queryParamsPipe() {\n\treturn v.meta(\n\t\tv\n\t\t\t.object({\n\t\t\t\tall: v.defaults(v.boolean(), false),\n\t\t\t\tlimit: v.lazy(() => {\n\t\t\t\t\tconst pagLimit = Instance.get().settings.utils.paginationDefaultLimit\n\t\t\t\t\treturn v.catch(v.defaults(v.number().pipe(v.lte(pagLimit)), pagLimit), pagLimit)\n\t\t\t\t}),\n\t\t\t\tpage: v.catch(v.defaults(v.number().pipe(v.gte(1)), 1), 1),\n\t\t\t\tsearch: v.defaults(\n\t\t\t\t\tv.nullish(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tvalue: v.string(),\n\t\t\t\t\t\t\tfields: v.array(v.string()),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\tnull,\n\t\t\t\t),\n\t\t\t\tsort: v.defaults(\n\t\t\t\t\tv.array(\n\t\t\t\t\t\tv.object({\n\t\t\t\t\t\t\tfield: v.string(),\n\t\t\t\t\t\t\tdesc: v.defaults(v.boolean(), false),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\t[],\n\t\t\t\t),\n\t\t\t\twhereType: queryKeys,\n\t\t\t\twhere: queryWhereClause,\n\t\t\t})\n\t\t\t.pipe((p) => ({ ...p, auth: <(typeof p)['where']>[], authType: QueryKeys.and })),\n\t\t{ title: 'Query Params', $refId: 'QueryParams' },\n\t)\n}\n\nexport function queryResultsPipe<T>(model: Pipe<any, T>) {\n\treturn v.object({\n\t\tpages: v.object({\n\t\t\tcurrent: v.number(),\n\t\t\tstart: v.number(),\n\t\t\tlast: v.number(),\n\t\t\tprevious: v.nullable(v.number()),\n\t\t\tnext: v.nullable(v.number()),\n\t\t}),\n\t\tdocs: v.object({\n\t\t\tlimit: v.number(),\n\t\t\ttotal: v.number(),\n\t\t\tcount: v.number(),\n\t\t}),\n\t\tresults: v.array(model),\n\t})\n}\n\nexport function wrapQueryParams(params: QueryParamsInput): QueryParams {\n\treturn v.assert(queryParamsPipe(), params)\n}\n\nexport type QueryParams = PipeOutput<ReturnType<typeof queryParamsPipe>>\nexport type QueryParamsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof queryParamsPipe>>>\nexport type QueryWhereClause = QueryParams['where'][number]\nexport type QueryWhere = Extract<QueryWhereClause, { field: string }>\nexport type QueryWhereBlock = Exclude<QueryWhereClause, { field: string }>\nexport type QueryResults<T> = PipeOutput<ReturnType<typeof queryResultsPipe<T>>>\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeOutput<ReturnType<typeof mongoDbConfigPipe>>\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);
|
|
2
2
|
var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);
|
|
3
|
-
var _indexcjs = require('../../
|
|
4
|
-
var _indexcjs3 = require('../../
|
|
3
|
+
var _indexcjs = require('../../errors/index.cjs');
|
|
4
|
+
var _indexcjs3 = require('../../instance/index.cjs');
|
|
5
|
+
var _indexcjs5 = require('../../utilities/index.cjs');
|
|
5
6
|
var _basecjs = require('../base.cjs');
|
|
6
7
|
class KafkaEventBus extends _basecjs.EventBus {
|
|
7
8
|
#client;
|
|
@@ -16,7 +17,7 @@ class KafkaEventBus extends _basecjs.EventBus {
|
|
|
16
17
|
}) : new _kafkajs2.default.Kafka({ ...kafkaSettings, logLevel: _kafkajs2.default.logLevel.NOTHING });
|
|
17
18
|
}
|
|
18
19
|
createStream(topicName, options = {}) {
|
|
19
|
-
const topic = options.skipScope ? topicName :
|
|
20
|
+
const topic = options.skipScope ? topicName : _indexcjs3.Instance.get().getScopedName(topicName);
|
|
20
21
|
return {
|
|
21
22
|
publish: async (data) => {
|
|
22
23
|
try {
|
|
@@ -34,20 +35,22 @@ class KafkaEventBus extends _basecjs.EventBus {
|
|
|
34
35
|
subscribe: (onMessage) => {
|
|
35
36
|
const subscribe = async () => {
|
|
36
37
|
await this.#createTopic(topic);
|
|
37
|
-
const groupId = options.fanout ?
|
|
38
|
+
const groupId = options.fanout ? _indexcjs3.Instance.get().getScopedName(`${_indexcjs3.Instance.get().id}-fanout-${_indexcjs5.Random.string(10)}`) : topic;
|
|
38
39
|
const consumer = this.#client.consumer(this.#confluent ? { kafkaJS: { groupId } } : { groupId });
|
|
39
40
|
await consumer.connect();
|
|
40
41
|
await consumer.subscribe({ topic });
|
|
41
42
|
await consumer.run({
|
|
42
43
|
eachMessage: async ({ message }) => {
|
|
43
|
-
|
|
44
|
+
await _indexcjs3.Instance.resolveBeforeCrash(async () => {
|
|
44
45
|
if (!message.value) return;
|
|
45
|
-
await onMessage(
|
|
46
|
-
})
|
|
46
|
+
await onMessage(_indexcjs5.parseJSONValue.call(void 0, message.value.toString()));
|
|
47
|
+
}).catch(
|
|
48
|
+
(error) => _indexcjs3.Instance.crash(new (0, _indexcjs.EquippedError)("Error processing kafka event", { topic, groupId, options }, error))
|
|
49
|
+
);
|
|
47
50
|
}
|
|
48
51
|
});
|
|
49
52
|
if (options.fanout)
|
|
50
|
-
|
|
53
|
+
_indexcjs3.Instance.on(
|
|
51
54
|
"close",
|
|
52
55
|
async () => {
|
|
53
56
|
await consumer.disconnect();
|
|
@@ -56,7 +59,7 @@ class KafkaEventBus extends _basecjs.EventBus {
|
|
|
56
59
|
10
|
|
57
60
|
);
|
|
58
61
|
};
|
|
59
|
-
|
|
62
|
+
_indexcjs3.Instance.on("start", subscribe, 2);
|
|
60
63
|
}
|
|
61
64
|
};
|
|
62
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/types/kafka.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs"],"names":[],"mappings":"AAAA,4SAAsB;AACtB,oFAAkB;AAElB,
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/kafka.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs"],"names":[],"mappings":"AAAA,4SAAsB;AACtB,oFAAkB;AAElB,kDAA8B;AAC9B,qDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,cAAA,QAAsB,kBAAS;AAAA,EAC3C,CAAA,MAAA;AAAA,EACA,CAAA,SAAA;AAAA,EACA,CAAA,KAAA;AAAA,EACA,WAAA,CAAY,MAAA,EAAqB;AAChC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,GAAG,cAAc,EAAA,EAAI,MAAA;AAChD,IAAA,IAAA,CAAK,CAAA,UAAA,EAAa,SAAA;AAClB,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,EACZ,IAAI,yBAAA,CAAU,OAAA,CAAQ,KAAA,CAAM;AAAA,MAC5B,OAAA,EAAS,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,yBAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,QAAQ;AAAA,IAC3E,CAAC,EAAA,EACA,IAAI,iBAAA,CAAM,KAAA,CAAM,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,iBAAA,CAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GAAwB;AACvC,QAAA,IAAI;AACH,UAAA,MAAM,SAAA,EAAW,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,CAAA;AACvC,UAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAA;AACvB,UAAA,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,YACnB,KAAA;AAAA,YACA,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACR,EAAA,UAAQ;AACP,UAAA,OAAO,KAAA;AAAA,QACR;AAAA,MACD,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,SAAA,EAAA,GAAsD;AACjE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,WAAA,CAAa,KAAK,CAAA;AAC7B,UAAA,MAAM,QAAA,EAAU,OAAA,CAAQ,OAAA,EACrB,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAE4B,UAAA;AAErC,UAAA;AACW,UAAA;AAEf,UAAA;AACkB,YAAA;AACW,cAAA;AACzB,gBAAA;AACoC,gBAAA;AACtD,cAAA;AAC+B,gBAAA;AAClC,cAAA;AACD,YAAA;AACA,UAAA;AAEW,UAAA;AACF,YAAA;AACR,cAAA;AACY,cAAA;AACe,gBAAA;AACK,gBAAA;AAChC,cAAA;AACA,cAAA;AACD,YAAA;AACF,QAAA;AACiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AAEkB,EAAA;AACC,IAAA;AACgB,MAAA;AACP,MAAA;AAC3B,IAAA;AACY,IAAA;AACb,EAAA;AAEkC,EAAA;AACE,IAAA;AAC4B,IAAA;AAChE,EAAA;AAEoC,EAAA;AACA,IAAA;AACa,IAAA;AAAE,IAAA;AACnD,EAAA;AACD;ACbyE;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { groupId })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin) {\n\t\t\tthis.#admin = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\t\t}\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);var _indexmincjs = require('../../
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _kafkajavascript = require('@confluentinc/kafka-javascript'); var _kafkajavascript2 = _interopRequireDefault(_kafkajavascript);var _kafkajs = require('kafkajs'); var _kafkajs2 = _interopRequireDefault(_kafkajs);var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class N extends _basemincjs.EventBus{#a;#e;#t;constructor(t){super();const{confluent:a=!1,...e}=t;this.#e=a,this.#a=a?new _kafkajavascript2.default.KafkaJS.Kafka({kafkaJS:{...e,logLevel:_kafkajavascript2.default.KafkaJS.logLevel.NOTHING}}):new _kafkajs2.default.Kafka({...e,logLevel:_kafkajs2.default.logLevel.NOTHING})}createStream(t,a={}){const e=a.skipScope?t:_indexmincjs3.Instance.get().getScopedName(t);return{publish:async r=>{try{const s=this.#a.producer();return await s.connect(),await s.send({topic:e,messages:[{value:JSON.stringify(r)}]}),!0}catch (e2){return!1}},subscribe:r=>{const s=async()=>{await this.#s(e);const i=a.fanout?_indexmincjs3.Instance.get().getScopedName(`${_indexmincjs3.Instance.get().id}-fanout-${_indexmincjs5.Random.string(10)}`):e,o=this.#a.consumer(this.#e?{kafkaJS:{groupId:i}}:{groupId:i});await o.connect(),await o.subscribe({topic:e}),await o.run({eachMessage:async({message:c})=>{await _indexmincjs3.Instance.resolveBeforeCrash(async()=>{c.value&&await r(_indexmincjs5.parseJSONValue.call(void 0, c.value.toString()))}).catch(m=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Error processing kafka event",{topic:e,groupId:i,options:a},m)))}}),a.fanout&&_indexmincjs3.Instance.on("close",async()=>{await o.disconnect(),await this.#i(i)},10)};_indexmincjs3.Instance.on("start",s,2)}}}async#n(){return this.#t||(this.#t=this.#a.admin(),await this.#t.connect()),this.#t}async#s(t){await(await this.#n()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#n()).deleteGroups([t]).catch(()=>{})}}exports.KafkaEventBus = N;
|
|
2
2
|
//# sourceMappingURL=kafka.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["KafkaEventBus","kafkaSettings","config","#client","Confluent","Instance","producer","data","onMessage","#createTopic","Random","topic"],"mappings":"AAAA,4SAAsB,oFACJ,yDAGT,4DAEQ,6DAIJA,6CAMX,MAAQ,EAAA,QAAY,oBAAO,CAAA,CAAA,CAAGC,CAAc,CAAA,CAAIC,CAAAA,CAChD,CAAA,CAAA,WACA,CAAA,CAAKC,CAAAA,CAAAA,KACF,CAAA,CAAIC,CAAAA,KAAU,CAAA,SAAc,CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,GAAS,CAAE,CAAA,CAAA,CAAGH,CAAAA,IAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAUG,IAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAA,yBAAA,CAAA,OAAS,CAAA,KAClE,CACA,CAAA,OAAU,CAAA,CAAA,GAAQ,CAAA,CAAA,QAAkB,CAAA,yBAAA,CAAA,OAAgB,CAAA,QAAS,CAAA,OAGjE,CAAA,CAAA,CAAA,CAAA,IAAA,iBAAA,CAAA,KAA8G,CAAC,CAAA,GAC9G,CAAA,CAAA,QAAsB,CAAA,iBAAA,CAAA,QAAwBC,CAAAA,OAAe,CAAA,CAAA,CAAA,YAAuB,CAAA,CACpF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CACN,MAAA,CAAA,CAAS,CAAA,CAAA,SACR,CAAA,CAAI,CACH,sBAAA,CAAA,GAAA,CAAMC,CAAAA,CAAW,aAAa,CAAA,CAAA,CAAA,CAAS,MACvC,CAAA,OAAA,CAAMA,MAAS,CAAA,EAAA,CAAQ,GACvB,CAAA,MAAe,CAAA,CAAA,IACd,CAAA,CAAA,CAAA,CAAA,QACA,CAAA,CAAA,CAAA,OAAa,MAAO,CAAA,CAAK,OAAA,CAAA,CAAA,CAAUC,MACnC,CACM,CAAA,IACR,CAAA,CAAA,KACC,CAAA,CAAA,CAAO,QAGT,CAAA,CAAA,CAAA,KAAYC,CAAAA,IACX,CAAA,SAAkB,CAAA,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,UAAM,CAAKC,MACX,CAAA,CAAA,CAAA,CAAA,CAAA,SAAwB,CAAA,CAAA,EACrBJ,CAAS,MAAM,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,MAAiBA,IAAS,CAAI,CAAA,CAAE,CAAA,CAAE,CAAA,CAAA,MAAA,CAAA,CAAA,CAAWK,CAAAA,MAAO,CAAA,sBAAO,CAAA,GAAG,CAAE,CAAA,CAC/EC,aAC2B,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.min.cjs","sourcesContent":["import Confluent from '@confluentinc/kafka-javascript'\nimport Kafka from 'kafkajs'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: Kafka.Kafka | Confluent.KafkaJS.Kafka\n\t#confluent: boolean\n\t#admin: Kafka.Admin | Confluent.KafkaJS.Admin | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tconst { confluent = false, ...kafkaSettings } = config\n\t\tthis.#confluent = confluent\n\t\tthis.#client = confluent\n\t\t\t? new Confluent.KafkaJS.Kafka({\n\t\t\t\t\tkafkaJS: { ...kafkaSettings, logLevel: Confluent.KafkaJS.logLevel.NOTHING },\n\t\t\t\t})\n\t\t\t: new Kafka.Kafka({ ...kafkaSettings, logLevel: Kafka.logLevel.NOTHING })\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer(this.#confluent ? ({ kafkaJS: { groupId } } as any) : { groupId })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin) {\n\t\t\tthis.#admin = this.#client.admin()\n\t\t\tawait this.#admin.connect()\n\t\t}\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"]}
|
|
@@ -29,7 +29,7 @@ class RabbitMQEventBus extends _basecjs.EventBus {
|
|
|
29
29
|
channel.consume(
|
|
30
30
|
queue,
|
|
31
31
|
async (msg) => {
|
|
32
|
-
_indexcjs.Instance.resolveBeforeCrash(async () => {
|
|
32
|
+
await _indexcjs.Instance.resolveBeforeCrash(async () => {
|
|
33
33
|
if (!msg) return;
|
|
34
34
|
try {
|
|
35
35
|
await onMessage(_indexcjs3.parseJSONValue.call(void 0, msg.content.toString()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/types/rabbitmq.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs"],"names":[],"mappings":"AACA,yIAAwB;AAGxB,oDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,iBAAA,QAAyB,kBAAS;AAAA,EAC9C,CAAA,MAAA;AAAA,EACA,CAAA,UAAA;AAAA,EAEA,WAAA,CAAY,MAAA,EAAwB;AACnC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,eAAA;AAC1B,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,4CAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,MAClD,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,MAAA,CAAO,OAAA,EAAA,GAA4B;AACzC,QAAA,MAAM,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,EAAU,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AAC1E,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAAA,MACzB;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GACf,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,MAC/F,SAAA,EAAW,MAAA,CAAO,SAAA,EAAA,GAAsD;AACvE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,OAAA,EAAA,GAA4B;AAC9D,YAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,OAAA,EACvB,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAEyB,YAAA;AACH,YAAA;AAC9C,YAAA;AACP,cAAA;AACe,cAAA;
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/rabbitmq.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs"],"names":[],"mappings":"AACA,yIAAwB;AAGxB,oDAAyB;AAEzB,sDAAuC;AACvC,sCAAwC;AAGjC,MAAM,iBAAA,QAAyB,kBAAS;AAAA,EAC9C,CAAA,MAAA;AAAA,EACA,CAAA,UAAA;AAAA,EAEA,WAAA,CAAY,MAAA,EAAwB;AACnC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,eAAA;AAC1B,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,4CAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,MAClD,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAO,MAAA,CAAO,OAAA,EAAA,GAA4B;AACzC,QAAA,MAAM,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,EAAU,EAAE,OAAA,EAAS,KAAK,CAAC,CAAA;AAC1E,QAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAAA,MACzB;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEA,YAAA,CAAiD,SAAA,EAA2B,QAAA,EAAkC,CAAC,CAAA,EAAG;AACjH,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GACf,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,MAC/F,SAAA,EAAW,MAAA,CAAO,SAAA,EAAA,GAAsD;AACvE,QAAA,MAAM,UAAA,EAAY,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,MAAM,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,OAAA,EAAA,GAA4B;AAC9D,YAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,OAAA,EACvB,kBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,CAAA,EAAA;AAEyB,YAAA;AACH,YAAA;AAC9C,YAAA;AACP,cAAA;AACe,cAAA;AACgC,gBAAA;AACnC,kBAAA;AACN,kBAAA;AACmD,oBAAA;AACvC,oBAAA;AACR,kBAAA;AACS,oBAAA;AACjB,kBAAA;AACA,gBAAA;AACF,cAAA;AACe,cAAA;AAChB,YAAA;AACA,UAAA;AACF,QAAA;AAEiC,QAAA;AAClC,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACX6E;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.cjs","sourcesContent":["import type { ChannelWrapper } from 'amqp-connection-manager'\nimport { connect } from 'amqp-connection-manager'\nimport type { ConfirmChannel } from 'amqplib'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { RabbitMQConfig } from '../pipes'\n\nexport class RabbitMQEventBus extends EventBus {\n\t#client: ChannelWrapper\n\t#columnName: string\n\n\tconstructor(config: RabbitMQConfig) {\n\t\tsuper()\n\t\tthis.#columnName = config.eventColumnName\n\t\tthis.#client = connect([config.uri]).createChannel({\n\t\t\tjson: false,\n\t\t\tsetup: async (channel: ConfirmChannel) => {\n\t\t\t\tawait channel.assertExchange(this.#columnName, 'direct', { durable: true })\n\t\t\t\tawait channel.prefetch(1)\n\t\t\t},\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) =>\n\t\t\t\tawait this.#client.publish(this.#columnName, topic, JSON.stringify(data), { persistent: true }),\n\t\t\tsubscribe: async (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#client.addSetup(async (channel: ConfirmChannel) => {\n\t\t\t\t\t\tconst queueName = options.fanout\n\t\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t\t: topic\n\t\t\t\t\t\tconst { queue } = await channel.assertQueue(queueName, { durable: !options.fanout, exclusive: options.fanout })\n\t\t\t\t\t\tawait channel.bindQueue(queue, this.#columnName, topic)\n\t\t\t\t\t\tchannel.consume(\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\tasync (msg) => {\n\t\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\t\tif (!msg) return\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(msg.content.toString()))\n\t\t\t\t\t\t\t\t\t\tchannel.ack(msg)\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\tchannel.nack(msg)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ noAck: false },\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _amqpconnectionmanager = require('amqp-connection-manager');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class g extends _basemincjs.EventBus{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=_amqpconnectionmanager.connect.call(void 0, [e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:_indexmincjs.Instance.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?_indexmincjs.Instance.get().getScopedName(`${_indexmincjs.Instance.get().id}-fanout-${_indexmincjs3.Random.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{_indexmincjs.Instance.resolveBeforeCrash(async()=>{if(r)try{await i(_indexmincjs3.parseJSONValue.call(void 0, r.content.toString())),a.ack(r)}catch (e2){a.nack(r)}})},{noAck:!1})})};_indexmincjs.Instance.on("start",c,2)}}}}exports.RabbitMQEventBus = g;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _amqpconnectionmanager = require('amqp-connection-manager');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _basemincjs = require('../base.min.cjs');class g extends _basemincjs.EventBus{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=_amqpconnectionmanager.connect.call(void 0, [e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createStream(e,t={}){const s=t.skipScope?e:_indexmincjs.Instance.get().getScopedName(e);return{publish:async i=>await this.#e.publish(this.#t,s,JSON.stringify(i),{persistent:!0}),subscribe:async i=>{const c=async()=>{await this.#e.addSetup(async a=>{const u=t.fanout?_indexmincjs.Instance.get().getScopedName(`${_indexmincjs.Instance.get().id}-fanout-${_indexmincjs3.Random.string(10)}`):s,{queue:o}=await a.assertQueue(u,{durable:!t.fanout,exclusive:t.fanout});await a.bindQueue(o,this.#t,s),a.consume(o,async r=>{await _indexmincjs.Instance.resolveBeforeCrash(async()=>{if(r)try{await i(_indexmincjs3.parseJSONValue.call(void 0, r.content.toString())),a.ack(r)}catch (e2){a.nack(r)}})},{noAck:!1})})};_indexmincjs.Instance.on("start",c,2)}}}}exports.RabbitMQEventBus = g;
|
|
2
2
|
//# sourceMappingURL=rabbitmq.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/types/rabbitmq.ts"],"names":["config","#client","channel","#columnName","topicName","options","data","topic","onMessage","queueName","Instance","Random"],"mappings":"AACA,yIAAwB,2DAKf,6DAC+B,6CAOH,MAC7B,EACN,QAAmBA,oBAAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAC1B,CAAA,CAAA,CAAA,CAAKC,KAAkB,CAACD,CAAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,eACpC,CAAM,IACN,CAAA,CAAA,CAAA,CAAA,4CAAO,CAAA,CAAA,CAAA,GAAOE,CAAAA,CAA4B,CACzC,aAAc,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAe,KAAKC,CAAAA,MAAa,CAAA,EAAA,CAAA,MAAY,CAAA,CAAA,cACrDD,CAAQ,IAAA,CAAA,CAAA,CAAA,CAAA,QAKjB,CAAA,CAAA,OAAA,CAAA,CAAA,CAAiDE,CAAAA,CAA2BC,CAAAA,MAC3E,CAAA,CAAA,QAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CACpF,CAAA,CAAA,SACC,CAAA,CAAA,CAAA,qBAAS,CAAA,GAAA,CAAA,CAAOC,CAAAA,aACJL,CAAAA,CAAAA,CAAQ,CAAA,MAAA,CAAQ,OAAKE,CAAaI,MAAO,CAAK,EAAA,MAAA,IAAc,CAAG,CAAE,CAAA,CAAA,OAAA,CAAA,IAAkB,CAAA,CAC/F,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,SAAkBC,CAAsD,CACvE,CAAA,CAAA,CAAA,UAAkB,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,SAAM,CAAKP,MAAQ,CAAA,EAAA,CAAA,MAAS,CAAA,CAAOC,KAClC,CAAA,CAAA,EAAA,CAAMO,MAAoB,IAAA,CACvBC,CAAAA,CAAS,CAAA,QAAM,CAAA,MAAA,CAAA,EAAA,CAAc,MAAY,CAAA,CAAA,CAAI,CAAA,MAAI,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAWC,CAAAA,aAAmB,CAAA,CAC/EJ,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.min.cjs","sourcesContent":["import type { ChannelWrapper } from 'amqp-connection-manager'\nimport { connect } from 'amqp-connection-manager'\nimport type { ConfirmChannel } from 'amqplib'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { RabbitMQConfig } from '../pipes'\n\nexport class RabbitMQEventBus extends EventBus {\n\t#client: ChannelWrapper\n\t#columnName: string\n\n\tconstructor(config: RabbitMQConfig) {\n\t\tsuper()\n\t\tthis.#columnName = config.eventColumnName\n\t\tthis.#client = connect([config.uri]).createChannel({\n\t\t\tjson: false,\n\t\t\tsetup: async (channel: ConfirmChannel) => {\n\t\t\t\tawait channel.assertExchange(this.#columnName, 'direct', { durable: true })\n\t\t\t\tawait channel.prefetch(1)\n\t\t\t},\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) =>\n\t\t\t\tawait this.#client.publish(this.#columnName, topic, JSON.stringify(data), { persistent: true }),\n\t\t\tsubscribe: async (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#client.addSetup(async (channel: ConfirmChannel) => {\n\t\t\t\t\t\tconst queueName = options.fanout\n\t\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t\t: topic\n\t\t\t\t\t\tconst { queue } = await channel.assertQueue(queueName, { durable: !options.fanout, exclusive: options.fanout })\n\t\t\t\t\t\tawait channel.bindQueue(queue, this.#columnName, topic)\n\t\t\t\t\t\tchannel.consume(\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\tasync (msg) => {\n\t\t\t\t\t\t\t\
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/rabbitmq.ts"],"names":["config","#client","channel","#columnName","topicName","options","data","topic","onMessage","queueName","Instance","Random"],"mappings":"AACA,yIAAwB,2DAKf,6DAC+B,6CAOH,MAC7B,EACN,QAAmBA,oBAAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAC1B,CAAA,CAAA,CAAA,CAAKC,KAAkB,CAACD,CAAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,eACpC,CAAM,IACN,CAAA,CAAA,CAAA,CAAA,4CAAO,CAAA,CAAA,CAAA,GAAOE,CAAAA,CAA4B,CACzC,aAAc,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAe,KAAKC,CAAAA,MAAa,CAAA,EAAA,CAAA,MAAY,CAAA,CAAA,cACrDD,CAAQ,IAAA,CAAA,CAAA,CAAA,CAAA,QAKjB,CAAA,CAAA,OAAA,CAAA,CAAA,CAAiDE,CAAAA,CAA2BC,CAAAA,MAC3E,CAAA,CAAA,QAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CACpF,CAAA,CAAA,SACC,CAAA,CAAA,CAAA,qBAAS,CAAA,GAAA,CAAA,CAAOC,CAAAA,aACJL,CAAAA,CAAAA,CAAQ,CAAA,MAAA,CAAQ,OAAKE,CAAaI,MAAO,CAAK,EAAA,MAAA,IAAc,CAAG,CAAE,CAAA,CAAA,OAAA,CAAA,IAAkB,CAAA,CAC/F,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,SAAkBC,CAAsD,CACvE,CAAA,CAAA,CAAA,UAAkB,CAAA,CAAA,CAAA,CAAY,CAC7B,CAAA,SAAM,CAAKP,MAAQ,CAAA,EAAA,CAAA,MAAS,CAAA,CAAOC,KAClC,CAAA,CAAA,EAAA,CAAMO,MAAoB,IAAA,CACvBC,CAAAA,CAAS,CAAA,QAAM,CAAA,MAAA,CAAA,EAAA,CAAc,MAAY,CAAA,CAAA,CAAI,CAAA,MAAI,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAWC,CAAAA,aAAmB,CAAA,CAC/EJ,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/rabbitmq.min.cjs","sourcesContent":["import type { ChannelWrapper } from 'amqp-connection-manager'\nimport { connect } from 'amqp-connection-manager'\nimport type { ConfirmChannel } from 'amqplib'\n\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, StreamOptions } from '../base'\nimport { RabbitMQConfig } from '../pipes'\n\nexport class RabbitMQEventBus extends EventBus {\n\t#client: ChannelWrapper\n\t#columnName: string\n\n\tconstructor(config: RabbitMQConfig) {\n\t\tsuper()\n\t\tthis.#columnName = config.eventColumnName\n\t\tthis.#client = connect([config.uri]).createChannel({\n\t\t\tjson: false,\n\t\t\tsetup: async (channel: ConfirmChannel) => {\n\t\t\t\tawait channel.assertExchange(this.#columnName, 'direct', { durable: true })\n\t\t\t\tawait channel.prefetch(1)\n\t\t\t},\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) =>\n\t\t\t\tawait this.#client.publish(this.#columnName, topic, JSON.stringify(data), { persistent: true }),\n\t\t\tsubscribe: async (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#client.addSetup(async (channel: ConfirmChannel) => {\n\t\t\t\t\t\tconst queueName = options.fanout\n\t\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t\t: topic\n\t\t\t\t\t\tconst { queue } = await channel.assertQueue(queueName, { durable: !options.fanout, exclusive: options.fanout })\n\t\t\t\t\t\tawait channel.bindQueue(queue, this.#columnName, topic)\n\t\t\t\t\t\tchannel.consume(\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\tasync (msg) => {\n\t\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\t\tif (!msg) return\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(msg.content.toString()))\n\t\t\t\t\t\t\t\t\t\tchannel.ack(msg)\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\tchannel.nack(msg)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ noAck: false },\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n}\n"]}
|
|
@@ -78,8 +78,8 @@ class Server {
|
|
|
78
78
|
let status = defaultStatusCode;
|
|
79
79
|
let contentType = defaultContentType;
|
|
80
80
|
const jsonSchema = { response: {}, request: {} };
|
|
81
|
-
const
|
|
82
|
-
const
|
|
81
|
+
const requestPipeDefs = {};
|
|
82
|
+
const responsePipeDefs = {};
|
|
83
83
|
const defs = [
|
|
84
84
|
{ key: "params", type: "request" },
|
|
85
85
|
{ key: "headers", type: "request" },
|
|
@@ -90,15 +90,14 @@ class Server {
|
|
|
90
90
|
];
|
|
91
91
|
defs.forEach((def) => {
|
|
92
92
|
const pipe = _nullishCoalesce(schema[def.key], () => ( _valleyed.v.any()));
|
|
93
|
-
_valleyed.v.compile(pipe, { allErrors: true });
|
|
94
93
|
if (def.skip) return;
|
|
95
94
|
if (def.type === "request") {
|
|
96
|
-
|
|
95
|
+
requestPipeDefs[def.key] = pipe;
|
|
97
96
|
jsonSchema.request[def.key] = _valleyed.v.schema(pipe);
|
|
98
97
|
}
|
|
99
98
|
if (def.type === "response") {
|
|
100
99
|
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
101
|
-
|
|
100
|
+
responsePipeDefs[def.key] = _valleyed.v.any().pipe((input) => {
|
|
102
101
|
const p = _optionalChain([pipeRecords, 'access', _9 => _9.find, 'call', _10 => _10((r) => r.status === status), 'optionalAccess', _11 => _11.pipe]);
|
|
103
102
|
if (!p) throw _valleyed.PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
104
103
|
return _valleyed.v.assert(p, input);
|
|
@@ -110,13 +109,17 @@ class Server {
|
|
|
110
109
|
}));
|
|
111
110
|
}
|
|
112
111
|
});
|
|
112
|
+
const requestPipe = _valleyed.v.object(requestPipeDefs);
|
|
113
|
+
_valleyed.v.compile(requestPipe, { allErrors: true });
|
|
114
|
+
const responsePipe = _valleyed.v.object(responsePipeDefs);
|
|
115
|
+
_valleyed.v.compile(responsePipe, { allErrors: true });
|
|
113
116
|
const validateRequest = async (request) => {
|
|
114
|
-
if (!Object.keys(
|
|
117
|
+
if (!Object.keys(requestPipeDefs)) return request;
|
|
115
118
|
const context = schema.context ? await schema.context(request) : {};
|
|
116
119
|
request.context = context;
|
|
117
120
|
const validity = _valleyedcjs.requestLocalStorage.run(
|
|
118
121
|
request,
|
|
119
|
-
() => _valleyed.v.validate(
|
|
122
|
+
() => _valleyed.v.validate(requestPipe, {
|
|
120
123
|
params: request.params,
|
|
121
124
|
headers: request.headers,
|
|
122
125
|
query: request.query,
|
|
@@ -131,13 +134,12 @@ class Server {
|
|
|
131
134
|
return request;
|
|
132
135
|
};
|
|
133
136
|
const validateResponse = async (response) => {
|
|
134
|
-
if (!Object.keys(
|
|
137
|
+
if (!Object.keys(responsePipeDefs)) return response;
|
|
135
138
|
status = response.status;
|
|
136
139
|
contentType = response.contentType;
|
|
137
|
-
contentType;
|
|
138
140
|
const validity = _valleyedcjs.responseLocalStorage.run(
|
|
139
141
|
response,
|
|
140
|
-
() => _valleyed.v.validate(
|
|
142
|
+
() => _valleyed.v.validate(responsePipe, {
|
|
141
143
|
responseHeaders: response.headers,
|
|
142
144
|
response: response.body
|
|
143
145
|
})
|
|
@@ -174,7 +176,7 @@ class Server {
|
|
|
174
176
|
throw new (0, _indexcjs.NotFoundError)(`Route ${request.path} not found`);
|
|
175
177
|
});
|
|
176
178
|
this.implementations.registerErrorHandler(async (error, _, res) => {
|
|
177
|
-
_indexcjs3.Instance.get().log.error(error);
|
|
179
|
+
_indexcjs3.Instance.get().log.error({ error }, "Uncaught error in route handler");
|
|
178
180
|
const response = error instanceof _indexcjs.RequestError ? new (0, _requestscjs.Response)({
|
|
179
181
|
body: error.serializedErrors,
|
|
180
182
|
status: error.statusCode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/server/impls/base.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs","sourcesContent":["import type http from 'http'\n\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { parseAuthUser } from '../middlewares/parseAuthUser'\nimport { OpenApi, OpenApiSchemaDef } from '../openapi'\nimport { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, MethodsEnum, RouteDef, StatusCodes, type Route } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected cors = {\n\t\torigin: '*',\n\t\tmethods: Object.values(Methods)\n\t\t\t.filter((m) => m !== Methods.options)\n\t\t\t.map((m) => m.toUpperCase()),\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.unshift(parseAuthUser as any)\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipe: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params'> = {}\n\t\tconst responsePipe: Pick<RouteDef, 'response' | 'responseHeaders'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tv.compile(pipe, { allErrors: true })\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipe[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipe[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipe)) return request\n\t\t\tconst context = schema.context ? await schema.context(request) : {}\n\t\t\trequest.context = context\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(v.object(requestPipe), {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params\n\t\t\trequest.headers = validity.value.headers\n\t\t\trequest.query = validity.value.query\n\t\t\trequest.body = validity.value.body\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipe)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\t\t\tcontentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(v.object(responsePipe), {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response\n\t\t\tresponse.headers = validity.value.responseHeaders\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error(error)\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n",null]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/impls/base.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs","sourcesContent":["import type http from 'http'\n\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { parseAuthUser } from '../middlewares/parseAuthUser'\nimport { OpenApi, OpenApiSchemaDef } from '../openapi'\nimport { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, MethodsEnum, RouteDef, StatusCodes, type Route } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected cors = {\n\t\torigin: '*',\n\t\tmethods: Object.values(Methods)\n\t\t\t.filter((m) => m !== Methods.options)\n\t\t\t.map((m) => m.toUpperCase()),\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.unshift(parseAuthUser as any)\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst context = schema.context ? await schema.context(request) : {}\n\t\t\trequest.context = context\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params\n\t\t\trequest.headers = validity.value.headers\n\t\t\trequest.query = validity.value.query\n\t\t\trequest.body = validity.value.body\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response\n\t\t\tresponse.headers = validity.value.responseHeaders\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var _parseAuthUsermincjs = require('../middlewares/parseAuthUser.min.cjs');var _openapimincjs = require('../openapi.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _socketsmincjs = require('../sockets.min.cjs');var _typesmincjs = require('../types.min.cjs');const
|
|
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 _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var _parseAuthUsermincjs = require('../middlewares/parseAuthUser.min.cjs');var _openapimincjs = require('../openapi.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _socketsmincjs = require('../sockets.min.cjs');var _typesmincjs = require('../types.min.cjs');const U=Object.entries(_typesmincjs.StatusCodes).filter(([,f])=>f>399).map(([f,s])=>({status:s,contentType:"application/json",pipe:_valleyed.v.meta(_valleyed.v.array(_valleyed.v.object({message:_valleyed.v.string(),field:_valleyed.v.optional(_valleyed.v.string())})),{$refId:`Errors.${f}Response`,description:`${f} Response`})}));class ae{constructor(s,t,i){;ae.prototype.__init.call(this);this.config=t;this.implementations=i;this.server=s,this.#e=new (0, _openapimincjs.OpenApi)(t);const c=new (0, _socketio.Server)(s,{cors:this.cors});this.socket=new (0, _socketsmincjs.SocketEmitter)(c,t),this.addRouter(this.#e.router())}#t=[];#s=new Map;#e;__init() {this.cors={origin:"*",methods:Object.values(_typesmincjs.Methods).filter(s=>s!==_typesmincjs.Methods.options).map(s=>s.toUpperCase())}}addRouter(...s){s.map(t=>t.routes).forEach(t=>this.addRoute(...t))}addRoute(...s){s.forEach(t=>{this.#t.push(async()=>{const{method:i,path:c,schema:o={},onError:d,middlewares:u=[]}=t,p=`(${i.toUpperCase()}) ${this.#e.cleanPath(c)}`;if(this.#s.get(p))throw new (0, _indexmincjs.EquippedError)(`Route key ${p} already registered. All route keys must be unique`,{route:t,key:p});u.unshift(_parseAuthUsermincjs.parseAuthUser),u.forEach(m=>_optionalChain([m, 'access', _ => _.onSetup, 'optionalCall', _2 => _2(t)])),_optionalChain([d, 'optionalAccess', _3 => _3.onSetup, 'optionalCall', _4 => _4(t)]);const{validateRequest:R,validateResponse:q,jsonSchema:g}=this.#o(i,o);this.#s.set(p,!0),await this.#e.register(t,g),this.implementations.registerRoute(i,this.#e.cleanPath(c),async(m,k)=>{const w=await R(await this.implementations.parseRequest(m));try{for(const n of u)await n.cb(w,this.config);const e=await t.handler(w,this.config),a=e instanceof _requestsmincjs.Response?e:new (0, _requestsmincjs.Response)({body:e,status:_typesmincjs.StatusCodes.Ok,headers:{},piped:!1});return await this.implementations.handleResponse(k,await q(a))}catch(e){if(_optionalChain([d, 'optionalAccess', _5 => _5.cb])){const a=await d.cb(w,this.config,e),n=a instanceof _requestsmincjs.Response?a:new (0, _requestsmincjs.Response)({body:a,status:_typesmincjs.StatusCodes.BadRequest,headers:{}});return await this.implementations.handleResponse(k,await q(n))}throw e}})})})}#o(s,t){const i=_nullishCoalesce(_optionalChain([t, 'optionalAccess', _6 => _6.defaultStatusCode]), () => (_typesmincjs.StatusCodes.Ok)),c=_nullishCoalesce(_optionalChain([t, 'optionalAccess', _7 => _7.defaultContentType]), () => ("application/json"));let o=i,d=c;const u={response:{},request:{}},p={},R={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![_typesmincjs.Methods.post,_typesmincjs.Methods.put,_typesmincjs.Methods.patch].includes(s)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"}].forEach(e=>{const a=_nullishCoalesce(t[e.key], () => (_valleyed.v.any()));if(!e.skip&&(e.type==="request"&&(p[e.key]=a,u.request[e.key]=_valleyed.v.schema(a)),e.type==="response")){const n=U.concat({status:i,contentType:d,pipe:a});R[e.key]=_valleyed.v.any().pipe(h=>{const E=_optionalChain([n, 'access', _8 => _8.find, 'call', _9 => _9(P=>P.status===o), 'optionalAccess', _10 => _10.pipe]);if(!E)throw _valleyed.PipeError.root(`schema not defined for status code: ${o}`,h);return _valleyed.v.assert(E,h)}),u.response[e.key]=n.map(h=>({status:h.status,contentType:h.contentType,schema:_valleyed.v.schema(h.pipe)}))}});const g=_valleyed.v.object(p);_valleyed.v.compile(g,{allErrors:!0});const m=_valleyed.v.object(R);return _valleyed.v.compile(m,{allErrors:!0}),{jsonSchema:u,validateRequest:async e=>{if(!Object.keys(p))return e;const a=t.context?await t.context(e):{};e.context=a;const n=_valleyedmincjs.requestLocalStorage.run(e,()=>_valleyed.v.validate(g,{params:e.params,headers:e.headers,query:e.query,body:e.body}));if(!n.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, n.error);return e.params=n.value.params,e.headers=n.value.headers,e.query=n.value.query,e.body=n.value.body,e},validateResponse:async e=>{if(!Object.keys(R))return e;o=e.status,d=e.contentType;const a=_valleyedmincjs.responseLocalStorage.run(e,()=>_valleyed.v.validate(m,{responseHeaders:e.headers,response:e.body}));if(!a.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, a.error);return e.body=a.value.response,e.headers=a.value.responseHeaders,e}}}test(){return _supertest2.default.call(void 0, this.server)}async start(){const s=this.config.port,t=_indexmincjs3.Instance.get(),{app:i}=t.settings;this.config.healthPath&&this.addRoute({method:_typesmincjs.Methods.get,path:this.config.healthPath,handler:async o=>o.res({body:`${t.id}(${i.name}) service running`,contentType:"text/plain"})}),this.implementations.registerNotFoundHandler(async o=>{const d=await this.implementations.parseRequest(o);throw new (0, _indexmincjs.NotFoundError)(`Route ${d.path} not found`)}),this.implementations.registerErrorHandler(async(o,d,u)=>{_indexmincjs3.Instance.get().log.error({error:o},"Uncaught error in route handler");const p=o instanceof _indexmincjs.RequestError?new (0, _requestsmincjs.Response)({body:o.serializedErrors,status:o.statusCode}):new (0, _requestsmincjs.Response)({body:[{message:"Something went wrong",data:o.message}],status:_typesmincjs.StatusCodes.BadRequest});return await this.implementations.handleResponse(u,p)}),await Promise.all(this.#t.map(o=>o()));const c=await this.implementations.start(s);return c&&_indexmincjs3.Instance.get().log.info(`${t.id}(${i.name}) service listening on port ${s}`),c}}exports.Server = ae;
|
|
2
2
|
//# sourceMappingURL=base.min.cjs.map
|