@stacksjs/bun-router 0.0.4 → 0.0.6
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 +2 -2
- package/dist/auth.d.ts +134 -0
- package/dist/cache/lru-cache.d.ts +139 -0
- package/dist/cache/middleware-memoization.d.ts +151 -0
- package/dist/cache/route-cache-warmer.d.ts +161 -0
- package/dist/cache/sqlite-cache.d.ts +209 -0
- package/dist/cache/streaming-cache.d.ts +132 -0
- package/dist/chunk-jhsk5c5b.js +15758 -0
- package/dist/cli/colors.d.ts +15 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/middleware.d.ts +31 -0
- package/dist/cli/openapi.d.ts +17 -0
- package/dist/cli/router.d.ts +15 -0
- package/dist/cli/routes.d.ts +29 -0
- package/dist/cli/utils.d.ts +74 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -2
- package/dist/config.d.ts +7 -0
- package/dist/container/container.d.ts +273 -0
- package/dist/container/contextual-binding.d.ts +240 -0
- package/dist/container/decorators.d.ts +141 -0
- package/dist/container/service-provider.d.ts +285 -0
- package/dist/development/hot-reload.d.ts +187 -0
- package/dist/development/index.d.ts +167 -0
- package/dist/development/performance-profiler.d.ts +217 -0
- package/dist/development/route-debugger.d.ts +154 -0
- package/dist/development/route-inspector.d.ts +211 -0
- package/dist/development/typescript-utilities.d.ts +209 -0
- package/dist/docs.d.ts +11 -0
- package/dist/errors/circuit-breaker.d.ts +195 -0
- package/dist/errors/error-handler.d.ts +88 -0
- package/dist/errors/error-reporting.d.ts +144 -0
- package/dist/errors/exceptions.d.ts +184 -0
- package/dist/errors/graceful-degradation.d.ts +154 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/router-errors.d.ts +110 -0
- package/dist/file-serving/static-files.d.ts +143 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -206
- package/dist/middleware/auth.d.ts +63 -0
- package/dist/middleware/content_security_policy.d.ts +53 -0
- package/dist/middleware/cors.d.ts +5 -0
- package/dist/middleware/csrf.d.ts +7 -0
- package/dist/middleware/ddos_protection.d.ts +39 -0
- package/dist/middleware/file_security.d.ts +26 -0
- package/dist/middleware/file_upload.d.ts +38 -0
- package/dist/middleware/helmet.d.ts +54 -0
- package/dist/middleware/index.d.ts +44 -0
- package/dist/middleware/input_validation.d.ts +45 -0
- package/dist/middleware/json_body.d.ts +4 -0
- package/dist/middleware/performance_alerting.d.ts +87 -0
- package/dist/middleware/performance_dashboard.d.ts +87 -0
- package/dist/middleware/performance_monitor.d.ts +209 -0
- package/dist/middleware/pipeline.d.ts +131 -0
- package/dist/middleware/rate_limit.d.ts +36 -0
- package/dist/middleware/request_id.d.ts +4 -0
- package/dist/middleware/request_signing.d.ts +153 -0
- package/dist/middleware/request_tracer.d.ts +72 -0
- package/dist/middleware/response_cache.d.ts +97 -0
- package/dist/middleware/security.d.ts +69 -0
- package/dist/middleware/security_suite.d.ts +46 -0
- package/dist/middleware/session.d.ts +23 -0
- package/dist/model-binding/index.d.ts +2 -0
- package/dist/model-binding/model-middleware.d.ts +118 -0
- package/dist/model-binding/model-registry.d.ts +164 -0
- package/dist/model-binding.d.ts +185 -0
- package/dist/model-resolver-factory.d.ts +31 -0
- package/dist/observability/correlation.d.ts +187 -0
- package/dist/observability/health-checks.d.ts +186 -0
- package/dist/observability/index.d.ts +60 -0
- package/dist/observability/integration.d.ts +147 -0
- package/dist/observability/metrics.d.ts +184 -0
- package/dist/observability/tracing.d.ts +187 -0
- package/dist/optimization/bun-utilities.d.ts +224 -0
- package/dist/query-builder-integration.d.ts +36 -0
- package/dist/request/context.d.ts +34 -0
- package/dist/request/enhanced-request.d.ts +213 -0
- package/dist/request/macros.d.ts +300 -0
- package/dist/response/macros.d.ts +245 -0
- package/dist/response/response-factory.d.ts +133 -0
- package/dist/router/api-routes.d.ts +5 -0
- package/dist/router/file-based-routing.d.ts +118 -0
- package/dist/router/file-streaming.d.ts +5 -0
- package/dist/router/fluent-router.d.ts +315 -0
- package/dist/router/fluent-routing.d.ts +271 -0
- package/dist/router/group-organization.d.ts +5 -0
- package/dist/router/handler-resolver.d.ts +24 -0
- package/dist/router/http-methods.d.ts +10 -0
- package/dist/router/index.d.ts +113 -0
- package/dist/router/middleware-groups.d.ts +94 -0
- package/dist/router/middleware-integration.d.ts +112 -0
- package/dist/router/middleware.d.ts +5 -0
- package/dist/router/model-binding.d.ts +5 -0
- package/dist/router/optimized-route-matching.d.ts +6 -0
- package/dist/router/route-building.d.ts +5 -0
- package/dist/router/route-compiler.d.ts +153 -0
- package/dist/router/route-matching.d.ts +5 -0
- package/dist/router/route-trie.d.ts +114 -0
- package/dist/router/router.d.ts +276 -0
- package/dist/router/server.d.ts +5 -0
- package/dist/router/validation-integration.d.ts +170 -0
- package/dist/router/view-rendering.d.ts +5 -0
- package/dist/router/websocket.d.ts +5 -0
- package/dist/routing/route-caching.d.ts +129 -0
- package/dist/routing/route-throttling.d.ts +150 -0
- package/dist/routing/subdomain-routing.d.ts +206 -0
- package/dist/session/database-store.d.ts +51 -0
- package/dist/session/file-store.d.ts +22 -0
- package/dist/session/index.d.ts +106 -0
- package/dist/session/memory-store.d.ts +21 -0
- package/dist/session/redis-store.d.ts +31 -0
- package/dist/streaming/index.d.ts +3 -0
- package/dist/streaming/sse-handler.d.ts +138 -0
- package/dist/streaming/stream-handler.d.ts +114 -0
- package/dist/testing/auth-testing.d.ts +156 -0
- package/dist/testing/file-upload-testing.d.ts +190 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/middleware-testing.d.ts +138 -0
- package/dist/testing/model-binding-testing.d.ts +186 -0
- package/dist/testing/performance-testing.d.ts +235 -0
- package/dist/testing/test-client.d.ts +117 -0
- package/dist/testing/test-request.d.ts +85 -0
- package/dist/testing/test-response.d.ts +90 -0
- package/dist/testing/types.d.ts +207 -0
- package/dist/testing/websocket-testing.d.ts +227 -0
- package/dist/types/controller-types.d.ts +208 -0
- package/dist/types/core.d.ts +543 -0
- package/dist/types/middleware-types.d.ts +227 -0
- package/dist/types/request-response-augmentation.d.ts +261 -0
- package/dist/types/route-inference.d.ts +168 -0
- package/dist/types.d.ts +1776 -0
- package/dist/url.d.ts +56 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/query-preservation.d.ts +48 -0
- package/dist/utils.d.ts +69 -0
- package/dist/validation/validator.d.ts +140 -0
- package/dist/websocket/clustering.d.ts +185 -0
- package/package.json +18 -4
- package/src/auth.ts +469 -0
- package/src/cache/lru-cache.ts +457 -0
- package/src/cache/middleware-memoization.ts +531 -0
- package/src/cache/route-cache-warmer.ts +486 -0
- package/src/cache/sqlite-cache.ts +783 -0
- package/src/cache/streaming-cache.ts +572 -0
- package/src/cli/colors.ts +29 -0
- package/src/cli/index.ts +287 -0
- package/src/cli/middleware.ts +291 -0
- package/src/cli/openapi.ts +407 -0
- package/src/cli/router.ts +188 -0
- package/src/cli/routes.ts +265 -0
- package/src/cli/utils.ts +531 -0
- package/src/cli.ts +5 -0
- package/src/config.ts +322 -0
- package/src/container/container.ts +740 -0
- package/src/container/contextual-binding.ts +603 -0
- package/src/container/decorators.ts +359 -0
- package/src/container/service-provider.ts +596 -0
- package/src/development/hot-reload.ts +673 -0
- package/src/development/index.ts +499 -0
- package/src/development/performance-profiler.ts +717 -0
- package/src/development/route-debugger.ts +527 -0
- package/src/development/route-inspector.ts +749 -0
- package/src/development/typescript-utilities.ts +678 -0
- package/src/docs.ts +397 -0
- package/src/errors/circuit-breaker.ts +732 -0
- package/src/errors/error-handler.ts +569 -0
- package/src/errors/error-reporting.ts +672 -0
- package/src/errors/exceptions.ts +536 -0
- package/src/errors/graceful-degradation.ts +621 -0
- package/src/errors/index.ts +21 -0
- package/src/errors/router-errors.ts +632 -0
- package/src/file-serving/static-files.ts +581 -0
- package/src/index.ts +14 -0
- package/src/middleware/auth.ts +219 -0
- package/src/middleware/content_security_policy.ts +215 -0
- package/src/middleware/cors.ts +74 -0
- package/src/middleware/csrf.ts +108 -0
- package/src/middleware/ddos_protection.ts +255 -0
- package/src/middleware/file_security.ts +191 -0
- package/src/middleware/file_upload.ts +264 -0
- package/src/middleware/helmet.ts +268 -0
- package/src/middleware/index.ts +117 -0
- package/src/middleware/input_validation.ts +449 -0
- package/src/middleware/json_body.ts +37 -0
- package/src/middleware/performance_alerting.ts +538 -0
- package/src/middleware/performance_dashboard.ts +661 -0
- package/src/middleware/performance_monitor.ts +943 -0
- package/src/middleware/pipeline.ts +489 -0
- package/src/middleware/rate_limit.ts +245 -0
- package/src/middleware/request_id.ts +36 -0
- package/src/middleware/request_signing.ts +636 -0
- package/src/middleware/request_tracer.ts +636 -0
- package/src/middleware/response_cache.ts +743 -0
- package/src/middleware/security.ts +482 -0
- package/src/middleware/security_suite.ts +257 -0
- package/src/middleware/session.ts +91 -0
- package/src/model-binding/index.ts +18 -0
- package/src/model-binding/model-middleware.ts +425 -0
- package/src/model-binding/model-registry.ts +550 -0
- package/src/model-binding.ts +370 -0
- package/src/model-resolver-factory.ts +106 -0
- package/src/observability/correlation.ts +691 -0
- package/src/observability/health-checks.ts +729 -0
- package/src/observability/index.ts +184 -0
- package/src/observability/integration.ts +548 -0
- package/src/observability/metrics.ts +753 -0
- package/src/observability/tracing.ts +638 -0
- package/src/optimization/bun-utilities.ts +778 -0
- package/src/query-builder-integration.ts +137 -0
- package/src/request/context.ts +62 -0
- package/src/request/enhanced-request.ts +857 -0
- package/src/request/macros.ts +688 -0
- package/src/response/macros.ts +612 -0
- package/src/response/response-factory.ts +588 -0
- package/src/router/api-routes.ts +243 -0
- package/src/router/file-based-routing.ts +670 -0
- package/src/router/file-streaming.ts +372 -0
- package/src/router/fluent-router.ts +927 -0
- package/src/router/fluent-routing.ts +797 -0
- package/src/router/group-organization.ts +213 -0
- package/src/router/handler-resolver.ts +291 -0
- package/src/router/http-methods.ts +377 -0
- package/src/router/index.ts +185 -0
- package/src/router/middleware-groups.ts +222 -0
- package/src/router/middleware-integration.ts +399 -0
- package/src/router/middleware.ts +231 -0
- package/src/router/model-binding.ts +215 -0
- package/src/router/optimized-route-matching.ts +253 -0
- package/src/router/route-building.ts +212 -0
- package/src/router/route-compiler.ts +702 -0
- package/src/router/route-matching.ts +349 -0
- package/src/router/route-trie.ts +464 -0
- package/src/router/router.ts +1508 -0
- package/src/router/server.ts +406 -0
- package/src/router/validation-integration.ts +443 -0
- package/src/router/view-rendering.ts +233 -0
- package/src/router/websocket.ts +100 -0
- package/src/routing/route-caching.ts +402 -0
- package/src/routing/route-throttling.ts +469 -0
- package/src/routing/subdomain-routing.ts +492 -0
- package/src/session/database-store.ts +109 -0
- package/src/session/file-store.ts +148 -0
- package/src/session/index.ts +244 -0
- package/src/session/memory-store.ts +88 -0
- package/src/session/redis-store.ts +93 -0
- package/src/streaming/index.ts +17 -0
- package/src/streaming/sse-handler.ts +482 -0
- package/src/streaming/stream-handler.ts +552 -0
- package/src/testing/auth-testing.ts +446 -0
- package/src/testing/file-upload-testing.ts +543 -0
- package/src/testing/index.ts +10 -0
- package/src/testing/middleware-testing.ts +322 -0
- package/src/testing/model-binding-testing.ts +645 -0
- package/src/testing/performance-testing.ts +738 -0
- package/src/testing/test-client.ts +310 -0
- package/src/testing/test-request.ts +315 -0
- package/src/testing/test-response.ts +332 -0
- package/src/testing/types.ts +224 -0
- package/src/testing/websocket-testing.ts +590 -0
- package/src/types/controller-types.ts +385 -0
- package/src/types/core.ts +683 -0
- package/src/types/middleware-types.ts +419 -0
- package/src/types/request-response-augmentation.ts +489 -0
- package/src/types/route-inference.ts +357 -0
- package/src/types.ts +2049 -0
- package/src/url.ts +126 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/query-preservation.ts +201 -0
- package/src/utils.ts +327 -0
- package/src/validation/validator.ts +685 -0
- package/src/websocket/clustering.ts +762 -0
- package/dist/chunk-cjdekj87.js +0 -25886
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Error Handling - Circuit Breaker Pattern
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by monitoring external service health
|
|
5
|
+
* and temporarily blocking requests when services are failing
|
|
6
|
+
*/
|
|
7
|
+
import type { ErrorContext } from './exceptions';
|
|
8
|
+
export interface CircuitBreakerConfig {
|
|
9
|
+
name: string;
|
|
10
|
+
failureThreshold: number;
|
|
11
|
+
recoveryTimeout: number;
|
|
12
|
+
timeout: number;
|
|
13
|
+
monitoringPeriod: number;
|
|
14
|
+
minimumRequests: number;
|
|
15
|
+
errorThresholdPercentage: number;
|
|
16
|
+
halfOpenMaxCalls: number;
|
|
17
|
+
resetTimeout: number;
|
|
18
|
+
onStateChange?: (state: CircuitBreakerState, name: string) => void;
|
|
19
|
+
onFailure?: (error: Error, name: string) => void;
|
|
20
|
+
onSuccess?: (name: string) => void;
|
|
21
|
+
shouldTripOnError?: (error: Error) => boolean;
|
|
22
|
+
}
|
|
23
|
+
export type CircuitBreakerState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
|
|
24
|
+
export interface CircuitBreakerMetrics {
|
|
25
|
+
totalRequests: number;
|
|
26
|
+
successfulRequests: number;
|
|
27
|
+
failedRequests: number;
|
|
28
|
+
timeouts: number;
|
|
29
|
+
averageResponseTime: number;
|
|
30
|
+
lastFailureTime?: Date;
|
|
31
|
+
lastSuccessTime?: Date;
|
|
32
|
+
state: CircuitBreakerState;
|
|
33
|
+
nextAttemptTime?: Date;
|
|
34
|
+
consecutiveFailures: number;
|
|
35
|
+
consecutiveSuccesses: number;
|
|
36
|
+
}
|
|
37
|
+
export interface CircuitBreakerCall<T> {
|
|
38
|
+
execute: () => Promise<T>;
|
|
39
|
+
fallback?: () => Promise<T>;
|
|
40
|
+
timeout?: number;
|
|
41
|
+
retries?: number;
|
|
42
|
+
context?: ErrorContext;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Circuit breaker implementation
|
|
46
|
+
*/
|
|
47
|
+
export declare class CircuitBreaker {
|
|
48
|
+
private config;
|
|
49
|
+
private state;
|
|
50
|
+
private metrics;
|
|
51
|
+
private nextAttemptTime?;
|
|
52
|
+
private halfOpenCallCount;
|
|
53
|
+
private recentRequests;
|
|
54
|
+
constructor(config: CircuitBreakerConfig);
|
|
55
|
+
/**
|
|
56
|
+
* Execute a function with circuit breaker protection
|
|
57
|
+
*/
|
|
58
|
+
execute<T>(call: CircuitBreakerCall<T>): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* Get current circuit breaker state
|
|
61
|
+
*/
|
|
62
|
+
getState(): CircuitBreakerState;
|
|
63
|
+
/**
|
|
64
|
+
* Get circuit breaker metrics
|
|
65
|
+
*/
|
|
66
|
+
getMetrics(): CircuitBreakerMetrics;
|
|
67
|
+
/**
|
|
68
|
+
* Force circuit breaker to open state
|
|
69
|
+
*/
|
|
70
|
+
forceOpen(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Force circuit breaker to closed state
|
|
73
|
+
*/
|
|
74
|
+
forceClosed(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Reset circuit breaker metrics
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
private onSuccess;
|
|
80
|
+
private onFailure;
|
|
81
|
+
private shouldTrip;
|
|
82
|
+
private transitionToClosed;
|
|
83
|
+
private transitionToOpen;
|
|
84
|
+
private transitionToHalfOpen;
|
|
85
|
+
private updateAverageResponseTime;
|
|
86
|
+
private getRecentRequests;
|
|
87
|
+
private cleanupOldRequests;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Circuit breaker registry for managing multiple circuit breakers
|
|
91
|
+
*/
|
|
92
|
+
export declare class CircuitBreakerRegistry {
|
|
93
|
+
private breakers;
|
|
94
|
+
private configs;
|
|
95
|
+
/**
|
|
96
|
+
* Register a new circuit breaker
|
|
97
|
+
*/
|
|
98
|
+
register(config: CircuitBreakerConfig): CircuitBreaker;
|
|
99
|
+
/**
|
|
100
|
+
* Get circuit breaker by name
|
|
101
|
+
*/
|
|
102
|
+
get(name: string): CircuitBreaker | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Execute function with circuit breaker protection
|
|
105
|
+
*/
|
|
106
|
+
execute<T>(name: string, call: CircuitBreakerCall<T>): Promise<T>;
|
|
107
|
+
/**
|
|
108
|
+
* Get all circuit breaker metrics
|
|
109
|
+
*/
|
|
110
|
+
getAllMetrics(): Record<string, CircuitBreakerMetrics>;
|
|
111
|
+
/**
|
|
112
|
+
* Get circuit breakers by state
|
|
113
|
+
*/
|
|
114
|
+
getBreakersByState(state: CircuitBreakerState): string[];
|
|
115
|
+
/**
|
|
116
|
+
* Force all circuit breakers to closed state
|
|
117
|
+
*/
|
|
118
|
+
forceAllClosed(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Reset all circuit breaker metrics
|
|
121
|
+
*/
|
|
122
|
+
resetAll(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Remove circuit breaker
|
|
125
|
+
*/
|
|
126
|
+
remove(name: string): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Get all registered circuit breaker names
|
|
129
|
+
*/
|
|
130
|
+
getNames(): string[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Decorator for circuit breaker protection
|
|
134
|
+
*/
|
|
135
|
+
export declare function circuitBreaker(config: CircuitBreakerConfig): <T extends (...args: any[]) => Promise<any>>(target: any, propertyName: string, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T>;
|
|
136
|
+
/**
|
|
137
|
+
* HTTP client with circuit breaker protection
|
|
138
|
+
*/
|
|
139
|
+
export declare class CircuitBreakerHttpClient {
|
|
140
|
+
private registry;
|
|
141
|
+
constructor(registry?: CircuitBreakerRegistry);
|
|
142
|
+
/**
|
|
143
|
+
* Make HTTP request with circuit breaker protection
|
|
144
|
+
*/
|
|
145
|
+
fetch(url: string, options?: RequestInit & {
|
|
146
|
+
circuitBreaker?: string | CircuitBreakerConfig;
|
|
147
|
+
fallback?: () => Promise<Response>;
|
|
148
|
+
context?: ErrorContext;
|
|
149
|
+
}): Promise<Response>;
|
|
150
|
+
/**
|
|
151
|
+
* Get circuit breaker registry
|
|
152
|
+
*/
|
|
153
|
+
getRegistry(): CircuitBreakerRegistry;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Middleware for circuit breaker protection
|
|
157
|
+
*/
|
|
158
|
+
export declare function createCircuitBreakerMiddleware(registry: CircuitBreakerRegistry): (req: any, next: () => Promise<Response>) => Promise<Response>;
|
|
159
|
+
/**
|
|
160
|
+
* Factory functions for common circuit breaker configurations
|
|
161
|
+
*/
|
|
162
|
+
export declare const CircuitBreakerPresets: {
|
|
163
|
+
/**
|
|
164
|
+
* Fast-failing circuit breaker for critical services
|
|
165
|
+
*/
|
|
166
|
+
critical: (name: string) => CircuitBreakerConfig;
|
|
167
|
+
/**
|
|
168
|
+
* Standard circuit breaker for regular services
|
|
169
|
+
*/
|
|
170
|
+
standard: (name: string) => CircuitBreakerConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Tolerant circuit breaker for non-critical services
|
|
173
|
+
*/
|
|
174
|
+
tolerant: (name: string) => CircuitBreakerConfig;
|
|
175
|
+
/**
|
|
176
|
+
* Database circuit breaker with longer timeouts
|
|
177
|
+
*/
|
|
178
|
+
database: (name: string) => CircuitBreakerConfig;
|
|
179
|
+
/**
|
|
180
|
+
* External API circuit breaker
|
|
181
|
+
*/
|
|
182
|
+
externalApi: (name: string) => CircuitBreakerConfig;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Global circuit breaker registry instance
|
|
186
|
+
*/
|
|
187
|
+
export declare const globalCircuitBreakerRegistry: CircuitBreakerRegistry;
|
|
188
|
+
/**
|
|
189
|
+
* Convenience function to create and register a circuit breaker
|
|
190
|
+
*/
|
|
191
|
+
export declare function createCircuitBreaker(config: CircuitBreakerConfig): CircuitBreaker;
|
|
192
|
+
/**
|
|
193
|
+
* Convenience function to execute with circuit breaker protection
|
|
194
|
+
*/
|
|
195
|
+
export declare function withCircuitBreaker<T>(name: string, call: CircuitBreakerCall<T>): Promise<T>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Error Handling - Main Error Handler Middleware
|
|
3
|
+
*
|
|
4
|
+
* Unified error handling middleware that integrates all error handling components
|
|
5
|
+
*/
|
|
6
|
+
import type { CircuitBreakerConfig, DegradationConfig, EnhancedRequest, ErrorReportingConfig } from '../types';
|
|
7
|
+
import { RouterException } from './exceptions';
|
|
8
|
+
export interface AdvancedErrorHandlerConfig {
|
|
9
|
+
errorReporting?: ErrorReportingConfig[];
|
|
10
|
+
gracefulDegradation?: DegradationConfig;
|
|
11
|
+
circuitBreakers?: CircuitBreakerConfig[];
|
|
12
|
+
globalErrorHandler?: (error: RouterException, req: EnhancedRequest) => Promise<Response>;
|
|
13
|
+
development?: boolean;
|
|
14
|
+
includeStackTrace?: boolean;
|
|
15
|
+
sanitizeErrors?: boolean;
|
|
16
|
+
logErrors?: boolean;
|
|
17
|
+
customErrorPages?: {
|
|
18
|
+
[statusCode: number]: string | ((_error: RouterException, _req: EnhancedRequest) => Promise<Response>);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Advanced error handler middleware
|
|
23
|
+
*/
|
|
24
|
+
export declare class AdvancedErrorHandler {
|
|
25
|
+
private errorReporting?;
|
|
26
|
+
private gracefulDegradation?;
|
|
27
|
+
private circuitBreakerRegistry?;
|
|
28
|
+
private config;
|
|
29
|
+
constructor(config?: AdvancedErrorHandlerConfig);
|
|
30
|
+
private initializeComponents;
|
|
31
|
+
/**
|
|
32
|
+
* Main error handling middleware
|
|
33
|
+
*/
|
|
34
|
+
middleware(): (req: EnhancedRequest, next: () => Promise<Response>) => Promise<Response>;
|
|
35
|
+
/**
|
|
36
|
+
* Handle errors with full advanced error handling pipeline
|
|
37
|
+
*/
|
|
38
|
+
handleError(error: unknown, req: EnhancedRequest): Promise<Response>;
|
|
39
|
+
/**
|
|
40
|
+
* Convert any error to RouterException
|
|
41
|
+
*/
|
|
42
|
+
private normalizeError;
|
|
43
|
+
/**
|
|
44
|
+
* Create standardized error response
|
|
45
|
+
*/
|
|
46
|
+
private createErrorResponse;
|
|
47
|
+
/**
|
|
48
|
+
* Log error with appropriate level
|
|
49
|
+
*/
|
|
50
|
+
private logError;
|
|
51
|
+
/**
|
|
52
|
+
* Get error handler statistics
|
|
53
|
+
*/
|
|
54
|
+
getStats(): {
|
|
55
|
+
errorReporting?: any;
|
|
56
|
+
gracefulDegradation?: any;
|
|
57
|
+
circuitBreakers?: any;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Cleanup resources
|
|
61
|
+
*/
|
|
62
|
+
cleanup(): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Factory function to create advanced error handler middleware
|
|
66
|
+
*/
|
|
67
|
+
export declare function createAdvancedErrorHandler(config?: AdvancedErrorHandlerConfig): {
|
|
68
|
+
middleware: (req: EnhancedRequest, next: () => Promise<Response>) => Promise<Response>;
|
|
69
|
+
getStats: () => {
|
|
70
|
+
errorReporting?: any;
|
|
71
|
+
gracefulDegradation?: any;
|
|
72
|
+
circuitBreakers?: any;
|
|
73
|
+
};
|
|
74
|
+
cleanup: () => Promise<void>;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Preset configurations for different environments
|
|
78
|
+
*/
|
|
79
|
+
export declare const ErrorHandlerPresets: {
|
|
80
|
+
development: () => AdvancedErrorHandlerConfig;
|
|
81
|
+
production: (sentryDsn?: string, bugsnagApiKey?: string) => AdvancedErrorHandlerConfig;
|
|
82
|
+
staging: (sentryDsn?: string) => AdvancedErrorHandlerConfig;
|
|
83
|
+
resilient: (config?: {
|
|
84
|
+
sentryDsn?: string;
|
|
85
|
+
bugsnagApiKey?: string;
|
|
86
|
+
services?: string[];
|
|
87
|
+
}) => AdvancedErrorHandlerConfig;
|
|
88
|
+
};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Error Handling - Error Reporting Integration
|
|
3
|
+
*
|
|
4
|
+
* Integration with external error reporting services (Sentry, Bugsnag, etc.)
|
|
5
|
+
*/
|
|
6
|
+
import type { ErrorContext, RouterException } from './exceptions';
|
|
7
|
+
export interface ErrorReportingConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
service: 'sentry' | 'bugsnag' | 'custom';
|
|
10
|
+
dsn?: string;
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
environment?: string;
|
|
13
|
+
release?: string;
|
|
14
|
+
sampleRate?: number;
|
|
15
|
+
beforeSend?: (error: Error, context: ErrorContext) => Error | null;
|
|
16
|
+
filters?: {
|
|
17
|
+
ignoreErrors?: (string | RegExp)[];
|
|
18
|
+
ignoreCodes?: string[];
|
|
19
|
+
ignoreUrls?: (string | RegExp)[];
|
|
20
|
+
allowUrls?: (string | RegExp)[];
|
|
21
|
+
};
|
|
22
|
+
tags?: Record<string, string>;
|
|
23
|
+
user?: {
|
|
24
|
+
id?: string;
|
|
25
|
+
email?: string;
|
|
26
|
+
username?: string;
|
|
27
|
+
};
|
|
28
|
+
extra?: Record<string, any>;
|
|
29
|
+
breadcrumbs?: {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
maxBreadcrumbs: number;
|
|
32
|
+
};
|
|
33
|
+
performance?: {
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
tracesSampleRate: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface ErrorReport {
|
|
39
|
+
error: RouterException;
|
|
40
|
+
context: ErrorContext;
|
|
41
|
+
fingerprint?: string[];
|
|
42
|
+
tags?: Record<string, string>;
|
|
43
|
+
extra?: Record<string, any>;
|
|
44
|
+
user?: Record<string, any>;
|
|
45
|
+
level?: 'debug' | 'info' | 'warning' | 'error' | 'fatal';
|
|
46
|
+
}
|
|
47
|
+
export interface ErrorReporter {
|
|
48
|
+
report: (error: RouterException, context?: ErrorContext) => Promise<string | null>;
|
|
49
|
+
addBreadcrumb: (message: string, category?: string, level?: string, data?: Record<string, any>) => void;
|
|
50
|
+
setUser: (user: Record<string, any>) => void;
|
|
51
|
+
setTag: (key: string, value: string) => void;
|
|
52
|
+
setExtra: (key: string, value: any) => void;
|
|
53
|
+
setContext: (key: string, context: Record<string, any>) => void;
|
|
54
|
+
close: (timeout?: number) => Promise<boolean>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Sentry error reporter implementation
|
|
58
|
+
*/
|
|
59
|
+
export declare class SentryReporter implements ErrorReporter {
|
|
60
|
+
private config;
|
|
61
|
+
private sentry;
|
|
62
|
+
constructor(config: ErrorReportingConfig);
|
|
63
|
+
private initializeSentry;
|
|
64
|
+
report(error: RouterException, context?: ErrorContext): Promise<string | null>;
|
|
65
|
+
addBreadcrumb(message: string, category?: string, level?: string, data?: Record<string, any>): void;
|
|
66
|
+
setUser(user: Record<string, any>): void;
|
|
67
|
+
setTag(key: string, value: string): void;
|
|
68
|
+
setExtra(key: string, value: any): void;
|
|
69
|
+
setContext(key: string, context: Record<string, any>): void;
|
|
70
|
+
close(timeout?: number): Promise<boolean>;
|
|
71
|
+
private shouldIgnoreError;
|
|
72
|
+
private mapSeverityToLevel;
|
|
73
|
+
private generateFingerprint;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Bugsnag error reporter implementation
|
|
77
|
+
*/
|
|
78
|
+
export declare class BugsnagReporter implements ErrorReporter {
|
|
79
|
+
private config;
|
|
80
|
+
private bugsnag;
|
|
81
|
+
constructor(config: ErrorReportingConfig);
|
|
82
|
+
private initializeBugsnag;
|
|
83
|
+
report(error: RouterException, context?: ErrorContext): Promise<string | null>;
|
|
84
|
+
addBreadcrumb(message: string, category?: string, _level?: string, data?: Record<string, any>): void;
|
|
85
|
+
setUser(user: Record<string, any>): void;
|
|
86
|
+
setTag(key: string, value: string): void;
|
|
87
|
+
setExtra(key: string, value: any): void;
|
|
88
|
+
setContext(key: string, context: Record<string, any>): void;
|
|
89
|
+
close(): Promise<boolean>;
|
|
90
|
+
private shouldIgnoreError;
|
|
91
|
+
private mapSeverityToBugsnag;
|
|
92
|
+
private generateGroupingHash;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Custom error reporter for custom implementations
|
|
96
|
+
*/
|
|
97
|
+
export declare class CustomReporter implements ErrorReporter {
|
|
98
|
+
private config;
|
|
99
|
+
private reportHandler;
|
|
100
|
+
constructor(config: ErrorReportingConfig, reportHandler: (report: ErrorReport) => Promise<string | null>);
|
|
101
|
+
report(error: RouterException, context?: ErrorContext): Promise<string | null>;
|
|
102
|
+
addBreadcrumb(): void;
|
|
103
|
+
setUser(): void;
|
|
104
|
+
setTag(): void;
|
|
105
|
+
setExtra(): void;
|
|
106
|
+
setContext(): void;
|
|
107
|
+
close(): Promise<boolean>;
|
|
108
|
+
private mapSeverityToLevel;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Error reporting manager
|
|
112
|
+
*/
|
|
113
|
+
export declare class ErrorReportingManager {
|
|
114
|
+
private reporters;
|
|
115
|
+
private breadcrumbs;
|
|
116
|
+
private maxBreadcrumbs;
|
|
117
|
+
constructor(configs: ErrorReportingConfig[]);
|
|
118
|
+
private initializeReporters;
|
|
119
|
+
addReporter(reporter: ErrorReporter): void;
|
|
120
|
+
report(error: RouterException, context?: ErrorContext): Promise<string[]>;
|
|
121
|
+
addBreadcrumb(message: string, category?: string, data?: any): void;
|
|
122
|
+
setUser(user: Record<string, any>): void;
|
|
123
|
+
setTag(key: string, value: string): void;
|
|
124
|
+
setExtra(key: string, value: any): void;
|
|
125
|
+
setContext(key: string, context: Record<string, any>): void;
|
|
126
|
+
close(timeout?: number): Promise<boolean>;
|
|
127
|
+
getBreadcrumbs(): Array<{
|
|
128
|
+
message: string;
|
|
129
|
+
timestamp: Date;
|
|
130
|
+
data?: any;
|
|
131
|
+
}>;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Factory function to create error reporting manager
|
|
135
|
+
*/
|
|
136
|
+
export declare function createErrorReporting(configs: ErrorReportingConfig[]): ErrorReportingManager;
|
|
137
|
+
/**
|
|
138
|
+
* Default configuration presets
|
|
139
|
+
*/
|
|
140
|
+
export declare const ErrorReportingPresets: {
|
|
141
|
+
sentry: (dsn: string, environment?: string) => ErrorReportingConfig;
|
|
142
|
+
bugsnag: (apiKey: string, environment?: string) => ErrorReportingConfig;
|
|
143
|
+
development: () => ErrorReportingConfig;
|
|
144
|
+
};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Error Handling - Exception Hierarchy
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive exception types with metadata, stack traces, and context information
|
|
5
|
+
*/
|
|
6
|
+
export interface ErrorContext {
|
|
7
|
+
requestId?: string;
|
|
8
|
+
userId?: string | number;
|
|
9
|
+
traceId?: string;
|
|
10
|
+
spanId?: string;
|
|
11
|
+
route?: string;
|
|
12
|
+
method?: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
userAgent?: string;
|
|
15
|
+
ip?: string;
|
|
16
|
+
timestamp?: Date;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface ErrorDetails {
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
context?: ErrorContext;
|
|
23
|
+
cause?: Error;
|
|
24
|
+
statusCode?: number;
|
|
25
|
+
retryable?: boolean;
|
|
26
|
+
severity?: 'low' | 'medium' | 'high' | 'critical';
|
|
27
|
+
category?: 'validation' | 'authentication' | 'authorization' | 'network' | 'database' | 'external' | 'system' | 'business';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Base exception class for all router errors
|
|
31
|
+
*/
|
|
32
|
+
export declare abstract class RouterException extends Error {
|
|
33
|
+
readonly code: string;
|
|
34
|
+
readonly statusCode: number;
|
|
35
|
+
readonly context: ErrorContext;
|
|
36
|
+
readonly retryable: boolean;
|
|
37
|
+
readonly severity: 'low' | 'medium' | 'high' | 'critical';
|
|
38
|
+
readonly category: string;
|
|
39
|
+
readonly timestamp: Date;
|
|
40
|
+
readonly cause?: Error;
|
|
41
|
+
constructor(details: ErrorDetails);
|
|
42
|
+
/**
|
|
43
|
+
* Convert error to JSON for logging/reporting
|
|
44
|
+
*/
|
|
45
|
+
toJSON(): Record<string, any>;
|
|
46
|
+
/**
|
|
47
|
+
* Create HTTP response for this error
|
|
48
|
+
*/
|
|
49
|
+
toResponse(): Response;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validation errors (400)
|
|
53
|
+
*/
|
|
54
|
+
export declare class ValidationException extends RouterException {
|
|
55
|
+
readonly fields: Record<string, string[]>;
|
|
56
|
+
constructor(message: string, fields?: Record<string, string[]>, context?: ErrorContext);
|
|
57
|
+
toResponse(): Response;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Authentication errors (401)
|
|
61
|
+
*/
|
|
62
|
+
export declare class AuthenticationException extends RouterException {
|
|
63
|
+
constructor(message?: string, context?: ErrorContext);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Authorization errors (403)
|
|
67
|
+
*/
|
|
68
|
+
export declare class AuthorizationException extends RouterException {
|
|
69
|
+
readonly requiredPermissions?: string[];
|
|
70
|
+
constructor(message?: string, requiredPermissions?: string[], context?: ErrorContext);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resource not found errors (404)
|
|
74
|
+
*/
|
|
75
|
+
export declare class NotFoundException extends RouterException {
|
|
76
|
+
readonly resource?: string;
|
|
77
|
+
readonly resourceId?: string;
|
|
78
|
+
constructor(message?: string, resource?: string, resourceId?: string, context?: ErrorContext);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Method not allowed errors (405)
|
|
82
|
+
*/
|
|
83
|
+
export declare class MethodNotAllowedException extends RouterException {
|
|
84
|
+
readonly allowedMethods: string[];
|
|
85
|
+
constructor(method: string, allowedMethods: string[], context?: ErrorContext);
|
|
86
|
+
toResponse(): Response;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Request timeout errors (408)
|
|
90
|
+
*/
|
|
91
|
+
export declare class TimeoutException extends RouterException {
|
|
92
|
+
readonly timeoutMs: number;
|
|
93
|
+
constructor(message: string | undefined, timeoutMs: number, context?: ErrorContext);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Rate limit exceeded errors (429)
|
|
97
|
+
*/
|
|
98
|
+
export declare class RateLimitException extends RouterException {
|
|
99
|
+
readonly retryAfter: number;
|
|
100
|
+
readonly limit: number;
|
|
101
|
+
readonly remaining: number;
|
|
102
|
+
constructor(message: string | undefined, retryAfter: number, limit: number, remaining?: number, context?: ErrorContext);
|
|
103
|
+
toResponse(): Response;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Internal server errors (500)
|
|
107
|
+
*/
|
|
108
|
+
export declare class InternalServerException extends RouterException {
|
|
109
|
+
constructor(message?: string, cause?: Error, context?: ErrorContext);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Service unavailable errors (503)
|
|
113
|
+
*/
|
|
114
|
+
export declare class ServiceUnavailableException extends RouterException {
|
|
115
|
+
readonly retryAfter?: number;
|
|
116
|
+
constructor(message?: string, retryAfter?: number, context?: ErrorContext);
|
|
117
|
+
toResponse(): Response;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Database errors
|
|
121
|
+
*/
|
|
122
|
+
export declare class DatabaseException extends RouterException {
|
|
123
|
+
readonly query?: string;
|
|
124
|
+
readonly operation?: string;
|
|
125
|
+
constructor(message: string, operation?: string, query?: string, cause?: Error, context?: ErrorContext);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* External service errors
|
|
129
|
+
*/
|
|
130
|
+
export declare class ExternalServiceException extends RouterException {
|
|
131
|
+
readonly service: string;
|
|
132
|
+
readonly endpoint?: string;
|
|
133
|
+
constructor(message: string, service: string, endpoint?: string, statusCode?: number, cause?: Error, context?: ErrorContext);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Circuit breaker open errors
|
|
137
|
+
*/
|
|
138
|
+
export declare class CircuitBreakerOpenException extends RouterException {
|
|
139
|
+
readonly service: string;
|
|
140
|
+
readonly nextAttemptAt: Date;
|
|
141
|
+
constructor(service: string, nextAttemptAt: Date, context?: ErrorContext);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Business logic errors
|
|
145
|
+
*/
|
|
146
|
+
export declare class BusinessLogicException extends RouterException {
|
|
147
|
+
readonly businessRule: string;
|
|
148
|
+
constructor(message: string, businessRule: string, context?: ErrorContext);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Configuration errors
|
|
152
|
+
*/
|
|
153
|
+
export declare class ConfigurationException extends RouterException {
|
|
154
|
+
readonly configKey: string;
|
|
155
|
+
constructor(message: string, configKey: string, context?: ErrorContext);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* File system errors
|
|
159
|
+
*/
|
|
160
|
+
export declare class FileSystemException extends RouterException {
|
|
161
|
+
readonly path: string;
|
|
162
|
+
readonly operation: string;
|
|
163
|
+
constructor(message: string, path: string, operation: string, cause?: Error, context?: ErrorContext);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Factory functions for common errors
|
|
167
|
+
*/
|
|
168
|
+
export declare const ErrorFactory: {
|
|
169
|
+
validation: (message: string, fields?: Record<string, string[]>, context?: ErrorContext) => ValidationException;
|
|
170
|
+
authentication: (message?: string, context?: ErrorContext) => AuthenticationException;
|
|
171
|
+
authorization: (message?: string, requiredPermissions?: string[], context?: ErrorContext) => AuthorizationException;
|
|
172
|
+
notFound: (resource?: string, resourceId?: string, context?: ErrorContext) => NotFoundException;
|
|
173
|
+
methodNotAllowed: (method: string, allowedMethods: string[], context?: ErrorContext) => MethodNotAllowedException;
|
|
174
|
+
timeout: (timeoutMs: number, message?: string, context?: ErrorContext) => TimeoutException;
|
|
175
|
+
rateLimit: (retryAfter: number, limit: number, remaining?: number, context?: ErrorContext) => RateLimitException;
|
|
176
|
+
internalServer: (message?: string, cause?: Error, context?: ErrorContext) => InternalServerException;
|
|
177
|
+
serviceUnavailable: (message?: string, retryAfter?: number, context?: ErrorContext) => ServiceUnavailableException;
|
|
178
|
+
database: (message: string, operation?: string, query?: string, cause?: Error, context?: ErrorContext) => DatabaseException;
|
|
179
|
+
externalService: (message: string, service: string, endpoint?: string, statusCode?: number, cause?: Error, context?: ErrorContext) => ExternalServiceException;
|
|
180
|
+
circuitBreakerOpen: (service: string, nextAttemptAt: Date, context?: ErrorContext) => CircuitBreakerOpenException;
|
|
181
|
+
businessLogic: (message: string, businessRule: string, context?: ErrorContext) => BusinessLogicException;
|
|
182
|
+
configuration: (message: string, configKey: string, context?: ErrorContext) => ConfigurationException;
|
|
183
|
+
fileSystem: (message: string, path: string, operation: string, cause?: Error, context?: ErrorContext) => FileSystemException;
|
|
184
|
+
};
|