Capabilities
Realtime
Share realtime state between every user connected to an app.
Multiplayer
Example AI-generated app code that shares realtime state between clients. View the complete multiplayer example.
import { actor, event, setup } from "rivetkit";
type Position = { x: number; y: number };
const room = actor({
state: {
players: {} as Record<string, Position>,
},
events: {
changed: event(),
},
actions: {
join(c, player: string) {
c.state.players[player] ??= { x: 0, y: 0 };
c.broadcast("changed", c.state.players);
return c.state.players;
},
move(c, player: string, x: number, y: number) {
c.state.players[player] = { x, y };
c.broadcast("changed", c.state.players);
return c.state.players;
},
inspect(c) {
return c.state.players;
},
},
});
export const registry = setup({
use: { room },
});
registry.start();
export default function fetch() {
return Response.json({
app: "multiplayer-room",
message: "Use the RivetKit client to join and move in a room.",
});
}
import type { Deployment } from "@rivet-dev/agentos-apps";
import { createClient } from "rivetkit/client";
import type { registry as appRegistry } from "../fixtures/app/src/index.js";
const response = await fetch("http://localhost:3000/deploy/multiplayer-room", {
method: "POST",
});
if (!response.ok) {
throw new Error(`deployment failed: ${response.status} ${await response.text()}`);
}
const deployment = (await response.json()) as Deployment;
const client = createClient<typeof appRegistry>({
namespace: deployment.namespace,
poolName: deployment.pool,
});
try {
const room = client.room.getOrCreate(["lobby"]);
await room.join("alice");
console.log(await room.move("alice", 4, 8));
} finally {
await client.dispose();
}