forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at spindle 2.7 kB view raw
1package config 2 3import ( 4 "context" 5 "fmt" 6 "net/url" 7 "time" 8 9 "github.com/sethvargo/go-envconfig" 10) 11 12type CoreConfig struct { 13 CookieSecret string `env:"COOKIE_SECRET, default=00000000000000000000000000000000"` 14 DbPath string `env:"DB_PATH, default=appview.db"` 15 ListenAddr string `env:"LISTEN_ADDR, default=0.0.0.0:3000"` 16 AppviewHost string `env:"APPVIEW_HOST, default=https://tangled.sh"` 17 Dev bool `env:"DEV, default=false"` 18} 19 20type OAuthConfig struct { 21 Jwks string `env:"JWKS"` 22} 23 24type JetstreamConfig struct { 25 Endpoint string `env:"ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"` 26} 27 28type KnotstreamConfig struct { 29 RetryInterval time.Duration `env:"RETRY_INTERVAL, default=60s"` 30 MaxRetryInterval time.Duration `env:"MAX_RETRY_INTERVAL, default=120m"` 31 ConnectionTimeout time.Duration `env:"CONNECTION_TIMEOUT, default=5s"` 32 WorkerCount int `env:"WORKER_COUNT, default=64"` 33 QueueSize int `env:"QUEUE_SIZE, default=100"` 34} 35 36type ResendConfig struct { 37 ApiKey string `env:"API_KEY"` 38 SentFrom string `env:"SENT_FROM, default=noreply@notifs.tangled.sh"` 39} 40 41type CamoConfig struct { 42 Host string `env:"HOST, default=https://camo.tangled.sh"` 43 SharedSecret string `env:"SHARED_SECRET"` 44} 45 46type AvatarConfig struct { 47 Host string `env:"HOST, default=https://avatar.tangled.sh"` 48 SharedSecret string `env:"SHARED_SECRET"` 49} 50 51type PosthogConfig struct { 52 ApiKey string `env:"API_KEY"` 53 Endpoint string `env:"ENDPOINT, default=https://eu.i.posthog.com"` 54} 55 56type RedisConfig struct { 57 Addr string `env:"ADDR, default=localhost:6379"` 58 Password string `env:"PASS"` 59 DB int `env:"DB, default=0"` 60} 61 62func (cfg RedisConfig) ToURL() string { 63 u := &url.URL{ 64 Scheme: "redis", 65 Host: cfg.Addr, 66 Path: fmt.Sprintf("/%d", cfg.DB), 67 } 68 69 if cfg.Password != "" { 70 u.User = url.UserPassword("", cfg.Password) 71 } 72 73 return u.String() 74} 75 76type Config struct { 77 Core CoreConfig `env:",prefix=TANGLED_"` 78 Jetstream JetstreamConfig `env:",prefix=TANGLED_JETSTREAM_"` 79 Knotstream KnotstreamConfig `env:",prefix=TANGLED_KNOTSTREAM_"` 80 Resend ResendConfig `env:",prefix=TANGLED_RESEND_"` 81 Posthog PosthogConfig `env:",prefix=TANGLED_POSTHOG_"` 82 Camo CamoConfig `env:",prefix=TANGLED_CAMO_"` 83 Avatar AvatarConfig `env:",prefix=TANGLED_AVATAR_"` 84 OAuth OAuthConfig `env:",prefix=TANGLED_OAUTH_"` 85 Redis RedisConfig `env:",prefix=TANGLED_REDIS_"` 86} 87 88func LoadConfig(ctx context.Context) (*Config, error) { 89 var cfg Config 90 err := envconfig.Process(ctx, &cfg) 91 if err != nil { 92 return nil, err 93 } 94 95 return &cfg, nil 96}