Здравствуйте, 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, но концептуально да.
Открываешь страницу-сторожа в том же домене, что и нужная тебе страница. В ней делаешь скрипт, который открывает новую страницу с нужной информацией (твоим мониторингом). Когда мониторинг нужно обновить, делаешь 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>
Здравствуйте, ·, Вы писали:
·>Как правильно сделать надёжное обновление?
у нас сделано так — в каждом аякс запросе, вызванных активностями юзеров, в хидере приходит версия системы.
Если запомненная на клиент-сайде версия системы перестала совпадать с полученной от сервера — значит надо обновлять страницу.
юзеру выдается диалог — версия системы изменилась, необходимо обновить страницу. и на ок делается 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% гарантии нет, но если запилить скрипт с вебсокетом, которые сам переподключается в случае ошибки,
то инфу за которой ходят юзеры можно присылать с сервера чуть ли не картинкой по тому же сокету.
А вообще, конечно все очень странно.
Упрощай, не позволяй просочиться сложности в задачу.