Жаваскрипт

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