export function createSSEParser(callback) { let buffer = ''; let currentEvent = 'message'; // 默认事件名 // 处理接收到的数据 function parse(chunk) { // 将新数据添加到缓冲区 buffer += chunk; // 尝试分割完整的消息(以\n\n为分隔符) const messages = buffer.split('\n\n'); // 如果最后一段不完整,保留在缓冲区 buffer = messages.pop(); // 处理每一条完整的消息 messages.forEach((message) => { if (message.trim()) { // 默认事件message currentEvent = 'message'; parseMessage(message); } }); } // 解析单条消息 function parseMessage(message) { const lines = message.split('\n'); let event = 'message'; const dataLines = []; // 解析每一行 lines.forEach((line) => { if (line.startsWith('event:')) { event = line.slice(6).trim(); currentEvent = event; } else if (line.startsWith('data:')) { dataLines.push(line.slice(5).trim()); } }); // 如果有数据行,处理每一行数据 if (dataLines.length > 0) { dataLines.forEach((data) => { callback(currentEvent, data); }); } else if (currentEvent !== 'message') { // 如果只有事件没有数据,也触发回调 callback(currentEvent, null); } } return { parse, }; }