equipped 5.1.11 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/errors/index.cjs +1 -2
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/errors/types/tokenExpired.cjs +12 -0
- package/dist/cjs/errors/types/tokenExpired.cjs.map +1 -0
- package/dist/cjs/errors/types/{refreshTokenMisusedError.min.cjs → tokenExpired.min.cjs} +2 -2
- package/dist/cjs/errors/types/tokenExpired.min.cjs.map +1 -0
- package/dist/cjs/instance/index.cjs.map +1 -1
- package/dist/cjs/instance/index.min.cjs.map +1 -1
- package/dist/cjs/server/impls/base.cjs +17 -17
- package/dist/cjs/server/impls/base.cjs.map +1 -1
- package/dist/cjs/server/impls/base.min.cjs +1 -1
- package/dist/cjs/server/impls/base.min.cjs.map +1 -1
- package/dist/cjs/server/impls/express.cjs +2 -13
- package/dist/cjs/server/impls/express.cjs.map +1 -1
- package/dist/cjs/server/impls/express.min.cjs +1 -1
- package/dist/cjs/server/impls/express.min.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.cjs +3 -14
- package/dist/cjs/server/impls/fastify.cjs.map +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs +1 -1
- package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +1 -1
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +1 -1
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.cjs +9 -52
- package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +1 -1
- package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +1 -1
- package/dist/cjs/server/pipes.cjs +23 -8
- package/dist/cjs/server/pipes.cjs.map +1 -1
- package/dist/cjs/server/pipes.min.cjs +1 -1
- package/dist/cjs/server/pipes.min.cjs.map +1 -1
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +21 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/base.cjs +20 -0
- package/dist/cjs/server/requests-auth-methods/base.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/base.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +1 -0
- package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.cjs +2 -1
- package/dist/cjs/server/requests-auth-methods/index.cjs.map +1 -0
- package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.min.cjs +1 -1
- package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/jwt.cjs +78 -0
- package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +1 -0
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +2 -0
- package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +1 -0
- package/dist/cjs/server/requests.cjs +1 -9
- package/dist/cjs/server/requests.cjs.map +1 -1
- package/dist/cjs/server/requests.min.cjs +1 -1
- package/dist/cjs/server/requests.min.cjs.map +1 -1
- package/dist/cjs/server/routes.cjs +1 -2
- package/dist/cjs/server/routes.cjs.map +1 -1
- package/dist/cjs/server/routes.min.cjs +1 -1
- package/dist/cjs/server/routes.min.cjs.map +1 -1
- package/dist/cjs/server/sockets.cjs +2 -4
- package/dist/cjs/server/sockets.cjs.map +1 -1
- package/dist/cjs/server/sockets.min.cjs +1 -1
- package/dist/cjs/server/sockets.min.cjs.map +1 -1
- package/dist/cjs/server/types.cjs +1 -1
- package/dist/cjs/server/types.cjs.map +1 -1
- package/dist/cjs/server/types.min.cjs +1 -1
- package/dist/cjs/server/types.min.cjs.map +1 -1
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.min.mjs.map +1 -1
- package/dist/esm/errors/index.mjs +1 -2
- package/dist/esm/errors/index.mjs.map +1 -1
- package/dist/esm/errors/types/tokenExpired.min.mjs +2 -0
- package/dist/esm/errors/types/tokenExpired.min.mjs.map +1 -0
- package/dist/esm/errors/types/tokenExpired.mjs +12 -0
- package/dist/esm/errors/types/tokenExpired.mjs.map +1 -0
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.min.mjs.map +1 -1
- package/dist/esm/instance/index.mjs.map +1 -1
- package/dist/esm/server/impls/base.min.mjs +1 -1
- package/dist/esm/server/impls/base.min.mjs.map +1 -1
- package/dist/esm/server/impls/base.mjs +9 -9
- package/dist/esm/server/impls/base.mjs.map +1 -1
- package/dist/esm/server/impls/express.min.mjs +1 -1
- package/dist/esm/server/impls/express.min.mjs.map +1 -1
- package/dist/esm/server/impls/express.mjs +2 -13
- package/dist/esm/server/impls/express.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.min.mjs +1 -1
- package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
- package/dist/esm/server/impls/fastify.mjs +2 -13
- package/dist/esm/server/impls/fastify.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.min.mjs.map +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/server/index.mjs.map +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +1 -1
- package/dist/esm/server/middlewares/requireAuthUser.mjs +9 -52
- package/dist/esm/server/middlewares/requireAuthUser.mjs.map +1 -1
- package/dist/esm/server/pipes.min.mjs +1 -1
- package/dist/esm/server/pipes.min.mjs.map +1 -1
- package/dist/esm/server/pipes.mjs +23 -8
- package/dist/esm/server/pipes.mjs.map +1 -1
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs +21 -0
- package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/base.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/base.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/base.mjs +20 -0
- package/dist/esm/server/requests-auth-methods/base.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/index.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/index.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/index.mjs +4 -0
- package/dist/esm/server/requests-auth-methods/index.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs +2 -0
- package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +1 -0
- package/dist/esm/server/requests-auth-methods/jwt.mjs +78 -0
- package/dist/esm/server/requests-auth-methods/jwt.mjs.map +1 -0
- package/dist/esm/server/requests.min.mjs +1 -1
- package/dist/esm/server/requests.min.mjs.map +1 -1
- package/dist/esm/server/requests.mjs +1 -9
- package/dist/esm/server/requests.mjs.map +1 -1
- package/dist/esm/server/routes.min.mjs +1 -1
- package/dist/esm/server/routes.min.mjs.map +1 -1
- package/dist/esm/server/routes.mjs +1 -2
- package/dist/esm/server/routes.mjs.map +1 -1
- package/dist/esm/server/sockets.min.mjs +1 -1
- package/dist/esm/server/sockets.min.mjs.map +1 -1
- package/dist/esm/server/sockets.mjs +2 -4
- package/dist/esm/server/sockets.mjs.map +1 -1
- package/dist/esm/server/types.min.mjs +1 -1
- package/dist/esm/server/types.min.mjs.map +1 -1
- package/dist/esm/server/types.mjs +1 -1
- package/dist/esm/server/types.mjs.map +1 -1
- package/dist/types/cache/index.d.ts +7 -1
- package/dist/types/errors/index.d.ts +7 -12
- package/dist/types/errors/index.js +1 -2
- package/dist/types/errors/types/tokenExpired.js +11 -0
- package/dist/types/{fastify-CDJ2WuLy.d.ts → fastify-B6FUtYe9.d.ts} +5 -4
- package/dist/types/index.d.ts +4 -4
- package/dist/types/instance/index.d.ts +63 -16
- package/dist/types/{requestError-DqkM5BfW.d.ts → requestError-7N-ngghg.d.ts} +97 -80
- package/dist/types/server/impls/base.js +9 -9
- package/dist/types/server/impls/express.js +2 -13
- package/dist/types/server/impls/fastify.js +2 -13
- package/dist/types/server/index.d.ts +62 -20
- package/dist/types/server/index.js +1 -1
- package/dist/types/server/middlewares/requireAuthUser.js +9 -52
- package/dist/types/server/pipes.js +23 -8
- package/dist/types/server/requests-auth-methods/apiKeys.js +20 -0
- package/dist/types/server/requests-auth-methods/base.js +19 -0
- package/dist/types/server/requests-auth-methods/index.js +3 -0
- package/dist/types/server/requests-auth-methods/jwt.js +77 -0
- package/dist/types/server/requests.js +1 -9
- package/dist/types/server/routes.js +1 -2
- package/dist/types/server/sockets.js +2 -4
- package/dist/types/server/types.js +1 -1
- package/dist/types/{validationError-BMKfV51p.d.ts → validationError-BB4cfdZa.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +3 -9
- package/package.json +13 -12
- package/dist/cjs/errors/types/authorizationExpired.cjs +0 -12
- package/dist/cjs/errors/types/authorizationExpired.cjs.map +0 -1
- package/dist/cjs/errors/types/authorizationExpired.min.cjs +0 -2
- package/dist/cjs/errors/types/authorizationExpired.min.cjs.map +0 -1
- package/dist/cjs/errors/types/refreshTokenMisusedError.cjs +0 -12
- package/dist/cjs/errors/types/refreshTokenMisusedError.cjs.map +0 -1
- package/dist/cjs/errors/types/refreshTokenMisusedError.min.cjs.map +0 -1
- package/dist/cjs/server/middlewares/parseAuthUser.cjs +0 -21
- package/dist/cjs/server/middlewares/parseAuthUser.cjs.map +0 -1
- package/dist/cjs/server/middlewares/parseAuthUser.min.cjs +0 -2
- package/dist/cjs/server/middlewares/parseAuthUser.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/apiKeys.cjs +0 -6
- package/dist/cjs/server/requests-auth/apiKeys.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/apiKeys.min.cjs +0 -2
- package/dist/cjs/server/requests-auth/apiKeys.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/index.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/index.min.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/tokens.cjs +0 -92
- package/dist/cjs/server/requests-auth/tokens.cjs.map +0 -1
- package/dist/cjs/server/requests-auth/tokens.min.cjs +0 -2
- package/dist/cjs/server/requests-auth/tokens.min.cjs.map +0 -1
- package/dist/esm/errors/types/authorizationExpired.min.mjs +0 -2
- package/dist/esm/errors/types/authorizationExpired.min.mjs.map +0 -1
- package/dist/esm/errors/types/authorizationExpired.mjs +0 -12
- package/dist/esm/errors/types/authorizationExpired.mjs.map +0 -1
- package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs +0 -2
- package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs.map +0 -1
- package/dist/esm/errors/types/refreshTokenMisusedError.mjs +0 -12
- package/dist/esm/errors/types/refreshTokenMisusedError.mjs.map +0 -1
- package/dist/esm/server/middlewares/parseAuthUser.min.mjs +0 -2
- package/dist/esm/server/middlewares/parseAuthUser.min.mjs.map +0 -1
- package/dist/esm/server/middlewares/parseAuthUser.mjs +0 -21
- package/dist/esm/server/middlewares/parseAuthUser.mjs.map +0 -1
- package/dist/esm/server/requests-auth/apiKeys.min.mjs +0 -2
- package/dist/esm/server/requests-auth/apiKeys.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/apiKeys.mjs +0 -6
- package/dist/esm/server/requests-auth/apiKeys.mjs.map +0 -1
- package/dist/esm/server/requests-auth/index.min.mjs +0 -2
- package/dist/esm/server/requests-auth/index.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/index.mjs +0 -3
- package/dist/esm/server/requests-auth/index.mjs.map +0 -1
- package/dist/esm/server/requests-auth/tokens.min.mjs +0 -2
- package/dist/esm/server/requests-auth/tokens.min.mjs.map +0 -1
- package/dist/esm/server/requests-auth/tokens.mjs +0 -92
- package/dist/esm/server/requests-auth/tokens.mjs.map +0 -1
- package/dist/types/base-8yVXb67P.d.ts +0 -8
- package/dist/types/errors/types/authorizationExpired.js +0 -11
- package/dist/types/errors/types/refreshTokenMisusedError.js +0 -11
- package/dist/types/server/middlewares/parseAuthUser.js +0 -20
- package/dist/types/server/requests-auth/apiKeys.js +0 -5
- package/dist/types/server/requests-auth/index.js +0 -2
- package/dist/types/server/requests-auth/tokens.js +0 -91
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [5.2.0](https://github.com/kevinand11/equipped/compare/v5.1.11...v5.2.0) (2026-02-03)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* auth methods support registering route security ([49ae6de](https://github.com/kevinand11/equipped/commit/49ae6de0a73c5e9ae112d1c26e938e68041195c6))
|
|
11
|
+
* impl cookie request auth ([996e6ce](https://github.com/kevinand11/equipped/commit/996e6ce34943749a3ebc900a38c70119c5f0670e))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* cors behavior ([c48a35a](https://github.com/kevinand11/equipped/commit/c48a35ac61d59c3274a484cc7758cc561e303a95))
|
|
17
|
+
* remove unused context from request object and schema ([cf771a0](https://github.com/kevinand11/equipped/commit/cf771a0521ba98b54bbd2aec3b6a203ffd362c56))
|
|
18
|
+
* types of instance.createX ([b8589e7](https://github.com/kevinand11/equipped/commit/b8589e76dcdb31f7536777f3c1042c42a9265ea2))
|
|
19
|
+
* validate response cookie value not whole cookie object ([289496a](https://github.com/kevinand11/equipped/commit/289496a8192aa3f4f05fc500561131fd269e5698))
|
|
20
|
+
|
|
5
21
|
### [5.1.11](https://github.com/kevinand11/equipped/compare/v5.1.10...v5.1.11) (2026-01-25)
|
|
6
22
|
|
|
7
23
|
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrorcjs = require('./equippedError.cjs'); _createStarExport(_equippedErrorcjs);
|
|
2
2
|
var _requestErrorcjs = require('./requestError.cjs'); _createStarExport(_requestErrorcjs);
|
|
3
|
-
var _authorizationExpiredcjs = require('./types/authorizationExpired.cjs'); _createStarExport(_authorizationExpiredcjs);
|
|
4
3
|
var _badRequestErrorcjs = require('./types/badRequestError.cjs'); _createStarExport(_badRequestErrorcjs);
|
|
5
4
|
var _notAuthenticatedErrorcjs = require('./types/notAuthenticatedError.cjs'); _createStarExport(_notAuthenticatedErrorcjs);
|
|
6
5
|
var _notAuthorizedErrorcjs = require('./types/notAuthorizedError.cjs'); _createStarExport(_notAuthorizedErrorcjs);
|
|
7
6
|
var _notFoundErrorcjs = require('./types/notFoundError.cjs'); _createStarExport(_notFoundErrorcjs);
|
|
8
|
-
var
|
|
7
|
+
var _tokenExpiredcjs = require('./types/tokenExpired.cjs'); _createStarExport(_tokenExpiredcjs);
|
|
9
8
|
var _validationErrorcjs = require('./types/validationError.cjs'); _createStarExport(_validationErrorcjs);
|
|
10
9
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,8bAAc;AACd,0FAAc;AACd,
|
|
1
|
+
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,8bAAc;AACd,0FAAc;AACd,yGAAc;AACd,2HAAc;AACd,kHAAc;AACd,mGAAc;AACd,gGAAc;AACd,yGAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/index.cjs","sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrormincjs = require('./equippedError.min.cjs'); _createStarExport(_equippedErrormincjs);var _requestErrormincjs = require('./requestError.min.cjs'); _createStarExport(_requestErrormincjs);var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _equippedErrormincjs = require('./equippedError.min.cjs'); _createStarExport(_equippedErrormincjs);var _requestErrormincjs = require('./requestError.min.cjs'); _createStarExport(_requestErrormincjs);var _badRequestErrormincjs = require('./types/badRequestError.min.cjs'); _createStarExport(_badRequestErrormincjs);var _notAuthenticatedErrormincjs = require('./types/notAuthenticatedError.min.cjs'); _createStarExport(_notAuthenticatedErrormincjs);var _notAuthorizedErrormincjs = require('./types/notAuthorizedError.min.cjs'); _createStarExport(_notAuthorizedErrormincjs);var _notFoundErrormincjs = require('./types/notFoundError.min.cjs'); _createStarExport(_notFoundErrormincjs);var _tokenExpiredmincjs = require('./types/tokenExpired.min.cjs'); _createStarExport(_tokenExpiredmincjs);var _validationErrormincjs = require('./types/validationError.min.cjs'); _createStarExport(_validationErrormincjs);
|
|
2
2
|
//# sourceMappingURL=index.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,wcACA,oGACc,
|
|
1
|
+
{"version":3,"sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,wcACA,oGACc,mHACA,qIACA,4HAEd,6GACc,0GAAA,mHAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/index.min.cjs","sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexcjs = require('../../server/index.cjs');
|
|
2
|
+
var _requestErrorcjs = require('../requestError.cjs');
|
|
3
|
+
class TokenExpired extends _requestErrorcjs.RequestError {
|
|
4
|
+
__init() {this.statusCode = _indexcjs.StatusCodes.TokenExpired}
|
|
5
|
+
constructor(message = "Token expired", cause) {
|
|
6
|
+
super(message, [{ message }], cause);TokenExpired.prototype.__init.call(this);;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.TokenExpired = TokenExpired;
|
|
12
|
+
//# sourceMappingURL=tokenExpired.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts","/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.cjs"],"names":[],"mappings":"AAAA,2HAA4B;AAC5B,sDAA6B;AAEtB,MAAM,aAAA,QAAqB,8BAAa;AAAA,iBAC9C,WAAA,EAAa,qBAAA,CAAY,aAAA;AAAA,EAEzB,WAAA,CAAY,QAAA,EAAU,eAAA,EAAiB,KAAA,EAAiB;AACvD,IAAA,KAAA,CAAM,OAAA,EAAS,CAAC,EAAE,QAAQ,CAAC,CAAA,EAAG,KAAK,2CAAA;AAAA,EACpC;AACD;ACDA;AACE;AACF,oCAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.cjs","sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexmincjs = require('../../server/index.min.cjs');var _requestErrormincjs = require('../requestError.min.cjs');class d extends _requestErrormincjs.RequestError{__init() {this.statusCode=_indexmincjs.StatusCodes.
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexmincjs = require('../../server/index.min.cjs');var _requestErrormincjs = require('../requestError.min.cjs');class d extends _requestErrormincjs.RequestError{__init() {this.statusCode=_indexmincjs.StatusCodes.TokenExpired}constructor(o="Token expired",r){super(o,[{message:o}],r);d.prototype.__init.call(this);}}exports.TokenExpired = d;
|
|
2
|
+
//# sourceMappingURL=tokenExpired.min.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts"],"names":["StatusCodes","cause"],"mappings":"AAAA,kIACS,6DAGR,MAAaA,EAAY,QAAA,gCAAA,gBAAA,UAEzB,CAAA,wBAAA,CAAA,aAAsB,WACrB,CAAA,CAAA,CAAA,eAA2B,CAAA,CAAGC,CAAK,CACpC,KACD,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gCAAA,CAAA,CAAA,yBAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/errors/types/tokenExpired.min.cjs","sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts","/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs"],"names":[],"mappings":"AAAA,y1BAAkC;AAClC,4BAAqB;AACrB,oCAAyE;AAEzE,+CAA8B;AAC9B,uCAAuE;AACvE;AACC;AAEA;AAEA;AAEA;AACA;AAEA;AAAA,6CAIM;AAEA,MAAM,SAAS;AAAA,EACrB,OAAO,CAAA,EAAA;AAAA,EACP,OAAO,CAAA,QAAA;AAAA,EACP,OAAO,CAAA,MAAA,EAAmD,CAAC,CAAA;AAAA,EAClD;AAAA,EACA;AAAA,EAED,WAAA,CAAY,QAAA,EAAoB;AACvC,IAAA,QAAA,CAAS,CAAA,SAAA,EAAY,IAAA;AACrB,IAAA,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,EAAM,4BAAA;AAAY,MACtB,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA;AAAA,MACzB,WAAA,EAAa;AAAA,QACZ,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QACzB,KAAA,EAAO,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QAC3B,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe,GAAA;AAAA,QACzB,GAAA,EAAK,cAAA,CAAK,cAAA,CAAe;AAAA,MAC1B,CAAA;AAAA,MACA,KAAA,EAAO,CAAA,EAAA,GAAA,CAAO;AAAA,QACb,UAAA,EAAY,QAAA,CAAS,CAAA;AAAA,MACtB,CAAA;AAAA,IACD,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACjC;AAAA,EAEA,KAAA,CAAM,EAAA,EAAY;AACjB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,GAAA,IAAQ,KAAA,CAAA,EAAW,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,4BAAA,CAAc,+BAAA,EAAiC,CAAC,CAAC,CAAC,CAAA;AAC5G,IAAA,QAAA,CAAS,CAAA,GAAA,EAAM,EAAA;AAAA,EAChB;AAAA,EAEA,IAAI,EAAA,CAAA,EAAK;AACR,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,GAAA,IAAQ,KAAA,CAAA,EAAW,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,4BAAA,CAAc,mCAAA,EAAqC,CAAC,CAAC,CAAC,CAAA;AAChH,IAAA,OAAO,QAAA,CAAS,CAAA,EAAA;AAAA,EACjB;AAAA,EAEA,aAAA,CAAc,IAAA,EAAc,IAAA,EAAM,GAAA,EAAK;AACtC,IAAA,OAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC/C;AAAA,EAEA,WAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts","/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.cjs","sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n",null]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/instance/index.ts"],"names":["#hooks","Instance","#instance","settings","pino","id","#id","EquippedError","input","v","cachePipe","jobsPipe","dbPipe","serverTypePipe","runHooks","error","envValidity"],"mappings":"AAAA,y1BAAkC,4BACb,oCACoD,sDAGlB,8CAItD,oDAgBOA,MACE,CAAA,CAAA,MACA,CAAA,CAAA,CAAA,MAED,CAAA,CAAA,CAAA,MAAgC,CACvCC,CAAAA,oBAASC,CAAAA,CAAAA,CAAY,WACL,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOC,IAC9B,CAAA,IAAK,CAAA,QACJ,CAAA,MAAO,CAAK,MAAA,CAAA,CAAA,CAAS,CAAA,IAAI,CAAA,GAAA,CACzB,4BAAA,CAAA,KAAA,CAAA,IACC,CAAA,QAAU,CAAA,GAAA,CAAA,KAAA,CAAA,WACHC,CAAAA,CAAK,GAAA,CAAA,cAAA,CAAA,cACZ,CAAA,GAAKA,CAAK,KAAA,CAAA,cAAA,CAAA,cACV,CAAKA,GAAK,CAAA,GAAA,CAAA,cAAA,CAAA,cAEX,CAAA,GAAO,CAAA,GAAA,CAAO,cACb,CAAA,cACD,CAAA,GACA,CACDH,CAAAA,KACD,CAEA,CAAA,CAAA,EAAA,CAAA,CAAMI,UACQC,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOL,KAAS,CAAA,CAAA,CAAM,CAAA,EAAA,CAAIM,CAAAA,CAAc,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,OAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAiC,CAAC,+BAK7FD,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkBL,CAAAA,CAAS,CAAA,IAAA,EAAM,CAAA,CAAA,CAAIM,OAAc,CAAA,CAAA,CAAA,CAAA,GAAA,KAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,IAAA,+BAAA,CAAA,mCAIlC,CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,aAAc,CAAA,CAAI,CAAA,CAAA,CAAA,GAAU,CAAA,CAAE,MAAQ,CAC/C,IAEA,CAAA,
|
|
1
|
+
{"version":3,"sources":["../../../src/instance/index.ts"],"names":["#hooks","Instance","#instance","settings","pino","id","#id","EquippedError","input","v","cachePipe","jobsPipe","dbPipe","serverTypePipe","runHooks","error","envValidity"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.min.cjs","sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('cors');
|
|
2
|
+
var _socketio = require('socket.io');
|
|
2
3
|
var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);
|
|
3
4
|
var _valleyed = require('valleyed');
|
|
4
5
|
var _indexcjs = require('../../errors/index.cjs');
|
|
5
6
|
var _indexcjs3 = require('../../instance/index.cjs');
|
|
6
7
|
var _indexcjs5 = require('../../validations/index.cjs');
|
|
7
8
|
var _valleyedcjs = require('../../validations/valleyed.cjs');
|
|
8
|
-
var _parseAuthUsercjs = require('../middlewares/parseAuthUser.cjs');
|
|
9
9
|
var _openapicjs = require('../openapi.cjs');
|
|
10
10
|
var _requestscjs = require('../requests.cjs');
|
|
11
11
|
var _routescjs = require('../routes.cjs');
|
|
@@ -20,7 +20,7 @@ const errorsSchemas = Object.entries(_typescjs.StatusCodes).filter(([, value]) =
|
|
|
20
20
|
})
|
|
21
21
|
}));
|
|
22
22
|
class Server {
|
|
23
|
-
constructor(server, config, implementations) {
|
|
23
|
+
constructor(server, config, implementations) {
|
|
24
24
|
this.config = config;
|
|
25
25
|
this.implementations = implementations;
|
|
26
26
|
this.server = server;
|
|
@@ -34,10 +34,13 @@ class Server {
|
|
|
34
34
|
#openapi;
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
get cors() {
|
|
38
|
+
return {
|
|
39
|
+
origin: _optionalChain([this, 'access', _2 => _2.config, 'access', _3 => _3.cors, 'optionalAccess', _4 => _4.origin]),
|
|
40
|
+
methods: (_nullishCoalesce(_optionalChain([this, 'access', _5 => _5.config, 'access', _6 => _6.cors, 'optionalAccess', _7 => _7.methods]), () => ( Object.values(_typescjs.Methods)))).filter((m) => m !== _typescjs.Methods.options).map((m) => m.toUpperCase()),
|
|
41
|
+
credentials: _optionalChain([this, 'access', _8 => _8.config, 'access', _9 => _9.cors, 'optionalAccess', _10 => _10.credentials])
|
|
42
|
+
};
|
|
43
|
+
}
|
|
41
44
|
addRouter(...routers) {
|
|
42
45
|
routers.map((router) => router.routes).forEach((routes) => this.addRoute(...routes));
|
|
43
46
|
}
|
|
@@ -48,9 +51,8 @@ class Server {
|
|
|
48
51
|
const key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`;
|
|
49
52
|
if (this.#routesByKey.get(key))
|
|
50
53
|
throw new (0, _indexcjs.EquippedError)(`Route key ${key} already registered. All route keys must be unique`, { route, key });
|
|
51
|
-
middlewares.
|
|
52
|
-
|
|
53
|
-
_optionalChain([onError, 'optionalAccess', _4 => _4.onSetup, 'optionalCall', _5 => _5(route)]);
|
|
54
|
+
middlewares.forEach((m) => _optionalChain([m, 'access', _11 => _11.onSetup, 'optionalCall', _12 => _12(route)]));
|
|
55
|
+
_optionalChain([onError, 'optionalAccess', _13 => _13.onSetup, 'optionalCall', _14 => _14(route)]);
|
|
54
56
|
const { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema);
|
|
55
57
|
this.#routesByKey.set(key, true);
|
|
56
58
|
await this.#openapi.register(route, jsonSchema);
|
|
@@ -62,7 +64,7 @@ class Server {
|
|
|
62
64
|
const response = rawRes instanceof _requestscjs.Response ? rawRes : new (0, _requestscjs.Response)({ body: rawRes, status: _typescjs.StatusCodes.Ok, headers: {}, piped: false });
|
|
63
65
|
return await this.implementations.handleResponse(res, await validateResponse(response));
|
|
64
66
|
} catch (error) {
|
|
65
|
-
if (_optionalChain([onError, 'optionalAccess',
|
|
67
|
+
if (_optionalChain([onError, 'optionalAccess', _15 => _15.cb])) {
|
|
66
68
|
const rawResponse = await onError.cb(request, this.config, error);
|
|
67
69
|
const response = rawResponse instanceof _requestscjs.Response ? rawResponse : new (0, _requestscjs.Response)({ body: rawResponse, status: _typescjs.StatusCodes.BadRequest, headers: {} });
|
|
68
70
|
return await this.implementations.handleResponse(res, await validateResponse(response));
|
|
@@ -74,8 +76,8 @@ class Server {
|
|
|
74
76
|
});
|
|
75
77
|
}
|
|
76
78
|
#resolveSchema(method, schema) {
|
|
77
|
-
const defaultStatusCode = _nullishCoalesce(_optionalChain([schema, 'optionalAccess',
|
|
78
|
-
const defaultContentType = _nullishCoalesce(_optionalChain([schema, 'optionalAccess',
|
|
79
|
+
const defaultStatusCode = _nullishCoalesce(_optionalChain([schema, 'optionalAccess', _16 => _16.defaultStatusCode]), () => ( _typescjs.StatusCodes.Ok));
|
|
80
|
+
const defaultContentType = _nullishCoalesce(_optionalChain([schema, 'optionalAccess', _17 => _17.defaultContentType]), () => ( "application/json"));
|
|
79
81
|
let status = defaultStatusCode;
|
|
80
82
|
let contentType = defaultContentType;
|
|
81
83
|
const jsonSchema = { response: {}, request: {} };
|
|
@@ -101,7 +103,7 @@ class Server {
|
|
|
101
103
|
if (def.type === "response") {
|
|
102
104
|
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
103
105
|
responsePipeDefs[def.key] = _valleyed.v.any().pipe((input) => {
|
|
104
|
-
const p = _optionalChain([pipeRecords, 'access',
|
|
106
|
+
const p = _optionalChain([pipeRecords, 'access', _18 => _18.find, 'call', _19 => _19((r) => r.status === status), 'optionalAccess', _20 => _20.pipe]);
|
|
105
107
|
if (!p) throw _valleyed.PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
106
108
|
return _valleyed.v.assert(p, input);
|
|
107
109
|
});
|
|
@@ -118,8 +120,6 @@ class Server {
|
|
|
118
120
|
_valleyed.v.compile(responsePipe, { allErrors: true });
|
|
119
121
|
const validateRequest = async (request) => {
|
|
120
122
|
if (!Object.keys(requestPipeDefs)) return request;
|
|
121
|
-
const context = schema.context ? await schema.context(request) : {};
|
|
122
|
-
request.context = context;
|
|
123
123
|
const validity = _valleyedcjs.requestLocalStorage.run(
|
|
124
124
|
request,
|
|
125
125
|
() => _valleyed.v.validate(requestPipe, {
|
|
@@ -146,7 +146,7 @@ class Server {
|
|
|
146
146
|
response,
|
|
147
147
|
() => _valleyed.v.validate(responsePipe, {
|
|
148
148
|
responseHeaders: response.headers,
|
|
149
|
-
responseCookies: response.cookies,
|
|
149
|
+
responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
|
|
150
150
|
response: response.body
|
|
151
151
|
})
|
|
152
152
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/server/impls/base.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs","sourcesContent":["import type http from 'http'\n\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { parseAuthUser } from '../middlewares/parseAuthUser'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type RouteDef, StatusCodes, type Route } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected cors = {\n\t\torigin: '*',\n\t\tmethods: Object.values(Methods)\n\t\t\t.filter((m) => m !== Methods.options)\n\t\t\t.map((m) => m.toUpperCase()),\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.unshift(parseAuthUser as any)\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst context = schema.context ? await schema.context(request) : {}\n\t\t\trequest.context = context\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: response.cookies,\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n",null]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/impls/base.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.cjs","sourcesContent":["import type http from 'node:http'\n\nimport { type CorsOptions } from 'cors'\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type Route, type RouteDef, StatusCodes } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected get cors() {\n\t\treturn {\n\t\t\torigin: this.config.cors?.origin,\n\t\t\tmethods: (this.config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),\n\t\t\tcredentials: this.config.cors?.credentials,\n\t\t} satisfies CorsOptions\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value] as const)),\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('cors');var _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var _openapimincjs = require('../openapi.min.cjs');var _requestsmincjs = require('../requests.min.cjs');require('../routes');var _socketsmincjs = require('../sockets.min.cjs');var _typesmincjs = require('../types.min.cjs');const x=Object.entries(_typesmincjs.StatusCodes).filter(([,f])=>f>399).map(([f,o])=>({status:o,contentType:"application/json",pipe:_valleyed.v.meta(_valleyed.v.array(_valleyed.v.object({message:_valleyed.v.string(),field:_valleyed.v.optional(_valleyed.v.string())})),{$refId:`Errors.${f}Response`,description:`${f} Response`})}));class Y{constructor(o,s,n){this.config=s;this.implementations=n;this.server=o,this.#e=new (0, _openapimincjs.OpenApi)(s);const p=new (0, _socketio.Server)(o,{cors:this.cors});this.socket=new (0, _socketsmincjs.SocketEmitter)(p,s),this.addRouter(this.#e.router())}#t=[];#s=new Map;#e;get cors(){return{origin:_optionalChain([this, 'access', _ => _.config, 'access', _2 => _2.cors, 'optionalAccess', _3 => _3.origin]),methods:(_nullishCoalesce(_optionalChain([this, 'access', _4 => _4.config, 'access', _5 => _5.cors, 'optionalAccess', _6 => _6.methods]), () => (Object.values(_typesmincjs.Methods)))).filter(o=>o!==_typesmincjs.Methods.options).map(o=>o.toUpperCase()),credentials:_optionalChain([this, 'access', _7 => _7.config, 'access', _8 => _8.cors, 'optionalAccess', _9 => _9.credentials])}}addRouter(...o){o.map(s=>s.routes).forEach(s=>this.addRoute(...s))}addRoute(...o){o.forEach(s=>{this.#t.push(async()=>{const{method:n,path:p,schema:r={},onError:c,middlewares:d=[]}=s,i=`(${n.toUpperCase()}) ${this.#e.cleanPath(p)}`;if(this.#s.get(i))throw new (0, _indexmincjs.EquippedError)(`Route key ${i} already registered. All route keys must be unique`,{route:s,key:i});d.forEach(h=>_optionalChain([h, 'access', _10 => _10.onSetup, 'optionalCall', _11 => _11(s)])),_optionalChain([c, 'optionalAccess', _12 => _12.onSetup, 'optionalCall', _13 => _13(s)]);const{validateRequest:R,validateResponse:q,jsonSchema:v}=this.#o(n,r);this.#s.set(i,!0),await this.#e.register(s,v),this.implementations.registerRoute(n,this.#e.cleanPath(p),async(h,w)=>{const g=await R(await this.implementations.parseRequest(h));try{for(const u of d)await u.cb(g,this.config);const e=await s.handler(g,this.config),t=e instanceof _requestsmincjs.Response?e:new (0, _requestsmincjs.Response)({body:e,status:_typesmincjs.StatusCodes.Ok,headers:{},piped:!1});return await this.implementations.handleResponse(w,await q(t))}catch(e){if(_optionalChain([c, 'optionalAccess', _14 => _14.cb])){const t=await c.cb(g,this.config,e),u=t instanceof _requestsmincjs.Response?t:new (0, _requestsmincjs.Response)({body:t,status:_typesmincjs.StatusCodes.BadRequest,headers:{}});return await this.implementations.handleResponse(w,await q(u))}throw e}})})})}#o(o,s){const n=_nullishCoalesce(_optionalChain([s, 'optionalAccess', _15 => _15.defaultStatusCode]), () => (_typesmincjs.StatusCodes.Ok)),p=_nullishCoalesce(_optionalChain([s, 'optionalAccess', _16 => _16.defaultContentType]), () => ("application/json"));let r=n,c=p;const d={response:{},request:{}},i={},R={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"cookies",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![_typesmincjs.Methods.post,_typesmincjs.Methods.put,_typesmincjs.Methods.patch].includes(o)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"},{key:"responseCookies",type:"response"}].forEach(e=>{const t=_nullishCoalesce(s[e.key], () => (_valleyed.v.any()));if(!e.skip&&(e.type==="request"&&(i[e.key]=t,d.request[e.key]=_valleyed.v.schema(t)),e.type==="response")){const u=x.concat({status:n,contentType:c,pipe:t});R[e.key]=_valleyed.v.any().pipe(m=>{const E=_optionalChain([u, 'access', _17 => _17.find, 'call', _18 => _18(P=>P.status===r), 'optionalAccess', _19 => _19.pipe]);if(!E)throw _valleyed.PipeError.root(`schema not defined for status code: ${r}`,m);return _valleyed.v.assert(E,m)}),d.response[e.key]=u.map(m=>({status:m.status,contentType:m.contentType,schema:_valleyed.v.schema(m.pipe)}))}});const v=_valleyed.v.object(i);_valleyed.v.compile(v,{allErrors:!0});const h=_valleyed.v.object(R);return _valleyed.v.compile(h,{allErrors:!0}),{jsonSchema:d,validateRequest:async e=>{if(!Object.keys(i))return e;const t=_valleyedmincjs.requestLocalStorage.run(e,()=>_valleyed.v.validate(v,{params:e.params,headers:e.headers,query:e.query,body:e.body,cookies:e.cookies}));if(!t.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, t.error);return e.params=t.value.params,e.headers=t.value.headers,e.query=t.value.query,e.body=t.value.body,e.cookies=t.value.cookies,e},validateResponse:async e=>{if(!Object.keys(R))return e;r=e.status,c=e.contentType;const t=_valleyedmincjs.responseLocalStorage.run(e,()=>_valleyed.v.validate(h,{responseHeaders:e.headers,responseCookies:Object.fromEntries(Object.entries(e.cookies).map(([u,m])=>[u,m.value])),response:e.body}));if(!t.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, t.error);return e.body=t.value.response,e.headers=t.value.responseHeaders,e.cookieValues=t.value.responseCookies,e}}}test(){return _supertest2.default.call(void 0, this.server)}async start(){const o=this.config.port,s=_indexmincjs3.Instance.get(),{app:n}=s.settings;this.config.healthPath&&this.addRoute({method:_typesmincjs.Methods.get,path:this.config.healthPath,handler:async r=>r.res({body:`${s.id}(${n.name}) service running`,contentType:"text/plain"})}),this.implementations.registerNotFoundHandler(async r=>{const c=await this.implementations.parseRequest(r);throw new (0, _indexmincjs.NotFoundError)(`Route ${c.path} not found`)}),this.implementations.registerErrorHandler(async(r,c,d)=>{_indexmincjs3.Instance.get().log.error({error:r},"Uncaught error in route handler");const i=r instanceof _indexmincjs.RequestError?new (0, _requestsmincjs.Response)({body:r.serializedErrors,status:r.statusCode}):new (0, _requestsmincjs.Response)({body:[{message:"Something went wrong",data:r.message}],status:_typesmincjs.StatusCodes.BadRequest});return await this.implementations.handleResponse(d,i)}),await Promise.all(this.#t.map(r=>r()));const p=await this.implementations.start(o);return p&&_indexmincjs3.Instance.get().log.info(`${s.id}(${n.name}) service listening on port ${o}`),p}}exports.Server = Y;
|
|
2
2
|
//# sourceMappingURL=base.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/server/impls/base.ts"],"names":["Methods","StatusCodes","v","key","server","config"],"mappings":"AAEA,szBAAuC,4FACjB,oCACkB,yDAG/B,4DACA,+DACqB,oEACA,2EAGS,mDAE9B,qDACAA,qBAA0CC,mDAMjC,+CAGH,MACb,CAAA,CAAA,MAAQ,CAAA,OAAO,CAAA,wBAAMC,CAAAA,CAAE,MAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAASA,CAAAA,GAAE,CAAA,CAAA,GAAO,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,EAAE,CAAA,CAAA,MAAA,CAASA,CAAAA,CAAE,WAAY,CAAA,kBAC5E,CAAUC,IAAG,CAAA,WAAA,CAAA,IAAA,CACrB,WAAA,CAAA,KAAA,CAAA,WAAA,CAAA,MAAmB,CAAA,CAAA,OAAA,CAAA,WACpB,CAAC,MAGI,CAAA,CAAA,CAAA,KAaN,CAAA,WAAA,CAAA,QACCC,CAAAA,WACQC,CAAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MACA,CAAA,CAAA,OAAA,EAAA,CAAA,CAAA,QASR,CAAA,CAAA,WAAcD,CACd,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.min.cjs","sourcesContent":["import type http from 'http'\n\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { parseAuthUser } from '../middlewares/parseAuthUser'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type RouteDef, StatusCodes, type Route } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected cors = {\n\t\torigin: '*',\n\t\tmethods: Object.values(Methods)\n\t\t\t.filter((m) => m !== Methods.options)\n\t\t\t.map((m) => m.toUpperCase()),\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.unshift(parseAuthUser as any)\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst context = schema.context ? await schema.context(request) : {}\n\t\t\trequest.context = context\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: response.cookies,\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/impls/base.ts"],"names":["v","server","config","implementations"],"mappings":"AAEA,iyBAAiC,qCACM,4FACjB,oCACkB,yDAG/B,4DACA,+DACqB,oEAGP,mDAEvB,qDACS,qBAAsD,mDAM7D,+CAGa,MAAA,CAAA,CAAA,MACb,CAAA,OAAQ,CAAA,wBAAA,CAAKA,CAAAA,MAAE,CAAMA,CAAAA,CAAE,CAAA,CAAA,CAAA,CAAA,EAAA,CAAO,CAAE,GAAA,CAAA,CAAA,GAASA,CAAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAG,CAAA,MAAOA,CAAE,CAAA,CAAA,WAAW,CAAA,kBAChE,CAAA,IAAA,CAAA,WAAA,CAAA,IAAa,CAAA,WAAA,CAAA,KAAA,CAAA,WACrB,CAAA,MAAA,CAAA,CAAA,OAAmB,CAAA,WAAA,CAAA,MAAA,CAAA,CACpB,CAAC,KAGI,CAAA,WAAA,CAAA,QAcN,CAAA,WAAA,CAAA,MACCC,CAAAA,CACQC,CAAAA,CACAC,CAAAA,CAQP,CATO,CAAA,MAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,QAAA,CAAA,CAAA,WASR,CAAK,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.min.cjs","sourcesContent":["import type http from 'node:http'\n\nimport { type CorsOptions } from 'cors'\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type Route, type RouteDef, StatusCodes } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected get cors() {\n\t\treturn {\n\t\t\torigin: this.config.cors?.origin,\n\t\t\tmethods: (this.config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),\n\t\t\tcredentials: this.config.cors?.credentials,\n\t\t} satisfies CorsOptions\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value] as const)),\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n"]}
|
|
@@ -18,16 +18,6 @@ class ExpressServer extends _basecjs.Server {
|
|
|
18
18
|
const instance = _indexcjs.Instance.get();
|
|
19
19
|
super(_http2.default.createServer(app), config, {
|
|
20
20
|
parseRequest: async (req) => {
|
|
21
|
-
const allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, _nullishCoalesce(val, () => ( null))]));
|
|
22
|
-
const headers = {
|
|
23
|
-
...allHeaders,
|
|
24
|
-
Authorization: req.get("authorization"),
|
|
25
|
-
RefreshToken: req.get("x-refresh-token"),
|
|
26
|
-
ApiKey: req.get("x-api-key"),
|
|
27
|
-
ContentType: req.get("content-type"),
|
|
28
|
-
Referer: req.get("referer"),
|
|
29
|
-
UserAgent: req.get("user-agent")
|
|
30
|
-
};
|
|
31
21
|
const files = Object.fromEntries(
|
|
32
22
|
await Promise.all(
|
|
33
23
|
Object.entries(_nullishCoalesce(req.files, () => ( {}))).map(async ([key, file]) => {
|
|
@@ -54,9 +44,8 @@ class ExpressServer extends _basecjs.Server {
|
|
|
54
44
|
query: _nullishCoalesce(req.query, () => ( {})),
|
|
55
45
|
method: req.method,
|
|
56
46
|
path: req.path,
|
|
57
|
-
headers,
|
|
58
|
-
files
|
|
59
|
-
context: {}
|
|
47
|
+
headers: req.headers,
|
|
48
|
+
files
|
|
60
49
|
});
|
|
61
50
|
},
|
|
62
51
|
handleResponse: async (res, response) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/server/impls/express.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs"],"names":["app"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]))\n\t\t\t\tconst headers = {\n\t\t\t\t\t...allHeaders,\n\t\t\t\t\tAuthorization: req.get('authorization'),\n\t\t\t\t\tRefreshToken: req.get('x-refresh-token'),\n\t\t\t\t\tApiKey: req.get('x-api-key'),\n\t\t\t\t\tContentType: req.get('content-type'),\n\t\t\t\t\tReferer: req.get('referer'),\n\t\t\t\t\tUserAgent: req.get('user-agent'),\n\t\t\t\t}\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcontext: {},\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n",null]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/impls/express.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs"],"names":["app"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders: req.headers,\n\t\t\t\t\tfiles,\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n",null]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _cookieparser = require('cookie-parser'); var _cookieparser2 = _interopRequireDefault(_cookieparser);var _cors = require('cors'); var _cors2 = _interopRequireDefault(_cors);var _express = require('express'); var _express2 = _interopRequireDefault(_express);var _expressfileupload = require('express-fileupload'); var _expressfileupload2 = _interopRequireDefault(_expressfileupload);var _expressratelimit = require('express-rate-limit');var _helmet = require('helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _pinohttp = require('pino-http');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _cookieparser = require('cookie-parser'); var _cookieparser2 = _interopRequireDefault(_cookieparser);var _cors = require('cors'); var _cors2 = _interopRequireDefault(_cors);var _express = require('express'); var _express2 = _interopRequireDefault(_express);var _expressfileupload = require('express-fileupload'); var _expressfileupload2 = _interopRequireDefault(_expressfileupload);var _expressratelimit = require('express-rate-limit');var _helmet = require('helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _pinohttp = require('pino-http');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class C extends _basemincjs.Server{#e;constructor(i){const t=_express2.default.call(void 0, ),u=_indexmincjs.Instance.get();super(_http2.default.createServer(t),i,{parseRequest:async e=>{const s=Object.fromEntries(await Promise.all(Object.entries(_nullishCoalesce(e.files, () => ({}))).map(async([o,r])=>{const a=Array.isArray(r)?r:[r],m=await Promise.all(a.map(async n=>({name:n.name,type:n.mimetype,size:n.size,isTruncated:n.truncated,data:n.data,duration:await _indexmincjs3.getMediaDuration.call(void 0, n.data)})));return[o,m]})));return new (0, _requestsmincjs.Request)({ip:e.ip,body:_nullishCoalesce(e.body, () => ({})),cookies:_nullishCoalesce(e.cookies, () => ({})),params:_nullishCoalesce(e.params, () => ({})),query:_nullishCoalesce(e.query, () => ({})),method:e.method,path:e.path,headers:e.headers,files:s})},handleResponse:async(e,s)=>{if(s.piped)s.body.pipe(e);else{Object.entries(s.headers).forEach(([r,a])=>e.header(r,a)),Object.entries(s.cookies).forEach(([r,{value:a,...m}])=>e.cookie(r,a,m));const o=s.body===null||s.body===void 0?"json":"send";e.status(s.status)[o](s.body).end()}},registerRoute:(e,s,o)=>{_optionalChain([this, 'access', _ => _.#e, 'access', _2 => _2[e], 'optionalCall', _3 => _3(s,o)])},registerErrorHandler:e=>{this.#e.use(async(s,o,r,a)=>e(s,o,r))},registerNotFoundHandler:e=>{this.#e.use(e)},start:async e=>new Promise((s,o)=>{try{const r=this.server.listen({host:"0.0.0.0",port:e},async()=>s(!0));_indexmincjs.Instance.on("close",r.close,1)}catch(r){o(r)}})}),this.#e=t,t.disable("x-powered-by"),i.requests.log&&t.use(_pinohttp.pinoHttp.call(void 0, {logger:u.log})),t.use(_express2.default.json()),t.use(_express2.default.text()),t.use(_cookieparser2.default.call(void 0, )),t.use(_helmet2.default.call(void 0, {crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1})),t.use(_cors2.default.call(void 0, this.cors)),t.use(_express2.default.urlencoded({extended:!1})),i.publicPath&&t.use(_express2.default.static(i.publicPath)),t.use(_expressfileupload2.default.call(void 0, {limits:{fileSize:u.settings.utils.maxFileUploadSizeInMb*1024*1024},useTempFiles:!1})),i.requests.rateLimit.enabled&&t.use(_expressratelimit.rateLimit.call(void 0, {windowMs:i.requests.rateLimit.periodInMs,limit:i.requests.rateLimit.limit,handler:(e,s)=>s.status(_typesmincjs.StatusCodes.TooManyRequests).json([{message:"Too Many Requests"}])}))}}exports.ExpressServer = C;
|
|
2
2
|
//# sourceMappingURL=express.min.cjs.map
|