Live video on the AT Protocol
1package spxrpc
2
3import (
4 "context"
5 "net/http"
6
7 "github.com/labstack/echo/v4"
8 "github.com/streamplace/oatproxy/pkg/oatproxy"
9 "stream.place/streamplace/pkg/config"
10 "stream.place/streamplace/pkg/log"
11 "stream.place/streamplace/pkg/model"
12)
13
14type Server struct {
15 e *echo.Echo
16 cli *config.CLI
17 model model.Model
18}
19
20func NewServer(ctx context.Context, cli *config.CLI, model model.Model, op *oatproxy.OATProxy) (*Server, error) {
21 e := echo.New()
22 s := &Server{
23 e: e,
24 cli: cli,
25 model: model,
26 }
27 e.Use(s.ErrorHandlingMiddleware())
28 e.Use(op.OAuthMiddleware)
29 err := s.RegisterHandlersPlaceStream(e)
30 if err != nil {
31 return nil, err
32 }
33 err = s.RegisterHandlersAppBsky(e)
34 if err != nil {
35 return nil, err
36 }
37 err = s.RegisterHandlersComAtproto(e)
38 if err != nil {
39 return nil, err
40 }
41 e.GET("/xrpc/*", s.HandleWildcard)
42 e.POST("/xrpc/*", s.HandleWildcard)
43 return s, nil
44}
45
46func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
47 s.e.ServeHTTP(w, r)
48}
49
50func (s *Server) ErrorHandlingMiddleware() echo.MiddlewareFunc {
51 return func(next echo.HandlerFunc) echo.HandlerFunc {
52 return func(c echo.Context) error {
53 err := next(c)
54 if err == nil {
55 return nil
56 }
57 httpError, ok := err.(*echo.HTTPError)
58 if ok {
59 log.Error(c.Request().Context(), "http error", "code", httpError.Code, "message", httpError.Message, "internal", httpError.Internal)
60 return err
61 }
62 log.Error(c.Request().Context(), "unhandled error", "error", err)
63 return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
64 }
65 }
66}