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  }