// ── Auth ────────────────────────────────────────────────── export interface MetaCallbackBody { userId: string; nonce?: string; deviceInfo?: string; } export interface RefreshBody { refreshToken: string; } export interface AuthTokensResponse { accessToken: string; refreshToken: string; expiresIn: number; } export interface UserProfileResponse { id: string; displayName: string; email: string | null; avatarUrl: string | null; bio: string; isPublic: boolean; } export interface UpdateProfileBody { displayName?: string; bio?: string; isPublic?: boolean; } export interface PairingGenerateResponse { code: string; expiresAt: string; } export interface PairingRedeemBody { code: string; } // ── Providers ──────────────────────────────────────────── export interface AuthUrlResponse { url: string; state: string; } export interface ProviderCallbackBody { code: string; state: string; } export interface LinkedAccountResponse { id: string; serviceId: string; displayName: string; accountId: string; avatarUrl: string | null; rtmpUrl?: string; streamKey?: string; } export interface CreateCustomRtmpBody { displayName: string; rtmpUrl: string; streamKey: string; } // ── Streams ────────────────────────────────────────────── export interface CreateStreamPlanBody { name: string; executionMode?: string; gameId?: string; isPublic?: boolean; destinations: CreateDestinationBody[]; } export interface UpdateStreamPlanBody { name?: string; executionMode?: string; gameId?: string; isPublic?: boolean; destinations?: CreateDestinationBody[]; } export interface CreateDestinationBody { linkedAccountId: string; title: string; description?: string; privacyStatus?: string; gameId?: string; tags?: string; rtmpUrl?: string; streamKey?: string; } export interface StreamPlanResponse { id: string; name: string; status: string; executionMode: string; gameId: string; isPublic: boolean; createdAt: string; updatedAt: string; destinations: StreamDestinationResponse[]; } export interface StreamDestinationResponse { id: string; serviceId: string; linkedAccountId: string; title: string; description: string; privacyStatus: string; gameId: string; tags: string; rtmpUrl: string; streamKey: string; broadcastId: string; status: string; } export interface PrepareResponse { planId: string; destinations: PreparedDestination[]; } export interface PreparedDestination { id: string; serviceId: string; rtmpUrl: string; streamKey: string; broadcastId: string; } // ── Social ────────────────────────────────────────────── export interface PublicUserResponse { id: string; displayName: string; avatarUrl: string | null; bio: string; followerCount: number; followingCount: number; isFollowing: boolean; streams?: StreamPlanResponse[]; } export interface FeedItemResponse { plan: StreamPlanResponse & { user: { id: string; displayName: string; avatarUrl: string | null } }; previewUrl: string | null; posterUrl: string | null; thumbnailUrl: string | null; clipUrl: string | null; likeCount: number; commentCount: number; isLiked: boolean; } export interface FeedResponse { items: FeedItemResponse[]; nextCursor: string | null; } export interface LikeStatusResponse { count: number; isLiked: boolean; } export interface FollowListResponse { users: PublicUserResponse[]; nextCursor: string | null; }