@engjts/nexus 0.1.7 → 0.1.9
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/dist/advanced/playground/generatePlaygroundHTML.d.ts.map +1 -1
- package/dist/advanced/playground/generatePlaygroundHTML.js +107 -0
- package/dist/advanced/playground/generatePlaygroundHTML.js.map +1 -1
- package/dist/advanced/playground/playground.d.ts +19 -0
- package/dist/advanced/playground/playground.d.ts.map +1 -1
- package/dist/advanced/playground/playground.js +70 -0
- package/dist/advanced/playground/playground.js.map +1 -1
- package/dist/advanced/playground/types.d.ts +20 -0
- package/dist/advanced/playground/types.d.ts.map +1 -1
- package/dist/core/application.d.ts +14 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/application.js +173 -71
- package/dist/core/application.js.map +1 -1
- package/dist/core/context-pool.d.ts +2 -13
- package/dist/core/context-pool.d.ts.map +1 -1
- package/dist/core/context-pool.js +7 -45
- package/dist/core/context-pool.js.map +1 -1
- package/dist/core/context.d.ts +108 -5
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +449 -53
- package/dist/core/context.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/middleware.d.ts +6 -0
- package/dist/core/middleware.d.ts.map +1 -1
- package/dist/core/middleware.js +83 -84
- package/dist/core/middleware.js.map +1 -1
- package/dist/core/performance/fast-json.d.ts +149 -0
- package/dist/core/performance/fast-json.d.ts.map +1 -0
- package/dist/core/performance/fast-json.js +473 -0
- package/dist/core/performance/fast-json.js.map +1 -0
- package/dist/core/router/file-router.d.ts +20 -7
- package/dist/core/router/file-router.d.ts.map +1 -1
- package/dist/core/router/file-router.js +41 -13
- package/dist/core/router/file-router.js.map +1 -1
- package/dist/core/router/index.d.ts +6 -0
- package/dist/core/router/index.d.ts.map +1 -1
- package/dist/core/router/index.js +33 -6
- package/dist/core/router/index.js.map +1 -1
- package/dist/core/router/radix-tree.d.ts +4 -1
- package/dist/core/router/radix-tree.d.ts.map +1 -1
- package/dist/core/router/radix-tree.js +7 -3
- package/dist/core/router/radix-tree.js.map +1 -1
- package/dist/core/serializer.d.ts +251 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +290 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/types.d.ts +39 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1849
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -170
- package/src/advanced/playground/types.ts +0 -20
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1335
- package/src/core/context-pool.ts +0 -127
- package/src/core/context.ts +0 -412
- package/src/core/index.ts +0 -80
- package/src/core/middleware.ts +0 -262
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -594
- package/src/core/router/index.ts +0 -227
- package/src/core/router/radix-tree.ts +0 -226
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -574
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -264
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Graceful Shutdown Manager
|
|
3
|
-
* Handles zero-downtime deployment with proper connection draining
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Server } from 'http';
|
|
7
|
-
import { EventEmitter } from 'events';
|
|
8
|
-
|
|
9
|
-
export interface ShutdownHook {
|
|
10
|
-
name: string;
|
|
11
|
-
handler: () => Promise<void>;
|
|
12
|
-
timeout?: number;
|
|
13
|
-
priority?: number; // Higher priority runs first
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface GracefulShutdownOptions {
|
|
17
|
-
/**
|
|
18
|
-
* Maximum time to wait for ongoing requests to complete (ms)
|
|
19
|
-
* @default 30000
|
|
20
|
-
*/
|
|
21
|
-
timeout?: number;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Whether to stop accepting new connections immediately
|
|
25
|
-
* @default true
|
|
26
|
-
*/
|
|
27
|
-
stopAcceptingConnections?: boolean;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Signals to listen for shutdown
|
|
31
|
-
* @default ['SIGTERM', 'SIGINT']
|
|
32
|
-
*/
|
|
33
|
-
signals?: NodeJS.Signals[];
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Custom health check during shutdown
|
|
37
|
-
*/
|
|
38
|
-
healthCheck?: () => Promise<{ status: 'healthy' | 'unhealthy' | 'draining'; details?: Record<string, any> }>;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Hooks to run during shutdown (closing DB connections, etc.)
|
|
42
|
-
*/
|
|
43
|
-
hooks?: ShutdownHook[];
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Callback when shutdown is initiated
|
|
47
|
-
*/
|
|
48
|
-
onShutdownStart?: () => void | Promise<void>;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Callback when shutdown is complete
|
|
52
|
-
*/
|
|
53
|
-
onShutdownComplete?: () => void | Promise<void>;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Enable verbose logging
|
|
57
|
-
* @default false
|
|
58
|
-
*/
|
|
59
|
-
verbose?: boolean;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface ActiveConnection {
|
|
63
|
-
id: string;
|
|
64
|
-
startTime: number;
|
|
65
|
-
path?: string;
|
|
66
|
-
method?: string;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Graceful Shutdown Manager
|
|
71
|
-
* Ensures zero-downtime deployments by:
|
|
72
|
-
* 1. Stopping new connections
|
|
73
|
-
* 2. Waiting for ongoing requests to complete
|
|
74
|
-
* 3. Running cleanup hooks in order
|
|
75
|
-
* 4. Closing the server gracefully
|
|
76
|
-
*/
|
|
77
|
-
export class GracefulShutdownManager extends EventEmitter {
|
|
78
|
-
private server?: Server;
|
|
79
|
-
private options: Required<GracefulShutdownOptions>;
|
|
80
|
-
private isShuttingDown: boolean = false;
|
|
81
|
-
private activeConnections: Map<string, ActiveConnection> = new Map();
|
|
82
|
-
private hooks: ShutdownHook[] = [];
|
|
83
|
-
private connectionCounter: number = 0;
|
|
84
|
-
private shutdownPromise?: Promise<void>;
|
|
85
|
-
|
|
86
|
-
constructor(options: GracefulShutdownOptions = {}) {
|
|
87
|
-
super();
|
|
88
|
-
this.options = {
|
|
89
|
-
timeout: options.timeout ?? 30000,
|
|
90
|
-
stopAcceptingConnections: options.stopAcceptingConnections ?? true,
|
|
91
|
-
signals: options.signals ?? ['SIGTERM', 'SIGINT'],
|
|
92
|
-
healthCheck: options.healthCheck ?? (async () => ({ status: 'healthy' as const })),
|
|
93
|
-
hooks: options.hooks ?? [],
|
|
94
|
-
onShutdownStart: options.onShutdownStart ?? (() => {}),
|
|
95
|
-
onShutdownComplete: options.onShutdownComplete ?? (() => {}),
|
|
96
|
-
verbose: options.verbose ?? false
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
this.hooks = [...this.options.hooks].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Attach to an HTTP server
|
|
104
|
-
*/
|
|
105
|
-
attach(server: Server): this {
|
|
106
|
-
this.server = server;
|
|
107
|
-
|
|
108
|
-
// Register signal handlers
|
|
109
|
-
for (const signal of this.options.signals) {
|
|
110
|
-
process.on(signal, () => {
|
|
111
|
-
this.log(`Received ${signal}, initiating graceful shutdown...`);
|
|
112
|
-
this.shutdown();
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Track connections
|
|
117
|
-
server.on('connection', (socket) => {
|
|
118
|
-
const connectionId = `conn_${++this.connectionCounter}`;
|
|
119
|
-
(socket as any).__connectionId = connectionId;
|
|
120
|
-
|
|
121
|
-
socket.on('close', () => {
|
|
122
|
-
this.activeConnections.delete(connectionId);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
return this;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Register a connection as active (called when request starts)
|
|
131
|
-
*/
|
|
132
|
-
trackRequest(_connectionId: string, info: { path?: string; method?: string }): string {
|
|
133
|
-
const requestId = `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
134
|
-
this.activeConnections.set(requestId, {
|
|
135
|
-
id: requestId,
|
|
136
|
-
startTime: Date.now(),
|
|
137
|
-
path: info.path,
|
|
138
|
-
method: info.method
|
|
139
|
-
});
|
|
140
|
-
return requestId;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Mark a request as complete
|
|
145
|
-
*/
|
|
146
|
-
untrackRequest(requestId: string): void {
|
|
147
|
-
this.activeConnections.delete(requestId);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Add a shutdown hook
|
|
152
|
-
*/
|
|
153
|
-
addHook(hook: ShutdownHook): this {
|
|
154
|
-
this.hooks.push(hook);
|
|
155
|
-
this.hooks.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
156
|
-
return this;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Check if shutdown is in progress
|
|
161
|
-
*/
|
|
162
|
-
isInShutdown(): boolean {
|
|
163
|
-
return this.isShuttingDown;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Get the current health status
|
|
168
|
-
*/
|
|
169
|
-
async getHealthStatus(): Promise<{ status: 'healthy' | 'unhealthy' | 'draining'; details?: Record<string, any> }> {
|
|
170
|
-
if (this.isShuttingDown) {
|
|
171
|
-
return {
|
|
172
|
-
status: 'draining',
|
|
173
|
-
details: {
|
|
174
|
-
activeConnections: this.activeConnections.size,
|
|
175
|
-
shutdownInProgress: true
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
return this.options.healthCheck();
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Get active connections count
|
|
184
|
-
*/
|
|
185
|
-
getActiveConnectionsCount(): number {
|
|
186
|
-
return this.activeConnections.size;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Get active connections details
|
|
191
|
-
*/
|
|
192
|
-
getActiveConnections(): ActiveConnection[] {
|
|
193
|
-
return Array.from(this.activeConnections.values());
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Initiate graceful shutdown
|
|
198
|
-
*/
|
|
199
|
-
async shutdown(): Promise<void> {
|
|
200
|
-
if (this.shutdownPromise) {
|
|
201
|
-
return this.shutdownPromise;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
this.isShuttingDown = true;
|
|
205
|
-
this.emit('shutdown:start');
|
|
206
|
-
|
|
207
|
-
this.shutdownPromise = this.performShutdown();
|
|
208
|
-
return this.shutdownPromise;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
private async performShutdown(): Promise<void> {
|
|
212
|
-
const startTime = Date.now();
|
|
213
|
-
|
|
214
|
-
try {
|
|
215
|
-
// Notify shutdown start
|
|
216
|
-
await this.options.onShutdownStart();
|
|
217
|
-
this.log('Shutdown initiated');
|
|
218
|
-
|
|
219
|
-
// Stop accepting new connections
|
|
220
|
-
if (this.server && this.options.stopAcceptingConnections) {
|
|
221
|
-
await this.stopAcceptingConnections();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Wait for active connections to drain
|
|
225
|
-
await this.drainConnections();
|
|
226
|
-
|
|
227
|
-
// Run shutdown hooks
|
|
228
|
-
await this.runHooks();
|
|
229
|
-
|
|
230
|
-
// Close server
|
|
231
|
-
if (this.server) {
|
|
232
|
-
await this.closeServer();
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const duration = Date.now() - startTime;
|
|
236
|
-
this.log(`Shutdown completed in ${duration}ms`);
|
|
237
|
-
|
|
238
|
-
await this.options.onShutdownComplete();
|
|
239
|
-
this.emit('shutdown:complete', { duration });
|
|
240
|
-
|
|
241
|
-
} catch (error) {
|
|
242
|
-
this.log(`Shutdown error: ${error}`);
|
|
243
|
-
this.emit('shutdown:error', error);
|
|
244
|
-
throw error;
|
|
245
|
-
} finally {
|
|
246
|
-
// Force exit if still running after timeout
|
|
247
|
-
setTimeout(() => {
|
|
248
|
-
this.log('Forcing exit after timeout');
|
|
249
|
-
process.exit(1);
|
|
250
|
-
}, 5000).unref();
|
|
251
|
-
|
|
252
|
-
process.exit(0);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
private async stopAcceptingConnections(): Promise<void> {
|
|
257
|
-
return new Promise((resolve) => {
|
|
258
|
-
if (!this.server) {
|
|
259
|
-
resolve();
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
this.server.on('request', (_req, res) => {
|
|
264
|
-
// Return 503 for new requests during shutdown
|
|
265
|
-
res.writeHead(503, {
|
|
266
|
-
'Content-Type': 'application/json',
|
|
267
|
-
'Connection': 'close',
|
|
268
|
-
'Retry-After': '30'
|
|
269
|
-
});
|
|
270
|
-
res.end(JSON.stringify({
|
|
271
|
-
error: 'Service Unavailable',
|
|
272
|
-
message: 'Server is shutting down',
|
|
273
|
-
retryAfter: 30
|
|
274
|
-
}));
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
this.log('Stopped accepting new connections');
|
|
278
|
-
resolve();
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
private async drainConnections(): Promise<void> {
|
|
283
|
-
const startTime = Date.now();
|
|
284
|
-
const checkInterval = 100; // Check every 100ms
|
|
285
|
-
|
|
286
|
-
this.log(`Waiting for ${this.activeConnections.size} active connections to drain...`);
|
|
287
|
-
|
|
288
|
-
return new Promise((resolve) => {
|
|
289
|
-
const check = () => {
|
|
290
|
-
const elapsed = Date.now() - startTime;
|
|
291
|
-
|
|
292
|
-
if (this.activeConnections.size === 0) {
|
|
293
|
-
this.log('All connections drained');
|
|
294
|
-
resolve();
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
if (elapsed >= this.options.timeout) {
|
|
299
|
-
this.log(`Timeout reached with ${this.activeConnections.size} connections still active`);
|
|
300
|
-
// Log remaining connections
|
|
301
|
-
for (const conn of this.activeConnections.values()) {
|
|
302
|
-
this.log(` - ${conn.method} ${conn.path} (started ${Date.now() - conn.startTime}ms ago)`);
|
|
303
|
-
}
|
|
304
|
-
resolve();
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
setTimeout(check, checkInterval);
|
|
309
|
-
};
|
|
310
|
-
|
|
311
|
-
check();
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
private async runHooks(): Promise<void> {
|
|
316
|
-
this.log(`Running ${this.hooks.length} shutdown hooks...`);
|
|
317
|
-
|
|
318
|
-
for (const hook of this.hooks) {
|
|
319
|
-
const hookTimeout = hook.timeout ?? 10000;
|
|
320
|
-
const startTime = Date.now();
|
|
321
|
-
|
|
322
|
-
try {
|
|
323
|
-
this.log(`Running hook: ${hook.name}`);
|
|
324
|
-
|
|
325
|
-
await Promise.race([
|
|
326
|
-
hook.handler(),
|
|
327
|
-
new Promise((_, reject) =>
|
|
328
|
-
setTimeout(() => reject(new Error(`Hook timeout: ${hook.name}`)), hookTimeout)
|
|
329
|
-
)
|
|
330
|
-
]);
|
|
331
|
-
|
|
332
|
-
const duration = Date.now() - startTime;
|
|
333
|
-
this.log(`Hook completed: ${hook.name} (${duration}ms)`);
|
|
334
|
-
|
|
335
|
-
} catch (error: any) {
|
|
336
|
-
this.log(`Hook failed: ${hook.name} - ${error.message}`);
|
|
337
|
-
this.emit('hook:error', { hook: hook.name, error });
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
private async closeServer(): Promise<void> {
|
|
343
|
-
return new Promise((resolve, reject) => {
|
|
344
|
-
if (!this.server) {
|
|
345
|
-
resolve();
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
this.server.close((err) => {
|
|
350
|
-
if (err) {
|
|
351
|
-
this.log(`Error closing server: ${err.message}`);
|
|
352
|
-
reject(err);
|
|
353
|
-
} else {
|
|
354
|
-
this.log('Server closed');
|
|
355
|
-
resolve();
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
private log(message: string): void {
|
|
362
|
-
if (this.options.verbose) {
|
|
363
|
-
console.log(`[GracefulShutdown] ${message}`);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Create a graceful shutdown manager
|
|
370
|
-
*/
|
|
371
|
-
export function createGracefulShutdown(options?: GracefulShutdownOptions): GracefulShutdownManager {
|
|
372
|
-
return new GracefulShutdownManager(options);
|
|
373
|
-
}
|
package/src/deployment/index.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deployment Module
|
|
3
|
-
*
|
|
4
|
-
* Provides production-ready deployment features:
|
|
5
|
-
* - Graceful shutdown with connection draining
|
|
6
|
-
* - Multi-process clustering
|
|
7
|
-
* - Environment-based configuration
|
|
8
|
-
* - Docker support
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
// Graceful Shutdown
|
|
12
|
-
export {
|
|
13
|
-
GracefulShutdownManager,
|
|
14
|
-
createGracefulShutdown,
|
|
15
|
-
type GracefulShutdownOptions,
|
|
16
|
-
type ShutdownHook,
|
|
17
|
-
type ActiveConnection
|
|
18
|
-
} from './graceful-shutdown';
|
|
19
|
-
|
|
20
|
-
// Clustering
|
|
21
|
-
export {
|
|
22
|
-
ClusterManager,
|
|
23
|
-
createCluster,
|
|
24
|
-
runClustered,
|
|
25
|
-
type ClusterOptions,
|
|
26
|
-
type WorkerInfo,
|
|
27
|
-
type ClusterStats
|
|
28
|
-
} from './cluster';
|
|
29
|
-
|
|
30
|
-
// Configuration
|
|
31
|
-
export {
|
|
32
|
-
ConfigManager,
|
|
33
|
-
defineConfig,
|
|
34
|
-
env,
|
|
35
|
-
requireEnv,
|
|
36
|
-
type Environment,
|
|
37
|
-
type ConfigDefinition,
|
|
38
|
-
type ConfigOptions,
|
|
39
|
-
type BaseConfig,
|
|
40
|
-
type ServerConfig,
|
|
41
|
-
type DatabaseConfig,
|
|
42
|
-
type LoggingConfig,
|
|
43
|
-
type SecurityConfig,
|
|
44
|
-
type CacheConfig,
|
|
45
|
-
type SessionConfig
|
|
46
|
-
} from './config';
|
|
47
|
-
|
|
48
|
-
// Docker
|
|
49
|
-
export {
|
|
50
|
-
DockerGenerator,
|
|
51
|
-
createDocker,
|
|
52
|
-
generateDockerFiles,
|
|
53
|
-
type DockerOptions,
|
|
54
|
-
type ComposeService,
|
|
55
|
-
type ComposeConfig
|
|
56
|
-
} from './docker';
|
package/src/index.ts
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Nexus Framework - Modern async-first web framework
|
|
3
|
-
*
|
|
4
|
-
* Main entry point - exports all public APIs
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// CORE
|
|
9
|
-
// =============================================================================
|
|
10
|
-
|
|
11
|
-
// Application
|
|
12
|
-
export { Application, Application as Nexus, createApp } from './core/application';
|
|
13
|
-
|
|
14
|
-
// Core types
|
|
15
|
-
export * from './core/types';
|
|
16
|
-
|
|
17
|
-
// Router
|
|
18
|
-
export { Router } from './core/router';
|
|
19
|
-
|
|
20
|
-
// File-Based Router (Next.js style)
|
|
21
|
-
export { FileRouter, createFileRouter, useFileRoutes } from './core/router/file-router';
|
|
22
|
-
export type { FileRouterOptions, FileRouteClass, RouteModule } from './core/router/file-router';
|
|
23
|
-
|
|
24
|
-
// Middleware
|
|
25
|
-
export {
|
|
26
|
-
MiddlewareExecutor,
|
|
27
|
-
logger,
|
|
28
|
-
cors,
|
|
29
|
-
errorHandler
|
|
30
|
-
} from './core/middleware';
|
|
31
|
-
|
|
32
|
-
// Context
|
|
33
|
-
export { ContextImpl, parseBody } from './core/context';
|
|
34
|
-
export { ContextPool } from './core/context-pool';
|
|
35
|
-
|
|
36
|
-
// =============================================================================
|
|
37
|
-
// STATE MANAGEMENT
|
|
38
|
-
// =============================================================================
|
|
39
|
-
|
|
40
|
-
// ContextStore - Global singleton stores
|
|
41
|
-
// RequestStore - Per-request scoped stores
|
|
42
|
-
export {
|
|
43
|
-
ContextStore,
|
|
44
|
-
RequestStore,
|
|
45
|
-
StoreRegistry,
|
|
46
|
-
RequestStoreRegistry,
|
|
47
|
-
createStoreRegistry,
|
|
48
|
-
type StoreListener,
|
|
49
|
-
type DisposeCallback,
|
|
50
|
-
type StoreConstructor,
|
|
51
|
-
type StateOf,
|
|
52
|
-
type StoreOptions,
|
|
53
|
-
type RequestStoreConstructor,
|
|
54
|
-
type RequestStateOf
|
|
55
|
-
} from './core/store';
|
|
56
|
-
|
|
57
|
-
// =============================================================================
|
|
58
|
-
// PLUGIN SYSTEM
|
|
59
|
-
// =============================================================================
|
|
60
|
-
|
|
61
|
-
export {
|
|
62
|
-
PluginManager,
|
|
63
|
-
PluginBuilder,
|
|
64
|
-
definePlugin,
|
|
65
|
-
createPlugin,
|
|
66
|
-
type NexusPlugin,
|
|
67
|
-
type SimplePlugin,
|
|
68
|
-
type PluginFactory,
|
|
69
|
-
type PluginMeta,
|
|
70
|
-
type PluginContext,
|
|
71
|
-
type PluginLogger,
|
|
72
|
-
type PluginPhase,
|
|
73
|
-
type PluginPriority,
|
|
74
|
-
type PluginRouteExtension,
|
|
75
|
-
type RegisteredPlugin
|
|
76
|
-
} from './core/plugin';
|
|
77
|
-
|
|
78
|
-
// =============================================================================
|
|
79
|
-
// ADAPTERS
|
|
80
|
-
// =============================================================================
|
|
81
|
-
|
|
82
|
-
export {
|
|
83
|
-
AdapterRegistry,
|
|
84
|
-
type LoggerAdapter,
|
|
85
|
-
type CacheAdapter,
|
|
86
|
-
type SessionAdapter
|
|
87
|
-
} from './core/adapter';
|
|
88
|
-
|
|
89
|
-
// =============================================================================
|
|
90
|
-
// PERFORMANCE
|
|
91
|
-
// =============================================================================
|
|
92
|
-
|
|
93
|
-
export { BufferPool, StreamUtils } from './core/performance/buffer-pool';
|
|
94
|
-
export { MiddlewareOptimizer, PerformanceMonitor } from './core/performance/middleware-optimizer';
|
|
95
|
-
|
|
96
|
-
// =============================================================================
|
|
97
|
-
// SECURITY
|
|
98
|
-
// =============================================================================
|
|
99
|
-
|
|
100
|
-
export * from './security';
|
|
101
|
-
|
|
102
|
-
// =============================================================================
|
|
103
|
-
// DATABASE
|
|
104
|
-
// =============================================================================
|
|
105
|
-
|
|
106
|
-
export * from './database';
|
|
107
|
-
|
|
108
|
-
// =============================================================================
|
|
109
|
-
// OBSERVABILITY & MONITORING
|
|
110
|
-
// =============================================================================
|
|
111
|
-
|
|
112
|
-
export { ObservabilityCenter } from './advanced/observability/ObservabilityCenter';
|
|
113
|
-
export { createObservabilityMiddleware } from './advanced/observability/createObservabilityMiddleware';
|
|
114
|
-
export type { ObservabilityOptions } from './advanced/observability/types';
|
|
115
|
-
|
|
116
|
-
// Sentry Integration
|
|
117
|
-
export {
|
|
118
|
-
SentryClient,
|
|
119
|
-
initSentry,
|
|
120
|
-
getSentry,
|
|
121
|
-
createSentryMiddleware,
|
|
122
|
-
createSentryErrorHandler,
|
|
123
|
-
captureException,
|
|
124
|
-
captureMessage,
|
|
125
|
-
addBreadcrumb,
|
|
126
|
-
setUser,
|
|
127
|
-
setTag,
|
|
128
|
-
setExtra,
|
|
129
|
-
withSpan,
|
|
130
|
-
} from './advanced/sentry';
|
|
131
|
-
|
|
132
|
-
export type {
|
|
133
|
-
SentryOptions,
|
|
134
|
-
SentryUser,
|
|
135
|
-
SentryBreadcrumb,
|
|
136
|
-
SentryEvent,
|
|
137
|
-
SentryTransaction,
|
|
138
|
-
SentrySpan,
|
|
139
|
-
SentryMiddlewareOptions,
|
|
140
|
-
SeverityLevel,
|
|
141
|
-
} from './advanced/sentry/types';
|
|
142
|
-
|
|
143
|
-
// =============================================================================
|
|
144
|
-
// DEPLOYMENT & PRODUCTION
|
|
145
|
-
// =============================================================================
|
|
146
|
-
|
|
147
|
-
export {
|
|
148
|
-
// Graceful Shutdown
|
|
149
|
-
GracefulShutdownManager,
|
|
150
|
-
createGracefulShutdown,
|
|
151
|
-
type GracefulShutdownOptions,
|
|
152
|
-
type ShutdownHook,
|
|
153
|
-
type ActiveConnection,
|
|
154
|
-
|
|
155
|
-
// Clustering
|
|
156
|
-
ClusterManager,
|
|
157
|
-
createCluster,
|
|
158
|
-
runClustered,
|
|
159
|
-
type ClusterOptions,
|
|
160
|
-
type WorkerInfo,
|
|
161
|
-
type ClusterStats,
|
|
162
|
-
|
|
163
|
-
// Configuration
|
|
164
|
-
ConfigManager,
|
|
165
|
-
defineConfig,
|
|
166
|
-
env,
|
|
167
|
-
requireEnv,
|
|
168
|
-
type Environment,
|
|
169
|
-
type ConfigDefinition,
|
|
170
|
-
type ConfigOptions,
|
|
171
|
-
type BaseConfig,
|
|
172
|
-
type ServerConfig,
|
|
173
|
-
type DatabaseConfig,
|
|
174
|
-
type LoggingConfig,
|
|
175
|
-
type SecurityConfig,
|
|
176
|
-
type CacheConfig,
|
|
177
|
-
type SessionConfig,
|
|
178
|
-
|
|
179
|
-
// Docker
|
|
180
|
-
DockerGenerator,
|
|
181
|
-
createDocker,
|
|
182
|
-
generateDockerFiles,
|
|
183
|
-
type DockerOptions,
|
|
184
|
-
type ComposeService,
|
|
185
|
-
type ComposeConfig
|
|
186
|
-
} from './deployment';
|
|
187
|
-
|
|
188
|
-
// =============================================================================
|
|
189
|
-
// API DOCUMENTATION & TESTING
|
|
190
|
-
// =============================================================================
|
|
191
|
-
|
|
192
|
-
// Swagger
|
|
193
|
-
export { swagger } from './advanced/swagger/swagger';
|
|
194
|
-
export { SwaggerGenerator } from './advanced/swagger/SwaggerGenerator';
|
|
195
|
-
export { createSwagger } from './advanced/swagger/createSwagger';
|
|
196
|
-
|
|
197
|
-
export type {
|
|
198
|
-
SwaggerConfig,
|
|
199
|
-
SwaggerInfo,
|
|
200
|
-
SwaggerTheme,
|
|
201
|
-
SecurityScheme,
|
|
202
|
-
OpenAPISpec,
|
|
203
|
-
OpenAPISchema,
|
|
204
|
-
OpenAPIOperation,
|
|
205
|
-
OpenAPIParameter,
|
|
206
|
-
OpenAPIRequestBody,
|
|
207
|
-
OpenAPIResponse
|
|
208
|
-
} from './advanced/swagger/types';
|
|
209
|
-
|
|
210
|
-
// Postman
|
|
211
|
-
export type {
|
|
212
|
-
PostmanConfig,
|
|
213
|
-
PostmanAuth,
|
|
214
|
-
PostmanCollection,
|
|
215
|
-
PostmanEnvironment
|
|
216
|
-
} from './advanced/postman/types';
|
|
217
|
-
export { postman } from './advanced/postman/postman';
|
|
218
|
-
|
|
219
|
-
// API Playground
|
|
220
|
-
export {
|
|
221
|
-
playground,
|
|
222
|
-
type PlaygroundConfig
|
|
223
|
-
} from './advanced/playground';
|
|
224
|
-
|
|
225
|
-
// Testing Utilities
|
|
226
|
-
export { TestClient } from './advanced/testing/harness';
|
|
227
|
-
|
|
228
|
-
// =============================================================================
|
|
229
|
-
// ADVANCED FEATURES
|
|
230
|
-
// =============================================================================
|
|
231
|
-
|
|
232
|
-
// Static File Serving
|
|
233
|
-
export { staticFiles } from './advanced/static';
|
|
234
|
-
|
|
235
|
-
// WebSocket / Realtime
|
|
236
|
-
export {
|
|
237
|
-
WebSocketGateway,
|
|
238
|
-
type WebSocketContext,
|
|
239
|
-
type WebSocketRoute,
|
|
240
|
-
type WebSocketRouteConfig
|
|
241
|
-
} from './advanced/realtime/websocket';
|
|
242
|
-
|
|
243
|
-
// Cache System
|
|
244
|
-
export {
|
|
245
|
-
MultiTierCache,
|
|
246
|
-
InMemoryCacheStore,
|
|
247
|
-
RedisCacheStore,
|
|
248
|
-
createRedisCache,
|
|
249
|
-
type CacheStore,
|
|
250
|
-
type CacheEntry,
|
|
251
|
-
type CacheSetOptions,
|
|
252
|
-
type CacheTierConfig,
|
|
253
|
-
type CacheWrapOptions,
|
|
254
|
-
type MemoizeOptions,
|
|
255
|
-
type RedisCacheConfig,
|
|
256
|
-
type RedisClientLike
|
|
257
|
-
} from './advanced/cache';
|
|
258
|
-
|
|
259
|
-
// =============================================================================
|
|
260
|
-
// UTILITIES
|
|
261
|
-
// =============================================================================
|
|
262
|
-
|
|
263
|
-
// Re-export Zod for convenience
|
|
264
|
-
export { z } from 'zod';
|