mirror of
https://mau.dev/maunium/synapse.git
synced 2024-10-01 01:36:05 -04:00
Add documentation about Federation Queries and EDUs
This commit is contained in:
parent
856f29c03c
commit
94eb2560f4
@ -29,15 +29,40 @@ can also be performed.
|
|||||||
| |<--------( HTTP )-----------| |
|
| |<--------( HTTP )-----------| |
|
||||||
+------------------+ +------------------+
|
+------------------+ +------------------+
|
||||||
|
|
||||||
|
There are three main kinds of communication that occur between home servers:
|
||||||
|
|
||||||
Transactions and PDUs
|
* Queries
|
||||||
=====================
|
These are single request/response interactions between a given pair of
|
||||||
|
servers, initiated by one side sending an HTTP request to obtain some
|
||||||
|
information, and responded by the other. They are not persisted and contain
|
||||||
|
no long-term significant history. They simply request a snapshot state at the
|
||||||
|
instant the query is made.
|
||||||
|
|
||||||
The communication between home servers is performed by a bidirectional exchange
|
* EDUs - Ephemeral Data Units
|
||||||
of messages. These messages are called Transactions, and are encoded as JSON
|
These are notifications of events that are pushed from one home server to
|
||||||
objects with a dict as the top-level element, passed over HTTP. A Transaction is
|
another. They are not persisted and contain no long-term significant history,
|
||||||
meaningful only to the pair of home servers that exchanged it; they are not
|
nor does the receiving home server have to reply to them.
|
||||||
globally-meaningful.
|
|
||||||
|
* PDUs - Persisted Data Units
|
||||||
|
These are notifications of events that are broadcast from one home server to
|
||||||
|
any others that are interested in the same "context" (namely, a Room ID).
|
||||||
|
They are persisted to long-term storage and form the record of history for
|
||||||
|
that context.
|
||||||
|
|
||||||
|
Where Queries are presented directly across the HTTP connection as GET requests
|
||||||
|
to specific URLs, EDUs and PDUs are further wrapped in an envelope called a
|
||||||
|
Transaction, which is transferred from the origin to the destination home server
|
||||||
|
using a PUT request.
|
||||||
|
|
||||||
|
|
||||||
|
Transactions and EDUs/PDUs
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The transfer of EDUs and PDUs between home servers is performed by an exchange
|
||||||
|
of Transaction messages, which are encoded as JSON objects with a dict as the
|
||||||
|
top-level element, passed over an HTTP PUT request. A Transaction is meaningful
|
||||||
|
only to the pair of home servers that exchanged it; they are not globally-
|
||||||
|
meaningful.
|
||||||
|
|
||||||
Each transaction has an opaque ID and timestamp (UNIX epoch time in miliseconds)
|
Each transaction has an opaque ID and timestamp (UNIX epoch time in miliseconds)
|
||||||
generated by its origin server, an origin and destination server name, a list of
|
generated by its origin server, an origin and destination server name, a list of
|
||||||
@ -49,7 +74,8 @@ Transaction carries.
|
|||||||
"origin":"red",
|
"origin":"red",
|
||||||
"destination":"blue",
|
"destination":"blue",
|
||||||
"prev_ids":["e1da392e61898be4d2009b9fecce5325"],
|
"prev_ids":["e1da392e61898be4d2009b9fecce5325"],
|
||||||
"pdus":[...]}
|
"pdus":[...],
|
||||||
|
"edus":[...]}
|
||||||
|
|
||||||
The "previous IDs" field will contain a list of previous transaction IDs that
|
The "previous IDs" field will contain a list of previous transaction IDs that
|
||||||
the origin server has sent to this destination. Its purpose is to act as a
|
the origin server has sent to this destination. Its purpose is to act as a
|
||||||
@ -58,7 +84,9 @@ successfully received that Transaction, or ask for a retransmission if not.
|
|||||||
|
|
||||||
The "pdus" field of a transaction is a list, containing zero or more PDUs.[*]
|
The "pdus" field of a transaction is a list, containing zero or more PDUs.[*]
|
||||||
Each PDU is itself a dict containing a number of keys, the exact details of
|
Each PDU is itself a dict containing a number of keys, the exact details of
|
||||||
which will vary depending on the type of PDU.
|
which will vary depending on the type of PDU. Similarly, the "edus" field is
|
||||||
|
another list containing the EDUs. This key may be entirely absent if there are
|
||||||
|
no EDUs to transfer.
|
||||||
|
|
||||||
(* Normally the PDU list will be non-empty, but the server should cope with
|
(* Normally the PDU list will be non-empty, but the server should cope with
|
||||||
receiving an "empty" transaction, as this is useful for informing peers of other
|
receiving an "empty" transaction, as this is useful for informing peers of other
|
||||||
@ -112,6 +140,15 @@ so on. This part needs refining. And writing in its own document as the details
|
|||||||
relate to the server/system as a whole, not specifically to server-server
|
relate to the server/system as a whole, not specifically to server-server
|
||||||
federation.]]
|
federation.]]
|
||||||
|
|
||||||
|
EDUs, by comparison to PDUs, do not have an ID, a context, or a list of
|
||||||
|
"previous" IDs. The only mandatory fields for these are the type, origin and
|
||||||
|
destination home server names, and the actual nested content.
|
||||||
|
|
||||||
|
{"edu_type":"m.presence",
|
||||||
|
"origin":"blue",
|
||||||
|
"destination":"orange",
|
||||||
|
"content":...}
|
||||||
|
|
||||||
|
|
||||||
Protocol URLs
|
Protocol URLs
|
||||||
=============
|
=============
|
||||||
@ -179,3 +216,16 @@ To stream events all the events:
|
|||||||
Retrieves all of the transactions later than any version given by the "v"
|
Retrieves all of the transactions later than any version given by the "v"
|
||||||
arguments. [[TODO(paul): I'm not sure what the "origin" argument does because
|
arguments. [[TODO(paul): I'm not sure what the "origin" argument does because
|
||||||
I think at some point in the code it's got swapped around.]]
|
I think at some point in the code it's got swapped around.]]
|
||||||
|
|
||||||
|
|
||||||
|
To make a query:
|
||||||
|
|
||||||
|
GET .../query/:query_type
|
||||||
|
Query args: as specified by the individual query types
|
||||||
|
|
||||||
|
Response: JSON encoding of a response object
|
||||||
|
|
||||||
|
Performs a single query request on the receiving home server. The Query Type
|
||||||
|
part of the path specifies the kind of query being made, and its query
|
||||||
|
arguments have a meaning specific to that kind of query. The response is a
|
||||||
|
JSON-encoded object whose meaning also depends on the kind of query.
|
||||||
|
Loading…
Reference in New Issue
Block a user