feat: defer login bootstrap updates
This commit is contained in:
parent
a246fd5417
commit
4d9f1e271d
18 changed files with 958 additions and 188 deletions
|
|
@ -22,6 +22,10 @@ type dispatchingEventAppender interface {
|
|||
AppendAllocatedWithDispatch(ctx context.Context, userID int64, event domain.UpdateEvent, excludeAuthKeyID [8]byte, excludeSessionID int64) (domain.UpdateEvent, error)
|
||||
}
|
||||
|
||||
type newMessageEventFinder interface {
|
||||
FindNewMessageEvent(ctx context.Context, userID int64, messageBoxID int) (domain.UpdateEvent, bool, error)
|
||||
}
|
||||
|
||||
// ServiceOption 调整 updates 服务的运行时依赖。
|
||||
type ServiceOption func(*Service)
|
||||
|
||||
|
|
@ -259,6 +263,37 @@ func (s *Service) RecordNewMessage(ctx context.Context, authKeyID [8]byte, userI
|
|||
}, false, 0)
|
||||
}
|
||||
|
||||
// PublishNewMessage appends an account-visible message update and enqueues
|
||||
// online dispatch without acknowledging any device-local update state.
|
||||
func (s *Service) PublishNewMessage(ctx context.Context, userID int64, msg domain.Message) (domain.UpdateEvent, domain.UpdateState, error) {
|
||||
if userID == 0 {
|
||||
userID = msg.OwnerUserID
|
||||
}
|
||||
if finder, ok := s.events.(newMessageEventFinder); ok && msg.ID > 0 {
|
||||
event, found, err := finder.FindNewMessageEvent(ctx, userID, msg.ID)
|
||||
if err != nil {
|
||||
return domain.UpdateEvent{}, domain.UpdateState{}, err
|
||||
}
|
||||
if found {
|
||||
st, err := s.currentState(ctx, userID)
|
||||
if err != nil {
|
||||
return domain.UpdateEvent{}, domain.UpdateState{}, err
|
||||
}
|
||||
return event, st, nil
|
||||
}
|
||||
}
|
||||
date := msg.Date
|
||||
if date == 0 {
|
||||
date = int(time.Now().Unix())
|
||||
}
|
||||
return s.recordEventCore(ctx, [8]byte{}, userID, domain.UpdateEvent{
|
||||
Type: domain.UpdateEventNewMessage,
|
||||
Date: date,
|
||||
Message: msg,
|
||||
PtsCount: 1,
|
||||
}, true, 0, false)
|
||||
}
|
||||
|
||||
// RecordMessageReactions records a durable marker for message reaction changes.
|
||||
//
|
||||
// updateMessageReactions has no pts fields in Layer 225, but TDesktop still
|
||||
|
|
|
|||
|
|
@ -48,6 +48,45 @@ func TestRecordNewMessageFeedsGetDifference(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestPublishNewMessageIsIdempotentByMessageBoxID(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
var authKeyID [8]byte
|
||||
authKeyID[0] = 11
|
||||
events := memory.NewUpdateEventStore()
|
||||
svc := NewService(memory.NewUpdateStateStore(), events)
|
||||
msg := domain.Message{
|
||||
ID: 10,
|
||||
OwnerUserID: 1000000001,
|
||||
Peer: domain.Peer{Type: domain.PeerTypeUser, ID: domain.OfficialSystemUserID},
|
||||
From: domain.Peer{Type: domain.PeerTypeUser, ID: domain.OfficialSystemUserID},
|
||||
Date: 1700000000,
|
||||
Body: "Login code: 12345",
|
||||
}
|
||||
|
||||
firstEvent, firstState, err := svc.PublishNewMessage(ctx, msg.OwnerUserID, msg)
|
||||
if err != nil {
|
||||
t.Fatalf("PublishNewMessage first: %v", err)
|
||||
}
|
||||
secondEvent, secondState, err := svc.PublishNewMessage(ctx, msg.OwnerUserID, msg)
|
||||
if err != nil {
|
||||
t.Fatalf("PublishNewMessage retry: %v", err)
|
||||
}
|
||||
if firstEvent.Pts != 1 || firstState.Pts != 1 {
|
||||
t.Fatalf("first event/state = %+v / %+v, want pts=1", firstEvent, firstState)
|
||||
}
|
||||
if secondEvent.Pts != firstEvent.Pts || secondState.Pts != firstState.Pts {
|
||||
t.Fatalf("retry event/state = %+v / %+v, want same pts as first %+v / %+v", secondEvent, secondState, firstEvent, firstState)
|
||||
}
|
||||
|
||||
diff, err := svc.GetDifference(ctx, authKeyID, msg.OwnerUserID, domain.UpdateState{})
|
||||
if err != nil {
|
||||
t.Fatalf("GetDifference: %v", err)
|
||||
}
|
||||
if diff.State.Pts != 1 || len(diff.Events) != 1 || diff.Events[0].Message.ID != msg.ID {
|
||||
t.Fatalf("diff = %+v, want one durable login message event", diff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecordReadHistoryFeedsGetDifference(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
var authKeyID [8]byte
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue