create-fluxstack 1.10.1 → 1.12.0
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/.dockerignore +1 -2
- package/Dockerfile +8 -8
- package/LLMD/INDEX.md +64 -0
- package/LLMD/MAINTENANCE.md +197 -0
- package/LLMD/MIGRATION.md +156 -0
- package/LLMD/config/.gitkeep +1 -0
- package/LLMD/config/declarative-system.md +268 -0
- package/LLMD/config/environment-vars.md +327 -0
- package/LLMD/config/runtime-reload.md +401 -0
- package/LLMD/core/.gitkeep +1 -0
- package/LLMD/core/build-system.md +599 -0
- package/LLMD/core/framework-lifecycle.md +229 -0
- package/LLMD/core/plugin-system.md +451 -0
- package/LLMD/patterns/.gitkeep +1 -0
- package/LLMD/patterns/anti-patterns.md +297 -0
- package/LLMD/patterns/project-structure.md +264 -0
- package/LLMD/patterns/type-safety.md +440 -0
- package/LLMD/reference/.gitkeep +1 -0
- package/LLMD/reference/cli-commands.md +250 -0
- package/LLMD/reference/plugin-hooks.md +357 -0
- package/LLMD/reference/routing.md +39 -0
- package/LLMD/reference/troubleshooting.md +364 -0
- package/LLMD/resources/.gitkeep +1 -0
- package/LLMD/resources/controllers.md +465 -0
- package/LLMD/resources/live-components.md +703 -0
- package/LLMD/resources/live-rooms.md +482 -0
- package/LLMD/resources/live-upload.md +130 -0
- package/LLMD/resources/plugins-external.md +617 -0
- package/LLMD/resources/routes-eden.md +254 -0
- package/README.md +37 -17
- package/app/client/index.html +0 -1
- package/app/client/src/App.tsx +107 -150
- package/app/client/src/components/AppLayout.tsx +68 -0
- package/app/client/src/components/BackButton.tsx +13 -0
- package/app/client/src/components/DemoPage.tsx +20 -0
- package/app/client/src/components/LiveUploadWidget.tsx +204 -0
- package/app/client/src/lib/eden-api.ts +85 -60
- package/app/client/src/live/ChatDemo.tsx +107 -0
- package/app/client/src/live/CounterDemo.tsx +206 -0
- package/app/client/src/live/FormDemo.tsx +119 -0
- package/app/client/src/live/RoomChatDemo.tsx +242 -0
- package/app/client/src/live/UploadDemo.tsx +21 -0
- package/app/client/src/main.tsx +4 -1
- package/app/client/src/pages/ApiTestPage.tsx +108 -0
- package/app/client/src/pages/HomePage.tsx +76 -0
- package/app/server/app.ts +1 -4
- package/app/server/controllers/users.controller.ts +36 -44
- package/app/server/index.ts +25 -35
- package/app/server/live/LiveChat.ts +77 -0
- package/app/server/live/LiveCounter.ts +67 -0
- package/app/server/live/LiveForm.ts +63 -0
- package/app/server/live/LiveLocalCounter.ts +32 -0
- package/app/server/live/LiveRoomChat.ts +285 -0
- package/app/server/live/LiveUpload.ts +81 -0
- package/app/server/routes/index.ts +3 -1
- package/app/server/routes/room.routes.ts +117 -0
- package/app/server/routes/users.routes.ts +35 -27
- package/app/shared/types/index.ts +14 -2
- package/config/app.config.ts +2 -62
- package/config/client.config.ts +2 -95
- package/config/database.config.ts +2 -99
- package/config/fluxstack.config.ts +25 -45
- package/config/index.ts +57 -38
- package/config/monitoring.config.ts +2 -114
- package/config/plugins.config.ts +2 -80
- package/config/server.config.ts +2 -68
- package/config/services.config.ts +2 -130
- package/config/system/app.config.ts +29 -0
- package/config/system/build.config.ts +49 -0
- package/config/system/client.config.ts +68 -0
- package/config/system/database.config.ts +17 -0
- package/config/system/fluxstack.config.ts +114 -0
- package/config/{logger.config.ts → system/logger.config.ts} +3 -1
- package/config/system/monitoring.config.ts +114 -0
- package/config/system/plugins.config.ts +84 -0
- package/config/{runtime.config.ts → system/runtime.config.ts} +1 -1
- package/config/system/server.config.ts +68 -0
- package/config/system/services.config.ts +46 -0
- package/config/{system.config.ts → system/system.config.ts} +1 -1
- package/core/build/flux-plugins-generator.ts +325 -325
- package/core/build/index.ts +39 -27
- package/core/build/live-components-generator.ts +3 -3
- package/core/build/optimizer.ts +235 -235
- package/core/cli/command-registry.ts +6 -4
- package/core/cli/commands/build.ts +79 -0
- package/core/cli/commands/create.ts +54 -0
- package/core/cli/commands/dev.ts +101 -0
- package/core/cli/commands/help.ts +34 -0
- package/core/cli/commands/index.ts +34 -0
- package/core/cli/commands/make-plugin.ts +90 -0
- package/core/cli/commands/plugin-add.ts +197 -0
- package/core/cli/commands/plugin-deps.ts +2 -2
- package/core/cli/commands/plugin-list.ts +208 -0
- package/core/cli/commands/plugin-remove.ts +170 -0
- package/core/cli/generators/component.ts +769 -769
- package/core/cli/generators/controller.ts +1 -1
- package/core/cli/generators/index.ts +146 -146
- package/core/cli/generators/interactive.ts +227 -227
- package/core/cli/generators/plugin.ts +2 -2
- package/core/cli/generators/prompts.ts +82 -82
- package/core/cli/generators/route.ts +6 -6
- package/core/cli/generators/service.ts +2 -2
- package/core/cli/generators/template-engine.ts +4 -3
- package/core/cli/generators/types.ts +2 -2
- package/core/cli/generators/utils.ts +191 -191
- package/core/cli/index.ts +115 -686
- package/core/cli/plugin-discovery.ts +2 -2
- package/core/client/LiveComponentsProvider.tsx +60 -8
- package/core/client/api/eden.ts +183 -0
- package/core/client/api/index.ts +11 -0
- package/core/client/components/Live.tsx +104 -0
- package/core/client/fluxstack.ts +1 -9
- package/core/client/hooks/AdaptiveChunkSizer.ts +215 -215
- package/core/client/hooks/state-validator.ts +1 -1
- package/core/client/hooks/useAuth.ts +48 -48
- package/core/client/hooks/useChunkedUpload.ts +85 -35
- package/core/client/hooks/useLiveChunkedUpload.ts +87 -0
- package/core/client/hooks/useLiveComponent.ts +800 -0
- package/core/client/hooks/useLiveUpload.ts +71 -0
- package/core/client/hooks/useRoom.ts +409 -0
- package/core/client/hooks/useRoomProxy.ts +382 -0
- package/core/client/index.ts +17 -68
- package/core/client/standalone-entry.ts +8 -0
- package/core/client/standalone.ts +74 -53
- package/core/client/state/createStore.ts +192 -192
- package/core/client/state/index.ts +14 -14
- package/core/config/index.ts +70 -291
- package/core/config/schema.ts +42 -723
- package/core/framework/client.ts +131 -131
- package/core/framework/index.ts +7 -7
- package/core/framework/server.ts +47 -40
- package/core/framework/types.ts +2 -2
- package/core/index.ts +23 -4
- package/core/live/ComponentRegistry.ts +3 -3
- package/core/live/types.ts +77 -0
- package/core/plugins/built-in/index.ts +134 -134
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +242 -1066
- package/core/plugins/built-in/live-components/index.ts +1 -1
- package/core/plugins/built-in/monitoring/index.ts +111 -47
- package/core/plugins/built-in/static/index.ts +1 -1
- package/core/plugins/built-in/swagger/index.ts +68 -265
- package/core/plugins/built-in/vite/index.ts +85 -185
- package/core/plugins/built-in/vite/vite-dev.ts +10 -16
- package/core/plugins/config.ts +9 -7
- package/core/plugins/dependency-manager.ts +31 -1
- package/core/plugins/discovery.ts +19 -7
- package/core/plugins/executor.ts +2 -2
- package/core/plugins/index.ts +203 -203
- package/core/plugins/manager.ts +27 -39
- package/core/plugins/module-resolver.ts +19 -8
- package/core/plugins/registry.ts +255 -19
- package/core/plugins/types.ts +20 -53
- package/core/server/framework.ts +66 -43
- package/core/server/index.ts +15 -15
- package/core/server/live/ComponentRegistry.ts +78 -71
- package/core/server/live/FileUploadManager.ts +23 -10
- package/core/server/live/LiveComponentPerformanceMonitor.ts +1 -1
- package/core/server/live/LiveRoomManager.ts +261 -0
- package/core/server/live/RoomEventBus.ts +234 -0
- package/core/server/live/RoomStateManager.ts +172 -0
- package/core/server/live/StateSignature.ts +643 -643
- package/core/server/live/WebSocketConnectionManager.ts +30 -19
- package/core/server/live/auto-generated-components.ts +21 -9
- package/core/server/live/index.ts +14 -0
- package/core/server/live/websocket-plugin.ts +214 -67
- package/core/server/middleware/elysia-helpers.ts +7 -2
- package/core/server/middleware/errorHandling.ts +1 -1
- package/core/server/middleware/index.ts +31 -31
- package/core/server/plugins/database.ts +180 -180
- package/core/server/plugins/static-files-plugin.ts +69 -69
- package/core/server/plugins/swagger.ts +1 -1
- package/core/server/rooms/RoomBroadcaster.ts +357 -0
- package/core/server/rooms/RoomSystem.ts +463 -0
- package/core/server/rooms/index.ts +13 -0
- package/core/server/services/BaseService.ts +1 -1
- package/core/server/services/ServiceContainer.ts +1 -1
- package/core/server/services/index.ts +8 -8
- package/core/templates/create-project.ts +12 -12
- package/core/testing/index.ts +9 -9
- package/core/testing/setup.ts +73 -73
- package/core/types/api.ts +168 -168
- package/core/types/build.ts +219 -219
- package/core/types/config.ts +56 -26
- package/core/types/index.ts +4 -4
- package/core/types/plugin.ts +107 -107
- package/core/types/types.ts +353 -14
- package/core/utils/build-logger.ts +324 -324
- package/core/utils/config-schema.ts +480 -480
- package/core/utils/env.ts +2 -8
- package/core/utils/errors/codes.ts +114 -114
- package/core/utils/errors/handlers.ts +36 -1
- package/core/utils/errors/index.ts +49 -5
- package/core/utils/errors/middleware.ts +113 -113
- package/core/utils/helpers.ts +6 -16
- package/core/utils/index.ts +17 -17
- package/core/utils/logger/colors.ts +114 -114
- package/core/utils/logger/config.ts +13 -9
- package/core/utils/logger/formatter.ts +82 -82
- package/core/utils/logger/group-logger.ts +101 -101
- package/core/utils/logger/index.ts +6 -1
- package/core/utils/logger/stack-trace.ts +3 -1
- package/core/utils/logger/startup-banner.ts +82 -82
- package/core/utils/logger/winston-logger.ts +152 -152
- package/core/utils/monitoring/index.ts +211 -211
- package/core/utils/sync-version.ts +66 -66
- package/core/utils/version.ts +1 -1
- package/create-fluxstack.ts +8 -7
- package/package.json +12 -13
- package/plugins/crypto-auth/cli/make-protected-route.command.ts +1 -1
- package/plugins/crypto-auth/client/CryptoAuthClient.ts +302 -302
- package/plugins/crypto-auth/client/components/index.ts +11 -11
- package/plugins/crypto-auth/client/index.ts +11 -11
- package/plugins/crypto-auth/config/index.ts +1 -1
- package/plugins/crypto-auth/index.ts +4 -4
- package/plugins/crypto-auth/package.json +65 -65
- package/plugins/crypto-auth/server/AuthMiddleware.ts +1 -1
- package/plugins/crypto-auth/server/CryptoAuthService.ts +185 -185
- package/plugins/crypto-auth/server/index.ts +21 -21
- package/plugins/crypto-auth/server/middlewares/cryptoAuthAdmin.ts +3 -3
- package/plugins/crypto-auth/server/middlewares/cryptoAuthOptional.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/cryptoAuthPermissions.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/cryptoAuthRequired.ts +2 -2
- package/plugins/crypto-auth/server/middlewares/helpers.ts +1 -1
- package/plugins/crypto-auth/server/middlewares/index.ts +22 -22
- package/tsconfig.api-strict.json +16 -0
- package/tsconfig.json +48 -52
- package/{app/client/tsconfig.node.json → tsconfig.node.json} +25 -25
- package/types/global.d.ts +29 -29
- package/types/vitest.d.ts +8 -8
- package/vite.config.ts +38 -62
- package/vitest.config.live.ts +10 -9
- package/vitest.config.ts +29 -17
- package/app/client/README.md +0 -69
- package/app/client/SIMPLIFICATION.md +0 -140
- package/app/client/frontend-only.ts +0 -12
- package/app/client/src/live/FileUploadExample.tsx +0 -359
- package/app/client/src/live/MinimalLiveClock.tsx +0 -47
- package/app/client/src/live/QuickUploadTest.tsx +0 -193
- package/app/client/tsconfig.app.json +0 -45
- package/app/client/tsconfig.json +0 -7
- package/app/client/zustand-setup.md +0 -65
- package/app/server/backend-only.ts +0 -18
- package/app/server/live/LiveClockComponent.ts +0 -215
- package/app/server/live/LiveFileUploadComponent.ts +0 -77
- package/app/server/routes/env-test.ts +0 -110
- package/core/client/hooks/index.ts +0 -7
- package/core/client/hooks/useHybridLiveComponent.ts +0 -685
- package/core/client/hooks/useTypedLiveComponent.ts +0 -133
- package/core/client/hooks/useWebSocket.ts +0 -361
- package/core/config/env.ts +0 -546
- package/core/config/loader.ts +0 -522
- package/core/config/runtime-config.ts +0 -327
- package/core/config/validator.ts +0 -540
- package/core/server/backend-entry.ts +0 -51
- package/core/server/standalone.ts +0 -106
- package/core/utils/regenerate-files.ts +0 -69
- package/fluxstack.config.ts +0 -354
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
# Runtime Configuration Reload
|
|
2
|
+
|
|
3
|
+
**Version:** 1.11.0 | **Updated:** 2025-02-08
|
|
4
|
+
|
|
5
|
+
## Quick Facts
|
|
6
|
+
|
|
7
|
+
- `ReactiveConfig` enables runtime config updates without server restart
|
|
8
|
+
- Watches environment variable changes
|
|
9
|
+
- Notifies listeners on reload
|
|
10
|
+
- Used for feature flags, rate limits, maintenance mode
|
|
11
|
+
- Implementation: `config/system/runtime.config.ts`
|
|
12
|
+
|
|
13
|
+
## ReactiveConfig Class
|
|
14
|
+
|
|
15
|
+
### Creating Reactive Config
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { defineReactiveConfig, config } from '@core/utils/config-schema'
|
|
19
|
+
|
|
20
|
+
const reactiveConfig = defineReactiveConfig({
|
|
21
|
+
featureEnabled: config.boolean('FEATURE_FLAG', false),
|
|
22
|
+
maxRequests: config.number('MAX_REQUESTS', 100)
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Accessing Values
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Get all values
|
|
30
|
+
const values = reactiveConfig.values
|
|
31
|
+
console.log(values.featureEnabled) // false
|
|
32
|
+
console.log(values.maxRequests) // 100
|
|
33
|
+
|
|
34
|
+
// Get specific value
|
|
35
|
+
const enabled = reactiveConfig.get('featureEnabled')
|
|
36
|
+
|
|
37
|
+
// Check if value exists
|
|
38
|
+
if (reactiveConfig.has('featureEnabled')) {
|
|
39
|
+
// ...
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Reloading Configuration
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Reload from environment (clears env cache)
|
|
47
|
+
const newConfig = reactiveConfig.reload()
|
|
48
|
+
|
|
49
|
+
// All watchers are notified automatically
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Watching for Changes
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Register watcher
|
|
56
|
+
const unwatch = reactiveConfig.watch((newConfig) => {
|
|
57
|
+
console.log('Config updated!')
|
|
58
|
+
console.log('Feature enabled:', newConfig.featureEnabled)
|
|
59
|
+
console.log('Max requests:', newConfig.maxRequests)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// Later: stop watching
|
|
63
|
+
unwatch()
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Runtime Config Example
|
|
67
|
+
|
|
68
|
+
FluxStack includes `appRuntimeConfig` for runtime-reloadable settings:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// config/system/runtime.config.ts
|
|
72
|
+
export const appRuntimeConfig = defineReactiveConfig({
|
|
73
|
+
// Feature toggles
|
|
74
|
+
enableSwagger: config.boolean('ENABLE_SWAGGER', true),
|
|
75
|
+
enableMetrics: config.boolean('ENABLE_METRICS', false),
|
|
76
|
+
enableDebugMode: config.boolean('DEBUG', false),
|
|
77
|
+
|
|
78
|
+
// Rate limiting
|
|
79
|
+
rateLimitEnabled: config.boolean('RATE_LIMIT_ENABLED', true),
|
|
80
|
+
rateLimitMax: config.number('RATE_LIMIT_MAX', 100),
|
|
81
|
+
rateLimitWindow: config.number('RATE_LIMIT_WINDOW', 60000),
|
|
82
|
+
|
|
83
|
+
// Request settings
|
|
84
|
+
requestTimeout: config.number('REQUEST_TIMEOUT', 30000),
|
|
85
|
+
maxUploadSize: config.number('MAX_UPLOAD_SIZE', 10485760),
|
|
86
|
+
|
|
87
|
+
// Maintenance mode
|
|
88
|
+
maintenanceMode: config.boolean('MAINTENANCE_MODE', false),
|
|
89
|
+
maintenanceMessage: config.string(
|
|
90
|
+
'MAINTENANCE_MESSAGE',
|
|
91
|
+
'System is under maintenance. Please try again later.'
|
|
92
|
+
)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
// Setup watcher
|
|
96
|
+
appRuntimeConfig.watch((newConfig) => {
|
|
97
|
+
console.log('🔄 Runtime config reloaded')
|
|
98
|
+
console.log(' Debug:', newConfig.enableDebugMode)
|
|
99
|
+
console.log(' Maintenance:', newConfig.maintenanceMode)
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Use Cases
|
|
104
|
+
|
|
105
|
+
### Feature Flags
|
|
106
|
+
|
|
107
|
+
Toggle features without restart:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// Check feature flag
|
|
111
|
+
if (appRuntimeConfig.values.enableSwagger) {
|
|
112
|
+
// Enable Swagger UI
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Update .env: ENABLE_SWAGGER=false
|
|
116
|
+
// Reload config
|
|
117
|
+
appRuntimeConfig.reload()
|
|
118
|
+
// Swagger now disabled
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Rate Limiting
|
|
122
|
+
|
|
123
|
+
Adjust rate limits dynamically:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const { rateLimitMax, rateLimitWindow } = appRuntimeConfig.values
|
|
127
|
+
|
|
128
|
+
// Apply rate limit
|
|
129
|
+
if (requestCount > rateLimitMax) {
|
|
130
|
+
throw new Error('Rate limit exceeded')
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Update .env: RATE_LIMIT_MAX=200
|
|
134
|
+
// Reload config
|
|
135
|
+
appRuntimeConfig.reload()
|
|
136
|
+
// New limit applied
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Maintenance Mode
|
|
140
|
+
|
|
141
|
+
Enable maintenance without downtime:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// Middleware check
|
|
145
|
+
if (appRuntimeConfig.values.maintenanceMode) {
|
|
146
|
+
return new Response(appRuntimeConfig.values.maintenanceMessage, {
|
|
147
|
+
status: 503
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Update .env: MAINTENANCE_MODE=true
|
|
152
|
+
// Reload config
|
|
153
|
+
appRuntimeConfig.reload()
|
|
154
|
+
// Maintenance mode active
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Debug Mode
|
|
158
|
+
|
|
159
|
+
Toggle debug logging:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
appRuntimeConfig.watch((config) => {
|
|
163
|
+
if (config.enableDebugMode) {
|
|
164
|
+
logger.setLevel('debug')
|
|
165
|
+
} else {
|
|
166
|
+
logger.setLevel('info')
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Update .env: DEBUG=true
|
|
171
|
+
// Reload triggers watcher
|
|
172
|
+
appRuntimeConfig.reload()
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Reload Mechanism
|
|
176
|
+
|
|
177
|
+
### How It Works
|
|
178
|
+
|
|
179
|
+
1. **Clear env cache**: `env.clearCache()` forces fresh read
|
|
180
|
+
2. **Reload config**: Re-reads all env vars and validates
|
|
181
|
+
3. **Notify watchers**: Calls all registered watch callbacks
|
|
182
|
+
4. **Return new config**: Returns updated values
|
|
183
|
+
|
|
184
|
+
### Manual Reload
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// In your code
|
|
188
|
+
import { appRuntimeConfig } from '@config/system/runtime.config'
|
|
189
|
+
|
|
190
|
+
// Reload when needed
|
|
191
|
+
appRuntimeConfig.reload()
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Automatic Reload
|
|
195
|
+
|
|
196
|
+
Create a reload endpoint:
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// app/server/routes/admin.ts
|
|
200
|
+
import { Elysia, t } from 'elysia'
|
|
201
|
+
import { appRuntimeConfig } from '@config/system/runtime.config'
|
|
202
|
+
|
|
203
|
+
export const adminRoutes = new Elysia({ prefix: '/admin' })
|
|
204
|
+
.post('/reload-config', async () => {
|
|
205
|
+
const newConfig = appRuntimeConfig.reload()
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
success: true,
|
|
209
|
+
message: 'Configuration reloaded',
|
|
210
|
+
config: {
|
|
211
|
+
maintenanceMode: newConfig.maintenanceMode,
|
|
212
|
+
debugMode: newConfig.enableDebugMode
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}, {
|
|
216
|
+
detail: {
|
|
217
|
+
tags: ['Admin'],
|
|
218
|
+
summary: 'Reload runtime configuration'
|
|
219
|
+
},
|
|
220
|
+
response: t.Object({
|
|
221
|
+
success: t.Boolean(),
|
|
222
|
+
message: t.String(),
|
|
223
|
+
config: t.Object({
|
|
224
|
+
maintenanceMode: t.Boolean(),
|
|
225
|
+
debugMode: t.Boolean()
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
})
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Watch Callbacks
|
|
232
|
+
|
|
233
|
+
### Multiple Watchers
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// Watcher 1: Update logger
|
|
237
|
+
appRuntimeConfig.watch((config) => {
|
|
238
|
+
logger.setLevel(config.enableDebugMode ? 'debug' : 'info')
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
// Watcher 2: Update metrics
|
|
242
|
+
appRuntimeConfig.watch((config) => {
|
|
243
|
+
if (config.enableMetrics) {
|
|
244
|
+
metricsCollector.start()
|
|
245
|
+
} else {
|
|
246
|
+
metricsCollector.stop()
|
|
247
|
+
}
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
// Both called on reload
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Cleanup
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
const unwatch1 = appRuntimeConfig.watch(callback1)
|
|
257
|
+
const unwatch2 = appRuntimeConfig.watch(callback2)
|
|
258
|
+
|
|
259
|
+
// Later: cleanup
|
|
260
|
+
unwatch1()
|
|
261
|
+
unwatch2()
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Error Handling
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
appRuntimeConfig.watch((config) => {
|
|
268
|
+
try {
|
|
269
|
+
// Apply config changes
|
|
270
|
+
applyRateLimits(config.rateLimitMax)
|
|
271
|
+
} catch (error) {
|
|
272
|
+
logger.error('Failed to apply config:', error)
|
|
273
|
+
}
|
|
274
|
+
})
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Static vs Reactive Config
|
|
278
|
+
|
|
279
|
+
### Static Config (defineConfig)
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
// Loaded once on startup
|
|
283
|
+
const serverConfig = defineConfig({
|
|
284
|
+
port: config.number('PORT', 3000)
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
// Cannot reload
|
|
288
|
+
// serverConfig.reload() ❌ Not available
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Use for:
|
|
292
|
+
- Server port/host
|
|
293
|
+
- Build settings
|
|
294
|
+
- Database connection
|
|
295
|
+
- Settings that require restart
|
|
296
|
+
|
|
297
|
+
### Reactive Config (defineReactiveConfig)
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
// Can reload at runtime
|
|
301
|
+
const runtimeConfig = defineReactiveConfig({
|
|
302
|
+
feature: config.boolean('FEATURE_FLAG', false)
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
// Can reload
|
|
306
|
+
runtimeConfig.reload() ✅
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Use for:
|
|
310
|
+
- Feature flags
|
|
311
|
+
- Rate limits
|
|
312
|
+
- Maintenance mode
|
|
313
|
+
- Debug settings
|
|
314
|
+
- Non-critical settings
|
|
315
|
+
|
|
316
|
+
## Performance Considerations
|
|
317
|
+
|
|
318
|
+
### Reload Cost
|
|
319
|
+
|
|
320
|
+
- Clears env cache
|
|
321
|
+
- Re-validates all fields
|
|
322
|
+
- Notifies all watchers
|
|
323
|
+
- Minimal overhead (~1-5ms)
|
|
324
|
+
|
|
325
|
+
### When to Reload
|
|
326
|
+
|
|
327
|
+
- On admin request (manual trigger)
|
|
328
|
+
- On file watch (advanced)
|
|
329
|
+
- On schedule (cron job)
|
|
330
|
+
- NOT on every request (too expensive)
|
|
331
|
+
|
|
332
|
+
### Caching
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
// Cache config values if accessed frequently
|
|
336
|
+
let cachedRateLimit = appRuntimeConfig.values.rateLimitMax
|
|
337
|
+
|
|
338
|
+
appRuntimeConfig.watch((config) => {
|
|
339
|
+
cachedRateLimit = config.rateLimitMax
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
// Use cached value
|
|
343
|
+
if (requestCount > cachedRateLimit) {
|
|
344
|
+
// ...
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Validation on Reload
|
|
349
|
+
|
|
350
|
+
Validation runs on every reload:
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
const config = defineReactiveConfig({
|
|
354
|
+
maxRequests: {
|
|
355
|
+
type: 'number',
|
|
356
|
+
env: 'MAX_REQUESTS',
|
|
357
|
+
default: 100,
|
|
358
|
+
validate: (value) => {
|
|
359
|
+
if (value < 1) {
|
|
360
|
+
return 'Max requests must be positive'
|
|
361
|
+
}
|
|
362
|
+
return true
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
// Update .env: MAX_REQUESTS=-10
|
|
368
|
+
// Reload throws validation error
|
|
369
|
+
config.reload()
|
|
370
|
+
// ❌ Configuration validation failed:
|
|
371
|
+
// - Max requests must be positive (got: -10)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Integration with Plugins
|
|
375
|
+
|
|
376
|
+
Plugins can use reactive config:
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
// plugins/my-plugin/index.ts
|
|
380
|
+
import { appRuntimeConfig } from '@config/system/runtime.config'
|
|
381
|
+
|
|
382
|
+
export default {
|
|
383
|
+
name: 'my-plugin',
|
|
384
|
+
version: '1.0.0',
|
|
385
|
+
|
|
386
|
+
setup: async (app, config) => {
|
|
387
|
+
// Watch for config changes
|
|
388
|
+
appRuntimeConfig.watch((runtimeConfig) => {
|
|
389
|
+
if (runtimeConfig.maintenanceMode) {
|
|
390
|
+
// Disable plugin features
|
|
391
|
+
}
|
|
392
|
+
})
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## Related
|
|
398
|
+
|
|
399
|
+
- [Declarative System](./declarative-system.md) - Config schema and defineConfig
|
|
400
|
+
- [Environment Variables](./environment-vars.md) - All available env vars
|
|
401
|
+
- [Plugin System](../core/plugin-system.md) - Plugin lifecycle hooks
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Core documentation directory
|