Notify P2P participants after HTTP forwarding
This commit is contained in:
@@ -9028,6 +9028,47 @@ func broadcastHTTPForwardMessage(tenantID types.TenantID, msg *types.Message) {
|
|||||||
default:
|
default:
|
||||||
logs.Warn.Printf("im message forward: hub route queue full topic=%s seq=%d", msg.Topic, msg.SeqId)
|
logs.Warn.Printf("im message forward: hub route queue full topic=%s seq=%d", msg.Topic, msg.SeqId)
|
||||||
}
|
}
|
||||||
|
broadcastHTTPForwardPresence(tenantID, msg, timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func broadcastHTTPForwardPresence(tenantID types.TenantID, msg *types.Message, timestamp time.Time) {
|
||||||
|
if globals.hub == nil || msg == nil || msg.SeqId <= 0 || msg.Topic == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uid1, uid2, err := types.ParseP2P(msg.Topic)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
from := types.ParseUid(msg.From).UserId()
|
||||||
|
for _, rcpt := range []struct {
|
||||||
|
uid types.Uid
|
||||||
|
src string
|
||||||
|
}{
|
||||||
|
{uid: uid1, src: uid2.UserId()},
|
||||||
|
{uid: uid2, src: uid1.UserId()},
|
||||||
|
} {
|
||||||
|
actor := from
|
||||||
|
if actor == rcpt.uid.UserId() {
|
||||||
|
actor = ""
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case globals.hub.routeSrv <- &ServerComMessage{
|
||||||
|
TenantID: tenantID,
|
||||||
|
RcptTo: rcpt.uid.UserId(),
|
||||||
|
Timestamp: timestamp,
|
||||||
|
Pres: &MsgServerPres{
|
||||||
|
Topic: "me",
|
||||||
|
What: "msg",
|
||||||
|
Src: rcpt.src,
|
||||||
|
SeqId: msg.SeqId,
|
||||||
|
AcsActor: actor,
|
||||||
|
SkipTopic: msg.Topic,
|
||||||
|
},
|
||||||
|
}:
|
||||||
|
default:
|
||||||
|
logs.Warn.Printf("im message forward: hub presence queue full topic=%s seq=%d user=%s", msg.Topic, msg.SeqId, rcpt.uid.UserId())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func forwardedMessageHead(msg *types.Message, clientMid string) types.KVMap {
|
func forwardedMessageHead(msg *types.Message, clientMid string) types.KVMap {
|
||||||
|
|||||||
+19
-1
@@ -4793,7 +4793,7 @@ func TestServeIMMessageForwardKafkaAssignsSeqAndBroadcasts(t *testing.T) {
|
|||||||
topics := mock_store.NewMockTopicsPersistenceInterface(ctrl)
|
topics := mock_store.NewMockTopicsPersistenceInterface(ctrl)
|
||||||
messages := mock_store.NewMockMessagesPersistenceInterface(ctrl)
|
messages := mock_store.NewMockMessagesPersistenceInterface(ctrl)
|
||||||
kafkaBus = &kafkaRuntime{}
|
kafkaBus = &kafkaRuntime{}
|
||||||
globals.hub = &Hub{routeSrv: make(chan *ServerComMessage, 1)}
|
globals.hub = &Hub{routeSrv: make(chan *ServerComMessage, 3)}
|
||||||
store.Subs = subs
|
store.Subs = subs
|
||||||
store.Topics = topics
|
store.Topics = topics
|
||||||
store.Messages = messages
|
store.Messages = messages
|
||||||
@@ -4883,6 +4883,24 @@ func TestServeIMMessageForwardKafkaAssignsSeqAndBroadcasts(t *testing.T) {
|
|||||||
default:
|
default:
|
||||||
t.Fatal("expected forwarded message to be broadcast")
|
t.Fatal("expected forwarded message to be broadcast")
|
||||||
}
|
}
|
||||||
|
presByUser := make(map[string]*MsgServerPres)
|
||||||
|
for range 2 {
|
||||||
|
select {
|
||||||
|
case delivered := <-globals.hub.routeSrv:
|
||||||
|
if delivered.Pres == nil {
|
||||||
|
t.Fatalf("unexpected non-presence message: %#v", delivered)
|
||||||
|
}
|
||||||
|
presByUser[delivered.RcptTo] = delivered.Pres
|
||||||
|
default:
|
||||||
|
t.Fatal("expected forwarded message presence notifications")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pres := presByUser[types.Uid(42).UserId()]; pres == nil || pres.Topic != "me" || pres.What != "msg" || pres.Src != targetUser.UserId() || pres.SeqId != 35 || pres.AcsActor != "" || pres.SkipTopic != targetTopic {
|
||||||
|
t.Fatalf("unexpected sender presence: %#v", pres)
|
||||||
|
}
|
||||||
|
if pres := presByUser[targetUser.UserId()]; pres == nil || pres.Topic != "me" || pres.What != "msg" || pres.Src != types.Uid(42).UserId() || pres.SeqId != 35 || pres.AcsActor != types.Uid(42).UserId() || pres.SkipTopic != targetTopic {
|
||||||
|
t.Fatalf("unexpected receiver presence: %#v", pres)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServeIMMessageForwardBundleSavesForwardBundle(t *testing.T) {
|
func TestServeIMMessageForwardBundleSavesForwardBundle(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user