Skip to content

Mock twitch events, api, and auth flow #980

@Satont

Description

@Satont

This will helps in local dev without twitch communication.

Оценка сложности мока Twitch для локальной разработки
Что нужно замокать
Компонент
Twitch Helix REST API
Twitch OAuth (id.twitch.tv/oauth2)
EventSub WebSocket (wss://eventsub.wss.twitch.tv/ws)
Twitch Internal GQL (gql.twitch.tv/gql)

Ключевые сложности

1. EventSub WebSocket — самое сложное.
Приложение (apps/eventsub) при старте (on_start.go):

  • Создаёт conduit через GET/POST /helix/eventsub/conduits
  • Подключается к wss://eventsub.wss.twitch.tv/ws
  • Регистрирует shards через PATCH /helix/eventsub/conduits/shards
  • Подписывается на 30+ типов событий на каждый канал
    Мок-сервер должен реализовывать весь этот протокол.
    2. OAuth flow — без реального Twitch нельзя залогиниться.
    В apps/api-gql/internal/delivery/http/routes/auth/post-code.go backend обменивает code на token и сразу вызывает helix.GetUsers() для получения профиля. Это нужно полностью перехватить.
    3. Scheduler polling (apps/scheduler/internal/timers/streams.go) — каждые 15 секунд опрашивает /helix/streams для всех каналов. Без мока будут постоянные ошибки.
    4. Tokens-сервис (apps/tokens) — все токены идут через NATS, сервис дешифрует из БД и обновляет через id.twitch.tv. Нужно замокать refresh-эндпоинт.

Реалистичная оценка объёма работ
Минимальный подход (только залогиниться и запустить без крашей):

  • Мок HTTP-сервер на Go/Node с ~10 эндпоинтами
  • Фейковый OAuth (code→token→user)
  • Заглушка для EventSub WebSocket (welcome message + keepalive)
  • ~3-5 дней работы
    Полноценный подход (работающий бот, события, чат):
  • Полный мок Helix API (~25 эндпоинтов)
  • EventSub WebSocket с возможностью вручную отправлять события (CLI-тул или UI)
  • Мок GQL
  • Seed-данные (фейковый пользователь, бот, канал в БД)
  • ~2-3 недели работы

Самый прагматичный путь
Существует Twitch CLI (twitch mock-api) — официальный инструмент от Twitch для мока API. Но он не покрывает EventSub WebSocket conduits (только старый webhook-режим).
Лучший вариант для проекта — написать один небольшой Go-сервис (apps/twitch-mock), который:

  1. Поднимается в docker-compose.dev.yml
  2. Слушает на localhost:8080 и имитирует id.twitch.tv + api.twitch.tv
  3. Переопределяется через env-переменную типа TWITCH_API_BASE_URL=http://localhost:8080
  4. При старте сидит в БД фейковый пользователь и бот
    Проблема: в коде URL api.twitch.tv и id.twitch.tv захардкожены внутри библиотеки nicklaw5/helix и внутреннего GQL. Нужно проверить, поддерживает ли эта библиотека кастомный base URL — если нет, придётся форкать или патчить.

Итог
Вариант
Минимальный мок (запуск без крашей)
Полный мок (рабочая локалка)
Через Twitch CLI + патчи
Это реалистичный но объёмный рефактор. Основная сложность — EventSub WebSocket протокол и то, что URL Twitch захардкожены в зависимостях.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions