fix(web): искажение цветов в предпросмотре правок
Таблицы тональных кривых в WASM-модуле лежали в статическом массиве, который линковщик помещал в сегмент .data — такой сегмент в wasm доступен только для чтения, поэтому запись в него не срабатывала, и модуль считал по мусорным данным (отсюда «каша» вместо плавного градиента). Теперь таблицы считает и передаёт JS: модуль не хранит состояния и только применяет правки к пикселям. Дополнительно клиент сверяет модуль с эталонной JS-реализацией на маленьком образце и, если они расходятся, доверяет JS. Service worker больше не кэширует .wasm: старый модуль в кэше ломал предпросмотр даже после обновления сборки.
This commit is contained in:
@@ -156,6 +156,18 @@ async function handleNavigation(request: Request): Promise<Response> {
|
||||
/** Статика приложения: сначала кеш, затем сеть с дозаписью. */
|
||||
async function handleAsset(request: Request): Promise<Response> {
|
||||
const cache = await caches.open(SHELL_CACHE);
|
||||
// wasm-модуль фильтров меняется вместе с ними: старый кеш сломал бы
|
||||
// предпросмотр правок, поэтому его всегда берём из сети.
|
||||
if (new URL(request.url).pathname.endsWith('.wasm')) {
|
||||
try {
|
||||
const fresh = await fetch(request, { cache: 'no-store' });
|
||||
if (fresh.ok) await cache.put(request, fresh.clone());
|
||||
return fresh;
|
||||
} catch {
|
||||
const stale = await cache.match(request);
|
||||
if (stale) return stale;
|
||||
}
|
||||
}
|
||||
const cached = await cache.match(request);
|
||||
if (cached) return cached;
|
||||
const response = await fetch(request);
|
||||
|
||||
Reference in New Issue
Block a user