strata_protocol/server
Server → client frames.
Wire shape:
{"v": 0, "kind": "welcome", "session_id": "...", "server": "..."}
{"v": 0, "kind": "snapshot", "doc": "...", "state": <opaque CRDT JSON>}
{"v": 0, "kind": "deleted", "doc": "..."}
{"v": 0, "kind": "delta", "doc": "...", "state": <opaque CRDT JSON>, "from": "..."}
{"v": 0, "kind": "presence_state", "doc": "...", "presences": [Presence...]}
{"v": 0, "kind": "presence_diff", "doc": "...", "diff": {"joins": {<session_id>: {"metas": [Presence...]}}, "leaves": {...}}}
{"v": 0, "kind": "error", "code": "...", "message": "..."}
{"v": 0, "kind": "pong"}
ServerFrame
Section titled “ServerFrame”A frame sent by the server to a client.
CRDT payloads (state) are decoded as Dynamic so the
client can hand them directly to lattice's typed decoders.
pub type ServerFrame { Welcome(session_id: String, server: String) Snapshot(document_id: String, state: dynamic.Dynamic) Deleted(document_id: String) Delta(document_id: String, state: dynamic.Dynamic, from: String) PresenceState(document_id: String, presences: List(presence.Presence)) PresenceDiff(document_id: String, joins: List(presence.Presence), leaves: List(presence.Presence)) ServerError(code: String, message: String) Pong}Functions
Section titled “Functions”decode
Section titled “decode”Parse a JSON string into a ServerFrame.
pub fn decode(String) -> Result(ServerFrame, error.DecodeError)deleted
Section titled “deleted”Encode a Deleted frame.
pub fn deleted(String) -> json.JsonEncode a Delta frame.
pub fn delta( String, json.Json, String) -> json.Jsonencode
Section titled “encode”Encode a typed ServerFrame back to JSON. Round-trips with decode.
pub fn encode(ServerFrame) -> json.JsonEncode an Error frame.
pub fn error( String, String) -> json.Jsonframe_decoder
Section titled “frame_decoder”Decoder that yields a Result(ServerFrame, DecodeError).
pub fn frame_decoder() -> decode.Decoder(Result(ServerFrame, error.DecodeError))Encode a Pong frame.
pub fn pong() -> json.Jsonpresence_diff
Section titled “presence_diff”Encode a PresenceDiff frame.
The diff payload uses the Phoenix/beryl presence shape: joins and
leaves are objects keyed by session id, each holding a metas list
of presence records. Presences without a session_id are keyed by
the empty string.
pub fn presence_diff( String, List(presence.Presence), List(presence.Presence)) -> json.Jsonpresence_diff_raw
Section titled “presence_diff_raw”Wrap an already-encoded presence diff (as produced by beryl's runtime)
in a presence_diff envelope. The diff is forwarded untouched.
pub fn presence_diff_raw( String, json.Json) -> json.Jsonpresence_state
Section titled “presence_state”Encode a PresenceState frame.
pub fn presence_state( String, List(presence.Presence)) -> json.Jsonsnapshot
Section titled “snapshot”Encode a Snapshot frame. state is the opaque CRDT JSON state
produced by or_map.to_json (or equivalent).
pub fn snapshot( String, json.Json) -> json.Jsonwelcome
Section titled “welcome”Encode a Welcome frame.
pub fn welcome( String, String) -> json.Json