rest.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package rest_websocket
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "git.ali33.ru/fcg-xvii/go-tools/json"
  7. "git.ali33.ru/fcg-xvii/rest"
  8. "github.com/gorilla/websocket"
  9. )
  10. type appConfig struct {
  11. app IApplication
  12. core any
  13. ctx context.Context
  14. tokenGenerator func(json.Map, int64) (string, error)
  15. }
  16. func New(app IApplication, core any) *Rest {
  17. return &Rest{
  18. upgrader: &websocket.Upgrader{
  19. ReadBufferSize: 1024,
  20. WriteBufferSize: 1024,
  21. },
  22. appConf: &appConfig{
  23. app: app,
  24. core: core,
  25. },
  26. }
  27. }
  28. type Rest struct {
  29. upgrader *websocket.Upgrader
  30. appConf *appConfig
  31. server rest.IServer
  32. }
  33. // Listen start server in other goroutine
  34. func (s *Rest) Prepare(server rest.IServer, httpPrefix string) {
  35. s.appConf.ctx = server.Context()
  36. s.appConf.tokenGenerator = server.TokenGenerate
  37. server.HandleFunc(httpPrefix, s.handle)
  38. s.server = server
  39. }
  40. func (s *Rest) handle(w http.ResponseWriter, r *http.Request) {
  41. // Преобразование HTTP соединения в WebSocket соединение
  42. ws, err := s.upgrader.Upgrade(w, r, nil)
  43. if err != nil {
  44. log.Println(err)
  45. }
  46. socket := newWebSocket(ws, s.appConf)
  47. s.appConf.app.Incoming() <- socket
  48. }