Skip to content
On this page

Terminology: everything on your server is in a world; arenas are spaces/rooms/planets that people can interact in; actors are things that change and interact with each other.

A server is an authoritative owner of a world; a client will simulate a world's events progressing but must recalibrate as server events come in.

Scaling horizontally: while a single server can run all the arenas of your game, an underloaded server can take over an arena from an overloaded one; the new server acts like a client long enough to get all the state and actors over, and get clients of that arena reconnected repointed to the mirror. Once the old server sees that everything's ready it sends a promote{arena:42} message to the mirror to let it know that it can disconnect and be the authority.

Stopgap mode:

  1. for now, build it in single-server mode.
  2. then for 2.0, make it so that the two servers pause while the transfer is handled.


An actor is often an arena as well -- a ship on the space map is an actor, but is an arena to the gear and people inside.

  • An actor has an ID. (for the server's root, that's zero) (there's no IDs on disk; these are runtime only ephemera.)
  • an actor has two lists of children active and passive (active ones get tick events)


Maybe I don't need "world" as arenas can





Is API compatible with my client one so that a chaos client can reuse their graphics-driving clock here.

(But serves side there's no need for animation frames, so the innards of chaos:clock are much simpler.)

JavaScript/Bash source released under the MIT License.