Здравствуйте, ·, Вы писали:
·>Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.
Можно посмотреть на PWA (Progressive Web App), т.е. добваить к твоему приложению манифест и воркер скрипт. Минимальный пример здесь
Там ты полностью контролируешь то что именно браузер получает из сети, и решаешь за него, что вернуть (из кэша например), если сервер недоступен или при загрузке произошла ошибка.
Обновление там тоже делается явно.
Открываешь страницу-сторожа в том же домене, что и нужная тебе страница. В ней делаешь скрипт, который открывает новую страницу с нужной информацией (твоим мониторингом). Когда мониторинг нужно обновить, делаешь close() из сторожевой страницы. Страница-сторож держит веб сокет к серверу и получает от него команды на обновление рабочей страницы при смене версии или зависании рабочей страницы. Рабочая страница тоже держит сокет и в него пуляет keep-alive. Сервер сторожевой странице будет либо так же пулять keep-alive, либо уведомит об изменении конфигурации падением веб сокета к сторожу (после восстановления сокета рабочую страницу нужно будет пересоздать close/open). Сторож примитивный, поэтому шансов сломаться у него мало, менять его тоже вряд ли нужно (хотя можно предусмотреть, чтобы он сам себя перезагрузил заходом на другой URL, закрыв перед этим страницу мониторинга).
// watchdog page
var worker_url = "https://domain.local/monitoring.html";
while ( true )
{
var win = window.open(worker_url, '_blank');
win.focus();
// Тут слушаем веб сокет, переоткрываем его при отключении, читаем команду на перезагрузку рабочей страницы и, возможно, на перезагрузку себя
win.close();
}
<body>
<p style="font.color=Вырви_глаз; font.size=Очень_большой; выравнивание=посредине">
Ahtung!!!<br>
Это сторожевая страница для мониторинга. Без нее он может перестать работать.<br>
Не закрывайте эту страницу, если нужно, чтобы мониторинг работал.
</p>
</body>
Или ещё вариант: периодически запускаемый bash-скрипт проверяет заголовок окна браузера (командой wmctrl). Если заголовок не соответствует заголовку сайта, значит произошёл сбой и нужно "нажать" F5 (командой xdotool). Заголовок ставится яваскриптом после диагностики страницы (загрузились ли все скрипты и стили).
Здравствуйте, Lazytech, Вы писали:
L>·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу. L>По идее, можно добавить в конце body небольшой JavaScript-код, который будет проверять по каким-то признакам, загрузился ли bundle.js, и при необходимости принудительно обновит страницу.
Если в момент принудительного обновления страницы не будет сети или сервак будет лежать, то всё сломается. Браузер покажет какой-нибудь "page not found" и усё.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Пытаюсь сделать single page app с автообновлением.
·>Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу.
Обычно делают простейший вариант — переименовывают все js и css файлы в новой версии. Большинство фреймворков делают это автоматически при сборке приложения (или "дедовский" вариант с добавлением суффикса версии к файлам). Браузер подгрузит такие изменения автоматически, после того как загрузит новый index.html
То есть, тебе ничего не надо делать, все и так будет обновляться. Достаточно использовать любой фреймворк для сборки, типа webpack.
Не очень понял почему ты хочешь файлы с сервера загружать "вручную". Это как-то супер подозрительно
Пытаюсь сделать single page app с автообновлением.
Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу.
Для обнаружения у меня в данный момент открывается websocket — если соединение прервано — считается, что время проверить версию на сервере. Если способ попроще? Или сойдёт?
Допустим мы обнаружили что надо перезагрузить страницу. Наивный window.reload может не сработать если в этот момент сервер лежит, например. Поэтому надо как-то убедиться, что сервер в порядке и возвращает ожидаемый результат. Ну это можно как-то попинговать какой-нибудь урл, или открывая websocket. Но даже если пинг прошел, во время reload тоже может что-нибудь упасть. Загрузка страницы может прерваться в произвольный момент и страница опять будет поломана.
Т.е. в идеале надо как-то вначале загрузить файлы (как минимум index.html и необходимые зависимости .js и .css. В принципе webpack позволяет все .js+.css в один bundle собрать. Т.е. нужно как минимум index.html+bundle.js как-то предварительно подргузить, проверить, что они загрузились целиком и без ошибок в кеш браузера, потом как-то объяснить браузеру, чтобы он отобразил страницу целиком из кеша атомарно.
Как правильно сделать надёжное обновление?
Интересуют современные браузеры, совместимость с IE5 не требуется.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Допустим мы обнаружили что надо перезагрузить страницу. Наивный window.reload может не сработать если в этот момент сервер лежит, например. Поэтому надо как-то убедиться, что сервер в порядке и возвращает ожидаемый результат. Ну это можно как-то попинговать какой-нибудь урл, или открывая websocket. Но даже если пинг прошел, во время reload тоже может что-нибудь упасть. Загрузка страницы может прерваться в произвольный момент и страница опять будет поломана.
Софт для космической атомной станции?
Тебе надо только index.html перезачитать, дальше браузер все вытащит по новым ссылкам (вебпак умеет давать новые имена для скриптов и статики). Вероятность, что при работающем сервер вдруг упадет загрузка очень мала. А если все же в каких-то редких случаях и упадет, то что? Пользователь увидит ошибку, сделает обновление страницы и все загрузится, хм?
bnk>·>Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу. bnk>Обычно делают простейший вариант — переименовывают все js и css файлы в новой версии. Большинство фреймворков делают это автоматически при сборке приложения (или "дедовский" вариант с добавлением суффикса версии к файлам). Браузер подгрузит такие изменения автоматически, после того как загрузит новый index.html bnk>То есть, тебе ничего не надо делать, все и так будет обновляться. Достаточно использовать любой фреймворк для сборки, типа webpack.
bnk>Не очень понял почему ты хочешь файлы с сервера загружать "вручную". Это как-то супер подозрительно
Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.
Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Я бы попробовал сделать AJAX-запрос /index.html и потом заменить тело страницы на полученные данные при успешной загрузке.
Чтобы обезопасить себя от недозагруженных скриптов, можно сделать так:
В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт. Ну и эту функцию reloadIndexHtml туда же. В общем 1-2 IP пакета и в браузере этот скрипт выполнится и пойдёт отсчёт. Дальше, если будут любые проблемы с загрузкой, через 10 секунд опять пойдёт попытка AJAX-ом загрузить и тд. Тут уже сам пиши, чтобы было надёжно отработаны ошибки, ретраи и тд. А так — в самом конце сделай аналог document.addEventListener("DOMContentLoaded", function() { clearTimeout(reloadIndexHtmlTimeout); }). Конкретно этот код, мне кажется, не сработает, то бишь он будет работать даже при загрузке JS с ошибками, поэтому надо погуглить, как определить тот факт, что JS не загрузился и тут прописать эти условия. Ну или в конце своего JS-файла просто поставляй флажок, если полностью прогрузится, то этот флажок проставится.
Здравствуйте, ·, Вы писали:
·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.
По идее, можно добавить в конце body небольшой JavaScript-код, который будет проверять по каким-то признакам, загрузился ли bundle.js, и при необходимости принудительно обновит страницу.
Здравствуйте, ·, Вы писали:
·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу. ·>Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.
Вроде как Service Workers для этого придуманы, но сам я с ними еще не работал. Насколько их можно применить для обновления Js-кода самого приложения —
Здравствуйте, L.K., Вы писали:
LK>·>Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу. LK>Ну тогда index.html должен загружаться один раз — и всё. LK>А обновления (html,css,js) должны загружаться аяксом (с проверкой контрольной суммы) и потом вставляться внутрь index.html.
Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...
Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу
Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?
·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...
Все таймеры перед обновлением, разумеется, останавливаются. Обработчики событий тоже останавливаются. HTML-объекты удаляются.
Остаётся только "изначальный"/"неизменный" скрипт, который умеет проверять наличие новой версии, закачивать её, проверять контрольную сумму и добавлять полученные скрипты на страницу.
Здравствуйте, vsb, Вы писали:
vsb>В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт.
Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, bnk, Вы писали:
bnk>·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода... bnk>Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу bnk>Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?
Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
bnk>>Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу bnk>>Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?
·>Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда.
Это что-то типа календаря?
Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте).
Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest
Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.
Здравствуйте, bnk, Вы писали:
bnk>·>Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда. bnk>Это что-то типа календаря?
Ну да, что-то вроде. Точнее типа summary health monitor, набор красных/зелёных лампочек, номера текущих версий, етс.
bnk>Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте). bnk>Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest bnk>Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.
Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
vsb>>В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт. ·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?
Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
Здравствуйте, ·, Вы писали:
bnk>>Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте). bnk>>Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest bnk>>Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.
·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.
Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку.
Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем?
Здравствуйте, vsb, Вы писали:
vsb>·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала? vsb>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
Не очень понял. Ну допустим мы успешно вытянули аяксом обновлённый index.html. Что дальше?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, bnk, Вы писали:
bnk>·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна. bnk>Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку. bnk>Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем?
Не очень понял которое обновление ты тут имеешь в виду. Обновляется версия приложения на веб-сервере. Открытая у пользователя страница это должна обнаружить (у меня это сделано через websocket через который так же поступают отображаемые данные). Как только это обнаружится, страница должна автоматически обновиться тоже. Но сделать это атомарно — либо сидеть на текущей версии пытаясь обновиться и ловя всевозможные ошибки, либо загрузить и успешно запустить новую версию, а не упасть по пути с каким-нибудь DNS error.
Т.е. никакого взаимодействия с пользователем не нужно и не должно быть.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Здравствуйте, bnk, Вы писали:
bnk>>·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна. bnk>>Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку. bnk>>Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем? ·>Не очень понял которое обновление ты тут имеешь в виду. Обновляется версия приложения на веб-сервере. Открытая у пользователя страница это должна обнаружить (у меня это сделано через websocket через который так же поступают отображаемые данные). Как только это обнаружится, страница должна автоматически обновиться тоже. Но сделать это атомарно — либо сидеть на текущей версии пытаясь обновиться и ловя всевозможные ошибки, либо загрузить и успешно запустить новую версию, а не упасть по пути с каким-нибудь DNS error. ·>Т.е. никакого взаимодействия с пользователем не нужно и не должно быть.
Понятно. Может тогда проще такое не средствами браузера сделать, а через (внешний) скрипт например?
Типа если это все равно устройство, там же может есть сервисы, поставить cron job, или что там есть. Пусть скачает папку, да запустит из нее новую версию если все ОК.
Все равно такое думается лучше перезапускать, мало ли зависнет.
Здравствуйте, vsb, Вы писали:
vsb>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
Что значит перезагрузить страницу аяксом? Ты документ/текст предлагаешь подменить? (Ну т.е. e.innerHTML = newContent?
Здравствуйте, ·, Вы писали:
vsb>>·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала? vsb>>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5). ·>Не очень понял. Ну допустим мы успешно вытянули аяксом обновлённый index.html. Что дальше?
Заменяешь всю страницу новым текстом. Что-то вроде document.open(); document.write(newHtml); document.close();
Старые таймеры будут тикать, да, могут быть непредвиденные спецэффекты. Хотя, думаю, в целом вероятность таковых невелика. Если это важно, можно переопределить setTimeout/setInterval и вести учёт всех таймеров, чтобы отменить их перед заменой документа.
Здравствуйте, Mystic Artifact, Вы писали:
vsb>>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
MA> Что значит перезагрузить страницу аяксом? Ты документ/текст предлагаешь подменить? (Ну т.е. e.innerHTML = newContent?
Ну это делается не через innerHTML, но концептуально да.
Здравствуйте, ·, Вы писали:
·>Как правильно сделать надёжное обновление?
у нас сделано так — в каждом аякс запросе, вызванных активностями юзеров, в хидере приходит версия системы.
Если запомненная на клиент-сайде версия системы перестала совпадать с полученной от сервера — значит надо обновлять страницу.
юзеру выдается диалог — версия системы изменилась, необходимо обновить страницу. и на ок делается reload.
недоступность сервера в этот момент — нестрашно. нажмут лишний раз f5. вероятность именно такого расклада мала, в реальности проблем нет.
ps. увидел что тебе нужно чтоб не было взаимодействия с юзером если даже недоступность сервера случится в момент reload, тогда вариант как у нас — не подойдет конечно.
точно это нужно? нажать f5 несложно, и юзеры обычно уже знают как в браузере выглядит проблема с недоступностью инета/сервера..
Здравствуйте, Mystic Artifact, Вы писали:
vsb>>Ну это делается не через innerHTML, но концептуально да. MA> Дак я и спрашиваю через что конкретно предлагается.6
Насколько я помню, через document.open/write/close. тут
Вооот. Но это важные детали. Перезаписывание документа не приводит к сбросу/инициализации глобального состояния / контекста JS, что в общем случае может иметь негативные последствия.
Как альтернативная идея — можно грузить контент в iframe, нормальным образом, и делать его видимым, когда будет установлен факт, что все загрузилось.
PS: Ну да, типа таймеров. Вижу ты в курсе, хорошо.
Здравствуйте, Mystic Artifact, Вы писали:
MA> Как альтернативная идея — можно грузить контент в iframe, нормальным образом, и делать его видимым, когда будет установлен факт, что все загрузилось.
Может быть фреймы и лучше, я просто плохо представляю, какие там ограничения. Если получится реализовать требуемый функционал, с отловом ошибок и тд, то да, я бы тоже за фреймы был.
Здравствуйте, Reset, Вы писали:
R> // Тут слушаем веб сокет, переоткрываем его при отключении, читаем команду на перезагрузку рабочей страницы и, возможно, на перезагрузку себя
Задача надёжной перезагрузки страницы превратилась в задачу надёжной перезагрузки страницы-сторожа... Но так и не решена.
Здравствуйте, bnk, Вы писали:
bnk> Понятно. Может тогда проще такое не средствами браузера сделать, а через (внешний) скрипт например? bnk> Типа если это все равно устройство, там же может есть сервисы, поставить cron job, или что там есть. Пусть скачает папку, да запустит из нее новую версию если все ОК. bnk> Все равно такое думается лучше перезапускать, мало ли зависнет.
В таком случае проще просто desktop-приложение написать. А хотелось бы чтобы эту же страницу могли и юзеры открывать у себя в окошке и им не требовалось какие-то доп-манипуляции делать.
Здравствуйте, vsb, Вы писали:
vsb> Заменяешь всю страницу новым текстом. Что-то вроде document.open(); document.write(newHtml); document.close();
Это надо убедиться ещё, что сама страница не содержит ссылок на .js, .css, картинки, которые тоже могут обломаться при загрузке.
vsb> Старые таймеры будут тикать, да, могут быть непредвиденные спецэффекты. Хотя, думаю, в целом вероятность таковых невелика. Если это важно, можно переопределить setTimeout/setInterval и вести учёт всех таймеров, чтобы отменить их перед заменой документа.
Я использую webpack и npm-либы всякие, хз что и как они делают, какие глобальные переменные используют и где что может утекать через глобальные переменные...
В общем да, в целом понятно, что с чистым web-приложением нормального решения нет. Буду копать service workers...
Здравствуйте, ·, Вы писали:
·>Как правильно сделать надёжное обновление?
Зачем? Судя по описанию, единственный кейс — люди подходят к монитору без клавы/мышки посмотреть?
Т.е. видимо там происходит какое-то движение на экране. 100% гарантии нет, но если запилить скрипт с вебсокетом, которые сам переподключается в случае ошибки,
то инфу за которой ходят юзеры можно присылать с сервера чуть ли не картинкой по тому же сокету.
А вообще, конечно все очень странно.
Упрощай, не позволяй просочиться сложности в задачу.