extensions

package
v0.99.17 Latest Latest
Warning

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

Go to latest
Published: May 10, 2024 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Overview

package extensions contains the interface and concrete implementations for all sliding sync extensions

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ExtensionEnabled added in v0.99.1

func ExtensionEnabled(r GenericRequest) bool

Types

type AccountDataRequest

type AccountDataRequest struct {
	Core
}

Client created request params

func (*AccountDataRequest) AppendLive added in v0.99.1

func (r *AccountDataRequest) AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)

func (*AccountDataRequest) Name added in v0.99.1

func (r *AccountDataRequest) Name() string

func (*AccountDataRequest) ProcessInitial added in v0.99.1

func (r *AccountDataRequest) ProcessInitial(ctx context.Context, res *Response, extCtx Context)

type AccountDataResponse

type AccountDataResponse struct {
	Global []json.RawMessage            `json:"global,omitempty"`
	Rooms  map[string][]json.RawMessage `json:"rooms,omitempty"`
	// contains filtered or unexported fields
}

Server response

func (*AccountDataResponse) HasData

func (r *AccountDataResponse) HasData(isInitial bool) bool

type Context added in v0.99.1

type Context struct {
	*Handler
	// RoomIDToTimeline is a map from room IDs to slices of event IDs. The keys are the
	// rooms which
	// - have seen new events since the last sync request, and
	// - the client is subscribed to (via a list or a room subscription).
	// The values are the event IDs at the end of the room "timeline", ordered from
	// oldest to newest, as determined by the core sliding sync protocol.
	// TODO: can the timelines be "gappy" like a v2 sync timeline?
	RoomIDToTimeline map[string][]string
	// IsInitial is true if this sync is requesting a snapshot of current client state
	// (pos = 0, "initial sync") and false otherwise (pos > 0, "incremental sync").
	IsInitial bool
	UserID    string
	DeviceID  string
	// Map from room IDs to list names. Keys are the room IDs of all rooms currently
	// visible in at least one sliding window. Values are the names of the lists that
	// enclose those sliding windows. Values should be nonnil and nonempty, and may
	// contain multiple list names.
	RoomIDsToLists map[string][]string
	// AllLists is the slice of list names provided to the Sliding Window API.
	AllLists []string
	// AllSubscribedRooms is the slice of room IDs provided to the Room Subscription API.
	AllSubscribedRooms []string
}

Context is a summary of useful information about the sync3.Request and the state of the requester's connection.

type Core added in v0.99.2

type Core struct {
	// All fields are optional, with nil meaning "not specified".
	Enabled *bool    `json:"enabled"`
	Lists   []string `json:"lists"`
	Rooms   []string `json:"rooms"`
}

mixin for managing the flags reserved by the Core API

func (*Core) ApplyDelta added in v0.99.2

func (r *Core) ApplyDelta(gnext GenericRequest)

func (*Core) InterpretAsInitial added in v0.99.6

func (r *Core) InterpretAsInitial()

func (*Core) IsEnabled added in v0.99.2

func (r *Core) IsEnabled() *bool

func (*Core) Name added in v0.99.2

func (r *Core) Name() string

func (*Core) OnlyLists added in v0.99.2

func (r *Core) OnlyLists() []string

func (*Core) OnlyRooms added in v0.99.2

func (r *Core) OnlyRooms() []string

func (*Core) RoomInScope added in v0.99.2

func (r *Core) RoomInScope(roomID string, extCtx Context) bool

RoomInScope determines whether a given room ought to be processed by this extension, according to the "core" extension scoping logic. Extensions are free to suppress updates for a room based on additional criteria.

type E2EEDeviceList

type E2EEDeviceList struct {
	Changed []string `json:"changed"`
	Left    []string `json:"left"`
}

type E2EEFetcher added in v0.99.0

type E2EEFetcher interface {
	DeviceData(context context.Context, userID, deviceID string, isInitial bool) *internal.DeviceData
}

Fetcher used by the E2EE extension

type E2EERequest

type E2EERequest struct {
	Core
}

Client created request params

func (*E2EERequest) AppendLive added in v0.99.1

func (r *E2EERequest) AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)

func (*E2EERequest) Name added in v0.99.1

func (r *E2EERequest) Name() string

func (*E2EERequest) ProcessInitial added in v0.99.1

func (r *E2EERequest) ProcessInitial(ctx context.Context, res *Response, extCtx Context)

type E2EEResponse

type E2EEResponse struct {
	OTKCounts        map[string]int  `json:"device_one_time_keys_count,omitempty"`
	DeviceLists      *E2EEDeviceList `json:"device_lists,omitempty"`
	FallbackKeyTypes *[]string       `json:"device_unused_fallback_key_types,omitempty"`
}

Server response

func (*E2EEResponse) HasData

func (r *E2EEResponse) HasData(isInitial bool) bool

type GenericRequest added in v0.99.1

type GenericRequest interface {
	// Name provides a name to identify the kind of request. At present, it's only
	// used to name opentracing spans; this isn't end-user visible.
	Name() string
	// Returns the value of the `enabled` JSON key. nil for "not specified".
	IsEnabled() *bool
	// Returns the value of the `lists` JSON key. nil for "not specified".
	OnlyLists() []string
	// Returns the value of the `rooms` JSON key. nil for "not specified".
	OnlyRooms() []string
	// InterpretAsInitial interprets this as an initial request rather than a delta, and
	// overwrites fields accordingly. This can be useful when fields have default
	// values, but is a little ugly. Use sparingly.
	InterpretAsInitial()
	// Overwrite fields in the request by side-effecting on this struct.
	ApplyDelta(next GenericRequest)
	// ProcessInitial provides a means for extensions to return data to clients immediately.
	// If an implementation wants to do so, put the response into *Response (and ensure
	// that GenericResponse.HasData returns true).
	//
	// This is called for every request before going into a live stream loop. By "every
	// request" we mean both initial and incremental syncs; this function gets call
	// multiple times over the lifetime of a connection. (Read Context.IsInitial to see
	// if we are serving an initial or incremental sync.)
	ProcessInitial(ctx context.Context, res *Response, extCtx Context)
	// Process a live event, /aggregating/ the response in *Response. This function can be called
	// multiple times per sync loop as the conn buffer is consumed.
	AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)
}

type GenericResponse added in v0.99.1

type GenericResponse interface {
	// HasData determines if there is enough data in the response for it to be
	// meaningful or useful for the client. If so, we eagerly return this response
	// (even if we are aware of other updates). The parameter isInitial is true if and
	// only if this response is to an initial sync request; this allows the
	// implementation to send out a "fuller" update to an initial sync than it would
	// for an incremental sync.
	HasData(isInitial bool) bool
}

type Handler

type Handler struct {
	Store       *state.Storage
	E2EEFetcher E2EEFetcher
	GlobalCache *caches.GlobalCache
}

func (*Handler) Handle

func (h *Handler) Handle(ctx context.Context, req Request, extCtx Context) (res Response)

func (*Handler) HandleLiveUpdate

func (h *Handler) HandleLiveUpdate(ctx context.Context, update caches.Update, req Request, res *Response, extCtx Context)

type HandlerInterface

type HandlerInterface interface {
	Handle(ctx context.Context, req Request, extCtx Context) (res Response)
	HandleLiveUpdate(ctx context.Context, update caches.Update, req Request, res *Response, extCtx Context)
}

type ReceiptsRequest

type ReceiptsRequest struct {
	Core
}

Client created request params

func (*ReceiptsRequest) AppendLive added in v0.99.1

func (r *ReceiptsRequest) AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)

func (*ReceiptsRequest) Name added in v0.99.1

func (r *ReceiptsRequest) Name() string

func (*ReceiptsRequest) ProcessInitial added in v0.99.1

func (r *ReceiptsRequest) ProcessInitial(ctx context.Context, res *Response, extCtx Context)

type ReceiptsResponse

type ReceiptsResponse struct {
	// room_id -> m.receipt ephemeral event
	Rooms map[string]json.RawMessage `json:"rooms,omitempty"`
}

Server response

func (*ReceiptsResponse) HasData

func (r *ReceiptsResponse) HasData(isInitial bool) bool

type Request

type Request struct {
	ToDevice    *ToDeviceRequest    `json:"to_device"`
	E2EE        *E2EERequest        `json:"e2ee"`
	AccountData *AccountDataRequest `json:"account_data"`
	Typing      *TypingRequest      `json:"typing"`
	Receipts    *ReceiptsRequest    `json:"receipts"`
}

Request is the JSON request body under 'extensions'.

To add new extensions, add a field here and return it in fields() whilst setting it correctly in setFields().

func (Request) ApplyDelta

func (r Request) ApplyDelta(next *Request) Request

ApplyDelta applies the `next` request as a delta atop the previous Request r, and returns the result as a new Request.

func (Request) EnabledExtensions added in v0.99.1

func (r Request) EnabledExtensions() (exts []GenericRequest)

func (*Request) InterpretAsInitial added in v0.99.6

func (r *Request) InterpretAsInitial()

type Response

type Response struct {
	ToDevice    *ToDeviceResponse    `json:"to_device,omitempty"`
	E2EE        *E2EEResponse        `json:"e2ee,omitempty"`
	AccountData *AccountDataResponse `json:"account_data,omitempty"`
	Typing      *TypingResponse      `json:"typing,omitempty"`
	Receipts    *ReceiptsResponse    `json:"receipts,omitempty"`
}

Response represents the top-level `extensions` key in the JSON response.

To add a new extension, add a field here and in fields().

func (Response) HasData

func (r Response) HasData(isInitial bool) bool

type ToDeviceRequest

type ToDeviceRequest struct {
	Core
	Limit int    `json:"limit"` // max number of to-device messages per response
	Since string `json:"since"` // since token
}

Client created request params

func (*ToDeviceRequest) AppendLive added in v0.99.1

func (r *ToDeviceRequest) AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)

func (*ToDeviceRequest) ApplyDelta

func (r *ToDeviceRequest) ApplyDelta(gnext GenericRequest)

func (*ToDeviceRequest) Name added in v0.99.1

func (r *ToDeviceRequest) Name() string

func (*ToDeviceRequest) ProcessInitial added in v0.99.1

func (r *ToDeviceRequest) ProcessInitial(ctx context.Context, res *Response, extCtx Context)

type ToDeviceResponse

type ToDeviceResponse struct {
	NextBatch string            `json:"next_batch"`
	Events    []json.RawMessage `json:"events,omitempty"`
}

Server response

func (*ToDeviceResponse) HasData

func (r *ToDeviceResponse) HasData(isInitial bool) bool

type TypingRequest

type TypingRequest struct {
	Core
}

Client created request params

func (*TypingRequest) AppendLive added in v0.99.1

func (r *TypingRequest) AppendLive(ctx context.Context, res *Response, extCtx Context, up caches.Update)

func (*TypingRequest) Name added in v0.99.1

func (r *TypingRequest) Name() string

func (*TypingRequest) ProcessInitial added in v0.99.1

func (r *TypingRequest) ProcessInitial(ctx context.Context, res *Response, extCtx Context)

type TypingResponse

type TypingResponse struct {
	Rooms map[string]json.RawMessage `json:"rooms,omitempty"`
}

Server response

func (*TypingResponse) HasData

func (r *TypingResponse) HasData(isInitial bool) bool

Jump to

Keyboard shortcuts

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