eventmanager/eventmanager.go (95 lines of code) (raw):
package eventmanager
import (
"encoding/json"
"net/http"
"github.com/gorilla/websocket"
"github.com/sirupsen/logrus"
"gitlab.com/gitlab-org/webide-file-sync/common"
"gitlab.com/gitlab-org/webide-file-sync/filemanager"
"gitlab.com/gitlab-org/webide-file-sync/server"
"gitlab.com/gitlab-org/webide-file-sync/websocketserver"
)
// EventManager holds two objects: the Websocket server and the FileManager.
// This object is the coordinator among the incoming events, the git
// actions and the outcoming responses.
type EventManager struct {
server *server.Server
filemanager *filemanager.FileManager
}
// New instantiates a new EventManager
func New(path string, port int, origins []string) (*EventManager, error) {
fm, err := filemanager.New(path)
if err != nil {
return nil, err
}
server, serverErr := server.New(port, origins)
if serverErr != nil {
return nil, serverErr
}
em := &EventManager{server: server, filemanager: fm}
em.configureEvents()
return em, nil
}
// Start starts the Websocket Server
func (em *EventManager) Start() error {
return em.server.Serve()
}
// Stop stops the Websocket Server
func (em *EventManager) Stop() error {
return em.server.Close()
}
func (em *EventManager) configureEvents() {
em.eventServer().OnConnect("/files", func(conn *websocket.Conn) *common.Response {
em.logEvent("/files", "CONNECT", logrus.Fields{})
em.filemanager.Start()
return successResponse()
})
em.eventServer().OnDisconnect("/files", func(conn *websocket.Conn) *common.Response {
em.logEvent("/files", "DISCONNECT", logrus.Fields{})
em.filemanager.Stop()
return successResponse()
})
em.eventServer().OnEvent("/files", "PATCH", func(conn *websocket.Conn, payload json.RawMessage) *common.Response {
var request *common.PatchRequest
if err := json.Unmarshal(payload, &request); err != nil {
return jsonErrorResponse(err)
}
em.logEvent("/files", "PATCH", logrus.Fields{})
err := em.execPatch(request.Diff, request.DeleteFiles)
if err != nil {
em.logError("/files", "PATCH", err)
return errorResponse(err)
}
return successResponse()
})
fn := func(conn *websocket.Conn) *common.Response {
em.logEvent("/repository", "DELETE", logrus.Fields{})
err := em.execResetRepository()
if err != nil {
}
return successResponse()
}
em.eventServer().OnEvent(
"/repository",
"DELETE",
websocketserver.NoPayload(fn),
)
}
func (em *EventManager) eventServer() *websocketserver.Server {
return em.server.EventServer()
}
func (em *EventManager) logEvent(namespace string, event string, others map[string]interface{}) {
logrus.WithFields(logrus.Fields{
"namespace": namespace,
"event": event,
}).WithFields(others).Info("Received Event")
}
func (em *EventManager) logError(namespace string, event string, err error) {
logrus.WithFields(logrus.Fields{
"namespace": namespace,
"event": event,
}).Error(err.Error())
}
func jsonErrorResponse(err error) *common.Response {
return &common.Response{StatusCode: http.StatusBadRequest, ErrorMessage: "Decoding json failed:" + err.Error()}
}
func errorResponse(err *filemanager.Error) *common.Response {
return &common.Response{StatusCode: err.Code(), ErrorMessage: err.Error()}
}
func successResponse() *common.Response {
return &common.Response{StatusCode: http.StatusOK}
}