Техническая суть: изоляция и производительность
Telegram открыл код фреймворка widget-sandbox (тег v0.1.1), который позволяет клиентам Telegram запускать мини-HTML-виджеты прямо в сообщениях. Ключевая особенность — полная изоляция: JavaScript выполняется в движке QuickJS на отдельном потоке без доступа к сети. Все сетевые вызовы (fetch, XHR, WebSocket) заглушены. Виджет видит не полноценный браузер, а специализированный DOM-шейм.
Разработчики установили строгие лимиты для предотвращения зависаний интерфейса:
- Память: до 64 МБ на виджет.
- Процессор: квота CPU в секунду.
- Таймеры: максимум 256 активных таймеров.
- Размер: до 4 КБ сжатого или 32 КБ несжатого HTML-документа.
Безопасность: валидация и санитайзинг
Архитектура построена на принципе «доверенного хоста». Код виджета генерирует набор операций (ops), которые проходят строгую валидацию перед рендерингом. Валидатор проверяет:
- Список разрешенных HTML-элементов и атрибутов.
- Санитайзинг CSS (запрет опасных стилей).
- Политику URL (разрешены только
data:изображения и#fragment). - Соответствие Widget Profile 1 (единый набор функций для всех клиентов).
В ходе тестирования безопасности (suite test:attacks) 99 файлов с атаками не дали ни одного ложного срабатывания (canary hits) и не совершили внешних запросов, что подтверждает эффективность изоляции.
Кроссплатформенность и SDK
Один и тот же набор бандлов (shim, validator, renderer) работает на всех платформах. Веб-клиенты используют Shadow DOM, нативные клиенты — WKWebView, Android WebView или собственные движки, но получают одинаковый набор валидированных операций. Представлен SDK v1 с API TelegramWidget, поддерживающим:
- Тему оформления и определение профиля.
- Открытие ссылок (
openLink,openTelegramLink) только по реальному нажатию с тактильным откликом. - Локальное хранилище (
Web Storage), привязанное к сообщению.
Интеграция для разработчиков
Для внедрения фреймворка клиентам доступны пакеты для Swift (iOS/macOS), Gradle (Android), npm и C++. Документация включает чек-лист интеграции, спецификацию формата payload (messageMediaWidget, layer 233) и набор конформности (conformance tests). Репозиторий требует Node ≥ 22, pnpm и специфичные зависимости для каждой платформы (Xcode 26, JDK 21, C++20).
| Компонент | Реализация / Ограничения |
|---|---|
| JS Runtime | QuickJS (fork TelegramMessenger/quickjs), отдельный поток |
| Сетевой доступ | Отсутствует (fetch, XHR, WebSocket заглушены) |
| Лимит памяти | 64 MB |
| Лимит таймеров | 256 |
| Рендеринг (Web) | Shadow DOM |
| Рендеринг (Native) | WKWebView, Android WebView, кастомные движки |
| Макс. размер | 4 KB (gzip) / 32 KB (raw) |
Источник: Github ↗
