@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.
Files changed (272) hide show
  1. package/README.md +2 -2
  2. package/dist/auth.d.ts +134 -0
  3. package/dist/cache/lru-cache.d.ts +139 -0
  4. package/dist/cache/middleware-memoization.d.ts +151 -0
  5. package/dist/cache/route-cache-warmer.d.ts +161 -0
  6. package/dist/cache/sqlite-cache.d.ts +209 -0
  7. package/dist/cache/streaming-cache.d.ts +132 -0
  8. package/dist/chunk-jhsk5c5b.js +15758 -0
  9. package/dist/cli/colors.d.ts +15 -0
  10. package/dist/cli/index.d.ts +10 -0
  11. package/dist/cli/middleware.d.ts +31 -0
  12. package/dist/cli/openapi.d.ts +17 -0
  13. package/dist/cli/router.d.ts +15 -0
  14. package/dist/cli/routes.d.ts +29 -0
  15. package/dist/cli/utils.d.ts +74 -0
  16. package/dist/cli.d.ts +1 -1
  17. package/dist/cli.js +2 -2
  18. package/dist/config.d.ts +7 -0
  19. package/dist/container/container.d.ts +273 -0
  20. package/dist/container/contextual-binding.d.ts +240 -0
  21. package/dist/container/decorators.d.ts +141 -0
  22. package/dist/container/service-provider.d.ts +285 -0
  23. package/dist/development/hot-reload.d.ts +187 -0
  24. package/dist/development/index.d.ts +167 -0
  25. package/dist/development/performance-profiler.d.ts +217 -0
  26. package/dist/development/route-debugger.d.ts +154 -0
  27. package/dist/development/route-inspector.d.ts +211 -0
  28. package/dist/development/typescript-utilities.d.ts +209 -0
  29. package/dist/docs.d.ts +11 -0
  30. package/dist/errors/circuit-breaker.d.ts +195 -0
  31. package/dist/errors/error-handler.d.ts +88 -0
  32. package/dist/errors/error-reporting.d.ts +144 -0
  33. package/dist/errors/exceptions.d.ts +184 -0
  34. package/dist/errors/graceful-degradation.d.ts +154 -0
  35. package/dist/errors/index.d.ts +9 -0
  36. package/dist/errors/router-errors.d.ts +110 -0
  37. package/dist/file-serving/static-files.d.ts +143 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +320 -206
  40. package/dist/middleware/auth.d.ts +63 -0
  41. package/dist/middleware/content_security_policy.d.ts +53 -0
  42. package/dist/middleware/cors.d.ts +5 -0
  43. package/dist/middleware/csrf.d.ts +7 -0
  44. package/dist/middleware/ddos_protection.d.ts +39 -0
  45. package/dist/middleware/file_security.d.ts +26 -0
  46. package/dist/middleware/file_upload.d.ts +38 -0
  47. package/dist/middleware/helmet.d.ts +54 -0
  48. package/dist/middleware/index.d.ts +44 -0
  49. package/dist/middleware/input_validation.d.ts +45 -0
  50. package/dist/middleware/json_body.d.ts +4 -0
  51. package/dist/middleware/performance_alerting.d.ts +87 -0
  52. package/dist/middleware/performance_dashboard.d.ts +87 -0
  53. package/dist/middleware/performance_monitor.d.ts +209 -0
  54. package/dist/middleware/pipeline.d.ts +131 -0
  55. package/dist/middleware/rate_limit.d.ts +36 -0
  56. package/dist/middleware/request_id.d.ts +4 -0
  57. package/dist/middleware/request_signing.d.ts +153 -0
  58. package/dist/middleware/request_tracer.d.ts +72 -0
  59. package/dist/middleware/response_cache.d.ts +97 -0
  60. package/dist/middleware/security.d.ts +69 -0
  61. package/dist/middleware/security_suite.d.ts +46 -0
  62. package/dist/middleware/session.d.ts +23 -0
  63. package/dist/model-binding/index.d.ts +2 -0
  64. package/dist/model-binding/model-middleware.d.ts +118 -0
  65. package/dist/model-binding/model-registry.d.ts +164 -0
  66. package/dist/model-binding.d.ts +185 -0
  67. package/dist/model-resolver-factory.d.ts +31 -0
  68. package/dist/observability/correlation.d.ts +187 -0
  69. package/dist/observability/health-checks.d.ts +186 -0
  70. package/dist/observability/index.d.ts +60 -0
  71. package/dist/observability/integration.d.ts +147 -0
  72. package/dist/observability/metrics.d.ts +184 -0
  73. package/dist/observability/tracing.d.ts +187 -0
  74. package/dist/optimization/bun-utilities.d.ts +224 -0
  75. package/dist/query-builder-integration.d.ts +36 -0
  76. package/dist/request/context.d.ts +34 -0
  77. package/dist/request/enhanced-request.d.ts +213 -0
  78. package/dist/request/macros.d.ts +300 -0
  79. package/dist/response/macros.d.ts +245 -0
  80. package/dist/response/response-factory.d.ts +133 -0
  81. package/dist/router/api-routes.d.ts +5 -0
  82. package/dist/router/file-based-routing.d.ts +118 -0
  83. package/dist/router/file-streaming.d.ts +5 -0
  84. package/dist/router/fluent-router.d.ts +315 -0
  85. package/dist/router/fluent-routing.d.ts +271 -0
  86. package/dist/router/group-organization.d.ts +5 -0
  87. package/dist/router/handler-resolver.d.ts +24 -0
  88. package/dist/router/http-methods.d.ts +10 -0
  89. package/dist/router/index.d.ts +113 -0
  90. package/dist/router/middleware-groups.d.ts +94 -0
  91. package/dist/router/middleware-integration.d.ts +112 -0
  92. package/dist/router/middleware.d.ts +5 -0
  93. package/dist/router/model-binding.d.ts +5 -0
  94. package/dist/router/optimized-route-matching.d.ts +6 -0
  95. package/dist/router/route-building.d.ts +5 -0
  96. package/dist/router/route-compiler.d.ts +153 -0
  97. package/dist/router/route-matching.d.ts +5 -0
  98. package/dist/router/route-trie.d.ts +114 -0
  99. package/dist/router/router.d.ts +276 -0
  100. package/dist/router/server.d.ts +5 -0
  101. package/dist/router/validation-integration.d.ts +170 -0
  102. package/dist/router/view-rendering.d.ts +5 -0
  103. package/dist/router/websocket.d.ts +5 -0
  104. package/dist/routing/route-caching.d.ts +129 -0
  105. package/dist/routing/route-throttling.d.ts +150 -0
  106. package/dist/routing/subdomain-routing.d.ts +206 -0
  107. package/dist/session/database-store.d.ts +51 -0
  108. package/dist/session/file-store.d.ts +22 -0
  109. package/dist/session/index.d.ts +106 -0
  110. package/dist/session/memory-store.d.ts +21 -0
  111. package/dist/session/redis-store.d.ts +31 -0
  112. package/dist/streaming/index.d.ts +3 -0
  113. package/dist/streaming/sse-handler.d.ts +138 -0
  114. package/dist/streaming/stream-handler.d.ts +114 -0
  115. package/dist/testing/auth-testing.d.ts +156 -0
  116. package/dist/testing/file-upload-testing.d.ts +190 -0
  117. package/dist/testing/index.d.ts +10 -0
  118. package/dist/testing/middleware-testing.d.ts +138 -0
  119. package/dist/testing/model-binding-testing.d.ts +186 -0
  120. package/dist/testing/performance-testing.d.ts +235 -0
  121. package/dist/testing/test-client.d.ts +117 -0
  122. package/dist/testing/test-request.d.ts +85 -0
  123. package/dist/testing/test-response.d.ts +90 -0
  124. package/dist/testing/types.d.ts +207 -0
  125. package/dist/testing/websocket-testing.d.ts +227 -0
  126. package/dist/types/controller-types.d.ts +208 -0
  127. package/dist/types/core.d.ts +543 -0
  128. package/dist/types/middleware-types.d.ts +227 -0
  129. package/dist/types/request-response-augmentation.d.ts +261 -0
  130. package/dist/types/route-inference.d.ts +168 -0
  131. package/dist/types.d.ts +1776 -0
  132. package/dist/url.d.ts +56 -0
  133. package/dist/utils/index.d.ts +1 -0
  134. package/dist/utils/query-preservation.d.ts +48 -0
  135. package/dist/utils.d.ts +69 -0
  136. package/dist/validation/validator.d.ts +140 -0
  137. package/dist/websocket/clustering.d.ts +185 -0
  138. package/package.json +18 -4
  139. package/src/auth.ts +469 -0
  140. package/src/cache/lru-cache.ts +457 -0
  141. package/src/cache/middleware-memoization.ts +531 -0
  142. package/src/cache/route-cache-warmer.ts +486 -0
  143. package/src/cache/sqlite-cache.ts +783 -0
  144. package/src/cache/streaming-cache.ts +572 -0
  145. package/src/cli/colors.ts +29 -0
  146. package/src/cli/index.ts +287 -0
  147. package/src/cli/middleware.ts +291 -0
  148. package/src/cli/openapi.ts +407 -0
  149. package/src/cli/router.ts +188 -0
  150. package/src/cli/routes.ts +265 -0
  151. package/src/cli/utils.ts +531 -0
  152. package/src/cli.ts +5 -0
  153. package/src/config.ts +322 -0
  154. package/src/container/container.ts +740 -0
  155. package/src/container/contextual-binding.ts +603 -0
  156. package/src/container/decorators.ts +359 -0
  157. package/src/container/service-provider.ts +596 -0
  158. package/src/development/hot-reload.ts +673 -0
  159. package/src/development/index.ts +499 -0
  160. package/src/development/performance-profiler.ts +717 -0
  161. package/src/development/route-debugger.ts +527 -0
  162. package/src/development/route-inspector.ts +749 -0
  163. package/src/development/typescript-utilities.ts +678 -0
  164. package/src/docs.ts +397 -0
  165. package/src/errors/circuit-breaker.ts +732 -0
  166. package/src/errors/error-handler.ts +569 -0
  167. package/src/errors/error-reporting.ts +672 -0
  168. package/src/errors/exceptions.ts +536 -0
  169. package/src/errors/graceful-degradation.ts +621 -0
  170. package/src/errors/index.ts +21 -0
  171. package/src/errors/router-errors.ts +632 -0
  172. package/src/file-serving/static-files.ts +581 -0
  173. package/src/index.ts +14 -0
  174. package/src/middleware/auth.ts +219 -0
  175. package/src/middleware/content_security_policy.ts +215 -0
  176. package/src/middleware/cors.ts +74 -0
  177. package/src/middleware/csrf.ts +108 -0
  178. package/src/middleware/ddos_protection.ts +255 -0
  179. package/src/middleware/file_security.ts +191 -0
  180. package/src/middleware/file_upload.ts +264 -0
  181. package/src/middleware/helmet.ts +268 -0
  182. package/src/middleware/index.ts +117 -0
  183. package/src/middleware/input_validation.ts +449 -0
  184. package/src/middleware/json_body.ts +37 -0
  185. package/src/middleware/performance_alerting.ts +538 -0
  186. package/src/middleware/performance_dashboard.ts +661 -0
  187. package/src/middleware/performance_monitor.ts +943 -0
  188. package/src/middleware/pipeline.ts +489 -0
  189. package/src/middleware/rate_limit.ts +245 -0
  190. package/src/middleware/request_id.ts +36 -0
  191. package/src/middleware/request_signing.ts +636 -0
  192. package/src/middleware/request_tracer.ts +636 -0
  193. package/src/middleware/response_cache.ts +743 -0
  194. package/src/middleware/security.ts +482 -0
  195. package/src/middleware/security_suite.ts +257 -0
  196. package/src/middleware/session.ts +91 -0
  197. package/src/model-binding/index.ts +18 -0
  198. package/src/model-binding/model-middleware.ts +425 -0
  199. package/src/model-binding/model-registry.ts +550 -0
  200. package/src/model-binding.ts +370 -0
  201. package/src/model-resolver-factory.ts +106 -0
  202. package/src/observability/correlation.ts +691 -0
  203. package/src/observability/health-checks.ts +729 -0
  204. package/src/observability/index.ts +184 -0
  205. package/src/observability/integration.ts +548 -0
  206. package/src/observability/metrics.ts +753 -0
  207. package/src/observability/tracing.ts +638 -0
  208. package/src/optimization/bun-utilities.ts +778 -0
  209. package/src/query-builder-integration.ts +137 -0
  210. package/src/request/context.ts +62 -0
  211. package/src/request/enhanced-request.ts +857 -0
  212. package/src/request/macros.ts +688 -0
  213. package/src/response/macros.ts +612 -0
  214. package/src/response/response-factory.ts +588 -0
  215. package/src/router/api-routes.ts +243 -0
  216. package/src/router/file-based-routing.ts +670 -0
  217. package/src/router/file-streaming.ts +372 -0
  218. package/src/router/fluent-router.ts +927 -0
  219. package/src/router/fluent-routing.ts +797 -0
  220. package/src/router/group-organization.ts +213 -0
  221. package/src/router/handler-resolver.ts +291 -0
  222. package/src/router/http-methods.ts +377 -0
  223. package/src/router/index.ts +185 -0
  224. package/src/router/middleware-groups.ts +222 -0
  225. package/src/router/middleware-integration.ts +399 -0
  226. package/src/router/middleware.ts +231 -0
  227. package/src/router/model-binding.ts +215 -0
  228. package/src/router/optimized-route-matching.ts +253 -0
  229. package/src/router/route-building.ts +212 -0
  230. package/src/router/route-compiler.ts +702 -0
  231. package/src/router/route-matching.ts +349 -0
  232. package/src/router/route-trie.ts +464 -0
  233. package/src/router/router.ts +1508 -0
  234. package/src/router/server.ts +406 -0
  235. package/src/router/validation-integration.ts +443 -0
  236. package/src/router/view-rendering.ts +233 -0
  237. package/src/router/websocket.ts +100 -0
  238. package/src/routing/route-caching.ts +402 -0
  239. package/src/routing/route-throttling.ts +469 -0
  240. package/src/routing/subdomain-routing.ts +492 -0
  241. package/src/session/database-store.ts +109 -0
  242. package/src/session/file-store.ts +148 -0
  243. package/src/session/index.ts +244 -0
  244. package/src/session/memory-store.ts +88 -0
  245. package/src/session/redis-store.ts +93 -0
  246. package/src/streaming/index.ts +17 -0
  247. package/src/streaming/sse-handler.ts +482 -0
  248. package/src/streaming/stream-handler.ts +552 -0
  249. package/src/testing/auth-testing.ts +446 -0
  250. package/src/testing/file-upload-testing.ts +543 -0
  251. package/src/testing/index.ts +10 -0
  252. package/src/testing/middleware-testing.ts +322 -0
  253. package/src/testing/model-binding-testing.ts +645 -0
  254. package/src/testing/performance-testing.ts +738 -0
  255. package/src/testing/test-client.ts +310 -0
  256. package/src/testing/test-request.ts +315 -0
  257. package/src/testing/test-response.ts +332 -0
  258. package/src/testing/types.ts +224 -0
  259. package/src/testing/websocket-testing.ts +590 -0
  260. package/src/types/controller-types.ts +385 -0
  261. package/src/types/core.ts +683 -0
  262. package/src/types/middleware-types.ts +419 -0
  263. package/src/types/request-response-augmentation.ts +489 -0
  264. package/src/types/route-inference.ts +357 -0
  265. package/src/types.ts +2049 -0
  266. package/src/url.ts +126 -0
  267. package/src/utils/index.ts +1 -0
  268. package/src/utils/query-preservation.ts +201 -0
  269. package/src/utils.ts +327 -0
  270. package/src/validation/validator.ts +685 -0
  271. package/src/websocket/clustering.ts +762 -0
  272. package/dist/chunk-cjdekj87.js +0 -25886
@@ -0,0 +1,569 @@
1
+ /**
2
+ * Advanced Error Handling - Main Error Handler Middleware
3
+ *
4
+ * Unified error handling middleware that integrates all error handling components
5
+ */
6
+
7
+ import type { CircuitBreakerConfig, DegradationConfig, EnhancedRequest, ErrorContext, ErrorReportingConfig } from '../types'
8
+ import { CircuitBreakerRegistry } from './circuit-breaker'
9
+ import { ErrorReportingManager } from './error-reporting'
10
+ import { ErrorFactory, RouterException } from './exceptions'
11
+ import { GracefulDegradationManager } from './graceful-degradation'
12
+
13
+ export interface AdvancedErrorHandlerConfig {
14
+ errorReporting?: ErrorReportingConfig[]
15
+ gracefulDegradation?: DegradationConfig
16
+ circuitBreakers?: CircuitBreakerConfig[]
17
+ globalErrorHandler?: (error: RouterException, req: EnhancedRequest) => Promise<Response>
18
+ development?: boolean
19
+ includeStackTrace?: boolean
20
+ sanitizeErrors?: boolean
21
+ logErrors?: boolean
22
+ customErrorPages?: {
23
+ [statusCode: number]: string | ((_error: RouterException, _req: EnhancedRequest) => Promise<Response>)
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Advanced error handler middleware
29
+ */
30
+ export class AdvancedErrorHandler {
31
+ private errorReporting?: ErrorReportingManager
32
+ private gracefulDegradation?: GracefulDegradationManager
33
+ private circuitBreakerRegistry?: CircuitBreakerRegistry
34
+ private config: AdvancedErrorHandlerConfig
35
+
36
+ constructor(config: AdvancedErrorHandlerConfig = {}) {
37
+ this.config = {
38
+ development: false,
39
+ includeStackTrace: false,
40
+ sanitizeErrors: true,
41
+ logErrors: true,
42
+ ...config,
43
+ }
44
+
45
+ this.initializeComponents()
46
+ }
47
+
48
+ private initializeComponents(): void {
49
+ // Initialize error reporting
50
+ if (this.config.errorReporting?.length) {
51
+ this.errorReporting = new ErrorReportingManager(this.config.errorReporting)
52
+ }
53
+
54
+ // Initialize graceful degradation
55
+ if (this.config.gracefulDegradation?.enabled) {
56
+ this.gracefulDegradation = new GracefulDegradationManager(this.config.gracefulDegradation)
57
+ }
58
+
59
+ // Initialize circuit breakers
60
+ if (this.config.circuitBreakers?.length) {
61
+ this.circuitBreakerRegistry = new CircuitBreakerRegistry()
62
+ for (const config of this.config.circuitBreakers) {
63
+ this.circuitBreakerRegistry.register(config)
64
+ }
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Main error handling middleware
70
+ */
71
+ middleware() {
72
+ return async (req: EnhancedRequest, next: () => Promise<Response>): Promise<Response> => {
73
+ try {
74
+ // Add error context to request
75
+ const errorContext: ErrorContext = {
76
+ requestId: req.requestId,
77
+ userId: req.user?.id,
78
+ traceId: req.traceId,
79
+ spanId: req.spanId,
80
+ route: req.params?.route || req.url,
81
+ method: req.method,
82
+ url: req.url,
83
+ userAgent: (req as any).userAgent?.() || undefined,
84
+ ip: (req as any).ip?.() || undefined,
85
+ timestamp: new Date(),
86
+ }
87
+
88
+ req.context = { ...req.context, errorContext }
89
+
90
+ // Execute request with circuit breaker protection if configured
91
+ if (this.circuitBreakerRegistry && req.context?.serviceName) {
92
+ const breaker = this.circuitBreakerRegistry.get(req.context.serviceName as string)
93
+ if (breaker) {
94
+ return await breaker.execute({
95
+ execute: next,
96
+ context: errorContext,
97
+ })
98
+ }
99
+ }
100
+
101
+ return await next()
102
+ }
103
+ catch (error) {
104
+ return this.handleError(error, req)
105
+ }
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Handle errors with full advanced error handling pipeline
111
+ */
112
+ async handleError(error: unknown, req: EnhancedRequest): Promise<Response> {
113
+ // Convert to RouterException if needed
114
+ const routerError = this.normalizeError(error, req)
115
+
116
+ // Add breadcrumb for error reporting
117
+ if (this.errorReporting) {
118
+ this.errorReporting.addBreadcrumb(
119
+ `Error in ${req.method} ${req.url}`,
120
+ 'error',
121
+ {
122
+ code: routerError.code,
123
+ severity: routerError.severity,
124
+ statusCode: routerError.statusCode,
125
+ },
126
+ )
127
+ }
128
+
129
+ // Log error if configured
130
+ if (this.config.logErrors) {
131
+ this.logError(routerError, req)
132
+ }
133
+
134
+ // Try graceful degradation if configured
135
+ if (this.gracefulDegradation && req.context?.serviceName) {
136
+ try {
137
+ return await this.gracefulDegradation.handleFailure(
138
+ req.context.serviceName as string,
139
+ routerError,
140
+ req,
141
+ async () => {
142
+ throw routerError // This will trigger fallback strategies
143
+ },
144
+ )
145
+ }
146
+ catch {
147
+ // Graceful degradation failed, continue with normal error handling
148
+ }
149
+ }
150
+
151
+ // Report error to external services
152
+ if (this.errorReporting) {
153
+ try {
154
+ await this.errorReporting.report(routerError, routerError.context)
155
+ }
156
+ catch (reportingError) {
157
+ console.error('Failed to report error:', reportingError)
158
+ }
159
+ }
160
+
161
+ // Use custom global error handler if provided
162
+ if (this.config.globalErrorHandler) {
163
+ try {
164
+ return await this.config.globalErrorHandler(routerError, req)
165
+ }
166
+ catch (handlerError) {
167
+ console.error('Global error handler failed:', handlerError)
168
+ }
169
+ }
170
+
171
+ // Use custom error page if configured
172
+ const customPage = this.config.customErrorPages?.[routerError.statusCode]
173
+ if (customPage) {
174
+ try {
175
+ if (typeof customPage === 'string') {
176
+ return new Response(customPage, {
177
+ status: routerError.statusCode,
178
+ headers: { 'Content-Type': 'text/html' },
179
+ })
180
+ }
181
+ else {
182
+ return await customPage(routerError, req)
183
+ }
184
+ }
185
+ catch (pageError) {
186
+ console.error('Custom error page failed:', pageError)
187
+ }
188
+ }
189
+
190
+ // Default error response
191
+ return this.createErrorResponse(routerError, req)
192
+ }
193
+
194
+ /**
195
+ * Convert any error to RouterException
196
+ */
197
+ private normalizeError(error: unknown, req: EnhancedRequest): RouterException {
198
+ const errorContext: ErrorContext = {
199
+ requestId: req.requestId,
200
+ userId: req.user?.id,
201
+ traceId: req.traceId,
202
+ spanId: req.spanId,
203
+ route: req.params?.route || req.url,
204
+ method: req.method,
205
+ url: req.url,
206
+ userAgent: (req as any).userAgent?.() || undefined,
207
+ ip: (req as any).ip?.() || undefined,
208
+ timestamp: new Date(),
209
+ metadata: req.context,
210
+ }
211
+
212
+ // Already a RouterException
213
+ if (error instanceof RouterException) {
214
+ return error
215
+ }
216
+
217
+ // Standard Error
218
+ if (error instanceof Error) {
219
+ // Check for specific error types
220
+ if (error.name === 'ValidationError') {
221
+ return ErrorFactory.validation(error.message, {}, errorContext)
222
+ }
223
+
224
+ if (error.name === 'UnauthorizedError' || error.message.includes('unauthorized')) {
225
+ return ErrorFactory.authentication(error.message, errorContext)
226
+ }
227
+
228
+ if (error.name === 'ForbiddenError' || error.message.includes('forbidden')) {
229
+ return ErrorFactory.authorization(error.message, [], errorContext)
230
+ }
231
+
232
+ if (error.name === 'NotFoundError' || error.message.includes('not found')) {
233
+ return ErrorFactory.notFound(undefined, undefined, errorContext)
234
+ }
235
+
236
+ if (error.name === 'TimeoutError' || error.message.includes('timeout')) {
237
+ return ErrorFactory.timeout(30000, error.message, errorContext)
238
+ }
239
+
240
+ // Generic internal server error
241
+ return ErrorFactory.internalServer(error.message, error, errorContext)
242
+ }
243
+
244
+ // String error
245
+ if (typeof error === 'string') {
246
+ return ErrorFactory.internalServer(error, undefined, errorContext)
247
+ }
248
+
249
+ // Unknown error type
250
+ return ErrorFactory.internalServer('An unknown error occurred', undefined, errorContext)
251
+ }
252
+
253
+ /**
254
+ * Create standardized error response
255
+ */
256
+ private createErrorResponse(error: RouterException, _req: EnhancedRequest): Response {
257
+ const isDevelopment = this.config.development
258
+ const includeStackTrace = this.config.includeStackTrace || isDevelopment
259
+ const sanitizeErrors = this.config.sanitizeErrors && !isDevelopment
260
+
261
+ // Sanitize error message for production
262
+ let message = error.message
263
+ if (sanitizeErrors && error.statusCode >= 500) {
264
+ message = 'An internal server error occurred'
265
+ }
266
+
267
+ const errorResponse: any = {
268
+ error: {
269
+ code: error.code,
270
+ message,
271
+ statusCode: error.statusCode,
272
+ timestamp: error.timestamp.toISOString(),
273
+ requestId: error.context.requestId,
274
+ traceId: error.context.traceId,
275
+ },
276
+ }
277
+
278
+ // Add additional fields in development
279
+ if (isDevelopment) {
280
+ errorResponse.error.category = error.category
281
+ errorResponse.error.severity = error.severity
282
+ errorResponse.error.retryable = error.retryable
283
+ errorResponse.error.context = error.context
284
+ }
285
+
286
+ // Add stack trace if configured
287
+ if (includeStackTrace) {
288
+ errorResponse.error.stack = error.stack
289
+ if (error.cause) {
290
+ errorResponse.error.cause = {
291
+ name: error.cause.name,
292
+ message: error.cause.message,
293
+ stack: error.cause.stack,
294
+ }
295
+ }
296
+ }
297
+
298
+ // Add validation fields for validation errors
299
+ if ('fields' in error) {
300
+ errorResponse.error.fields = (error as any).fields
301
+ }
302
+
303
+ // Add specific error type fields
304
+ if ('allowedMethods' in error) {
305
+ errorResponse.error.allowedMethods = (error as any).allowedMethods
306
+ }
307
+
308
+ if ('retryAfter' in error) {
309
+ errorResponse.error.retryAfter = (error as any).retryAfter
310
+ }
311
+
312
+ const headers = new Headers({
313
+ 'Content-Type': 'application/json',
314
+ 'X-Error-Code': error.code,
315
+ 'X-Request-ID': error.context.requestId || '',
316
+ 'X-Trace-ID': error.context.traceId || '',
317
+ })
318
+
319
+ // Add specific headers for certain error types
320
+ if ('allowedMethods' in error) {
321
+ headers.set('Allow', (error as any).allowedMethods.join(', '))
322
+ }
323
+
324
+ if ('retryAfter' in error) {
325
+ headers.set('Retry-After', (error as any).retryAfter.toString())
326
+ }
327
+
328
+ if ('limit' in error) {
329
+ headers.set('X-RateLimit-Limit', (error as any).limit.toString())
330
+ headers.set('X-RateLimit-Remaining', (error as any).remaining.toString())
331
+ }
332
+
333
+ return new Response(JSON.stringify(errorResponse), {
334
+ status: error.statusCode,
335
+ headers,
336
+ })
337
+ }
338
+
339
+ /**
340
+ * Log error with appropriate level
341
+ */
342
+ private logError(error: RouterException, req: EnhancedRequest): void {
343
+ const logData = {
344
+ error: error.toJSON(),
345
+ request: {
346
+ method: req.method,
347
+ url: req.url,
348
+ headers: Object.fromEntries(req.headers.entries()),
349
+ userAgent: (req as any).userAgent?.() || undefined,
350
+ ip: (req as any).ip?.() || undefined,
351
+ requestId: req.requestId,
352
+ traceId: req.traceId,
353
+ },
354
+ }
355
+
356
+ switch (error.severity) {
357
+ case 'critical':
358
+ console.error('[CRITICAL ERROR]', logData)
359
+ break
360
+ case 'high':
361
+ console.error('[ERROR]', logData)
362
+ break
363
+ case 'medium':
364
+ console.warn('[WARNING]', logData)
365
+ break
366
+ case 'low':
367
+ console.warn('[INFO]', logData)
368
+ break
369
+ default:
370
+ console.error('[ERROR]', logData)
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Get error handler statistics
376
+ */
377
+ getStats(): {
378
+ errorReporting?: any
379
+ gracefulDegradation?: any
380
+ circuitBreakers?: any
381
+ } {
382
+ return {
383
+ errorReporting: this.errorReporting
384
+ ? {
385
+ breadcrumbs: this.errorReporting.getBreadcrumbs().length,
386
+ }
387
+ : undefined,
388
+ gracefulDegradation: this.gracefulDegradation
389
+ ? this.gracefulDegradation.getSystemHealth()
390
+ : undefined,
391
+ circuitBreakers: this.circuitBreakerRegistry
392
+ ? this.circuitBreakerRegistry.getAllMetrics()
393
+ : undefined,
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Cleanup resources
399
+ */
400
+ async cleanup(): Promise<void> {
401
+ if (this.errorReporting) {
402
+ await this.errorReporting.close()
403
+ }
404
+
405
+ if (this.gracefulDegradation) {
406
+ this.gracefulDegradation.stop()
407
+ }
408
+ }
409
+ }
410
+
411
+ /**
412
+ * Factory function to create advanced error handler middleware
413
+ */
414
+ export function createAdvancedErrorHandler(config: AdvancedErrorHandlerConfig = {}): {
415
+ middleware: (req: EnhancedRequest, next: () => Promise<Response>) => Promise<Response>
416
+ getStats: () => { errorReporting?: any, gracefulDegradation?: any, circuitBreakers?: any }
417
+ cleanup: () => Promise<void>
418
+ } {
419
+ const handler = new AdvancedErrorHandler(config)
420
+ return {
421
+ middleware: handler.middleware(),
422
+ getStats: (): { errorReporting?: any, gracefulDegradation?: any, circuitBreakers?: any } => handler.getStats(),
423
+ cleanup: (): Promise<void> => handler.cleanup(),
424
+ }
425
+ }
426
+
427
+ /**
428
+ * Preset configurations for different environments
429
+ */
430
+ export const ErrorHandlerPresets = {
431
+ development: (): AdvancedErrorHandlerConfig => ({
432
+ development: true,
433
+ includeStackTrace: true,
434
+ sanitizeErrors: false,
435
+ logErrors: true,
436
+ errorReporting: [],
437
+ }),
438
+
439
+ production: (sentryDsn?: string, bugsnagApiKey?: string): AdvancedErrorHandlerConfig => ({
440
+ development: false,
441
+ includeStackTrace: false,
442
+ sanitizeErrors: true,
443
+ logErrors: true,
444
+ errorReporting: [
445
+ ...(sentryDsn
446
+ ? [{
447
+ enabled: true,
448
+ service: 'sentry' as const,
449
+ dsn: sentryDsn,
450
+ environment: 'production',
451
+ sampleRate: 1.0,
452
+ breadcrumbs: { enabled: true, maxBreadcrumbs: 100 },
453
+ performance: { enabled: true, tracesSampleRate: 0.1 },
454
+ }]
455
+ : []),
456
+ ...(bugsnagApiKey
457
+ ? [{
458
+ enabled: true,
459
+ service: 'bugsnag' as const,
460
+ apiKey: bugsnagApiKey,
461
+ environment: 'production',
462
+ breadcrumbs: { enabled: true, maxBreadcrumbs: 25 },
463
+ }]
464
+ : []),
465
+ ],
466
+ }),
467
+
468
+ staging: (sentryDsn?: string): AdvancedErrorHandlerConfig => ({
469
+ development: false,
470
+ includeStackTrace: true,
471
+ sanitizeErrors: false,
472
+ logErrors: true,
473
+ errorReporting: sentryDsn
474
+ ? [{
475
+ enabled: true,
476
+ service: 'sentry',
477
+ dsn: sentryDsn,
478
+ environment: 'staging',
479
+ sampleRate: 1.0,
480
+ breadcrumbs: { enabled: true, maxBreadcrumbs: 100 },
481
+ }]
482
+ : [],
483
+ }),
484
+
485
+ resilient: (config: {
486
+ sentryDsn?: string
487
+ bugsnagApiKey?: string
488
+ services?: string[]
489
+ } = {}): AdvancedErrorHandlerConfig => ({
490
+ development: false,
491
+ includeStackTrace: false,
492
+ sanitizeErrors: true,
493
+ logErrors: true,
494
+ errorReporting: [
495
+ ...(config.sentryDsn
496
+ ? [{
497
+ enabled: true,
498
+ service: 'sentry' as const,
499
+ dsn: config.sentryDsn,
500
+ environment: 'production',
501
+ sampleRate: 1.0,
502
+ breadcrumbs: { enabled: true, maxBreadcrumbs: 100 },
503
+ performance: { enabled: true, tracesSampleRate: 0.1 },
504
+ }]
505
+ : []),
506
+ ...(config.bugsnagApiKey
507
+ ? [{
508
+ enabled: true,
509
+ service: 'bugsnag' as const,
510
+ apiKey: config.bugsnagApiKey,
511
+ environment: 'production',
512
+ breadcrumbs: { enabled: true, maxBreadcrumbs: 25 },
513
+ }]
514
+ : []),
515
+ ],
516
+ gracefulDegradation: {
517
+ enabled: true,
518
+ fallbackStrategies: Object.fromEntries(
519
+ (config.services || ['database', 'cache', 'external-api']).map(service => [
520
+ service,
521
+ {
522
+ type: 'cache' as const,
523
+ priority: 1,
524
+ timeout: 5000,
525
+ retries: 2,
526
+ backoff: { type: 'exponential' as const, delay: 1000, maxDelay: 5000 },
527
+ cacheConfig: {
528
+ key: `${service}:{url}:{method}`,
529
+ ttl: 3600,
530
+ staleWhileRevalidate: true,
531
+ },
532
+ },
533
+ ]),
534
+ ),
535
+ healthChecks: Object.fromEntries(
536
+ (config.services || []).map(service => [
537
+ service,
538
+ {
539
+ enabled: true,
540
+ endpoint: `/health/${service}`,
541
+ interval: 30000,
542
+ timeout: 5000,
543
+ retries: 3,
544
+ expectedStatus: [200],
545
+ },
546
+ ]),
547
+ ),
548
+ monitoring: {
549
+ enabled: true,
550
+ alertThresholds: {
551
+ errorRate: 10,
552
+ responseTime: 5000,
553
+ availability: 95,
554
+ },
555
+ },
556
+ },
557
+ circuitBreakers: (config.services || ['database', 'cache', 'external-api']).map(service => ({
558
+ name: service,
559
+ failureThreshold: 5,
560
+ recoveryTimeout: 60000,
561
+ timeout: 30000,
562
+ monitoringPeriod: 60000,
563
+ minimumRequests: 10,
564
+ errorThresholdPercentage: 50,
565
+ halfOpenMaxCalls: 3,
566
+ resetTimeout: 60000,
567
+ })),
568
+ }),
569
+ }