Skip to content

Tipos TypeScript del Servidor

Los tipos de TypeScript son los contratos de datos del sistema. Definen la forma exacta que deben tener los objetos que circulan entre capas, garantizando consistencia y seguridad de tipos en tiempo de compilación.

Tipos Globales (src/types/index.ts)

Estos tipos son usados por múltiples módulos del sistema.

AuthTokens

Estructura devuelta por las APIs de OAuth al intercambiar un código por tokens:

typescript
interface AuthTokens {
  access_token: string; // Token de acceso para llamar a la API
  refresh_token?: string; // Token para renovar (no siempre presente, ej. TikTok)
  expires_in: number; // Segundos hasta que el token caduca
  token_type?: string; // Generalmente 'Bearer'
}

PlatformProfile

Perfil normalizado de un usuario en cualquier plataforma:

typescript
interface PlatformProfile {
  provider: Platform; // 'twitch' | 'youtube' | 'kick' | 'tiktok'
  providerId: string; // ID único del usuario en la plataforma
  providerUsername: string; // Nombre de usuario (login)
  displayName: string; // Nombre visible
  avatarUrl?: string; // URL del avatar
  email?: string; // Email (YouTube)
}

ConnectionDTO

Dato transferido para representar una cuenta vinculada. Se usa en respuestas de API hacia el frontend:

typescript
interface ConnectionDTO {
  id: string;
  userId: string;
  provider: Platform;
  providerId: string;
  providerUsername: string;
  expiryDate: Date;
}

ChatMessage

Forma básica de un mensaje de chat. (Para la forma completa con emotes, ver NormalizedChatMessage en Transformadores):

typescript
interface ChatMessage {
  id: string;
  platform: Platform;
  user: string;
  message: string;
  time: string;
  avatar?: string;
  isMod?: boolean;
  isSub?: boolean;
  isOwner?: boolean;
  specialMessage?: string;
  isSpecial?: boolean;
}

GlobalConnectionStatus

Tipo centralizado que define todos los estados posibles de una conexión con una plataforma:

typescript
type GlobalConnectionStatus = 
  | 'connecting'      // Buscando stream inicial
  | 'searching'       // Buscando stream (sinónimo visual)
  | 'waiting_stream'  // Cuenta vinculada pero sin transmisión activa
  | 'connected'       // Transmisión activa y chat conectado
  | 'error'           // Fallo en la conexión o sesión expirada
  | 'disconnected';   // Cuenta no vinculada

ConnectionStatus

Estado de la conexión a una plataforma, usado internamente en buses de eventos:

typescript
interface ConnectionStatus {
  platform: Platform;
  status: GlobalConnectionStatus;
  message?: string;
}

ConnectionInfo

Información completa de estado enviada al frontend vía API (/me) y Sockets. Permite que el Dashboard sincronice el estado visual exacto del backend:

typescript
interface ConnectionInfo {
  connected: boolean;
  username?: string;
  viewers?: number;
  status?: GlobalConnectionStatus;
  statusMessage?: string;
  isLive?: boolean;
  sessionStartTime?: string | null;
}

Tipos de Mensajes (src/types/message.types.ts)

Contratos para el envío de mensajes y moderación desde el dashboard.

SendMessageRequest

Lo que el frontend envía al socket cuando el streamer escribe un mensaje:

typescript
interface SendMessageRequest {
  userId: string;
  message: string;
  platforms: Platform[]; // [] = enviar a todas las plataformas conectadas
}

SendMessageResponse

La respuesta que el servidor devuelve con el resultado por plataforma:

typescript
interface SendMessageResponse {
  success: boolean; // true si al menos una plataforma tuvo éxito
  results: PlatformResult[];
  timestamp: string;
}

interface PlatformResult {
  platform: Platform;
  success: boolean;
  messageId?: string; // ID del mensaje si se envió correctamente
  error?: string; // Descripción del error si falló
  errorCode?: string; // Código de error ('NO_LIVE_BROADCAST', 'QUOTA_EXCEEDED', etc.)
}

ModerationActionRequest

Lo que el frontend envía al socket cuando el moderador realiza una acción:

typescript
interface ModerationActionRequest {
  userId: string; // ID del streamer autenticado
  platform: Platform | "dashboard"; // 'dashboard' = aplicar en todas
  action: "delete" | "ban" | "timeout";
  messageId?: string; // Requerido para 'delete'
  targetUserId?: string; // ID del usuario a moderar
  targetUsername?: string; // Username del usuario (para contexto)
  reason?: string; // Razón del ban/timeout
  duration?: number; // Segundos (solo para 'timeout')
  platformIds?: Record<string, string>; // IDs del usuario en cada plataforma
}

Tipos de Autenticación (src/types/auth.types.ts)

OAuthService (Interfaz)

El contrato que deben cumplir todos los servicios de plataforma que soportan OAuth:

typescript
interface OAuthService {
  getProfileAndTokens(
    code: string,
    codeVerifier?: string,
  ): Promise<{
    profile: PlatformProfile;
    tokens: AuthTokens;
  }>;
  refreshAccessToken(refreshToken: string): Promise<AuthTokens>;
}

TwitchService, YouTubeService y KickService implementan esta interfaz. El PlatformServiceFactory explota esto para intercambiarlos de forma genérica.

Liberado bajo la Licencia MIT.