Жаваскрипт

written on Sunday, June 1, 2014

Я тут делаю интересную штуку, работающую с национальной криптографией. Гост-шифр, гостовая геш-функція, эллиптические кривые, вот это вот все.

Изначально проект задумывался, как интеграционный - взять готовые решения, собрать воедино, приделать немного интерфейсного кода и получится круто. В итоге из готового я взял только библиотеку больших чисел и блочный шифр с хешем, которые написаны на C. Схемы ASN.1 объектов, библиотеку для работы с эллиптическими кривыми на поле Галуа и протокол Діффі-Геллмана пришлить делать самому. Интерфейс конечно тоже пришлось, а делать интерфейсы я не люблю.

Основная трудность - это конечно не dhSinglePass-cofactorDH-gost34311kdf-scheme, на который есть спека и юниттесты на сайте державной службы спецсвязи, а то, что все делается на лошадо-рептилоидном броузерном жаваскрипте;

В чем вообще проблема?

Моя основная проблема с жаваскриптом всегда была в том, что мне непонятно, как его распиливать на модули. Все эти фокусы с автоматическим приведением херни к строке и тем, что undefined больше или меньше какого-то числа меня особо не парят при наличии юнитестов и линтера.

Модульность в жаваскрипте традиционно делалась или никак или через жопу с асинхронными коллбеками. Как работает r.js и вот эти все динамические лоадеры я не мог разобраться ровно столько раз, сколько пытался.

imports.png

Мне хотелось получить очень простую штуку - разложить код по разным файлам и явно импортить символы из одного в другой, после чего набирать ровно одну команду, которая будет это все собирать в самодостаточный скрипт, который можно повесить в единственный тег "script src" в хедере страницы.

Отдельный бонус - это установка готовых пакетов стандартной командой и последуюющее обращение к ним из своего кода таким же образом.

К чему я пришел

В итоге я получил ровно то, что хотел. Код распиливается на модули, в начале каждого файла висит список импортов через нодовский require(), после чего вся эта солянка пакуется в самодостаточный файл консольной тулзой browserify, прописанной в мейкфайле. Что вдвойне прекрасно - в каждом файле присутствует явный список экспортируемых переменных, то есть все на виду.

Отдельные куски кода при этом выносятся в собственые репозитарии и ставятся через npm так же, как и стандартные библиотеки, вроде cookies-js.

Emscripten

Все работает настолько круто, что таким способом пакуется даже сишный код, странслированный через emscripten, хотя для этого нужно дописываеть одну строчку через --post--js и отключать парсинг файла в браузерифи через --noparse.

Где на это посмотреть

Посмотреть можно на живом коде dstukeys и его зависимостях - jkurwa и em-gost. Устанавливается и пакуется все одним мейкфайлом в репозе dstukeys.

This entry was tagged code and js