| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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,
- };
- }
|