github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/services/remotecluster/recv.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package remotecluster 5 6 import ( 7 "fmt" 8 9 "github.com/masterhung0112/hk_server/v5/model" 10 "github.com/masterhung0112/hk_server/v5/shared/mlog" 11 ) 12 13 // ReceiveIncomingMsg is called by the Rest API layer, or websocket layer (future), when a Remote Cluster 14 // message is received. Here we route the message to any topic listeners. 15 // `rc` and `msg` cannot be nil. 16 func (rcs *Service) ReceiveIncomingMsg(rc *model.RemoteCluster, msg model.RemoteClusterMsg) Response { 17 rcs.mux.RLock() 18 defer rcs.mux.RUnlock() 19 20 if metrics := rcs.server.GetMetrics(); metrics != nil { 21 metrics.IncrementRemoteClusterMsgReceivedCounter(rc.RemoteId) 22 } 23 24 rcSanitized := *rc 25 rcSanitized.Token = "" 26 rcSanitized.RemoteToken = "" 27 28 var response Response 29 response.Status = ResponseStatusOK 30 31 listeners := rcs.getTopicListeners(msg.Topic) 32 33 for _, l := range listeners { 34 if err := callback(l, msg, &rcSanitized, &response); err != nil { 35 rcs.server.GetLogger().Log(mlog.LvlRemoteClusterServiceError, "Error from remote cluster message listener", 36 mlog.String("msgId", msg.Id), mlog.String("topic", msg.Topic), mlog.String("remote", rc.DisplayName), mlog.Err(err)) 37 38 response.Status = ResponseStatusFail 39 response.Err = err.Error() 40 } 41 } 42 return response 43 } 44 45 func callback(listener TopicListener, msg model.RemoteClusterMsg, rc *model.RemoteCluster, resp *Response) (err error) { 46 defer func() { 47 if r := recover(); r != nil { 48 err = fmt.Errorf("%v", r) 49 } 50 }() 51 err = listener(msg, rc, resp) 52 return 53 }