Jaimodiji's picture
Upload folder using huggingface_hub
aeb61fc verified
// Runtime configuration for ColorRM
// This file is used to configure API endpoints when running in bundled mode
export const Config = {
// Backend URLs
BACKENDS: {
hf: 'https://jaimodiji-my-multiplayer-app.hf.space',
cloudflare: 'https://multiplayer-template.bossemail.workers.dev'
},
// Detect if running in Capacitor (check multiple indicators)
isCapacitor() {
if (typeof window === 'undefined') return false;
// Check for Capacitor object
if (window.Capacitor) return true;
// Check for capacitor:// protocol (bundled mode)
if (window.location.protocol === 'capacitor:') return true;
// Check for file:// with capacitor in path
if (window.location.protocol === 'file:' &&
window.location.href.includes('capacitor')) return true;
// Check for http:// on localhost with empty or file-like path (Android WebView bundled)
if (window.location.protocol === 'http:' &&
window.location.host === 'localhost' &&
window.location.pathname.startsWith('/')) {
// This could be bundled Capacitor or local dev - check for Capacitor later
return false;
}
// Check for https:// on localhost (Android secure WebView)
if (window.location.protocol === 'https:' &&
window.location.host.includes('localhost')) return true;
return false;
},
// Check if running in remote mode (WebView pointing to server)
isRemoteMode() {
if (typeof window === 'undefined') return false;
const host = window.location.host || '';
// If host is empty or file-based, not remote mode
if (!host || host === '') return false;
return host.includes('hf.space') ||
host.includes('workers.dev') ||
host.includes('duckdns.org') ||
host.includes('192.168.');
// Note: removed 'localhost' - it should trigger bundled mode detection
},
// Force bundled mode check - called after Capacitor is definitely loaded
isBundledMode() {
// If Capacitor is present and we're not pointing to a remote server, we're bundled
if (window.Capacitor && !this.isRemoteMode()) {
return true;
}
return false;
},
// Get the API base URL
// In bundled mode, this returns the full backend URL
// In remote/web mode, this returns empty string (relative URLs work)
getApiBase() {
// Remote mode: relative URLs work
if (this.isRemoteMode()) {
return '';
}
// Bundled Capacitor mode: need absolute URL to backend
if (this.isBundledMode() || this.isCapacitor()) {
const defaultBackend = 'cloudflare'; // REPLACED_BY_BUILD_SCRIPT
const preferredBackend = localStorage.getItem('color_rm_backend') || defaultBackend;
const base = this.BACKENDS[preferredBackend] || this.BACKENDS[defaultBackend];
console.log('[Config] Bundled mode - using backend:', base);
return base;
}
// Web browser: relative URLs work
return '';
},
// Helper to make API URL
apiUrl(path) {
const base = this.getApiBase();
// Ensure path starts with /
const normalizedPath = path.startsWith('/') ? path : '/' + path;
return base + normalizedPath;
},
// Helper to make WebSocket URL (for Yjs sync, etc.)
// Handles Capacitor bundled mode where window.location.host is not the server
wsUrl(path) {
const base = this.getApiBase();
// Ensure path starts with /
const normalizedPath = path.startsWith('/') ? path : '/' + path;
if (base) {
// Bundled mode - convert https:// to wss:// or http:// to ws://
const wsBase = base.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');
return wsBase + normalizedPath;
} else {
// Remote/web mode - use current host
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
return `${protocol}//${window.location.host}${normalizedPath}`;
}
},
// Set preferred backend (for bundled mode)
setBackend(backend) {
if (this.BACKENDS[backend]) {
localStorage.setItem('color_rm_backend', backend);
console.log(`[Config] Backend set to: ${backend} (${this.BACKENDS[backend]})`);
return true;
}
return false;
},
// Debug info
getDebugInfo() {
const defaultBackend = 'cloudflare'; // REPLACED_BY_BUILD_SCRIPT
return {
isCapacitor: this.isCapacitor(),
isBundledMode: this.isBundledMode(),
isRemoteMode: this.isRemoteMode(),
protocol: window.location.protocol,
host: window.location.host,
href: window.location.href,
apiBase: this.getApiBase(),
preferredBackend: localStorage.getItem('color_rm_backend') || defaultBackend
};
}
};
// Make available globally immediately
if (typeof window !== 'undefined') {
window.Config = Config;
console.log('[Config] Initialized:', Config.getDebugInfo());
}