Refactor server to put events in events and event IDs elsewhere

No LRU cache yet
This commit is contained in:
Kegan Dougal 2021-09-09 15:49:22 +01:00
parent 6c58ee96d6
commit 74a591d913
5 changed files with 35 additions and 18 deletions

View File

@ -1,9 +1,12 @@
package streams
import "encoding/json"
type Response struct {
Next string `json:"next_batch"`
Typing *TypingResponse `json:"typing,omitempty"`
ToDevice *ToDeviceResponse `json:"to_device,omitempty"`
RoomMember *RoomMemberResponse `json:"room_member,omitempty"`
RoomList *RoomListResponse `json:"room_list,omitempty"`
Next string `json:"next_batch"`
Typing *TypingResponse `json:"typing,omitempty"`
ToDevice *ToDeviceResponse `json:"to_device,omitempty"`
RoomMember *RoomMemberResponse `json:"room_member,omitempty"`
RoomList *RoomListResponse `json:"room_list,omitempty"`
Events map[string]json.RawMessage `json:"events,omitempty"`
}

View File

@ -30,6 +30,10 @@ const (
// Sort rooms by the calculated room name server-side
// https://spec.matrix.org/unstable/client-server-api/#calculating-the-display-name-for-a-room
SortRoomListByName RoomListSortOrder = "by_name"
// Sort according to unread notifications
SortRoomListByHighlightCount RoomListSortOrder = "by_highlight_count"
SortRoomListByNotificationCount RoomListSortOrder = "by_notification_count"
)
// FilterRoomList represents a filter on the RoomList stream
@ -76,10 +80,9 @@ type RoomListResponse struct {
}
type RoomListEntry struct {
RoomID string `json:"room_id"`
Name string `json:"name"`
Timestamp int64 `json:"timestamp"`
Tag interface{} `json:"tag"`
RoomID string `json:"room_id"`
Name string `json:"name"`
Timestamp int64 `json:"timestamp"`
// MemberCount TODO
}

View File

@ -34,7 +34,7 @@ type RoomMemberResponse struct {
// Negotiated: The actual limit the server used.
Limit int `json:"limit"`
// The m.room.member events
Events []json.RawMessage `json:"events"`
Events []string `json:"events"`
// The pagination parameters to request the next page, can be empty if all members fit on one page.
NextPage string `json:"next_page,omitempty"`
}
@ -75,9 +75,10 @@ func membershipEnumForString(s string) membershipEnum {
}
type memberEvent struct {
PL int64 // for sorting by PL
Name string // for sorting by Name
Membership membershipEnum // for sorting by Membership
PL int64 // for sorting by PL
Name string // for sorting by Name
Membership membershipEnum // for sorting by Membership
ID string
JSON json.RawMessage // The data
}
@ -195,6 +196,7 @@ func (s *RoomMember) paginatedDataAtPoint(session *sync3.Session, pos int64, sor
Name: strings.ToLower(name),
Membership: membershipEnumForString(evJSON.Get("content.membership").Str),
PL: plContent.UserLevel(stateKey),
ID: ev.ID,
JSON: ev.JSON,
}
members = append(members, mem)
@ -250,9 +252,10 @@ func (s *RoomMember) paginatedDataAtPoint(session *sync3.Session, pos int64, sor
}
result := members[startIndex:endIndex]
resp.RoomMember = &RoomMemberResponse{}
resp.RoomMember.Events = make([]json.RawMessage, len(result))
resp.RoomMember.Events = make([]string, len(result))
for i := range result {
resp.RoomMember.Events[i] = result[i].JSON
resp.Events[result[i].ID] = result[i].JSON
resp.RoomMember.Events[i] = result[i].ID
}
if endIndex != len(members) {
// we aren't at the end
@ -269,6 +272,11 @@ func (s *RoomMember) streamingDataInRange(session *sync3.Session, fromExcl, toIn
return 0, err
}
resp.RoomMember = &RoomMemberResponse{}
resp.RoomMember.Events = events
resp.RoomMember.Events = make([]string, len(events))
for i := range events {
eventID := gjson.GetBytes(events[i], "event_id").Str
resp.Events[eventID] = events[i]
resp.RoomMember.Events[i] = eventID
}
return upTo, nil
}

4
v3.go
View File

@ -216,7 +216,9 @@ func (h *SyncV3Handler) serve(w http.ResponseWriter, req *http.Request) *handler
}
// start making the response
resp := streams.Response{}
resp := streams.Response{
Events: make(map[string]json.RawMessage),
}
// invoke streams to get responses
for _, stream := range h.streams {

View File

@ -831,7 +831,8 @@ func TestHandlerRoomMember(t *testing.T) {
t.Fatalf("got %d room members, want %d - test case: %v", len(v3resp.RoomMember.Events), len(req.WantUserIDs), tc.Name)
}
for i := range req.WantUserIDs {
gotUserID := gjson.GetBytes(v3resp.RoomMember.Events[i], "state_key").Str
eventID := v3resp.RoomMember.Events[i]
gotUserID := gjson.GetBytes(v3resp.Events[eventID], "state_key").Str
if gotUserID != req.WantUserIDs[i] {
t.Errorf("position %d got %v want %v - test case: %v", i, gotUserID, req.WantUserIDs[i], tc.Name)
}