export interface BackendIdentity { userId: string; gameId: string; } export interface SqlBinding { query(text: string, parameters?: readonly unknown[]): Promise; transaction(callback: (sql: SqlBinding) => Promise): Promise; } export interface RedisBinding { get(key: string): Promise; set(key: string, value: unknown, options?: { ttlSeconds?: number; }): Promise; delete(key: string): Promise; } export interface BackendMediaSessionRequest { roomId: string; channel: string; media: 'audio' | 'video'; maxPlayers: number; mode?: 'auto' | 'p2p' | 'sfu'; userId: string; } export interface BackendMediaBinding { createSession(input: BackendMediaSessionRequest): Promise<{ roomId: string; mediaSessionId: string; mode: 'p2p' | 'sfu'; iceServers: RTCIceServer[]; expiresAt: number; sfu?: { url: string; token: string; managedIce?: boolean; }; }>; } export interface GameBackendContext { identity: BackendIdentity; gameId: string; /** Stable deployment identity. It does not change between artifact releases. */ backendDeploymentId: string; /** Immutable artifact digest for the code currently running in this Runner. */ version: string; sql: SqlBinding; redis: RedisBinding; /** Platform-issued short-lived TURN/SFU credentials; the signing secrets remain outside game code. */ media: BackendMediaBinding; } export type GameBackendHandler = (request: Request, context: GameBackendContext) => Response | Promise; export interface GameBackendSocket { send(data: unknown): void; close(code?: number, reason?: string): void; onMessage(handler: (data: unknown) => void): () => void; onClose(handler: (event: unknown) => void): () => void; } export type GameBackendWebSocketHandler = (socket: GameBackendSocket, context: GameBackendContext) => void | Promise; export type BackendProtocol = 'http' | 'websocket' | 'http-websocket'; export interface GameBackendManifest { protocol?: BackendProtocol; [key: string]: unknown; } export interface GameBackendDefinition { fetch?: GameBackendHandler; websocket?: GameBackendWebSocketHandler; manifest?: GameBackendManifest; } /** Defines a game-owned HTTP, WebSocket, or dual-protocol backend. */ export declare function defineGameBackend(handler: GameBackendHandler | { http?: GameBackendHandler; websocket?: GameBackendWebSocketHandler; }, manifest?: GameBackendManifest): GameBackendDefinition;