@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
|
@@ -1,486 +0,0 @@
|
|
|
1
|
-
import type { LRUCache } from './lru-cache'
|
|
2
|
-
import type { StreamingCache } from './streaming-cache'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Route cache warming system for pre-populating caches with common routes
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export interface WarmupRoute {
|
|
9
|
-
path: string
|
|
10
|
-
method: string
|
|
11
|
-
priority: number // Higher number = higher priority
|
|
12
|
-
frequency: number // Expected requests per minute
|
|
13
|
-
params?: Record<string, string>
|
|
14
|
-
query?: Record<string, string>
|
|
15
|
-
headers?: Record<string, string>
|
|
16
|
-
warmupData?: any // Pre-computed data for the route
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface AnalyticsRoute {
|
|
20
|
-
path: string
|
|
21
|
-
method: string
|
|
22
|
-
frequency: number
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface RecentRoute {
|
|
26
|
-
path: string
|
|
27
|
-
method: string
|
|
28
|
-
timestamp: number
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface PrecomputeRoute {
|
|
32
|
-
path: string
|
|
33
|
-
method: string
|
|
34
|
-
computeFunction: () => Promise<any>
|
|
35
|
-
cacheKey?: string
|
|
36
|
-
ttl?: number
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface UserSegment {
|
|
40
|
-
segment: string
|
|
41
|
-
commonRoutes: string[]
|
|
42
|
-
priority: number
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface TimeRange {
|
|
46
|
-
start: number
|
|
47
|
-
end: number
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface TimeBasedPattern {
|
|
51
|
-
timeRange: TimeRange
|
|
52
|
-
routes: string[]
|
|
53
|
-
priority: number
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface GeographicPattern {
|
|
57
|
-
region: string
|
|
58
|
-
routes: string[]
|
|
59
|
-
priority: number
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface IntelligentWarmupPatterns {
|
|
63
|
-
userSegments?: UserSegment[]
|
|
64
|
-
timeBasedPatterns?: TimeBasedPattern[]
|
|
65
|
-
geographicPatterns?: GeographicPattern[]
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface WarmupConfig {
|
|
69
|
-
enabled: boolean
|
|
70
|
-
maxConcurrency: number // Maximum concurrent warmup requests
|
|
71
|
-
warmupTimeout: number // Timeout for individual warmup requests
|
|
72
|
-
retryAttempts: number
|
|
73
|
-
retryDelay: number
|
|
74
|
-
scheduleInterval?: number // Auto-warmup interval in milliseconds
|
|
75
|
-
priorityThreshold: number // Minimum priority to warmup
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export interface WarmupStats {
|
|
79
|
-
totalRoutes: number
|
|
80
|
-
successfulWarmups: number
|
|
81
|
-
failedWarmups: number
|
|
82
|
-
averageWarmupTime: number
|
|
83
|
-
lastWarmupTime: number
|
|
84
|
-
cacheHitRateImprovement: number
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Route cache warmer for pre-populating caches with frequently accessed routes
|
|
89
|
-
*/
|
|
90
|
-
export class RouteCacheWarmer {
|
|
91
|
-
private routes: WarmupRoute[] = []
|
|
92
|
-
private routeCache: LRUCache<any>
|
|
93
|
-
private streamingCache?: StreamingCache
|
|
94
|
-
private stats: WarmupStats = {
|
|
95
|
-
totalRoutes: 0,
|
|
96
|
-
successfulWarmups: 0,
|
|
97
|
-
failedWarmups: 0,
|
|
98
|
-
averageWarmupTime: 0,
|
|
99
|
-
lastWarmupTime: 0,
|
|
100
|
-
cacheHitRateImprovement: 0,
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
private warmupTimer?: ReturnType<typeof setInterval>
|
|
104
|
-
|
|
105
|
-
constructor(
|
|
106
|
-
private config: WarmupConfig,
|
|
107
|
-
routeCache: LRUCache<any>,
|
|
108
|
-
streamingCache?: StreamingCache,
|
|
109
|
-
) {
|
|
110
|
-
this.routeCache = routeCache
|
|
111
|
-
this.streamingCache = streamingCache
|
|
112
|
-
|
|
113
|
-
if (config.scheduleInterval) {
|
|
114
|
-
this.schedulePeriodicWarmup()
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Register routes for cache warming
|
|
120
|
-
*/
|
|
121
|
-
registerRoutes(routes: WarmupRoute[]): void {
|
|
122
|
-
this.routes = [...this.routes, ...routes]
|
|
123
|
-
.sort((a, b) => b.priority - a.priority) // Sort by priority descending
|
|
124
|
-
this.stats.totalRoutes = this.routes.length
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Register a single route for cache warming
|
|
129
|
-
*/
|
|
130
|
-
registerRoute(route: WarmupRoute): void {
|
|
131
|
-
this.routes.push(route)
|
|
132
|
-
this.routes.sort((a, b) => b.priority - a.priority)
|
|
133
|
-
this.stats.totalRoutes = this.routes.length
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Warm cache with registered routes
|
|
138
|
-
*/
|
|
139
|
-
async warmCache(options: {
|
|
140
|
-
routes?: string[] // Specific routes to warm (by path)
|
|
141
|
-
maxRoutes?: number // Maximum number of routes to warm
|
|
142
|
-
skipLowPriority?: boolean
|
|
143
|
-
} = {}): Promise<WarmupStats> {
|
|
144
|
-
if (!this.config.enabled) {
|
|
145
|
-
return this.stats
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const startTime = Date.now()
|
|
149
|
-
let routesToWarm = this.routes
|
|
150
|
-
|
|
151
|
-
// Filter routes if specific routes requested
|
|
152
|
-
if (options.routes) {
|
|
153
|
-
routesToWarm = routesToWarm.filter(route =>
|
|
154
|
-
options.routes!.includes(route.path),
|
|
155
|
-
)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Filter by priority threshold
|
|
159
|
-
if (options.skipLowPriority) {
|
|
160
|
-
routesToWarm = routesToWarm.filter(route =>
|
|
161
|
-
route.priority >= this.config.priorityThreshold,
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Limit number of routes
|
|
166
|
-
if (options.maxRoutes) {
|
|
167
|
-
routesToWarm = routesToWarm.slice(0, options.maxRoutes)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Warm routes with concurrency control
|
|
171
|
-
const results = await this.warmRoutesWithConcurrency(routesToWarm)
|
|
172
|
-
|
|
173
|
-
// Update statistics
|
|
174
|
-
this.stats.successfulWarmups += results.successful
|
|
175
|
-
this.stats.failedWarmups += results.failed
|
|
176
|
-
this.stats.lastWarmupTime = Date.now()
|
|
177
|
-
this.stats.averageWarmupTime
|
|
178
|
-
= (this.stats.averageWarmupTime + (Date.now() - startTime)) / 2
|
|
179
|
-
|
|
180
|
-
return this.stats
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Warm specific route patterns based on analytics
|
|
185
|
-
*/
|
|
186
|
-
async warmFromAnalytics(analytics: {
|
|
187
|
-
topRoutes: AnalyticsRoute[]
|
|
188
|
-
recentRoutes: RecentRoute[]
|
|
189
|
-
}): Promise<void> {
|
|
190
|
-
const analyticsRoutes: WarmupRoute[] = []
|
|
191
|
-
|
|
192
|
-
// Convert top routes to warmup routes
|
|
193
|
-
for (const route of analytics.topRoutes) {
|
|
194
|
-
analyticsRoutes.push({
|
|
195
|
-
path: route.path,
|
|
196
|
-
method: route.method,
|
|
197
|
-
priority: Math.min(route.frequency * 10, 100), // Scale frequency to priority
|
|
198
|
-
frequency: route.frequency,
|
|
199
|
-
})
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Add recent routes with lower priority
|
|
203
|
-
for (const route of analytics.recentRoutes) {
|
|
204
|
-
const age = Date.now() - route.timestamp
|
|
205
|
-
const priority = Math.max(50 - (age / (60 * 1000)), 10) // Decay priority with age
|
|
206
|
-
|
|
207
|
-
analyticsRoutes.push({
|
|
208
|
-
path: route.path,
|
|
209
|
-
method: route.method,
|
|
210
|
-
priority,
|
|
211
|
-
frequency: 1,
|
|
212
|
-
})
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
this.registerRoutes(analyticsRoutes)
|
|
216
|
-
await this.warmCache({ maxRoutes: 50 })
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Pre-compute and cache expensive route operations
|
|
221
|
-
*/
|
|
222
|
-
async precomputeRoutes(routes: PrecomputeRoute[]): Promise<number> {
|
|
223
|
-
let precomputedCount = 0
|
|
224
|
-
|
|
225
|
-
for (const route of routes) {
|
|
226
|
-
try {
|
|
227
|
-
const startTime = Date.now()
|
|
228
|
-
const result = await Promise.race([
|
|
229
|
-
route.computeFunction(),
|
|
230
|
-
new Promise((_, reject) =>
|
|
231
|
-
setTimeout(() => reject(new Error('Timeout')), this.config.warmupTimeout),
|
|
232
|
-
),
|
|
233
|
-
])
|
|
234
|
-
|
|
235
|
-
const cacheKey = route.cacheKey || `${route.method}:${route.path}`
|
|
236
|
-
this.routeCache.set(cacheKey, result, route.ttl)
|
|
237
|
-
|
|
238
|
-
precomputedCount++
|
|
239
|
-
console.log(`Precomputed ${cacheKey} in ${Date.now() - startTime}ms`)
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
console.warn(`Failed to precompute ${route.path}:`, error)
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
return precomputedCount
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Warm cache based on route patterns and user behavior
|
|
251
|
-
*/
|
|
252
|
-
async intelligentWarmup(patterns: IntelligentWarmupPatterns): Promise<void> {
|
|
253
|
-
const currentHour = new Date().getHours()
|
|
254
|
-
const intelligentRoutes: WarmupRoute[] = []
|
|
255
|
-
|
|
256
|
-
// Add user segment routes
|
|
257
|
-
if (patterns.userSegments) {
|
|
258
|
-
for (const segment of patterns.userSegments) {
|
|
259
|
-
for (const route of segment.commonRoutes) {
|
|
260
|
-
intelligentRoutes.push({
|
|
261
|
-
path: route,
|
|
262
|
-
method: 'GET',
|
|
263
|
-
priority: segment.priority,
|
|
264
|
-
frequency: 10,
|
|
265
|
-
})
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Add time-based routes
|
|
271
|
-
if (patterns.timeBasedPatterns) {
|
|
272
|
-
for (const pattern of patterns.timeBasedPatterns) {
|
|
273
|
-
if (currentHour >= pattern.timeRange.start && currentHour <= pattern.timeRange.end) {
|
|
274
|
-
for (const route of pattern.routes) {
|
|
275
|
-
intelligentRoutes.push({
|
|
276
|
-
path: route,
|
|
277
|
-
method: 'GET',
|
|
278
|
-
priority: pattern.priority + 20, // Boost priority for current time
|
|
279
|
-
frequency: 15,
|
|
280
|
-
})
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
this.registerRoutes(intelligentRoutes)
|
|
287
|
-
await this.warmCache({ skipLowPriority: true })
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Get cache warming statistics
|
|
292
|
-
*/
|
|
293
|
-
getStats(): WarmupStats {
|
|
294
|
-
return { ...this.stats }
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Clear warmup statistics
|
|
299
|
-
*/
|
|
300
|
-
resetStats(): void {
|
|
301
|
-
this.stats = {
|
|
302
|
-
totalRoutes: this.routes.length,
|
|
303
|
-
successfulWarmups: 0,
|
|
304
|
-
failedWarmups: 0,
|
|
305
|
-
averageWarmupTime: 0,
|
|
306
|
-
lastWarmupTime: 0,
|
|
307
|
-
cacheHitRateImprovement: 0,
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Stop periodic warmup
|
|
313
|
-
*/
|
|
314
|
-
stop(): void {
|
|
315
|
-
if (this.warmupTimer) {
|
|
316
|
-
clearInterval(this.warmupTimer)
|
|
317
|
-
this.warmupTimer = undefined
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Warm routes with concurrency control
|
|
323
|
-
*/
|
|
324
|
-
private async warmRoutesWithConcurrency(routes: WarmupRoute[]): Promise<{
|
|
325
|
-
successful: number
|
|
326
|
-
failed: number
|
|
327
|
-
}> {
|
|
328
|
-
let successful = 0
|
|
329
|
-
let failed = 0
|
|
330
|
-
const _semaphore = Array.from({ length: this.config.maxConcurrency }, () => null)
|
|
331
|
-
|
|
332
|
-
const warmRoute = async (route: WarmupRoute): Promise<void> => {
|
|
333
|
-
try {
|
|
334
|
-
await this.warmSingleRoute(route)
|
|
335
|
-
successful++
|
|
336
|
-
}
|
|
337
|
-
catch (error) {
|
|
338
|
-
failed++
|
|
339
|
-
console.warn(`Failed to warm route ${route.path}:`, error)
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// Process routes in batches with concurrency control
|
|
344
|
-
for (let i = 0; i < routes.length; i += this.config.maxConcurrency) {
|
|
345
|
-
const batch = routes.slice(i, i + this.config.maxConcurrency)
|
|
346
|
-
await Promise.allSettled(batch.map(warmRoute))
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return { successful, failed }
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Warm a single route
|
|
354
|
-
*/
|
|
355
|
-
private async warmSingleRoute(route: WarmupRoute): Promise<void> {
|
|
356
|
-
const url = this.buildRouteUrl(route)
|
|
357
|
-
let attempt = 0
|
|
358
|
-
|
|
359
|
-
while (attempt < this.config.retryAttempts) {
|
|
360
|
-
try {
|
|
361
|
-
const response = await Promise.race([
|
|
362
|
-
fetch(url, {
|
|
363
|
-
method: route.method,
|
|
364
|
-
headers: route.headers,
|
|
365
|
-
}),
|
|
366
|
-
new Promise<never>((_, reject) =>
|
|
367
|
-
setTimeout(() => reject(new Error('Timeout')), this.config.warmupTimeout),
|
|
368
|
-
),
|
|
369
|
-
])
|
|
370
|
-
|
|
371
|
-
// Cache the response if streaming cache is available
|
|
372
|
-
if (this.streamingCache && response.ok) {
|
|
373
|
-
const cacheKey = `${route.method}:${route.path}`
|
|
374
|
-
await this.streamingCache.cacheResponse(cacheKey, response.clone() as Response, {
|
|
375
|
-
forceCache: true,
|
|
376
|
-
generateETag: true,
|
|
377
|
-
})
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Cache pre-computed data if available
|
|
381
|
-
if (route.warmupData) {
|
|
382
|
-
const cacheKey = `warmup:${route.method}:${route.path}`
|
|
383
|
-
this.routeCache.set(cacheKey, route.warmupData)
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
return // Success
|
|
387
|
-
}
|
|
388
|
-
catch (error) {
|
|
389
|
-
attempt++
|
|
390
|
-
if (attempt < this.config.retryAttempts) {
|
|
391
|
-
await new Promise(resolve => setTimeout(resolve, this.config.retryDelay))
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
throw error
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Build URL for route warming
|
|
402
|
-
*/
|
|
403
|
-
private buildRouteUrl(route: WarmupRoute): string {
|
|
404
|
-
let path = route.path
|
|
405
|
-
|
|
406
|
-
// Replace path parameters
|
|
407
|
-
if (route.params) {
|
|
408
|
-
for (const [key, value] of Object.entries(route.params)) {
|
|
409
|
-
path = path.replace(`{${key}}`, value).replace(`:${key}`, value)
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Add query parameters
|
|
414
|
-
if (route.query) {
|
|
415
|
-
const queryString = new URLSearchParams(route.query).toString()
|
|
416
|
-
path += `?${queryString}`
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// For warmup, we'll use localhost - in production this would be the actual server
|
|
420
|
-
return `http://localhost:3000${path}`
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/**
|
|
424
|
-
* Schedule periodic cache warmup
|
|
425
|
-
*/
|
|
426
|
-
private schedulePeriodicWarmup(): void {
|
|
427
|
-
this.warmupTimer = setInterval(async () => {
|
|
428
|
-
try {
|
|
429
|
-
await this.warmCache({ skipLowPriority: true, maxRoutes: 20 })
|
|
430
|
-
}
|
|
431
|
-
catch (error) {
|
|
432
|
-
console.warn('Periodic warmup failed:', error)
|
|
433
|
-
}
|
|
434
|
-
}, this.config.scheduleInterval!)
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Factory functions for creating route cache warmers
|
|
440
|
-
*/
|
|
441
|
-
export const createRouteCacheWarmer = {
|
|
442
|
-
/**
|
|
443
|
-
* Create warmer for development environment
|
|
444
|
-
*/
|
|
445
|
-
development: (routeCache: LRUCache<any>, streamingCache?: StreamingCache): RouteCacheWarmer =>
|
|
446
|
-
new RouteCacheWarmer(
|
|
447
|
-
{
|
|
448
|
-
enabled: true,
|
|
449
|
-
maxConcurrency: 2,
|
|
450
|
-
warmupTimeout: 5000,
|
|
451
|
-
retryAttempts: 1,
|
|
452
|
-
retryDelay: 1000,
|
|
453
|
-
priorityThreshold: 30,
|
|
454
|
-
},
|
|
455
|
-
routeCache,
|
|
456
|
-
streamingCache,
|
|
457
|
-
),
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Create warmer for production environment
|
|
461
|
-
*/
|
|
462
|
-
production: (routeCache: LRUCache<any>, streamingCache?: StreamingCache): RouteCacheWarmer =>
|
|
463
|
-
new RouteCacheWarmer(
|
|
464
|
-
{
|
|
465
|
-
enabled: true,
|
|
466
|
-
maxConcurrency: 10,
|
|
467
|
-
warmupTimeout: 10000,
|
|
468
|
-
retryAttempts: 3,
|
|
469
|
-
retryDelay: 2000,
|
|
470
|
-
scheduleInterval: 5 * 60 * 1000, // Every 5 minutes
|
|
471
|
-
priorityThreshold: 50,
|
|
472
|
-
},
|
|
473
|
-
routeCache,
|
|
474
|
-
streamingCache,
|
|
475
|
-
),
|
|
476
|
-
|
|
477
|
-
/**
|
|
478
|
-
* Create warmer with custom configuration
|
|
479
|
-
*/
|
|
480
|
-
custom: (
|
|
481
|
-
config: WarmupConfig,
|
|
482
|
-
routeCache: LRUCache<any>,
|
|
483
|
-
streamingCache?: StreamingCache,
|
|
484
|
-
): RouteCacheWarmer =>
|
|
485
|
-
new RouteCacheWarmer(config, routeCache, streamingCache),
|
|
486
|
-
}
|