116 lines
3 KiB
JavaScript
116 lines
3 KiB
JavaScript
// Core Dodgers Stream Application
|
|
// Configuration and module loading
|
|
|
|
const AppConfig = {
|
|
// API configuration
|
|
api: {
|
|
baseUrl: '',
|
|
heartbeatInterval: 5000,
|
|
chatPollInterval: 2000,
|
|
maxRetries: 3,
|
|
retryDelay: 1000
|
|
},
|
|
// Video player configuration
|
|
video: {
|
|
defaultVolume: 0.3,
|
|
maxRetries: 3,
|
|
recoveryTimeout: 10000,
|
|
streamMonitoringInterval: 10000,
|
|
recoveryCheckCount: 5,
|
|
recoveryCheckInterval: 2000
|
|
},
|
|
// UI configuration
|
|
ui: {
|
|
animationDuration: 300,
|
|
mobileBreakpoint: 768,
|
|
toastDuration: 3000
|
|
},
|
|
// Chat configuration
|
|
chat: {
|
|
maxMessages: 100,
|
|
maxMessageLength: 1000,
|
|
maxNicknameLength: 20,
|
|
typingTimeout: 1000
|
|
}
|
|
};
|
|
|
|
// Global application state
|
|
const AppState = {
|
|
player: null,
|
|
userId: '',
|
|
nickname: '',
|
|
isAdmin: false,
|
|
streamMode: 'live', // 'live' or 'placeholder'
|
|
chatCollapsed: false,
|
|
unreadCount: 0,
|
|
soundEnabled: true,
|
|
lastMessageId: '',
|
|
allMessages: [],
|
|
viewerCount: 0,
|
|
errorRetryCount: 0,
|
|
isRetrying: false,
|
|
isRecovering: false,
|
|
recoveryInterval: null,
|
|
typingTimer: null,
|
|
isTyping: false
|
|
};
|
|
|
|
// Global error handling and logging
|
|
const AppLogger = {
|
|
log: (message, ...args) => {
|
|
console.log(`[${new Date().toLocaleTimeString()}] ${message}`, ...args);
|
|
},
|
|
error: (message, ...args) => {
|
|
console.error(`[${new Date().toLocaleTimeString()}] ERROR: ${message}`, ...args);
|
|
},
|
|
warn: (message, ...args) => {
|
|
console.warn(`[${new Date().toLocaleTimeString()}] WARNING: ${message}`, ...args);
|
|
}
|
|
};
|
|
|
|
// Module registry for dependencies
|
|
const AppModules = {
|
|
loaded: new Set(),
|
|
|
|
register: function(name) {
|
|
this.loaded.add(name);
|
|
AppLogger.log(`Module '${name}' registered`);
|
|
},
|
|
|
|
isLoaded: function(name) {
|
|
return this.loaded.has(name);
|
|
},
|
|
|
|
require: function(...names) {
|
|
for (const name of names) {
|
|
if (!this.isLoaded(name)) {
|
|
throw new Error(`Required module '${name}' is not loaded`);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// Global error handler
|
|
window.addEventListener('unhandledrejection', (event) => {
|
|
AppLogger.error('Unhandled promise rejection:', event.reason);
|
|
});
|
|
|
|
window.addEventListener('error', (event) => {
|
|
AppLogger.error('Unhandled error:', event.error);
|
|
});
|
|
|
|
// Initialize application
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
AppLogger.log('Dodgers Stream Theater initializing...');
|
|
|
|
// Start with basic UI setup
|
|
const nicknameInput = document.getElementById('nickname');
|
|
if (nicknameInput && localStorage.getItem('chatNickname')) {
|
|
nicknameInput.value = localStorage.getItem('chatNickname');
|
|
AppState.nickname = nicknameInput.value;
|
|
}
|
|
|
|
AppLogger.log('Core application initialized');
|
|
});
|
|
|
|
AppLogger.log('Core app.js loaded');
|