diff --git a/ably/proto_presence_message.go b/ably/proto_presence_message.go index bc19f7b4..2b0ea3d9 100644 --- a/ably/proto_presence_message.go +++ b/ably/proto_presence_message.go @@ -2,6 +2,7 @@ package ably import ( "fmt" + "strings" ) // PresenceAction describes the possible actions members in the presence set can emit (TP2). @@ -58,3 +59,16 @@ func (m PresenceMessage) String() string { "update", }[m.Action], m.ClientID, m.Data) } + +// RTP2b1 +func (msg *PresenceMessage) isServerSynthesizedPresenceMessage() bool { + return strings.HasPrefix(msg.ID, msg.ConnectionID) +} + +func (oldMessage *PresenceMessage) IsNewerThan(incomingMessage *PresenceMessage) bool { + if oldMessage.isServerSynthesizedPresenceMessage() || + incomingMessage.isServerSynthesizedPresenceMessage() { + return oldMessage.Timestamp > incomingMessage.Timestamp + } + return false +} diff --git a/ably/realtime_presence.go b/ably/realtime_presence.go index 077a37a9..14e8698e 100644 --- a/ably/realtime_presence.go +++ b/ably/realtime_presence.go @@ -173,10 +173,6 @@ func (pres *RealtimePresence) processIncomingMessage(msg *protocolMessage, syncS pres.syncStart(syncSerial) } - isSynthesizedLeave := func(oldMsg *PresenceMessage, newMsg *PresenceMessage) bool { - return false - } - // RTP17 for _, presenceMember := range msg.Presence { memberKey := presenceMember.ClientID @@ -206,8 +202,7 @@ func (pres *RealtimePresence) processIncomingMessage(msg *protocolMessage, syncS memberKey := presenceMember.ConnectionID + presenceMember.ClientID if oldPresenceMember, ok := pres.members[memberKey]; ok { // RTP2a - if isSynthesizedLeave(oldPresenceMember, presenceMember) && // // RTP2b1 - oldPresenceMember.Timestamp >= presenceMember.Timestamp { + if oldPresenceMember.IsNewerThan(presenceMember) { // RTP2b1 continue // do not process message with older timestamp // RTP2b1a } }