4.1 The Mirror

Each browser tab's shell opens one websocket to its session host at /ws (forwarded by atrium-server like any other connection). The session sends a snapshot — the window list, the focus, the chord table — and from then on events; the shell sends requests.

State flows one way. A shell never changes anything locally: clicking a tile sends launch, and the tab that asked learns of the resulting window the same way every other tab does, from the broadcast. That is what makes two tabs agree without trying: there is nothing to reconcile, because nothing but the session ever decides.

The session pushes facts, not markup. An event names what changed — window.opened, focus, window.closed, window.minimized, window.titled — and each shell works out the DOM consequences. The constraint behind this is the iframe: a window's frame is a live application, and re-parenting or re-rendering it reloads the app, so frames are created once and only ever shown or hidden.

Requests that fail — an unknown app, a closed window — produce an error message to the asking tab alone. Errors are not state, and no other mirror hears them. The same routing carries application request/reply traffic (§5.4): replies and streams go only to the tab whose frame asked.

Window ids are minted by the session. Titles are session state too — an application renaming its window (§5.3) changes every mirror's sidebar at once.

The websocket implementation in the session host is a deliberately small subset of RFC 6455: text, close and ping frames, client masking required, no fragmentation or extensions. Every write to one connection is serialised through one lock — a pong interleaving with a broadcast mid-frame would corrupt the stream, and did, once.

Edit this page