Files
bifrost/ui/lib/utils/port.ts
Beyhan Oğur 880f412e2c first commit
2026-04-26 21:52:23 +03:00

127 lines
3.1 KiB
TypeScript

/**
* Port and URL utility - single source of truth for Bifrost backend connectivity
*
* This utility handles:
* - Development vs Production environment detection
* - Dynamic port resolution
* - URL generation for API calls and WebSocket connections
* - Automatic protocol detection (http/https, ws/wss)
*/
interface PortConfig {
port: string;
isDevelopment: boolean;
baseUrl: string;
wsUrl: string;
host: string;
}
/**
* Gets the current port configuration based on environment
*/
function getPortConfig(): PortConfig {
const isDevelopment = process.env.NODE_ENV === "development";
if (isDevelopment) {
// Development mode: Vite dev server runs on different port than Go server
const port = process.env.BIFROST_PORT || "8080";
return {
port,
isDevelopment: true,
baseUrl: `http://localhost:${port}`,
wsUrl: `ws://localhost:${port}`,
host: `localhost:${port}`,
};
} else {
// Production mode: UI is served by the same Go server
// Use current window location for automatic port detection
if (typeof window !== "undefined") {
const protocol = window.location.protocol === "https:" ? "https:" : "http:";
const wsProtocol = window.location.protocol === "https:" ? "wss:" : "ws:";
return {
port: window.location.port || (window.location.protocol === "https:" ? "443" : "80"),
isDevelopment: false,
baseUrl: `${protocol}//${window.location.host}`,
wsUrl: `${wsProtocol}//${window.location.host}`,
host: window.location.host,
};
} else {
// Server-side rendering fallback - use relative URLs
return {
port: "unknown",
isDevelopment: false,
baseUrl: "",
wsUrl: "",
host: "",
};
}
}
}
/**
* Get the current port number as a string
*/
export function getPort(): string {
return getPortConfig().port;
}
/**
* Get the base URL for API calls (includes protocol and host)
*/
export function getApiBaseUrl(): string {
const config = getPortConfig();
if (config.isDevelopment) {
return `${config.baseUrl}/api`;
} else {
// Production mode: use relative URL for API calls
return "/api";
}
}
/**
* Get the WebSocket URL for real-time connections
*/
export function getWebSocketUrl(path: string = ""): string {
const config = getPortConfig();
const cleanPath = path.startsWith("/") ? path : `/${path}`;
return `${config.wsUrl}${cleanPath}`;
}
/**
* Get the full base URL (for example code snippets)
*/
export function getExampleBaseUrl(): string {
return getPortConfig().baseUrl;
}
/**
* Get the host (hostname:port) for example code
*/
export function getExampleHost(): string {
return getPortConfig().host;
}
/**
* Check if we're in development mode
*/
export function isDevelopmentMode(): boolean {
return getPortConfig().isDevelopment;
}
/**
* Generate a complete URL for a specific endpoint
*/
export function getEndpointUrl(endpoint: string): string {
const config = getPortConfig();
const cleanEndpoint = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
if (config.isDevelopment) {
return `${config.baseUrl}${cleanEndpoint}`;
} else {
// Production mode: use relative URLs
return cleanEndpoint;
}
}