equipped 5.2.9 → 5.3.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 +95 -0
- package/README.md +362 -34
- package/dist/cjs/cache/adapters/in-memory/index.cjs +824 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -0
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +4 -0
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -0
- package/dist/cjs/cache/adapters/redis/index.cjs +844 -0
- package/dist/cjs/cache/adapters/redis/index.cjs.map +1 -0
- package/dist/cjs/cache/adapters/redis/index.min.cjs +4 -0
- package/dist/cjs/cache/adapters/redis/index.min.cjs.map +1 -0
- package/dist/cjs/cache/index.cjs +602 -4
- package/dist/cjs/cache/index.cjs.map +1 -1
- package/dist/cjs/cache/index.min.cjs +3 -1
- package/dist/cjs/cache/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs +1314 -0
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -0
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +4 -0
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -0
- package/dist/cjs/dbs/index.cjs +965 -6
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -1
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +127 -8
- 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/events/adapters/kafka/index.cjs +845 -0
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -0
- package/dist/cjs/events/adapters/kafka/index.min.cjs +4 -0
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -0
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +836 -0
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -0
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +4 -0
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -0
- package/dist/cjs/events/index.cjs +33 -4
- package/dist/cjs/events/index.cjs.map +1 -1
- package/dist/cjs/events/index.min.cjs +1 -1
- package/dist/cjs/events/index.min.cjs.map +1 -1
- package/dist/cjs/index.cjs +588 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.min.cjs +3 -1
- package/dist/cjs/index.min.cjs.map +1 -1
- package/dist/cjs/instance/index.cjs +514 -64
- package/dist/cjs/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs +3 -3
- package/dist/cjs/instance/index.min.cjs.map +1 -1
- package/dist/cjs/jobs/adapters/redis/index.cjs +979 -0
- package/dist/cjs/jobs/adapters/redis/index.cjs.map +1 -0
- package/dist/cjs/jobs/adapters/redis/index.min.cjs +4 -0
- package/dist/cjs/jobs/adapters/redis/index.min.cjs.map +1 -0
- package/dist/cjs/jobs/index.cjs +55 -2
- package/dist/cjs/jobs/index.cjs.map +1 -1
- package/dist/cjs/jobs/index.min.cjs +1 -1
- package/dist/cjs/jobs/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/in-memory/index.cjs +2551 -0
- package/dist/cjs/orm/adapters/in-memory/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/in-memory/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/in-memory/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/json/index.cjs +3518 -0
- package/dist/cjs/orm/adapters/json/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/json/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/json/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/mongodb/index.cjs +3299 -0
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +4 -0
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -0
- package/dist/cjs/orm/adapters/postgresql/index.cjs +4114 -0
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -0
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +49 -0
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -0
- package/dist/cjs/orm/index.cjs +9216 -0
- package/dist/cjs/orm/index.cjs.map +1 -0
- package/dist/cjs/orm/index.min.cjs +4 -0
- package/dist/cjs/orm/index.min.cjs.map +1 -0
- package/dist/cjs/server/adapters/express/index.cjs +1967 -0
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -0
- package/dist/cjs/server/adapters/express/index.min.cjs +32 -0
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -0
- package/dist/cjs/server/adapters/fastify/index.cjs +1974 -0
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -0
- package/dist/cjs/server/adapters/fastify/index.min.cjs +32 -0
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -0
- package/dist/cjs/server/index.cjs +1811 -9
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +31 -1
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/types/index.cjs +18 -1
- package/dist/cjs/types/index.cjs.map +1 -1
- package/dist/cjs/types/index.min.cjs +1 -1
- package/dist/cjs/types/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +862 -7
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +3 -1
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +679 -10
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +3 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +2 -0
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -0
- package/dist/esm/cache/adapters/in-memory/index.mjs +93 -0
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -0
- package/dist/esm/cache/adapters/redis/index.min.mjs +2 -0
- package/dist/esm/cache/adapters/redis/index.mjs +13 -0
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.min.mjs.map +1 -1
- package/dist/esm/cache/index.mjs +9 -4
- package/dist/esm/cache/index.mjs.map +1 -1
- package/dist/esm/chunk-4JLDXF7T.min.mjs +2 -0
- package/dist/esm/chunk-4JLDXF7T.min.mjs.map +1 -0
- package/dist/{types/events/types/kafka.js → esm/chunk-4MXYZS5R.mjs} +60 -37
- package/dist/esm/chunk-4MXYZS5R.mjs.map +1 -0
- package/dist/esm/chunk-5VW3JAFR.min.mjs +2 -0
- package/dist/esm/chunk-5VW3JAFR.min.mjs.map +1 -0
- package/dist/esm/chunk-AKQBDYUO.mjs +126 -0
- package/dist/esm/chunk-AKQBDYUO.mjs.map +1 -0
- package/dist/esm/chunk-AQY7QVYI.min.mjs +2 -0
- package/dist/esm/chunk-B5QQ32YY.min.mjs +2 -0
- package/dist/esm/chunk-B5QQ32YY.min.mjs.map +1 -0
- package/dist/esm/chunk-BJNIUCPT.min.mjs +2 -0
- package/dist/esm/chunk-BJNIUCPT.min.mjs.map +1 -0
- package/dist/esm/chunk-DKPZJIIR.mjs +29 -0
- package/dist/esm/chunk-DKPZJIIR.mjs.map +1 -0
- package/dist/esm/chunk-DSUJ5FUL.min.mjs +2 -0
- package/dist/esm/chunk-DSUJ5FUL.min.mjs.map +1 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
- package/dist/esm/chunk-J5LGTIGS.mjs +10 -0
- package/dist/esm/chunk-JH6EBXY4.mjs +53 -0
- package/dist/esm/chunk-JH6EBXY4.mjs.map +1 -0
- package/dist/esm/chunk-MDQKODYQ.mjs +2035 -0
- package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
- package/dist/esm/chunk-PCAUXBAG.min.mjs +2 -0
- package/dist/esm/chunk-PCAUXBAG.min.mjs.map +1 -0
- package/dist/esm/chunk-PNZNNUMN.mjs +113 -0
- package/dist/esm/chunk-PNZNNUMN.mjs.map +1 -0
- package/dist/esm/chunk-PQCBVQL6.mjs +1280 -0
- package/dist/esm/chunk-PQCBVQL6.mjs.map +1 -0
- package/dist/esm/chunk-QHLKB47N.min.mjs +2 -0
- package/dist/esm/chunk-QHLKB47N.min.mjs.map +1 -0
- package/dist/esm/chunk-SGZNOYC3.min.mjs +2 -0
- package/dist/esm/chunk-SGZNOYC3.min.mjs.map +1 -0
- package/dist/esm/chunk-TVTYDU2D.mjs +795 -0
- package/dist/esm/chunk-TVTYDU2D.mjs.map +1 -0
- package/dist/esm/chunk-VCCS7CAI.mjs +8 -0
- package/dist/esm/chunk-VCCS7CAI.mjs.map +1 -0
- package/dist/esm/chunk-Z2TZ3KR7.mjs +22 -0
- package/dist/esm/chunk-Z2TZ3KR7.mjs.map +1 -0
- package/dist/esm/chunk-ZGMFFK6Y.min.mjs +2 -0
- package/dist/esm/chunk-ZGMFFK6Y.min.mjs.map +1 -0
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +2 -0
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -0
- package/dist/esm/dbs/adapters/mongodb/index.mjs +419 -0
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -0
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.min.mjs.map +1 -1
- package/dist/esm/dbs/index.mjs +22 -6
- package/dist/esm/dbs/index.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 +22 -8
- package/dist/esm/errors/index.mjs.map +1 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +2 -0
- package/dist/esm/events/adapters/kafka/index.min.mjs.map +1 -0
- package/dist/esm/events/adapters/kafka/index.mjs +12 -0
- package/dist/esm/events/adapters/kafka/index.mjs.map +1 -0
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +2 -0
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -0
- package/dist/esm/events/adapters/rabbitmq/index.mjs +92 -0
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -0
- package/dist/esm/events/index.min.mjs +1 -1
- package/dist/esm/events/index.min.mjs.map +1 -1
- package/dist/esm/events/index.mjs +7 -4
- package/dist/esm/events/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.min.mjs.map +1 -1
- package/dist/esm/index.mjs +8 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/instance/index.min.mjs +1 -3
- package/dist/esm/instance/index.min.mjs.map +1 -1
- package/dist/esm/instance/index.mjs +4 -132
- package/dist/esm/instance/index.mjs.map +1 -1
- package/dist/esm/introspection-32BRYKYY.mjs +10 -0
- package/dist/esm/introspection-32BRYKYY.mjs.map +1 -0
- package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
- package/dist/esm/introspection-A72WMWE3.min.mjs.map +1 -0
- package/dist/esm/jobs/adapters/redis/index.min.mjs +2 -0
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -0
- package/dist/esm/jobs/{types/redis.mjs → adapters/redis/index.mjs} +71 -56
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -0
- package/dist/esm/jobs/index.min.mjs +1 -1
- package/dist/esm/jobs/index.min.mjs.map +1 -1
- package/dist/esm/jobs/index.mjs +9 -2
- package/dist/esm/jobs/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/in-memory/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/in-memory/index.mjs +11 -0
- package/dist/esm/orm/adapters/in-memory/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/json/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/json/index.mjs +980 -0
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +2 -0
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/mongodb/index.mjs +1539 -0
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -0
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +47 -0
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -0
- package/dist/esm/orm/adapters/postgresql/index.mjs +2070 -0
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -0
- package/dist/esm/orm/index.min.mjs +2 -0
- package/dist/esm/orm/index.min.mjs.map +1 -0
- package/dist/esm/orm/index.mjs +7326 -0
- package/dist/esm/orm/index.mjs.map +1 -0
- package/dist/esm/server/adapters/express/index.min.mjs +2 -0
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -0
- package/dist/esm/server/adapters/express/index.mjs +177 -0
- package/dist/esm/server/adapters/express/index.mjs.map +1 -0
- package/dist/esm/server/adapters/fastify/index.min.mjs +2 -0
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -0
- package/dist/esm/server/adapters/fastify/index.mjs +185 -0
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -0
- 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 +38 -9
- package/dist/esm/server/index.mjs.map +1 -1
- package/dist/esm/types/index.min.mjs +0 -1
- package/dist/esm/types/index.min.mjs.map +1 -1
- package/dist/esm/types/index.mjs +0 -1
- package/dist/esm/types/index.mjs.map +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs.map +1 -1
- package/dist/esm/utilities/index.mjs +22 -9
- package/dist/esm/utilities/index.mjs.map +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.min.mjs.map +1 -1
- package/dist/esm/validations/index.mjs +8 -18
- package/dist/esm/validations/index.mjs.map +1 -1
- package/dist/types/adapter-Coap9ISX.d.ts +1435 -0
- package/dist/types/{fastify-DLPUK3vD.d.ts → base-DVr0fHil.d.ts} +76 -143
- package/dist/types/cache/adapters/in-memory/index.d.ts +21 -0
- package/dist/types/cache/adapters/in-memory/index.js +92 -0
- package/dist/types/cache/adapters/redis/index.d.ts +73 -0
- package/dist/types/cache/adapters/redis/index.js +12 -0
- package/dist/types/cache/index.d.ts +2 -42
- package/dist/types/cache/index.js +9 -4
- package/dist/types/chunk-3M4PBZAQ.js +125 -0
- package/dist/types/chunk-3TKJGSCZ.js +21 -0
- package/dist/types/chunk-65EHKCDZ.js +112 -0
- package/dist/types/chunk-JQ2FWX4W.js +1279 -0
- package/dist/types/chunk-KZKFYO4V.js +7 -0
- package/dist/types/chunk-LN3A6R4Y.js +28 -0
- package/dist/types/chunk-MLKGABMK.js +9 -0
- package/dist/types/chunk-NJ2FHI3U.js +794 -0
- package/dist/types/chunk-OHFTQGQG.js +52 -0
- package/dist/{esm/events/types/kafka.mjs → types/chunk-XGGGAEET.js} +59 -38
- package/dist/types/chunk-YTY3EFNB.js +2034 -0
- package/dist/types/{core-BrkNSwvc.d.ts → core-tNlIMH9Y.d.ts} +48 -38
- package/dist/types/dbs/adapters/mongodb/index.d.ts +43 -0
- package/dist/types/dbs/adapters/mongodb/index.js +418 -0
- package/dist/types/dbs/index.d.ts +14 -12
- package/dist/types/dbs/index.js +22 -6
- package/dist/types/equippedError-Cmo60Kn-.d.ts +8 -0
- package/dist/types/errors/index.d.ts +3 -3
- package/dist/types/errors/index.js +22 -8
- package/dist/types/events/adapters/kafka/index.d.ts +83 -0
- package/dist/types/events/adapters/kafka/index.js +11 -0
- package/dist/types/events/adapters/rabbitmq/index.d.ts +41 -0
- package/dist/types/events/adapters/rabbitmq/index.js +91 -0
- package/dist/types/events/index.d.ts +11 -11
- package/dist/types/events/index.js +7 -4
- package/dist/types/index.d.ts +2 -25
- package/dist/types/index.js +8 -1
- package/dist/types/instance/index.d.ts +12 -179
- package/dist/types/instance/index.js +4 -132
- package/dist/types/introspection-VOIU3XE6.js +9 -0
- package/dist/types/jobs/adapters/redis/index.d.ts +93 -0
- package/dist/types/jobs/{types/redis.js → adapters/redis/index.js} +70 -55
- package/dist/types/jobs/index.d.ts +19 -35
- package/dist/types/jobs/index.js +9 -2
- package/dist/types/orm/adapters/in-memory/index.d.ts +92 -0
- package/dist/types/orm/adapters/in-memory/index.js +10 -0
- package/dist/types/orm/adapters/json/index.d.ts +72 -0
- package/dist/types/orm/adapters/json/index.js +979 -0
- package/dist/types/orm/adapters/mongodb/index.d.ts +74 -0
- package/dist/types/orm/adapters/mongodb/index.js +1538 -0
- package/dist/types/orm/adapters/postgresql/index.d.ts +112 -0
- package/dist/types/orm/adapters/postgresql/index.js +2069 -0
- package/dist/types/orm/index.d.ts +160 -0
- package/dist/types/orm/index.js +7325 -0
- package/dist/types/{requestError-C2PNWUrt.d.ts → requestError-DdaL8hc3.d.ts} +2 -8
- package/dist/types/server/adapters/express/index.d.ts +196 -0
- package/dist/types/server/adapters/express/index.js +176 -0
- package/dist/types/server/adapters/fastify/index.d.ts +221 -0
- package/dist/types/server/adapters/fastify/index.js +184 -0
- package/dist/types/server/index.d.ts +10 -11
- package/dist/types/server/index.js +38 -9
- package/dist/types/types/index.js +0 -1
- package/dist/types/utilities/index.d.ts +22 -9
- package/dist/types/utilities/index.js +22 -9
- package/dist/types/{validationError-Bw8OYv5s.d.ts → validationError-oigtHqBi.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +3 -2
- package/dist/types/validations/index.js +8 -18
- package/package.json +155 -18
- package/dist/cjs/audit/events.cjs +0 -101
- package/dist/cjs/audit/events.cjs.map +0 -1
- package/dist/cjs/audit/events.min.cjs +0 -2
- package/dist/cjs/audit/events.min.cjs.map +0 -1
- package/dist/cjs/audit/index.cjs +0 -2
- package/dist/cjs/audit/index.cjs.map +0 -1
- package/dist/cjs/audit/index.min.cjs +0 -2
- package/dist/cjs/audit/index.min.cjs.map +0 -1
- package/dist/cjs/cache/base.cjs +0 -6
- package/dist/cjs/cache/base.cjs.map +0 -1
- package/dist/cjs/cache/base.min.cjs +0 -2
- package/dist/cjs/cache/base.min.cjs.map +0 -1
- package/dist/cjs/cache/pipes.cjs +0 -16
- package/dist/cjs/cache/pipes.cjs.map +0 -1
- package/dist/cjs/cache/pipes.min.cjs +0 -2
- package/dist/cjs/cache/pipes.min.cjs.map +0 -1
- package/dist/cjs/cache/types/in-memory.cjs +0 -47
- package/dist/cjs/cache/types/in-memory.cjs.map +0 -1
- package/dist/cjs/cache/types/in-memory.min.cjs +0 -2
- package/dist/cjs/cache/types/in-memory.min.cjs.map +0 -1
- package/dist/cjs/cache/types/redis.cjs +0 -55
- package/dist/cjs/cache/types/redis.cjs.map +0 -1
- package/dist/cjs/cache/types/redis.min.cjs +0 -2
- package/dist/cjs/cache/types/redis.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/changes.cjs +0 -36
- package/dist/cjs/dbs/base/changes.cjs.map +0 -1
- package/dist/cjs/dbs/base/changes.min.cjs +0 -2
- package/dist/cjs/dbs/base/changes.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/core.cjs +0 -1
- package/dist/cjs/dbs/base/core.cjs.map +0 -1
- package/dist/cjs/dbs/base/core.min.cjs +0 -1
- package/dist/cjs/dbs/base/core.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/db.cjs +0 -14
- package/dist/cjs/dbs/base/db.cjs.map +0 -1
- package/dist/cjs/dbs/base/db.min.cjs +0 -2
- package/dist/cjs/dbs/base/db.min.cjs.map +0 -1
- package/dist/cjs/dbs/base/types.cjs +0 -2
- package/dist/cjs/dbs/base/types.cjs.map +0 -1
- package/dist/cjs/dbs/base/types.min.cjs +0 -2
- package/dist/cjs/dbs/base/types.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/changes.cjs +0 -81
- package/dist/cjs/dbs/mongo/changes.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/changes.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/changes.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/db.cjs +0 -225
- package/dist/cjs/dbs/mongo/db.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/db.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/db.min.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/query.cjs +0 -66
- package/dist/cjs/dbs/mongo/query.cjs.map +0 -1
- package/dist/cjs/dbs/mongo/query.min.cjs +0 -2
- package/dist/cjs/dbs/mongo/query.min.cjs.map +0 -1
- package/dist/cjs/dbs/pipes.cjs +0 -104
- package/dist/cjs/dbs/pipes.cjs.map +0 -1
- package/dist/cjs/dbs/pipes.min.cjs +0 -2
- package/dist/cjs/dbs/pipes.min.cjs.map +0 -1
- package/dist/cjs/errors/equippedError.cjs +0 -12
- package/dist/cjs/errors/equippedError.cjs.map +0 -1
- package/dist/cjs/errors/equippedError.min.cjs +0 -2
- package/dist/cjs/errors/equippedError.min.cjs.map +0 -1
- package/dist/cjs/errors/requestError.cjs +0 -12
- package/dist/cjs/errors/requestError.cjs.map +0 -1
- package/dist/cjs/errors/requestError.min.cjs +0 -2
- package/dist/cjs/errors/requestError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/badRequestError.cjs +0 -12
- package/dist/cjs/errors/types/badRequestError.cjs.map +0 -1
- package/dist/cjs/errors/types/badRequestError.min.cjs +0 -2
- package/dist/cjs/errors/types/badRequestError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthenticatedError.cjs +0 -12
- package/dist/cjs/errors/types/notAuthenticatedError.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthenticatedError.min.cjs +0 -2
- package/dist/cjs/errors/types/notAuthenticatedError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthorizedError.cjs +0 -12
- package/dist/cjs/errors/types/notAuthorizedError.cjs.map +0 -1
- package/dist/cjs/errors/types/notAuthorizedError.min.cjs +0 -2
- package/dist/cjs/errors/types/notAuthorizedError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/notFoundError.cjs +0 -12
- package/dist/cjs/errors/types/notFoundError.cjs.map +0 -1
- package/dist/cjs/errors/types/notFoundError.min.cjs +0 -2
- package/dist/cjs/errors/types/notFoundError.min.cjs.map +0 -1
- package/dist/cjs/errors/types/tokenExpired.cjs +0 -12
- package/dist/cjs/errors/types/tokenExpired.cjs.map +0 -1
- package/dist/cjs/errors/types/tokenExpired.min.cjs +0 -2
- package/dist/cjs/errors/types/tokenExpired.min.cjs.map +0 -1
- package/dist/cjs/errors/types/validationError.cjs +0 -16
- package/dist/cjs/errors/types/validationError.cjs.map +0 -1
- package/dist/cjs/errors/types/validationError.min.cjs +0 -2
- package/dist/cjs/errors/types/validationError.min.cjs.map +0 -1
- package/dist/cjs/events/base.cjs +0 -6
- package/dist/cjs/events/base.cjs.map +0 -1
- package/dist/cjs/events/base.min.cjs +0 -2
- package/dist/cjs/events/base.min.cjs.map +0 -1
- package/dist/cjs/events/pipes.cjs +0 -28
- package/dist/cjs/events/pipes.cjs.map +0 -1
- package/dist/cjs/events/pipes.min.cjs +0 -2
- package/dist/cjs/events/pipes.min.cjs.map +0 -1
- package/dist/cjs/events/types/kafka.cjs +0 -80
- package/dist/cjs/events/types/kafka.cjs.map +0 -1
- package/dist/cjs/events/types/kafka.min.cjs +0 -2
- package/dist/cjs/events/types/kafka.min.cjs.map +0 -1
- package/dist/cjs/events/types/rabbitmq.cjs +0 -54
- package/dist/cjs/events/types/rabbitmq.cjs.map +0 -1
- package/dist/cjs/events/types/rabbitmq.min.cjs +0 -2
- package/dist/cjs/events/types/rabbitmq.min.cjs.map +0 -1
- package/dist/cjs/instance/hooks.cjs +0 -26
- package/dist/cjs/instance/hooks.cjs.map +0 -1
- package/dist/cjs/instance/hooks.min.cjs +0 -2
- package/dist/cjs/instance/hooks.min.cjs.map +0 -1
- package/dist/cjs/instance/settings.cjs +0 -57
- package/dist/cjs/instance/settings.cjs.map +0 -1
- package/dist/cjs/instance/settings.min.cjs +0 -2
- package/dist/cjs/instance/settings.min.cjs.map +0 -1
- package/dist/cjs/jobs/pipes.cjs +0 -13
- package/dist/cjs/jobs/pipes.cjs.map +0 -1
- package/dist/cjs/jobs/pipes.min.cjs +0 -2
- package/dist/cjs/jobs/pipes.min.cjs.map +0 -1
- package/dist/cjs/jobs/types/redis.cjs +0 -106
- package/dist/cjs/jobs/types/redis.cjs.map +0 -1
- package/dist/cjs/jobs/types/redis.min.cjs +0 -2
- package/dist/cjs/jobs/types/redis.min.cjs.map +0 -1
- package/dist/cjs/server/impls/base.cjs +0 -211
- package/dist/cjs/server/impls/base.cjs.map +0 -1
- package/dist/cjs/server/impls/base.min.cjs +0 -2
- package/dist/cjs/server/impls/base.min.cjs.map +0 -1
- package/dist/cjs/server/impls/express.cjs +0 -111
- package/dist/cjs/server/impls/express.cjs.map +0 -1
- package/dist/cjs/server/impls/express.min.cjs +0 -2
- package/dist/cjs/server/impls/express.min.cjs.map +0 -1
- package/dist/cjs/server/impls/fastify.cjs +0 -121
- package/dist/cjs/server/impls/fastify.cjs.map +0 -1
- package/dist/cjs/server/impls/fastify.min.cjs +0 -2
- package/dist/cjs/server/impls/fastify.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/index.cjs +0 -2
- package/dist/cjs/server/middlewares/index.cjs.map +0 -1
- package/dist/cjs/server/middlewares/index.min.cjs +0 -2
- package/dist/cjs/server/middlewares/index.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/requireAuthUser.cjs +0 -22
- package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +0 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +0 -2
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +0 -1
- package/dist/cjs/server/openapi.cjs +0 -191
- package/dist/cjs/server/openapi.cjs.map +0 -1
- package/dist/cjs/server/openapi.min.cjs +0 -30
- package/dist/cjs/server/openapi.min.cjs.map +0 -1
- package/dist/cjs/server/pipes.cjs +0 -67
- package/dist/cjs/server/pipes.cjs.map +0 -1
- package/dist/cjs/server/pipes.min.cjs +0 -2
- package/dist/cjs/server/pipes.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +0 -21
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/base.cjs +0 -20
- package/dist/cjs/server/requests-auth-methods/base.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/base.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/index.cjs +0 -4
- package/dist/cjs/server/requests-auth-methods/index.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/index.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/jwt.cjs +0 -78
- package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +0 -1
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +0 -2
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +0 -1
- package/dist/cjs/server/requests.cjs +0 -80
- package/dist/cjs/server/requests.cjs.map +0 -1
- package/dist/cjs/server/requests.min.cjs +0 -2
- package/dist/cjs/server/requests.min.cjs.map +0 -1
- package/dist/cjs/server/routes.cjs +0 -74
- package/dist/cjs/server/routes.cjs.map +0 -1
- package/dist/cjs/server/routes.min.cjs +0 -2
- package/dist/cjs/server/routes.min.cjs.map +0 -1
- package/dist/cjs/server/sockets.cjs +0 -126
- package/dist/cjs/server/sockets.cjs.map +0 -1
- package/dist/cjs/server/sockets.min.cjs +0 -2
- package/dist/cjs/server/sockets.min.cjs.map +0 -1
- package/dist/cjs/server/types.cjs +0 -34
- package/dist/cjs/server/types.cjs.map +0 -1
- package/dist/cjs/server/types.min.cjs +0 -2
- package/dist/cjs/server/types.min.cjs.map +0 -1
- package/dist/cjs/types/overrides.cjs +0 -1
- package/dist/cjs/types/overrides.cjs.map +0 -1
- package/dist/cjs/types/overrides.min.cjs +0 -1
- package/dist/cjs/types/overrides.min.cjs.map +0 -1
- package/dist/cjs/utilities/authProviders.cjs +0 -53
- package/dist/cjs/utilities/authProviders.cjs.map +0 -1
- package/dist/cjs/utilities/authProviders.min.cjs +0 -2
- package/dist/cjs/utilities/authProviders.min.cjs.map +0 -1
- package/dist/cjs/utilities/hash.cjs +0 -17
- package/dist/cjs/utilities/hash.cjs.map +0 -1
- package/dist/cjs/utilities/hash.min.cjs +0 -2
- package/dist/cjs/utilities/hash.min.cjs.map +0 -1
- package/dist/cjs/utilities/json.cjs +0 -16
- package/dist/cjs/utilities/json.cjs.map +0 -1
- package/dist/cjs/utilities/json.min.cjs +0 -2
- package/dist/cjs/utilities/json.min.cjs.map +0 -1
- package/dist/cjs/utilities/media.cjs +0 -13
- package/dist/cjs/utilities/media.cjs.map +0 -1
- package/dist/cjs/utilities/media.min.cjs +0 -2
- package/dist/cjs/utilities/media.min.cjs.map +0 -1
- package/dist/cjs/utilities/random.cjs +0 -12
- package/dist/cjs/utilities/random.cjs.map +0 -1
- package/dist/cjs/utilities/random.min.cjs +0 -2
- package/dist/cjs/utilities/random.min.cjs.map +0 -1
- package/dist/cjs/utilities/retry.cjs +0 -14
- package/dist/cjs/utilities/retry.cjs.map +0 -1
- package/dist/cjs/utilities/retry.min.cjs +0 -2
- package/dist/cjs/utilities/retry.min.cjs.map +0 -1
- package/dist/cjs/validations/valleyed.cjs +0 -43
- package/dist/cjs/validations/valleyed.cjs.map +0 -1
- package/dist/cjs/validations/valleyed.min.cjs +0 -2
- package/dist/cjs/validations/valleyed.min.cjs.map +0 -1
- package/dist/esm/audit/events.min.mjs +0 -2
- package/dist/esm/audit/events.min.mjs.map +0 -1
- package/dist/esm/audit/events.mjs +0 -101
- package/dist/esm/audit/events.mjs.map +0 -1
- package/dist/esm/audit/index.min.mjs +0 -2
- package/dist/esm/audit/index.min.mjs.map +0 -1
- package/dist/esm/audit/index.mjs +0 -2
- package/dist/esm/audit/index.mjs.map +0 -1
- package/dist/esm/cache/base.min.mjs +0 -2
- package/dist/esm/cache/base.min.mjs.map +0 -1
- package/dist/esm/cache/base.mjs +0 -6
- package/dist/esm/cache/base.mjs.map +0 -1
- package/dist/esm/cache/pipes.min.mjs +0 -2
- package/dist/esm/cache/pipes.min.mjs.map +0 -1
- package/dist/esm/cache/pipes.mjs +0 -16
- package/dist/esm/cache/pipes.mjs.map +0 -1
- package/dist/esm/cache/types/in-memory.min.mjs +0 -2
- package/dist/esm/cache/types/in-memory.min.mjs.map +0 -1
- package/dist/esm/cache/types/in-memory.mjs +0 -47
- package/dist/esm/cache/types/in-memory.mjs.map +0 -1
- package/dist/esm/cache/types/redis.min.mjs +0 -2
- package/dist/esm/cache/types/redis.min.mjs.map +0 -1
- package/dist/esm/cache/types/redis.mjs +0 -55
- package/dist/esm/cache/types/redis.mjs.map +0 -1
- package/dist/esm/dbs/base/changes.min.mjs +0 -2
- package/dist/esm/dbs/base/changes.min.mjs.map +0 -1
- package/dist/esm/dbs/base/changes.mjs +0 -36
- package/dist/esm/dbs/base/changes.mjs.map +0 -1
- package/dist/esm/dbs/base/core.min.mjs +0 -1
- package/dist/esm/dbs/base/core.mjs +0 -1
- package/dist/esm/dbs/base/db.min.mjs +0 -2
- package/dist/esm/dbs/base/db.min.mjs.map +0 -1
- package/dist/esm/dbs/base/db.mjs +0 -14
- package/dist/esm/dbs/base/db.mjs.map +0 -1
- package/dist/esm/dbs/base/types.min.mjs +0 -2
- package/dist/esm/dbs/base/types.min.mjs.map +0 -1
- package/dist/esm/dbs/base/types.mjs +0 -2
- package/dist/esm/dbs/base/types.mjs.map +0 -1
- package/dist/esm/dbs/mongo/changes.min.mjs +0 -2
- package/dist/esm/dbs/mongo/changes.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/changes.mjs +0 -81
- package/dist/esm/dbs/mongo/changes.mjs.map +0 -1
- package/dist/esm/dbs/mongo/db.min.mjs +0 -2
- package/dist/esm/dbs/mongo/db.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/db.mjs +0 -225
- package/dist/esm/dbs/mongo/db.mjs.map +0 -1
- package/dist/esm/dbs/mongo/query.min.mjs +0 -2
- package/dist/esm/dbs/mongo/query.min.mjs.map +0 -1
- package/dist/esm/dbs/mongo/query.mjs +0 -66
- package/dist/esm/dbs/mongo/query.mjs.map +0 -1
- package/dist/esm/dbs/pipes.min.mjs +0 -2
- package/dist/esm/dbs/pipes.min.mjs.map +0 -1
- package/dist/esm/dbs/pipes.mjs +0 -104
- package/dist/esm/dbs/pipes.mjs.map +0 -1
- package/dist/esm/errors/equippedError.min.mjs +0 -2
- package/dist/esm/errors/equippedError.min.mjs.map +0 -1
- package/dist/esm/errors/equippedError.mjs +0 -12
- package/dist/esm/errors/equippedError.mjs.map +0 -1
- package/dist/esm/errors/requestError.min.mjs +0 -2
- package/dist/esm/errors/requestError.min.mjs.map +0 -1
- package/dist/esm/errors/requestError.mjs +0 -12
- package/dist/esm/errors/requestError.mjs.map +0 -1
- package/dist/esm/errors/types/badRequestError.min.mjs +0 -2
- package/dist/esm/errors/types/badRequestError.min.mjs.map +0 -1
- package/dist/esm/errors/types/badRequestError.mjs +0 -12
- package/dist/esm/errors/types/badRequestError.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthenticatedError.min.mjs +0 -2
- package/dist/esm/errors/types/notAuthenticatedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthenticatedError.mjs +0 -12
- package/dist/esm/errors/types/notAuthenticatedError.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthorizedError.min.mjs +0 -2
- package/dist/esm/errors/types/notAuthorizedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notAuthorizedError.mjs +0 -12
- package/dist/esm/errors/types/notAuthorizedError.mjs.map +0 -1
- package/dist/esm/errors/types/notFoundError.min.mjs +0 -2
- package/dist/esm/errors/types/notFoundError.min.mjs.map +0 -1
- package/dist/esm/errors/types/notFoundError.mjs +0 -12
- package/dist/esm/errors/types/notFoundError.mjs.map +0 -1
- package/dist/esm/errors/types/tokenExpired.min.mjs +0 -2
- package/dist/esm/errors/types/tokenExpired.min.mjs.map +0 -1
- package/dist/esm/errors/types/tokenExpired.mjs +0 -12
- package/dist/esm/errors/types/tokenExpired.mjs.map +0 -1
- package/dist/esm/errors/types/validationError.min.mjs +0 -2
- package/dist/esm/errors/types/validationError.min.mjs.map +0 -1
- package/dist/esm/errors/types/validationError.mjs +0 -16
- package/dist/esm/errors/types/validationError.mjs.map +0 -1
- package/dist/esm/events/base.min.mjs +0 -2
- package/dist/esm/events/base.min.mjs.map +0 -1
- package/dist/esm/events/base.mjs +0 -6
- package/dist/esm/events/base.mjs.map +0 -1
- package/dist/esm/events/pipes.min.mjs +0 -2
- package/dist/esm/events/pipes.min.mjs.map +0 -1
- package/dist/esm/events/pipes.mjs +0 -28
- package/dist/esm/events/pipes.mjs.map +0 -1
- package/dist/esm/events/types/kafka.min.mjs +0 -2
- package/dist/esm/events/types/kafka.min.mjs.map +0 -1
- package/dist/esm/events/types/kafka.mjs.map +0 -1
- package/dist/esm/events/types/rabbitmq.min.mjs +0 -2
- package/dist/esm/events/types/rabbitmq.min.mjs.map +0 -1
- package/dist/esm/events/types/rabbitmq.mjs +0 -54
- package/dist/esm/events/types/rabbitmq.mjs.map +0 -1
- package/dist/esm/instance/hooks.min.mjs +0 -2
- package/dist/esm/instance/hooks.min.mjs.map +0 -1
- package/dist/esm/instance/hooks.mjs +0 -26
- package/dist/esm/instance/hooks.mjs.map +0 -1
- package/dist/esm/instance/settings.min.mjs +0 -2
- package/dist/esm/instance/settings.min.mjs.map +0 -1
- package/dist/esm/instance/settings.mjs +0 -57
- package/dist/esm/instance/settings.mjs.map +0 -1
- package/dist/esm/jobs/pipes.min.mjs +0 -2
- package/dist/esm/jobs/pipes.min.mjs.map +0 -1
- package/dist/esm/jobs/pipes.mjs +0 -13
- package/dist/esm/jobs/pipes.mjs.map +0 -1
- package/dist/esm/jobs/types/redis.min.mjs +0 -2
- package/dist/esm/jobs/types/redis.min.mjs.map +0 -1
- package/dist/esm/jobs/types/redis.mjs.map +0 -1
- package/dist/esm/server/impls/base.min.mjs +0 -2
- package/dist/esm/server/impls/base.min.mjs.map +0 -1
- package/dist/esm/server/impls/base.mjs +0 -211
- package/dist/esm/server/impls/base.mjs.map +0 -1
- package/dist/esm/server/impls/express.min.mjs +0 -2
- package/dist/esm/server/impls/express.min.mjs.map +0 -1
- package/dist/esm/server/impls/express.mjs +0 -111
- package/dist/esm/server/impls/express.mjs.map +0 -1
- package/dist/esm/server/impls/fastify.min.mjs +0 -2
- package/dist/esm/server/impls/fastify.min.mjs.map +0 -1
- package/dist/esm/server/impls/fastify.mjs +0 -121
- package/dist/esm/server/impls/fastify.mjs.map +0 -1
- package/dist/esm/server/middlewares/index.min.mjs +0 -2
- package/dist/esm/server/middlewares/index.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/index.mjs +0 -2
- package/dist/esm/server/middlewares/index.mjs.map +0 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs +0 -2
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/requireAuthUser.mjs +0 -22
- package/dist/esm/server/middlewares/requireAuthUser.mjs.map +0 -1
- package/dist/esm/server/openapi.min.mjs +0 -30
- package/dist/esm/server/openapi.min.mjs.map +0 -1
- package/dist/esm/server/openapi.mjs +0 -191
- package/dist/esm/server/openapi.mjs.map +0 -1
- package/dist/esm/server/pipes.min.mjs +0 -2
- package/dist/esm/server/pipes.min.mjs.map +0 -1
- package/dist/esm/server/pipes.mjs +0 -67
- package/dist/esm/server/pipes.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs +0 -21
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/base.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/base.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/base.mjs +0 -20
- package/dist/esm/server/requests-auth-methods/base.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/index.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/index.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/index.mjs +0 -4
- package/dist/esm/server/requests-auth-methods/index.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs +0 -2
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth-methods/jwt.mjs +0 -78
- package/dist/esm/server/requests-auth-methods/jwt.mjs.map +0 -1
- package/dist/esm/server/requests.min.mjs +0 -2
- package/dist/esm/server/requests.min.mjs.map +0 -1
- package/dist/esm/server/requests.mjs +0 -80
- package/dist/esm/server/requests.mjs.map +0 -1
- package/dist/esm/server/routes.min.mjs +0 -2
- package/dist/esm/server/routes.min.mjs.map +0 -1
- package/dist/esm/server/routes.mjs +0 -74
- package/dist/esm/server/routes.mjs.map +0 -1
- package/dist/esm/server/sockets.min.mjs +0 -2
- package/dist/esm/server/sockets.min.mjs.map +0 -1
- package/dist/esm/server/sockets.mjs +0 -126
- package/dist/esm/server/sockets.mjs.map +0 -1
- package/dist/esm/server/types.min.mjs +0 -2
- package/dist/esm/server/types.min.mjs.map +0 -1
- package/dist/esm/server/types.mjs +0 -34
- package/dist/esm/server/types.mjs.map +0 -1
- package/dist/esm/types/overrides.min.mjs +0 -1
- package/dist/esm/types/overrides.mjs +0 -1
- package/dist/esm/utilities/authProviders.min.mjs +0 -2
- package/dist/esm/utilities/authProviders.min.mjs.map +0 -1
- package/dist/esm/utilities/authProviders.mjs +0 -53
- package/dist/esm/utilities/authProviders.mjs.map +0 -1
- package/dist/esm/utilities/hash.min.mjs +0 -2
- package/dist/esm/utilities/hash.min.mjs.map +0 -1
- package/dist/esm/utilities/hash.mjs +0 -17
- package/dist/esm/utilities/hash.mjs.map +0 -1
- package/dist/esm/utilities/json.min.mjs +0 -2
- package/dist/esm/utilities/json.min.mjs.map +0 -1
- package/dist/esm/utilities/json.mjs +0 -16
- package/dist/esm/utilities/json.mjs.map +0 -1
- package/dist/esm/utilities/media.min.mjs +0 -2
- package/dist/esm/utilities/media.min.mjs.map +0 -1
- package/dist/esm/utilities/media.mjs +0 -13
- package/dist/esm/utilities/media.mjs.map +0 -1
- package/dist/esm/utilities/random.min.mjs +0 -2
- package/dist/esm/utilities/random.min.mjs.map +0 -1
- package/dist/esm/utilities/random.mjs +0 -12
- package/dist/esm/utilities/random.mjs.map +0 -1
- package/dist/esm/utilities/retry.min.mjs +0 -2
- package/dist/esm/utilities/retry.min.mjs.map +0 -1
- package/dist/esm/utilities/retry.mjs +0 -14
- package/dist/esm/utilities/retry.mjs.map +0 -1
- package/dist/esm/validations/valleyed.min.mjs +0 -2
- package/dist/esm/validations/valleyed.min.mjs.map +0 -1
- package/dist/esm/validations/valleyed.mjs +0 -43
- package/dist/esm/validations/valleyed.mjs.map +0 -1
- package/dist/types/audit/events.js +0 -100
- package/dist/types/audit/index.d.ts +0 -44
- package/dist/types/audit/index.js +0 -1
- package/dist/types/cache/base.js +0 -5
- package/dist/types/cache/pipes.js +0 -15
- package/dist/types/cache/types/in-memory.js +0 -46
- package/dist/types/cache/types/redis.js +0 -54
- package/dist/types/db-C8YY1yTO.d.ts +0 -14
- package/dist/types/db-Dj1SGto0.d.ts +0 -24
- package/dist/types/dbs/base/changes.js +0 -35
- package/dist/types/dbs/base/core.js +0 -0
- package/dist/types/dbs/base/db.js +0 -13
- package/dist/types/dbs/base/types.js +0 -1
- package/dist/types/dbs/mongo/changes.js +0 -80
- package/dist/types/dbs/mongo/db.js +0 -224
- package/dist/types/dbs/mongo/query.js +0 -65
- package/dist/types/dbs/pipes.js +0 -103
- package/dist/types/errors/equippedError.js +0 -11
- package/dist/types/errors/requestError.js +0 -11
- package/dist/types/errors/types/badRequestError.js +0 -11
- package/dist/types/errors/types/notAuthenticatedError.js +0 -11
- package/dist/types/errors/types/notAuthorizedError.js +0 -11
- package/dist/types/errors/types/notFoundError.js +0 -11
- package/dist/types/errors/types/tokenExpired.js +0 -11
- package/dist/types/errors/types/validationError.js +0 -15
- package/dist/types/events/base.js +0 -5
- package/dist/types/events/pipes.js +0 -27
- package/dist/types/events/types/rabbitmq.js +0 -53
- package/dist/types/instance/hooks.js +0 -25
- package/dist/types/instance/settings.js +0 -56
- package/dist/types/jobs/pipes.js +0 -12
- package/dist/types/kafka-Cf-TUJgv.d.ts +0 -54
- package/dist/types/server/impls/base.js +0 -210
- package/dist/types/server/impls/express.js +0 -110
- package/dist/types/server/impls/fastify.js +0 -120
- package/dist/types/server/middlewares/index.js +0 -1
- package/dist/types/server/middlewares/requireAuthUser.js +0 -21
- package/dist/types/server/openapi.js +0 -190
- package/dist/types/server/pipes.js +0 -66
- package/dist/types/server/requests-auth-methods/apiKeys.js +0 -20
- package/dist/types/server/requests-auth-methods/base.js +0 -19
- package/dist/types/server/requests-auth-methods/index.js +0 -3
- package/dist/types/server/requests-auth-methods/jwt.js +0 -77
- package/dist/types/server/requests.js +0 -79
- package/dist/types/server/routes.js +0 -73
- package/dist/types/server/sockets.js +0 -125
- package/dist/types/server/types.js +0 -33
- package/dist/types/types/overrides.js +0 -0
- package/dist/types/utilities/authProviders.js +0 -52
- package/dist/types/utilities/hash.js +0 -16
- package/dist/types/utilities/json.js +0 -15
- package/dist/types/utilities/media.js +0 -12
- package/dist/types/utilities/random.js +0 -11
- package/dist/types/utilities/retry.js +0 -13
- package/dist/types/validations/valleyed.js +0 -42
- /package/dist/esm/{dbs/base/core.min.mjs.map → cache/adapters/redis/index.min.mjs.map} +0 -0
- /package/dist/esm/{dbs/base/core.mjs.map → cache/adapters/redis/index.mjs.map} +0 -0
- /package/dist/esm/{types/overrides.min.mjs.map → chunk-AQY7QVYI.min.mjs.map} +0 -0
- /package/dist/esm/{types/overrides.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
|
@@ -0,0 +1,2034 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EventBus
|
|
3
|
+
} from "./chunk-KZKFYO4V.js";
|
|
4
|
+
import {
|
|
5
|
+
__export
|
|
6
|
+
} from "./chunk-MLKGABMK.js";
|
|
7
|
+
|
|
8
|
+
// src/validations/index.ts
|
|
9
|
+
export * from "valleyed";
|
|
10
|
+
|
|
11
|
+
// src/validations/valleyed.ts
|
|
12
|
+
var valleyed_exports = {};
|
|
13
|
+
__export(valleyed_exports, {
|
|
14
|
+
incomingFile: () => incomingFile,
|
|
15
|
+
incomingFiles: () => incomingFiles,
|
|
16
|
+
requestLocalStorage: () => requestLocalStorage,
|
|
17
|
+
responseLocalStorage: () => responseLocalStorage,
|
|
18
|
+
withRequest: () => withRequest,
|
|
19
|
+
withResponse: () => withResponse
|
|
20
|
+
});
|
|
21
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
22
|
+
import { PipeError as PipeError2, v as v6 } from "valleyed";
|
|
23
|
+
|
|
24
|
+
// src/instance/index.ts
|
|
25
|
+
import pino from "pino";
|
|
26
|
+
import { ulid } from "ulid";
|
|
27
|
+
import { v as v5 } from "valleyed";
|
|
28
|
+
|
|
29
|
+
// src/errors/equippedError.ts
|
|
30
|
+
var EquippedError = class extends Error {
|
|
31
|
+
constructor(message, context, cause) {
|
|
32
|
+
super(message, { cause });
|
|
33
|
+
this.message = message;
|
|
34
|
+
this.context = context;
|
|
35
|
+
this.cause = cause;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/errors/requestError.ts
|
|
40
|
+
var RequestError = class extends EquippedError {
|
|
41
|
+
constructor(message, serializedErrors, cause) {
|
|
42
|
+
super(message, { serializedErrors }, cause);
|
|
43
|
+
this.message = message;
|
|
44
|
+
this.serializedErrors = serializedErrors;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/server/adapters/base.ts
|
|
49
|
+
import "http";
|
|
50
|
+
import "@fastify/cors";
|
|
51
|
+
import "cors";
|
|
52
|
+
import { Server as SocketServer } from "socket.io";
|
|
53
|
+
import supertest from "supertest";
|
|
54
|
+
import { PipeError, v as v3 } from "valleyed";
|
|
55
|
+
|
|
56
|
+
// src/server/openapi.ts
|
|
57
|
+
import { convert } from "@openapi-contrib/json-schema-to-openapi-schema";
|
|
58
|
+
import { capitalize } from "valleyed";
|
|
59
|
+
|
|
60
|
+
// src/server/routes.ts
|
|
61
|
+
import { v } from "valleyed";
|
|
62
|
+
|
|
63
|
+
// src/server/types.ts
|
|
64
|
+
var Methods = {
|
|
65
|
+
head: "head",
|
|
66
|
+
get: "get",
|
|
67
|
+
post: "post",
|
|
68
|
+
put: "put",
|
|
69
|
+
patch: "patch",
|
|
70
|
+
delete: "delete",
|
|
71
|
+
options: "options"
|
|
72
|
+
};
|
|
73
|
+
var StatusCodes = {
|
|
74
|
+
Ok: 200,
|
|
75
|
+
Found: 302,
|
|
76
|
+
BadRequest: 400,
|
|
77
|
+
NotAuthenticated: 401,
|
|
78
|
+
NotAuthorized: 403,
|
|
79
|
+
NotFound: 404,
|
|
80
|
+
ValidationError: 422,
|
|
81
|
+
TooManyRequests: 429,
|
|
82
|
+
TokenExpired: 461
|
|
83
|
+
};
|
|
84
|
+
function makeMiddlewareHandler(cb, onSetup) {
|
|
85
|
+
return { cb, onSetup };
|
|
86
|
+
}
|
|
87
|
+
var makeMiddleware = (...args) => makeMiddlewareHandler(...args);
|
|
88
|
+
var makeResponseMiddleware = (...args) => makeMiddlewareHandler(...args);
|
|
89
|
+
var makeErrorMiddleware = (...args) => makeMiddlewareHandler(...args);
|
|
90
|
+
|
|
91
|
+
// src/server/routes.ts
|
|
92
|
+
function mergeSchemas(...schemas) {
|
|
93
|
+
const k = {
|
|
94
|
+
params: "",
|
|
95
|
+
headers: "",
|
|
96
|
+
query: "",
|
|
97
|
+
body: "",
|
|
98
|
+
cookies: "",
|
|
99
|
+
response: "",
|
|
100
|
+
responseHeaders: "",
|
|
101
|
+
responseCookies: "",
|
|
102
|
+
defaultStatusCode: "",
|
|
103
|
+
defaultContentType: ""
|
|
104
|
+
};
|
|
105
|
+
function merge(acc, cur) {
|
|
106
|
+
if (!acc) return cur;
|
|
107
|
+
if (!cur) return acc;
|
|
108
|
+
if (typeof acc === "number") return cur;
|
|
109
|
+
if (typeof acc === "string") return cur;
|
|
110
|
+
if (typeof acc === "function") return cur;
|
|
111
|
+
return v.merge(acc, cur);
|
|
112
|
+
}
|
|
113
|
+
return Object.fromEntries(
|
|
114
|
+
Object.keys(k).map((key) => [
|
|
115
|
+
key,
|
|
116
|
+
schemas.map((s) => s[key]).reduce(merge, null)
|
|
117
|
+
])
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
var groupRoutes = (config, routes) => routes.map((route) => ({
|
|
121
|
+
...config,
|
|
122
|
+
...route,
|
|
123
|
+
path: `${config.path}/${route.path}`,
|
|
124
|
+
groups: [...config.groups ?? [], ...route.groups ?? []],
|
|
125
|
+
middlewares: [...config.middlewares ?? [], ...route.middlewares ?? []],
|
|
126
|
+
responseMiddlewares: [...config.responseMiddlewares ?? [], ...route.responseMiddlewares ?? []],
|
|
127
|
+
schema: mergeSchemas(config.schema ?? {}, route.schema ?? {}),
|
|
128
|
+
security: [...config.security ?? [], ...route.security ?? []]
|
|
129
|
+
}));
|
|
130
|
+
var Router = class {
|
|
131
|
+
#config = { path: "" };
|
|
132
|
+
#routes = [];
|
|
133
|
+
#children = [];
|
|
134
|
+
constructor(config = { path: "" }) {
|
|
135
|
+
this.#config = config;
|
|
136
|
+
}
|
|
137
|
+
#wrap(method) {
|
|
138
|
+
return (path, config = {}) => (handler) => {
|
|
139
|
+
const route = groupRoutes(this.#config, [{ ...config, path, method, handler }])[0];
|
|
140
|
+
this.#routes.push(route);
|
|
141
|
+
return route;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
head = this.#wrap(Methods.head);
|
|
145
|
+
get = this.#wrap(Methods.get);
|
|
146
|
+
post = this.#wrap(Methods.post);
|
|
147
|
+
put = this.#wrap(Methods.put);
|
|
148
|
+
patch = this.#wrap(Methods.patch);
|
|
149
|
+
delete = this.#wrap(Methods.delete);
|
|
150
|
+
options = this.#wrap(Methods.options);
|
|
151
|
+
nest(...routers) {
|
|
152
|
+
routers.forEach((router) => this.#children.push(router));
|
|
153
|
+
}
|
|
154
|
+
get routes() {
|
|
155
|
+
return [...this.#routes].concat(this.#children.flatMap((child) => groupRoutes(this.#config, child.routes)));
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// src/server/openapi.ts
|
|
160
|
+
var openapi = (config) => {
|
|
161
|
+
const instance = Instance.get();
|
|
162
|
+
const { app } = instance.settings;
|
|
163
|
+
const baseOpenapiDoc = {
|
|
164
|
+
openapi: "3.0.0",
|
|
165
|
+
info: {
|
|
166
|
+
title: `${app.name} ${instance.id}`,
|
|
167
|
+
version: config.openapi.docsVersion ?? ""
|
|
168
|
+
},
|
|
169
|
+
servers: config.openapi.docsBaseUrl?.map((url) => ({ url })),
|
|
170
|
+
paths: {},
|
|
171
|
+
components: {
|
|
172
|
+
schemas: {},
|
|
173
|
+
securitySchemes: {
|
|
174
|
+
Authorization: {
|
|
175
|
+
type: "apiKey",
|
|
176
|
+
name: "authorization",
|
|
177
|
+
in: "header"
|
|
178
|
+
},
|
|
179
|
+
RefreshToken: {
|
|
180
|
+
type: "apiKey",
|
|
181
|
+
name: "x-refresh-token",
|
|
182
|
+
in: "header"
|
|
183
|
+
},
|
|
184
|
+
ApiKey: {
|
|
185
|
+
type: "apiKey",
|
|
186
|
+
name: "x-api-key",
|
|
187
|
+
in: "header"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
tags: [],
|
|
192
|
+
"x-tagGroups": []
|
|
193
|
+
};
|
|
194
|
+
const registeredTags = {};
|
|
195
|
+
const registeredTagGroups = {};
|
|
196
|
+
const flattenForParameters = (node) => {
|
|
197
|
+
const { allOf, oneOf, anyOf, ...schema } = node;
|
|
198
|
+
if (allOf) return allOf.flatMap((n) => flattenForParameters(n));
|
|
199
|
+
return [schema];
|
|
200
|
+
};
|
|
201
|
+
const visit = (node) => {
|
|
202
|
+
if (!node || typeof node !== "object") return node;
|
|
203
|
+
if (typeof node.$refId === "string") {
|
|
204
|
+
const { $refId: id, ...rest } = node;
|
|
205
|
+
const res = visit(rest);
|
|
206
|
+
if (baseOpenapiDoc.components?.schemas) {
|
|
207
|
+
baseOpenapiDoc.components.schemas[id] = res;
|
|
208
|
+
return { $ref: `#/components/schemas/${id}` };
|
|
209
|
+
} else return res;
|
|
210
|
+
}
|
|
211
|
+
if (Array.isArray(node)) return node.map((n) => visit(n));
|
|
212
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, visit(value)]));
|
|
213
|
+
};
|
|
214
|
+
const buildTag = (groups) => {
|
|
215
|
+
if (!groups.length) return void 0;
|
|
216
|
+
const parsed = groups.map((g) => typeof g === "string" ? { name: g } : g);
|
|
217
|
+
const name = parsed.map((g) => g.name).join(" > ");
|
|
218
|
+
const displayName = parsed.at(-1)?.name ?? "";
|
|
219
|
+
const description = parsed.map((g) => g.description?.trim() ?? "").filter(Boolean).join("\n\n\n\n");
|
|
220
|
+
if (!registeredTags[name]) {
|
|
221
|
+
registeredTags[name] = true;
|
|
222
|
+
baseOpenapiDoc.tags.push({ name, "x-displayName": displayName, description });
|
|
223
|
+
const tagGroups = parsed.slice(0, -1);
|
|
224
|
+
const groupName = tagGroups.map((g) => g.name).join(" > ") || "default";
|
|
225
|
+
if (!registeredTagGroups[groupName]) {
|
|
226
|
+
const group = { name: groupName, tags: [] };
|
|
227
|
+
baseOpenapiDoc["x-tagGroups"].push(group);
|
|
228
|
+
registeredTagGroups[groupName] = group;
|
|
229
|
+
}
|
|
230
|
+
registeredTagGroups[groupName].tags = [.../* @__PURE__ */ new Set([...registeredTagGroups[groupName].tags, name])];
|
|
231
|
+
}
|
|
232
|
+
return name;
|
|
233
|
+
};
|
|
234
|
+
const addRouteToOpenApiDoc = async (path, method, def, methodObj) => {
|
|
235
|
+
if (def.response.response?.length) {
|
|
236
|
+
methodObj.responses ??= {};
|
|
237
|
+
for (const resp of def.response.response) {
|
|
238
|
+
methodObj.responses[resp.status] ??= { description: "", content: {} };
|
|
239
|
+
const res = methodObj.responses[resp.status];
|
|
240
|
+
res.content[resp.contentType] = { schema: await convert(visit(resp.schema)) };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (def.response.responseHeaders?.length) {
|
|
244
|
+
methodObj.responses ??= {};
|
|
245
|
+
for (const resp of def.response.responseHeaders) {
|
|
246
|
+
methodObj.responses[resp.status] ??= { description: "", content: {} };
|
|
247
|
+
methodObj.responses[resp.status];
|
|
248
|
+
const res = methodObj.responses[resp.status];
|
|
249
|
+
res.headers = { schema: await convert(visit(resp.schema)) };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (def.request.body)
|
|
253
|
+
methodObj.requestBody = {
|
|
254
|
+
required: true,
|
|
255
|
+
content: {
|
|
256
|
+
"application/json": { schema: await convert(visit(def.request.body)) }
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const parameters = [];
|
|
260
|
+
const addParams = async (location, schema) => {
|
|
261
|
+
if (!schema) return;
|
|
262
|
+
const flat = flattenForParameters(schema);
|
|
263
|
+
for (const schema2 of flat) {
|
|
264
|
+
if (!schema2.properties) continue;
|
|
265
|
+
for (const [name, value] of Object.entries(schema2.properties))
|
|
266
|
+
parameters.push({
|
|
267
|
+
name,
|
|
268
|
+
in: location,
|
|
269
|
+
schema: await convert(visit(value)),
|
|
270
|
+
required: (schema2.required || []).includes(name)
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
await Promise.all([
|
|
275
|
+
addParams("query", def.request.query),
|
|
276
|
+
addParams("path", def.request.params),
|
|
277
|
+
addParams("header", def.request.headers)
|
|
278
|
+
]);
|
|
279
|
+
if (parameters.length) methodObj.parameters = parameters;
|
|
280
|
+
if (!baseOpenapiDoc.paths) baseOpenapiDoc.paths = {};
|
|
281
|
+
if (!baseOpenapiDoc.paths[path]) baseOpenapiDoc.paths[path] = {};
|
|
282
|
+
baseOpenapiDoc.paths[path][method] = methodObj;
|
|
283
|
+
};
|
|
284
|
+
const html = (jsonPath2) => {
|
|
285
|
+
const title = capitalize(`${app.name} ${instance.id}`);
|
|
286
|
+
return `
|
|
287
|
+
<!doctype html>
|
|
288
|
+
<html>
|
|
289
|
+
<head>
|
|
290
|
+
<title>${title}</title>
|
|
291
|
+
<meta charset="utf-8" />
|
|
292
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
293
|
+
<style>
|
|
294
|
+
.darklight-reference {
|
|
295
|
+
display: none;
|
|
296
|
+
}
|
|
297
|
+
</style>
|
|
298
|
+
</head>
|
|
299
|
+
<body>
|
|
300
|
+
<script id="api-reference" data-url="${jsonPath2}"></script>
|
|
301
|
+
<script>
|
|
302
|
+
const configuration = { theme: 'purple' };
|
|
303
|
+
document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);
|
|
304
|
+
</script>
|
|
305
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.38.0"></script>
|
|
306
|
+
</body>
|
|
307
|
+
</html>
|
|
308
|
+
`;
|
|
309
|
+
};
|
|
310
|
+
const cleanPath = (path) => {
|
|
311
|
+
let cleaned = path.replace(/(\/\s*)+/g, "/");
|
|
312
|
+
if (!cleaned.startsWith("/")) cleaned = `/${cleaned}`;
|
|
313
|
+
if (cleaned !== "/" && cleaned.endsWith("/")) cleaned = cleaned.slice(0, -1);
|
|
314
|
+
return cleaned;
|
|
315
|
+
};
|
|
316
|
+
const register = async (route, def) => {
|
|
317
|
+
if (route.hide) return;
|
|
318
|
+
const tag = buildTag(route.groups ?? []);
|
|
319
|
+
const cleanedPath = cleanPath(route.path);
|
|
320
|
+
const operationId = `(${route.method.toUpperCase()}) ${cleanedPath}`;
|
|
321
|
+
await addRouteToOpenApiDoc(cleanedPath, route.method.toLowerCase(), def, {
|
|
322
|
+
operationId,
|
|
323
|
+
summary: route.title ?? cleanedPath,
|
|
324
|
+
description: route.descriptions?.join("\n\n"),
|
|
325
|
+
tags: tag ? [tag] : void 0,
|
|
326
|
+
security: route.security
|
|
327
|
+
});
|
|
328
|
+
};
|
|
329
|
+
const jsonPath = "/openapi.json";
|
|
330
|
+
const router = new Router({ path: config.openapi.docsPath ?? "/", hide: true });
|
|
331
|
+
router.get("/index.html")((req) => req.res({ body: html(`.${jsonPath}`), contentType: "text/html" }));
|
|
332
|
+
router.get(jsonPath)((req) => req.res({ body: baseOpenapiDoc }));
|
|
333
|
+
return {
|
|
334
|
+
router,
|
|
335
|
+
register,
|
|
336
|
+
cleanPath
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// src/utilities/authProviders.ts
|
|
341
|
+
var authProviders_exports = {};
|
|
342
|
+
__export(authProviders_exports, {
|
|
343
|
+
signinWithApple: () => signinWithApple,
|
|
344
|
+
signinWithFacebook: () => signinWithFacebook,
|
|
345
|
+
signinWithGoogle: () => signinWithGoogle
|
|
346
|
+
});
|
|
347
|
+
import axios from "axios";
|
|
348
|
+
import jwt from "jsonwebtoken";
|
|
349
|
+
import jwksClient from "jwks-rsa";
|
|
350
|
+
var signinWithGoogle = async (idToken) => {
|
|
351
|
+
const authUrl = `https://oauth2.googleapis.com/tokeninfo?id_token=${idToken}`;
|
|
352
|
+
const { data } = await axios.get(authUrl).catch((err) => {
|
|
353
|
+
throw new EquippedError("Failed to sign in with google", { idToken }, err);
|
|
354
|
+
});
|
|
355
|
+
data.first_name = data.given_name;
|
|
356
|
+
data.last_name = data.family_name;
|
|
357
|
+
return data;
|
|
358
|
+
};
|
|
359
|
+
var signinWithApple = async (idToken) => {
|
|
360
|
+
try {
|
|
361
|
+
const APPLE_BASE = "https://appleid.apple.com";
|
|
362
|
+
const json = jwt.decode(idToken, { complete: true });
|
|
363
|
+
if (!json?.header) throw new EquippedError("Missing JWT header", { idToken, json });
|
|
364
|
+
const { kid, alg } = json.header;
|
|
365
|
+
const publicKey = await jwksClient({ jwksUri: `${APPLE_BASE}/auth/keys`, cache: true }).getSigningKey(kid).then((key) => key.getPublicKey()).catch(() => null);
|
|
366
|
+
if (!publicKey) throw new EquippedError("no publicKey", { idToken, publicKey, json });
|
|
367
|
+
const data = jwt.verify(idToken, publicKey, { algorithms: [alg] });
|
|
368
|
+
if (!data) throw new EquippedError("no data", { idToken, data });
|
|
369
|
+
if (data.iss !== APPLE_BASE) throw new EquippedError("iss doesnt match", { idToken, data });
|
|
370
|
+
if (data.exp * 1e3 < Date.now()) throw new EquippedError("expired idToken", { idToken, data });
|
|
371
|
+
return data;
|
|
372
|
+
} catch (err) {
|
|
373
|
+
throw new EquippedError("Failed to sign in with apple", { idToken }, err);
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
var signinWithFacebook = async (accessToken, fields = []) => {
|
|
377
|
+
fields = [.../* @__PURE__ */ new Set([...fields, "name", "picture", "email"])];
|
|
378
|
+
const { data } = await axios.request({
|
|
379
|
+
method: "get",
|
|
380
|
+
url: "https://graph.facebook.com/v15.0/me",
|
|
381
|
+
params: {
|
|
382
|
+
fields: fields.join(","),
|
|
383
|
+
access_token: accessToken
|
|
384
|
+
}
|
|
385
|
+
}).catch((err) => {
|
|
386
|
+
throw new EquippedError("Failed to sign in with facebook", { accessToken, fields }, err);
|
|
387
|
+
});
|
|
388
|
+
const isValidData = fields.every((key) => key in data);
|
|
389
|
+
if (!isValidData) throw new EquippedError("Incomplete scope for access token", { accessToken, fields, data });
|
|
390
|
+
data.email_verified = "true";
|
|
391
|
+
return data;
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
// src/utilities/configurable.ts
|
|
395
|
+
import { v as v2 } from "valleyed";
|
|
396
|
+
function configurable(pipeFn, base) {
|
|
397
|
+
const pipe = pipeFn();
|
|
398
|
+
v2.compile(pipe);
|
|
399
|
+
class Configurable extends base {
|
|
400
|
+
constructor(config, ...baseArgs) {
|
|
401
|
+
super(...baseArgs);
|
|
402
|
+
this.config = config;
|
|
403
|
+
}
|
|
404
|
+
static create(input, ...args) {
|
|
405
|
+
const r = v2.validate(pipe, input);
|
|
406
|
+
if (!r.valid) throw r.error;
|
|
407
|
+
return new this(r.value, ...args);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return Configurable;
|
|
411
|
+
}
|
|
412
|
+
if (void 0) {
|
|
413
|
+
const { describe, test, expect, expectTypeOf } = void 0;
|
|
414
|
+
const { v: v8 } = await null;
|
|
415
|
+
const testPipe = () => v8.object({
|
|
416
|
+
host: v8.string(),
|
|
417
|
+
port: v8.number()
|
|
418
|
+
});
|
|
419
|
+
class TestBase {
|
|
420
|
+
baseValue;
|
|
421
|
+
constructor() {
|
|
422
|
+
this.baseValue = "base";
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
class TestBaseWithArgs {
|
|
426
|
+
label;
|
|
427
|
+
constructor(label) {
|
|
428
|
+
this.label = label;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
describe("configurable", () => {
|
|
432
|
+
test("validation runs in static create before constructor body executes", () => {
|
|
433
|
+
let constructorRan = false;
|
|
434
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
435
|
+
class MyClass extends Wrapped {
|
|
436
|
+
constructor(config) {
|
|
437
|
+
super(config);
|
|
438
|
+
constructorRan = true;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
|
|
442
|
+
expect(constructorRan).toBe(false);
|
|
443
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
444
|
+
expect(constructorRan).toBe(true);
|
|
445
|
+
});
|
|
446
|
+
test("constructor receives validated value", () => {
|
|
447
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
448
|
+
let receivedConfig;
|
|
449
|
+
class MyClass extends Wrapped {
|
|
450
|
+
constructor(config) {
|
|
451
|
+
super(config);
|
|
452
|
+
receivedConfig = this.config;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
456
|
+
expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
|
|
457
|
+
});
|
|
458
|
+
test("external new is a compile error", () => {
|
|
459
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
460
|
+
class MyClass extends Wrapped {
|
|
461
|
+
constructor(config) {
|
|
462
|
+
super(config);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
void (() => new MyClass({ host: "localhost", port: 3e3 }));
|
|
466
|
+
});
|
|
467
|
+
test("static Config resolves to PipeOutput<P> at the type level", () => {
|
|
468
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
469
|
+
class MyClass extends Wrapped {
|
|
470
|
+
constructor(config) {
|
|
471
|
+
super(config);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
expectTypeOf().toEqualTypeOf();
|
|
475
|
+
expect(MyClass.create).toBeTypeOf("function");
|
|
476
|
+
});
|
|
477
|
+
test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
|
|
478
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
479
|
+
class MyClass extends Wrapped {
|
|
480
|
+
extra;
|
|
481
|
+
constructor(config, extra) {
|
|
482
|
+
super(config);
|
|
483
|
+
this.extra = extra;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
|
|
487
|
+
expect(instance.extra).toBe(42);
|
|
488
|
+
expectTypeOf(instance).toHaveProperty("extra");
|
|
489
|
+
expectTypeOf(instance.extra).toEqualTypeOf();
|
|
490
|
+
void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
|
|
491
|
+
});
|
|
492
|
+
test("base-args forwarding works for non-zero-arg bases", () => {
|
|
493
|
+
const Wrapped = configurable(testPipe, TestBaseWithArgs);
|
|
494
|
+
class MyClass extends Wrapped {
|
|
495
|
+
constructor(config, label) {
|
|
496
|
+
super(config, label);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
|
|
500
|
+
expect(instance.label).toBe("test-label");
|
|
501
|
+
});
|
|
502
|
+
test("config is accessible as protected readonly on instances", () => {
|
|
503
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
504
|
+
class MyClass extends Wrapped {
|
|
505
|
+
constructor(config) {
|
|
506
|
+
super(config);
|
|
507
|
+
}
|
|
508
|
+
getHost() {
|
|
509
|
+
return this.config.host;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 });
|
|
513
|
+
expect(instance.getHost()).toBe("localhost");
|
|
514
|
+
});
|
|
515
|
+
test("accepts an abstract base class", () => {
|
|
516
|
+
class AbstractBase {
|
|
517
|
+
}
|
|
518
|
+
const Wrapped = configurable(testPipe, AbstractBase);
|
|
519
|
+
class Concrete extends Wrapped {
|
|
520
|
+
constructor(config) {
|
|
521
|
+
super(config);
|
|
522
|
+
}
|
|
523
|
+
greet() {
|
|
524
|
+
return `hello from ${this.config.host}`;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
const instance = Concrete.create({ host: "localhost", port: 3e3 });
|
|
528
|
+
expect(instance.greet()).toBe("hello from localhost");
|
|
529
|
+
expectTypeOf(instance).toHaveProperty("config");
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// src/utilities/hash.ts
|
|
535
|
+
var hash_exports = {};
|
|
536
|
+
__export(hash_exports, {
|
|
537
|
+
compare: () => compare2,
|
|
538
|
+
hash: () => hash2
|
|
539
|
+
});
|
|
540
|
+
import * as bcrypt from "bcryptjs";
|
|
541
|
+
var hash2 = async (password) => {
|
|
542
|
+
password = password.trim();
|
|
543
|
+
if (!password) return "";
|
|
544
|
+
return await bcrypt.hash(password, Instance.get().settings.utils.hashSaltRounds);
|
|
545
|
+
};
|
|
546
|
+
var compare2 = async (plainPassword, hashed) => {
|
|
547
|
+
plainPassword = plainPassword.trim();
|
|
548
|
+
if (!plainPassword && plainPassword === hashed) return true;
|
|
549
|
+
return await bcrypt.compare(plainPassword, hashed);
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
// src/utilities/json.ts
|
|
553
|
+
var parseJSONValue = (data) => {
|
|
554
|
+
try {
|
|
555
|
+
if (data?.constructor?.name !== "String") return data;
|
|
556
|
+
return JSON.parse(data);
|
|
557
|
+
} catch {
|
|
558
|
+
return data;
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
function parseJSONObject(data) {
|
|
562
|
+
return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)]));
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// src/utilities/media.ts
|
|
566
|
+
import { parseBuffer } from "music-metadata";
|
|
567
|
+
var getMediaDuration = async (buffer) => {
|
|
568
|
+
try {
|
|
569
|
+
const meta = await parseBuffer(buffer);
|
|
570
|
+
return meta.format.duration ?? 0;
|
|
571
|
+
} catch {
|
|
572
|
+
return 0;
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
// src/utilities/random.ts
|
|
577
|
+
var random_exports = {};
|
|
578
|
+
__export(random_exports, {
|
|
579
|
+
number: () => number,
|
|
580
|
+
string: () => string
|
|
581
|
+
});
|
|
582
|
+
import crypto from "crypto";
|
|
583
|
+
function string(length = 20) {
|
|
584
|
+
return crypto.randomBytes(length).toString("hex").slice(0, length);
|
|
585
|
+
}
|
|
586
|
+
function number(min = 0, max = 2 ** 48 - 1) {
|
|
587
|
+
return crypto.randomInt(min, max);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// src/utilities/retry.ts
|
|
591
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
592
|
+
var retry = async (cb, tries, waitTimeInMs) => {
|
|
593
|
+
if (tries <= 0) throw new EquippedError("out of tries", { tries, waitTimeInMs });
|
|
594
|
+
const result = await cb();
|
|
595
|
+
if (result.done === true) return result.value;
|
|
596
|
+
await sleep(waitTimeInMs);
|
|
597
|
+
return await retry(cb, tries - 1, waitTimeInMs);
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
// src/server/requests.ts
|
|
601
|
+
var Request = class {
|
|
602
|
+
ip;
|
|
603
|
+
method;
|
|
604
|
+
path;
|
|
605
|
+
body;
|
|
606
|
+
params;
|
|
607
|
+
query;
|
|
608
|
+
headers;
|
|
609
|
+
cookies;
|
|
610
|
+
authUser = null;
|
|
611
|
+
constructor({
|
|
612
|
+
ip,
|
|
613
|
+
body,
|
|
614
|
+
cookies,
|
|
615
|
+
params,
|
|
616
|
+
query,
|
|
617
|
+
method,
|
|
618
|
+
path,
|
|
619
|
+
headers,
|
|
620
|
+
files
|
|
621
|
+
}) {
|
|
622
|
+
this.ip = ip;
|
|
623
|
+
this.method = method;
|
|
624
|
+
this.path = path;
|
|
625
|
+
this.params = params;
|
|
626
|
+
this.cookies = cookies;
|
|
627
|
+
this.headers = headers;
|
|
628
|
+
this.query = parseJSONObject(query);
|
|
629
|
+
this.body = Object.assign(parseJSONObject(body), files);
|
|
630
|
+
}
|
|
631
|
+
pipe(stream, opts = {}) {
|
|
632
|
+
return new Response({ ...opts, piped: true, body: stream });
|
|
633
|
+
}
|
|
634
|
+
res(params) {
|
|
635
|
+
return new Response({ ...params, piped: false });
|
|
636
|
+
}
|
|
637
|
+
error(params) {
|
|
638
|
+
return new Response({ ...params, piped: false });
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
var Response = class {
|
|
642
|
+
body;
|
|
643
|
+
headers;
|
|
644
|
+
cookies;
|
|
645
|
+
status;
|
|
646
|
+
contentType;
|
|
647
|
+
piped;
|
|
648
|
+
constructor({
|
|
649
|
+
body,
|
|
650
|
+
status = 200,
|
|
651
|
+
headers = {},
|
|
652
|
+
cookies = {},
|
|
653
|
+
piped = false,
|
|
654
|
+
contentType = "application/json"
|
|
655
|
+
}) {
|
|
656
|
+
this.body = body;
|
|
657
|
+
this.status = status;
|
|
658
|
+
this.contentType = contentType;
|
|
659
|
+
this.headers = headers;
|
|
660
|
+
this.cookies = cookies;
|
|
661
|
+
this.piped = piped;
|
|
662
|
+
if (!this.piped) {
|
|
663
|
+
this.headers["Content-Type"] = contentType;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
get cookieValues() {
|
|
667
|
+
return Object.fromEntries(Object.entries(this.cookies).map(([key, val]) => [key, val]));
|
|
668
|
+
}
|
|
669
|
+
set cookieValues(values) {
|
|
670
|
+
Object.entries(values).forEach(([key, val]) => {
|
|
671
|
+
if (this.cookies[key]) this.cookies[key].value = val;
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
|
|
676
|
+
// src/server/requests-auth-methods/base.ts
|
|
677
|
+
import "http2";
|
|
678
|
+
var BaseRequestAuthMethod = class {
|
|
679
|
+
static async process(methods, headers) {
|
|
680
|
+
if (methods.length === 0) return null;
|
|
681
|
+
let error;
|
|
682
|
+
for (const method of methods) {
|
|
683
|
+
try {
|
|
684
|
+
return await method.parse(headers);
|
|
685
|
+
} catch (err) {
|
|
686
|
+
error = err;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
throw error instanceof RequestError ? error : new BadRequestError("failed to parse auth user", error);
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
|
|
693
|
+
// src/server/requests-auth-methods/apiKeys.ts
|
|
694
|
+
var BaseApiKeyRequestAuthMethod = class extends BaseRequestAuthMethod {
|
|
695
|
+
headerName;
|
|
696
|
+
constructor(headerName) {
|
|
697
|
+
super();
|
|
698
|
+
this.headerName = headerName;
|
|
699
|
+
}
|
|
700
|
+
async parse(headers) {
|
|
701
|
+
const headerValue = headers[this.headerName];
|
|
702
|
+
if (!headerValue || typeof headerValue !== "string") throw new NotAuthenticatedError();
|
|
703
|
+
return this.verify(headerValue);
|
|
704
|
+
}
|
|
705
|
+
routeSecuritySchemeName() {
|
|
706
|
+
return this.headerName;
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
// src/server/requests-auth-methods/jwt.ts
|
|
711
|
+
import cookie from "@fastify/cookie";
|
|
712
|
+
import jwt2 from "jsonwebtoken";
|
|
713
|
+
var BaseJwtRequestAuthMethod = class extends BaseRequestAuthMethod {
|
|
714
|
+
options;
|
|
715
|
+
constructor(options) {
|
|
716
|
+
super();
|
|
717
|
+
this.options = options;
|
|
718
|
+
}
|
|
719
|
+
#getKey(userId) {
|
|
720
|
+
return `${this.options.storagePrefix ?? ""}${userId}`;
|
|
721
|
+
}
|
|
722
|
+
async createToken(payload) {
|
|
723
|
+
const token = jwt2.sign(payload, this.options.signingKey, { expiresIn: this.options.storageTTL });
|
|
724
|
+
await this.store(this.#getKey(payload.id), token, this.options.storageTTL);
|
|
725
|
+
return token;
|
|
726
|
+
}
|
|
727
|
+
async parse(headers) {
|
|
728
|
+
try {
|
|
729
|
+
const token = await this.parseHeader(headers);
|
|
730
|
+
const user = jwt2.verify(token, this.options.signingKey);
|
|
731
|
+
if (!user) throw new NotAuthenticatedError();
|
|
732
|
+
if (this.options.enforceSingleSession) {
|
|
733
|
+
const cachedToken = await this.retrieve(this.#getKey(user.id));
|
|
734
|
+
if (token && token !== cachedToken) throw new TokenExpired();
|
|
735
|
+
}
|
|
736
|
+
return user;
|
|
737
|
+
} catch (err) {
|
|
738
|
+
if (err instanceof TokenExpired) throw err;
|
|
739
|
+
if (err instanceof jwt2.TokenExpiredError) throw new TokenExpired(void 0, err);
|
|
740
|
+
else throw new NotAuthenticatedError(void 0, err);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
async retrieveFor(userId) {
|
|
744
|
+
return this.retrieve(this.#getKey(userId));
|
|
745
|
+
}
|
|
746
|
+
async deleteFor(userId) {
|
|
747
|
+
await this.delete(this.#getKey(userId));
|
|
748
|
+
}
|
|
749
|
+
};
|
|
750
|
+
var BaseJwtHeaderRequestAuthMethod = class extends BaseJwtRequestAuthMethod {
|
|
751
|
+
options;
|
|
752
|
+
constructor(options) {
|
|
753
|
+
super(options);
|
|
754
|
+
this.options = options;
|
|
755
|
+
}
|
|
756
|
+
async parseHeader(headers) {
|
|
757
|
+
const value = headers[this.options.headerName];
|
|
758
|
+
if (!value || typeof value !== "string") throw new NotAuthenticatedError();
|
|
759
|
+
return value.startsWith("Bearer ") ? value.slice(7) : value;
|
|
760
|
+
}
|
|
761
|
+
routeSecuritySchemeName() {
|
|
762
|
+
return this.options.headerName;
|
|
763
|
+
}
|
|
764
|
+
};
|
|
765
|
+
var BaseJwtCookieRequestAuthMethod = class extends BaseJwtRequestAuthMethod {
|
|
766
|
+
options;
|
|
767
|
+
constructor(options) {
|
|
768
|
+
super(options);
|
|
769
|
+
this.options = options;
|
|
770
|
+
}
|
|
771
|
+
async parseHeader(headers) {
|
|
772
|
+
const cookies = cookie.parse(headers.cookie || "") ?? {};
|
|
773
|
+
const value = cookies[this.options.cookieName];
|
|
774
|
+
if (!value || typeof value !== "string") throw new NotAuthenticatedError();
|
|
775
|
+
return value;
|
|
776
|
+
}
|
|
777
|
+
routeSecuritySchemeName() {
|
|
778
|
+
return `cookie:${this.options.cookieName}`;
|
|
779
|
+
}
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
// src/server/sockets.ts
|
|
783
|
+
import { match as Match } from "path-to-regexp";
|
|
784
|
+
var EmitterEvent = "__listener_emitter";
|
|
785
|
+
var defaultTo = "*";
|
|
786
|
+
var SocketEmitter = class {
|
|
787
|
+
constructor(socket, config) {
|
|
788
|
+
this.config = config;
|
|
789
|
+
this.socketInstance = socket;
|
|
790
|
+
this.#setupSocketConnection();
|
|
791
|
+
Instance.on("setup", () => {
|
|
792
|
+
const stream = config.eventBus?.stream(EmitterEvent, { fanout: true });
|
|
793
|
+
this.#publish = stream ? stream.publish : async (data) => {
|
|
794
|
+
socket.to(data.channel).emit(data.channel, data);
|
|
795
|
+
};
|
|
796
|
+
stream?.subscribe(async (data) => {
|
|
797
|
+
socket.to(data.channel).emit(data.channel, data);
|
|
798
|
+
});
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
socketInstance;
|
|
802
|
+
#connectionCallbacks = { onConnect: async () => {
|
|
803
|
+
}, onDisconnect: async () => {
|
|
804
|
+
} };
|
|
805
|
+
#routes = {};
|
|
806
|
+
#publish = async () => {
|
|
807
|
+
};
|
|
808
|
+
async created(channels, data, to) {
|
|
809
|
+
await this.#emit(channels, "created" /* created */, { after: data.toJSON(), before: null }, to);
|
|
810
|
+
}
|
|
811
|
+
async updated(channels, { after, before }, to) {
|
|
812
|
+
await this.#emit(channels, "updated" /* updated */, { after: after.toJSON(), before: before.toJSON() }, to);
|
|
813
|
+
}
|
|
814
|
+
async deleted(channels, data, to) {
|
|
815
|
+
await this.#emit(channels, "deleted" /* deleted */, { before: data.toJSON(), after: null }, to);
|
|
816
|
+
}
|
|
817
|
+
async #emit(channels, type, { before, after }, to) {
|
|
818
|
+
const toArray = Array.isArray(to) ? to : [to ?? defaultTo];
|
|
819
|
+
const channelMap = channels.flatMap((c) => toArray.map((to2) => `${to2}:${c}`));
|
|
820
|
+
await Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })));
|
|
821
|
+
}
|
|
822
|
+
set connectionCallbacks(callbacks) {
|
|
823
|
+
this.#connectionCallbacks = callbacks;
|
|
824
|
+
this.#setupSocketConnection();
|
|
825
|
+
}
|
|
826
|
+
register(channel, onJoin) {
|
|
827
|
+
this.#routes[channel] = onJoin;
|
|
828
|
+
this.#routes[channel + "/:id"] = onJoin;
|
|
829
|
+
return this;
|
|
830
|
+
}
|
|
831
|
+
#getConfig(channel) {
|
|
832
|
+
const matcher = (key) => Match(key)(channel);
|
|
833
|
+
const matchedChannel = Object.keys(this.#routes).find(matcher) ?? null;
|
|
834
|
+
if (!matchedChannel) return null;
|
|
835
|
+
const match = matcher(matchedChannel);
|
|
836
|
+
if (!match) return null;
|
|
837
|
+
return {
|
|
838
|
+
config: this.#routes[matchedChannel],
|
|
839
|
+
params: match.params
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
#setupSocketConnection = () => {
|
|
843
|
+
this.socketInstance.removeAllListeners("connection");
|
|
844
|
+
this.socketInstance.on("connection", async (socket) => {
|
|
845
|
+
const socketId = socket.id;
|
|
846
|
+
const user = await BaseRequestAuthMethod.process(this.config.socketsAuthMethods, socket.handshake.headers).catch(() => null);
|
|
847
|
+
socket.on("leave", async (data, callback) => {
|
|
848
|
+
if (!data.channel)
|
|
849
|
+
return typeof callback === "function" && callback({
|
|
850
|
+
code: StatusCodes.ValidationError,
|
|
851
|
+
message: "channel is required",
|
|
852
|
+
channel: ""
|
|
853
|
+
});
|
|
854
|
+
socket.leave(data.channel);
|
|
855
|
+
return typeof callback === "function" && callback({
|
|
856
|
+
code: StatusCodes.Ok,
|
|
857
|
+
message: "",
|
|
858
|
+
channel: data.channel
|
|
859
|
+
});
|
|
860
|
+
});
|
|
861
|
+
socket.on("join", async (data, callback) => {
|
|
862
|
+
if (!data.channel)
|
|
863
|
+
return typeof callback === "function" && callback({
|
|
864
|
+
code: StatusCodes.ValidationError,
|
|
865
|
+
message: "channel is required",
|
|
866
|
+
channel: ""
|
|
867
|
+
});
|
|
868
|
+
const channel = data.channel;
|
|
869
|
+
const route = this.#getConfig(channel) ?? null;
|
|
870
|
+
if (!route)
|
|
871
|
+
return typeof callback === "function" && callback({
|
|
872
|
+
code: StatusCodes.BadRequest,
|
|
873
|
+
message: "unknown channel",
|
|
874
|
+
channel
|
|
875
|
+
});
|
|
876
|
+
const to = await route.config({ channel, user }, route.params, data.query ?? {});
|
|
877
|
+
const newChannel = `${to ?? defaultTo}:${channel}`;
|
|
878
|
+
socket.join(newChannel);
|
|
879
|
+
return typeof callback === "function" && callback({
|
|
880
|
+
code: StatusCodes.Ok,
|
|
881
|
+
message: "",
|
|
882
|
+
channel: newChannel
|
|
883
|
+
});
|
|
884
|
+
});
|
|
885
|
+
if (user) await this.#connectionCallbacks.onConnect(user.id, socketId);
|
|
886
|
+
socket.on("disconnect", async () => {
|
|
887
|
+
if (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId);
|
|
888
|
+
});
|
|
889
|
+
});
|
|
890
|
+
};
|
|
891
|
+
};
|
|
892
|
+
|
|
893
|
+
// src/server/adapters/base.ts
|
|
894
|
+
var serverConfigPipe = () => v3.object({
|
|
895
|
+
port: v3.number(),
|
|
896
|
+
cors: v3.optional(
|
|
897
|
+
v3.object({
|
|
898
|
+
origin: v3.optional(v3.or([v3.array(v3.string()), v3.is(true)])),
|
|
899
|
+
methods: v3.optional(v3.array(v3.in(Object.values(Methods)))),
|
|
900
|
+
credentials: v3.optional(v3.boolean())
|
|
901
|
+
})
|
|
902
|
+
),
|
|
903
|
+
eventBus: v3.optional(v3.instanceOf(EventBus)),
|
|
904
|
+
publicPath: v3.optional(v3.string()),
|
|
905
|
+
healthPath: v3.optional(v3.string()),
|
|
906
|
+
openapi: v3.defaults(
|
|
907
|
+
v3.object({
|
|
908
|
+
docsVersion: v3.defaults(v3.string(), "1.0.0"),
|
|
909
|
+
docsBaseUrl: v3.defaults(v3.array(v3.string()), ["/"]),
|
|
910
|
+
docsPath: v3.defaults(v3.string(), "/__docs")
|
|
911
|
+
}),
|
|
912
|
+
{}
|
|
913
|
+
),
|
|
914
|
+
requests: v3.defaults(
|
|
915
|
+
v3.object({
|
|
916
|
+
log: v3.defaults(v3.boolean(), true),
|
|
917
|
+
rateLimit: v3.defaults(
|
|
918
|
+
v3.object({
|
|
919
|
+
enabled: v3.defaults(v3.boolean(), false),
|
|
920
|
+
periodInMs: v3.defaults(v3.number(), 60 * 60 * 1e3),
|
|
921
|
+
limit: v3.defaults(v3.number(), 5e3)
|
|
922
|
+
}),
|
|
923
|
+
{}
|
|
924
|
+
),
|
|
925
|
+
slowdown: v3.defaults(
|
|
926
|
+
v3.object({
|
|
927
|
+
enabled: v3.defaults(v3.boolean(), false),
|
|
928
|
+
periodInMs: v3.defaults(v3.number(), 10 * 60 * 1e3),
|
|
929
|
+
delayAfter: v3.defaults(v3.number(), 2e3),
|
|
930
|
+
delayInMs: v3.defaults(v3.number(), 500)
|
|
931
|
+
}),
|
|
932
|
+
{}
|
|
933
|
+
)
|
|
934
|
+
}),
|
|
935
|
+
{}
|
|
936
|
+
),
|
|
937
|
+
socketsAuthMethods: v3.defaults(v3.array(v3.instanceOf(BaseRequestAuthMethod)), [])
|
|
938
|
+
});
|
|
939
|
+
var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
|
|
940
|
+
var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
|
|
941
|
+
var rawResponseNotStartedMessage = "Raw not-found handler did not start or complete a response";
|
|
942
|
+
function isRawResponseHandled(input) {
|
|
943
|
+
return Boolean(input && typeof input === "object" && rawResponseHandledSymbol in input);
|
|
944
|
+
}
|
|
945
|
+
function hasRawResponseStarted(response) {
|
|
946
|
+
return response.headersSent || response.writableEnded;
|
|
947
|
+
}
|
|
948
|
+
function writeRawHandlerError(response, error) {
|
|
949
|
+
if (hasRawResponseStarted(response)) return;
|
|
950
|
+
response.statusCode = StatusCodes.BadRequest;
|
|
951
|
+
response.setHeader("Content-Type", "application/json");
|
|
952
|
+
const message = error instanceof Error ? error.message : `${error}`;
|
|
953
|
+
response.end(JSON.stringify([{ message }]));
|
|
954
|
+
}
|
|
955
|
+
var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
|
|
956
|
+
status: value,
|
|
957
|
+
contentType: "application/json",
|
|
958
|
+
pipe: v3.meta(v3.array(v3.object({ message: v3.string(), field: v3.optional(v3.string()) })), {
|
|
959
|
+
$refId: `Errors.${key}Response`,
|
|
960
|
+
description: `${key} Response`
|
|
961
|
+
})
|
|
962
|
+
}));
|
|
963
|
+
var Server = class {
|
|
964
|
+
socket;
|
|
965
|
+
cors;
|
|
966
|
+
#httpServer;
|
|
967
|
+
#oai;
|
|
968
|
+
#serverConfig;
|
|
969
|
+
#queue = [];
|
|
970
|
+
#routesByKey = /* @__PURE__ */ new Set();
|
|
971
|
+
#started = false;
|
|
972
|
+
#notFoundHandler = null;
|
|
973
|
+
setup(httpServer, config) {
|
|
974
|
+
this.#httpServer = httpServer;
|
|
975
|
+
this.#serverConfig = config;
|
|
976
|
+
this.cors = {
|
|
977
|
+
origin: config.cors?.origin ? (_, cb) => cb(null, true) : config.cors?.origin,
|
|
978
|
+
methods: (config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),
|
|
979
|
+
credentials: config.cors?.credentials
|
|
980
|
+
};
|
|
981
|
+
this.#oai = openapi(config);
|
|
982
|
+
const socketInstance = new SocketServer(httpServer, { cors: this.cors });
|
|
983
|
+
this.socket = new SocketEmitter(socketInstance, config);
|
|
984
|
+
this.addRouter(this.#oai.router);
|
|
985
|
+
}
|
|
986
|
+
addRouter(...routers) {
|
|
987
|
+
routers.map((router) => router.routes).forEach((routes) => this.addRoute(...routes));
|
|
988
|
+
}
|
|
989
|
+
addRoute(...routes) {
|
|
990
|
+
routes.forEach((route) => {
|
|
991
|
+
this.#queue.push(async () => {
|
|
992
|
+
const { method, path, schema = {}, onError, middlewares = [], responseMiddlewares = [] } = route;
|
|
993
|
+
const key = `(${method.toUpperCase()}) ${this.#oai.cleanPath(path)}`;
|
|
994
|
+
if (this.#routesByKey.has(key))
|
|
995
|
+
throw new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key });
|
|
996
|
+
middlewares.forEach((m) => m.onSetup?.(route));
|
|
997
|
+
onError?.onSetup?.(route);
|
|
998
|
+
responseMiddlewares.forEach((m) => m.onSetup?.(route));
|
|
999
|
+
const { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema);
|
|
1000
|
+
this.#routesByKey.add(key);
|
|
1001
|
+
await this.#oai.register(route, jsonSchema);
|
|
1002
|
+
this.registerRoute(method, this.#oai.cleanPath(path), async (req, res) => {
|
|
1003
|
+
const request = await validateRequest(await this.parseRequest(req));
|
|
1004
|
+
try {
|
|
1005
|
+
for (const middleware of middlewares) await middleware.cb(request);
|
|
1006
|
+
const rawRes = await route.handler(request);
|
|
1007
|
+
const response = rawRes instanceof Response ? rawRes : new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false });
|
|
1008
|
+
for (const middleware of responseMiddlewares) await middleware.cb(request, response);
|
|
1009
|
+
return await this.handleResponse(res, await validateResponse(response));
|
|
1010
|
+
} catch (error) {
|
|
1011
|
+
if (onError?.cb) {
|
|
1012
|
+
const rawResponse = await onError.cb(request, error);
|
|
1013
|
+
const response = rawResponse instanceof Response ? rawResponse : new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} });
|
|
1014
|
+
return await this.handleResponse(res, await validateResponse(response));
|
|
1015
|
+
}
|
|
1016
|
+
throw error;
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
});
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
setNotFoundHandler(handler) {
|
|
1023
|
+
if (this.#started) throw new EquippedError("Cannot set not-found handler after server has started", {});
|
|
1024
|
+
this.#notFoundHandler = handler;
|
|
1025
|
+
return this;
|
|
1026
|
+
}
|
|
1027
|
+
test() {
|
|
1028
|
+
return supertest(this.#httpServer);
|
|
1029
|
+
}
|
|
1030
|
+
async start() {
|
|
1031
|
+
this.#started = true;
|
|
1032
|
+
const config = this.#serverConfig;
|
|
1033
|
+
const instance = Instance.get();
|
|
1034
|
+
const { app } = instance.settings;
|
|
1035
|
+
if (config.healthPath)
|
|
1036
|
+
this.addRoute({
|
|
1037
|
+
method: Methods.get,
|
|
1038
|
+
path: config.healthPath,
|
|
1039
|
+
handler: async (req) => req.res({
|
|
1040
|
+
body: `${instance.id}(${app.name}) service running`,
|
|
1041
|
+
contentType: "text/plain"
|
|
1042
|
+
})
|
|
1043
|
+
});
|
|
1044
|
+
await Promise.all(this.#queue.map((cb) => cb()));
|
|
1045
|
+
this.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res));
|
|
1046
|
+
this.registerErrorHandler(async (error, _, res) => {
|
|
1047
|
+
if (!(error instanceof EquippedError)) Instance.get().log.error({ error }, "Uncaught error in route handler");
|
|
1048
|
+
const response = error instanceof RequestError ? new Response({
|
|
1049
|
+
body: error.serializedErrors,
|
|
1050
|
+
status: error.statusCode
|
|
1051
|
+
}) : error instanceof EquippedError ? new Response({
|
|
1052
|
+
body: [{ message: error.message }],
|
|
1053
|
+
status: StatusCodes.BadRequest
|
|
1054
|
+
}) : new Response({
|
|
1055
|
+
body: [{ message: "Something went wrong", data: error.message }],
|
|
1056
|
+
status: StatusCodes.BadRequest
|
|
1057
|
+
});
|
|
1058
|
+
return await this.handleResponse(res, response);
|
|
1059
|
+
});
|
|
1060
|
+
const started = await this.startServer(config.port);
|
|
1061
|
+
if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
|
|
1062
|
+
return started;
|
|
1063
|
+
}
|
|
1064
|
+
createNodeRawResponder(input) {
|
|
1065
|
+
return async (handler) => {
|
|
1066
|
+
input.beforeHandle?.();
|
|
1067
|
+
try {
|
|
1068
|
+
await handler(input.request, input.response);
|
|
1069
|
+
} catch (error) {
|
|
1070
|
+
if (!hasRawResponseStarted(input.response)) {
|
|
1071
|
+
writeRawHandlerError(input.response, error);
|
|
1072
|
+
return rawResponseHandled;
|
|
1073
|
+
}
|
|
1074
|
+
throw error;
|
|
1075
|
+
}
|
|
1076
|
+
if (!hasRawResponseStarted(input.response))
|
|
1077
|
+
writeRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}));
|
|
1078
|
+
return rawResponseHandled;
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
async #handleNotFound(req, res) {
|
|
1082
|
+
const request = await this.parseRequest(req);
|
|
1083
|
+
if (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`);
|
|
1084
|
+
const result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) });
|
|
1085
|
+
if (isRawResponseHandled(result)) return;
|
|
1086
|
+
if (result instanceof Response) return await this.handleResponse(res, result);
|
|
1087
|
+
throw new EquippedError("Not-found handler must return a Response or respondWithRaw(...)", {});
|
|
1088
|
+
}
|
|
1089
|
+
#resolveSchema(method, schema) {
|
|
1090
|
+
const defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok;
|
|
1091
|
+
const defaultContentType = schema?.defaultContentType ?? "application/json";
|
|
1092
|
+
let status = defaultStatusCode;
|
|
1093
|
+
let contentType = defaultContentType;
|
|
1094
|
+
const jsonSchema = { response: {}, request: {} };
|
|
1095
|
+
const requestPipeDefs = {};
|
|
1096
|
+
const responsePipeDefs = {};
|
|
1097
|
+
const defs = [
|
|
1098
|
+
{ key: "params", type: "request" },
|
|
1099
|
+
{ key: "headers", type: "request" },
|
|
1100
|
+
{ key: "cookies", type: "request" },
|
|
1101
|
+
{ key: "query", type: "request" },
|
|
1102
|
+
{ key: "body", type: "request", skip: ![Methods.post, Methods.put, Methods.patch].includes(method) },
|
|
1103
|
+
{ key: "response", type: "response" },
|
|
1104
|
+
{ key: "responseHeaders", type: "response" },
|
|
1105
|
+
{ key: "responseCookies", type: "response" }
|
|
1106
|
+
];
|
|
1107
|
+
defs.forEach((def) => {
|
|
1108
|
+
const pipe = schema[def.key] ?? v3.any();
|
|
1109
|
+
if (def.skip) return;
|
|
1110
|
+
if (def.type === "request") {
|
|
1111
|
+
requestPipeDefs[def.key] = pipe;
|
|
1112
|
+
jsonSchema.request[def.key] = v3.schema(pipe);
|
|
1113
|
+
}
|
|
1114
|
+
if (def.type === "response") {
|
|
1115
|
+
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
1116
|
+
responsePipeDefs[def.key] = v3.any().pipe((input) => {
|
|
1117
|
+
const p = pipeRecords.find((rec) => rec.status === status)?.pipe;
|
|
1118
|
+
if (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
1119
|
+
const r = v3.validate(p, input);
|
|
1120
|
+
if (!r.valid) throw r.error;
|
|
1121
|
+
return r.value;
|
|
1122
|
+
});
|
|
1123
|
+
jsonSchema.response[def.key] = pipeRecords.map((record) => ({
|
|
1124
|
+
status: record.status,
|
|
1125
|
+
contentType: record.contentType,
|
|
1126
|
+
schema: v3.schema(record.pipe)
|
|
1127
|
+
}));
|
|
1128
|
+
}
|
|
1129
|
+
});
|
|
1130
|
+
const requestPipe = v3.object(requestPipeDefs);
|
|
1131
|
+
v3.compile(requestPipe, { allErrors: true });
|
|
1132
|
+
const responsePipe = v3.object(responsePipeDefs);
|
|
1133
|
+
v3.compile(responsePipe, { allErrors: true });
|
|
1134
|
+
const validateRequest = async (request) => {
|
|
1135
|
+
if (!Object.keys(requestPipeDefs)) return request;
|
|
1136
|
+
const validity = requestLocalStorage.run(
|
|
1137
|
+
request,
|
|
1138
|
+
() => v3.validate(requestPipe, {
|
|
1139
|
+
params: request.params,
|
|
1140
|
+
headers: request.headers,
|
|
1141
|
+
query: request.query,
|
|
1142
|
+
body: request.body,
|
|
1143
|
+
cookies: request.cookies
|
|
1144
|
+
})
|
|
1145
|
+
);
|
|
1146
|
+
if (!validity.valid) throw pipeErrorToValidationError(validity.error);
|
|
1147
|
+
request.params = validity.value.params;
|
|
1148
|
+
request.headers = validity.value.headers;
|
|
1149
|
+
request.query = validity.value.query;
|
|
1150
|
+
request.body = validity.value.body;
|
|
1151
|
+
request.cookies = validity.value.cookies;
|
|
1152
|
+
return request;
|
|
1153
|
+
};
|
|
1154
|
+
const validateResponse = async (response) => {
|
|
1155
|
+
if (!Object.keys(responsePipeDefs)) return response;
|
|
1156
|
+
status = response.status;
|
|
1157
|
+
contentType = response.contentType;
|
|
1158
|
+
const validity = responseLocalStorage.run(
|
|
1159
|
+
response,
|
|
1160
|
+
() => v3.validate(responsePipe, {
|
|
1161
|
+
responseHeaders: response.headers,
|
|
1162
|
+
responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
|
|
1163
|
+
response: response.body
|
|
1164
|
+
})
|
|
1165
|
+
);
|
|
1166
|
+
if (!validity.valid) throw pipeErrorToValidationError(validity.error);
|
|
1167
|
+
response.body = validity.value.response;
|
|
1168
|
+
response.headers = validity.value.responseHeaders;
|
|
1169
|
+
response.cookieValues = validity.value.responseCookies;
|
|
1170
|
+
return response;
|
|
1171
|
+
};
|
|
1172
|
+
return {
|
|
1173
|
+
jsonSchema,
|
|
1174
|
+
validateRequest,
|
|
1175
|
+
validateResponse
|
|
1176
|
+
};
|
|
1177
|
+
}
|
|
1178
|
+
};
|
|
1179
|
+
if (void 0) {
|
|
1180
|
+
let ensureTestInstance = function() {
|
|
1181
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
1182
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
1183
|
+
instance.alias("equipped-test");
|
|
1184
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
1185
|
+
}
|
|
1186
|
+
}, createRawResponse = function() {
|
|
1187
|
+
const chunks = [];
|
|
1188
|
+
return {
|
|
1189
|
+
statusCode: 200,
|
|
1190
|
+
headersSent: false,
|
|
1191
|
+
writableEnded: false,
|
|
1192
|
+
headers: {},
|
|
1193
|
+
setHeader(key, value) {
|
|
1194
|
+
this.headers[key] = value;
|
|
1195
|
+
},
|
|
1196
|
+
end(chunk) {
|
|
1197
|
+
if (chunk !== void 0) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk));
|
|
1198
|
+
this.headersSent = true;
|
|
1199
|
+
this.writableEnded = true;
|
|
1200
|
+
},
|
|
1201
|
+
body() {
|
|
1202
|
+
return chunks.join("");
|
|
1203
|
+
}
|
|
1204
|
+
};
|
|
1205
|
+
};
|
|
1206
|
+
ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
|
|
1207
|
+
const { describe, expect, test } = void 0;
|
|
1208
|
+
const testInstanceState = globalThis;
|
|
1209
|
+
class TestServer extends Server {
|
|
1210
|
+
handledResponse = null;
|
|
1211
|
+
notFoundHandler = null;
|
|
1212
|
+
constructor() {
|
|
1213
|
+
super();
|
|
1214
|
+
this.setup(http.createServer(), {
|
|
1215
|
+
port: 0,
|
|
1216
|
+
cors: void 0,
|
|
1217
|
+
eventBus: void 0,
|
|
1218
|
+
publicPath: void 0,
|
|
1219
|
+
healthPath: void 0,
|
|
1220
|
+
openapi: { docsVersion: "1.0.0", docsBaseUrl: ["/"], docsPath: "/__docs" },
|
|
1221
|
+
requests: {
|
|
1222
|
+
log: false,
|
|
1223
|
+
rateLimit: { enabled: false, periodInMs: 1, limit: 1 },
|
|
1224
|
+
slowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 }
|
|
1225
|
+
},
|
|
1226
|
+
socketsAuthMethods: []
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
async parseRequest(req) {
|
|
1230
|
+
return new Request2({
|
|
1231
|
+
ip: "127.0.0.1",
|
|
1232
|
+
body: {},
|
|
1233
|
+
cookies: {},
|
|
1234
|
+
params: {},
|
|
1235
|
+
query: {},
|
|
1236
|
+
method: Methods.get,
|
|
1237
|
+
path: req.path,
|
|
1238
|
+
headers: {},
|
|
1239
|
+
files: {}
|
|
1240
|
+
});
|
|
1241
|
+
}
|
|
1242
|
+
async handleResponse(_, response) {
|
|
1243
|
+
this.handledResponse = response;
|
|
1244
|
+
}
|
|
1245
|
+
createRawResponder(req, res) {
|
|
1246
|
+
return this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse });
|
|
1247
|
+
}
|
|
1248
|
+
registerRoute() {
|
|
1249
|
+
}
|
|
1250
|
+
registerErrorHandler() {
|
|
1251
|
+
}
|
|
1252
|
+
registerNotFoundHandler(cb) {
|
|
1253
|
+
this.notFoundHandler = cb;
|
|
1254
|
+
}
|
|
1255
|
+
async startServer() {
|
|
1256
|
+
return true;
|
|
1257
|
+
}
|
|
1258
|
+
async dispatchNotFound(path) {
|
|
1259
|
+
if (!this.notFoundHandler) throw new Error("not-found handler was not registered");
|
|
1260
|
+
this.handledResponse = null;
|
|
1261
|
+
const rawResponse = createRawResponse();
|
|
1262
|
+
await this.notFoundHandler({ path, rawRequest: {} }, { rawResponse });
|
|
1263
|
+
return { handledResponse: this.handledResponse, rawResponse };
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
describe("Server not-found handler", () => {
|
|
1267
|
+
test("throws the default Equipped not-found error when no custom handler is set", async () => {
|
|
1268
|
+
ensureTestInstance();
|
|
1269
|
+
const server = new TestServer();
|
|
1270
|
+
await server.start();
|
|
1271
|
+
await expect(server.dispatchNotFound("/missing")).rejects.toBeInstanceOf(NotFoundError);
|
|
1272
|
+
});
|
|
1273
|
+
test("allows a custom not-found handler to return an Equipped response", async () => {
|
|
1274
|
+
ensureTestInstance();
|
|
1275
|
+
const server = new TestServer();
|
|
1276
|
+
server.setNotFoundHandler(
|
|
1277
|
+
({ request }) => new Response({
|
|
1278
|
+
body: [{ message: `No route for ${request.path}` }],
|
|
1279
|
+
status: StatusCodes.NotFound,
|
|
1280
|
+
headers: {},
|
|
1281
|
+
cookies: {},
|
|
1282
|
+
contentType: "application/json"
|
|
1283
|
+
})
|
|
1284
|
+
);
|
|
1285
|
+
await server.start();
|
|
1286
|
+
const result = await server.dispatchNotFound("/custom");
|
|
1287
|
+
expect(result.handledResponse?.status).toBe(StatusCodes.NotFound);
|
|
1288
|
+
expect(result.handledResponse?.body).toEqual([{ message: "No route for /custom" }]);
|
|
1289
|
+
});
|
|
1290
|
+
test("allows a custom not-found handler to complete the response through a raw Node listener", async () => {
|
|
1291
|
+
ensureTestInstance();
|
|
1292
|
+
const server = new TestServer();
|
|
1293
|
+
server.setNotFoundHandler(
|
|
1294
|
+
({ respondWithRaw }) => respondWithRaw((_, response) => {
|
|
1295
|
+
response.statusCode = 203;
|
|
1296
|
+
response.end("raw fallback");
|
|
1297
|
+
})
|
|
1298
|
+
);
|
|
1299
|
+
await server.start();
|
|
1300
|
+
const result = await server.dispatchNotFound("/page");
|
|
1301
|
+
expect(result.handledResponse).toBeNull();
|
|
1302
|
+
expect(result.rawResponse.statusCode).toBe(203);
|
|
1303
|
+
expect(result.rawResponse.body()).toBe("raw fallback");
|
|
1304
|
+
});
|
|
1305
|
+
test("writes a clear raw error when a raw not-found handler does not start a response", async () => {
|
|
1306
|
+
ensureTestInstance();
|
|
1307
|
+
const server = new TestServer();
|
|
1308
|
+
server.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {
|
|
1309
|
+
}));
|
|
1310
|
+
await server.start();
|
|
1311
|
+
const result = await server.dispatchNotFound("/page");
|
|
1312
|
+
expect(result.handledResponse).toBeNull();
|
|
1313
|
+
expect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest);
|
|
1314
|
+
expect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage);
|
|
1315
|
+
});
|
|
1316
|
+
test("rejects a custom not-found handler result that is neither an Equipped response nor raw completion", async () => {
|
|
1317
|
+
ensureTestInstance();
|
|
1318
|
+
const server = new TestServer();
|
|
1319
|
+
server.setNotFoundHandler((() => void 0));
|
|
1320
|
+
await server.start();
|
|
1321
|
+
await expect(server.dispatchNotFound("/bad")).rejects.toThrow("Not-found handler must return a Response or respondWithRaw(...)");
|
|
1322
|
+
});
|
|
1323
|
+
test("rejects setting the custom not-found handler after server startup", async () => {
|
|
1324
|
+
ensureTestInstance();
|
|
1325
|
+
const server = new TestServer();
|
|
1326
|
+
await server.start();
|
|
1327
|
+
expect(
|
|
1328
|
+
() => server.setNotFoundHandler(
|
|
1329
|
+
() => new Response({
|
|
1330
|
+
body: null,
|
|
1331
|
+
status: StatusCodes.NotFound,
|
|
1332
|
+
headers: {},
|
|
1333
|
+
cookies: {},
|
|
1334
|
+
contentType: "application/json"
|
|
1335
|
+
})
|
|
1336
|
+
)
|
|
1337
|
+
).toThrow("Cannot set not-found handler after server has started");
|
|
1338
|
+
});
|
|
1339
|
+
});
|
|
1340
|
+
}
|
|
1341
|
+
var ensureTestInstance2;
|
|
1342
|
+
var createRawResponse2;
|
|
1343
|
+
|
|
1344
|
+
// src/server/middlewares/requireAuthUser.ts
|
|
1345
|
+
var requireAuthUser = (methods) => makeMiddleware(
|
|
1346
|
+
async (request) => {
|
|
1347
|
+
request.authUser = await BaseRequestAuthMethod.process(methods, request.headers);
|
|
1348
|
+
if (!request.authUser) throw new NotAuthenticatedError();
|
|
1349
|
+
},
|
|
1350
|
+
(route) => {
|
|
1351
|
+
route.security ??= [];
|
|
1352
|
+
for (const method of methods) {
|
|
1353
|
+
const schemeName = method.routeSecuritySchemeName();
|
|
1354
|
+
if (schemeName) route.security.push({ [schemeName]: [] });
|
|
1355
|
+
}
|
|
1356
|
+
route.descriptions ??= [];
|
|
1357
|
+
route.descriptions.push("Requires a valid means of authentication.");
|
|
1358
|
+
}
|
|
1359
|
+
);
|
|
1360
|
+
|
|
1361
|
+
// src/errors/types/badRequestError.ts
|
|
1362
|
+
var BadRequestError = class extends RequestError {
|
|
1363
|
+
statusCode = StatusCodes.BadRequest;
|
|
1364
|
+
constructor(message, cause) {
|
|
1365
|
+
super(message, [{ message }], cause);
|
|
1366
|
+
}
|
|
1367
|
+
};
|
|
1368
|
+
|
|
1369
|
+
// src/errors/types/notAuthenticatedError.ts
|
|
1370
|
+
var NotAuthenticatedError = class extends RequestError {
|
|
1371
|
+
statusCode = StatusCodes.NotAuthenticated;
|
|
1372
|
+
constructor(message = "Not authenticated", cause) {
|
|
1373
|
+
super(message, [{ message }], cause);
|
|
1374
|
+
}
|
|
1375
|
+
};
|
|
1376
|
+
|
|
1377
|
+
// src/errors/types/notAuthorizedError.ts
|
|
1378
|
+
var NotAuthorizedError = class extends RequestError {
|
|
1379
|
+
statusCode = StatusCodes.NotAuthorized;
|
|
1380
|
+
constructor(message = "Not authorized", cause) {
|
|
1381
|
+
super(message, [{ message }], cause);
|
|
1382
|
+
}
|
|
1383
|
+
};
|
|
1384
|
+
|
|
1385
|
+
// src/errors/types/notFoundError.ts
|
|
1386
|
+
var NotFoundError = class extends RequestError {
|
|
1387
|
+
statusCode = StatusCodes.NotFound;
|
|
1388
|
+
constructor(message = "Not found", cause) {
|
|
1389
|
+
super(message, [{ message }], cause);
|
|
1390
|
+
}
|
|
1391
|
+
};
|
|
1392
|
+
|
|
1393
|
+
// src/errors/types/tokenExpired.ts
|
|
1394
|
+
var TokenExpired = class extends RequestError {
|
|
1395
|
+
statusCode = StatusCodes.TokenExpired;
|
|
1396
|
+
constructor(message = "Token expired", cause) {
|
|
1397
|
+
super(message, [{ message }], cause);
|
|
1398
|
+
}
|
|
1399
|
+
};
|
|
1400
|
+
|
|
1401
|
+
// src/errors/types/validationError.ts
|
|
1402
|
+
var ValidationError = class extends RequestError {
|
|
1403
|
+
statusCode = StatusCodes.ValidationError;
|
|
1404
|
+
constructor(errors, cause) {
|
|
1405
|
+
super(
|
|
1406
|
+
"Unprocessable Entity",
|
|
1407
|
+
errors.flatMap(({ field, messages }) => messages.map((message) => ({ message, field }))),
|
|
1408
|
+
cause
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
};
|
|
1412
|
+
|
|
1413
|
+
// src/instance/hooks.ts
|
|
1414
|
+
function registerHook(hooks, record) {
|
|
1415
|
+
for (const dep of record.after) {
|
|
1416
|
+
if (!hooks.some((h) => h.class === dep)) {
|
|
1417
|
+
const depName = dep.name || "unknown";
|
|
1418
|
+
const ownerName = record.class?.name || "anonymous";
|
|
1419
|
+
throw new Error(`Missing dependency: ${ownerName} declares after: [${depName}], but ${depName} is not registered`);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
if (record.class) {
|
|
1423
|
+
const tentative = [...hooks, record];
|
|
1424
|
+
detectCycle(tentative);
|
|
1425
|
+
}
|
|
1426
|
+
hooks.push(record);
|
|
1427
|
+
}
|
|
1428
|
+
function detectCycle(hooks) {
|
|
1429
|
+
const classToAfter = /* @__PURE__ */ new Map();
|
|
1430
|
+
for (const h of hooks) {
|
|
1431
|
+
if (!h.class) continue;
|
|
1432
|
+
const existing = classToAfter.get(h.class);
|
|
1433
|
+
if (existing) {
|
|
1434
|
+
for (const dep of h.after) {
|
|
1435
|
+
if (!existing.includes(dep)) existing.push(dep);
|
|
1436
|
+
}
|
|
1437
|
+
} else {
|
|
1438
|
+
classToAfter.set(h.class, [...h.after]);
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1442
|
+
const stack = /* @__PURE__ */ new Set();
|
|
1443
|
+
function visit(cls, path) {
|
|
1444
|
+
if (stack.has(cls)) {
|
|
1445
|
+
const cycleStart = path.indexOf(cls);
|
|
1446
|
+
const cycle = [...path.slice(cycleStart), cls];
|
|
1447
|
+
const names = cycle.map((c) => c.name || "unknown");
|
|
1448
|
+
throw new Error(`Cycle detected: ${names.join(" \u2192 ")}`);
|
|
1449
|
+
}
|
|
1450
|
+
if (visited.has(cls)) return;
|
|
1451
|
+
stack.add(cls);
|
|
1452
|
+
path.push(cls);
|
|
1453
|
+
for (const dep of classToAfter.get(cls) ?? []) {
|
|
1454
|
+
visit(dep, path);
|
|
1455
|
+
}
|
|
1456
|
+
path.pop();
|
|
1457
|
+
stack.delete(cls);
|
|
1458
|
+
visited.add(cls);
|
|
1459
|
+
}
|
|
1460
|
+
for (const cls of classToAfter.keys()) {
|
|
1461
|
+
visit(cls, []);
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
function resolveHookDAG(hooks, invert = false) {
|
|
1465
|
+
if (hooks.length === 0) return [];
|
|
1466
|
+
const classToHooks = /* @__PURE__ */ new Map();
|
|
1467
|
+
const anonymous = [];
|
|
1468
|
+
for (const h of hooks) {
|
|
1469
|
+
if (h.class) {
|
|
1470
|
+
const list = classToHooks.get(h.class);
|
|
1471
|
+
if (list) list.push(h);
|
|
1472
|
+
else classToHooks.set(h.class, [h]);
|
|
1473
|
+
} else {
|
|
1474
|
+
anonymous.push(h);
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
const classes = [...classToHooks.keys()];
|
|
1478
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
1479
|
+
const graph = /* @__PURE__ */ new Map();
|
|
1480
|
+
for (const cls of classes) {
|
|
1481
|
+
inDegree.set(cls, 0);
|
|
1482
|
+
graph.set(cls, []);
|
|
1483
|
+
}
|
|
1484
|
+
for (const h of hooks) {
|
|
1485
|
+
if (!h.class) continue;
|
|
1486
|
+
for (const dep of h.after) {
|
|
1487
|
+
const [from, to] = invert ? [h.class, dep] : [dep, h.class];
|
|
1488
|
+
const edges = graph.get(from);
|
|
1489
|
+
if (!edges.includes(to)) {
|
|
1490
|
+
edges.push(to);
|
|
1491
|
+
inDegree.set(to, inDegree.get(to) + 1);
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
const layers = [];
|
|
1496
|
+
let queue = classes.filter((c) => inDegree.get(c) === 0);
|
|
1497
|
+
while (queue.length > 0) {
|
|
1498
|
+
const layer = [];
|
|
1499
|
+
const next = [];
|
|
1500
|
+
for (const cls of queue) {
|
|
1501
|
+
layer.push(...classToHooks.get(cls) ?? []);
|
|
1502
|
+
}
|
|
1503
|
+
layers.push(layer);
|
|
1504
|
+
for (const cls of queue) {
|
|
1505
|
+
for (const neighbor of graph.get(cls) ?? []) {
|
|
1506
|
+
const d = inDegree.get(neighbor) - 1;
|
|
1507
|
+
inDegree.set(neighbor, d);
|
|
1508
|
+
if (d === 0) next.push(neighbor);
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1511
|
+
queue = next;
|
|
1512
|
+
}
|
|
1513
|
+
if (anonymous.length > 0) {
|
|
1514
|
+
const anonWithDeps = anonymous.filter((h) => h.after.length > 0);
|
|
1515
|
+
const anonWithoutDeps = anonymous.filter((h) => h.after.length === 0);
|
|
1516
|
+
if (anonWithDeps.length > 0) {
|
|
1517
|
+
let maxLayer = -1;
|
|
1518
|
+
for (const h of anonWithDeps) {
|
|
1519
|
+
for (const dep of h.after) {
|
|
1520
|
+
const depLayer = layers.findIndex((l) => l.some((r) => r.class === dep));
|
|
1521
|
+
if (depLayer > maxLayer) maxLayer = depLayer;
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
const insertAt = maxLayer + 1;
|
|
1525
|
+
if (insertAt < layers.length) {
|
|
1526
|
+
layers[insertAt].push(...anonWithDeps);
|
|
1527
|
+
} else {
|
|
1528
|
+
layers.push(anonWithDeps);
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
if (anonWithoutDeps.length > 0) {
|
|
1532
|
+
if (layers.length > 0) {
|
|
1533
|
+
layers[layers.length - 1].push(...anonWithoutDeps);
|
|
1534
|
+
} else {
|
|
1535
|
+
layers.push(anonWithoutDeps);
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
return layers;
|
|
1540
|
+
}
|
|
1541
|
+
async function runHooks(hooks, onError = (error) => {
|
|
1542
|
+
throw error;
|
|
1543
|
+
}, invert = false) {
|
|
1544
|
+
const layers = resolveHookDAG(hooks, invert);
|
|
1545
|
+
for (const layer of layers)
|
|
1546
|
+
await Promise.all(
|
|
1547
|
+
layer.map(async (h) => {
|
|
1548
|
+
try {
|
|
1549
|
+
if (typeof h.cb === "function") return await h.cb();
|
|
1550
|
+
return await h.cb;
|
|
1551
|
+
} catch (error) {
|
|
1552
|
+
return onError(error instanceof Error ? error : new Error(`${error}`));
|
|
1553
|
+
}
|
|
1554
|
+
})
|
|
1555
|
+
);
|
|
1556
|
+
}
|
|
1557
|
+
if (void 0) {
|
|
1558
|
+
const { describe, test, expect } = void 0;
|
|
1559
|
+
class A {
|
|
1560
|
+
}
|
|
1561
|
+
class B {
|
|
1562
|
+
}
|
|
1563
|
+
class C {
|
|
1564
|
+
}
|
|
1565
|
+
class D {
|
|
1566
|
+
}
|
|
1567
|
+
const noop = () => {
|
|
1568
|
+
};
|
|
1569
|
+
describe("registerHook", () => {
|
|
1570
|
+
test("registers a hook with no dependencies", () => {
|
|
1571
|
+
const hooks = [];
|
|
1572
|
+
registerHook(hooks, { cb: noop, class: A, after: [] });
|
|
1573
|
+
expect(hooks).toHaveLength(1);
|
|
1574
|
+
});
|
|
1575
|
+
test("throws on missing dependency", () => {
|
|
1576
|
+
const hooks = [];
|
|
1577
|
+
expect(() => registerHook(hooks, { cb: noop, class: B, after: [A] })).toThrow(/Missing dependency.*B.*A/);
|
|
1578
|
+
});
|
|
1579
|
+
test("throws on cycle: A\u2192B\u2192A", () => {
|
|
1580
|
+
const hooks = [];
|
|
1581
|
+
registerHook(hooks, { cb: noop, class: A, after: [] });
|
|
1582
|
+
registerHook(hooks, { cb: noop, class: B, after: [A] });
|
|
1583
|
+
expect(() => registerHook(hooks, { cb: noop, class: A, after: [B] })).toThrow(/Cycle detected/);
|
|
1584
|
+
});
|
|
1585
|
+
test("throws on transitive cycle: A\u2192B\u2192C\u2192A", () => {
|
|
1586
|
+
const hooks = [];
|
|
1587
|
+
registerHook(hooks, { cb: noop, class: A, after: [] });
|
|
1588
|
+
registerHook(hooks, { cb: noop, class: B, after: [A] });
|
|
1589
|
+
registerHook(hooks, { cb: noop, class: C, after: [B] });
|
|
1590
|
+
expect(() => registerHook(hooks, { cb: noop, class: A, after: [C] })).toThrow(/Cycle detected/);
|
|
1591
|
+
});
|
|
1592
|
+
test("allows anonymous hooks with dependencies", () => {
|
|
1593
|
+
const hooks = [];
|
|
1594
|
+
registerHook(hooks, { cb: noop, class: A, after: [] });
|
|
1595
|
+
registerHook(hooks, { cb: noop, after: [A] });
|
|
1596
|
+
expect(hooks).toHaveLength(2);
|
|
1597
|
+
});
|
|
1598
|
+
test("anonymous hook throws on missing dependency", () => {
|
|
1599
|
+
const hooks = [];
|
|
1600
|
+
expect(() => registerHook(hooks, { cb: noop, after: [A] })).toThrow(/Missing dependency.*anonymous.*A/);
|
|
1601
|
+
});
|
|
1602
|
+
});
|
|
1603
|
+
describe("resolveHookDAG", () => {
|
|
1604
|
+
test("linear chain: A \u2192 B \u2192 C", () => {
|
|
1605
|
+
const hooks = [
|
|
1606
|
+
{ cb: noop, class: A, after: [] },
|
|
1607
|
+
{ cb: noop, class: B, after: [A] },
|
|
1608
|
+
{ cb: noop, class: C, after: [B] }
|
|
1609
|
+
];
|
|
1610
|
+
const layers = resolveHookDAG(hooks);
|
|
1611
|
+
expect(layers).toHaveLength(3);
|
|
1612
|
+
expect(layers[0].every((h) => h.class === A)).toBe(true);
|
|
1613
|
+
expect(layers[1].every((h) => h.class === B)).toBe(true);
|
|
1614
|
+
expect(layers[2].every((h) => h.class === C)).toBe(true);
|
|
1615
|
+
});
|
|
1616
|
+
test("fan-out: A \u2192 B, A \u2192 C (B and C are parallel)", () => {
|
|
1617
|
+
const hooks = [
|
|
1618
|
+
{ cb: noop, class: A, after: [] },
|
|
1619
|
+
{ cb: noop, class: B, after: [A] },
|
|
1620
|
+
{ cb: noop, class: C, after: [A] }
|
|
1621
|
+
];
|
|
1622
|
+
const layers = resolveHookDAG(hooks);
|
|
1623
|
+
expect(layers).toHaveLength(2);
|
|
1624
|
+
expect(layers[0].every((h) => h.class === A)).toBe(true);
|
|
1625
|
+
const secondClasses = layers[1].map((h) => h.class);
|
|
1626
|
+
expect(secondClasses).toContain(B);
|
|
1627
|
+
expect(secondClasses).toContain(C);
|
|
1628
|
+
});
|
|
1629
|
+
test("fan-in: B \u2192 D, C \u2192 D", () => {
|
|
1630
|
+
const hooks = [
|
|
1631
|
+
{ cb: noop, class: B, after: [] },
|
|
1632
|
+
{ cb: noop, class: C, after: [] },
|
|
1633
|
+
{ cb: noop, class: D, after: [B, C] }
|
|
1634
|
+
];
|
|
1635
|
+
const layers = resolveHookDAG(hooks);
|
|
1636
|
+
expect(layers).toHaveLength(2);
|
|
1637
|
+
const firstClasses = layers[0].map((h) => h.class);
|
|
1638
|
+
expect(firstClasses).toContain(B);
|
|
1639
|
+
expect(firstClasses).toContain(C);
|
|
1640
|
+
expect(layers[1].every((h) => h.class === D)).toBe(true);
|
|
1641
|
+
});
|
|
1642
|
+
test("diamond: A \u2192 B, A \u2192 C, B \u2192 D, C \u2192 D", () => {
|
|
1643
|
+
const hooks = [
|
|
1644
|
+
{ cb: noop, class: A, after: [] },
|
|
1645
|
+
{ cb: noop, class: B, after: [A] },
|
|
1646
|
+
{ cb: noop, class: C, after: [A] },
|
|
1647
|
+
{ cb: noop, class: D, after: [B, C] }
|
|
1648
|
+
];
|
|
1649
|
+
const layers = resolveHookDAG(hooks);
|
|
1650
|
+
expect(layers).toHaveLength(3);
|
|
1651
|
+
expect(layers[0][0].class).toBe(A);
|
|
1652
|
+
const midClasses = layers[1].map((h) => h.class);
|
|
1653
|
+
expect(midClasses).toContain(B);
|
|
1654
|
+
expect(midClasses).toContain(C);
|
|
1655
|
+
expect(layers[2][0].class).toBe(D);
|
|
1656
|
+
});
|
|
1657
|
+
test("close-event inversion reverses the graph", () => {
|
|
1658
|
+
const hooks = [
|
|
1659
|
+
{ cb: noop, class: A, after: [] },
|
|
1660
|
+
{ cb: noop, class: B, after: [A] },
|
|
1661
|
+
{ cb: noop, class: C, after: [B] }
|
|
1662
|
+
];
|
|
1663
|
+
const layers = resolveHookDAG(hooks, true);
|
|
1664
|
+
expect(layers).toHaveLength(3);
|
|
1665
|
+
expect(layers[0].every((h) => h.class === C)).toBe(true);
|
|
1666
|
+
expect(layers[1].every((h) => h.class === B)).toBe(true);
|
|
1667
|
+
expect(layers[2].every((h) => h.class === A)).toBe(true);
|
|
1668
|
+
});
|
|
1669
|
+
test("close inversion: fan-out becomes fan-in", () => {
|
|
1670
|
+
const hooks = [
|
|
1671
|
+
{ cb: noop, class: A, after: [] },
|
|
1672
|
+
{ cb: noop, class: B, after: [A] },
|
|
1673
|
+
{ cb: noop, class: C, after: [A] }
|
|
1674
|
+
];
|
|
1675
|
+
const layers = resolveHookDAG(hooks, true);
|
|
1676
|
+
expect(layers).toHaveLength(2);
|
|
1677
|
+
const firstClasses = layers[0].map((h) => h.class);
|
|
1678
|
+
expect(firstClasses).toContain(B);
|
|
1679
|
+
expect(firstClasses).toContain(C);
|
|
1680
|
+
expect(layers[1].every((h) => h.class === A)).toBe(true);
|
|
1681
|
+
});
|
|
1682
|
+
test("multiple hooks per class are all in the same layer", () => {
|
|
1683
|
+
const cb1 = () => {
|
|
1684
|
+
};
|
|
1685
|
+
const cb2 = () => {
|
|
1686
|
+
};
|
|
1687
|
+
const hooks = [
|
|
1688
|
+
{ cb: cb1, class: A, after: [] },
|
|
1689
|
+
{ cb: cb2, class: A, after: [] },
|
|
1690
|
+
{ cb: noop, class: B, after: [A] }
|
|
1691
|
+
];
|
|
1692
|
+
const layers = resolveHookDAG(hooks);
|
|
1693
|
+
expect(layers).toHaveLength(2);
|
|
1694
|
+
expect(layers[0]).toHaveLength(2);
|
|
1695
|
+
expect(layers[0].every((h) => h.class === A)).toBe(true);
|
|
1696
|
+
});
|
|
1697
|
+
test("anonymous hooks without deps run at deepest level", () => {
|
|
1698
|
+
const hooks = [
|
|
1699
|
+
{ cb: noop, class: A, after: [] },
|
|
1700
|
+
{ cb: noop, class: B, after: [A] },
|
|
1701
|
+
{ cb: noop, after: [] }
|
|
1702
|
+
];
|
|
1703
|
+
const layers = resolveHookDAG(hooks);
|
|
1704
|
+
expect(layers).toHaveLength(2);
|
|
1705
|
+
const lastLayer = layers[layers.length - 1];
|
|
1706
|
+
expect(lastLayer.some((h) => h.class === void 0)).toBe(true);
|
|
1707
|
+
});
|
|
1708
|
+
test("anonymous hooks with deps run after their dependencies", () => {
|
|
1709
|
+
const hooks = [
|
|
1710
|
+
{ cb: noop, class: A, after: [] },
|
|
1711
|
+
{ cb: noop, class: B, after: [A] },
|
|
1712
|
+
{ cb: noop, class: C, after: [B] },
|
|
1713
|
+
{ cb: noop, after: [A] }
|
|
1714
|
+
];
|
|
1715
|
+
const layers = resolveHookDAG(hooks);
|
|
1716
|
+
const anonLayer = layers.findIndex((l) => l.some((h) => h.class === void 0));
|
|
1717
|
+
const aLayer = layers.findIndex((l) => l.some((h) => h.class === A));
|
|
1718
|
+
expect(anonLayer).toBeGreaterThan(aLayer);
|
|
1719
|
+
});
|
|
1720
|
+
test("empty hooks returns empty layers", () => {
|
|
1721
|
+
expect(resolveHookDAG([])).toEqual([]);
|
|
1722
|
+
});
|
|
1723
|
+
});
|
|
1724
|
+
describe("runHooks", () => {
|
|
1725
|
+
test("same-depth siblings observably overlap", async () => {
|
|
1726
|
+
const log = [];
|
|
1727
|
+
const hooks = [
|
|
1728
|
+
{
|
|
1729
|
+
cb: async () => {
|
|
1730
|
+
log.push("B-start");
|
|
1731
|
+
await new Promise((r) => setTimeout(r, 20));
|
|
1732
|
+
log.push("B-end");
|
|
1733
|
+
},
|
|
1734
|
+
class: B,
|
|
1735
|
+
after: []
|
|
1736
|
+
},
|
|
1737
|
+
{
|
|
1738
|
+
cb: async () => {
|
|
1739
|
+
log.push("C-start");
|
|
1740
|
+
await new Promise((r) => setTimeout(r, 20));
|
|
1741
|
+
log.push("C-end");
|
|
1742
|
+
},
|
|
1743
|
+
class: C,
|
|
1744
|
+
after: []
|
|
1745
|
+
}
|
|
1746
|
+
];
|
|
1747
|
+
await runHooks(hooks);
|
|
1748
|
+
expect(log[0]).toBe("B-start");
|
|
1749
|
+
expect(log[1]).toBe("C-start");
|
|
1750
|
+
});
|
|
1751
|
+
test("different depths run sequentially", async () => {
|
|
1752
|
+
const log = [];
|
|
1753
|
+
const hooks = [
|
|
1754
|
+
{
|
|
1755
|
+
cb: async () => {
|
|
1756
|
+
log.push("A");
|
|
1757
|
+
},
|
|
1758
|
+
class: A,
|
|
1759
|
+
after: []
|
|
1760
|
+
},
|
|
1761
|
+
{
|
|
1762
|
+
cb: async () => {
|
|
1763
|
+
log.push("B");
|
|
1764
|
+
},
|
|
1765
|
+
class: B,
|
|
1766
|
+
after: [A]
|
|
1767
|
+
}
|
|
1768
|
+
];
|
|
1769
|
+
await runHooks(hooks);
|
|
1770
|
+
expect(log).toEqual(["A", "B"]);
|
|
1771
|
+
});
|
|
1772
|
+
test("close inversion runs hooks in reverse dependency order", async () => {
|
|
1773
|
+
const log = [];
|
|
1774
|
+
const hooks = [
|
|
1775
|
+
{ cb: async () => log.push("A"), class: A, after: [] },
|
|
1776
|
+
{ cb: async () => log.push("B"), class: B, after: [A] },
|
|
1777
|
+
{ cb: async () => log.push("C"), class: C, after: [B] }
|
|
1778
|
+
];
|
|
1779
|
+
await runHooks(hooks, void 0, true);
|
|
1780
|
+
expect(log).toEqual(["C", "B", "A"]);
|
|
1781
|
+
});
|
|
1782
|
+
test("errors are routed to onError handler", async () => {
|
|
1783
|
+
const errors = [];
|
|
1784
|
+
const hooks = [
|
|
1785
|
+
{
|
|
1786
|
+
cb: () => {
|
|
1787
|
+
throw new Error("boom");
|
|
1788
|
+
},
|
|
1789
|
+
class: A,
|
|
1790
|
+
after: []
|
|
1791
|
+
}
|
|
1792
|
+
];
|
|
1793
|
+
await runHooks(hooks, (e) => {
|
|
1794
|
+
errors.push(e);
|
|
1795
|
+
});
|
|
1796
|
+
expect(errors).toHaveLength(1);
|
|
1797
|
+
expect(errors[0].message).toBe("boom");
|
|
1798
|
+
});
|
|
1799
|
+
test("raw promise callbacks are awaited", async () => {
|
|
1800
|
+
const log = [];
|
|
1801
|
+
const hooks = [
|
|
1802
|
+
{
|
|
1803
|
+
cb: Promise.resolve().then(() => log.push("resolved")),
|
|
1804
|
+
class: A,
|
|
1805
|
+
after: []
|
|
1806
|
+
}
|
|
1807
|
+
];
|
|
1808
|
+
await runHooks(hooks);
|
|
1809
|
+
expect(log).toContain("resolved");
|
|
1810
|
+
});
|
|
1811
|
+
});
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
// src/instance/settings.ts
|
|
1815
|
+
import { v as v4 } from "valleyed";
|
|
1816
|
+
var instanceSettingsPipe = () => v4.object({
|
|
1817
|
+
app: v4.object({
|
|
1818
|
+
name: v4.string()
|
|
1819
|
+
}),
|
|
1820
|
+
log: v4.defaults(
|
|
1821
|
+
v4.object({
|
|
1822
|
+
level: v4.defaults(v4.in(["fatal", "error", "warn", "info", "debug", "trace", "silent"]), "info")
|
|
1823
|
+
}),
|
|
1824
|
+
{}
|
|
1825
|
+
),
|
|
1826
|
+
utils: v4.defaults(
|
|
1827
|
+
v4.object({
|
|
1828
|
+
hashSaltRounds: v4.defaults(v4.number(), 10),
|
|
1829
|
+
paginationDefaultLimit: v4.defaults(v4.number(), 100),
|
|
1830
|
+
maxFileUploadSizeInMb: v4.defaults(v4.number(), 500)
|
|
1831
|
+
}),
|
|
1832
|
+
{}
|
|
1833
|
+
)
|
|
1834
|
+
});
|
|
1835
|
+
|
|
1836
|
+
// src/instance/index.ts
|
|
1837
|
+
var Instance = class _Instance {
|
|
1838
|
+
static #id;
|
|
1839
|
+
static #instance;
|
|
1840
|
+
static #hooks = {};
|
|
1841
|
+
settings;
|
|
1842
|
+
log;
|
|
1843
|
+
constructor(settings) {
|
|
1844
|
+
_Instance.#instance = this;
|
|
1845
|
+
this.settings = Object.freeze(settings);
|
|
1846
|
+
this.log = pino({
|
|
1847
|
+
level: this.settings.log.level,
|
|
1848
|
+
serializers: {
|
|
1849
|
+
err: pino.stdSerializers.err,
|
|
1850
|
+
error: pino.stdSerializers.err,
|
|
1851
|
+
req: pino.stdSerializers.req,
|
|
1852
|
+
res: pino.stdSerializers.res
|
|
1853
|
+
},
|
|
1854
|
+
mixin: () => ({
|
|
1855
|
+
instanceId: _Instance.#id
|
|
1856
|
+
})
|
|
1857
|
+
});
|
|
1858
|
+
_Instance.#registerOnExitHandler();
|
|
1859
|
+
}
|
|
1860
|
+
alias(id) {
|
|
1861
|
+
if (_Instance.#id !== void 0) return _Instance.crash(new EquippedError("Instance already has an alias", {}));
|
|
1862
|
+
_Instance.#id = id;
|
|
1863
|
+
}
|
|
1864
|
+
get id() {
|
|
1865
|
+
if (_Instance.#id === void 0) return _Instance.crash(new EquippedError("Instance doesnt have an alias yet", {}));
|
|
1866
|
+
return _Instance.#id;
|
|
1867
|
+
}
|
|
1868
|
+
getScopedName(name, key = ".") {
|
|
1869
|
+
return [this.settings.app.name, name].join(key);
|
|
1870
|
+
}
|
|
1871
|
+
async start() {
|
|
1872
|
+
try {
|
|
1873
|
+
await runHooks(_Instance.#hooks["setup"] ?? []);
|
|
1874
|
+
await runHooks(_Instance.#hooks["start"] ?? []);
|
|
1875
|
+
} catch (error) {
|
|
1876
|
+
_Instance.crash(new EquippedError(`Error starting instance`, {}, error));
|
|
1877
|
+
}
|
|
1878
|
+
}
|
|
1879
|
+
static envs(envsPipe) {
|
|
1880
|
+
const envValidity = v5.validate(envsPipe, process.env);
|
|
1881
|
+
if (!envValidity.valid) {
|
|
1882
|
+
_Instance.crash(
|
|
1883
|
+
new EquippedError(`Environment variables are not valid
|
|
1884
|
+
${envValidity.error.toString()}`, {
|
|
1885
|
+
messages: envValidity.error.messages
|
|
1886
|
+
})
|
|
1887
|
+
);
|
|
1888
|
+
}
|
|
1889
|
+
return envValidity.value;
|
|
1890
|
+
}
|
|
1891
|
+
static create(settings) {
|
|
1892
|
+
if (_Instance.#instance) return _Instance.crash(new EquippedError("Instance has been initialized already", {}));
|
|
1893
|
+
const settingsValidity = v5.validate(instanceSettingsPipe(), settings);
|
|
1894
|
+
if (!settingsValidity.valid) {
|
|
1895
|
+
_Instance.crash(
|
|
1896
|
+
new EquippedError(`Settings are not valid
|
|
1897
|
+
${settingsValidity.error.toString()}`, {
|
|
1898
|
+
messages: settingsValidity.error.messages
|
|
1899
|
+
})
|
|
1900
|
+
);
|
|
1901
|
+
}
|
|
1902
|
+
return new _Instance(settingsValidity.value);
|
|
1903
|
+
}
|
|
1904
|
+
static get() {
|
|
1905
|
+
if (!_Instance.#instance)
|
|
1906
|
+
return _Instance.crash(
|
|
1907
|
+
new EquippedError("Has not been initialized. Make sure an instance has been created before you get an instance", {})
|
|
1908
|
+
);
|
|
1909
|
+
return _Instance.#instance;
|
|
1910
|
+
}
|
|
1911
|
+
static maybeGet() {
|
|
1912
|
+
return _Instance.#instance;
|
|
1913
|
+
}
|
|
1914
|
+
static on(event, cb, options) {
|
|
1915
|
+
_Instance.#hooks[event] ??= [];
|
|
1916
|
+
const record = { cb, class: options?.class, after: options?.after ?? [] };
|
|
1917
|
+
registerHook(_Instance.#hooks[event], record);
|
|
1918
|
+
}
|
|
1919
|
+
static #registerOnExitHandler() {
|
|
1920
|
+
const signals = {
|
|
1921
|
+
SIGHUP: 1,
|
|
1922
|
+
SIGINT: 2,
|
|
1923
|
+
SIGTERM: 15
|
|
1924
|
+
};
|
|
1925
|
+
Object.entries(signals).forEach(([signal, code]) => {
|
|
1926
|
+
process.on(signal, async () => {
|
|
1927
|
+
await runHooks(_Instance.#hooks["close"] ?? [], () => {
|
|
1928
|
+
}, true);
|
|
1929
|
+
process.exit(128 + code);
|
|
1930
|
+
});
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
static resolveBeforeCrash(cb) {
|
|
1934
|
+
const value = cb();
|
|
1935
|
+
_Instance.on("close", async () => await value);
|
|
1936
|
+
return value;
|
|
1937
|
+
}
|
|
1938
|
+
static crash(error) {
|
|
1939
|
+
console.error(error);
|
|
1940
|
+
process.exit(1);
|
|
1941
|
+
}
|
|
1942
|
+
static createId(opts) {
|
|
1943
|
+
return `${opts?.prefix ?? ""}${ulid(opts?.time?.getTime())}`;
|
|
1944
|
+
}
|
|
1945
|
+
};
|
|
1946
|
+
|
|
1947
|
+
// src/validations/valleyed.ts
|
|
1948
|
+
var filePipe = (err) => v6.array(
|
|
1949
|
+
v6.file(err).pipe((input) => {
|
|
1950
|
+
const err2 = `is larger than allowed limit of ${Instance.get().settings.utils.maxFileUploadSizeInMb}mb`;
|
|
1951
|
+
const valid = input ? !input.isTruncated : true;
|
|
1952
|
+
if (valid) return input;
|
|
1953
|
+
throw PipeError2.root(err2, input);
|
|
1954
|
+
})
|
|
1955
|
+
);
|
|
1956
|
+
var incomingFile = (err) => v6.define(
|
|
1957
|
+
v6.compile(
|
|
1958
|
+
filePipe(err).pipe(v6.min(1, "no file provided")).pipe((files) => files[0])
|
|
1959
|
+
),
|
|
1960
|
+
{ schema: () => ({ type: "string", format: "binary" }) }
|
|
1961
|
+
);
|
|
1962
|
+
var incomingFiles = (err) => v6.define(v6.compile(filePipe(err)), {
|
|
1963
|
+
schema: () => ({ type: "string", format: "binary" })
|
|
1964
|
+
});
|
|
1965
|
+
var requestLocalStorage = new AsyncLocalStorage();
|
|
1966
|
+
var responseLocalStorage = new AsyncLocalStorage();
|
|
1967
|
+
var withRequest = (fn) => v6.define((input) => {
|
|
1968
|
+
const req = requestLocalStorage.getStore();
|
|
1969
|
+
if (!req) throw new Error("Request not found in context");
|
|
1970
|
+
const validated = v6.validate(fn(req), input);
|
|
1971
|
+
return validated.valid ? validated.value : validated.error;
|
|
1972
|
+
});
|
|
1973
|
+
var withResponse = (fn) => v6.define((input) => {
|
|
1974
|
+
const res = responseLocalStorage.getStore();
|
|
1975
|
+
if (!res) throw new Error("Response not found in context");
|
|
1976
|
+
const validated = v6.validate(fn(res), input);
|
|
1977
|
+
return validated.valid ? validated.value : validated.error;
|
|
1978
|
+
});
|
|
1979
|
+
|
|
1980
|
+
// src/validations/index.ts
|
|
1981
|
+
import { v as v7 } from "valleyed";
|
|
1982
|
+
function pipeErrorToValidationError(error) {
|
|
1983
|
+
const errorsObject = error.messages.reduce((acc, { path = "", message }) => {
|
|
1984
|
+
if (acc[path]) acc[path].messages.push(message);
|
|
1985
|
+
else acc[path] = { field: path, messages: [message] };
|
|
1986
|
+
return acc;
|
|
1987
|
+
}, {});
|
|
1988
|
+
return new ValidationError(Object.values(errorsObject));
|
|
1989
|
+
}
|
|
1990
|
+
function validate(pipe, value) {
|
|
1991
|
+
const validity = v7.validate(pipe, value);
|
|
1992
|
+
if (validity.valid) return validity.value;
|
|
1993
|
+
throw pipeErrorToValidationError(validity.error);
|
|
1994
|
+
}
|
|
1995
|
+
|
|
1996
|
+
export {
|
|
1997
|
+
EquippedError,
|
|
1998
|
+
RequestError,
|
|
1999
|
+
valleyed_exports,
|
|
2000
|
+
pipeErrorToValidationError,
|
|
2001
|
+
validate,
|
|
2002
|
+
Methods,
|
|
2003
|
+
StatusCodes,
|
|
2004
|
+
makeMiddleware,
|
|
2005
|
+
makeResponseMiddleware,
|
|
2006
|
+
makeErrorMiddleware,
|
|
2007
|
+
Router,
|
|
2008
|
+
authProviders_exports,
|
|
2009
|
+
configurable,
|
|
2010
|
+
hash_exports,
|
|
2011
|
+
parseJSONValue,
|
|
2012
|
+
parseJSONObject,
|
|
2013
|
+
getMediaDuration,
|
|
2014
|
+
random_exports,
|
|
2015
|
+
sleep,
|
|
2016
|
+
retry,
|
|
2017
|
+
Request,
|
|
2018
|
+
Response,
|
|
2019
|
+
BaseRequestAuthMethod,
|
|
2020
|
+
BaseApiKeyRequestAuthMethod,
|
|
2021
|
+
BaseJwtRequestAuthMethod,
|
|
2022
|
+
BaseJwtHeaderRequestAuthMethod,
|
|
2023
|
+
BaseJwtCookieRequestAuthMethod,
|
|
2024
|
+
serverConfigPipe,
|
|
2025
|
+
Server,
|
|
2026
|
+
requireAuthUser,
|
|
2027
|
+
BadRequestError,
|
|
2028
|
+
NotAuthenticatedError,
|
|
2029
|
+
NotAuthorizedError,
|
|
2030
|
+
NotFoundError,
|
|
2031
|
+
TokenExpired,
|
|
2032
|
+
ValidationError,
|
|
2033
|
+
Instance
|
|
2034
|
+
};
|