import { DataConnection } from "peerjs"; import LocalClient from "./LocalClient"; export interface RoomPlayer { name: string; ready: boolean; } export interface LocalPlayer extends RoomPlayer { kind: "local"; client: LocalClient; } export interface NetworkPlayer extends RoomPlayer { kind: "remote"; conn: DataConnection; } export type Player = NetworkPlayer | LocalPlayer; export interface PeerMetadata { name: string; } export interface Room { info: RoomInfo; players: Record; } export interface RoomInfo { max_players: number; password: string; game?: GameInfo; } type GameInfo = MatchInfo | DraftInfo; interface MatchInfo { game_type: "match"; player1: string; player2: string; } interface SetDraftInfo { draft_type: "set"; set: string; } interface BlockDraftInfo { draft_type: "block"; block: string; } interface CubeDraftInfo { draft_type: "cube"; url: string; seeded: boolean; } type DraftInfo = { game_type: "draft"; } & (SetDraftInfo | BlockDraftInfo | CubeDraftInfo); // Message schemas export type NetworkMessage = | PasswordRequest | PasswordResponse | LeaveRequest | ErrorMessage | RoomInfoMessage | JoinMessage | LeaveMessage | RenameMessage | ChatMessage | AckMessage | ReadyMessage; export interface PasswordRequest { kind: "password-req"; } export interface PasswordResponse { kind: "password-resp"; password: string; } export interface RoomInfoMessage { kind: "room-info"; room: RoomInfo; players: RoomPlayer[]; } export interface LeaveRequest { kind: "leave-req"; } export interface JoinMessage { kind: "player-joined"; player: RoomPlayer; } export interface LeaveMessage { kind: "player-left"; name: string; } export interface RenameMessage { kind: "rename"; oldname: string; newname: string; } export interface ChatMessage { kind: "chat"; from: string; to: string; // "" means everyone message: string; } export interface AckMessage { kind: "ok"; what: string; } export interface ErrorMessage { kind: "error"; error: string; } export interface ReadyMessage { kind: "ready"; ready: boolean; }