/** * SSE流式数据处理工具 */ /** * 处理SSE响应数据 * @param {String} data - SSE响应数据 * @param {Function} onMessage - 处理消息的回调函数 * @param {Function} onComplete - 完成时的回调函数 * @param {Function} onError - 错误处理回调函数 */ export function processSSEData(data, onMessage, onComplete, onError) { try { const lines = data.split('\n') for (const line of lines) { if (line.startsWith('data: ')) { const jsonData = JSON.parse(line.substring(6)) onMessage(jsonData) // 如果状态为4,表示对话结束 if (jsonData.data && jsonData.data.status === 4) { onComplete() } } } } catch (error) { console.error('处理SSE数据时出错:', error) if (onError) { onError(error) } } } /** * 创建SSE连接 * @param {String} url - 请求地址 * @param {Object} data - 请求数据 * @param {Function} onMessage - 消息处理回调 * @param {Function} onComplete - 完成回调 * @param {Function} onError - 错误回调 * @returns {Promise} - 返回fetch Promise */ export function createSSEConnection(url, data, onMessage, onComplete, onError) { return fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }).then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`) } const reader = response.body.getReader() const decoder = new TextDecoder('utf-8') let buffer = '' function read() { reader.read().then(({ done, value }) => { if (done) { if (onComplete) onComplete() return } buffer += decoder.decode(value, { stream: true }) processSSEData(buffer, onMessage, onComplete, onError) // 继续读取 read() }).catch(error => { console.error('SSE读取错误:', error) if (onError) onError(error) }) } // 开始读取数据 read() }).catch(error => { console.error('SSE连接错误:', error) if (onError) onError(error) }) }