sseParse.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. export function createSSEParser(callback) {
  2. let buffer = '';
  3. let currentEvent = 'message'; // 默认事件名
  4. // 处理接收到的数据
  5. function parse(chunk) {
  6. // 将新数据添加到缓冲区
  7. buffer += chunk;
  8. // 尝试分割完整的消息(以\n\n为分隔符)
  9. const messages = buffer.split('\n\n');
  10. // 如果最后一段不完整,保留在缓冲区
  11. buffer = messages.pop();
  12. // 处理每一条完整的消息
  13. messages.forEach((message) => {
  14. if (message.trim()) {
  15. // 默认事件message
  16. currentEvent = 'message';
  17. parseMessage(message);
  18. }
  19. });
  20. }
  21. // 解析单条消息
  22. function parseMessage(message) {
  23. const lines = message.split('\n');
  24. let event = 'message';
  25. const dataLines = [];
  26. // 解析每一行
  27. lines.forEach((line) => {
  28. if (line.startsWith('event:')) {
  29. event = line.slice(6).trim();
  30. currentEvent = event;
  31. } else if (line.startsWith('data:')) {
  32. dataLines.push(line.slice(5).trim());
  33. }
  34. });
  35. // 如果有数据行,处理每一行数据
  36. if (dataLines.length > 0) {
  37. dataLines.forEach((data) => {
  38. callback(currentEvent, data);
  39. });
  40. } else if (currentEvent !== 'message') {
  41. // 如果只有事件没有数据,也触发回调
  42. callback(currentEvent, null);
  43. }
  44. }
  45. return {
  46. parse,
  47. };
  48. }