export type ControlSourceConnectionStatus = | "disconnected" | "connecting" | "connected" | "failed"; export interface ControlSourceConnectionState { status: ControlSourceConnectionStatus; reason: string; } export interface SocketLikeMessage { requestId?: string; operateCode?: string; code?: number; data?: unknown; desc?: string; } export function createDisconnectedState(): ControlSourceConnectionState { return { status: "disconnected", reason: "" }; } export function isSourceSelectable(state: ControlSourceConnectionState): boolean { return state.status === "disconnected" || state.status === "failed"; } export function isConnectButtonEnabled(state: ControlSourceConnectionState): boolean { return isSourceSelectable(state); } export function getConnectionStatusText(state: ControlSourceConnectionState): string { switch (state.status) { case "connecting": return "建立连接中"; case "connected": return "连接成功"; case "failed": return state.reason ? `连接失败:${state.reason}` : "连接失败"; case "disconnected": default: return "未连接"; } } export function resolveConnectionFailureReason(message: SocketLikeMessage): string { if (message.requestId === "connect" && message.operateCode === "Source") { return "源服务端连接失败"; } if (message.requestId === "connect" && message.operateCode === "Dev") { return "设备服务端连接失败"; } const text = typeof message.data === "string" && message.data.trim() ? message.data.trim() : typeof message.desc === "string" && message.desc.trim() ? message.desc.trim() : ""; if (text) { return text; } if (message.requestId === "server_error") { return "服务端主动关闭连接"; } return "源连接失败"; } export function shouldHandleConnectionTerminalMessage(message: SocketLikeMessage): boolean { if (message.requestId === "yjc_ytxjy" && message.operateCode === "INIT_GATHER") { return message.code !== 10201; } if (message.requestId === "connect" && message.operateCode === "Source") { return true; } if (message.requestId === "server_error" && message.operateCode === "server_error") { return true; } return false; } export function applyConnectionTerminalMessage( state: ControlSourceConnectionState, message: SocketLikeMessage ): ControlSourceConnectionState { if (message.requestId === "yjc_ytxjy" && message.operateCode === "INIT_GATHER") { if (message.code === 10200) { return { status: "connected", reason: "" }; } if (message.code !== 10201) { return { status: "failed", reason: resolveConnectionFailureReason(message) }; } } if (message.requestId === "connect" && message.operateCode === "Source") { return { status: "failed", reason: resolveConnectionFailureReason(message) }; } if (message.requestId === "server_error" && message.operateCode === "server_error") { return { status: "failed", reason: resolveConnectionFailureReason(message) }; } return state; }