equipped 5.1.10 → 5.2.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 +23 -0
- package/dist/cjs/dbs/mongo/changes.cjs +5 -1
- package/dist/cjs/dbs/mongo/changes.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +1 -2
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/errors/types/tokenExpired.cjs +12 -0
- package/dist/cjs/errors/types/tokenExpired.cjs.map +1 -0
- package/dist/cjs/errors/types/{refreshTokenMisusedError.min.cjs → tokenExpired.min.cjs} +2 -2
- package/dist/cjs/errors/types/tokenExpired.min.cjs.map +1 -0
- package/dist/cjs/events/types/kafka.cjs +13 -16
- 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/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs.map +1 -1
- package/dist/cjs/server/impls/base.cjs +17 -17
- package/dist/cjs/server/impls/base.cjs.map +1 -1
- package/dist/cjs/server/impls/base.min.cjs +1 -1
- package/dist/cjs/server/impls/base.min.cjs.map +1 -1
- package/dist/cjs/server/impls/express.cjs +2 -13
- package/dist/cjs/server/impls/express.cjs.map +1 -1
- package/dist/cjs/server/impls/express.min.cjs +1 -1
- package/dist/cjs/server/impls/express.min.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.cjs +3 -14
- package/dist/cjs/server/impls/fastify.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +1 -1
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +1 -1
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.cjs +9 -52
- package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +1 -1
- package/dist/cjs/server/pipes.cjs +23 -8
- package/dist/cjs/server/pipes.cjs.map +1 -1
- package/dist/cjs/server/pipes.min.cjs +1 -1
- package/dist/cjs/server/pipes.min.cjs.map +1 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +21 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/base.cjs +20 -0
- package/dist/cjs/server/requests-auth-methods/base.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/base.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +1 -0
- package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.cjs +2 -1
- package/dist/cjs/server/requests-auth-methods/index.cjs.map +1 -0
- package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.min.cjs +1 -1
- package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/jwt.cjs +78 -0
- package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +1 -0
- package/dist/cjs/server/requests.cjs +1 -9
- package/dist/cjs/server/requests.cjs.map +1 -1
- package/dist/cjs/server/requests.min.cjs +1 -1
- package/dist/cjs/server/requests.min.cjs.map +1 -1
- package/dist/cjs/server/routes.cjs +1 -2
- package/dist/cjs/server/routes.cjs.map +1 -1
- package/dist/cjs/server/routes.min.cjs +1 -1
- package/dist/cjs/server/routes.min.cjs.map +1 -1
- package/dist/cjs/server/sockets.cjs +2 -4
- package/dist/cjs/server/sockets.cjs.map +1 -1
- package/dist/cjs/server/sockets.min.cjs +1 -1
- package/dist/cjs/server/sockets.min.cjs.map +1 -1
- package/dist/cjs/server/types.cjs +1 -1
- package/dist/cjs/server/types.cjs.map +1 -1
- package/dist/cjs/server/types.min.cjs +1 -1
- package/dist/cjs/server/types.min.cjs.map +1 -1
- package/dist/esm/dbs/mongo/changes.min.mjs +1 -1
- package/dist/esm/dbs/mongo/changes.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/changes.mjs +5 -1
- package/dist/esm/dbs/mongo/changes.mjs.map +1 -1
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.min.mjs.map +1 -1
- package/dist/esm/errors/index.mjs +1 -2
- package/dist/esm/errors/index.mjs.map +1 -1
- package/dist/esm/errors/types/tokenExpired.min.mjs +2 -0
- package/dist/esm/errors/types/tokenExpired.min.mjs.map +1 -0
- package/dist/esm/errors/types/tokenExpired.mjs +12 -0
- package/dist/esm/errors/types/tokenExpired.mjs.map +1 -0
- 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 +13 -16
- package/dist/esm/events/types/kafka.mjs.map +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.min.mjs.map +1 -1
- package/dist/esm/instance/index.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 +9 -9
- package/dist/esm/server/impls/base.mjs.map +1 -1
- package/dist/esm/server/impls/express.min.mjs +1 -1
- package/dist/esm/server/impls/express.min.mjs.map +1 -1
- package/dist/esm/server/impls/express.mjs +2 -13
- package/dist/esm/server/impls/express.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.min.mjs +1 -1
- package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.mjs +2 -13
- package/dist/esm/server/impls/fastify.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.min.mjs.map +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/server/index.mjs.map +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.mjs +9 -52
- package/dist/esm/server/middlewares/requireAuthUser.mjs.map +1 -1
- package/dist/esm/server/pipes.min.mjs +1 -1
- package/dist/esm/server/pipes.min.mjs.map +1 -1
- package/dist/esm/server/pipes.mjs +23 -8
- package/dist/esm/server/pipes.mjs.map +1 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs +21 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/base.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/base.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/base.mjs +20 -0
- package/dist/esm/server/requests-auth-methods/base.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/index.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/index.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/index.mjs +4 -0
- package/dist/esm/server/requests-auth-methods/index.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/jwt.mjs +78 -0
- package/dist/esm/server/requests-auth-methods/jwt.mjs.map +1 -0
- package/dist/esm/server/requests.min.mjs +1 -1
- package/dist/esm/server/requests.min.mjs.map +1 -1
- package/dist/esm/server/requests.mjs +1 -9
- package/dist/esm/server/requests.mjs.map +1 -1
- package/dist/esm/server/routes.min.mjs +1 -1
- package/dist/esm/server/routes.min.mjs.map +1 -1
- package/dist/esm/server/routes.mjs +1 -2
- package/dist/esm/server/routes.mjs.map +1 -1
- package/dist/esm/server/sockets.min.mjs +1 -1
- package/dist/esm/server/sockets.min.mjs.map +1 -1
- package/dist/esm/server/sockets.mjs +2 -4
- package/dist/esm/server/sockets.mjs.map +1 -1
- package/dist/esm/server/types.min.mjs +1 -1
- package/dist/esm/server/types.min.mjs.map +1 -1
- package/dist/esm/server/types.mjs +1 -1
- package/dist/esm/server/types.mjs.map +1 -1
- package/dist/types/cache/index.d.ts +7 -1
- package/dist/types/dbs/mongo/changes.js +5 -1
- package/dist/types/errors/index.d.ts +7 -12
- package/dist/types/errors/index.js +1 -2
- package/dist/types/errors/types/tokenExpired.js +11 -0
- package/dist/types/events/types/kafka.js +13 -16
- package/dist/types/{fastify-CDJ2WuLy.d.ts → fastify-B6FUtYe9.d.ts} +5 -4
- package/dist/types/index.d.ts +4 -4
- package/dist/types/instance/index.d.ts +63 -16
- package/dist/types/{requestError-DqkM5BfW.d.ts → requestError-7N-ngghg.d.ts} +97 -80
- package/dist/types/server/impls/base.js +9 -9
- package/dist/types/server/impls/express.js +2 -13
- package/dist/types/server/impls/fastify.js +2 -13
- package/dist/types/server/index.d.ts +62 -20
- package/dist/types/server/index.js +1 -1
- package/dist/types/server/middlewares/requireAuthUser.js +9 -52
- package/dist/types/server/pipes.js +23 -8
- package/dist/types/server/requests-auth-methods/apiKeys.js +20 -0
- package/dist/types/server/requests-auth-methods/base.js +19 -0
- package/dist/types/server/requests-auth-methods/index.js +3 -0
- package/dist/types/server/requests-auth-methods/jwt.js +77 -0
- package/dist/types/server/requests.js +1 -9
- package/dist/types/server/routes.js +1 -2
- package/dist/types/server/sockets.js +2 -4
- package/dist/types/server/types.js +1 -1
- package/dist/types/{validationError-BMKfV51p.d.ts → validationError-BB4cfdZa.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +3 -9
- package/package.json +13 -12
- package/dist/cjs/errors/types/authorizationExpired.cjs +0 -12
- package/dist/cjs/errors/types/authorizationExpired.cjs.map +0 -1
- package/dist/cjs/errors/types/authorizationExpired.min.cjs +0 -2
- package/dist/cjs/errors/types/authorizationExpired.min.cjs.map +0 -1
- package/dist/cjs/errors/types/refreshTokenMisusedError.cjs +0 -12
- package/dist/cjs/errors/types/refreshTokenMisusedError.cjs.map +0 -1
- package/dist/cjs/errors/types/refreshTokenMisusedError.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/parseAuthUser.cjs +0 -21
- package/dist/cjs/server/middlewares/parseAuthUser.cjs.map +0 -1
- package/dist/cjs/server/middlewares/parseAuthUser.min.cjs +0 -2
- package/dist/cjs/server/middlewares/parseAuthUser.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/apiKeys.cjs +0 -6
- package/dist/cjs/server/requests-auth/apiKeys.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/apiKeys.min.cjs +0 -2
- package/dist/cjs/server/requests-auth/apiKeys.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/index.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/index.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/tokens.cjs +0 -92
- package/dist/cjs/server/requests-auth/tokens.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/tokens.min.cjs +0 -2
- package/dist/cjs/server/requests-auth/tokens.min.cjs.map +0 -1
- package/dist/esm/errors/types/authorizationExpired.min.mjs +0 -2
- package/dist/esm/errors/types/authorizationExpired.min.mjs.map +0 -1
- package/dist/esm/errors/types/authorizationExpired.mjs +0 -12
- package/dist/esm/errors/types/authorizationExpired.mjs.map +0 -1
- package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs +0 -2
- package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/refreshTokenMisusedError.mjs +0 -12
- package/dist/esm/errors/types/refreshTokenMisusedError.mjs.map +0 -1
- package/dist/esm/server/middlewares/parseAuthUser.min.mjs +0 -2
- package/dist/esm/server/middlewares/parseAuthUser.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/parseAuthUser.mjs +0 -21
- package/dist/esm/server/middlewares/parseAuthUser.mjs.map +0 -1
- package/dist/esm/server/requests-auth/apiKeys.min.mjs +0 -2
- package/dist/esm/server/requests-auth/apiKeys.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/apiKeys.mjs +0 -6
- package/dist/esm/server/requests-auth/apiKeys.mjs.map +0 -1
- package/dist/esm/server/requests-auth/index.min.mjs +0 -2
- package/dist/esm/server/requests-auth/index.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/index.mjs +0 -3
- package/dist/esm/server/requests-auth/index.mjs.map +0 -1
- package/dist/esm/server/requests-auth/tokens.min.mjs +0 -2
- package/dist/esm/server/requests-auth/tokens.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/tokens.mjs +0 -92
- package/dist/esm/server/requests-auth/tokens.mjs.map +0 -1
- package/dist/types/base-8yVXb67P.d.ts +0 -8
- package/dist/types/errors/types/authorizationExpired.js +0 -11
- package/dist/types/errors/types/refreshTokenMisusedError.js +0 -11
- package/dist/types/server/middlewares/parseAuthUser.js +0 -20
- package/dist/types/server/requests-auth/apiKeys.js +0 -5
- package/dist/types/server/requests-auth/index.js +0 -2
- package/dist/types/server/requests-auth/tokens.js +0 -91
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
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.2.0](https://github.com/kevinand11/equipped/compare/v5.1.11...v5.2.0) (2026-02-03)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* auth methods support registering route security ([49ae6de](https://github.com/kevinand11/equipped/commit/49ae6de0a73c5e9ae112d1c26e938e68041195c6))
|
|
11
|
+
* impl cookie request auth ([996e6ce](https://github.com/kevinand11/equipped/commit/996e6ce34943749a3ebc900a38c70119c5f0670e))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* cors behavior ([c48a35a](https://github.com/kevinand11/equipped/commit/c48a35ac61d59c3274a484cc7758cc561e303a95))
|
|
17
|
+
* remove unused context from request object and schema ([cf771a0](https://github.com/kevinand11/equipped/commit/cf771a0521ba98b54bbd2aec3b6a203ffd362c56))
|
|
18
|
+
* types of instance.createX ([b8589e7](https://github.com/kevinand11/equipped/commit/b8589e76dcdb31f7536777f3c1042c42a9265ea2))
|
|
19
|
+
* validate response cookie value not whole cookie object ([289496a](https://github.com/kevinand11/equipped/commit/289496a8192aa3f4f05fc500561131fd269e5698))
|
|
20
|
+
|
|
21
|
+
### [5.1.11](https://github.com/kevinand11/equipped/compare/v5.1.10...v5.1.11) (2026-01-25)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
* enable heartbeats for cdc ([f29c586](https://github.com/kevinand11/equipped/commit/f29c586c330f34a7e9e646531bc183fb3b610ec5))
|
|
27
|
+
|
|
5
28
|
### [5.1.10](https://github.com/kevinand11/equipped/compare/v5.1.9...v5.1.10) (2026-01-19)
|
|
6
29
|
|
|
7
30
|
|
|
@@ -55,7 +55,11 @@ class MongoDbChange extends _changescjs.DbChange {
|
|
|
55
55
|
"capture.mode": "change_streams_update_full_with_pre_image",
|
|
56
56
|
"mongodb.connection.string": config.uri,
|
|
57
57
|
"collection.include.list": dbColName,
|
|
58
|
-
"snapshot.mode": "
|
|
58
|
+
"snapshot.mode": "when_needed",
|
|
59
|
+
"capture.scope": "collection",
|
|
60
|
+
"capture.target": dbColName,
|
|
61
|
+
"heartbeat.interval.ms": "60000",
|
|
62
|
+
"errors.max.retries": "3"
|
|
59
63
|
});
|
|
60
64
|
if (started) return { done: true, value: true };
|
|
61
65
|
await collection.findOneAndUpdate(condition, { $set: { colName } }, { upsert: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AAAA,q+BAAwC;AACxC,oCAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AACtC,yFAAsB;AAIf,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,mBAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK;AAAA,IAC/B,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEF,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACvBuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs"],"names":[],"mappings":"AAAA,q+BAAwC;AACxC,oCAAuB;AAEvB,kDAA8B;AAC9B,qDAAyB;AACzB,sDAAsB;AACtB,iDAAsC;AACtC,yFAAsB;AAIf,MAAM,cAAA,QAA6F,qBAAwB;AAAA,EACjI,CAAA,QAAA,EAAW,KAAA;AAAA,EAEX,WAAA,CACC,MAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACC;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAE/B,IAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAChB,IAAA,CAAK,IAAA,EACF;AAAA,MACA,GAAG,IAAA;AAAA,MACH,GAAA,mBAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,UAAK,IAAA,CAAK;AAAA,IAC/B,EAAA,EACC,KAAA,CAAA;AAEJ,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,QAAA,EAAU,UAAA,CAAW,cAAA;AAC3B,IAAA,MAAM,UAAA,EAAY,CAAA,EAAA;AACD,IAAA;AAEF,IAAA;AACG,IAAA;AAEF,IAAA;AACC,MAAA;AAEH,MAAA;AACI,MAAA;AAEL,MAAA;AACD,MAAA;AACC,MAAA;AAED,MAAA;AACC,QAAA;AACF,UAAA;AACI,UAAA;AACZ,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACD,UAAA;AACH,UAAA;AACT,QAAA;AACc,MAAA;AACJ,QAAA;AACG,UAAA;AACN,UAAA;AACP,QAAA;AACF,IAAA;AAEQ,IAAA;AACR,MAAA;AACY,MAAA;AACF,QAAA;AACJ,QAAA;AAEC,QAAA;AACO,UAAA;AACL,YAAA;AACL,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AAEG,YAAA;AACE,YAAA;AACA,YAAA;AACG,YAAA;AACA,YAAA;AACV,UAAA;AACA,UAAA;AACA,UAAA;AACQ,QAAA;AACV,MAAA;AACA,MAAA;AACD,IAAA;AACD,EAAA;AACD;ACvBuB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.cjs","sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('mongodb');var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');require('../base/core');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; }require('mongodb');var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _changesmincjs = require('../base/changes.min.cjs');require('../base/core');class S extends _changesmincjs.DbChange{#e=!1;constructor(u,c,n,b,g){super(c,b,g);const l=e=>e._id?{...e,_id:_nullishCoalesce(e._id.$oid, () => (e._id))}:void 0,h=n.dbName,d=n.collectionName,r=`${h}.${d}`,f=`${_changesmincjs.TopicPrefix}.${r}`,a="5f5f65717569707065645f5f",p={_id:a};c.eventBus.createStream(f,{skipScope:!0}).subscribe(async e=>{const i=e.op;let t=JSON.parse(_nullishCoalesce(e.before, () => ("null"))),o=JSON.parse(_nullishCoalesce(e.after, () => ("null")));t&&(t=l(t)),o&&(o=l(o)),!(_optionalChain([t, 'optionalAccess', _2 => _2._id])===a||_optionalChain([o, 'optionalAccess', _3 => _3._id])===a)&&(i==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):i==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:_valleyed.differ.from(_valleyed.differ.diff(t,o))}):i==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),_indexmincjs3.Instance.on("start",async()=>{this.#e||(this.#e=!0,await _indexmincjs5.retry.call(void 0, async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":u.uri,"collection.include.list":r,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":r,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await n.findOneAndUpdate(p,{$set:{colName:d}},{upsert:!0}),await n.findOneAndDelete(p),_indexmincjs3.Instance.get().log.warn(`Waiting for db changes for ${r} to start...`),{done:!1}),6,3e4).catch(e=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Failed to start db changes",{dbColName:r},e))))},10)}}exports.MongoDbChange = S;
|
|
2
2
|
//# sourceMappingURL=changes.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","dbName","colName","collection","dbColName","topic","TestId","condition"],"mappings":"AAAA,osBAAwC,oCACjB,yDAGd,4DACa,6DACgB,wDAQrC,wBAOOA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACU,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,CAAAA,CAAK,KAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEEC,CAAAA,MAAoB,CAAA,CAAA,CAAA,EACpBC,CAAUC,CAAAA,GAAW,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAA,CAAA,CACrBC,GAAY,CAAA,IAAS,SAAIF,CAAO,CAAA,KAChCG,CAAQ,CAAA,KAAc,CAAA,CAAID,CAAS,CAAA,CAAA,CAEnCE,MAAS,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CACTC,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': '
|
|
1
|
+
{"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"names":["change","data","dbName","colName","collection","dbColName","topic","TestId","condition"],"mappings":"AAAA,osBAAwC,oCACjB,yDAGd,4DACa,6DACgB,wDAQrC,wBAOOA,MAEN,EAAA,QAAiBC,uBAChBA,CAAAA,CAAK,CAAA,CAAA,CAAA,CACF,CACA,WACU,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAWA,CAAAA,CAAK,KAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEEC,CAAAA,MAAoB,CAAA,CAAA,CAAA,EACpBC,CAAUC,CAAAA,GAAW,CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAA,CAAA,CACrBC,GAAY,CAAA,IAAS,SAAIF,CAAO,CAAA,KAChCG,CAAQ,CAAA,KAAc,CAAA,CAAID,CAAS,CAAA,CAAA,CAEnCE,MAAS,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CACTC,EAAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/changes.min.cjs","sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrorcjs = require('./equippedError.cjs'); _createStarExport(_equippedErrorcjs);
|
|
2
2
|
var _requestErrorcjs = require('./requestError.cjs'); _createStarExport(_requestErrorcjs);
|
|
3
|
-
var _authorizationExpiredcjs = require('./types/authorizationExpired.cjs'); _createStarExport(_authorizationExpiredcjs);
|
|
4
3
|
var _badRequestErrorcjs = require('./types/badRequestError.cjs'); _createStarExport(_badRequestErrorcjs);
|
|
5
4
|
var _notAuthenticatedErrorcjs = require('./types/notAuthenticatedError.cjs'); _createStarExport(_notAuthenticatedErrorcjs);
|
|
6
5
|
var _notAuthorizedErrorcjs = require('./types/notAuthorizedError.cjs'); _createStarExport(_notAuthorizedErrorcjs);
|
|
7
6
|
var _notFoundErrorcjs = require('./types/notFoundError.cjs'); _createStarExport(_notFoundErrorcjs);
|
|
8
|
-
var
|
|
7
|
+
var _tokenExpiredcjs = require('./types/tokenExpired.cjs'); _createStarExport(_tokenExpiredcjs);
|
|
9
8
|
var _validationErrorcjs = require('./types/validationError.cjs'); _createStarExport(_validationErrorcjs);
|
|
10
9
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,8bAAc;AACd,0FAAc;AACd,
|
|
1
|
+
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,8bAAc;AACd,0FAAc;AACd,yGAAc;AACd,2HAAc;AACd,kHAAc;AACd,mGAAc;AACd,gGAAc;AACd,yGAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/index.cjs","sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrormincjs = require('./equippedError.min.cjs'); _createStarExport(_equippedErrormincjs);var _requestErrormincjs = require('./requestError.min.cjs'); _createStarExport(_requestErrormincjs);var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrormincjs = require('./equippedError.min.cjs'); _createStarExport(_equippedErrormincjs);var _requestErrormincjs = require('./requestError.min.cjs'); _createStarExport(_requestErrormincjs);var _badRequestErrormincjs = require('./types/badRequestError.min.cjs'); _createStarExport(_badRequestErrormincjs);var _notAuthenticatedErrormincjs = require('./types/notAuthenticatedError.min.cjs'); _createStarExport(_notAuthenticatedErrormincjs);var _notAuthorizedErrormincjs = require('./types/notAuthorizedError.min.cjs'); _createStarExport(_notAuthorizedErrormincjs);var _notFoundErrormincjs = require('./types/notFoundError.min.cjs'); _createStarExport(_notFoundErrormincjs);var _tokenExpiredmincjs = require('./types/tokenExpired.min.cjs'); _createStarExport(_tokenExpiredmincjs);var _validationErrormincjs = require('./types/validationError.min.cjs'); _createStarExport(_validationErrormincjs);
|
|
2
2
|
//# sourceMappingURL=index.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,wcACA,oGACc,
|
|
1
|
+
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,wcACA,oGACc,mHACA,qIACA,4HAEd,6GACc,0GAAA,mHAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/index.min.cjs","sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexcjs = require('../../server/index.cjs');
|
|
2
|
+
var _requestErrorcjs = require('../requestError.cjs');
|
|
3
|
+
class TokenExpired extends _requestErrorcjs.RequestError {
|
|
4
|
+
__init() {this.statusCode = _indexcjs.StatusCodes.TokenExpired}
|
|
5
|
+
constructor(message = "Token expired", cause) {
|
|
6
|
+
super(message, [{ message }], cause);TokenExpired.prototype.__init.call(this);;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.TokenExpired = TokenExpired;
|
|
12
|
+
//# sourceMappingURL=tokenExpired.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts","/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.cjs"],"names":[],"mappings":"AAAA,2HAA4B;AAC5B,sDAA6B;AAEtB,MAAM,aAAA,QAAqB,8BAAa;AAAA,iBAC9C,WAAA,EAAa,qBAAA,CAAY,aAAA;AAAA,EAEzB,WAAA,CAAY,QAAA,EAAU,eAAA,EAAiB,KAAA,EAAiB;AACvD,IAAA,KAAA,CAAM,OAAA,EAAS,CAAC,EAAE,QAAQ,CAAC,CAAA,EAAG,KAAK,2CAAA;AAAA,EACpC;AACD;ACDA;AACE;AACF,oCAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.cjs","sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexmincjs = require('../../server/index.min.cjs');var _requestErrormincjs = require('../requestError.min.cjs');class d extends _requestErrormincjs.RequestError{__init() {this.statusCode=_indexmincjs.StatusCodes.
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexmincjs = require('../../server/index.min.cjs');var _requestErrormincjs = require('../requestError.min.cjs');class d extends _requestErrormincjs.RequestError{__init() {this.statusCode=_indexmincjs.StatusCodes.TokenExpired}constructor(o="Token expired",r){super(o,[{message:o}],r);d.prototype.__init.call(this);}}exports.TokenExpired = d;
|
|
2
|
+
//# sourceMappingURL=tokenExpired.min.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts"],"names":["StatusCodes","cause"],"mappings":"AAAA,kIACS,6DAGR,MAAaA,EAAY,QAAA,gCAAA,gBAAA,UAEzB,CAAA,wBAAA,CAAA,aAAsB,WACrB,CAAA,CAAA,CAAA,eAA2B,CAAA,CAAGC,CAAK,CACpC,KACD,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gCAAA,CAAA,CAAA,yBAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.min.cjs","sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n"]}
|
|
@@ -16,17 +16,13 @@ class KafkaEventBus extends _basecjs.EventBus {
|
|
|
16
16
|
const topic = options.skipScope ? topicName : _indexcjs3.Instance.get().getScopedName(topicName);
|
|
17
17
|
return {
|
|
18
18
|
publish: async (data) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return true;
|
|
27
|
-
} catch (e) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
19
|
+
const producer = this.#client.producer();
|
|
20
|
+
await producer.connect();
|
|
21
|
+
await producer.send({
|
|
22
|
+
topic,
|
|
23
|
+
messages: [{ value: JSON.stringify(data) }]
|
|
24
|
+
});
|
|
25
|
+
return true;
|
|
30
26
|
},
|
|
31
27
|
subscribe: (onMessage) => {
|
|
32
28
|
const subscribe = async () => {
|
|
@@ -60,11 +56,12 @@ class KafkaEventBus extends _basecjs.EventBus {
|
|
|
60
56
|
};
|
|
61
57
|
}
|
|
62
58
|
async #getAdmin() {
|
|
63
|
-
if (!this.#admin)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
if (!this.#admin)
|
|
60
|
+
this.#admin = (async () => {
|
|
61
|
+
const admin = this.#client.admin();
|
|
62
|
+
await admin.connect();
|
|
63
|
+
return admin;
|
|
64
|
+
})();
|
|
68
65
|
return this.#admin;
|
|
69
66
|
}
|
|
70
67
|
async #createTopic(topic) {
|
|
@@ -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,0IAAwB;AAExB,kDAA8B;AAC9B,qDAAyB;AAEzB,sDAAuC;AACvC,sCAA6C;AAGtC,MAAM,cAAA,QAAsB,kBAAS;AAAA,EAC3C,CAAA,MAAA;AAAA,EACA,CAAA,KAAA;AAAA,EACA,WAAA,CAAY,MAAA,EAAqB;AAChC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,wBAAA,CAAQ,KAAA,CAAM;AAAA,MAChC,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,wBAAA,CAAQ,QAAA,CAAS,QAAQ;AAAA,IAC1D,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,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GAAwB;AACvC,QAAA,
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/kafka.ts","/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs"],"names":[],"mappings":"AAAA,0IAAwB;AAExB,kDAA8B;AAC9B,qDAAyB;AAEzB,sDAAuC;AACvC,sCAA6C;AAGtC,MAAM,cAAA,QAAsB,kBAAS;AAAA,EAC3C,CAAA,MAAA;AAAA,EACA,CAAA,KAAA;AAAA,EACA,WAAA,CAAY,MAAA,EAAqB;AAChC,IAAA,KAAA,CAAM,CAAA;AACN,IAAA,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,wBAAA,CAAQ,KAAA,CAAM;AAAA,MAChC,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,wBAAA,CAAQ,QAAA,CAAS,QAAQ;AAAA,IAC1D,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,mBAAA,CAAS,GAAA,CAAI,CAAA,CAAE,aAAA,CAAc,SAAS,CAAA;AACpF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,IAAA,EAAA,GAAwB;AACvC,QAAA,MAAM,SAAA,EAAW,IAAA,CAAK,CAAA,MAAA,CAAQ,QAAA,CAAS,CAAA;AACvC,QAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAA;AACvB,QAAA,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,IAAI,EAAE,CAAC;AAAA,QAC3C,CAAC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACR,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;AAE+B,UAAA;AAExC,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;AACP,IAAA;AACkB,MAAA;AACO,QAAA;AACb,QAAA;AACb,QAAA;AACL,MAAA;AACQ,IAAA;AACb,EAAA;AAEkC,EAAA;AACE,IAAA;AAC4B,IAAA;AAChE,EAAA;AAEoC,EAAA;AACA,IAAA;AACa,IAAA;AAAE,IAAA;AACnD,EAAA;AACD;ACXyE;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.cjs","sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\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\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\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({ kafkaJS: { 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 = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\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});var _kafkajavascript = require('@confluentinc/kafka-javascript');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 S extends _basemincjs.EventBus{#t;#a;constructor(t){super(),this.#t=new _kafkajavascript.KafkaJS.Kafka({kafkaJS:{...t,logLevel:_kafkajavascript.KafkaJS.logLevel.NOTHING}})}createStream(t,e={}){const n=e.skipScope?t:_indexmincjs3.Instance.get().getScopedName(t);return{publish:async r=>{
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _kafkajavascript = require('@confluentinc/kafka-javascript');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 S extends _basemincjs.EventBus{#t;#a;constructor(t){super(),this.#t=new _kafkajavascript.KafkaJS.Kafka({kafkaJS:{...t,logLevel:_kafkajavascript.KafkaJS.logLevel.NOTHING}})}createStream(t,e={}){const n=e.skipScope?t:_indexmincjs3.Instance.get().getScopedName(t);return{publish:async r=>{const i=this.#t.producer();return await i.connect(),await i.send({topic:n,messages:[{value:JSON.stringify(r)}]}),!0},subscribe:r=>{const i=async()=>{await this.#n(n);const o=e.fanout?_indexmincjs3.Instance.get().getScopedName(`${_indexmincjs3.Instance.get().id}-fanout-${_indexmincjs5.Random.string(10)}`):n,s=this.#t.consumer({kafkaJS:{groupId:o}});await s.connect(),await s.subscribe({topic:n}),await s.run({eachMessage:async({message:c})=>{await _indexmincjs3.Instance.resolveBeforeCrash(async()=>{c.value&&await r(_indexmincjs5.parseJSONValue.call(void 0, c.value.toString()))}).catch(p=>_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Error processing kafka event",{topic:n,groupId:o,options:e},p)))}}),e.fanout&&_indexmincjs3.Instance.on("close",async()=>{await s.disconnect(),await this.#i(o)},10)};_indexmincjs3.Instance.on("start",i,2)}}}async#e(){return this.#a||(this.#a=(async()=>{const t=this.#t.admin();return await t.connect(),t})()),this.#a}async#n(t){await(await this.#e()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#e()).deleteGroups([t]).catch(()=>{})}}exports.KafkaEventBus = S;
|
|
2
2
|
//# sourceMappingURL=kafka.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["KafkaEventBus","#client","KafkaJS","options","topicName","Instance","producer","data","onMessage","#createTopic","
|
|
1
|
+
{"version":3,"sources":["../../../../src/events/types/kafka.ts"],"names":["KafkaEventBus","#client","KafkaJS","options","topicName","Instance","producer","data","onMessage","subscribe","#createTopic","topic","Random"],"mappings":"AAAA,0IAAwB,yDAGf,4DAEQ,6DAIJA,6CAKNC,MAAcC,EAAQ,QAC1B,oBAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,WAAW,CAAA,CAAUA,CAAAA,CAAQ,KAAA,CAAA,CAAA,CAAA,IAAS,CAAA,CAAA,CAAA,CAAQ,IAI3D,wBAAA,CAAA,KAAA,CAAA,CAAA,OAA4EC,CAAkC,CAAC,GAC9G,CAAA,CAAA,QAAsB,CAAA,wBAAA,CAAA,QAAYC,CAAYC,OAAa,CAAE,CAAA,CAAA,CAAA,YAAuB,CAAA,CACpF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CACN,MAAA,CAAA,CAAS,CAAA,CAAA,SACR,CAAA,CAAA,CAAA,sBAAA,CAAMC,GAAW,CAAA,CAAA,CAAA,aAAsB,CAAA,CACvC,CAAA,CAAA,MAAA,CAAA,OAAe,CAAA,MAAQ,CAAA,EACvB,CAAA,MAAe,CAAA,CAAA,IACd,CAAA,CAAA,CAAA,CAAA,QACA,CAAA,CAAA,CAAA,OAAa,MAAO,CAAA,CAAK,OAAA,CAAA,CAAA,CAAUC,MACnC,CACM,CAAA,IAER,CAAA,CAAA,KAAA,CAAA,CAAYC,CAAAA,QACX,CAAMC,CAAAA,CAAY,KAAA,CAAA,IACjB,CAAA,SAAM,CAAKC,CAAAA,CAAAA,CAAaC,CAAK,CAAA,CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,SAAwB,CAAA,CAAA,EACrBN,CAAS,MAAM,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,MAAiBA,IAAS,CAAI,CAAA,CAAE,CAAA,CAAE,CAAA,CAAA,MAAA,CAAA,CAAA,CAAWO,CAAAA,MAAO,CAAA,sBAAO,CAAA,GAAG,CAAE,CAAA,CAC/ED,aAC2B,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/events/types/kafka.min.cjs","sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\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\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\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({ kafkaJS: { 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 = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts","/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs"],"names":[],"mappings":"AAAA,y1BAAkC;AAClC,4BAAqB;AACrB,oCAAyE;AAEzE,+CAA8B;AAC9B,uCAAuE;AACvE;AACC;AAEA;AAEA;AAEA;AACA;AAEA;AAAA,6CAIM;AAEA,MAAM,SAAS;AAAA,EACrB,OAAO,CAAA,EAAA;AAAA,EACP,OAAO,CAAA,QAAA;AAAA,EACP,OAAO,CAAA,MAAA,EAAmD,CAAC,CAAA;AAAA,EAClD;AAAA,EACA;AAAA,EAED,WAAA,CAAY,QAAA,EAAoB;AACvC,IAAA,QAAA,CAAS,CAAA,SAAA,EAAY,IAAA;AACrB,IAAA,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,EAAM,4BAAA;AAAY,MACtB,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA;AAAA,MACzB,WAAA,EAAa;AAAA,QACZ,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QACzB,KAAA,EAAO,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QAC3B,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QACzB,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe;AAAA,MAC1B,CAAA;AAAA,MACA,KAAA,EAAO,CAAA,EAAA,GAAA,CAAO;AAAA,QACb,UAAA,EAAY,QAAA,CAAS,CAAA;AAAA,MACtB,CAAA;AAAA,IACD,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACjC;AAAA,EAEA,KAAA,CAAM,EAAA,EAAY;AACjB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,GAAA,IAAQ,KAAA,CAAA,EAAW,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,4BAAA,CAAc,+BAAA,EAAiC,CAAC,CAAC,CAAC,CAAA;AAC5G,IAAA,QAAA,CAAS,CAAA,GAAA,EAAM,EAAA;AAAA,EAChB;AAAA,EAEA,IAAI,EAAA,CAAA,EAAK;AACR,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,GAAA,IAAQ,KAAA,CAAA,EAAW,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,4BAAA,CAAc,mCAAA,EAAqC,CAAC,CAAC,CAAC,CAAA;AAChH,IAAA,OAAO,QAAA,CAAS,CAAA,EAAA;AAAA,EACjB;AAAA,EAEA,aAAA,CAAc,IAAA,EAAc,IAAA,EAAM,GAAA,EAAK;AACtC,IAAA,OAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC/C;AAAA,EAEA,WAAA,
|
|
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, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\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 keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\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(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n",null]}
|
|
@@ -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,y1BAAkC,4BACb,oCACoD,sDAGlB,8CAItD,oDAgBOA,MACE,CAAA,CAAA,MACA,CAAA,CAAA,CAAA,MAED,CAAA,CAAA,CAAA,MAAgC,CACvCC,CAAAA,oBAASC,CAAAA,CAAAA,CAAY,WACL,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,IAC9B,CAAA,IAAK,CAAA,QACJ,CAAA,MAAO,CAAK,MAAA,CAAA,CAAA,CAAS,CAAA,IAAI,CAAA,GAAA,CACzB,4BAAA,CAAA,KAAA,CAAA,IACC,CAAA,QAAU,CAAA,GAAA,CAAA,KAAA,CAAA,WACHC,CAAAA,CAAK,GAAA,CAAA,cAAA,CAAA,cACZ,CAAA,GAAKA,CAAK,KAAA,CAAA,cAAA,CAAA,cACV,CAAKA,GAAK,CAAA,GAAA,CAAA,cAAA,CAAA,cAEX,CAAA,GAAO,CAAA,GAAA,CAAO,cACb,CAAA,cACD,CAAA,GACA,CACDH,CAAAA,KACD,CAEA,CAAA,CAAA,EAAA,CAAA,CAAMI,UACQC,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOL,KAAS,CAAA,CAAA,CAAM,CAAA,EAAA,CAAIM,CAAAA,CAAc,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,OAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAiC,CAAC,+BAK7FD,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkBL,CAAAA,CAAS,CAAA,IAAA,EAAM,CAAA,CAAA,CAAIM,OAAc,CAAA,CAAA,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAA,CAAA,mCAIlC,CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,aAAc,CAAA,CAAI,CAAA,CAAA,CAAA,GAAU,CAAA,CAAE,MAAQ,CAC/C,IAEA,CAAA,
|
|
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,y1BAAkC,4BACb,oCACoD,sDAGlB,8CAItD,oDAgBOA,MACE,CAAA,CAAA,MACA,CAAA,CAAA,CAAA,MAED,CAAA,CAAA,CAAA,MAAgC,CACvCC,CAAAA,oBAASC,CAAAA,CAAAA,CAAY,WACL,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,IAC9B,CAAA,IAAK,CAAA,QACJ,CAAA,MAAO,CAAK,MAAA,CAAA,CAAA,CAAS,CAAA,IAAI,CAAA,GAAA,CACzB,4BAAA,CAAA,KAAA,CAAA,IACC,CAAA,QAAU,CAAA,GAAA,CAAA,KAAA,CAAA,WACHC,CAAAA,CAAK,GAAA,CAAA,cAAA,CAAA,cACZ,CAAA,GAAKA,CAAK,KAAA,CAAA,cAAA,CAAA,cACV,CAAKA,GAAK,CAAA,GAAA,CAAA,cAAA,CAAA,cAEX,CAAA,GAAO,CAAA,GAAA,CAAO,cACb,CAAA,cACD,CAAA,GACA,CACDH,CAAAA,KACD,CAEA,CAAA,CAAA,EAAA,CAAA,CAAMI,UACQC,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOL,KAAS,CAAA,CAAA,CAAM,CAAA,EAAA,CAAIM,CAAAA,CAAc,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,OAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAiC,CAAC,+BAK7FD,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkBL,CAAAA,CAAS,CAAA,IAAA,EAAM,CAAA,CAAA,CAAIM,OAAc,CAAA,CAAA,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAA,CAAA,mCAIlC,CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,aAAc,CAAA,CAAI,CAAA,CAAA,CAAA,GAAU,CAAA,CAAE,MAAQ,CAC/C,IAEA,CAAA,QAAwCC,CAAAA,GACvC,CAAA,IAAA,CAAOC,CAAAA,CAAE,CAAA,IAAA,CAAA,CAAOC,CAAAA,CAAU,WAG3B,CAAA,CAAA,CAAA,CAAA,OACC,WAAA,CAAA,MAAS,CAAA,uCAAA,CAAA,CAAOC,CAAAA,CAAS,CAAA,UAG1B,CAAA,CAAA,CAAA,CAAA,OAA8I,WAC7I,CAAA,MAAOF,CAAAA,sCAAE,CAAA,CAAA,CAAA,CAAA,CAAA,cAGV,CAAA,CAAA,CAAkCD,CAAAA,OACjC,WAAA,CAAOC,MAAE,CAAA,0CAAA,CAAOG,CAAO,CAAA,CAAGJ,CAAK,QAGhC,CAAA,CAAA,CAAA,CAAA,OACC,WAAA,CAAA,MAAS,CAAA,oCAAA,CAAA,CAAA,CAAA,CAAOK,CAAAA,YAGX,CAAA,CAAA,CAAA,CAAA,OACD,WACH,CAAA,MAAMC,CAASb,4CAAAA,CAASD,CAAAA,CAAO,CAAA,CAAA,MAAa,KAC5C,CAAA,CAAA,CAAA,GAAeC,CAAAA,MAAgB,mCAAA,iBAAA,CAAA,CAAA,CAAY,CAAC,CAAC,KAC9C,SAAA,CAASc,GAAAA,CAAO,CACfd,MAAS,mCAAA,iBAAM,CAAA,CAAA,CAAA,CAAIM,CAAAA,KAAc,SAAA,CAAA,GAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAA2B,CAAC,IAAS,+BACvE,CACD,yBAGqBE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAmB,IAAQ,CAAA,CAAA,CAAG,CAAA,MACpD,CAAA,CAAKO,WAAAA,CAAY,QAChBf,CAAS,CAAA,CAAA,OACR,CAAIM,GAAc,CAAA,CAAA,OAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAA,CAAA,CAAA;AAAA,EAAwCS,CAAAA,CAAY,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,CAAA;AAaR","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.min.cjs","sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\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 keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\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(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
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; }
|
|
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; }require('cors');
|
|
2
|
+
var _socketio = require('socket.io');
|
|
2
3
|
var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);
|
|
3
4
|
var _valleyed = require('valleyed');
|
|
4
5
|
var _indexcjs = require('../../errors/index.cjs');
|
|
5
6
|
var _indexcjs3 = require('../../instance/index.cjs');
|
|
6
7
|
var _indexcjs5 = require('../../validations/index.cjs');
|
|
7
8
|
var _valleyedcjs = require('../../validations/valleyed.cjs');
|
|
8
|
-
var _parseAuthUsercjs = require('../middlewares/parseAuthUser.cjs');
|
|
9
9
|
var _openapicjs = require('../openapi.cjs');
|
|
10
10
|
var _requestscjs = require('../requests.cjs');
|
|
11
11
|
var _routescjs = require('../routes.cjs');
|
|
@@ -20,7 +20,7 @@ const errorsSchemas = Object.entries(_typescjs.StatusCodes).filter(([, value]) =
|
|
|
20
20
|
})
|
|
21
21
|
}));
|
|
22
22
|
class Server {
|
|
23
|
-
constructor(server, config, implementations) {
|
|
23
|
+
constructor(server, config, implementations) {
|
|
24
24
|
this.config = config;
|
|
25
25
|
this.implementations = implementations;
|
|
26
26
|
this.server = server;
|
|
@@ -34,10 +34,13 @@ class Server {
|
|
|
34
34
|
#openapi;
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
get cors() {
|
|
38
|
+
return {
|
|
39
|
+
origin: _optionalChain([this, 'access', _2 => _2.config, 'access', _3 => _3.cors, 'optionalAccess', _4 => _4.origin]),
|
|
40
|
+
methods: (_nullishCoalesce(_optionalChain([this, 'access', _5 => _5.config, 'access', _6 => _6.cors, 'optionalAccess', _7 => _7.methods]), () => ( Object.values(_typescjs.Methods)))).filter((m) => m !== _typescjs.Methods.options).map((m) => m.toUpperCase()),
|
|
41
|
+
credentials: _optionalChain([this, 'access', _8 => _8.config, 'access', _9 => _9.cors, 'optionalAccess', _10 => _10.credentials])
|
|
42
|
+
};
|
|
43
|
+
}
|
|
41
44
|
addRouter(...routers) {
|
|
42
45
|
routers.map((router) => router.routes).forEach((routes) => this.addRoute(...routes));
|
|
43
46
|
}
|
|
@@ -48,9 +51,8 @@ class Server {
|
|
|
48
51
|
const key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`;
|
|
49
52
|
if (this.#routesByKey.get(key))
|
|
50
53
|
throw new (0, _indexcjs.EquippedError)(`Route key ${key} already registered. All route keys must be unique`, { route, key });
|
|
51
|
-
middlewares.
|
|
52
|
-
|
|
53
|
-
_optionalChain([onError, 'optionalAccess', _4 => _4.onSetup, 'optionalCall', _5 => _5(route)]);
|
|
54
|
+
middlewares.forEach((m) => _optionalChain([m, 'access', _11 => _11.onSetup, 'optionalCall', _12 => _12(route)]));
|
|
55
|
+
_optionalChain([onError, 'optionalAccess', _13 => _13.onSetup, 'optionalCall', _14 => _14(route)]);
|
|
54
56
|
const { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema);
|
|
55
57
|
this.#routesByKey.set(key, true);
|
|
56
58
|
await this.#openapi.register(route, jsonSchema);
|
|
@@ -62,7 +64,7 @@ class Server {
|
|
|
62
64
|
const response = rawRes instanceof _requestscjs.Response ? rawRes : new (0, _requestscjs.Response)({ body: rawRes, status: _typescjs.StatusCodes.Ok, headers: {}, piped: false });
|
|
63
65
|
return await this.implementations.handleResponse(res, await validateResponse(response));
|
|
64
66
|
} catch (error) {
|
|
65
|
-
if (_optionalChain([onError, 'optionalAccess',
|
|
67
|
+
if (_optionalChain([onError, 'optionalAccess', _15 => _15.cb])) {
|
|
66
68
|
const rawResponse = await onError.cb(request, this.config, error);
|
|
67
69
|
const response = rawResponse instanceof _requestscjs.Response ? rawResponse : new (0, _requestscjs.Response)({ body: rawResponse, status: _typescjs.StatusCodes.BadRequest, headers: {} });
|
|
68
70
|
return await this.implementations.handleResponse(res, await validateResponse(response));
|
|
@@ -74,8 +76,8 @@ class Server {
|
|
|
74
76
|
});
|
|
75
77
|
}
|
|
76
78
|
#resolveSchema(method, schema) {
|
|
77
|
-
const defaultStatusCode = _nullishCoalesce(_optionalChain([schema, 'optionalAccess',
|
|
78
|
-
const defaultContentType = _nullishCoalesce(_optionalChain([schema, 'optionalAccess',
|
|
79
|
+
const defaultStatusCode = _nullishCoalesce(_optionalChain([schema, 'optionalAccess', _16 => _16.defaultStatusCode]), () => ( _typescjs.StatusCodes.Ok));
|
|
80
|
+
const defaultContentType = _nullishCoalesce(_optionalChain([schema, 'optionalAccess', _17 => _17.defaultContentType]), () => ( "application/json"));
|
|
79
81
|
let status = defaultStatusCode;
|
|
80
82
|
let contentType = defaultContentType;
|
|
81
83
|
const jsonSchema = { response: {}, request: {} };
|
|
@@ -101,7 +103,7 @@ class Server {
|
|
|
101
103
|
if (def.type === "response") {
|
|
102
104
|
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
103
105
|
responsePipeDefs[def.key] = _valleyed.v.any().pipe((input) => {
|
|
104
|
-
const p = _optionalChain([pipeRecords, 'access',
|
|
106
|
+
const p = _optionalChain([pipeRecords, 'access', _18 => _18.find, 'call', _19 => _19((r) => r.status === status), 'optionalAccess', _20 => _20.pipe]);
|
|
105
107
|
if (!p) throw _valleyed.PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
106
108
|
return _valleyed.v.assert(p, input);
|
|
107
109
|
});
|
|
@@ -118,8 +120,6 @@ class Server {
|
|
|
118
120
|
_valleyed.v.compile(responsePipe, { allErrors: true });
|
|
119
121
|
const validateRequest = async (request) => {
|
|
120
122
|
if (!Object.keys(requestPipeDefs)) return request;
|
|
121
|
-
const context = schema.context ? await schema.context(request) : {};
|
|
122
|
-
request.context = context;
|
|
123
123
|
const validity = _valleyedcjs.requestLocalStorage.run(
|
|
124
124
|
request,
|
|
125
125
|
() => _valleyed.v.validate(requestPipe, {
|
|
@@ -146,7 +146,7 @@ class Server {
|
|
|
146
146
|
response,
|
|
147
147
|
() => _valleyed.v.validate(responsePipe, {
|
|
148
148
|
responseHeaders: response.headers,
|
|
149
|
-
responseCookies: response.cookies,
|
|
149
|
+
responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
|
|
150
150
|
response: response.body
|
|
151
151
|
})
|
|
152
152
|
);
|
|
@@ -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 { type 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, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type 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' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\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: 'cookies', 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\t{ key: 'responseCookies', 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\tcookies: request.cookies,\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\trequest.cookies = validity.value.cookies!\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\tresponseCookies: response.cookies,\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\tresponse.cookieValues = validity.value.responseCookies!\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
|
+
{"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 'node:http'\n\nimport { type CorsOptions } from 'cors'\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type 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 { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type Route, type RouteDef, StatusCodes } 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 get cors() {\n\t\treturn {\n\t\t\torigin: this.config.cors?.origin,\n\t\t\tmethods: (this.config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),\n\t\t\tcredentials: this.config.cors?.credentials,\n\t\t} satisfies CorsOptions\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.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' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\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: 'cookies', 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\t{ key: 'responseCookies', 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 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\tcookies: request.cookies,\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\trequest.cookies = validity.value.cookies!\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\tresponseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value] as const)),\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\tresponse.cookieValues = validity.value.responseCookies!\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]}
|