Skip to content

Commit

Permalink
High-level description
Browse files Browse the repository at this point in the history
  • Loading branch information
David Robertson committed Nov 13, 2023
1 parent 58f1e86 commit 65d697c
Showing 1 changed file with 40 additions and 2 deletions.
42 changes: 40 additions & 2 deletions proposals/3886-simple-rendezvous-capability.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,46 @@ It will work with devices behind NAT. It doesn't require homeserver administrato
It is proposed that a general purpose HTTP based protocol be used to establish ephemeral bi-directional communication
channels over which arbitrary data can be exchanged.

Please note that it is intentional that this protocol does nothing to ensure the integrity of the data exchanged at a rendezvous.

### High-level description

Suppose that Device A wants to establish communications with Device B. A can do
so by creating a _rendezvous session_ via a `POST /_matrix/client/rendezvous`
call to an appropriate server. Its response includes an HTTP _rendezvous URL_
which should be shared out-of-band with device B. (This URL may be located on a
different domain to the initial `POST`.)

The rendezvous URL points to an arbitrary data resource ("the payload"), which
is initially populated using data from A's `POST` request. There are no
restrictions on the payload itself, but the rendezvous server SHOULD impose a
maximum size limit. The payload may be retrieved (`GET`) and updated (`PUT`) by
anyone—A, B, or a third party—who is able to reach the rendezvous URL.

In this way, A and B can communicate by repeatedly inspecting and updating the
payload pointed at the rendezvous URL.

#### The update mechanism

Every update request MUST include an `ETag` header, whose value is supplied
the `ETag` header in the last `GET` response seen by the requester. (The
initiating device may also use the `ETag` supplied in the initial `POST`
response to immediately update the payload.) Updates will succeed only if the
supplied `ETag` matches the server's current revision of the payload. This
prevents concurrent writes to the payload.

There is no mechanism to retrieve previous payloads after an update.

#### Expiry

The rendezvous session (i.e. the payload) SHOULD expire after a period of time
communicated to clients via the `Expires` header. After this point, any
further attempts to query or update the payload MUST fail. The expiry time
SHOULD be extended every time the payload is updated. The rendezvous session can
be manually expired with a `DELETE` call to the rendezvous URL.

### Example

A typical flow might look like this where device A is initiating the rendezvous with device B:

```mermaid
Expand Down Expand Up @@ -57,8 +97,6 @@ sequenceDiagram
Note over A,B: Rendezvous now established
```

Please note that it is intentional that this protocol does nothing to ensure the integrity of the data exchanged at a rendezvous.

### Protocol

#### Create a new rendezvous point: `POST /_matrix/client/rendezvous`
Expand Down

0 comments on commit 65d697c

Please sign in to comment.