written on Sunday, June 1, 2014
Я тут роблю цікаву штуку, яка працює з національною криптографією. Гост-шифр, гостова геш-функція, еліптичні криві, от це все.
Спочатку проект задумувався як інтеграційний — взяти готові рішення, зібрати докупи, приробити трохи інтерфейсного коду і вийде круто. В результаті з готового я взяв тільки бібліотеку великих чисел і блочний шифр з хешем, які написані на C. Схеми ASN.1 об'єктів, бібліотеку для роботи з еліптичними кривими на полі Галуа і протокол Діффі-Геллмана довелося робити самому. Інтерфейс звісно теж довелося, а робити інтерфейси я не люблю.
Основна трудність — це звісно не dhSinglePass-cofactorDH-gost34311kdf-scheme, на який є спека і юніттести на сайті державної служби спецзв'язку, а те, що все робиться на лошадо-рептилоїдному броузерному жаваскрипті.
Моя основна проблема з жаваскриптом завжди була в тому, що мені незрозуміло, як його розпилювати на модулі. Всі ці фокуси з автоматичним приведенням хуйні до рядка і тим, що undefined більше чи менше якогось числа мене особливо не парять при наявності юніттестів і лінтера.
Модульність в жаваскрипті традиційно робилася або ніяк, або через жопу з асинхронними колбеками. Як працює r.js і всі ці динамічні лоадери я не міг розібратися рівно стільки разів, скільки намагався.

Мені хотілося отримати дуже просту штуку — розкласти код по різних файлах і явно імпортити символи з одного в інший, після чого набирати рівно одну команду, яка буде це все збирати в самодостатній скрипт, який можна повісити в єдиний тег "script src" в хедері сторінки.
Окремий бонус — це встановлення готових пакетів стандартною командою і подальше звернення до них зі свого коду таким же чином.
В результаті я отримав рівно те, що хотів. Код розпилюється на модулі, на початку кожного файла висить список імпортів через нодовський require(), після чого вся ця солянка пакується в самодостатній файл консольною тулзою browserify, прописаною в мейкфайлі. Що подвійно прекрасно — в кожному файлі присутній явний список експортованих змінних, тобто все на виду.
Окремі куски коду при цьому виносяться у власні репозитарії і ставляться через npm так само, як і стандартні бібліотеки на кшталт cookies-js.
Все працює настільки круто, що таким способом пакується навіть сішний код, трансльований через emscripten, хоча для цього потрібно дописувати один рядок через --post-js і відключати парсинг файлу в браузерифі через --noparse.
Подивитися можна на живому коді dstukeys і його залежностях — jkurwa та em-gost. Встановлюється і пакується все одним мейкфайлом в репозі dstukeys.