202 lines
5.1 KiB
TypeScript
202 lines
5.1 KiB
TypeScript
/*
|
||
* @Date: 2024-12-19
|
||
* @Description: GK数据WebSocket配置文件
|
||
* @Author: Assistant
|
||
* @FilePath: \drone-v2-command-screen\src\api\websocket\gkDataConfig.ts
|
||
*/
|
||
import { ELocalStorageKey } from '/@/types/enums'
|
||
|
||
/**
|
||
* GK数据WebSocket配置接口
|
||
*/
|
||
export interface GKWebSocketConfig {
|
||
/** 主服务器地址 */
|
||
primary: string
|
||
/** 备用服务器地址 */
|
||
fallback: string
|
||
/** WebSocket连接路径 */
|
||
path: string
|
||
/** 自动重连配置 */
|
||
reconnect: {
|
||
maxReconnectionDelay: number
|
||
minReconnectionDelay: number
|
||
maxRetries: number
|
||
reconnectionDelayGrowFactor: number
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 默认GK数据WebSocket配置
|
||
* 基于项目中的主服务器配置
|
||
*/
|
||
export const DEFAULT_GK_WEBSOCKET_CONFIG: GKWebSocketConfig = {
|
||
// 主服务器地址(当前使用)
|
||
primary: 'ws://27.11.11.30',
|
||
|
||
// 备用服务器地址
|
||
fallback: 'ws://221.226.33.58:18800',
|
||
|
||
// WebSocket连接路径(与项目中的WebSocket路径保持一致)
|
||
path: '/dji/api/v1/ws',
|
||
|
||
// 自动重连配置
|
||
reconnect: {
|
||
maxReconnectionDelay: 20000, // 最大重连延迟:20秒
|
||
minReconnectionDelay: 5000, // 最小重连延迟:5秒
|
||
maxRetries: 10, // 最大重试次数
|
||
reconnectionDelayGrowFactor: 1.3
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取完整的GK数据WebSocket URL(带token认证)
|
||
* @param useFallback 是否使用备用地址
|
||
* @returns 完整的WebSocket URL
|
||
*/
|
||
export function getGKWebSocketUrl(useFallback: boolean = false): string {
|
||
// 获取token(与项目现有方式保持一致)
|
||
const token: string = localStorage.getItem(ELocalStorageKey.Token) || localStorage.getItem(ELocalStorageKey.WsToken) || ''
|
||
|
||
// 在开发环境下使用代理路径,生产环境使用直接连接
|
||
if (import.meta.env.DEV) {
|
||
// 开发环境:使用vite代理
|
||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
||
const host = window.location.host
|
||
const baseUrl = `${protocol}//${host}/dji/api/v1/ws`
|
||
|
||
// 添加token认证参数
|
||
if (token) {
|
||
return `${baseUrl}?x-auth-token=${encodeURIComponent(token)}`
|
||
}
|
||
return baseUrl
|
||
} else {
|
||
// 生产环境:直接连接
|
||
const config = DEFAULT_GK_WEBSOCKET_CONFIG
|
||
const baseUrl = useFallback ? config.fallback : config.primary
|
||
const fullUrl = `${baseUrl}${config.path}`
|
||
|
||
// 添加token认证参数
|
||
if (token) {
|
||
return `${fullUrl}?x-auth-token=${encodeURIComponent(token)}`
|
||
}
|
||
return fullUrl
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取所有可用的GK数据WebSocket URL
|
||
* @returns 主地址和备用地址数组
|
||
*/
|
||
export function getAllGKWebSocketUrls(): string[] {
|
||
return [
|
||
getGKWebSocketUrl(false), // 主地址
|
||
getGKWebSocketUrl(true) // 备用地址
|
||
]
|
||
}
|
||
|
||
/**
|
||
* 从环境变量或进程中获取基础URL
|
||
* 与vite.config.ts中的配置保持一致
|
||
*/
|
||
export function getBaseTargetUrl(): string {
|
||
// 尝试从环境变量中获取(与vite.config.ts保持一致)
|
||
if (typeof process !== 'undefined' && process.env?.BASE_TARGET_URL) {
|
||
return process.env.BASE_TARGET_URL.replace(/"/g, '') // 移除JSON.stringify添加的引号
|
||
}
|
||
|
||
// 默认返回主服务器地址
|
||
return '27.11.11.30/'
|
||
}
|
||
|
||
/**
|
||
* 动态构建GK数据WebSocket URL
|
||
* 基于项目运行时的配置
|
||
*/
|
||
export function buildGKWebSocketUrl(): string {
|
||
const baseUrl = getBaseTargetUrl()
|
||
|
||
// 确保URL格式正确
|
||
let wsUrl = baseUrl.startsWith('ws://') ? baseUrl : `ws://${baseUrl}`
|
||
|
||
// 移除末尾的斜杠(如果存在)
|
||
if (wsUrl.endsWith('/')) {
|
||
wsUrl = wsUrl.slice(0, -1)
|
||
}
|
||
|
||
return `${wsUrl}${DEFAULT_GK_WEBSOCKET_CONFIG.path}`
|
||
}
|
||
|
||
/**
|
||
* GK数据WebSocket配置管理器
|
||
*/
|
||
export class GKWebSocketConfigManager {
|
||
private currentUrl: string
|
||
private fallbackUrl: string
|
||
private retryCount: number = 0
|
||
|
||
constructor() {
|
||
this.currentUrl = getGKWebSocketUrl(false)
|
||
this.fallbackUrl = getGKWebSocketUrl(true)
|
||
}
|
||
|
||
/**
|
||
* 获取当前使用的WebSocket URL
|
||
*/
|
||
getCurrentUrl(): string {
|
||
return this.currentUrl
|
||
}
|
||
|
||
/**
|
||
* 切换到备用地址
|
||
*/
|
||
switchToFallback(): void {
|
||
console.log(`GK WebSocket 切换到备用地址: ${this.fallbackUrl}`)
|
||
this.currentUrl = this.fallbackUrl
|
||
this.retryCount++
|
||
}
|
||
|
||
/**
|
||
* 重置到主地址
|
||
*/
|
||
resetToPrimary(): void {
|
||
console.log(`GK WebSocket 重置到主地址: ${getGKWebSocketUrl(false)}`)
|
||
this.currentUrl = getGKWebSocketUrl(false)
|
||
this.retryCount = 0
|
||
}
|
||
|
||
/**
|
||
* 获取重试次数
|
||
*/
|
||
getRetryCount(): number {
|
||
return this.retryCount
|
||
}
|
||
|
||
/**
|
||
* 是否应该切换到备用地址
|
||
*/
|
||
shouldSwitchToFallback(): boolean {
|
||
return this.retryCount >= 3 && this.currentUrl !== this.fallbackUrl
|
||
}
|
||
|
||
/**
|
||
* 获取重连配置
|
||
*/
|
||
getReconnectConfig() {
|
||
return DEFAULT_GK_WEBSOCKET_CONFIG.reconnect
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 全局GK数据WebSocket配置管理器实例
|
||
*/
|
||
export const gkWebSocketConfigManager = new GKWebSocketConfigManager()
|
||
|
||
export default {
|
||
DEFAULT_GK_WEBSOCKET_CONFIG,
|
||
getGKWebSocketUrl,
|
||
getAllGKWebSocketUrls,
|
||
buildGKWebSocketUrl,
|
||
GKWebSocketConfigManager,
|
||
gkWebSocketConfigManager
|
||
}
|