roomserver

package
v0.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 6, 2024 License: Apache-2.0 Imports: 9 Imported by: 0

README

RoomServer

RoomServer Internals

Numeric IDs

To save space matrix string identifiers are mapped to local numeric IDs. The numeric IDs are more efficient to manipulate and use less space to store. The numeric IDs are never exposed in the API the room server exposes. The numeric IDs are converted to string IDs before they leave the room server. The numeric ID for a string ID is never 0 to avoid being confused with go's default zero value. Zero is used to indicate that there was no corresponding string ID. Well-known event types and event state keys are preassigned numeric IDs.

State Snapshot Storage

The room server stores the state of the matrix room at each event. For efficiency the state is stored as blocks of 3-tuples of numeric IDs for the event type, event state key and event ID. For further efficiency the state snapshots are stored as the combination of up to 64 these blocks. This allows blocks of the room state to be reused in multiple snapshots.

The resulting database tables look something like this:

+-------------------------------------------------------------------+
| Events                                                            |
+---------+-------------------+------------------+------------------+
| EventNID| EventTypeNID      | EventStateKeyNID | StateSnapshotNID |
+---------+-------------------+------------------+------------------+
|       1 | m.room.create   1 | ""             1 | <nil>          0 |
|       2 | m.room.member   2 | "@user:foo"    2 | <nil>          0 |
|       3 | m.room.member   2 | "@user:bar"    3 | {1,2}          1 |
|       4 | m.room.message  3 | <nil>          0 | {1,2,3}        2 |
|       5 | m.room.member   2 | "@user:foo"    2 | {1,2,3}        2 |
|       6 | m.room.message  3 | <nil>          0 | {1,3,6}        3 |
+---------+-------------------+------------------+------------------+

+----------------------------------------+
| State Snapshots                        |
+-----------------------+----------------+
| EventStateSnapshotNID | StateBlockNIDs |
+-----------------------+----------------|
|                     1 |           {1}  |
|                     2 |         {1,2}  |
|                     3 |       {1,2,3}  |
+-----------------------+----------------+

+-----------------------------------------------------------------+
| State Blocks                                                    |
+---------------+-------------------+------------------+----------+
| StateBlockNID | EventTypeNID      | EventStateKeyNID | EventNID |
+---------------+-------------------+------------------+----------+
|             1 | m.room.create   1 | ""             1 |        1 |
|             1 | m.room.member   2 | "@user:foo"    2 |        2 |
|             2 | m.room.member   2 | "@user:bar"    3 |        3 |
|             3 | m.room.member   2 | "@user:foo"    2 |        6 |
+---------------+-------------------+------------------+----------+

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewInternalAPI

func NewInternalAPI(
	processContext *process.ProcessContext,
	cfg *config.Dendrite,
	cm *sqlutil.Connections,
	natsInstance *jetstream.NATSInstance,
	caches caching.RoomServerCaches,
	enableMetrics bool,
) api.RoomserverInternalAPI

NewInternalAPI returns a concrete implementation of the internal API.

Many of the methods provided by this API depend on access to a federation API, and so you may wish to call `SetFederationAPI` on the returned struct to avoid nil-dereference errors.

Types

This section is empty.

Directories

Path Synopsis
Package api provides the types that are used to communicate with the roomserver.
Package api provides the types that are used to communicate with the roomserver.
input
Package input contains the code processes new room events
Package input contains the code processes new room events
Package types provides the types that are used internally within the roomserver.
Package types provides the types that are used internally within the roomserver.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL