104 lines
3.0 KiB
Go
Executable File
104 lines
3.0 KiB
Go
Executable File
package service
|
|
|
|
import (
|
|
"acc-server-manager/local/platform"
|
|
"acc-server-manager/local/repository"
|
|
"acc-server-manager/local/utl/docker"
|
|
"acc-server-manager/local/utl/env"
|
|
"acc-server-manager/local/utl/logging"
|
|
"acc-server-manager/local/utl/network"
|
|
"fmt"
|
|
|
|
dockerclient "github.com/docker/docker/client"
|
|
"go.uber.org/dig"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// InitializeServices registers all service providers into the DI container.
|
|
// Platform-specific components (ServerRuntime, FirewallManager, LogStreamer)
|
|
// are conditionally provided based on the PLATFORM environment variable.
|
|
func InitializeServices(c *dig.Container) {
|
|
logging.Debug("Initializing repositories")
|
|
repository.InitializeRepositories(c)
|
|
|
|
logging.Debug("Registering services")
|
|
c.Provide(NewSteamService)
|
|
c.Provide(NewActivityLogService)
|
|
c.Provide(NewServerService)
|
|
c.Provide(NewStateHistoryService)
|
|
c.Provide(NewServiceControlService)
|
|
c.Provide(NewConfigService)
|
|
c.Provide(NewLookupService)
|
|
c.Provide(NewMembershipService)
|
|
c.Provide(NewWebSocketService)
|
|
c.Provide(NewLeaderboardService)
|
|
c.Provide(NewConfigPresetService)
|
|
|
|
// Always provide the PortPoolManager; in Windows mode it seeds from an
|
|
// empty result set and sits idle.
|
|
c.Provide(func(db *gorm.DB) (*network.PortPoolManager, error) {
|
|
return network.NewPortPoolManager(db)
|
|
})
|
|
|
|
if env.IsDockerPlatform() {
|
|
registerDockerProviders(c)
|
|
} else {
|
|
registerWindowsProviders(c)
|
|
}
|
|
|
|
logging.Debug("Initializing service dependencies")
|
|
err := c.Invoke(func(server *ServerService, api *ServiceControlService, config *ConfigService) {
|
|
logging.Debug("Setting up service cross-references")
|
|
api.SetServerService(server)
|
|
config.SetServerService(server)
|
|
})
|
|
if err != nil {
|
|
logging.Panic("unable to initialize services: " + err.Error())
|
|
}
|
|
logging.Debug("Completed service initialization")
|
|
}
|
|
|
|
func registerWindowsProviders(c *dig.Container) {
|
|
logging.Debug("Registering Windows platform providers")
|
|
|
|
c.Provide(NewWindowsService)
|
|
|
|
c.Provide(func(ws *WindowsService, repo *repository.ServerRepository) platform.ServerRuntime {
|
|
return NewWindowsRuntime(ws, repo)
|
|
})
|
|
|
|
c.Provide(func() platform.FirewallManager {
|
|
return NewFirewallService()
|
|
})
|
|
|
|
c.Provide(func() platform.LogStreamer {
|
|
return NewFileLogStreamer()
|
|
})
|
|
}
|
|
|
|
func registerDockerProviders(c *dig.Container) {
|
|
logging.Debug("Registering Docker platform providers")
|
|
|
|
if err := c.Provide(func() (*dockerclient.Client, error) {
|
|
client, err := docker.NewDockerClient()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to connect to Docker daemon: %v", err)
|
|
}
|
|
return client, nil
|
|
}); err != nil {
|
|
logging.Panic("failed to provide Docker client: " + err.Error())
|
|
}
|
|
|
|
c.Provide(func(client *dockerclient.Client, repo *repository.ServerRepository) platform.ServerRuntime {
|
|
return NewDockerRuntime(client, repo)
|
|
})
|
|
|
|
c.Provide(func() platform.FirewallManager {
|
|
return &NoOpFirewall{}
|
|
})
|
|
|
|
c.Provide(func(client *dockerclient.Client) platform.LogStreamer {
|
|
return NewDockerLogStreamer(client)
|
|
})
|
|
}
|