Новый алгоритм редактирования: обработка идёт только на клиенте. - Фильтры «Свет» считает WASM-модуль на Rust (frontend/wasm/light, 1.5 КБ): он строит тональные кривые и обрабатывает пиксели. При недоступности модуля используется JS-реализация с тем же результатом — расхождение проверяется тестом. - Просмотр рисует видимую область фото с правками на canvas поверх исходной версии, поэтому изменения видны сразу, без ожидания рендера. - Правки уходят на сервер не сразу: через десять секунд без изменений или при переключении фото. Сервер сохраняет параметры и готовит варианты сетки и полноразмерную версию в фоне, о готовности сообщает через SSE — клиент подтягивает готовую версию.
30 lines
1.3 KiB
JavaScript
30 lines
1.3 KiB
JavaScript
// Сборка WASM-модуля фильтров «Свет».
|
|
//
|
|
// Модуль лежит в wasm/light (Rust, no_std) и копируется в static/light.wasm,
|
|
// откуда его забирает браузер. Если cargo недоступен, используется уже
|
|
// собранный модуль из репозитория.
|
|
import { execFileSync } from 'node:child_process';
|
|
import { copyFileSync, existsSync } from 'node:fs';
|
|
import { dirname, resolve } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
const wasmDir = resolve(root, 'wasm/light');
|
|
const target = resolve(wasmDir, 'target/wasm32-unknown-unknown/release/light.wasm');
|
|
const out = resolve(root, 'static/light.wasm');
|
|
|
|
try {
|
|
execFileSync('cargo', ['build', '--release', '--target', 'wasm32-unknown-unknown'], {
|
|
cwd: wasmDir,
|
|
stdio: 'inherit'
|
|
});
|
|
copyFileSync(target, out);
|
|
console.log('wasm: static/light.wasm собран');
|
|
} catch (err) {
|
|
if (!existsSync(out)) {
|
|
console.error('wasm: не удалось собрать модуль и нет готового static/light.wasm');
|
|
process.exit(1);
|
|
}
|
|
console.warn('wasm: cargo недоступен, используется готовый static/light.wasm');
|
|
}
|