日志增强: - 连接开始:显示目标地址、协议版本、Token 状态 - WebSocket 打开:显示就绪状态 - 发送消息:显示完整请求内容 - 接收消息:显示原始数据(前 500 字节)、消息类型、事件名称 - 响应处理:显示响应状态、成功/失败、错误信息 - 连接关闭:显示关闭代码、原因、是否干净关闭 - 错误处理:显示错误类型、堆栈跟踪、针对性建议 - 关闭代码诊断:1006/1002/1003/1008/1011 等代码的含义 - SSL 错误诊断:WRONG_VERSION_NUMBER/ECONNREFUSED/ETIMEDOUT 等 方便快速定位 OpenClaw Gateway 连接问题
119 lines
5.5 KiB
JavaScript
119 lines
5.5 KiB
JavaScript
this.socket.on('open', () => {
|
||
console.log('[OpenClaw] ✅ WebSocket 连接已建立');
|
||
console.log('[OpenClaw] 就绪状态:', this.socket.readyState, '(1=OPEN)');
|
||
this.isConnected = true;
|
||
this.reconnectAttempts = 0;
|
||
|
||
// 检查窗口是否存在
|
||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||
this.eventHandler('connected');
|
||
}
|
||
|
||
// 主动发送 connect 请求(兼容模式:不等待 challenge)
|
||
console.log('[OpenClaw] 📤 准备发送 connect 请求...');
|
||
this.sendConnect();
|
||
});
|
||
|
||
this.socket.on('message', (data) => {
|
||
// 窗口已关闭时忽略消息
|
||
if (!mainWindow || mainWindow.isDestroyed()) {
|
||
return;
|
||
}
|
||
try {
|
||
const messageStr = data.toString();
|
||
console.log('[OpenClaw] 📥 收到消息 (长度:', messageStr.length, '字节)');
|
||
console.log('[OpenClaw] 原始数据:', messageStr.substring(0, 500) + (messageStr.length > 500 ? '...' : ''));
|
||
|
||
const message = JSON.parse(messageStr);
|
||
console.log('[OpenClaw] 消息类型:', message.type);
|
||
|
||
if (message.type === 'event') {
|
||
console.log('[OpenClaw] 事件名称:', message.event);
|
||
} else if (message.type === 'res') {
|
||
console.log('[OpenClaw] 响应 ID:', message.id);
|
||
console.log('[OpenClaw] 响应状态:', message.ok ? '✅ 成功' : '❌ 失败');
|
||
if (!message.ok) {
|
||
console.log('[OpenClaw] 错误信息:', message.error);
|
||
}
|
||
}
|
||
|
||
// 处理 connect.challenge 质询
|
||
if (message.type === 'event' && message.event === 'connect.challenge') {
|
||
console.log('[OpenClaw] 🔐 收到 challenge 质询');
|
||
console.log('[OpenClaw] Nonce:', message.payload?.nonce);
|
||
console.log('[OpenClaw] 发送 connect 请求响应 challenge...');
|
||
this.sendConnect(message.payload?.nonce);
|
||
return;
|
||
}
|
||
|
||
this.handleMessage(message);
|
||
} catch (error) {
|
||
console.error('[OpenClaw] ❌ 解析消息错误:', error.message);
|
||
console.error('[OpenClaw] 原始数据:', data.toString().substring(0, 200));
|
||
}
|
||
});
|
||
|
||
this.socket.on('close', (event) => {
|
||
console.log('[OpenClaw] 🔴 WebSocket 连接已关闭');
|
||
console.log('[OpenClaw] 关闭代码:', event.code);
|
||
console.log('[OpenClaw] 关闭原因:', event.reason || '无');
|
||
console.log('[OpenClaw] 是否干净关闭:', event.wasClean);
|
||
console.log('[OpenClaw] 就绪状态:', this.socket.readyState, '(3=CLOSED)');
|
||
|
||
this.isConnected = false;
|
||
|
||
// 检查窗口是否存在
|
||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||
this.eventHandler('disconnected');
|
||
}
|
||
|
||
// 根据关闭代码给出建议
|
||
if (event.code === 1006) {
|
||
console.log('[OpenClaw] ⚠️ 异常关闭(1006)- 可能是网络问题或服务器拒绝连接');
|
||
} else if (event.code === 1002) {
|
||
console.log('[OpenClaw] ⚠️ 协议错误(1002)- 服务器不支持的协议');
|
||
} else if (event.code === 1003) {
|
||
console.log('[OpenClaw] ⚠️ 数据类型错误(1003)- 服务器不接受的数据格式');
|
||
} else if (event.code === 1008) {
|
||
console.log('[OpenClaw] ⚠️ 策略违规(1008)- 违反服务器策略');
|
||
} else if (event.code === 1011) {
|
||
console.log('[OpenClaw] ⚠️ 服务器错误(1011)- 服务器遇到问题');
|
||
}
|
||
|
||
this.scheduleReconnect();
|
||
});
|
||
|
||
this.socket.on('error', (error) => {
|
||
console.error('[OpenClaw] ❌ WebSocket 错误:', error.message);
|
||
console.error('[OpenClaw] 错误类型:', error.constructor.name);
|
||
console.error('[OpenClaw] 错误堆栈:', error.stack?.split('\n').slice(0, 3).join('\n'));
|
||
|
||
// 检测 SSL/TLS 错误并给出建议
|
||
if (error.message?.includes('WRONG_VERSION_NUMBER')) {
|
||
console.error('[OpenClaw] 🔴 SSL/TLS 协议不匹配!');
|
||
console.error('[OpenClaw] 可能原因:');
|
||
console.error('[OpenClaw] 1. 使用 wss:// 但服务器只支持 ws://');
|
||
console.error('[OpenClaw] 2. 使用 ws:// 但服务器只支持 wss://');
|
||
console.error('[OpenClaw] 3. SSL 证书问题(自签名/过期)');
|
||
console.error('[OpenClaw] 建议:');
|
||
console.error('[OpenClaw] - 尝试改用 ws://(非加密)');
|
||
console.error('[OpenClaw] - 确认端口是否正确');
|
||
console.error('[OpenClaw] - 检查服务器是否正常运行');
|
||
} else if (error.message?.includes('ECONNREFUSED')) {
|
||
console.error('[OpenClaw] 🔴 连接被拒绝 - 服务器可能未启动或防火墙阻止');
|
||
} else if (error.message?.includes('ETIMEDOUT')) {
|
||
console.error('[OpenClaw] 🔴 连接超时 - 网络问题或服务器无响应');
|
||
} else if (error.message?.includes('ENOTFOUND')) {
|
||
console.error('[OpenClaw] 🔴 域名解析失败 - 检查 URL 是否正确');
|
||
}
|
||
|
||
// 检查窗口是否存在
|
||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||
this.eventHandler('error', {
|
||
error: error.message,
|
||
hint: error.message?.includes('WRONG_VERSION_NUMBER') ?
|
||
'SSL 协议不匹配,请检查是否应该使用 ws://而不是 wss://' : null
|
||
});
|
||
}
|
||
});
|