На этой неделе я работал над следующим

  • Анализ манифеста и белого списка с хэшами, отличными от 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, который возвращает пары ключ-значение каждой строки таблицы properties также как объект JavaScript. Тип столбца 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: если время модификации целевого файла меньше, чем время любой из его зависимостей, повторно сгенерировать целевой файл.