main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package main
  2. import (
  3. "fmt"
  4. "log/slog"
  5. "os"
  6. "sync"
  7. "github.com/mkaminski/goaim/handler"
  8. "github.com/mkaminski/goaim/state"
  9. "github.com/kelseyhightower/envconfig"
  10. "github.com/mkaminski/goaim/server"
  11. )
  12. func main() {
  13. var cfg server.Config
  14. err := envconfig.Process("", &cfg)
  15. if err != nil {
  16. _, _ = fmt.Fprintf(os.Stderr, "unable to process app config: %s", err.Error())
  17. os.Exit(1)
  18. }
  19. feedbagStore, err := state.NewSQLiteFeedbagStore(cfg.DBPath)
  20. if err != nil {
  21. _, _ = fmt.Fprintf(os.Stderr, "unable to create feedbag store: %s", err.Error())
  22. os.Exit(1)
  23. }
  24. logger := server.NewLogger(cfg)
  25. sessionManager := state.NewSessionManager(logger)
  26. chatRegistry := state.NewChatRegistry()
  27. wg := sync.WaitGroup{}
  28. wg.Add(4)
  29. go func() {
  30. server.StartManagementAPI(feedbagStore, logger)
  31. wg.Done()
  32. }()
  33. go func(logger *slog.Logger) {
  34. logger = logger.With("svc", "BOS")
  35. authHandler := handler.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry)
  36. buddyHandler := handler.NewBuddyService()
  37. oserviceHandler := handler.NewOServiceService(cfg, sessionManager, feedbagStore)
  38. oserviceBOSHandler := handler.NewOServiceServiceForBOS(*oserviceHandler, chatRegistry)
  39. locateHandler := handler.NewLocateService(sessionManager, feedbagStore, feedbagStore)
  40. newChatSessMgr := func() handler.SessionManager { return state.NewSessionManager(logger) }
  41. chatNavHandler := handler.NewChatNavService(logger, chatRegistry, newChatSessMgr)
  42. feedbagHandler := handler.NewFeedbagService(sessionManager, feedbagStore)
  43. icbmHandler := handler.NewICBMService(sessionManager, feedbagStore)
  44. server.BOSService{
  45. AlertRouter: server.NewAlertRouter(logger),
  46. AuthHandler: authHandler,
  47. BuddyRouter: server.NewBuddyRouter(logger, buddyHandler),
  48. ChatNavRouter: server.NewChatNavRouter(chatNavHandler, logger),
  49. FeedbagRouter: server.NewFeedbagRouter(logger, feedbagHandler),
  50. ICBMRouter: server.NewICBMRouter(logger, icbmHandler),
  51. LocateRouter: server.NewLocateRouter(locateHandler, logger),
  52. OServiceBOSRouter: server.NewOServiceRouterForBOS(logger, oserviceHandler, oserviceBOSHandler),
  53. Config: cfg,
  54. RouteLogger: server.RouteLogger{
  55. Logger: logger,
  56. },
  57. }.Start()
  58. wg.Done()
  59. }(logger)
  60. go func(logger *slog.Logger) {
  61. logger = logger.With("svc", "CHAT")
  62. authHandler := handler.NewAuthService(cfg, sessionManager, sessionManager, feedbagStore, feedbagStore, chatRegistry)
  63. oserviceHandler := handler.NewOServiceService(cfg, sessionManager, feedbagStore)
  64. chatHandler := handler.NewChatService(chatRegistry)
  65. oserviceChatHandler := handler.NewOServiceServiceForChat(*oserviceHandler, chatRegistry)
  66. server.ChatService{
  67. AuthHandler: authHandler,
  68. OServiceChatRouter: server.NewOServiceRouterForChat(logger, oserviceHandler, oserviceChatHandler),
  69. ChatRouter: server.NewChatRouter(logger, chatHandler),
  70. Config: cfg,
  71. RouteLogger: server.RouteLogger{
  72. Logger: logger,
  73. },
  74. }.Start()
  75. wg.Done()
  76. }(logger)
  77. go func(logger *slog.Logger) {
  78. logger = logger.With("svc", "AUTH")
  79. authHandler := handler.NewAuthService(cfg, sessionManager, nil, feedbagStore, feedbagStore, chatRegistry)
  80. server.AuthService{
  81. AuthHandler: authHandler,
  82. Config: cfg,
  83. RouteLogger: server.RouteLogger{
  84. Logger: logger,
  85. },
  86. }.Start()
  87. wg.Done()
  88. }(logger)
  89. wg.Wait()
  90. }