/* Copyright (c) 2024 Rune AI Inc. All rights reserved. This code is proprietary to Rune AI Inc. The code may be used solely for accessing the Service provided by Rune AI Inc. following the Rune AI Inc. Terms of Service ("Terms") accessible at rune.ai/eula. You may not use this code for any use or purpose other than as expressly permitted by the Terms. Restrictions set forth in the Terms include, but is not limited to, that you may not copy, adapt, modify, prepare derivative works based upon, distribute, license, sell, transfer, publicly display, publicly perform, transmit, stream, broadcast, attempt to discover any source code, reverse engineer, decompile, dissemble, or otherwise exploit the code as a whole or any portion of the code. */ declare function generateId(length?: number): string; type PersistedPlayers = Record; type PersistedUsers = Record; type GameStateWithPersisted = GameState & { persisted: PersistedPlayers; }; type UntypedPersistedData = {}; type UntypedGameState = Record; type UntypedGameStateWithPersisted = GameStateWithPersisted; type UntypedInitLogicAction = (params?: any) => void; type UntypedInitLogicActions = Record; type GameConfig = { landscape: boolean; minPlayers: number; maxPlayers: number; updatesPerSecond: number; eventCallbacks: { playerLeft: boolean; playerJoined: boolean; }; update: boolean; persistPlayerData: boolean; reactive: boolean; }; type SessionId = string; type GameId = number; type PlayerId = string; type RandomSeed = number; type Player = { playerId: PlayerId; displayName: string; avatarUrl: string; }; type Players = Record; type UserId = number; type Spectator = { playerId: undefined; }; type User = (Player | Spectator) & { userId: number; sdkProtocolVersion: number; }; type Users = Record; type Environment = "runtime" | "devUI" | "test"; type AIPromptResponse = { requestId: string; response: string; }; type AIPromptRequest = { data: AIPromptRequestData; requestId: string; }; type AIPromptMessageContent = { type: "text"; text: string; } | { type: "image_data"; image_url: string; }; type AIPromptRequestData = { messages: { role: string; content: string | AIPromptMessageContent[]; }[]; }; type AIPromptRequestFunction = (data: AIPromptRequestData) => { requestId: string; }; type LogFn = { (obj: object, msg: string): void; (msg: string): void; }; type MsgLogger = { error: LogFn; warn: LogFn; info: LogFn; }; type LogInfo = { devDash: null; } | { devDash: { type: "CLIENT" | "LOGIC"; userType?: "UNKNOWN" | "PLAYER" | "SPECTATOR"; }; }; type ServerErrorMessage = keyof typeof errorMap; declare const errorMap: { SERVER_UPDATE_LOOP_FASTER_THAN_GAME_TIME: { devUIUnexpected: true; logInfo: { devDash: null; }; }; GET_GAME_STATE_FAILED: { devUIUnexpected: true; logInfo: { devDash: null; }; }; SERVER_RECEIVED_MESSAGE_TOO_BIG: { devUIUnexpected: true; logInfo: { devDash: null; }; }; SERVER_MESSAGE_TO_CLIENTS_TOO_BIG: { devUIUnexpected: true; logInfo: { devDash: null; }; }; SERVER_FULL: { devUIUnexpected: true; logInfo: { devDash: null; }; }; ON_PLAYER_JOINED_CALLBACK_MISSING: { devUIUnexpected: true; logInfo: { devDash: null; }; }; ROOM_GAME_STATE_MISSING: { devUIUnexpected: true; logInfo: { devDash: null; }; }; PERSIST_DATA_AFTER_ERROR_NOT_AVAILABLE: { devUIUnexpected: true; logInfo: { devDash: null; }; }; GET_PERSISTED_STATE_FAILED: { devUIUnexpected: true; logInfo: { devDash: null; }; }; GAME_END_PERSIST_USER_NOT_FOUND: { devUIUnexpected: true; logInfo: { devDash: null; }; }; PLAYER_LEFT_NO_USERS_INCORRECT_PERSISTED_PLAYERS: { devUIUnexpected: true; logInfo: { devDash: null; }; }; PERSISTED_STATE_NOT_ENABLED: { devUIUnexpected: true; logInfo: { devDash: null; }; }; UPDATE_LOOP_BEHIND_GAME_TIME: { devUIMessage: string; logInfo: { devDash: null; }; }; AI_PROMPT_REQUEST_FAILED: { devUIUnexpected: true; logInfo: { devDash: null; }; }; ACTION_PARAMS_SIZE_OVER_LIMIT: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PLAYER_JOINED_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PLAYER_LEFT_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); AI_PROMPT_RESPONSE_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); ACTION_TRIGGERED_IN_LOGIC: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); STATE_SYNC_TOO_BIG: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); GAME_OVER_INVALID_OPTIONS: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); SERVER_UPDATE_LOOP_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); ACTION_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); SETUP_GAME_OVER_NOT_ALLOWED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); SETUP_FAILED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_STATE_USED_WITHOUT_FLAG: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); SETUP_PERSISTED_KEY_NOT_ALLOWED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_NOT_AN_OBJECT: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_KEY_MISSING: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_EXTRA_KEY_DETECTED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_PLAYER_MISSING: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_PLAYER_NOT_AN_OBJECT: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); PERSISTED_PLAYER_OVER_LIMIT: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); AI_PROMPT_RESPONSE_NOT_DEFINED: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); AI_PROMPT_REQUEST_PARAM_WRONG_FORMAT: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); NON_ERROR_THROWN_FROM_GAME_LOGIC: { logInfo: LogInfo; } & ({ devUIMessage?: string | ((data: any) => string) | undefined; consoleMessage?: string | ((data: any) => string) | undefined; printExtraDataInDevUI?: boolean | undefined; devUIErrorTitle?: string | undefined; } | { devUIUnexpected: true; }); }; type GameOverResult = "WON" | "LOST" | "TIE" | number; type GameOverOptions = { delayPopUp?: boolean; minimizePopUp?: boolean; } & ({ players: { [playerId: PlayerId]: GameOverResult; }; everyone?: never; } | { players?: never; everyone: GameOverResult; }); type GameOverGameEnded = { reason: "gameEnded"; options: GameOverOptions; }; type GameOverPlayerLeft = { reason: "playerLeft"; }; type GameOverMinPlayers = { reason: "minPlayers"; }; type GameOverError = { reason: "err"; err?: { message: ServerErrorMessage; data?: object; }; }; type GameOverContext = (GameOverMinPlayers | GameOverPlayerLeft | GameOverGameEnded | GameOverError) & { players: Players; }; type ContextWithGameState = Context & { game: PersistedData extends false ? GameState : GameStateWithPersisted; }; type EventContext = { allPlayerIds: PlayerId[]; }; type UpdateContext = { allPlayerIds: PlayerId[]; }; type ActionContext = { playerId: PlayerId; allPlayerIds: PlayerId[]; }; type InitLogicAIResponse = (responseData: AIPromptResponse, eventContext: ContextWithGameState) => void; type InitLogicEvent = (playerId: PlayerId, eventContext: ContextWithGameState) => void; type InitLogicEvents = { playerJoined?: InitLogicEvent; playerLeft?: InitLogicEvent; }; type InitLogicUpdate = (updateContext: ContextWithGameState) => void; type InitLogicActions = { [key in keyof GameActions]: (params: Parameters[0], actionContext: ContextWithGameState) => void; }; type InitLogicParams = { minPlayers: number; maxPlayers: number; landscape?: boolean; updatesPerSecond?: number; setup: (allPlayerIds: PlayerId[], context: PersistedData extends false ? undefined : { game: { persisted: PersistedPlayers; }; }) => GameState; actions: InitLogicActions; events?: InitLogicEvents; update?: InitLogicUpdate; inputDelay?: number; reactive?: boolean; ai?: { promptResponse: InitLogicAIResponse; }; } & (PersistedData extends false ? { persistPlayerData?: false; } : { persistPlayerData: true; }); type SharedSdk = { initLogic: (params: InitLogicParams) => void; invalidAction: () => Error; gameOver: (options?: GameOverOptions) => void; /** @deprecated, use gameTime() */ gameTimeInSeconds: () => number; gameTime: () => number; worldTime: () => number; ai: { promptRequest: AIPromptRequestFunction; }; }; type LogicRunnerContext = { serverStartedAt: number; randomSeed: RandomSeed; msPerTick: number; logicTick: number; }; type LogicRunnerResult = { error: "ROOM_GAME_STATE_MISSING"; } | { data: T; aiPromptRequest: AIPromptRequest | null; }; type LogicRunnerGameContext = { gameOver: GameOverContext | null; }; type LogicRunnerReturnContext = { gameContext: LogicRunnerGameContext; stateHash?: number; }; type LogicRunnerAction = (params: { roomId: number; logicContext: LogicRunnerContext; params: any; actionContext: ActionContext; calculateStateHash: boolean; }) => LogicRunnerResult; type LogicRunnerBindings = { getConfig: () => GameConfig; runSetup: (params: { roomId: number; logicContext: LogicRunnerContext; playerIds: PlayerId[]; calculateStateHash: boolean; persistedPlayers: PersistedPlayers | null; }) => LogicRunnerResult<{ gameState: UntypedGameStateWithPersisted; stateHash?: number; }>; runAction: (action: string, ...args: Parameters) => ReturnType; runUpdate: (params: { roomId: number; logicContext: LogicRunnerContext; updateContext: UpdateContext; }) => LogicRunnerResult; runPlayerJoinedEvent: (params: { roomId: number; logicContext: LogicRunnerContext; playerId: PlayerId; eventContext: EventContext; persistedPlayerState: UntypedPersistedData | null; calculateStateHash: boolean; }) => LogicRunnerResult; runPlayerLeftEvent: (params: { roomId: number; logicContext: LogicRunnerContext; playerId: PlayerId; eventContext: EventContext; calculateStateHash: boolean; }) => LogicRunnerResult | null; }>; runAIPromptResponseEvent: (params: { roomId: number; logicContext: LogicRunnerContext; aiPromptResponse: AIPromptResponse; eventContext: EventContext; calculateStateHash: boolean; }) => LogicRunnerResult; getPersistedData: (roomId: number, playerIds: PlayerId[]) => LogicRunnerResult<{ persistedPlayers: PersistedPlayers; }>; state: { aiPromptRequest: AIPromptRequest | null; gameOverContext: GameOverContext | null; }; context: LogicRunnerContext; initParams: InitLogicParams; gameConfig: GameConfig; rehydrate: (roomId: number, gameState: UntypedGameStateWithPersisted) => void; getActionNames: () => string[]; getGameState: (roomId: number, calculateStateHash: boolean) => LogicRunnerResult<{ gameState: UntypedGameStateWithPersisted; stateHash?: number; }>; cleanup: (roomId: number) => void; }; type SdkProtocolVersion = number; type SdkMessageCodec = { encodeGameToServer(msg: GameToServer, compress: boolean): string; encodeServerToGame(msg: ServerToGame, compress: boolean): string; decodeGameToServer(msg: string, logger: MsgLogger | null): GameToServer | undefined; decodeServerToGame(msg: string, logger: MsgLogger | null): ServerToGame | undefined; }; type Only = { [P in keyof T]: T[P]; } & { [P in keyof U]?: never; }; type Either = Only | Only; type TimelineEntryStart = { type: "START"; serverSeed: number; initialPlayers: Players; stateHash: number; persisted: PersistedPlayers | null; serverStartedAt: number; }; type TimelineEntryEnd = { type: "END"; gameState: UntypedGameStateWithPersisted | string; stateHash: number; reason: GameOverContext["reason"] | "stop"; }; type TimelineEntryWithSuccess = T & ({ success: false; } | { success: true; stateHash: number; }); type TimelineEntryWithoutOrder = { logicTick: number; } & (TimelineEntryStart | TimelineEntryEnd | TimelineEntryWithSuccess<{ type: "ACTION"; playerId: PlayerId; action: string; params: any; randomSeed: number; }> | TimelineEntryWithSuccess<{ type: "AI_PROMPT_RESPONSE"; aiPromptResponse: AIPromptResponse; }> | TimelineEntryWithSuccess<{ type: "PLAYER_JOINED"; player: Player; persisted: UntypedPersistedData | null; }> | TimelineEntryWithSuccess<{ type: "PLAYER_LEFT"; playerId: PlayerId; }>); type TimelineEntry = TimelineEntryWithoutOrder & { order: number; }; type PlayersRandomState = Record; type GameContext = { readonly gameOver: GameOverContext | null; orderNumber: number; sessionId: SessionId; gameId: GameId; serverStartedAt: number; }; type ServerSerializationData = { game: GameStateWithPersisted; } & ServerState; type ServerState = { context: GameContext; random: PlayersRandomState; gameTime: number; updateCount: number; }; type UpdateLoopContext = { logicTick: number; }; type RunGameLogic = { getConfig: LogicRunnerBindings["getConfig"]; getActionNames: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; getGameState: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; getPersistedData: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runSetup: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runPlayerJoinedEvent: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runPlayerLeftEvent: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runAIPromptResponseEvent: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runAction: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runUpdate: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; rehydrate: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; cleanup: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; }; type GameServer = { onMsg: (msgLogger: MsgLogger, userId: UserId, msg: string, info: { serverPreprocessingDurationInMs: number; }) => Promise; onPlayerJoined: (msgLogger: MsgLogger, playerId: PlayerId, persistedUserData: PersistedData) => Promise; onPlayerLeft: (msgLogger: MsgLogger, playerId: PlayerId) => Promise; getDataForSerialization: (msgLogger: MsgLogger) => Promise>>; getConfig: () => GameConfig; getSessionId: () => SessionId; getGameId: () => GameId; getPersistedUsers: (msgLogger: MsgLogger, userIds?: UserId[]) => Promise>; isGameOver: () => boolean; onUpdateLoop: (msgLogger: MsgLogger, updateLoopContext: UpdateLoopContext) => Promise; onAIPromptResponse: (msgLogger: MsgLogger, responseData: ({ success: true; } & AIPromptResponse) | { success: false; requestId: string; }) => Promise; cleanup: (msgLogger: MsgLogger) => Promise | null>; getCodec: () => SdkMessageCodec; }; type NetworkServer = { getUsers: () => Users; broadcastMsg: (msgLogger: MsgLogger, msg: string) => void; sendMsg: (msgLogger: MsgLogger, userId: UserId, msg: string) => void; queueUpdateLoop: (updateLoopContext: UpdateLoopContext) => void; onGameOver: (msgLogger: MsgLogger, reason: GameOverContext["reason"], persistedUsers: PersistedUsers | null) => void; onTimelineEntry?: (msgLogger: MsgLogger, timelineEntry: TimelineEntry) => void; getSeedForPlayerId?: (playerId: PlayerId) => number; onError: () => { numberOfImpactedUsers: number; }; onAIPromptRequest: (request: AIPromptRequest) => void; }; type CreateGameServerProps = { initialMsgLogger: MsgLogger; network: NetworkServer; logic: RunGameLogic; flags: { logServerClientGameTime?: boolean; logNetworkMsg?: boolean; logWrongTick?: boolean; logNetworkMsgSize?: boolean; sendInitialStateSync?: boolean; sendStateHash?: boolean; isPersistFeatureEnabled: boolean; }; params: { sessionId: string | null; roomId: number; gameId: GameId; serverSeed: RandomSeed; serverStartedAt: number; } & Either<{ persistedUsers: PersistedUsers; }, { initialServerData: ServerSerializationData; }>; config: { logicTimeoutDuration?: number | false; allowedGameTimeDelay?: number; gameTimeUpdateEveryXTicks?: number; environment: Environment; sdkProtocolVersion: SdkProtocolVersion; }; }; type ServerToGameBase = { orderNumber: number; serverGameTime: number; logicTick: number; }; type OnChangeMsgAction = { [Key in keyof GameActions]: { action: Key; playerId: PlayerId; params: Parameters[0]; }; }[keyof GameActions]; type ActionBase = { uuid: string; actionCount: number; sessionId: SessionId; randomSeed: RandomSeed; measureLatencyStart: number; }; type GameToServerAction = OnChangeMsgAction & ActionBase & { clientGameTime: number; expectedLogicTick: number; }; type ServerToGameAction = ServerToGameBase & OnChangeMsgAction & ActionBase & { stateHash: number | undefined; }; type ServerToGameGameTimeUpdate = ServerToGameBase & { event: "gameTimeUpdate"; params: { gameContext: GameContext; }; }; type ServerToGameLatencyEstimate = { event: "latencyEstimate"; measureLatencyStart: number; serverGameTime: number; }; type ServerToGameStopGameEvent = { event: "debugStopGame"; }; type ServerToGameStateSyncEvent = ServerToGameBase & { event: "stateSync"; params: { game: GameStateWithPersisted; gameContext: GameContext; players: Players; pastPlayerIds: PlayerId[]; yourPlayerSeed: RandomSeed | undefined; yourPlayerActionCount: number | undefined; yourPlayerId: PlayerId | undefined; serverSeed: RandomSeed; triggeredByUpdateLoop: boolean; measureLatencyStart?: number; latencyRttEstimate?: number; }; dictionary?: string[]; }; type OnChangePlayerJoinedEvent = { event: "playerJoined"; params: { playerId: PlayerId; }; }; type ServerToGamePlayerJoinedEvent = ServerToGameBase & OnChangePlayerJoinedEvent & { params: { playerId: PlayerId; gameContext: GameContext; players: Players; randomSeed: RandomSeed; stateHash: number | undefined; persistedPlayerState?: UntypedPersistedData; }; }; type ServerToGameAIPromptResponseEvent = ServerToGameBase & { event: "aiPromptResponse"; params: { aiPromptResponse: AIPromptResponse; gameContext: GameContext; players: Players; randomSeed: RandomSeed; stateHash: number | undefined; }; }; type OnChangePlayerLeftEvent = { event: "playerLeft"; params: { playerId: PlayerId; }; }; type ServerToGamePlayerLeftEvent = ServerToGameBase & OnChangePlayerLeftEvent & { params: { playerId: PlayerId; gameContext: GameContext; players: Players; randomSeed: RandomSeed; stateHash: number | undefined; }; }; type ServerToGameOnChangeTriggeringEvent = ServerToGameStateSyncEvent | ServerToGamePlayerJoinedEvent | ServerToGamePlayerLeftEvent | ServerToGameAIPromptResponseEvent; type ServerToGameEvent = ServerToGameOnChangeTriggeringEvent | ServerToGameGameTimeUpdate | ServerToGameLatencyEstimate | ServerToGameStopGameEvent; type ServerToGame = ServerToGameAction | ServerToGameEvent; type GameToServer = GameToServerAction | GameToServerStateSyncRequest | { type: "MEASURE_LATENCY"; measureLatencyStart: number; } | { type: "DEBUG_TIMELINE"; data: any; }; type GameToServerStateSyncRequest = { type: "REQUEST_STATE_SYNC"; measureLatencyStart: number; gameId: number | null; }; declare function isNewUserSpectator(users: Users, gameConfig: GameConfig, isGameOver: boolean): boolean; declare function canSwitchSpectatorToPlayer(users: Users, gameConfig: GameConfig): boolean; declare function createSdkForLogicRunner(environment: Environment): { publicSdk: SharedSdk; getLogicRunnerBindings: () => LogicRunnerBindings | undefined; }; declare function createGameServer({ initialMsgLogger, params: { gameId, roomId, sessionId, initialServerData, serverSeed, persistedUsers, serverStartedAt, }, flags: { sendStateHash: sendStateHashFlag, logWrongTick, logNetworkMsg, logNetworkMsgSize, sendInitialStateSync, isPersistFeatureEnabled, }, config: { logicTimeoutDuration, allowedGameTimeDelay, gameTimeUpdateEveryXTicks, environment, sdkProtocolVersion, }, network, logic, }: CreateGameServerProps): Promise>; export { CreateGameServerProps, GameConfig, GameId, GameOverContext, GameServer, LogicRunnerBindings, MsgLogger, PersistedUsers, Player, RunGameLogic, ServerSerializationData, SessionId, UntypedGameState, UntypedGameStateWithPersisted, UntypedPersistedData, User, canSwitchSpectatorToPlayer, createGameServer, createSdkForLogicRunner, generateId, isNewUserSpectator };