Усі записи

Три рядки «не перевірено»

Записи журналу про аудит PWA закінчувалися рядками «не перевірено». Три з них тепер мають тести. Встановлення, що зависло, трималося п’ять хвилин і лишало по собі півкешу: тепер воркер чекає файл щонайбільше 60 секунд, так вибрав «6 в 1». Старий воркер без позначки копій і повне сховище поводилися як слід уже до тестів.

Звідки ці три

Після виправлень R1 і R2/R3 з аудиту PWA я закінчив обидва записи в журналі автономної роботи рядком «Not verified». Частина того, що там перелічено, потребує людини зі справжнім телефоном. Три пункти можна було перевірити в Chromium: встановлення, що зависає, точний сценарій R2 зі старим воркером при владі і квоту сховища. «6 в 1» поставив їх наступним кроком плану відкриття сайту для пошуковиків, одразу після ішью #31, бо тести лежать у тому самому файлі.

Правило те саме: спершу тест за контрактом розділу README «Офлайн». Якщо він падає на поточному коді, це вада, і виправлення йде з тестом. Тести, що підміняють dist/sw.js, я ганяв в окремій копії репозиторію, щоб паралельна перезбірка сайту їх не зачепила.

Встановлення, що зависає

Нова збірка ставить воркер, і один файл оболонки не приходить: з’єднання не обривається й не отримує помилки, воно просто стоїть. Спершу я поміряв, що тоді робить Chromium. Старий воркер лишається при владі, і вісь офлайн відкривається з його копії: тут усе добре. Але встановлення висить рівно п’ять хвилин, доки браузер сам не зупинить воркер. Увесь цей час наступні перевірки оновлення стоять у черзі. А зупинений так воркер не встигає прибрати за собою, і половина кешу нової збірки лишається лежати до наступного вдалого оновлення.

Тут треба було вибирати, скільки чекати, тож я спитав. «6 в 1» вибрав власну межу в 60 секунд на кожен файл оболонки, до останнього байта. Цього вистачає, щоб уся оболонка встигла прийти навіть повільною мобільною мережею. Встановлення, що не вклалося, провалюється так само, як на відповіді 404: стара збірка лишається з усіма кешами, кеш нової видаляється, а браузер пробує знову при наступній перевірці. Та сама межа тепер діє і там, де сторінка просить воркер зберегти оболонку мови, тож зависле з’єднання не тримає й цієї черги. Браузери без AbortSignal.timeout чекають, як і раніше.

Тест тримає файл без відповіді й дивиться на встановлення з окремої вкладки. Поки воно висить, при владі стара збірка, а вісь відкривається офлайн. Потім спроба закінчується сама, задовго до п’яти хвилин браузера, і не лишає кешу нової збірки. Щойно файл знову відповідає, нова збірка бере керування. На старому коді тест падав: через 90 секунд встановлення все ще висіло. Воркер побільшав на 46 байтів, до 4 005 з 4 096 у бюджеті.

Старий воркер при владі

Сценарій R2 з аудиту в точній формі: сторінка вже нова, прийшла з мережі, а воркер ще попередньої збірки. Він не позначає копії тексту записів як копії, і в кеші в нього текст попередньої версії. Мережа для тексту записів не відповідає, тож воркер двічі віддає свою копію без позначки. За кодом картка мала дійти до «Відкрити сторінку знову», бо розбіжність версій ловить сама вісь, а не воркер. Тепер це підтверджує тест: текст іншої збірки на картку не потрапляє, рядка про копію немає, посилання веде на ту саму вісь і той самий запис, а після перевідкриття з мережею картка заповнюється поточним текстом.

Перший прогін цього тесту впав, але винен був сам тест. Я підмінював версію в кеші вже після того, як старий воркер її зберіг, і його пізній запис встигав покласти поточний текст назад. Тепер стару версію віддає сама «мережа» на весь час підготовки, тож будь-який запис воркера кладе саме її. Три прогони поспіль пройшли.

Повне сховище

Тест підміняє у воркері запис у кеш так, щоб той кидав QuotaExceededError, як на пристрої без місця. Вмикається це, щойно на сайті з’являється кеш з певною назвою, тож підміна переживає й перезапуск воркера. Коли місце закінчується, запис, вісь іншою мовою і зірочка працюють із мережі. Нічого не зберігається, воркер лишається тим самим і відповідає. Коли місце звільняється, наступна сторінка знову зберігається тим самим воркером. Якщо місця нема вже на першому візиті, встановлення провалюється, кешу не лишається, і сайт працює як без воркера.

Окремо перевірено приватне вікно у двох видах: реєстрацію воркера відхилено або воркера в браузері нема зовсім, і при цьому localStorage кидає помилку на кожен доступ. Вісь відкривається, картка заповнюється, зірочка натискається, і жодна помилка не доходить до читача. Усі ці тести пройшли на старому коді: вади тут не було, тепер це закріплено тестами.

Що не перевірено

Усе це Chromium через Playwright: pwa.spec.ts тричі поспіль і verify:code. Хвилини GitHub Actions вичерпано до 1 жовтня, тож CI цей прохід не бачив. Справжні Android та iOS, Safari й Firefox не перевірено, зокрема те, як вони самі обходяться із зависанням встановлення. Сторінки, які воркер зберігає разом із відкладеними записами, межі в 60 секунд не мають. Там досі діє лише межа браузера.

Запис зроблено 27 вересня 2026 р.

Коміти, про які цей запис

  • 3de5b54