На этой неделе я работал над следующим
- Анализ манифеста и белого списка с хэшами, отличными от SHA1
Ранее я написал логику синтаксического анализа манифеста/белого списка, предполагая, что все хэш-строки имеют длину 40 символов, и, следовательно, теперь мне пришлось внести некоторые нетривиальные изменения в код для учета хэшей разного размера.
Для вычисления хешей SHAKE-128 (которых не было в jsrsasign) я использовал файл sha3.js из библиотеки jsSHA. Этот файл представляет собой версию библиотеки, оптимизированную для компилятора Google Closure, в которой удалены функции, отличные от SHA-3.
Чтобы абстрагировать API-интерфейсы хеширования между jsSHA и jsrsasign, я написал функции digestString
и digestHash
, которые вызывают соответствующую библиотеку. Я также написал объект cvmfs.util.hash
, который абстрагирует обработку парсинга хеш-строк метаданных в манифесте и белом списке.
- Чтение данных из таблиц статистики и свойств каталога
Каталог представляет собой файл базы данных SQLite3. Чтобы прочитать его в JavaScript *синхронно*, я использовал sql.js, который представляет собой asm.js-версию исходного кода SQLite3, также скомпилированную с помощью Emscripten, в виде одного большого файла JavaScript. Он также содержит удобные оболочки для C-подобного JavaScript SQLite3 API, созданного Emscripten.
Затем я написал getCatalogStats
, который возвращает пары ключ-значение каждой строки таблицы statistics в виде объекта JavaScript, и getCatalogProperties
, который возвращает пары ключ-значение каждой строки таблицы value
в последней таблице является строкой, и некоторые из этих строковых значений были целыми числами или числами с плавающей запятой, поэтому, чтобы сделать API более удобным, последняя функция преобразует строковое значение в число JavaScript, если это возможно, прежде чем возвращать его. .
- Включение оптимизации JavaScript в Emscripten
Emscripten выполняет множество оптимизаций JavaScript (начиная с -O2
) для окружающего JavaScript (а не для фактического asm.js/WASM). Этот окружающий JS — это место, где живет вся наша основная клиентская логика CVMFS и сторонние библиотеки. Однако оптимизатор Emscripten не распознает синтаксис ES2015 и просто падает при его обнаружении. К счастью, существует транспилятор командной строки JavaScript, известный как Babel, который преобразует практически любой современный код JS в очень старый, совместимый с браузером синтаксис. Этого было достаточно, чтобы порадовать оптимизатора Emscripten.
Итак, теперь, перед компиляцией любой программы на C/C++, код для клиента cvmfs и сторонней библиотеки со всем их причудливым синтаксисом объединяется в один файл pre.js
, конвертируется в старый синтаксис JavaScript с помощью babel и передается в Emscripten. Кроме того, поскольку эта транспиляция каждый раз занимает около 3–4 секунд, pre.js
генерируется только тогда, когда наш скрипт компилятора обнаруживает, что какой-либо из зависимых файлов был изменен. Для этого не использовался какой-либо причудливый наблюдатель за файлами, а использовался только метод, который по существу использует make
: если время модификации целевого файла меньше, чем время любой из его зависимостей, повторно сгенерировать целевой файл.