Как всегда бывает, путей решения проблемы существовало несколько.
Первый. Собственноручная реализация MTProto на JavaScript с нуля — самый сложный и рискованный путь. Несмотря на это, его выбрали команды, которые заняли призовые места (Hip Hyena, Giant Parrot и Posh Ram). Giant Parrot даже впоследствии
выпустил свою реализацию.
Второй. Попытка «ответвиться» от оригинального веб-клиента
Webogram. В нём была собственная реализация MTProto, однако, к тому моменту она не обновлялась уже несколько лет, сильно зависела от устаревшего AngularJS и не поддерживала веб-сокеты (вместо них — long polling). Тем не менее, по этому пути пошли сильные участники Merry Ant и Ace Monkey.
Третий. Библиотека TDLib, которая используется в нативных клиентах — написана на C++, в браузере запускается через WebAssembly и весит 9 МБ, что делает её недоступной в условиях медленного интернета. Кроме того, Safari каждый раз компилирует Wasm
заново, из-за чего запуск приложения занимает до 10 секунд.
Более того, в описании конкурса было явно указано, что работы, использующие TDLib, будут оценены ниже работ с JS-реализацией. Тем не менее, я решил пойти именно по этому пути, чтобы поскорее начать разработку интерфейса и параллельно искать альтернативные решения.
Четвёрый. Поиск open-source реализаций. Как оказалось, их существовало очень мало, и все они не работали. Некоторые поддерживали только Node.js, другие были заброшены, третьи просто не запускались. Довольно много времени ушло на безрезультатные попытки их реанимировать.
В итоге мне повезло. Я тогда каждый день заставлял себя читать группу
@contests, где общались участники и зрители. Среди тысяч сообщений флуда там иногда проскакивала полезная информация, и однажды за пару дней до дедлайна кто-то выложил туда ссылку на
GramJS — довольно свежую open-source реализацию, которая до этого совершенно никому не попадалась. Как и все остальные, она была абсолютно сырой и недокументированной, но буквально за несколько часов до окончания конкурса её всё-таки удалось запустить.
На первый этап я смог отправить сразу два варианта — и на TDLib, и на GramJS. Первый тогда попал в призы, а второй оказался настолько сырым, что даже не был принят судьями. Надежда на победу в первом этапе не оправдалась, однако призовое место обеспечивало проход во второй этап и давало возможность провести работу над ошибками.
Продолжение следует.