aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorMark Haines <mjark@negativecurvature.net>2017-01-20 18:25:51 +0000
committerMark Haines <mjark@negativecurvature.net>2017-01-20 18:25:51 +0000
commit855f8628e1c615bd84f162607d7f329d47a89f3b (patch)
tree3699c3a27278b6a4c0fbcb5e1fda7c97bf683b6a /README.md
Add README
Diffstat (limited to 'README.md')
-rw-r--r--README.md102
1 files changed, 102 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..11c1858a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,102 @@
+# Dendrite
+
+Dendrite will be a matrix homeserver written in go.
+
+# Design
+
+ *
+
+
+## Log Based Architecture
+
+### Decomposition and Decoupling
+
+A matrix homeserver can be built around append-only event logs built from the
+messages, receipts, presence, typing notifications, device messages and other
+events sent by users on the homeservers or by other homeservers.
+
+The server would then decompose into two categories: writers that add new
+entries to the logs and readers that read those entries.
+
+The event logs then serve to decouple the two components, the writers and
+readers need only agree on the format of the entries in the event log.
+This format could be largely dervived from the wire format of the events used
+in the client and federation protocols:
+
+
+ C-S API +---------+ Event Log +---------+ C-S API
+ ---------> | |+ (e.g. kafka) | |+ --------->
+ | Writers || =============> | Readers ||
+ ---------> | || | || --------->
+ S-S API +---------+| +---------+| S-S API
+ +---------+ +---------+
+
+However the way matrix handles state events in a room creates a few
+complications for this model.
+
+ 1) Writers require the room state at an event to check if it is allowed.
+ 2) Readers require the room state at an event to determine the users and
+ servers that are allowed to see the event.
+ 3) A client can query the current state of the room from a reader.
+
+The writers and readers cannot extract the necessary information directly from
+the event logs because it would take to long to extract the information as the
+state is built up by collecting individual state events from the event history.
+
+The writers and readers therefore need access to something that stores copies
+of the event state in a form that can be efficiently queried. One possibility
+would be for the readers and writers to maintain copies of the current state
+in local databases. A second possibility would be to add a dedicated component
+that maintained the state of the room and exposed an API that the readers and
+writers could query to get the state. The second has the advantage that the
+state is calculated and stored in a single location.
+
+
+ C-S API +---------+ Log +--------+ Log +---------+ C-S API
+ ---------> | |+ ======> | | ======> | |+ --------->
+ | Writers || | Room | | Readers ||
+ ---------> | || <------ | Server | ------> | || --------->
+ S-S API +---------+| Query | | Query +---------+| S-S API
+ +---------+ +--------+ +---------+
+
+
+The room server can annotate the events it logs to the readers with room state
+so that the readers can avoid querying the room server unnecessarily.
+
+[This architecture can be extended to cover most of the APIs.](WIRING.md)
+
+# TODO
+
+ - [ ] gomatrixlib
+ - [x] Canonical JSON.
+ - [x] Signed JSON.
+ - [ ] Event hashing.
+ - [ ] Event signing.
+ - [x] Federation server discovery.
+ - [x] Federation key lookup.
+ - [ ] Federation request signing.
+ - [x] Event authentication.
+ - [ ] Event visibility.
+ - [ ] State resolution.
+ - [ ] Third party invites authentication.
+ - [ ] Room Server
+ - [ ] Inputing new events from logs.
+ - [ ] Inputing backfilled events from logs.
+ - [ ] Outputing events and current state to logs.
+ - [ ] Querying state at an event.
+ - [ ] Querying current forward extremities and state.
+ - [ ] Querying message history.
+ - [ ] Exporting/importing messages from other servers.
+ - [ ] Other Room Server stuff.
+ - [ ] Client Room Send
+ - [ ] Handling /client/r0/room/... HTTP PUTs
+ - [ ] Talk to remote servers for joins to remote servers.
+ - [ ] Outputting new events to logs.
+ - [ ] Updating the last active time in presence.
+ - [ ] Other Client Room Send stuff.
+ - [ ] Client Sync
+ - [ ] Inputing new room events and state from the logs.
+ - [ ] Handling /client/r0/sync HTTP GETs
+ - [ ] Outputing whether the client is syncing to the logs.
+ - [ ] Other Client Sync Stuff.
+ - [ ] Other Components.