- From: Michael Toomim <toomim@gmail.com>
- Date: Fri, 25 Feb 2022 23:15:28 -1000
- To: Mike Bishop <mbishop@evequefou.be>, Kévin Dunglas <kevin@dunglas.fr>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>, Mark Nottingham <mnot@mnot.net>
- Message-ID: <3a67822b-23cb-a70c-c2f6-33f8b9750809@gmail.com>
Mike Bishop: > This is a very interesting space, and I’m glad we have two such solid > contenders. I’m not convinced this fits squarely within HTTP’s > mandate, as this seems more like a protocol on top of HTTP than a pure > extension to HTTP. Perhaps like OHAI, there might be enough interest > to warrant a dedicated working group? Creating a separate working could be a good idea. For a couple years, I thought we would be making one, because the OT and CRDT and Decentralized Web people are such separate groups from HTTPBIS. Also, I see ways in which Mercure looks like a protocol on top of HTTP, but I think Braid is a direct generalization of HTTP's core semantics. Let me give some examples: Braid generalizes Range Requests, which RFC7233 defines only for GET: "A server MUST ignore a Range header field received with a request method other than GET." Braid also defines Range Requests for PUT, which enables some very cool features. First, it creates *patch* semantics. A "patch" is a replacement of a range of a resource. A PUT is a replacement, and a Range defines a range. This "patch" is very powerful. It can represent version control and collaborative editing (CRDT and OT) systems. We happen to study the most complex of these (see e.g. https://josephg.com/blog/crdts-go-brrr/ and https://braid.org/antimatter), and we can represent all of our systems' patches using variations of Range Requested PUTs. Second, we extend Range Requests for both GETs and PUTs with GraphQL semantics—where you can ask for just a slice of some JSON structure. We do this by defining a new "Range Unit", as described in: https://datatracker.ietf.org/doc/html/rfc7233#section-2 This ^^ RFC describes how to define new Range Units, but the only one standardized thus far is "bytes". You typically see "bytes" in requests as: Content-Range: bytes 0-499 Braid defines an alternative to "bytes", named "json": Content-Range: json .posts[3].author.firstname[4:-5] You can do a GraphQL query: Content-Range: graphql {students: {id full_name}, days: {*}} Each of these is a different extension to the core of HTTP. When you put them all together, you get a robust synchronization protocol. HTTP is a very general protocol already. It turns out to require very little for it to generalize into a synchronization protocol!
Received on Saturday, 26 February 2022 09:16:45 UTC