mirror of
https://github.com/elyby/chrly.git
synced 2024-11-26 16:51:59 +05:30
3f81a0c18a
Implemented graceful server shutdown Extract records manipulating API into separate handlers group
150 lines
4.4 KiB
Go
150 lines
4.4 KiB
Go
package di
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"time"
|
|
|
|
"github.com/goava/di"
|
|
"github.com/spf13/viper"
|
|
|
|
es "github.com/elyby/chrly/eventsubscribers"
|
|
"github.com/elyby/chrly/http"
|
|
"github.com/elyby/chrly/mojangtextures"
|
|
)
|
|
|
|
var mojangTextures = di.Options(
|
|
di.Provide(newMojangTexturesProviderFactory),
|
|
di.Provide(newMojangTexturesProvider),
|
|
di.Provide(newMojangTexturesUuidsProviderFactory),
|
|
di.Provide(newMojangTexturesBatchUUIDsProvider),
|
|
di.Provide(newMojangTexturesRemoteUUIDsProvider),
|
|
di.Provide(newMojangSignedTexturesProvider),
|
|
di.Provide(newMojangTexturesStorageFactory),
|
|
)
|
|
|
|
func newMojangTexturesProviderFactory(
|
|
container *di.Container,
|
|
config *viper.Viper,
|
|
) (http.MojangTexturesProvider, error) {
|
|
config.SetDefault("mojang_textures.enabled", true)
|
|
if !config.GetBool("mojang_textures.enabled") {
|
|
return &mojangtextures.NilProvider{}, nil
|
|
}
|
|
|
|
var provider *mojangtextures.Provider
|
|
err := container.Resolve(&provider)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return provider, nil
|
|
}
|
|
|
|
func newMojangTexturesProvider(
|
|
emitter mojangtextures.Emitter,
|
|
uuidsProvider mojangtextures.UUIDsProvider,
|
|
texturesProvider mojangtextures.TexturesProvider,
|
|
storage mojangtextures.Storage,
|
|
) *mojangtextures.Provider {
|
|
return &mojangtextures.Provider{
|
|
Emitter: emitter,
|
|
UUIDsProvider: uuidsProvider,
|
|
TexturesProvider: texturesProvider,
|
|
Storage: storage,
|
|
}
|
|
}
|
|
|
|
func newMojangTexturesUuidsProviderFactory(
|
|
config *viper.Viper,
|
|
container *di.Container,
|
|
) (mojangtextures.UUIDsProvider, error) {
|
|
preferredUuidsProvider := config.GetString("mojang_textures.uuids_provider.driver")
|
|
if preferredUuidsProvider == "remote" {
|
|
var provider *mojangtextures.RemoteApiUuidsProvider
|
|
err := container.Resolve(&provider)
|
|
|
|
return provider, err
|
|
}
|
|
|
|
var provider *mojangtextures.BatchUuidsProvider
|
|
err := container.Resolve(&provider)
|
|
|
|
return provider, err
|
|
}
|
|
|
|
func newMojangTexturesBatchUUIDsProvider(
|
|
container *di.Container,
|
|
config *viper.Viper,
|
|
emitter mojangtextures.Emitter,
|
|
) (*mojangtextures.BatchUuidsProvider, error) {
|
|
// TODO: remove usage of di.WithName() when https://github.com/goava/di/issues/11 will be resolved
|
|
if err := container.Provide(func(emitter es.Subscriber, config *viper.Viper) *namedHealthChecker {
|
|
config.SetDefault("healthcheck.mojang_batch_uuids_provider_cool_down_duration", time.Minute)
|
|
|
|
return &namedHealthChecker{
|
|
Name: "mojang-batch-uuids-provider-response",
|
|
Checker: es.MojangBatchUuidsProviderResponseChecker(
|
|
emitter,
|
|
config.GetDuration("healthcheck.mojang_batch_uuids_provider_cool_down_duration"),
|
|
),
|
|
}
|
|
}, di.As(new(namedHealthCheckerInterface)), di.WithName("mojangBatchUuidsProviderResponseChecker")); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := container.Provide(func(emitter es.Subscriber, config *viper.Viper) *namedHealthChecker {
|
|
config.SetDefault("healthcheck.mojang_batch_uuids_provider_queue_length_limit", 50)
|
|
|
|
return &namedHealthChecker{
|
|
Name: "mojang-batch-uuids-provider-queue-length",
|
|
Checker: es.MojangBatchUuidsProviderQueueLengthChecker(
|
|
emitter,
|
|
config.GetInt("healthcheck.mojang_batch_uuids_provider_queue_length_limit"),
|
|
),
|
|
}
|
|
}, di.As(new(namedHealthCheckerInterface)), di.WithName("mojangBatchUuidsProviderQueueLengthChecker")); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
config.SetDefault("queue.loop_delay", 2*time.Second+500*time.Millisecond)
|
|
config.SetDefault("queue.batch_size", 10)
|
|
|
|
return &mojangtextures.BatchUuidsProvider{
|
|
Emitter: emitter,
|
|
IterationDelay: config.GetDuration("queue.loop_delay"),
|
|
IterationSize: config.GetInt("queue.batch_size"),
|
|
}, nil
|
|
}
|
|
|
|
func newMojangTexturesRemoteUUIDsProvider(
|
|
config *viper.Viper,
|
|
emitter mojangtextures.Emitter,
|
|
) (*mojangtextures.RemoteApiUuidsProvider, error) {
|
|
remoteUrl, err := url.Parse(config.GetString("mojang_textures.uuids_provider.url"))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to parse remote url: %w", err)
|
|
}
|
|
|
|
return &mojangtextures.RemoteApiUuidsProvider{
|
|
Emitter: emitter,
|
|
Url: *remoteUrl,
|
|
}, nil
|
|
}
|
|
|
|
func newMojangSignedTexturesProvider(emitter mojangtextures.Emitter) mojangtextures.TexturesProvider {
|
|
return &mojangtextures.MojangApiTexturesProvider{
|
|
Emitter: emitter,
|
|
}
|
|
}
|
|
|
|
func newMojangTexturesStorageFactory(
|
|
uuidsStorage mojangtextures.UuidsStorage,
|
|
texturesStorage mojangtextures.TexturesStorage,
|
|
) mojangtextures.Storage {
|
|
return &mojangtextures.SeparatedStorage{
|
|
UuidsStorage: uuidsStorage,
|
|
TexturesStorage: texturesStorage,
|
|
}
|
|
}
|