@expressots/adapter-express 3.0.0-beta.4.2 → 4.0.0-preview.1
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/README.md +39 -96
- package/lib/CHANGELOG.md +43 -0
- package/lib/README.md +39 -96
- package/lib/cjs/adapter-express/application-express.base.js +3 -1
- package/lib/cjs/adapter-express/application-express.js +1049 -85
- package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
- package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
- package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
- package/lib/cjs/adapter-express/express-utils/decorators.js +186 -49
- package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
- package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
- package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
- package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
- package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
- package/lib/cjs/adapter-express/express-utils/index.js +67 -1
- package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
- package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +810 -63
- package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
- package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
- package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
- package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
- package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
- package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
- package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
- package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
- package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
- package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
- package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
- package/lib/cjs/adapter-express/index.js +7 -5
- package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
- package/lib/cjs/adapter-express/micro-api/application-express-micro.js +11 -37
- package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
- package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
- package/lib/cjs/adapter-express/micro-api/index.js +27 -3
- package/lib/cjs/adapter-express/micro-api/micro.js +217 -0
- package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
- package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
- package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
- package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
- package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
- package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
- package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
- package/lib/cjs/adapter-express/middleware/index.js +21 -0
- package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
- package/lib/cjs/adapter-express/render/engine.js +15 -15
- package/lib/cjs/adapter-express/render/index.js +5 -0
- package/lib/cjs/adapter-express/studio/index.js +9 -0
- package/lib/cjs/adapter-express/studio/studio-integration.js +214 -0
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
- package/lib/cjs/types/adapter-express/application-express.d.ts +273 -32
- package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
- package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
- package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
- package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
- package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
- package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
- package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
- package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
- package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/cjs/types/adapter-express/index.d.ts +6 -4
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
- package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
- package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +66 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +92 -0
- package/lib/cjs/types/index.d.ts +1 -1
- package/lib/esm/adapter-express/application-express.base.js +24 -0
- package/lib/esm/adapter-express/application-express.js +1300 -0
- package/lib/esm/adapter-express/application-express.types.js +1 -0
- package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
- package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
- package/lib/esm/adapter-express/express-utils/constants.js +63 -0
- package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
- package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
- package/lib/esm/adapter-express/express-utils/decorators.js +575 -0
- package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
- package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
- package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
- package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
- package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
- package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
- package/lib/esm/adapter-express/express-utils/index.js +24 -0
- package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
- package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
- package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1031 -0
- package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
- package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
- package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
- package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
- package/lib/esm/adapter-express/express-utils/route-constraints.js +91 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
- package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
- package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
- package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
- package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
- package/lib/esm/adapter-express/express-utils/utils.js +68 -0
- package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
- package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
- package/lib/esm/adapter-express/index.js +7 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro.js +161 -0
- package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
- package/lib/esm/adapter-express/micro-api/index.js +10 -0
- package/lib/esm/adapter-express/micro-api/micro.js +211 -0
- package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
- package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
- package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
- package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
- package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
- package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
- package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
- package/lib/esm/adapter-express/middleware/index.js +5 -0
- package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
- package/lib/esm/adapter-express/render/constants.js +37 -0
- package/lib/esm/adapter-express/render/engine.js +51 -0
- package/lib/esm/adapter-express/render/index.js +1 -0
- package/lib/esm/adapter-express/render/resolve-render.js +30 -0
- package/lib/esm/adapter-express/studio/index.js +1 -0
- package/lib/esm/adapter-express/studio/studio-integration.js +184 -0
- package/lib/esm/index.mjs +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
- package/lib/esm/types/adapter-express/application-express.d.ts +411 -0
- package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
- package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
- package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
- package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
- package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
- package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
- package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
- package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
- package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
- package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
- package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/esm/types/adapter-express/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/micro.d.ts +66 -0
- package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
- package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
- package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
- package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +92 -0
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/package.json +156 -146
- package/package.json +156 -146
- package/lib/cjs/di/di.interfaces.js +0 -10
- package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GuardContextFactory = void 0;
|
|
16
|
+
require("reflect-metadata");
|
|
17
|
+
const core_1 = require("@expressots/core");
|
|
18
|
+
const http_context_store_js_1 = require("./http-context-store.js");
|
|
19
|
+
/**
|
|
20
|
+
* Factory for creating GuardContext from Express request/response
|
|
21
|
+
*/
|
|
22
|
+
let GuardContextFactory = class GuardContextFactory {
|
|
23
|
+
constructor(container, scopeExtractor) {
|
|
24
|
+
this.container = container;
|
|
25
|
+
this.scopeExtractor = scopeExtractor;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create GuardContext from Express request/response
|
|
29
|
+
*/
|
|
30
|
+
async create(req, res) {
|
|
31
|
+
// Get HttpContext (created by InversifyExpressServer's first middleware
|
|
32
|
+
// and stored in a per-request WeakMap; see http-context-store.ts).
|
|
33
|
+
const httpContext = (0, http_context_store_js_1.getHttpContext)(req);
|
|
34
|
+
if (!httpContext) {
|
|
35
|
+
throw new Error("HttpContext not found on request. Ensure InversifyExpressServer is properly configured.");
|
|
36
|
+
}
|
|
37
|
+
// Extract scope information
|
|
38
|
+
const scope = await this.scopeExtractor.extract(req);
|
|
39
|
+
// Extract route metadata
|
|
40
|
+
const route = {
|
|
41
|
+
controller:
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
+
req.__expressotsControllerName || "unknown",
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
method: req.__expressotsMethod || "unknown",
|
|
46
|
+
path: req.path,
|
|
47
|
+
params: req.params,
|
|
48
|
+
query: req.query,
|
|
49
|
+
};
|
|
50
|
+
// Create guard context
|
|
51
|
+
// Note: httpContext.user is Principal from adapter-express, but GuardContext expects Principal from core
|
|
52
|
+
// They have the same structure, so this is compatible
|
|
53
|
+
// Note: httpContext.container is inversifyInterfaces.Container, but GuardContext expects Container from core
|
|
54
|
+
// They are compatible, so we cast it
|
|
55
|
+
const context = {
|
|
56
|
+
request: req,
|
|
57
|
+
response: res,
|
|
58
|
+
principal: httpContext.user, // Cast to core Principal type (same structure)
|
|
59
|
+
container: httpContext.container, // Request-scoped child container!
|
|
60
|
+
scope,
|
|
61
|
+
route,
|
|
62
|
+
getScoped: (identifier, scopeName) => {
|
|
63
|
+
// Resolve with scope awareness
|
|
64
|
+
// Note: scopeName is optional and can be used for custom scopes (e.g., tenant)
|
|
65
|
+
if (scopeName) {
|
|
66
|
+
// For custom scopes, use named binding or scope registry
|
|
67
|
+
// For now, fallback to regular get (can be enhanced later)
|
|
68
|
+
return httpContext.container.get(identifier);
|
|
69
|
+
}
|
|
70
|
+
return httpContext.container.get(identifier);
|
|
71
|
+
},
|
|
72
|
+
getTenantId: () => scope.tenant,
|
|
73
|
+
getRequestId: () => scope.request,
|
|
74
|
+
};
|
|
75
|
+
return context;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
exports.GuardContextFactory = GuardContextFactory;
|
|
79
|
+
exports.GuardContextFactory = GuardContextFactory = __decorate([
|
|
80
|
+
(0, core_1.injectable)(),
|
|
81
|
+
__param(0, (0, core_1.inject)(core_1.Container)),
|
|
82
|
+
__param(1, (0, core_1.inject)("IScopeExtractor")),
|
|
83
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
84
|
+
], GuardContextFactory);
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GuardMiddleware = void 0;
|
|
16
|
+
const core_1 = require("@expressots/core");
|
|
17
|
+
const core_2 = require("@expressots/core");
|
|
18
|
+
const guard_context_factory_js_1 = require("./guard-context-factory.js");
|
|
19
|
+
const core_3 = require("@expressots/core");
|
|
20
|
+
/**
|
|
21
|
+
* Express middleware that executes guards before route handler
|
|
22
|
+
*/
|
|
23
|
+
let GuardMiddleware = class GuardMiddleware {
|
|
24
|
+
constructor(executor, contextFactory, container) {
|
|
25
|
+
this.executor = executor;
|
|
26
|
+
this.contextFactory = contextFactory;
|
|
27
|
+
this.container = container;
|
|
28
|
+
/**
|
|
29
|
+
* Express middleware function
|
|
30
|
+
*/
|
|
31
|
+
this.execute = async (req, res, next) => {
|
|
32
|
+
// Get request ID for flow tracking
|
|
33
|
+
const requestContext = core_1.ContextManager.getCurrentContext();
|
|
34
|
+
const requestId = requestContext?.requestId;
|
|
35
|
+
const flowTracker = requestId ? (0, core_1.findFlowTracker)(requestId) : undefined;
|
|
36
|
+
// Extract guards from route metadata (controller + method level)
|
|
37
|
+
const guards = this.extractGuards(req);
|
|
38
|
+
if (guards.length === 0) {
|
|
39
|
+
return next(); // No guards, proceed
|
|
40
|
+
}
|
|
41
|
+
// Start tracking guard execution
|
|
42
|
+
const guardNames = guards.map((g) => {
|
|
43
|
+
if (typeof g === "function") {
|
|
44
|
+
return g.name || "UnknownGuard";
|
|
45
|
+
}
|
|
46
|
+
return g.constructor.name;
|
|
47
|
+
});
|
|
48
|
+
const guardStepName = `Guards: ${guardNames.join(", ")}`;
|
|
49
|
+
if (flowTracker?.isEnabled()) {
|
|
50
|
+
flowTracker.startStep("guard", guardStepName, {
|
|
51
|
+
guardCount: guards.length,
|
|
52
|
+
guardNames,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
// Create guard context
|
|
57
|
+
const context = await this.contextFactory.create(req, res);
|
|
58
|
+
// Execute guards
|
|
59
|
+
const result = await this.executor.execute(guards, context);
|
|
60
|
+
if (!result.allowed) {
|
|
61
|
+
// End guard step with failure
|
|
62
|
+
if (flowTracker?.isEnabled()) {
|
|
63
|
+
flowTracker.failStep(result.error);
|
|
64
|
+
}
|
|
65
|
+
// Throw error to be caught by exception handler
|
|
66
|
+
throw result.error || core_3.AppError.forbidden("Access denied");
|
|
67
|
+
}
|
|
68
|
+
// End guard step with success
|
|
69
|
+
if (flowTracker?.isEnabled()) {
|
|
70
|
+
flowTracker.endStep("success");
|
|
71
|
+
}
|
|
72
|
+
next();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Store error on request for flow tracking
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
req.__expressotsFlowError =
|
|
78
|
+
error instanceof Error ? error : new Error(String(error));
|
|
79
|
+
// End guard step with failure if not already ended
|
|
80
|
+
if (flowTracker?.isEnabled()) {
|
|
81
|
+
const currentFlow = flowTracker.getFlow();
|
|
82
|
+
const lastStep = currentFlow.steps[currentFlow.steps.length - 1];
|
|
83
|
+
if (lastStep && lastStep.name === guardStepName && lastStep.status === "success") {
|
|
84
|
+
// Step was already ended, don't end again
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
flowTracker.failStep(error instanceof Error ? error : undefined);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
next(error);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract guards from request metadata
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
extractGuards(req) {
|
|
99
|
+
// Extract from request metadata (set during route registration)
|
|
100
|
+
const reqWithGuards = req;
|
|
101
|
+
const controllerGuards = reqWithGuards.__expressotsControllerGuards || [];
|
|
102
|
+
const methodGuards = reqWithGuards.__expressotsMethodGuards || [];
|
|
103
|
+
return [...controllerGuards, ...methodGuards];
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
exports.GuardMiddleware = GuardMiddleware;
|
|
107
|
+
exports.GuardMiddleware = GuardMiddleware = __decorate([
|
|
108
|
+
(0, core_1.injectable)(),
|
|
109
|
+
__param(0, (0, core_1.inject)(core_2.GuardExecutor)),
|
|
110
|
+
__param(1, (0, core_1.inject)(guard_context_factory_js_1.GuardContextFactory)),
|
|
111
|
+
__param(2, (0, core_1.inject)(core_1.Container)),
|
|
112
|
+
__metadata("design:paramtypes", [core_2.GuardExecutor,
|
|
113
|
+
guard_context_factory_js_1.GuardContextFactory,
|
|
114
|
+
core_1.Container])
|
|
115
|
+
], GuardMiddleware);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getControllerGuards = getControllerGuards;
|
|
4
|
+
exports.getMethodGuards = getMethodGuards;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const core_1 = require("@expressots/core");
|
|
7
|
+
/**
|
|
8
|
+
* Extract guards from controller metadata
|
|
9
|
+
*/
|
|
10
|
+
function getControllerGuards(constructor) {
|
|
11
|
+
return (Reflect.getMetadata(core_1.GUARD_METADATA_KEY.controllerGuards, constructor) || []);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extract guards from method metadata
|
|
15
|
+
*/
|
|
16
|
+
function getMethodGuards(constructor, methodName) {
|
|
17
|
+
return (Reflect.getMetadata(core_1.GUARD_METADATA_KEY.methodGuards, constructor, methodName) || []);
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setHttpContext = setHttpContext;
|
|
4
|
+
exports.getHttpContext = getHttpContext;
|
|
5
|
+
exports.hasHttpContext = hasHttpContext;
|
|
6
|
+
const httpContextByRequest = new WeakMap();
|
|
7
|
+
function setHttpContext(req, ctx) {
|
|
8
|
+
httpContextByRequest.set(req, ctx);
|
|
9
|
+
}
|
|
10
|
+
function getHttpContext(req) {
|
|
11
|
+
return httpContextByRequest.get(req);
|
|
12
|
+
}
|
|
13
|
+
function hasHttpContext(req) {
|
|
14
|
+
return httpContextByRequest.has(req);
|
|
15
|
+
}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.HttpStatusCodeMiddleware = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
const core_1 = require("@expressots/core");
|
|
6
|
-
const
|
|
6
|
+
const constants_js_1 = require("./constants.js");
|
|
7
7
|
/**
|
|
8
8
|
* Middleware that applies the status code to the response.
|
|
9
9
|
* @returns express.RequestHandler
|
|
@@ -14,7 +14,7 @@ class HttpStatusCodeMiddleware extends core_1.ExpressoMiddleware {
|
|
|
14
14
|
this.globalPrefix = globalPrefix;
|
|
15
15
|
}
|
|
16
16
|
use(req, res, next) {
|
|
17
|
-
const statusCodeMapping = Reflect.getMetadata(
|
|
17
|
+
const statusCodeMapping = Reflect.getMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect);
|
|
18
18
|
let path = req.path;
|
|
19
19
|
if (this.globalPrefix !== "/" && path.startsWith(this.globalPrefix)) {
|
|
20
20
|
path = path.slice(this.globalPrefix.length);
|
|
@@ -23,18 +23,53 @@ class HttpStatusCodeMiddleware extends core_1.ExpressoMiddleware {
|
|
|
23
23
|
const formattedMethod = req.method.toLowerCase();
|
|
24
24
|
path = `${path || "/"}/-${formattedMethod}`;
|
|
25
25
|
const statusCode = statusCodeMapping[path];
|
|
26
|
+
let explicitStatus = null;
|
|
26
27
|
if (statusCode) {
|
|
27
28
|
res.status(statusCode);
|
|
29
|
+
explicitStatus = statusCode;
|
|
28
30
|
}
|
|
29
31
|
else {
|
|
30
32
|
const patternMatchStatusCode = this.findMatchingParameterPath(path, statusCodeMapping);
|
|
31
33
|
if (patternMatchStatusCode) {
|
|
32
34
|
res.status(patternMatchStatusCode);
|
|
35
|
+
explicitStatus = patternMatchStatusCode;
|
|
33
36
|
}
|
|
34
37
|
else {
|
|
35
38
|
this.setDefaultStatusCode(req, res);
|
|
36
39
|
}
|
|
37
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* When @Http(...) declares an explicit status, honor it even when the
|
|
43
|
+
* client sent conditional headers (If-None-Match / If-Modified-Since).
|
|
44
|
+
*
|
|
45
|
+
* Without this, Express's `res.send()` evaluates `req.fresh` (which is
|
|
46
|
+
* `true` for any 2xx status whose ETag matches the request's
|
|
47
|
+
* If-None-Match) and silently rewrites our 201/202/206/etc. into 304
|
|
48
|
+
* Not Modified. That makes @Http() unreliable in any caching
|
|
49
|
+
* environment — including a developer hitting refresh in their
|
|
50
|
+
* browser. We override `req.fresh` to always return `false` for this
|
|
51
|
+
* one response so the explicit status wins.
|
|
52
|
+
*
|
|
53
|
+
* For the 200 default we leave Express's freshness behavior alone, so
|
|
54
|
+
* normal GET caching still works as expected.
|
|
55
|
+
*/
|
|
56
|
+
if (explicitStatus !== null && explicitStatus !== 200) {
|
|
57
|
+
try {
|
|
58
|
+
Object.defineProperty(req, "fresh", {
|
|
59
|
+
configurable: true,
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: () => false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Some proxied / decorated request objects make this property
|
|
66
|
+
// non-configurable. In that case we fall back to stripping the
|
|
67
|
+
// conditional headers entirely, which has the same effect on
|
|
68
|
+
// Express's freshness check.
|
|
69
|
+
delete req.headers["if-none-match"];
|
|
70
|
+
delete req.headers["if-modified-since"];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
38
73
|
next();
|
|
39
74
|
}
|
|
40
75
|
/**
|
|
@@ -14,4 +14,70 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
|
|
17
|
+
exports.hasHttpContext = exports.getHttpContext = exports.ValidationService = exports.hasValidationMetadata = exports.getValidationMetadata = exports.Validate = exports.validatedHeaders = exports.validatedParam = exports.validatedQuery = exports.validatedBody = exports.createRouteMappings = exports.createLazyModuleMiddleware = exports.setupLazyLoadingForExpress = exports.setupInterceptorsForExpress = exports.setupEventSystemForExpress = exports.setupAuthorizationForExpress = exports.TYPE = exports.PermissionPreloaderMiddleware = exports.ScopeExtractor = exports.createInterceptorMiddleware = exports.InterceptorMiddleware = exports.GuardMiddleware = exports.GuardContextFactory = exports.getMethodGuards = exports.getControllerGuards = exports.UseFilters = exports.Catch = exports.isComposedMiddleware = exports.sequence = exports.combine = exports.isConditionalMiddleware = exports.unless = exports.when = exports.pattern = exports.Patterns = exports.StreamResponse = exports.YamlOptions = exports.XmlOptions = exports.CsvOptions = exports.Produces = exports.Consumes = exports.Accept = void 0;
|
|
18
|
+
__exportStar(require("./decorators.js"), exports);
|
|
19
|
+
var content_negotiation_decorators_js_1 = require("./content-negotiation-decorators.js");
|
|
20
|
+
Object.defineProperty(exports, "Accept", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Accept; } });
|
|
21
|
+
Object.defineProperty(exports, "Consumes", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Consumes; } });
|
|
22
|
+
Object.defineProperty(exports, "Produces", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Produces; } });
|
|
23
|
+
Object.defineProperty(exports, "CsvOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.CsvOptions; } });
|
|
24
|
+
Object.defineProperty(exports, "XmlOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.XmlOptions; } });
|
|
25
|
+
Object.defineProperty(exports, "YamlOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.YamlOptions; } });
|
|
26
|
+
Object.defineProperty(exports, "StreamResponse", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.StreamResponse; } });
|
|
27
|
+
var route_constraints_js_1 = require("./route-constraints.js");
|
|
28
|
+
Object.defineProperty(exports, "Patterns", { enumerable: true, get: function () { return route_constraints_js_1.Patterns; } });
|
|
29
|
+
Object.defineProperty(exports, "pattern", { enumerable: true, get: function () { return route_constraints_js_1.pattern; } });
|
|
30
|
+
var conditional_middleware_js_1 = require("./conditional-middleware.js");
|
|
31
|
+
Object.defineProperty(exports, "when", { enumerable: true, get: function () { return conditional_middleware_js_1.when; } });
|
|
32
|
+
Object.defineProperty(exports, "unless", { enumerable: true, get: function () { return conditional_middleware_js_1.unless; } });
|
|
33
|
+
Object.defineProperty(exports, "isConditionalMiddleware", { enumerable: true, get: function () { return conditional_middleware_js_1.isConditionalMiddleware; } });
|
|
34
|
+
var middleware_composition_js_1 = require("./middleware-composition.js");
|
|
35
|
+
Object.defineProperty(exports, "combine", { enumerable: true, get: function () { return middleware_composition_js_1.combine; } });
|
|
36
|
+
Object.defineProperty(exports, "sequence", { enumerable: true, get: function () { return middleware_composition_js_1.sequence; } });
|
|
37
|
+
Object.defineProperty(exports, "isComposedMiddleware", { enumerable: true, get: function () { return middleware_composition_js_1.isComposedMiddleware; } });
|
|
38
|
+
var exception_filter_decorators_js_1 = require("./exception-filter-decorators.js");
|
|
39
|
+
Object.defineProperty(exports, "Catch", { enumerable: true, get: function () { return exception_filter_decorators_js_1.Catch; } });
|
|
40
|
+
Object.defineProperty(exports, "UseFilters", { enumerable: true, get: function () { return exception_filter_decorators_js_1.UseFilters; } });
|
|
41
|
+
var guard_utils_js_1 = require("./guard-utils.js");
|
|
42
|
+
Object.defineProperty(exports, "getControllerGuards", { enumerable: true, get: function () { return guard_utils_js_1.getControllerGuards; } });
|
|
43
|
+
Object.defineProperty(exports, "getMethodGuards", { enumerable: true, get: function () { return guard_utils_js_1.getMethodGuards; } });
|
|
44
|
+
var guard_context_factory_js_1 = require("./guard-context-factory.js");
|
|
45
|
+
Object.defineProperty(exports, "GuardContextFactory", { enumerable: true, get: function () { return guard_context_factory_js_1.GuardContextFactory; } });
|
|
46
|
+
var guard_middleware_js_1 = require("./guard-middleware.js");
|
|
47
|
+
Object.defineProperty(exports, "GuardMiddleware", { enumerable: true, get: function () { return guard_middleware_js_1.GuardMiddleware; } });
|
|
48
|
+
var interceptor_middleware_js_1 = require("./interceptor-middleware.js");
|
|
49
|
+
Object.defineProperty(exports, "InterceptorMiddleware", { enumerable: true, get: function () { return interceptor_middleware_js_1.InterceptorMiddleware; } });
|
|
50
|
+
Object.defineProperty(exports, "createInterceptorMiddleware", { enumerable: true, get: function () { return interceptor_middleware_js_1.createInterceptorMiddleware; } });
|
|
51
|
+
var scope_extractor_js_1 = require("./scope-extractor.js");
|
|
52
|
+
Object.defineProperty(exports, "ScopeExtractor", { enumerable: true, get: function () { return scope_extractor_js_1.ScopeExtractor; } });
|
|
53
|
+
var permission_preloader_middleware_js_1 = require("./permission-preloader.middleware.js");
|
|
54
|
+
Object.defineProperty(exports, "PermissionPreloaderMiddleware", { enumerable: true, get: function () { return permission_preloader_middleware_js_1.PermissionPreloaderMiddleware; } });
|
|
55
|
+
var constants_js_1 = require("./constants.js");
|
|
56
|
+
Object.defineProperty(exports, "TYPE", { enumerable: true, get: function () { return constants_js_1.TYPE; } });
|
|
57
|
+
var setup_authorization_js_1 = require("./setup-authorization.js");
|
|
58
|
+
Object.defineProperty(exports, "setupAuthorizationForExpress", { enumerable: true, get: function () { return setup_authorization_js_1.setupAuthorizationForExpress; } });
|
|
59
|
+
var setup_event_system_js_1 = require("./setup-event-system.js");
|
|
60
|
+
Object.defineProperty(exports, "setupEventSystemForExpress", { enumerable: true, get: function () { return setup_event_system_js_1.setupEventSystemForExpress; } });
|
|
61
|
+
var setup_interceptors_js_1 = require("./setup-interceptors.js");
|
|
62
|
+
Object.defineProperty(exports, "setupInterceptorsForExpress", { enumerable: true, get: function () { return setup_interceptors_js_1.setupInterceptorsForExpress; } });
|
|
63
|
+
var setup_lazy_loading_js_1 = require("./setup-lazy-loading.js");
|
|
64
|
+
Object.defineProperty(exports, "setupLazyLoadingForExpress", { enumerable: true, get: function () { return setup_lazy_loading_js_1.setupLazyLoadingForExpress; } });
|
|
65
|
+
var lazy_module_middleware_js_1 = require("./lazy-module-middleware.js");
|
|
66
|
+
Object.defineProperty(exports, "createLazyModuleMiddleware", { enumerable: true, get: function () { return lazy_module_middleware_js_1.createLazyModuleMiddleware; } });
|
|
67
|
+
Object.defineProperty(exports, "createRouteMappings", { enumerable: true, get: function () { return lazy_module_middleware_js_1.createRouteMappings; } });
|
|
68
|
+
// Validation decorators
|
|
69
|
+
var validation_decorators_js_1 = require("./validation-decorators.js");
|
|
70
|
+
Object.defineProperty(exports, "validatedBody", { enumerable: true, get: function () { return validation_decorators_js_1.validatedBody; } });
|
|
71
|
+
Object.defineProperty(exports, "validatedQuery", { enumerable: true, get: function () { return validation_decorators_js_1.validatedQuery; } });
|
|
72
|
+
Object.defineProperty(exports, "validatedParam", { enumerable: true, get: function () { return validation_decorators_js_1.validatedParam; } });
|
|
73
|
+
Object.defineProperty(exports, "validatedHeaders", { enumerable: true, get: function () { return validation_decorators_js_1.validatedHeaders; } });
|
|
74
|
+
Object.defineProperty(exports, "Validate", { enumerable: true, get: function () { return validation_decorators_js_1.Validate; } });
|
|
75
|
+
Object.defineProperty(exports, "getValidationMetadata", { enumerable: true, get: function () { return validation_decorators_js_1.getValidationMetadata; } });
|
|
76
|
+
Object.defineProperty(exports, "hasValidationMetadata", { enumerable: true, get: function () { return validation_decorators_js_1.hasValidationMetadata; } });
|
|
77
|
+
// Validation service
|
|
78
|
+
var validation_service_js_1 = require("./validation-service.js");
|
|
79
|
+
Object.defineProperty(exports, "ValidationService", { enumerable: true, get: function () { return validation_service_js_1.ValidationService; } });
|
|
80
|
+
// Per-request HttpContext (replaces reflect-metadata for hot path)
|
|
81
|
+
var http_context_store_js_1 = require("./http-context-store.js");
|
|
82
|
+
Object.defineProperty(exports, "getHttpContext", { enumerable: true, get: function () { return http_context_store_js_1.getHttpContext; } });
|
|
83
|
+
Object.defineProperty(exports, "hasHttpContext", { enumerable: true, get: function () { return http_context_store_js_1.hasHttpContext; } });
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.InterceptorMiddleware = void 0;
|
|
16
|
+
exports.createInterceptorMiddleware = createInterceptorMiddleware;
|
|
17
|
+
const core_1 = require("@expressots/core");
|
|
18
|
+
const core_2 = require("@expressots/core");
|
|
19
|
+
require("reflect-metadata");
|
|
20
|
+
/**
|
|
21
|
+
* Express middleware that executes interceptors around route handler
|
|
22
|
+
*
|
|
23
|
+
* @layer internal
|
|
24
|
+
* @audience framework-developers
|
|
25
|
+
*
|
|
26
|
+
* @summary Quick Start
|
|
27
|
+
* InterceptorMiddleware integrates the interceptor system with Express.
|
|
28
|
+
* It wraps the route handler with interceptors defined via @UseInterceptors().
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
let InterceptorMiddleware = class InterceptorMiddleware {
|
|
33
|
+
constructor(executor, container) {
|
|
34
|
+
this.executor = executor;
|
|
35
|
+
this.container = container;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create middleware for a specific controller and method
|
|
39
|
+
* @param controllerClass - Controller class
|
|
40
|
+
* @param methodName - Method name
|
|
41
|
+
* @param handler - Original route handler
|
|
42
|
+
*/
|
|
43
|
+
createMiddleware(controllerClass, methodName, handler) {
|
|
44
|
+
return async (req, res, next) => {
|
|
45
|
+
// Get request ID for flow tracking
|
|
46
|
+
const requestContext = core_1.ContextManager.getCurrentContext();
|
|
47
|
+
const requestId = requestContext?.requestId;
|
|
48
|
+
const flowTracker = requestId ? (0, core_1.findFlowTracker)(requestId) : undefined;
|
|
49
|
+
// Extract interceptors from metadata
|
|
50
|
+
const interceptors = this.extractInterceptors(controllerClass, methodName);
|
|
51
|
+
if (interceptors.length === 0) {
|
|
52
|
+
// No interceptors, proceed directly
|
|
53
|
+
return handler(req, res, next)
|
|
54
|
+
.then(() => { })
|
|
55
|
+
.catch(next);
|
|
56
|
+
}
|
|
57
|
+
// Get interceptor names for tracking
|
|
58
|
+
const interceptorNames = interceptors.map((i) => {
|
|
59
|
+
if (typeof i === "function") {
|
|
60
|
+
return i.name || "UnknownInterceptor";
|
|
61
|
+
}
|
|
62
|
+
return i.constructor.name;
|
|
63
|
+
});
|
|
64
|
+
const interceptorStepName = `Interceptors: ${interceptorNames.join(", ")}`;
|
|
65
|
+
// Start tracking interceptor execution (using "middleware" type as interceptors are part of request pipeline)
|
|
66
|
+
if (flowTracker?.isEnabled()) {
|
|
67
|
+
flowTracker.startStep("middleware", interceptorStepName, {
|
|
68
|
+
interceptorCount: interceptors.length,
|
|
69
|
+
interceptorNames,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Create execution context
|
|
74
|
+
const context = (0, core_1.createExecutionContext)(req, res, this.container, controllerClass, String(methodName));
|
|
75
|
+
// Execute interceptors with handler
|
|
76
|
+
const result = await this.executor.execute(interceptors, context, async () => {
|
|
77
|
+
// This is the actual handler execution
|
|
78
|
+
const handlerResult = await handler(req, res, next);
|
|
79
|
+
return handlerResult;
|
|
80
|
+
});
|
|
81
|
+
// End interceptor step with success
|
|
82
|
+
if (flowTracker?.isEnabled()) {
|
|
83
|
+
flowTracker.endStep("success");
|
|
84
|
+
}
|
|
85
|
+
// If handler hasn't sent response and we have a result, set it
|
|
86
|
+
if (!res.headersSent && result !== undefined) {
|
|
87
|
+
// Store result for response handling
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
req.__expressotsInterceptorResult = result;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
// End interceptor step with failure
|
|
94
|
+
if (flowTracker?.isEnabled()) {
|
|
95
|
+
flowTracker.failStep(error instanceof Error ? error : undefined);
|
|
96
|
+
}
|
|
97
|
+
next(error);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extract interceptors from controller and method metadata
|
|
103
|
+
* @private
|
|
104
|
+
*/
|
|
105
|
+
extractInterceptors(controllerClass, methodName) {
|
|
106
|
+
// Get controller-level interceptors
|
|
107
|
+
const controllerInterceptors = Reflect.getMetadata(core_2.INTERCEPTOR_METADATA_KEY.controllerInterceptors, controllerClass) || [];
|
|
108
|
+
// Get method-level interceptors
|
|
109
|
+
const methodInterceptors = Reflect.getMetadata(core_2.INTERCEPTOR_METADATA_KEY.methodInterceptors, controllerClass, methodName) || [];
|
|
110
|
+
// Combine: controller + method level
|
|
111
|
+
return [...controllerInterceptors, ...methodInterceptors];
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
exports.InterceptorMiddleware = InterceptorMiddleware;
|
|
115
|
+
exports.InterceptorMiddleware = InterceptorMiddleware = __decorate([
|
|
116
|
+
(0, core_1.injectable)(),
|
|
117
|
+
__param(0, (0, core_1.inject)(core_1.InterceptorExecutor)),
|
|
118
|
+
__param(1, (0, core_1.inject)(core_1.Container)),
|
|
119
|
+
__metadata("design:paramtypes", [core_1.InterceptorExecutor,
|
|
120
|
+
core_1.Container])
|
|
121
|
+
], InterceptorMiddleware);
|
|
122
|
+
/**
|
|
123
|
+
* Factory function to create interceptor middleware
|
|
124
|
+
* @param container - DI container
|
|
125
|
+
* @param controllerClass - Controller class
|
|
126
|
+
* @param methodName - Method name
|
|
127
|
+
* @param handler - Original handler
|
|
128
|
+
*/
|
|
129
|
+
function createInterceptorMiddleware(container, controllerClass, methodName, handler) {
|
|
130
|
+
const middleware = container.get(InterceptorMiddleware);
|
|
131
|
+
return middleware.createMiddleware(controllerClass, methodName, handler);
|
|
132
|
+
}
|