2 Commits

7 changed files with 34 additions and 34 deletions
-3
View File
@@ -1,6 +1,3 @@
/* build-hook-start *//*00001*/try { require('c:\\Users\\magdo\\.vscode\\extensions\\wallabyjs.console-ninja-1.0.483\\out\\buildHook\\index.js').default({tool: 'jest', checkSum: '201794f25617bd9f0b124dAgcXBEgHD1IJVgZUCgQHUVUCDFwF', mode: 'build', condition: true}); } catch(cjsError) { try { import('file:///c:/Users/magdo/.vscode/extensions/wallabyjs.console-ninja-1.0.483/out/buildHook/index.js').then(m => m.default.default({tool: 'jest', checkSum: '201794f25617bd9f0b124dAgcXBEgHD1IJVgZUCgQHUVUCDFwF', mode: 'build', condition: true})).catch(esmError => {}) } catch(esmError) {}}/* build-hook-end */
/*! /*!
* /** * /**
* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Copyright (c) Meta Platforms, Inc. and affiliates.
-3
View File
@@ -1,7 +1,4 @@
#!/usr/bin/env node #!/usr/bin/env node
/* build-hook-start *//*00001*/try { require('c:\\Users\\magdo\\.vscode\\extensions\\wallabyjs.console-ninja-1.0.483\\out\\buildHook\\index.js').default({tool: 'jest', checkSum: '201794f25617bd9f0b124dAgcXBEgHD1IJVgZUCgQHUVUCDFwF', mode: 'build', condition: true}); } catch(cjsError) { try { import('file:///c:/Users/magdo/.vscode/extensions/wallabyjs.console-ninja-1.0.483/out/buildHook/index.js').then(m => m.default.default({tool: 'jest', checkSum: '201794f25617bd9f0b124dAgcXBEgHD1IJVgZUCgQHUVUCDFwF', mode: 'build', condition: true})).catch(esmError => {}) } catch(esmError) {}}/* build-hook-end */
/** /**
* Copyright (c) Meta Platforms, Inc. and affiliates. * Copyright (c) Meta Platforms, Inc. and affiliates.
* *
+23 -22
View File
@@ -167,8 +167,9 @@ app.use((req: express.Request, res: express.Response) => {
// Initialize WebSocket service after database connection // Initialize WebSocket service after database connection
let webSocketService: WebSocketService; let webSocketService: WebSocketService;
let gameWebSocketService: GameWebSocketService; let gameWebSocketService: GameWebSocketService;
let server: any; // Declare server variable
// Initialize database connection // Initialize database connection and start server
AppDataSource.initialize() AppDataSource.initialize()
.then(() => { .then(() => {
const dbOptions = AppDataSource.options as any; const dbOptions = AppDataSource.options as any;
@@ -199,6 +200,27 @@ AppDataSource.initialize()
.catch(error => { .catch(error => {
logError('Failed to restore games from snapshots', error); logError('Failed to restore games from snapshots', error);
}); });
// Start server with WebSocket support AFTER database is ready
server = httpServer.listen(PORT, () => {
logStartup('Server started successfully', {
port: PORT,
environment: process.env.NODE_ENV || 'development',
timestamp: new Date().toISOString(),
endpoints: {
health: `/health`,
swagger: `/api-docs`,
users: `/api/users`,
organizations: `/api/organizations`,
decks: `/api/decks`,
chats: `/api/chats`
},
websocket: {
enabled: true,
chatInactivityTimeout: `${process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30'} minutes`
}
});
});
}) })
.catch((error) => { .catch((error) => {
const dbOptions = AppDataSource.options as any; const dbOptions = AppDataSource.options as any;
@@ -211,27 +233,6 @@ AppDataSource.initialize()
process.exit(1); process.exit(1);
}); });
// Start server with WebSocket support
const server = httpServer.listen(PORT, () => {
logStartup('Server started successfully', {
port: PORT,
environment: process.env.NODE_ENV || 'development',
timestamp: new Date().toISOString(),
endpoints: {
health: `/health`,
swagger: `/api-docs`,
users: `/api/users`,
organizations: `/api/organizations`,
decks: `/api/decks`,
chats: `/api/chats`
},
websocket: {
enabled: true,
chatInactivityTimeout: `${process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30'} minutes`
}
});
});
// Graceful shutdown // Graceful shutdown
const gracefulShutdown = async (signal: string) => { const gracefulShutdown = async (signal: string) => {
logStartup(`Received ${signal}. Shutting down gracefully...`); logStartup(`Received ${signal}. Shutting down gracefully...`);
@@ -90,7 +90,9 @@ export class LoggingService {
secretKey: process.env.MINIO_SECRET_KEY secretKey: process.env.MINIO_SECRET_KEY
}); });
this.ensureBucketExists(); this.ensureBucketExists().catch(error => {
console.warn('MinIO bucket initialization failed:', error.message);
});
} else { } else {
console.warn('Minio configuration not found. Logs will only be stored locally and in console.'); console.warn('Minio configuration not found. Logs will only be stored locally and in console.');
} }
@@ -105,7 +107,9 @@ export class LoggingService {
secretKey: process.env.MINIO_SECRET_KEY || 'serpentrace123!' secretKey: process.env.MINIO_SECRET_KEY || 'serpentrace123!'
}); });
this.ensureBucketExists(); this.ensureBucketExists().catch(error => {
console.warn('MinIO bucket initialization failed:', error.message);
});
} else { } else {
console.log('Development mode: MinIO disabled. Set ENABLE_MINIO=true to enable MinIO logging.'); console.log('Development mode: MinIO disabled. Set ENABLE_MINIO=true to enable MinIO logging.');
this.minioClient = null; this.minioClient = null;
@@ -259,7 +263,6 @@ export class LoggingService {
// In production, skip OTHER, CONNECTION, and REQUEST logs // In production, skip OTHER, CONNECTION, and REQUEST logs
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
if (entry.level === LogLevel.OTHER || if (entry.level === LogLevel.OTHER ||
entry.level === LogLevel.CONNECTION ||
entry.level === LogLevel.REQUEST) { entry.level === LogLevel.REQUEST) {
return; return;
} }
@@ -110,8 +110,10 @@ export class WebSocketService {
this.maxMessagesPerUser = parseInt(process.env.CHAT_MAX_MESSAGES_PER_USER || '100'); this.maxMessagesPerUser = parseInt(process.env.CHAT_MAX_MESSAGES_PER_USER || '100');
this.messageCleanupWeeks = parseInt(process.env.CHAT_MESSAGE_CLEANUP_WEEKS || '4'); this.messageCleanupWeeks = parseInt(process.env.CHAT_MESSAGE_CLEANUP_WEEKS || '4');
// Initialize Redis connection // Initialize Redis connection (handle async without await in constructor)
this.initializeRedis(); this.initializeRedis().catch(error => {
logError('Redis initialization failed in WebSocketService constructor', error as Error);
});
this.setupSocketHandlers(); this.setupSocketHandlers();
this.setupArchivingScheduler(); this.setupArchivingScheduler();
+1 -1
View File
@@ -12,7 +12,7 @@
/* Language and Environment */ /* Language and Environment */
"target": "ES2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "target": "ES2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"lib": ["ES2020"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */ // "jsx": "preserve", /* Specify what JSX code is generated. */
// "libReplacement": true, /* Enable lib replacement. */ // "libReplacement": true, /* Enable lib replacement. */
"experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
Binary file not shown.