Changeset 485 in code
- Timestamp:
- Mar 29, 2021, 3:49:50 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r484 r485 362 362 } 363 363 364 delivered := network.delivered.Value(entity) 365 if delivered == nil { 366 return 367 } 368 369 delivered[dc.clientName] = id 364 network.delivered.StoreID(entity, dc.clientName, id) 370 365 } 371 366 … … 998 993 }) 999 994 if firstClient { 1000 dc.sendNetworkBacklog(net) 995 net.delivered.ForEachTarget(func(target string) { 996 dc.sendTargetBacklog(net, target) 997 }) 1001 998 } 1002 999 1003 1000 // Fast-forward history to last message 1004 for targetCM, entry := range net.delivered.innerMap { 1005 delivered := entry.value.(deliveredClientMap) 1006 ch := net.channels.Value(targetCM) 1001 net.delivered.ForEachTarget(func(target string) { 1002 ch := net.channels.Value(target) 1007 1003 if ch != nil && ch.Detached { 1008 continue 1009 } 1010 1004 return 1005 } 1006 1007 targetCM := net.casemap(target) 1011 1008 lastID, err := dc.user.msgStore.LastMsgID(net, targetCM, time.Now()) 1012 1009 if err != nil { 1013 1010 dc.logger.Printf("failed to get last message ID: %v", err) 1014 continue 1015 } 1016 delivered[dc.clientName] = lastID 1017 } 1011 return 1012 } 1013 1014 net.delivered.StoreID(target, dc.clientName, lastID) 1015 }) 1018 1016 }) 1019 1017 … … 1035 1033 } 1036 1034 1037 func (dc *downstreamConn) sendNetworkBacklog(net *network) {1038 for _, entry := range net.delivered.innerMap {1039 target := entry.originalKey1040 dc.sendTargetBacklog(net, target)1041 }1042 }1043 1044 1035 func (dc *downstreamConn) sendTargetBacklog(net *network, target string) { 1045 1036 if dc.caps["draft/chathistory"] || dc.user.msgStore == nil { … … 1049 1040 return 1050 1041 } 1051 delivered := net.delivered.Value(target) 1052 if delivered == nil { 1053 return 1054 } 1055 lastDelivered, ok := delivered[dc.clientName] 1056 if !ok { 1042 1043 lastDelivered := net.delivered.LoadID(target, dc.clientName) 1044 if lastDelivered == "" { 1057 1045 return 1058 1046 } -
trunk/upstream.go
r483 r485 1741 1741 } 1742 1742 1743 delivered := uc.network.delivered.Value(entity)1744 1743 entityCM := uc.network.casemap(entity) 1745 if delivered == nil { 1744 1745 if !uc.network.delivered.HasTarget(entity) { 1746 1746 // This is the first message we receive from this target. Save the last 1747 1747 // message ID in delivery receipts, so that we can send the new message … … 1753 1753 } 1754 1754 1755 delivered = make(deliveredClientMap)1756 uc.network.delivered.SetValue(entity, delivered)1757 1758 1755 for clientName, _ := range uc.user.clients { 1759 delivered[clientName] = lastID1756 uc.network.delivered.StoreID(entity, clientName, lastID) 1760 1757 } 1761 1758 } -
trunk/user.go
r483 r485 58 58 type deliveredClientMap map[string]string // client name -> msg ID 59 59 60 type deliveredStore struct { 61 m deliveredCasemapMap 62 } 63 64 func newDeliveredStore() deliveredStore { 65 return deliveredStore{deliveredCasemapMap{newCasemapMap(0)}} 66 } 67 68 func (ds deliveredStore) HasTarget(target string) bool { 69 return ds.m.Value(target) != nil 70 } 71 72 func (ds deliveredStore) LoadID(target, clientName string) string { 73 clients := ds.m.Value(target) 74 if clients == nil { 75 return "" 76 } 77 return clients[clientName] 78 } 79 80 func (ds deliveredStore) StoreID(target, clientName, msgID string) { 81 clients := ds.m.Value(target) 82 if clients == nil { 83 clients = make(deliveredClientMap) 84 ds.m.SetValue(target, clients) 85 } 86 clients[clientName] = msgID 87 } 88 89 func (ds deliveredStore) ForEachTarget(f func(target string)) { 90 for _, entry := range ds.m.innerMap { 91 f(entry.originalKey) 92 } 93 } 94 60 95 type network struct { 61 96 Network … … 65 100 conn *upstreamConn 66 101 channels channelCasemapMap 67 delivered delivered CasemapMap102 delivered deliveredStore 68 103 lastError error 69 104 casemap casemapping … … 82 117 stopped: make(chan struct{}), 83 118 channels: m, 84 delivered: deliveredCasemapMap{newCasemapMap(0)},119 delivered: newDeliveredStore(), 85 120 casemap: casemapRFC1459, 86 121 } … … 254 289 net.casemap = newCasemap 255 290 net.channels.SetCasemapping(newCasemap) 256 net.delivered. SetCasemapping(newCasemap)291 net.delivered.m.SetCasemapping(newCasemap) 257 292 if net.conn != nil { 258 293 net.conn.channels.SetCasemapping(newCasemap)
Note:
See TracChangeset
for help on using the changeset viewer.