subscribeRepos wire vectors #
Frames a didbot server put on com.atproto.sync.subscribeRepos, recorded so
that this index can check its reader against a real producer without
compiling against it.
The frame shape is the protocol's, not either side's. A server encodes what
the lexicon says; vibescrobble_index::frames decodes it into the values the
index acts on; and the two are deliberately not the same type — an index that
compiled against a server's types could only read servers built from one
repository. These files are what holds the two in step instead.
Each file is one frame:
{ "note": "why this case is here", "frame": "<base64>", "seq": 10, "did": "…" }
frame is the WebSocket binary message exactly as it arrived: two DAG-CBOR
values back to back, a header naming the message type and then its body.
That is the contract the consumer checks itself against. seq and did are
read out of the frame and written beside it so a person can tell the files
apart; note is prose for whoever is reading, and can be reworded without
changing what the vector proves.
crates/vibescrobble-index/tests/firehose_wire.rs asserts that each frame
decodes to the values named there. To re-record them, run a didbot server and
vibescrobble-replay record --pds <url>: a recording is the same base64 per
line, and a vector is one of its lines with a note.
What each one pins:
commit.json— a#commitwith onecreate. The record is read out of the CAR by the op'scid; the commit block and tree nodes beside it are read past.identity.json— an#identitynaming the handle the server issued.account-active.json,account-deactivated.json,account-deleted.json— the three#accountshapes, and the distinction that matters more than the shape:active: falsealone is not the same as gone, and onlystatus: "deleted"is.info-outdated-cursor.json— the unnumbered#infoa server answers a cursor it no longer holds with. The index compares itsname.error-future-cursor.json— an error frame, headerop: -1, for a cursor ahead of the stream.