Еднофайлово, вграждаемо (embeddable) уеб чат приложение с незабавни съобщения и опционално криптиране от край до край (E2EE). Не изисква собствен бекенд сървър – използва изцяло клиентска архитектура, подпомогната от Supabase.
✨ Основни функционалности
- Реално време (Realtime): Мигновено изпращане и получаване на съобщения чрез WebSockets.
- Пулинг (Fallback): Автоматично превключване към polling (на всеки 3 сек.) ако WebSocket връзката прекъсне (често при мобилни устройства).
- Криптиране (E2EE): Опционално криптиране на стаи с парола. Използва AES-GCM-256 и PBKDF2. Сървърът (Supabase) няма достъп до чистия текст или файлове при криптирани стаи.
- Споделяне на файлове: Качване на изображения и документи (до 15MB) с поддръжка на криптиране.
- Telegram Интеграция: Възможност потребителите да получават известия за непрочетени съобщения директно в Telegram бот.
- Вграждане (iFrame): Генериране на готов iframe код за вграждане на чата във всеки външен сайт.
- Интеракции: Отговори (Replies) на конкретни съобщения и изтриване на собствени съобщения.
- Присъствие: Индикатори "пише..." и брой потребители на линия в дадена стая.
- Изчистен UI и Отзивчив дизайн: Mobile-first дизайн с безопасни зони (safe-area-insets) за съвременни смартфони. Хедърът е минималистичен, а в долния футер се визуализира текущия файл и дискретни бутони за споделяне.
🏗️ Как работи (Архитектура)
Приложението е изградено изцяло на клиентската страна (Single-Page Application в един index.html файл). То комуникира директно със Supabase (PostgreSQL база данни, Storage и Realtime).
Създаване и присъединяване към стаи
Чат стаите са ефимерни (не изискват регистрация). Генерира се случаен Room ID, който се добавя към URL параметъра (?room=abc123). Връзката може да бъде споделена. Ако създателят на стаята е задал парола (ключ), системата превключва в режим E2EE и изисква ключа при влизане.
Криптография (E2EE Flow)
Когато стаята е криптирана, се използва вградения Web Crypto API на браузъра. Паролата се обработва чрез алгоритъм PBKDF2 заедно със сол (Salt), базирана на ID-то на стаята, за да се генерира 256-битов AES ключ. Текстовете се криптират с AES-GCM, като за всяко съобщение се генерира случаен вектор (IV). Файловете се криптират по същия начин преди качване в Storage. При получаване, клиентът дешифрира данните локално.
Realtime и Синхронизация
Приложението отваря Supabase Realtime канал за конкретната стая:
- INSERT: Слуша за нови съобщения. Използва локален кеш (Set), за да предотврати дублиране на съобщенията, които изпращачът вижда веднага на екрана си.
- DELETE: Слуша за изтрити редове и премахва съответния балон с анимация от екрана на останалите потребители.
- Broadcast: Използва се за индикатора "пише..." (ограничен на 2 секунди, за да не натоварва сървъра).
- Presence: Следи кои потребители имат отворен таба, за да показва брояча "на линия".
Telegram Известия
Потребителят натиска бутон за свързване с Telegram. Приложението генерира Base64 payload (RoomID:Nickname) и отваря бота със /start параметър. Supabase Edge Function (telegram-webhook) приема командата, записва Chat ID-то на потребителя в таблицата telegram_subs и управлява статусите (/stop, /status). Когато пристигне ново съобщение, друга Edge Function (check-notifications), въртяща се по график (Cron), проверява дали потребителят е офлайн и му изпраща известие през Telegram API.
🛠️ Технологии
Структура на данните: Всяко съобщение съдържа id, room_id, username, content (текст или метаданни за файл), iv, file_url, reply_to, created_at. При криптирани стаи, content и file_url са криптирани низове.
Сигурност: Ключът се генерира на базата на парола + сол (room ID), което гарантира уникалност за всяка стая. Използва се 256-битов AES-GCM с произволен IV за всяко съобщение – устойчивост срещу атаки с избран шифротекст.
— край на документацията —