Я изучил спецификацию HTML5 EventSource и не могу понять, как анализировать и обрабатывать возврат каретки в конце полученных данных.
Приложение получает поток данных, состоящий из строк. Каждая строка может заканчиваться символами \r\n, \n или \r. В пустой строке событие должно считаться готовым и запускаться слушателям.
data: foobar\r\n
id: 1\r\n
\r\n
Одинаково значимое событие с тем же содержанием
data: foobar\n
id: 1\r\n
\r
Полная спецификация здесь, http://dev.w3.org/html5/eventsource/ Глава 6. описывает БНФ входа.
Проблема заключается в возврате каретки, когда он виден в конце полученных данных. Теперь, насколько я понимаю, правильный способ синтаксического анализа - выполнить поиск самого длинного совпадения и затем дождаться следующего пакета данных. Проблема в том, что если \r действительно был пустым маркером строки, событие не будет запущено до тех пор, пока не прибудет следующий пакет данных и парсер не наберет достаточно данных для попытки самого длинного совпадения.
Текущий пакет данных
data: foobar\r\n
id: 1\r\n
\r
Следующий пакет данных
\n
data: foobar2\r\n
id: 1\r\n
\r\n
Альтернативный кейс. Следующий пакет данных
data: foobar2\r\n
id: 1\r\n
\r\n
Это не было бы проблемой при традиционном синтаксическом анализе, но это в EventSource, потому что мне нужно инициировать события как можно скорее, поэтому, если реализация ожидает, пока следующий пакет данных получит самое длинное совпадение, он может ждать долгое время, если отправитель использовал один символ ' \r' в качестве пустого маркера строки, и какое-то время он больше ничего не отправит.