Шрифт:
window.EventSource = function(url) { // использовать эту его имитацию,
var xhr; // HTTP-соединение...
var evtsrc = this: // Используется в обработчиках,
var charsReceived = 0; // Так определяется появление нового текста
var type = null; // Для проверки свойства type ответа,
var data = ""; // Хранит данные сообщения
var eventName = "message": // Значение поля type объектов событий
var lastEventld = ""; // Для синхронизации с сервером
var retrydelay = 1000: // Задержка между попытками соединения
var aborted = false: // Установите в true, чтобы разорвать соединение
// Создать объект XHR
xhr = new XMLHttpRequest:
// Определить обработчик события для него
xhr.onreadystatechange = function {
switch(xhr.readyState) {
case 3: processData: break; // При получении фрагмента данных
case 4: reconnectO: break; // По завершении запроса
}
};
// И установить долгоживущее соединение
connect;
// Если соединение было закрыто обычным образом, ждать секунду
// и попробовать восстановить соединение
function reconnect {
if (aborted) return; // He восстанавливать после
// принудительного прерывания
if (xhr.status >= 300) return;
// He восстанавливать после ошибки
setTimeout(connect, retrydelay); // Ждать и повторить попытку
};
// Устанавливает соединение
function connect {
charsReceived = 0; type = null; xhr.open("GET", url);
xhr.setRequestHeader(“Cache-Control", "no-cache");
if (lastEventld)
xhr.setRequestHeader("Last-Event-ID", lastEventld);
xhr.send;
}
// При получении данных обрабатывает их и вызывает обработчик onmessage.
// Эта функция реализует работу с протоколом Server-Sent Events
function processData {
if (!type) { // Проверить тип ответа, если это еще не сделано
type = xhr.getResponseHeader(’Content-Type’);
if (type !== "text/event-stream") {
aborted = true;
xhr.abort;
return;
}
}
// Запомнить полученный объем данных и извлечь только ту часть ответа,
// которая еще не была обработана,
var chunk = xhr.responseText.substring(charsReceived);
charsReceived = xhr.responseText.length;