@stacksjs/bun-router 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +770 -0
- package/README.md +584 -261
- package/package.json +43 -48
- package/bin/cli.ts +0 -9
- package/dist/auth.d.ts +0 -134
- package/dist/cache/lru-cache.d.ts +0 -139
- package/dist/cache/middleware-memoization.d.ts +0 -151
- package/dist/cache/route-cache-warmer.d.ts +0 -161
- package/dist/cache/sqlite-cache.d.ts +0 -209
- package/dist/cache/streaming-cache.d.ts +0 -132
- package/dist/chunk-1mvtv6jw.js +0 -13012
- package/dist/cli/colors.d.ts +0 -15
- package/dist/cli/index.d.ts +0 -10
- package/dist/cli/middleware.d.ts +0 -31
- package/dist/cli/openapi.d.ts +0 -17
- package/dist/cli/router.d.ts +0 -15
- package/dist/cli/routes.d.ts +0 -29
- package/dist/cli/utils.d.ts +0 -74
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -3195
- package/dist/config.d.ts +0 -7
- package/dist/container/container.d.ts +0 -273
- package/dist/container/contextual-binding.d.ts +0 -240
- package/dist/container/decorators.d.ts +0 -141
- package/dist/container/service-provider.d.ts +0 -285
- package/dist/development/hot-reload.d.ts +0 -187
- package/dist/development/index.d.ts +0 -167
- package/dist/development/performance-profiler.d.ts +0 -217
- package/dist/development/route-debugger.d.ts +0 -154
- package/dist/development/route-inspector.d.ts +0 -211
- package/dist/development/typescript-utilities.d.ts +0 -209
- package/dist/docs.d.ts +0 -11
- package/dist/errors/circuit-breaker.d.ts +0 -195
- package/dist/errors/error-handler.d.ts +0 -88
- package/dist/errors/error-reporting.d.ts +0 -144
- package/dist/errors/exceptions.d.ts +0 -184
- package/dist/errors/graceful-degradation.d.ts +0 -154
- package/dist/errors/index.d.ts +0 -9
- package/dist/errors/router-errors.d.ts +0 -110
- package/dist/file-serving/static-files.d.ts +0 -143
- package/dist/index.d.ts +0 -14
- package/dist/index.js +0 -13933
- package/dist/middleware/auth.d.ts +0 -63
- package/dist/middleware/content_security_policy.d.ts +0 -53
- package/dist/middleware/cors.d.ts +0 -5
- package/dist/middleware/csrf.d.ts +0 -7
- package/dist/middleware/ddos_protection.d.ts +0 -39
- package/dist/middleware/file_security.d.ts +0 -26
- package/dist/middleware/file_upload.d.ts +0 -38
- package/dist/middleware/helmet.d.ts +0 -54
- package/dist/middleware/index.d.ts +0 -44
- package/dist/middleware/input_validation.d.ts +0 -45
- package/dist/middleware/json_body.d.ts +0 -4
- package/dist/middleware/performance_alerting.d.ts +0 -87
- package/dist/middleware/performance_dashboard.d.ts +0 -87
- package/dist/middleware/performance_monitor.d.ts +0 -209
- package/dist/middleware/pipeline.d.ts +0 -131
- package/dist/middleware/rate_limit.d.ts +0 -36
- package/dist/middleware/request_id.d.ts +0 -4
- package/dist/middleware/request_signing.d.ts +0 -153
- package/dist/middleware/request_tracer.d.ts +0 -72
- package/dist/middleware/response_cache.d.ts +0 -97
- package/dist/middleware/security.d.ts +0 -69
- package/dist/middleware/security_suite.d.ts +0 -46
- package/dist/middleware/session.d.ts +0 -23
- package/dist/model-binding/index.d.ts +0 -2
- package/dist/model-binding/model-middleware.d.ts +0 -118
- package/dist/model-binding/model-registry.d.ts +0 -164
- package/dist/model-binding.d.ts +0 -185
- package/dist/model-resolver-factory.d.ts +0 -31
- package/dist/observability/correlation.d.ts +0 -187
- package/dist/observability/health-checks.d.ts +0 -186
- package/dist/observability/index.d.ts +0 -60
- package/dist/observability/integration.d.ts +0 -147
- package/dist/observability/metrics.d.ts +0 -184
- package/dist/observability/tracing.d.ts +0 -187
- package/dist/optimization/bun-utilities.d.ts +0 -224
- package/dist/query-builder-integration.d.ts +0 -36
- package/dist/request/context.d.ts +0 -34
- package/dist/request/enhanced-request.d.ts +0 -213
- package/dist/request/macros.d.ts +0 -300
- package/dist/response/macros.d.ts +0 -245
- package/dist/response/response-factory.d.ts +0 -133
- package/dist/router/api-routes.d.ts +0 -5
- package/dist/router/file-based-routing.d.ts +0 -118
- package/dist/router/file-streaming.d.ts +0 -5
- package/dist/router/fluent-router.d.ts +0 -315
- package/dist/router/fluent-routing.d.ts +0 -271
- package/dist/router/group-organization.d.ts +0 -5
- package/dist/router/handler-resolver.d.ts +0 -24
- package/dist/router/http-methods.d.ts +0 -10
- package/dist/router/index.d.ts +0 -114
- package/dist/router/middleware-groups.d.ts +0 -94
- package/dist/router/middleware-integration.d.ts +0 -112
- package/dist/router/middleware.d.ts +0 -5
- package/dist/router/model-binding.d.ts +0 -5
- package/dist/router/optimized-route-matching.d.ts +0 -6
- package/dist/router/route-building.d.ts +0 -5
- package/dist/router/route-compiler.d.ts +0 -153
- package/dist/router/route-matching.d.ts +0 -5
- package/dist/router/route-trie.d.ts +0 -114
- package/dist/router/router.d.ts +0 -294
- package/dist/router/server.d.ts +0 -5
- package/dist/router/validation-integration.d.ts +0 -170
- package/dist/router/view-rendering.d.ts +0 -5
- package/dist/router/websocket.d.ts +0 -5
- package/dist/routing/route-caching.d.ts +0 -129
- package/dist/routing/route-throttling.d.ts +0 -150
- package/dist/routing/subdomain-routing.d.ts +0 -206
- package/dist/session/database-store.d.ts +0 -51
- package/dist/session/file-store.d.ts +0 -22
- package/dist/session/index.d.ts +0 -106
- package/dist/session/memory-store.d.ts +0 -21
- package/dist/session/redis-store.d.ts +0 -31
- package/dist/streaming/index.d.ts +0 -3
- package/dist/streaming/sse-handler.d.ts +0 -138
- package/dist/streaming/stream-handler.d.ts +0 -114
- package/dist/testing/auth-testing.d.ts +0 -156
- package/dist/testing/file-upload-testing.d.ts +0 -190
- package/dist/testing/index.d.ts +0 -10
- package/dist/testing/middleware-testing.d.ts +0 -138
- package/dist/testing/model-binding-testing.d.ts +0 -186
- package/dist/testing/performance-testing.d.ts +0 -235
- package/dist/testing/test-client.d.ts +0 -117
- package/dist/testing/test-request.d.ts +0 -85
- package/dist/testing/test-response.d.ts +0 -90
- package/dist/testing/types.d.ts +0 -207
- package/dist/testing/websocket-testing.d.ts +0 -227
- package/dist/types/controller-types.d.ts +0 -208
- package/dist/types/core.d.ts +0 -543
- package/dist/types/middleware-types.d.ts +0 -227
- package/dist/types/request-response-augmentation.d.ts +0 -261
- package/dist/types/route-inference.d.ts +0 -168
- package/dist/types.d.ts +0 -1782
- package/dist/url.d.ts +0 -56
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/query-preservation.d.ts +0 -48
- package/dist/utils.d.ts +0 -69
- package/dist/validation/validator.d.ts +0 -140
- package/dist/websocket/clustering.d.ts +0 -185
- package/src/auth.ts +0 -469
- package/src/cache/lru-cache.ts +0 -457
- package/src/cache/middleware-memoization.ts +0 -531
- package/src/cache/route-cache-warmer.ts +0 -486
- package/src/cache/sqlite-cache.ts +0 -783
- package/src/cache/streaming-cache.ts +0 -572
- package/src/cli/colors.ts +0 -29
- package/src/cli/index.ts +0 -287
- package/src/cli/middleware.ts +0 -291
- package/src/cli/openapi.ts +0 -407
- package/src/cli/router.ts +0 -188
- package/src/cli/routes.ts +0 -265
- package/src/cli/utils.ts +0 -531
- package/src/cli.ts +0 -5
- package/src/config.ts +0 -322
- package/src/container/container.ts +0 -740
- package/src/container/contextual-binding.ts +0 -603
- package/src/container/decorators.ts +0 -359
- package/src/container/service-provider.ts +0 -596
- package/src/development/hot-reload.ts +0 -673
- package/src/development/index.ts +0 -499
- package/src/development/performance-profiler.ts +0 -717
- package/src/development/route-debugger.ts +0 -527
- package/src/development/route-inspector.ts +0 -749
- package/src/development/typescript-utilities.ts +0 -682
- package/src/docs.ts +0 -397
- package/src/errors/circuit-breaker.ts +0 -732
- package/src/errors/error-handler.ts +0 -569
- package/src/errors/error-reporting.ts +0 -672
- package/src/errors/exceptions.ts +0 -536
- package/src/errors/graceful-degradation.ts +0 -621
- package/src/errors/index.ts +0 -21
- package/src/errors/router-errors.ts +0 -632
- package/src/file-serving/static-files.ts +0 -581
- package/src/index.ts +0 -14
- package/src/middleware/auth.ts +0 -219
- package/src/middleware/content_security_policy.ts +0 -215
- package/src/middleware/cors.ts +0 -74
- package/src/middleware/csrf.ts +0 -108
- package/src/middleware/ddos_protection.ts +0 -255
- package/src/middleware/file_security.ts +0 -191
- package/src/middleware/file_upload.ts +0 -264
- package/src/middleware/helmet.ts +0 -268
- package/src/middleware/index.ts +0 -117
- package/src/middleware/input_validation.ts +0 -449
- package/src/middleware/json_body.ts +0 -37
- package/src/middleware/performance_alerting.ts +0 -538
- package/src/middleware/performance_dashboard.ts +0 -661
- package/src/middleware/performance_monitor.ts +0 -943
- package/src/middleware/pipeline.ts +0 -489
- package/src/middleware/rate_limit.ts +0 -245
- package/src/middleware/request_id.ts +0 -36
- package/src/middleware/request_signing.ts +0 -636
- package/src/middleware/request_tracer.ts +0 -636
- package/src/middleware/response_cache.ts +0 -743
- package/src/middleware/security.ts +0 -482
- package/src/middleware/security_suite.ts +0 -257
- package/src/middleware/session.ts +0 -91
- package/src/model-binding/index.ts +0 -18
- package/src/model-binding/model-middleware.ts +0 -425
- package/src/model-binding/model-registry.ts +0 -550
- package/src/model-binding.ts +0 -370
- package/src/model-resolver-factory.ts +0 -106
- package/src/observability/correlation.ts +0 -691
- package/src/observability/health-checks.ts +0 -729
- package/src/observability/index.ts +0 -184
- package/src/observability/integration.ts +0 -548
- package/src/observability/metrics.ts +0 -753
- package/src/observability/tracing.ts +0 -638
- package/src/optimization/bun-utilities.ts +0 -778
- package/src/query-builder-integration.ts +0 -137
- package/src/request/context.ts +0 -62
- package/src/request/enhanced-request.ts +0 -857
- package/src/request/macros.ts +0 -688
- package/src/response/macros.ts +0 -612
- package/src/response/response-factory.ts +0 -596
- package/src/router/api-routes.ts +0 -243
- package/src/router/file-based-routing.ts +0 -670
- package/src/router/file-streaming.ts +0 -372
- package/src/router/fluent-router.ts +0 -927
- package/src/router/fluent-routing.ts +0 -797
- package/src/router/group-organization.ts +0 -213
- package/src/router/handler-resolver.ts +0 -291
- package/src/router/http-methods.ts +0 -377
- package/src/router/index.ts +0 -187
- package/src/router/middleware-groups.ts +0 -222
- package/src/router/middleware-integration.ts +0 -399
- package/src/router/middleware.ts +0 -231
- package/src/router/model-binding.ts +0 -215
- package/src/router/optimized-route-matching.ts +0 -253
- package/src/router/route-building.ts +0 -212
- package/src/router/route-compiler.ts +0 -702
- package/src/router/route-matching.ts +0 -349
- package/src/router/route-trie.ts +0 -464
- package/src/router/router.ts +0 -1581
- package/src/router/server.ts +0 -462
- package/src/router/validation-integration.ts +0 -443
- package/src/router/view-rendering.ts +0 -233
- package/src/router/websocket.ts +0 -100
- package/src/routing/route-caching.ts +0 -402
- package/src/routing/route-throttling.ts +0 -469
- package/src/routing/subdomain-routing.ts +0 -492
- package/src/session/database-store.ts +0 -109
- package/src/session/file-store.ts +0 -148
- package/src/session/index.ts +0 -244
- package/src/session/memory-store.ts +0 -88
- package/src/session/redis-store.ts +0 -93
- package/src/streaming/index.ts +0 -17
- package/src/streaming/sse-handler.ts +0 -482
- package/src/streaming/stream-handler.ts +0 -552
- package/src/testing/auth-testing.ts +0 -446
- package/src/testing/file-upload-testing.ts +0 -543
- package/src/testing/index.ts +0 -10
- package/src/testing/middleware-testing.ts +0 -322
- package/src/testing/model-binding-testing.ts +0 -645
- package/src/testing/performance-testing.ts +0 -738
- package/src/testing/test-client.ts +0 -310
- package/src/testing/test-request.ts +0 -315
- package/src/testing/test-response.ts +0 -332
- package/src/testing/types.ts +0 -224
- package/src/testing/websocket-testing.ts +0 -590
- package/src/types/controller-types.ts +0 -385
- package/src/types/core.ts +0 -683
- package/src/types/middleware-types.ts +0 -419
- package/src/types/request-response-augmentation.ts +0 -489
- package/src/types/route-inference.ts +0 -357
- package/src/types.ts +0 -2055
- package/src/url.ts +0 -126
- package/src/utils/index.ts +0 -1
- package/src/utils/query-preservation.ts +0 -201
- package/src/utils.ts +0 -327
- package/src/validation/validator.ts +0 -685
- package/src/websocket/clustering.ts +0 -762
package/src/errors/exceptions.ts
DELETED
|
@@ -1,536 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Advanced Error Handling - Exception Hierarchy
|
|
3
|
-
*
|
|
4
|
-
* Comprehensive exception types with metadata, stack traces, and context information
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export interface ErrorContext {
|
|
8
|
-
requestId?: string
|
|
9
|
-
userId?: string | number
|
|
10
|
-
traceId?: string
|
|
11
|
-
spanId?: string
|
|
12
|
-
route?: string
|
|
13
|
-
method?: string
|
|
14
|
-
url?: string
|
|
15
|
-
userAgent?: string
|
|
16
|
-
ip?: string
|
|
17
|
-
timestamp?: Date
|
|
18
|
-
metadata?: Record<string, unknown>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface ErrorDetails {
|
|
22
|
-
code: string
|
|
23
|
-
message: string
|
|
24
|
-
context?: ErrorContext
|
|
25
|
-
cause?: Error
|
|
26
|
-
statusCode?: number
|
|
27
|
-
retryable?: boolean
|
|
28
|
-
severity?: 'low' | 'medium' | 'high' | 'critical'
|
|
29
|
-
category?: 'validation' | 'authentication' | 'authorization' | 'network' | 'database' | 'external' | 'system' | 'business'
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Base exception class for all router errors
|
|
34
|
-
*/
|
|
35
|
-
export abstract class RouterException extends Error {
|
|
36
|
-
public readonly code: string
|
|
37
|
-
public readonly statusCode: number
|
|
38
|
-
public readonly context: ErrorContext
|
|
39
|
-
public readonly retryable: boolean
|
|
40
|
-
public readonly severity: 'low' | 'medium' | 'high' | 'critical'
|
|
41
|
-
public readonly category: string
|
|
42
|
-
public readonly timestamp: Date
|
|
43
|
-
public readonly cause?: Error
|
|
44
|
-
|
|
45
|
-
constructor(details: ErrorDetails) {
|
|
46
|
-
super(details.message)
|
|
47
|
-
this.name = this.constructor.name
|
|
48
|
-
this.code = details.code
|
|
49
|
-
this.statusCode = details.statusCode || 500
|
|
50
|
-
this.context = details.context || {}
|
|
51
|
-
this.retryable = details.retryable || false
|
|
52
|
-
this.severity = details.severity || 'medium'
|
|
53
|
-
this.category = details.category || 'system'
|
|
54
|
-
this.timestamp = new Date()
|
|
55
|
-
this.cause = details.cause
|
|
56
|
-
|
|
57
|
-
// Maintain proper stack trace
|
|
58
|
-
if (Error.captureStackTrace) {
|
|
59
|
-
Error.captureStackTrace(this, this.constructor)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Convert error to JSON for logging/reporting
|
|
65
|
-
*/
|
|
66
|
-
toJSON(): Record<string, any> {
|
|
67
|
-
return {
|
|
68
|
-
name: this.name,
|
|
69
|
-
code: this.code,
|
|
70
|
-
message: this.message,
|
|
71
|
-
statusCode: this.statusCode,
|
|
72
|
-
context: this.context,
|
|
73
|
-
retryable: this.retryable,
|
|
74
|
-
severity: this.severity,
|
|
75
|
-
category: this.category,
|
|
76
|
-
timestamp: this.timestamp.toISOString(),
|
|
77
|
-
stack: this.stack,
|
|
78
|
-
cause: this.cause
|
|
79
|
-
? {
|
|
80
|
-
name: this.cause.name,
|
|
81
|
-
message: this.cause.message,
|
|
82
|
-
stack: this.cause.stack,
|
|
83
|
-
}
|
|
84
|
-
: undefined,
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Create HTTP response for this error
|
|
90
|
-
*/
|
|
91
|
-
toResponse(): Response {
|
|
92
|
-
const body = {
|
|
93
|
-
error: {
|
|
94
|
-
code: this.code,
|
|
95
|
-
message: this.message,
|
|
96
|
-
statusCode: this.statusCode,
|
|
97
|
-
timestamp: this.timestamp.toISOString(),
|
|
98
|
-
requestId: this.context.requestId,
|
|
99
|
-
},
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return new Response(JSON.stringify(body), {
|
|
103
|
-
status: this.statusCode,
|
|
104
|
-
headers: {
|
|
105
|
-
'Content-Type': 'application/json',
|
|
106
|
-
'X-Error-Code': this.code,
|
|
107
|
-
'X-Request-ID': this.context.requestId || '',
|
|
108
|
-
},
|
|
109
|
-
})
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Validation errors (400)
|
|
115
|
-
*/
|
|
116
|
-
export class ValidationException extends RouterException {
|
|
117
|
-
public readonly fields: Record<string, string[]>
|
|
118
|
-
|
|
119
|
-
constructor(message: string, fields: Record<string, string[]> = {}, context?: ErrorContext) {
|
|
120
|
-
super({
|
|
121
|
-
code: 'VALIDATION_ERROR',
|
|
122
|
-
message,
|
|
123
|
-
statusCode: 400,
|
|
124
|
-
context,
|
|
125
|
-
retryable: false,
|
|
126
|
-
severity: 'low',
|
|
127
|
-
category: 'validation',
|
|
128
|
-
})
|
|
129
|
-
this.fields = fields
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
toResponse(): Response {
|
|
133
|
-
const body = {
|
|
134
|
-
error: {
|
|
135
|
-
code: this.code,
|
|
136
|
-
message: this.message,
|
|
137
|
-
statusCode: this.statusCode,
|
|
138
|
-
timestamp: this.timestamp.toISOString(),
|
|
139
|
-
requestId: this.context.requestId,
|
|
140
|
-
fields: this.fields,
|
|
141
|
-
},
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return new Response(JSON.stringify(body), {
|
|
145
|
-
status: this.statusCode,
|
|
146
|
-
headers: {
|
|
147
|
-
'Content-Type': 'application/json',
|
|
148
|
-
'X-Error-Code': this.code,
|
|
149
|
-
'X-Request-ID': this.context.requestId || '',
|
|
150
|
-
},
|
|
151
|
-
})
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Authentication errors (401)
|
|
157
|
-
*/
|
|
158
|
-
export class AuthenticationException extends RouterException {
|
|
159
|
-
constructor(message: string = 'Authentication required', context?: ErrorContext) {
|
|
160
|
-
super({
|
|
161
|
-
code: 'AUTHENTICATION_ERROR',
|
|
162
|
-
message,
|
|
163
|
-
statusCode: 401,
|
|
164
|
-
context,
|
|
165
|
-
retryable: false,
|
|
166
|
-
severity: 'medium',
|
|
167
|
-
category: 'authentication',
|
|
168
|
-
})
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Authorization errors (403)
|
|
174
|
-
*/
|
|
175
|
-
export class AuthorizationException extends RouterException {
|
|
176
|
-
public readonly requiredPermissions?: string[]
|
|
177
|
-
|
|
178
|
-
constructor(message: string = 'Access denied', requiredPermissions?: string[], context?: ErrorContext) {
|
|
179
|
-
super({
|
|
180
|
-
code: 'AUTHORIZATION_ERROR',
|
|
181
|
-
message,
|
|
182
|
-
statusCode: 403,
|
|
183
|
-
context,
|
|
184
|
-
retryable: false,
|
|
185
|
-
severity: 'medium',
|
|
186
|
-
category: 'authorization',
|
|
187
|
-
})
|
|
188
|
-
this.requiredPermissions = requiredPermissions
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Resource not found errors (404)
|
|
194
|
-
*/
|
|
195
|
-
export class NotFoundException extends RouterException {
|
|
196
|
-
public readonly resource?: string
|
|
197
|
-
public readonly resourceId?: string
|
|
198
|
-
|
|
199
|
-
constructor(message: string = 'Resource not found', resource?: string, resourceId?: string, context?: ErrorContext) {
|
|
200
|
-
super({
|
|
201
|
-
code: 'NOT_FOUND',
|
|
202
|
-
message,
|
|
203
|
-
statusCode: 404,
|
|
204
|
-
context,
|
|
205
|
-
retryable: false,
|
|
206
|
-
severity: 'low',
|
|
207
|
-
category: 'business',
|
|
208
|
-
})
|
|
209
|
-
this.resource = resource
|
|
210
|
-
this.resourceId = resourceId
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Method not allowed errors (405)
|
|
216
|
-
*/
|
|
217
|
-
export class MethodNotAllowedException extends RouterException {
|
|
218
|
-
public readonly allowedMethods: string[]
|
|
219
|
-
|
|
220
|
-
constructor(method: string, allowedMethods: string[], context?: ErrorContext) {
|
|
221
|
-
super({
|
|
222
|
-
code: 'METHOD_NOT_ALLOWED',
|
|
223
|
-
message: `Method ${method} not allowed. Allowed methods: ${allowedMethods.join(', ')}`,
|
|
224
|
-
statusCode: 405,
|
|
225
|
-
context,
|
|
226
|
-
retryable: false,
|
|
227
|
-
severity: 'low',
|
|
228
|
-
category: 'business',
|
|
229
|
-
})
|
|
230
|
-
this.allowedMethods = allowedMethods
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
toResponse(): Response {
|
|
234
|
-
const response = super.toResponse()
|
|
235
|
-
response.headers.set('Allow', this.allowedMethods.join(', '))
|
|
236
|
-
return response
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Request timeout errors (408)
|
|
242
|
-
*/
|
|
243
|
-
export class TimeoutException extends RouterException {
|
|
244
|
-
public readonly timeoutMs: number
|
|
245
|
-
|
|
246
|
-
constructor(message: string = 'Request timeout', timeoutMs: number, context?: ErrorContext) {
|
|
247
|
-
super({
|
|
248
|
-
code: 'REQUEST_TIMEOUT',
|
|
249
|
-
message,
|
|
250
|
-
statusCode: 408,
|
|
251
|
-
context,
|
|
252
|
-
retryable: true,
|
|
253
|
-
severity: 'medium',
|
|
254
|
-
category: 'network',
|
|
255
|
-
})
|
|
256
|
-
this.timeoutMs = timeoutMs
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Rate limit exceeded errors (429)
|
|
262
|
-
*/
|
|
263
|
-
export class RateLimitException extends RouterException {
|
|
264
|
-
public readonly retryAfter: number
|
|
265
|
-
public readonly limit: number
|
|
266
|
-
public readonly remaining: number
|
|
267
|
-
|
|
268
|
-
constructor(
|
|
269
|
-
message: string = 'Rate limit exceeded',
|
|
270
|
-
retryAfter: number,
|
|
271
|
-
limit: number,
|
|
272
|
-
remaining: number = 0,
|
|
273
|
-
context?: ErrorContext,
|
|
274
|
-
) {
|
|
275
|
-
super({
|
|
276
|
-
code: 'RATE_LIMIT_EXCEEDED',
|
|
277
|
-
message,
|
|
278
|
-
statusCode: 429,
|
|
279
|
-
context,
|
|
280
|
-
retryable: true,
|
|
281
|
-
severity: 'medium',
|
|
282
|
-
category: 'network',
|
|
283
|
-
})
|
|
284
|
-
this.retryAfter = retryAfter
|
|
285
|
-
this.limit = limit
|
|
286
|
-
this.remaining = remaining
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
toResponse(): Response {
|
|
290
|
-
const response = super.toResponse()
|
|
291
|
-
response.headers.set('Retry-After', this.retryAfter.toString())
|
|
292
|
-
response.headers.set('X-RateLimit-Limit', this.limit.toString())
|
|
293
|
-
response.headers.set('X-RateLimit-Remaining', this.remaining.toString())
|
|
294
|
-
return response
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Internal server errors (500)
|
|
300
|
-
*/
|
|
301
|
-
export class InternalServerException extends RouterException {
|
|
302
|
-
constructor(message: string = 'Internal server error', cause?: Error, context?: ErrorContext) {
|
|
303
|
-
super({
|
|
304
|
-
code: 'INTERNAL_SERVER_ERROR',
|
|
305
|
-
message,
|
|
306
|
-
statusCode: 500,
|
|
307
|
-
context,
|
|
308
|
-
cause,
|
|
309
|
-
retryable: true,
|
|
310
|
-
severity: 'high',
|
|
311
|
-
category: 'system',
|
|
312
|
-
})
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Service unavailable errors (503)
|
|
318
|
-
*/
|
|
319
|
-
export class ServiceUnavailableException extends RouterException {
|
|
320
|
-
public readonly retryAfter?: number
|
|
321
|
-
|
|
322
|
-
constructor(message: string = 'Service unavailable', retryAfter?: number, context?: ErrorContext) {
|
|
323
|
-
super({
|
|
324
|
-
code: 'SERVICE_UNAVAILABLE',
|
|
325
|
-
message,
|
|
326
|
-
statusCode: 503,
|
|
327
|
-
context,
|
|
328
|
-
retryable: true,
|
|
329
|
-
severity: 'high',
|
|
330
|
-
category: 'system',
|
|
331
|
-
})
|
|
332
|
-
this.retryAfter = retryAfter
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
toResponse(): Response {
|
|
336
|
-
const response = super.toResponse()
|
|
337
|
-
if (this.retryAfter) {
|
|
338
|
-
response.headers.set('Retry-After', this.retryAfter.toString())
|
|
339
|
-
}
|
|
340
|
-
return response
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Database errors
|
|
346
|
-
*/
|
|
347
|
-
export class DatabaseException extends RouterException {
|
|
348
|
-
public readonly query?: string
|
|
349
|
-
public readonly operation?: string
|
|
350
|
-
|
|
351
|
-
constructor(message: string, operation?: string, query?: string, cause?: Error, context?: ErrorContext) {
|
|
352
|
-
super({
|
|
353
|
-
code: 'DATABASE_ERROR',
|
|
354
|
-
message,
|
|
355
|
-
statusCode: 500,
|
|
356
|
-
context,
|
|
357
|
-
cause,
|
|
358
|
-
retryable: true,
|
|
359
|
-
severity: 'high',
|
|
360
|
-
category: 'database',
|
|
361
|
-
})
|
|
362
|
-
this.operation = operation
|
|
363
|
-
this.query = query
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* External service errors
|
|
369
|
-
*/
|
|
370
|
-
export class ExternalServiceException extends RouterException {
|
|
371
|
-
public readonly service: string
|
|
372
|
-
public readonly endpoint?: string
|
|
373
|
-
|
|
374
|
-
constructor(
|
|
375
|
-
message: string,
|
|
376
|
-
service: string,
|
|
377
|
-
endpoint?: string,
|
|
378
|
-
statusCode: number = 502,
|
|
379
|
-
cause?: Error,
|
|
380
|
-
context?: ErrorContext,
|
|
381
|
-
) {
|
|
382
|
-
super({
|
|
383
|
-
code: 'EXTERNAL_SERVICE_ERROR',
|
|
384
|
-
message,
|
|
385
|
-
statusCode,
|
|
386
|
-
context,
|
|
387
|
-
cause,
|
|
388
|
-
retryable: true,
|
|
389
|
-
severity: 'medium',
|
|
390
|
-
category: 'external',
|
|
391
|
-
})
|
|
392
|
-
this.service = service
|
|
393
|
-
this.endpoint = endpoint
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Circuit breaker open errors
|
|
399
|
-
*/
|
|
400
|
-
export class CircuitBreakerOpenException extends RouterException {
|
|
401
|
-
public readonly service: string
|
|
402
|
-
public readonly nextAttemptAt: Date
|
|
403
|
-
|
|
404
|
-
constructor(service: string, nextAttemptAt: Date, context?: ErrorContext) {
|
|
405
|
-
super({
|
|
406
|
-
code: 'CIRCUIT_BREAKER_OPEN',
|
|
407
|
-
message: `Circuit breaker is open for service: ${service}. Next attempt at: ${nextAttemptAt.toISOString()}`,
|
|
408
|
-
statusCode: 503,
|
|
409
|
-
context,
|
|
410
|
-
retryable: true,
|
|
411
|
-
severity: 'medium',
|
|
412
|
-
category: 'external',
|
|
413
|
-
})
|
|
414
|
-
this.service = service
|
|
415
|
-
this.nextAttemptAt = nextAttemptAt
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Business logic errors
|
|
421
|
-
*/
|
|
422
|
-
export class BusinessLogicException extends RouterException {
|
|
423
|
-
public readonly businessRule: string
|
|
424
|
-
|
|
425
|
-
constructor(message: string, businessRule: string, context?: ErrorContext) {
|
|
426
|
-
super({
|
|
427
|
-
code: 'BUSINESS_LOGIC_ERROR',
|
|
428
|
-
message,
|
|
429
|
-
statusCode: 422,
|
|
430
|
-
context,
|
|
431
|
-
retryable: false,
|
|
432
|
-
severity: 'low',
|
|
433
|
-
category: 'business',
|
|
434
|
-
})
|
|
435
|
-
this.businessRule = businessRule
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Configuration errors
|
|
441
|
-
*/
|
|
442
|
-
export class ConfigurationException extends RouterException {
|
|
443
|
-
public readonly configKey: string
|
|
444
|
-
|
|
445
|
-
constructor(message: string, configKey: string, context?: ErrorContext) {
|
|
446
|
-
super({
|
|
447
|
-
code: 'CONFIGURATION_ERROR',
|
|
448
|
-
message,
|
|
449
|
-
statusCode: 500,
|
|
450
|
-
context,
|
|
451
|
-
retryable: false,
|
|
452
|
-
severity: 'critical',
|
|
453
|
-
category: 'system',
|
|
454
|
-
})
|
|
455
|
-
this.configKey = configKey
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* File system errors
|
|
461
|
-
*/
|
|
462
|
-
export class FileSystemException extends RouterException {
|
|
463
|
-
public readonly path: string
|
|
464
|
-
public readonly operation: string
|
|
465
|
-
|
|
466
|
-
constructor(message: string, path: string, operation: string, cause?: Error, context?: ErrorContext) {
|
|
467
|
-
super({
|
|
468
|
-
code: 'FILESYSTEM_ERROR',
|
|
469
|
-
message,
|
|
470
|
-
statusCode: 500,
|
|
471
|
-
context,
|
|
472
|
-
cause,
|
|
473
|
-
retryable: false,
|
|
474
|
-
severity: 'medium',
|
|
475
|
-
category: 'system',
|
|
476
|
-
})
|
|
477
|
-
this.path = path
|
|
478
|
-
this.operation = operation
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
483
|
-
* Factory functions for common errors
|
|
484
|
-
*/
|
|
485
|
-
export const ErrorFactory = {
|
|
486
|
-
validation: (message: string, fields?: Record<string, string[]>, context?: ErrorContext): ValidationException =>
|
|
487
|
-
new ValidationException(message, fields, context),
|
|
488
|
-
|
|
489
|
-
authentication: (message?: string, context?: ErrorContext): AuthenticationException =>
|
|
490
|
-
new AuthenticationException(message, context),
|
|
491
|
-
|
|
492
|
-
authorization: (message?: string, requiredPermissions?: string[], context?: ErrorContext): AuthorizationException =>
|
|
493
|
-
new AuthorizationException(message, requiredPermissions, context),
|
|
494
|
-
|
|
495
|
-
notFound: (resource?: string, resourceId?: string, context?: ErrorContext): NotFoundException =>
|
|
496
|
-
new NotFoundException(undefined, resource, resourceId, context),
|
|
497
|
-
|
|
498
|
-
methodNotAllowed: (method: string, allowedMethods: string[], context?: ErrorContext): MethodNotAllowedException =>
|
|
499
|
-
new MethodNotAllowedException(method, allowedMethods, context),
|
|
500
|
-
|
|
501
|
-
timeout: (timeoutMs: number, message?: string, context?: ErrorContext): TimeoutException =>
|
|
502
|
-
new TimeoutException(message, timeoutMs, context),
|
|
503
|
-
|
|
504
|
-
rateLimit: (retryAfter: number, limit: number, remaining?: number, context?: ErrorContext): RateLimitException =>
|
|
505
|
-
new RateLimitException(undefined, retryAfter, limit, remaining, context),
|
|
506
|
-
|
|
507
|
-
internalServer: (message?: string, cause?: Error, context?: ErrorContext): InternalServerException =>
|
|
508
|
-
new InternalServerException(message, cause, context),
|
|
509
|
-
|
|
510
|
-
serviceUnavailable: (message?: string, retryAfter?: number, context?: ErrorContext): ServiceUnavailableException =>
|
|
511
|
-
new ServiceUnavailableException(message, retryAfter, context),
|
|
512
|
-
|
|
513
|
-
database: (message: string, operation?: string, query?: string, cause?: Error, context?: ErrorContext): DatabaseException =>
|
|
514
|
-
new DatabaseException(message, operation, query, cause, context),
|
|
515
|
-
|
|
516
|
-
externalService: (
|
|
517
|
-
message: string,
|
|
518
|
-
service: string,
|
|
519
|
-
endpoint?: string,
|
|
520
|
-
statusCode?: number,
|
|
521
|
-
cause?: Error,
|
|
522
|
-
context?: ErrorContext,
|
|
523
|
-
): ExternalServiceException => new ExternalServiceException(message, service, endpoint, statusCode, cause, context),
|
|
524
|
-
|
|
525
|
-
circuitBreakerOpen: (service: string, nextAttemptAt: Date, context?: ErrorContext): CircuitBreakerOpenException =>
|
|
526
|
-
new CircuitBreakerOpenException(service, nextAttemptAt, context),
|
|
527
|
-
|
|
528
|
-
businessLogic: (message: string, businessRule: string, context?: ErrorContext): BusinessLogicException =>
|
|
529
|
-
new BusinessLogicException(message, businessRule, context),
|
|
530
|
-
|
|
531
|
-
configuration: (message: string, configKey: string, context?: ErrorContext): ConfigurationException =>
|
|
532
|
-
new ConfigurationException(message, configKey, context),
|
|
533
|
-
|
|
534
|
-
fileSystem: (message: string, path: string, operation: string, cause?: Error, context?: ErrorContext): FileSystemException =>
|
|
535
|
-
new FileSystemException(message, path, operation, cause, context),
|
|
536
|
-
}
|