3
0
2019-08-14 17:07:56 +02:00

66 lines
1.6 KiB
Go

package websocket
import (
"context"
"net/http"
"github.com/go-chi/chi"
"go.uber.org/zap"
"github.com/cortezaproject/corteza-server/messaging/internal/repository"
"github.com/cortezaproject/corteza-server/messaging/internal/service"
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/pkg/sentry"
)
func middlewareAllowedAccess(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !service.DefaultAccessControl.CanAccess(r.Context()) {
http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
func Init(ctx context.Context, config *Config) *Websocket {
events := repository.Events()
go func() {
defer sentry.Recover()
for {
if err := eq.feedSessions(ctx, events, store); err != nil {
if err == context.Canceled {
return
}
logger.Default().Error("session event feed error", zap.Error(err))
}
}
}()
eq.store(ctx, events)
return Websocket{}.New(config)
}
func (ws Websocket) ApiServerRoutes(r chi.Router) {
r.Group(func(r chi.Router) {
r.Route("/websocket", func(r chi.Router) {
r.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// @todo make access control injectable
if !service.DefaultAccessControl.CanAccess(r.Context()) {
http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
})
r.Get("/", ws.Open)
})
})
}