in router/core/router.go [931:1070]
func (r *Router) buildClients() error {
s3Providers := map[string]config.S3StorageProvider{}
cdnProviders := map[string]config.BaseStorageProvider{}
redisProviders := map[string]config.RedisStorageProvider{}
for _, provider := range r.storageProviders.S3 {
if _, ok := s3Providers[provider.ID]; ok {
return fmt.Errorf("duplicate s3 storage provider with id '%s'", provider.ID)
}
s3Providers[provider.ID] = provider
}
for _, provider := range r.storageProviders.CDN {
if _, ok := cdnProviders[provider.ID]; ok {
return fmt.Errorf("duplicate cdn storage provider with id '%s'", provider.ID)
}
cdnProviders[provider.ID] = provider
}
for _, provider := range r.storageProviders.Redis {
if _, ok := redisProviders[provider.ID]; ok {
return fmt.Errorf("duplicate Redis storage provider with id '%s'", provider.ID)
}
redisProviders[provider.ID] = provider
}
var pClient persistedoperation.Client
if provider, ok := cdnProviders[r.persistedOperationsConfig.Storage.ProviderID]; ok {
if r.graphApiToken == "" {
return errors.New("graph token is required to fetch persisted operations from CDN")
}
c, err := cdn.NewClient(provider.URL, r.graphApiToken, cdn.Options{
Logger: r.logger,
})
if err != nil {
return err
}
pClient = c
r.logger.Info("Use CDN as storage provider for persisted operations",
zap.String("provider_id", provider.ID),
)
} else if provider, ok := s3Providers[r.persistedOperationsConfig.Storage.ProviderID]; ok {
c, err := s3.NewClient(provider.Endpoint, &s3.Options{
AccessKeyID: provider.AccessKey,
SecretAccessKey: provider.SecretKey,
Region: provider.Region,
UseSSL: provider.Secure,
BucketName: provider.Bucket,
ObjectPathPrefix: r.persistedOperationsConfig.Storage.ObjectPrefix,
TraceProvider: r.tracerProvider,
})
if err != nil {
return err
}
pClient = c
r.logger.Info("Use S3 as storage provider for persisted operations",
zap.String("provider_id", provider.ID),
)
} else if r.graphApiToken != "" {
if r.persistedOperationsConfig.Storage.ProviderID != "" {
return fmt.Errorf("unknown storage provider id '%s' for persisted operations", r.persistedOperationsConfig.Storage.ProviderID)
}
c, err := cdn.NewClient(r.cdnConfig.URL, r.graphApiToken, cdn.Options{
Logger: r.logger,
})
if err != nil {
return err
}
pClient = c
r.logger.Debug("Default to Cosmo CDN as persisted operations provider",
zap.String("url", r.cdnConfig.URL),
)
}
var kvClient apq.KVClient
if provider, ok := redisProviders[r.automaticPersistedQueriesConfig.Storage.ProviderID]; ok {
c, err := apq.NewRedisClient(&apq.RedisOptions{
Logger: r.logger,
StorageConfig: &provider,
Prefix: r.automaticPersistedQueriesConfig.Storage.ObjectPrefix,
})
if err != nil {
return err
}
kvClient = c
r.logger.Info("Use redis as storage provider for automatic persisted operations",
zap.String("provider_id", provider.ID),
)
}
var apqClient apq.Client
if r.automaticPersistedQueriesConfig.Enabled {
var err error
apqClient, err = apq.NewClient(&apq.Options{
Logger: r.logger,
ApqConfig: &r.automaticPersistedQueriesConfig,
KVClient: kvClient,
})
if err != nil {
return err
}
}
if pClient != nil || apqClient != nil {
// For backwards compatibility with cdn config field
cacheSize := r.persistedOperationsConfig.Cache.Size.Uint64()
if cacheSize <= 0 {
cacheSize = r.cdnConfig.CacheSize.Uint64()
}
c, err := persistedoperation.NewClient(&persistedoperation.Options{
CacheSize: cacheSize,
Logger: r.logger,
ProviderClient: pClient,
ApqClient: apqClient,
})
if err != nil {
return err
}
r.persistedOperationClient = c
}
configPoller, err := InitializeConfigPoller(r, cdnProviders, s3Providers)
if err != nil {
return err
}
if configPoller != nil {
r.configPoller = *configPoller
}
return nil
}