github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/wsapi/websocket_handler.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package wsapi
     5  
     6  import (
     7  	"net/http"
     8  
     9  	"github.com/masterhung0112/hk_server/v5/app"
    10  	"github.com/masterhung0112/hk_server/v5/model"
    11  	"github.com/masterhung0112/hk_server/v5/shared/i18n"
    12  	"github.com/masterhung0112/hk_server/v5/shared/mlog"
    13  )
    14  
    15  func (api *API) ApiWebSocketHandler(wh func(*model.WebSocketRequest) (map[string]interface{}, *model.AppError)) webSocketHandler {
    16  	return webSocketHandler{api.App, wh}
    17  }
    18  
    19  type webSocketHandler struct {
    20  	app         *app.App
    21  	handlerFunc func(*model.WebSocketRequest) (map[string]interface{}, *model.AppError)
    22  }
    23  
    24  func (wh webSocketHandler) ServeWebSocket(conn *app.WebConn, r *model.WebSocketRequest) {
    25  	mlog.Debug("Websocket request", mlog.String("action", r.Action))
    26  
    27  	hub := wh.app.GetHubForUserId(conn.UserId)
    28  	if hub == nil {
    29  		return
    30  	}
    31  	session, sessionErr := wh.app.GetSession(conn.GetSessionToken())
    32  	defer wh.app.ReturnSessionToPool(session)
    33  
    34  	if sessionErr != nil {
    35  		mlog.Error(
    36  			"websocket session error",
    37  			mlog.String("action", r.Action),
    38  			mlog.Int64("seq", r.Seq),
    39  			mlog.String("user_id", conn.UserId),
    40  			mlog.String("error_message", sessionErr.SystemMessage(i18n.T)),
    41  			mlog.Err(sessionErr),
    42  		)
    43  		sessionErr.DetailedError = ""
    44  		errResp := model.NewWebSocketError(r.Seq, sessionErr)
    45  		hub.SendMessage(conn, errResp)
    46  		return
    47  	}
    48  
    49  	r.Session = *session
    50  	r.T = conn.T
    51  	r.Locale = conn.Locale
    52  
    53  	var data map[string]interface{}
    54  	var err *model.AppError
    55  
    56  	if data, err = wh.handlerFunc(r); err != nil {
    57  		mlog.Error(
    58  			"websocket request handling error",
    59  			mlog.String("action", r.Action),
    60  			mlog.Int64("seq", r.Seq),
    61  			mlog.String("user_id", conn.UserId),
    62  			mlog.String("error_message", err.SystemMessage(i18n.T)),
    63  			mlog.Err(err),
    64  		)
    65  		err.DetailedError = ""
    66  		errResp := model.NewWebSocketError(r.Seq, err)
    67  		hub.SendMessage(conn, errResp)
    68  		return
    69  	}
    70  
    71  	resp := model.NewWebSocketResponse(model.STATUS_OK, r.Seq, data)
    72  	hub.SendMessage(conn, resp)
    73  }
    74  
    75  func NewInvalidWebSocketParamError(action string, name string) *model.AppError {
    76  	return model.NewAppError("websocket: "+action, "api.websocket_handler.invalid_param.app_error", map[string]interface{}{"Name": name}, "", http.StatusBadRequest)
    77  }
    78  
    79  func NewServerBusyWebSocketError(action string) *model.AppError {
    80  	return model.NewAppError("websocket: "+action, "api.websocket_handler.server_busy.app_error", nil, "", http.StatusServiceUnavailable)
    81  }