func (c *Conn) updateSerial(msg *proto.ProtocolMessage, listen chan<- error) { const maxint64 = 1<<63 - 1 msg.MsgSerial = c.msgSerial c.msgSerial = (c.msgSerial + 1) % maxint64 if listen != nil { c.pending.Enqueue(msg.MsgSerial, listen) } }
func (pres *RealtimePresence) processIncomingMessage(msg *proto.ProtocolMessage, syncSerial string) { for _, presmsg := range msg.Presence { if presmsg.ConnectionId == "" { presmsg.ConnectionId = msg.ConnectionId } if presmsg.Timestamp == 0 { presmsg.Timestamp = msg.Timestamp } } pres.mtx.Lock() if syncSerial != "" { pres.syncStart(syncSerial) } // Filter out old messages by their timestamp. messages := make([]*proto.PresenceMessage, 0, len(msg.Presence)) // Update presence map / channel's member state. for _, member := range msg.Presence { memberKey := member.ConnectionId + member.ClientID if oldMember, ok := pres.members[memberKey]; ok { if member.Timestamp <= oldMember.Timestamp { continue // do not process old message } } switch member.State { case proto.PresenceUpdate: memberCopy := *member member = &memberCopy member.State = proto.PresencePresent fallthrough case proto.PresencePresent: delete(pres.stale, memberKey) pres.members[memberKey] = member case proto.PresenceLeave: delete(pres.members, memberKey) } messages = append(messages, member) } if syncSerial == "" { pres.syncEnd() } pres.mtx.Unlock() msg.Count = len(messages) msg.Presence = messages pres.subs.presenceEnqueue(msg) }