@heyvr/sdk-arena
Version:
The SDK for heyVR's arena system.
133 lines (132 loc) • 4.09 kB
TypeScript
import { MediaConnection, PeerError } from "peerjs";
export interface AvailableLobbyMetadata {
name: string;
p2p: boolean;
players: Array<string>;
private: boolean;
}
export interface AvailableLobby {
id: string;
maxPlayers: number;
name: string;
players: Array<string>;
private: boolean;
}
export interface PlayerList {
[sessionId: string]: {
sessionId: string;
username: string;
team: string;
};
}
export interface Lobby {
actions: {
abandon(): void;
destroy(): void;
disconnect(): void;
listPlayers(): Promise<PlayerList>;
reconnect(): Promise<Lobby>;
};
commands: {
kickPlayer(username: string): Promise<string>;
banPlayer(username: string): Promise<string>;
unbanPlayer(username: string): Promise<string>;
};
communications: {
allChat(message: string): Promise<string>;
teamChat(message: string, team: string): Promise<string>;
whisper(message: string, username: string): Promise<string>;
mute(username: string): Promise<string>;
unmute(username: string): Promise<string>;
call(): void;
hangUp(): void;
onMessage(callback: (input: {
message: string;
senderId: string;
senderUsername: string;
whisper: boolean;
team: boolean;
}) => void): void;
};
data: {
sendToAll(data: any): void;
sendToTeam(data: any, team: string): void;
onReceiveAll(callback: (payload: any) => void): void;
onReceiveTeam(callback: (payload: any) => void): void;
};
events: {
onDisconnect(callback: (code: number) => void): void;
onError(callback: (code: number, message?: string) => void): void;
onMessage(callback: (code: string, message: string) => void): void;
onPlayerSync(callback: (result: {
event: 'join' | 'leave';
username: string;
sessionId: string;
}) => void): void;
};
session: {
userId: string;
lobbyId: string;
username: string;
};
state: {
current: void;
onChange(callback: (state: any) => void): void;
};
}
export interface LobbyP2P {
actions: {
abandon(): void;
disconnect(): void;
listPlayers(): Promise<Array<string>>;
reconnect(): Promise<LobbyP2P>;
};
communications: {
chat(message: string): Promise<string>;
call(): Promise<MediaConnection>;
onCall(callback: (accept: () => void, decline: () => void) => void): void;
hangUp(): Promise<void>;
onMessage(callback: (message: string) => void): void;
};
data: {
send(data: any): void;
onReceive(callback: (payload: any) => void): void;
};
events: {
onConnect(callback: () => void): void;
onDisconnect(callback: () => void): void;
onAbandon(callback: () => void): void;
onError(callback: (error: PeerError<any>, fatal: boolean) => void): void;
onMatchFound(callback: (opponent: string) => void): void;
};
session: {
username: string;
opponent: string;
isConnected: boolean;
};
}
export interface ArenaCommandResult {
code: 'success' | string;
payload: string;
reason?: string;
success: boolean;
}
export type ArenaConfiguration = {
room: string | null;
lobby: string | null;
name: string | null;
team: string;
password: string;
token: string;
p2p?: boolean;
game: string;
};
export interface ArenaSDK {
createLobby(options: Pick<ArenaConfiguration, 'room' | 'password' | 'team' | 'name' | 'p2p'>): Promise<Lobby>;
duel(room: string): Promise<LobbyP2P>;
getLobby(): Promise<Lobby>;
getLobbyP2P(): Promise<LobbyP2P>;
joinLobby(options: Pick<ArenaConfiguration, 'lobby' | 'room' | 'team' | 'password'>): Promise<Lobby>;
lobbies(roomId: string): Promise<Array<AvailableLobby>>;
p2p(id: string): Promise<LobbyP2P>;
}