103 lines
2.3 KiB
TypeScript
103 lines
2.3 KiB
TypeScript
// WebSocket连接配置
|
||
type WebSocketOptions = {
|
||
fullUrl: string;
|
||
onMessage?: (data: string) => void;
|
||
onOpen?: () => void;
|
||
onError?: (error: Event) => void;
|
||
onClose?: () => void;
|
||
reconnectInterval?: number;
|
||
};
|
||
|
||
let websocket: WebSocket | null = null;
|
||
let reconnectTimer: any = null;
|
||
let isManualClose = false;
|
||
|
||
// 初始化WebSocket连接
|
||
export function initWebSocket(options: WebSocketOptions) {
|
||
const {
|
||
fullUrl,
|
||
onMessage,
|
||
onOpen,
|
||
onError,
|
||
onClose,
|
||
reconnectInterval = 3000
|
||
} = options;
|
||
|
||
// 关闭旧连接
|
||
if (websocket) {
|
||
websocket.close();
|
||
}
|
||
|
||
// 检查浏览器支持性
|
||
if (!('WebSocket' in window)) {
|
||
console.error('当前浏览器不支持WebSocket');
|
||
return;
|
||
}
|
||
|
||
// 创建WebSocket连接
|
||
try {
|
||
websocket = new WebSocket(fullUrl);
|
||
|
||
// 连接成功回调
|
||
websocket.onopen = () => {
|
||
clearTimeout(reconnectTimer!);
|
||
isManualClose = false;
|
||
onOpen?.();
|
||
};
|
||
|
||
// 接收消息回调
|
||
websocket.onmessage = (event) => {
|
||
onMessage?.(event.data);
|
||
};
|
||
|
||
// 错误回调
|
||
websocket.onerror = (error) => {
|
||
onError?.(error);
|
||
startReconnect(() => initWebSocket(options), reconnectInterval);
|
||
};
|
||
|
||
// 关闭回调
|
||
websocket.onclose = () => {
|
||
onClose?.();
|
||
if (!isManualClose) {
|
||
startReconnect(() => initWebSocket(options), reconnectInterval);
|
||
}
|
||
};
|
||
} catch (error) {
|
||
console.error('WebSocket连接创建失败:', error);
|
||
startReconnect(() => initWebSocket(options), reconnectInterval);
|
||
}
|
||
}
|
||
|
||
// 发送消息
|
||
export function sendWebSocketMessage(message: any): boolean {
|
||
if (websocket && websocket.readyState === WebSocket.OPEN) {
|
||
websocket.send(JSON.stringify(message));
|
||
return true;
|
||
}
|
||
console.error('WebSocket未连接,无法发送消息');
|
||
return false;
|
||
}
|
||
|
||
// 手动关闭WebSocket
|
||
export function closeWebSocket(): void {
|
||
isManualClose = true;
|
||
if (reconnectTimer) {
|
||
clearTimeout(reconnectTimer);
|
||
}
|
||
websocket?.close();
|
||
websocket = null;
|
||
}
|
||
|
||
// 启动重连
|
||
function startReconnect(connectCallback: () => void, interval: number): void {
|
||
if (reconnectTimer) {
|
||
clearTimeout(reconnectTimer);
|
||
}
|
||
reconnectTimer = setTimeout(connectCallback, interval);
|
||
}
|
||
|
||
// 获取当前连接状态
|
||
export function getWebSocketState(): number | null {
|
||
return websocket?.readyState || null;
|
||
} |