@expressots/adapter-express 3.0.0 → 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 +31 -5
- 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,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Service
|
|
3
|
+
* @module @expressots/adapter-express
|
|
4
|
+
*
|
|
5
|
+
* Service for validating request parameters using the Smart Validation System.
|
|
6
|
+
* Integrates with the route handler to automatically validate parameters.
|
|
7
|
+
*/
|
|
8
|
+
import type { Request, Response } from "express";
|
|
9
|
+
import { ValidationRegistry, SmartFieldDetector, HelpfulErrorFormatter, ValidationResult, ValidationConfig } from "@expressots/core";
|
|
10
|
+
import { ValidationSchemaMetadata } from "./validation-decorators.js";
|
|
11
|
+
import type { NewableFunction } from "./interfaces.js";
|
|
12
|
+
/**
|
|
13
|
+
* Validation Service
|
|
14
|
+
*
|
|
15
|
+
* Handles validation of request parameters (body, query, params, headers)
|
|
16
|
+
* using the configured validation adapters and smart field detection.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ValidationService {
|
|
19
|
+
private registry;
|
|
20
|
+
private smartDetector;
|
|
21
|
+
private errorFormatter;
|
|
22
|
+
private enabled;
|
|
23
|
+
private config;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Enable the validation service with the given configuration
|
|
27
|
+
* @param config - Validation configuration
|
|
28
|
+
*/
|
|
29
|
+
enable(config?: ValidationConfig): void;
|
|
30
|
+
/**
|
|
31
|
+
* Register built-in validation adapters
|
|
32
|
+
* Additional adapters (Zod, Yup, Joi) can be registered via config.adapters
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
private registerBuiltInAdapters;
|
|
36
|
+
/**
|
|
37
|
+
* Disable the validation service
|
|
38
|
+
*/
|
|
39
|
+
disable(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if validation is enabled
|
|
42
|
+
*/
|
|
43
|
+
isEnabled(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Get the validation registry for adapter management
|
|
46
|
+
*/
|
|
47
|
+
getRegistry(): ValidationRegistry;
|
|
48
|
+
/**
|
|
49
|
+
* Get the smart field detector
|
|
50
|
+
*/
|
|
51
|
+
getSmartDetector(): SmartFieldDetector;
|
|
52
|
+
/**
|
|
53
|
+
* Get the error formatter
|
|
54
|
+
*/
|
|
55
|
+
getErrorFormatter(): HelpfulErrorFormatter;
|
|
56
|
+
/**
|
|
57
|
+
* Validate request parameters based on controller method metadata
|
|
58
|
+
* @param req - Express request
|
|
59
|
+
* @param res - Express response
|
|
60
|
+
* @param controllerConstructor - Controller class constructor
|
|
61
|
+
* @param methodName - Method name
|
|
62
|
+
* @param args - Current parameter values
|
|
63
|
+
* @returns Validated and transformed arguments, or null if validation failed (response sent)
|
|
64
|
+
*/
|
|
65
|
+
validateParameters(req: Request, res: Response, controllerConstructor: NewableFunction, methodName: string, args: Array<unknown>): Promise<Array<unknown> | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Infer validation metadata from TypeScript type information
|
|
68
|
+
* Uses reflect-metadata to get parameter types and automatically
|
|
69
|
+
* detect class-validator DTOs or Zod schemas
|
|
70
|
+
*/
|
|
71
|
+
private inferValidationFromTypes;
|
|
72
|
+
/**
|
|
73
|
+
* Validate a single value against a schema
|
|
74
|
+
*/
|
|
75
|
+
validateValue(value: unknown, metadata: ValidationSchemaMetadata): Promise<ValidationResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Get the parameter value from the request
|
|
78
|
+
*/
|
|
79
|
+
private getParameterValue;
|
|
80
|
+
/**
|
|
81
|
+
* Validate request data using smart field detection
|
|
82
|
+
*/
|
|
83
|
+
private validateWithSmartDetection;
|
|
84
|
+
/**
|
|
85
|
+
* Send validation error response
|
|
86
|
+
*/
|
|
87
|
+
private sendValidationError;
|
|
88
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export * from "./express-utils";
|
|
2
|
-
export { AppExpress } from "./application-express";
|
|
3
|
-
export * from "./micro-api";
|
|
1
|
+
export * from "./express-utils/index.js";
|
|
2
|
+
export { AppExpress } from "./application-express.js";
|
|
3
|
+
export * from "./micro-api/index.js";
|
|
4
4
|
export { IWebServerPublic, IWebServer, IWebServerConstructor, Environment, IEnvironment, RenderEngine, } from "@expressots/shared";
|
|
5
|
-
export * from "./render";
|
|
5
|
+
export * from "./render/index.js";
|
|
6
|
+
export * from "./middleware/index.js";
|
|
7
|
+
export * from "./studio/index.js";
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import express from "express";
|
|
2
|
-
import { Middleware } from "../express-utils/interfaces";
|
|
2
|
+
import { Middleware } from "../express-utils/interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Handler function that can return a value to be sent as response
|
|
5
|
+
*/
|
|
6
|
+
type MicroRouteHandler = (req: express.Request, res: express.Response, next: express.NextFunction) => unknown | Promise<unknown>;
|
|
3
7
|
type RouteDefinition = {
|
|
4
8
|
method: "get" | "post" | "put" | "patch" | "delete";
|
|
5
9
|
path: string;
|
|
6
|
-
handler:
|
|
10
|
+
handler: MicroRouteHandler;
|
|
7
11
|
middleware: Array<Middleware>;
|
|
8
12
|
};
|
|
9
13
|
/**
|
|
@@ -11,12 +15,12 @@ type RouteDefinition = {
|
|
|
11
15
|
* @public API
|
|
12
16
|
*/
|
|
13
17
|
export interface IRoute {
|
|
14
|
-
define(method: "get" | "post" | "put" | "delete" | "patch", path: string, handler:
|
|
15
|
-
get(path: string, handler:
|
|
16
|
-
post(path: string, handler:
|
|
17
|
-
put(path: string, handler:
|
|
18
|
-
delete(path: string, handler:
|
|
19
|
-
patch(path: string, handler:
|
|
18
|
+
define(method: "get" | "post" | "put" | "delete" | "patch", path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
19
|
+
get(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
20
|
+
post(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
21
|
+
put(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
22
|
+
delete(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
23
|
+
patch(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
20
24
|
}
|
|
21
25
|
export declare class Route implements IRoute {
|
|
22
26
|
private logger;
|
|
@@ -38,7 +42,7 @@ export declare class Route implements IRoute {
|
|
|
38
42
|
* @param middleware - Route middleware
|
|
39
43
|
* @public API
|
|
40
44
|
*/
|
|
41
|
-
define(method: "get" | "post" | "put" | "delete" | "patch", path: string, handler:
|
|
45
|
+
define(method: "get" | "post" | "put" | "delete" | "patch", path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
42
46
|
/**
|
|
43
47
|
* Define a GET route
|
|
44
48
|
* @param path - Route path
|
|
@@ -46,7 +50,7 @@ export declare class Route implements IRoute {
|
|
|
46
50
|
* @param middleware - Route middleware
|
|
47
51
|
* @public API
|
|
48
52
|
*/
|
|
49
|
-
get(path: string, handler:
|
|
53
|
+
get(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
50
54
|
/**
|
|
51
55
|
* Define a POST route
|
|
52
56
|
* @param path - Route path
|
|
@@ -54,7 +58,7 @@ export declare class Route implements IRoute {
|
|
|
54
58
|
* @param middleware - Route middleware
|
|
55
59
|
* @public API
|
|
56
60
|
*/
|
|
57
|
-
post(path: string, handler:
|
|
61
|
+
post(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
58
62
|
/**
|
|
59
63
|
* Define a PUT route
|
|
60
64
|
* @param path - Route path
|
|
@@ -62,7 +66,7 @@ export declare class Route implements IRoute {
|
|
|
62
66
|
* @param middleware - Route middleware
|
|
63
67
|
* @public API
|
|
64
68
|
*/
|
|
65
|
-
put(path: string, handler:
|
|
69
|
+
put(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
66
70
|
/**
|
|
67
71
|
* Define a DELETE route
|
|
68
72
|
* @param path - Route path
|
|
@@ -70,7 +74,7 @@ export declare class Route implements IRoute {
|
|
|
70
74
|
* @param middleware - Route middleware
|
|
71
75
|
* @public API
|
|
72
76
|
*/
|
|
73
|
-
delete(path: string, handler:
|
|
77
|
+
delete(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
74
78
|
/**
|
|
75
79
|
* Define a PATCH route
|
|
76
80
|
* @param path - Route path
|
|
@@ -78,7 +82,14 @@ export declare class Route implements IRoute {
|
|
|
78
82
|
* @param middleware - Route middleware
|
|
79
83
|
* @public API
|
|
80
84
|
*/
|
|
81
|
-
patch(path: string, handler:
|
|
85
|
+
patch(path: string, handler: MicroRouteHandler, ...middleware: Array<Middleware>): void;
|
|
86
|
+
/**
|
|
87
|
+
* Wrap a handler to automatically send return values as response
|
|
88
|
+
* @param handler - The original handler
|
|
89
|
+
* @returns Wrapped Express request handler
|
|
90
|
+
* @private
|
|
91
|
+
*/
|
|
92
|
+
private wrapHandler;
|
|
82
93
|
/**
|
|
83
94
|
* Apply the routes to the Express application
|
|
84
95
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { IMiddleware, interfaces } from "@expressots/core";
|
|
2
|
-
import {
|
|
2
|
+
import { IConsoleMessage } from "@expressots/shared";
|
|
3
3
|
import { Server } from "http";
|
|
4
|
-
import { IIOC } from "./application-express-micro-container";
|
|
5
|
-
import { IRoute } from "./application-express-micro-route";
|
|
4
|
+
import { IIOC } from "./application-express-micro-container.js";
|
|
5
|
+
import { IRoute } from "./application-express-micro-route.js";
|
|
6
6
|
/**
|
|
7
7
|
* Configuration options for the Express Micro API adapter
|
|
8
8
|
* @public API
|
|
@@ -14,13 +14,6 @@ export type MicroAPIConfig = {
|
|
|
14
14
|
* Interface for the Create Method of Express Micro API adapter
|
|
15
15
|
*/
|
|
16
16
|
export interface ICreateMicroAPI {
|
|
17
|
-
/**
|
|
18
|
-
* Initialize the environment for the application
|
|
19
|
-
* @param environment - The environment to initialize
|
|
20
|
-
* @param options - Options for the environment initialization
|
|
21
|
-
* @public API
|
|
22
|
-
*/
|
|
23
|
-
initEnvironment(environment: Env.Environment, options?: Env.IEnvironment): void;
|
|
24
17
|
/**
|
|
25
18
|
* Set the global route prefix
|
|
26
19
|
* @param prefix - The global route prefix
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker States
|
|
3
|
+
*/
|
|
4
|
+
export type CircuitState = "CLOSED" | "OPEN" | "HALF_OPEN";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for CircuitBreaker
|
|
7
|
+
*/
|
|
8
|
+
export interface CircuitBreakerConfig {
|
|
9
|
+
/** Number of failures before opening the circuit (default: 5) */
|
|
10
|
+
failureThreshold?: number;
|
|
11
|
+
/** Number of successes in half-open state to close circuit (default: 2) */
|
|
12
|
+
successThreshold?: number;
|
|
13
|
+
/** Time in ms before attempting to close an open circuit (default: 60000) */
|
|
14
|
+
timeout?: number;
|
|
15
|
+
/** Monitoring period in ms for failure counting (default: 10000) */
|
|
16
|
+
monitoringPeriod?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Circuit Breaker Statistics
|
|
20
|
+
*/
|
|
21
|
+
export interface CircuitBreakerStats {
|
|
22
|
+
state: CircuitState;
|
|
23
|
+
failures: number;
|
|
24
|
+
successes: number;
|
|
25
|
+
totalCalls: number;
|
|
26
|
+
lastFailure?: Date;
|
|
27
|
+
lastSuccess?: Date;
|
|
28
|
+
openedAt?: Date;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* CircuitBreaker - Protect against cascading failures in distributed systems.
|
|
32
|
+
*
|
|
33
|
+
* States:
|
|
34
|
+
* - CLOSED: Normal operation, requests pass through
|
|
35
|
+
* - OPEN: Requests fail immediately without calling the service
|
|
36
|
+
* - HALF_OPEN: Limited requests pass through to test if service recovered
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const circuitBreaker = new CircuitBreaker({
|
|
41
|
+
* failureThreshold: 5,
|
|
42
|
+
* timeout: 60000,
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* app.Route.get("/external-api", async (req, res) => {
|
|
46
|
+
* try {
|
|
47
|
+
* const result = await circuitBreaker.execute(async () => {
|
|
48
|
+
* return await fetch("https://external-api.com/data");
|
|
49
|
+
* });
|
|
50
|
+
* res.json(await result.json());
|
|
51
|
+
* } catch (error) {
|
|
52
|
+
* if (error.message === "Circuit breaker is OPEN") {
|
|
53
|
+
* res.status(503).json({ error: "Service temporarily unavailable" });
|
|
54
|
+
* } else {
|
|
55
|
+
* res.status(500).json({ error: error.message });
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare class CircuitBreaker {
|
|
62
|
+
private state;
|
|
63
|
+
private failures;
|
|
64
|
+
private successes;
|
|
65
|
+
private totalSuccesses;
|
|
66
|
+
private totalCalls;
|
|
67
|
+
private lastFailure?;
|
|
68
|
+
private lastSuccess?;
|
|
69
|
+
private openedAt?;
|
|
70
|
+
private recentFailures;
|
|
71
|
+
private config;
|
|
72
|
+
constructor(config?: CircuitBreakerConfig);
|
|
73
|
+
/**
|
|
74
|
+
* Execute a function with circuit breaker protection
|
|
75
|
+
* @param fn - Function to execute
|
|
76
|
+
* @throws Error if circuit is open
|
|
77
|
+
*/
|
|
78
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
79
|
+
/**
|
|
80
|
+
* Get current circuit state
|
|
81
|
+
*/
|
|
82
|
+
getState(): CircuitState;
|
|
83
|
+
/**
|
|
84
|
+
* Get circuit breaker statistics
|
|
85
|
+
*/
|
|
86
|
+
getStats(): CircuitBreakerStats;
|
|
87
|
+
/**
|
|
88
|
+
* Manually reset the circuit breaker
|
|
89
|
+
*/
|
|
90
|
+
reset(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Manually open the circuit
|
|
93
|
+
*/
|
|
94
|
+
open(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Handle successful call
|
|
97
|
+
*/
|
|
98
|
+
private onSuccess;
|
|
99
|
+
/**
|
|
100
|
+
* Handle failed call
|
|
101
|
+
*/
|
|
102
|
+
private onFailure;
|
|
103
|
+
/**
|
|
104
|
+
* Check if timeout has passed and we should try to reset
|
|
105
|
+
*/
|
|
106
|
+
private shouldAttemptReset;
|
|
107
|
+
/**
|
|
108
|
+
* Remove failures outside the monitoring period
|
|
109
|
+
*/
|
|
110
|
+
private cleanupRecentFailures;
|
|
111
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Gateway Utilities for ExpressoTS Micro Template
|
|
3
|
+
*/
|
|
4
|
+
export { CircuitBreaker, type CircuitBreakerConfig, type CircuitBreakerStats, type CircuitState, } from "./circuit-breaker.js";
|
|
5
|
+
export { ServiceProxy, createProxy, type ServiceProxyConfig } from "./service-proxy.js";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import { CircuitBreaker, CircuitBreakerConfig } from "./circuit-breaker.js";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for ServiceProxy
|
|
5
|
+
*/
|
|
6
|
+
export interface ServiceProxyConfig {
|
|
7
|
+
/** Target service URL */
|
|
8
|
+
target: string;
|
|
9
|
+
/** Request timeout in ms (default: 30000) */
|
|
10
|
+
timeout?: number;
|
|
11
|
+
/** Number of retries on failure (default: 0) */
|
|
12
|
+
retries?: number;
|
|
13
|
+
/** Additional headers to add to proxied requests */
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
/** Path rewrite function */
|
|
16
|
+
pathRewrite?: (path: string) => string;
|
|
17
|
+
/** Enable circuit breaker (default: false) */
|
|
18
|
+
circuitBreaker?: boolean | CircuitBreakerConfig;
|
|
19
|
+
/** Log requests (default: false) */
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* ServiceProxy - Proxy requests to other microservices.
|
|
24
|
+
*
|
|
25
|
+
* Features:
|
|
26
|
+
* - Automatic request forwarding
|
|
27
|
+
* - Path rewriting
|
|
28
|
+
* - Custom headers
|
|
29
|
+
* - Request timeout
|
|
30
|
+
* - Retry support
|
|
31
|
+
* - Optional circuit breaker integration
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // Proxy to user service
|
|
36
|
+
* const userProxy = createProxy({
|
|
37
|
+
* target: "http://user-service:3001",
|
|
38
|
+
* pathRewrite: (path) => path.replace("/api/users", ""),
|
|
39
|
+
* timeout: 5000,
|
|
40
|
+
* retries: 3,
|
|
41
|
+
* circuitBreaker: true,
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* app.Route.get("/api/users/*", userProxy.handler());
|
|
45
|
+
* app.Route.post("/api/users/*", userProxy.handler());
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class ServiceProxy {
|
|
49
|
+
private config;
|
|
50
|
+
constructor(config: ServiceProxyConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Create an Express handler for proxying requests
|
|
53
|
+
*/
|
|
54
|
+
handler(): (req: Request, res: Response, next: NextFunction) => void;
|
|
55
|
+
/**
|
|
56
|
+
* Proxy a request to the target service
|
|
57
|
+
*/
|
|
58
|
+
private proxyRequest;
|
|
59
|
+
/**
|
|
60
|
+
* Execute request with retry logic
|
|
61
|
+
*/
|
|
62
|
+
private executeWithRetry;
|
|
63
|
+
/**
|
|
64
|
+
* Execute a single request
|
|
65
|
+
*/
|
|
66
|
+
private executeRequest;
|
|
67
|
+
/**
|
|
68
|
+
* Extract relevant headers from incoming request
|
|
69
|
+
*/
|
|
70
|
+
private extractHeaders;
|
|
71
|
+
/**
|
|
72
|
+
* Delay helper
|
|
73
|
+
*/
|
|
74
|
+
private delay;
|
|
75
|
+
/**
|
|
76
|
+
* Get circuit breaker stats (if enabled)
|
|
77
|
+
*/
|
|
78
|
+
getCircuitBreakerStats(): ReturnType<CircuitBreaker["getStats"]> | undefined;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create a new service proxy
|
|
82
|
+
*/
|
|
83
|
+
export declare function createProxy(config: ServiceProxyConfig): ServiceProxy;
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { micro, type MicroApp, type MicroConfig } from "./micro.js";
|
|
2
|
+
export * from "./gateway/index.js";
|
|
3
|
+
export * from "./service-mesh/index.js";
|
|
4
|
+
export * from "./serverless/index.js";
|
|
5
|
+
export * from "./queue/index.js";
|
|
6
|
+
/** @deprecated Use micro() instead */
|
|
7
|
+
export { createMicroAPI, MicroAPIConfig } from "./application-express-micro.js";
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { IConsoleMessage } from "@expressots/shared";
|
|
2
|
+
import express from "express";
|
|
3
|
+
import { Server } from "http";
|
|
4
|
+
/**
|
|
5
|
+
* Minimal configuration for micro API
|
|
6
|
+
* @public API
|
|
7
|
+
*/
|
|
8
|
+
export interface MicroConfig {
|
|
9
|
+
/** Disable automatic JSON parsing (default: true) */
|
|
10
|
+
autoParseJson?: boolean;
|
|
11
|
+
/** Global route prefix (e.g., "/api") */
|
|
12
|
+
globalPrefix?: string;
|
|
13
|
+
/** Show startup banner (default: true) */
|
|
14
|
+
showBanner?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Route handler that can return a value or use res directly
|
|
18
|
+
*/
|
|
19
|
+
type RouteHandler = (req: express.Request, res: express.Response, next: express.NextFunction) => unknown | Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* Middleware type (Express-compatible)
|
|
22
|
+
*/
|
|
23
|
+
type Middleware = express.RequestHandler | express.ErrorRequestHandler;
|
|
24
|
+
/**
|
|
25
|
+
* Pure simplicity micro API interface
|
|
26
|
+
* @public API
|
|
27
|
+
*/
|
|
28
|
+
export interface MicroApp {
|
|
29
|
+
/** Register a GET route */
|
|
30
|
+
get(path: string, ...handlers: [...Array<Middleware>, RouteHandler]): this;
|
|
31
|
+
/** Register a POST route */
|
|
32
|
+
post(path: string, ...handlers: [...Array<Middleware>, RouteHandler]): this;
|
|
33
|
+
/** Register a PUT route */
|
|
34
|
+
put(path: string, ...handlers: [...Array<Middleware>, RouteHandler]): this;
|
|
35
|
+
/** Register a PATCH route */
|
|
36
|
+
patch(path: string, ...handlers: [...Array<Middleware>, RouteHandler]): this;
|
|
37
|
+
/** Register a DELETE route */
|
|
38
|
+
delete(path: string, ...handlers: [...Array<Middleware>, RouteHandler]): this;
|
|
39
|
+
/** Add global middleware */
|
|
40
|
+
use(...middleware: Array<Middleware>): this;
|
|
41
|
+
use(path: string, ...middleware: Array<Middleware>): this;
|
|
42
|
+
/** Set custom error handler */
|
|
43
|
+
setErrorHandler(handler: express.ErrorRequestHandler): this;
|
|
44
|
+
/** Start listening for requests */
|
|
45
|
+
listen(port: number | string, appInfo?: IConsoleMessage): Promise<void>;
|
|
46
|
+
/** Get the underlying HTTP server (available after listen) */
|
|
47
|
+
getHttpServer(): Server;
|
|
48
|
+
/** Get the Express app instance (for advanced use) */
|
|
49
|
+
getApp(): express.Application;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a new micro API instance
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const app = micro();
|
|
57
|
+
* app.get("/", () => "Hello World");
|
|
58
|
+
* app.listen(3000);
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @param config - Optional configuration
|
|
62
|
+
* @returns MicroApp instance
|
|
63
|
+
* @public API
|
|
64
|
+
*/
|
|
65
|
+
export declare function micro(config?: MicroConfig): MicroApp;
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue Integration for ExpressoTS Micro Template
|
|
3
|
+
*/
|
|
4
|
+
export { type QueueMessage, type MessageHandler, type QueueConsumerConfig, type IQueueConsumer, type QueueStats, } from "./queue.interface.js";
|
|
5
|
+
export { RabbitMQConsumer, type RabbitMQConfig } from "./rabbitmq-consumer.js";
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message format for queue consumers
|
|
3
|
+
*/
|
|
4
|
+
export interface QueueMessage<T = unknown> {
|
|
5
|
+
/** Unique message ID */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Message body */
|
|
8
|
+
body: T;
|
|
9
|
+
/** Message headers/attributes */
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
/** Timestamp when message was published */
|
|
12
|
+
timestamp: Date;
|
|
13
|
+
/** Number of times message has been received */
|
|
14
|
+
receiveCount?: number;
|
|
15
|
+
/** Original raw message */
|
|
16
|
+
raw?: unknown;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Handler function for processing queue messages
|
|
20
|
+
*/
|
|
21
|
+
export type MessageHandler<T = unknown> = (message: QueueMessage<T>) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Base configuration for queue consumers
|
|
24
|
+
*/
|
|
25
|
+
export interface QueueConsumerConfig {
|
|
26
|
+
/** Queue/topic name */
|
|
27
|
+
queue: string;
|
|
28
|
+
/** Connection URL */
|
|
29
|
+
url?: string;
|
|
30
|
+
/** Number of concurrent message handlers (default: 1) */
|
|
31
|
+
concurrency?: number;
|
|
32
|
+
/** Auto-acknowledge messages (default: true) */
|
|
33
|
+
autoAck?: boolean;
|
|
34
|
+
/** Enable debug logging (default: false) */
|
|
35
|
+
debug?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Queue consumer interface
|
|
39
|
+
*/
|
|
40
|
+
export interface IQueueConsumer<T = unknown> {
|
|
41
|
+
/** Start consuming messages */
|
|
42
|
+
consume(handler: MessageHandler<T>): Promise<void>;
|
|
43
|
+
/** Publish a message to the queue */
|
|
44
|
+
publish(message: T): Promise<void>;
|
|
45
|
+
/** Stop consuming and close connection */
|
|
46
|
+
close(): Promise<void>;
|
|
47
|
+
/** Get consumer stats */
|
|
48
|
+
getStats(): QueueStats;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Queue statistics
|
|
52
|
+
*/
|
|
53
|
+
export interface QueueStats {
|
|
54
|
+
messagesReceived: number;
|
|
55
|
+
messagesProcessed: number;
|
|
56
|
+
messagesFailed: number;
|
|
57
|
+
messagesPublished: number;
|
|
58
|
+
isConnected: boolean;
|
|
59
|
+
lastMessageAt?: Date;
|
|
60
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { IQueueConsumer, MessageHandler, QueueConsumerConfig, QueueStats } from "./queue.interface.js";
|
|
2
|
+
/**
|
|
3
|
+
* RabbitMQ-specific configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface RabbitMQConfig extends QueueConsumerConfig {
|
|
6
|
+
/** RabbitMQ connection URL */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Exchange name (optional) */
|
|
9
|
+
exchange?: string;
|
|
10
|
+
/** Exchange type (default: "direct") */
|
|
11
|
+
exchangeType?: "direct" | "topic" | "fanout" | "headers";
|
|
12
|
+
/** Routing key for publishing */
|
|
13
|
+
routingKey?: string;
|
|
14
|
+
/** Prefetch count (default: 1) */
|
|
15
|
+
prefetch?: number;
|
|
16
|
+
/** Enable durable queue (default: true) */
|
|
17
|
+
durable?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* RabbitMQ Consumer - Message queue consumer for RabbitMQ.
|
|
21
|
+
*
|
|
22
|
+
* Features:
|
|
23
|
+
* - Message consumption with handlers
|
|
24
|
+
* - Message publishing
|
|
25
|
+
* - Exchange support
|
|
26
|
+
* - Automatic reconnection
|
|
27
|
+
* - Prefetch control
|
|
28
|
+
* - Dead letter queue support
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const orderQueue = new RabbitMQConsumer({
|
|
33
|
+
* url: process.env.RABBITMQ_URL,
|
|
34
|
+
* queue: "orders",
|
|
35
|
+
* prefetch: 10,
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Start consuming
|
|
39
|
+
* await orderQueue.consume(async (message) => {
|
|
40
|
+
* const order = message.body;
|
|
41
|
+
* console.log("Processing order:", order.id);
|
|
42
|
+
* await processOrder(order);
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* // Publish from HTTP endpoint
|
|
46
|
+
* app.Route.post("/orders", async (req, res) => {
|
|
47
|
+
* await orderQueue.publish(req.body);
|
|
48
|
+
* res.status(202).json({ message: "Order queued" });
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* // Graceful shutdown
|
|
52
|
+
* process.on("SIGTERM", async () => {
|
|
53
|
+
* await orderQueue.close();
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* Note: This implementation requires the 'amqplib' package.
|
|
58
|
+
* Install with: npm install amqplib @types/amqplib
|
|
59
|
+
*/
|
|
60
|
+
export declare class RabbitMQConsumer<T = unknown> implements IQueueConsumer<T> {
|
|
61
|
+
private connection;
|
|
62
|
+
private channel;
|
|
63
|
+
private config;
|
|
64
|
+
private stats;
|
|
65
|
+
constructor(config: RabbitMQConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Connect to RabbitMQ
|
|
68
|
+
*/
|
|
69
|
+
private connect;
|
|
70
|
+
/**
|
|
71
|
+
* Start consuming messages
|
|
72
|
+
*/
|
|
73
|
+
consume(handler: MessageHandler<T>): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Publish a message to the queue
|
|
76
|
+
*/
|
|
77
|
+
publish(message: T): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Close the connection
|
|
80
|
+
*/
|
|
81
|
+
close(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Get consumer statistics
|
|
84
|
+
*/
|
|
85
|
+
getStats(): QueueStats;
|
|
86
|
+
}
|