Привет, Хабр!Самая распространённая ошибка в тестировании асинхронного кода — уверенность, что зелёный тест означает «проверка внутри отработала и прошла». Вы написали test(...), внутри есть expect, прогон зелёный — значит, код проверен. Кажется очевидным.А потом выясняется, что тест с заведомо неверным expect всё равно остаётся зелёным, что проверка на выброшенную ошибку проходит и тогда, когда код перестал эту ошибку выбрасывать, а функция, давно сломанная, годами имеет при себе зелёный тест.…
ВступлениеМеня зовут Некипелов Иван, я технический руководитель команды фронтенд инфраструктуры в Wildberries & Russ. Последнии несколько лет мы с командой развиваем архитектуру и инфраструктуру большого frontend-продукта.В этой статье разберу наш путь от монолита к микрофронтендам: расскажу как решали ключевые проблемы и с какими сложностями столкнулись во время миграции.КонтекстПрежде чем рассказать про нашу имплементацию микрофронтенд-архитектуры, стоит немного погрузиться в контекст ра…
Начинаете писать E2E-тесты? Думаете, нужно просто открыть страницу, нажать кнопку и написать expect?Разберем на примере Playwright, почему отчёт может быть зелёным, но бесполезным!Сразу к делу! Ошибка 1. Проверка интерфейса без проверки взаимодействияОшибка распространенная, но не примитивная. Вот вам вредный совет, как проверить, что после нажатия на кнопку все сохраняется:await page.getByRole('button', { name: 'Сохранить' }).click(); await expect(page.getByText('Сохранено&…
Каждый, кто пишет Telegram-ботов на Node.js / TypeScript, знает про библиотеку Telegraf.js. Это был стандарт индустрии. Ключевое слово — «был». Оригинальный репозиторий фактически заброшен майнтейнерами, пулл-реквесты годами висят без ответа, а сам фреймворк застрял в прошлом.Пока Telegram один за другим выкатывает масштабные апдейты (Звёзды, Подарки, Бизнес-аккаунты, Улучшенные медиа), официальный Telegraf не поддерживает ничего из этого.Мне надоело смотреть на падающие в продакшене боты и гор…
Real-time в Laravel-проекте не должен начинаться с прямого HTTP-запроса к Centrifugo из контроллера. Это быстрый путь к связанному коду, нестабильной архитектуре и ошибкам синхронизации между frontend и backend. Правильная публикация событий из Laravel в Centrifugo строится иначе: Laravel меняет состояние системы, создаёт событие приложения, listener передаёт задачу в queue job, а job уже публикует минимальный payload в Centrifugo.Такой подход особенно важен для проектов, где real-time обновлен…
Real-time система не заканчивается на том, что backend опубликовал событие в Centrifugo. Это только половина работы. Вторая половина начинается на фронтенде и в эксплуатации: подключение клиента, обработка входящих сообщений, переподключение, истечение токенов, потеря сети, восстановление состояния, Nginx, секреты, логи и мониторинг.На локальной машине всё работает красиво: событие отправилось, WebSocket получил payload, интерфейс обновился. Потом проект попадает в production, пользователь откр…
Уровень: middle/senior мобильная разработка Стек: React Native, Expo SDK 54, expo-notifications, react-native-callkeep, react-native-voip-push-notification, expo-task-manager, FCM, APNs, PushKit Что внутри: deep linking из killed state, suppression активного чата, двойной "назад" после открытия из пуша, VoIP push + CallKit на iOS, Android channels с разной важностью, cold start navigation timingПреамбулаЭто десятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но…
Всем привет! Хочу поделиться, возможно, не новым, но, на мой взгляд, довольно изощренным видом фишинга. Кто-то уже наверняка сталкивался с таким методом, а для кого-то он окажется в новинку.ПРЕДУПРЕЖДЕНИЕ: Материалы данной статьи носят исключительно ознакомительный характер и публикуются в образовательных целях. Фишинг, равно как и любые разновидности социальной инженерии, направленные на получение НСД или нарушение целостности, доступности и конфиденциальности информации, являются уголовно нак…
В предыдущей статье мы разобрали архитектуру Laravel + Centrifugo: Laravel отвечает за бизнес-логику, права доступа и события, Centrifugo — за WebSocket-соединения, каналы и доставку сообщений, а frontend — за подключение, подписку и обновление интерфейса. Теперь нужно разобрать самый важный слой этой схемы — каналы и авторизацию.Real-time без авторизации опасен. Если пользователь может подписаться на чужой канал, он может получать чужие уведомления, статусы заказов, сообщения, события админки …