mirror of
https://github.com/element-hq/synapse
synced 2024-08-20 00:20:25 +00:00
66 lines
3.5 KiB
Markdown
66 lines
3.5 KiB
Markdown
|
# Synapse Architecture
|
||
|
|
||
|
As of the end of Oct 2014, Synapse's overall architecture looks like:
|
||
|
|
||
|
synapse
|
||
|
.-----------------------------------------------------.
|
||
|
| Notifier |
|
||
|
| ^ | |
|
||
|
| | | |
|
||
|
| .------------|------. |
|
||
|
| | handlers/ | | |
|
||
|
| | v | |
|
||
|
| | Event*Handler <--------> rest/* <=> Client
|
||
|
| | Rooms*Handler | |
|
||
|
HS <=> federation/* <==> FederationHandler | |
|
||
|
| | | PresenceHandler | |
|
||
|
| | | TypingHandler | |
|
||
|
| | '-------------------' |
|
||
|
| | | | |
|
||
|
| | state/* | |
|
||
|
| | | | |
|
||
|
| | v v |
|
||
|
| `--------------> storage/* |
|
||
|
| | |
|
||
|
'--------------------------|--------------------------'
|
||
|
v
|
||
|
.----.
|
||
|
| DB |
|
||
|
'----'
|
||
|
|
||
|
- Handlers: business logic of synapse itself. Follows a set contract of BaseHandler:
|
||
|
- BaseHandler gives us onNewRoomEvent which: (TODO: flesh this out and make it less cryptic):
|
||
|
- handle_state(event)
|
||
|
- auth(event)
|
||
|
- persist_event(event)
|
||
|
- notify notifier or federation(event)
|
||
|
- PresenceHandler: use distributor to get EDUs out of Federation.
|
||
|
Very lightweight logic built on the distributor
|
||
|
- TypingHandler: use distributor to get EDUs out of Federation.
|
||
|
Very lightweight logic built on the distributor
|
||
|
- EventsHandler: handles the events stream...
|
||
|
- FederationHandler: - gets PDU from Federation Layer; turns into
|
||
|
an event; follows basehandler functionality.
|
||
|
- RoomsHandler: does all the room logic, including members - lots
|
||
|
of classes in RoomsHandler.
|
||
|
- ProfileHandler: talks to the storage to store/retrieve profile
|
||
|
info.
|
||
|
- EventFactory: generates events of particular event types.
|
||
|
- Notifier: Backs the events handler
|
||
|
- REST: Interfaces handlers and events to the outside world via
|
||
|
HTTP/JSON. Converts events back and forth from JSON.
|
||
|
- Federation: holds the HTTP client & server to talk to other servers.
|
||
|
Does replication to make sure there's nothing missing in the graph.
|
||
|
Handles reliability. Handles txns.
|
||
|
- Distributor: generic event bus. used for presence & typing only
|
||
|
currently. Notifier could be implemented using Distributor - so far
|
||
|
we are only using for things which actually /require/ dynamic
|
||
|
pluggability however as it can obfuscate the actual flow of control.
|
||
|
- Auth: helper singleton to say whether a given event is allowed to do
|
||
|
a given thing (TODO: put this on the diagram)
|
||
|
- State: helper singleton: does state conflict resolution. You give it
|
||
|
an event and it tells you if it actually updates the state or not,
|
||
|
and annotates the event up properly and handles merge conflict
|
||
|
resolution.
|
||
|
- Storage: abstracts the storage engine.
|