SDK-referentie
Op deze pagina
Types
De SDK is in TypeScript geschreven. Alle declaraties staan in één bestand: types/mini-engine.d.ts in de SDK-repository. Het wordt bij npm run build uit src/ gegenereerd. De engine heeft een kopie in web/mini-engine.d.ts, en de scaffolder zet er een in types/ van elk nieuw spel.
Gebruik in gewone JavaScript #
Spelpagina's zijn JavaScript zonder build. Met JSDoc krijg je toch typecontrole:
JavaScript
import { MiniEngine, loadSession } from '/sdk/mini-engine.js';
/** @import { Role, Snapshot } from '/sdk/mini-engine.js' */
/** @typedef {{ prompt: string, allow_change: boolean }} Settings */
/** @typedef {{ votes?: Record<string, boolean> } | null} PublicState */
/** @typedef {Snapshot<PublicState, Settings>} Room */
/** @type {MiniEngine<PublicState, Settings>} */
const client = new MiniEngine(session);De jsconfig.json van de scaffolder koppelt /sdk/mini-engine.js aan het declaratiebestand.
Basistypes #
TypeScript
type Json = null | boolean | number | string | Json[] | { [key: string]: Json };
type Role = 'host' | 'player' | 'display';
type HostMode = 'moderator' | 'playing' | 'hostless';
type Lifecycle = 'lobby' | 'running' | 'finished';
type ConnectionStatus = 'connecting' | 'connected' | 'reconnecting' | 'disconnected';Kamers #
Snapshot #
TypeScript
interface Snapshot<PublicState = Json, Settings = Record<string, Json>, PrivateState = Json> {
code: string;
game_id: string;
status: Lifecycle;
version: number;
max_players: number;
host_connected: boolean;
players: Player[];
public_state: PublicState;
settings: Settings;
runtime?: 'host' | 'server';
config?: RoomConfig;
round_id?: string;
you: { role: Role; player_id?: string | null };
host_state?: Json; // alleen host
player_states?: Record<string, Json>; // alleen host
private_state?: PrivateState; // speler, of meespelende host
}Player #
TypeScript
interface Player { id: string; name: string; connected: boolean; ready?: boolean; account_id?: string | null }RoomConfig #
TypeScript
interface RoomConfig { host_mode: HostMode; display_enabled: boolean; allow_late_join: boolean }
type MutableRoomConfig = Partial<Pick<RoomConfig, 'display_enabled' | 'allow_late_join'>>;RoomCredentials en CreateRoomOptions #
TypeScript
interface RoomCredentials { code: string; token: string; role: Role; player_id?: string | null; display_token?: string }
interface CreateRoomOptions {
game_id: string;
max_players?: number;
settings?: Record<string, Json>;
name?: string;
config?: Partial<RoomConfig>;
}StateUpdate #
TypeScript
interface StateUpdate<PublicState = Json> {
expected_version: number;
public_state: PublicState;
host_state?: Json;
player_states?: Record<string, Json>;
}Spellen #
Manifest #
TypeScript
interface Manifest<Settings = Record<string, Json>> {
id: string; title: string; description: string; version: string;
min_players: number; max_players: number; has_display: boolean;
default_settings: Settings;
settings_schema: {
type: 'object';
properties: Record<string, SettingsProperty>;
required?: string[];
additionalProperties: false;
title?: string; description?: string; default?: Settings;
};
runtime?: 'host' | 'server';
host_modes?: HostMode[];
default_host_mode?: HostMode;
supports_late_join?: boolean;
}
interface SettingsProperty {
type: 'integer' | 'number' | 'string' | 'boolean';
enum?: Json[];
minimum?: number; maximum?: number; maxLength?: number;
title?: string; description?: string; default?: Json;
}Websocketberichten #
TypeScript
interface Ack { type: 'ack'; request_id?: string }
interface ActionEnvelope {
type: 'action'; player_id: string; name: string; data: Json;
request_id?: string; action_id?: string;
}ActionPayloads #
De data van de acties van de ingebouwde spellen:
TypeScript
interface ActionPayloads {
roll: { held?: number[] };
clear_history: Record<string, never>;
start: Record<string, never>;
finish: Record<string, never>;
choose_team: { team_id: string };
buzz: Record<string, never>;
select_clue: { clue_id: string };
judge: { correct: boolean };
reveal: Record<string, never>;
reopen: Record<string, never>;
close_clue: Record<string, never>;
}Accounts #
TypeScript
interface Account {
id: string; username: string; display_name: string; created_at: string | number;
email: string | null; email_verified: boolean;
}
interface AccountSession { account: Account; token: string }
interface AccountStats {
totals: { games_played: number; wins: number };
games: {
game_id: string; games_played: number; wins: number;
total_score: number; best_score: number | null;
counters: Record<string, number>;
}[];
recent: Json[];
}email en email_verified zijn er sinds SDK 0.3.1 (engine 0.4). email is null bij een account zonder adres.