The codebase that powers boop.cat
boop.cat
1// Copyright 2025 boop.cat
2// Licensed under the Apache License, Version 2.0
3// See LICENSE file for details.
4
5package config
6
7import (
8 "os"
9 "strconv"
10 "strings"
11)
12
13type Config struct {
14 Port int
15 Env string
16 TrustProxy bool
17
18 DBPath string
19
20 SessionSecret string
21 CookieSecure bool
22
23 DeliveryMode string
24 EdgeRootDomain string
25
26 B2KeyID string
27 B2AppKey string
28 B2BucketID string
29 B2BucketName string
30
31 CFAPIToken string
32 CFAccountID string
33 CFZoneID string
34 CFKVNSRoutes string
35 CFKVNSFBound string
36
37 GitHubClientID string
38 GitHubClientSecret string
39 GoogleClientID string
40 GoogleClientSecret string
41 AtprotoPrivateKey string
42
43 AdminAPIKey string
44
45 RateAPIV1WindowMs int
46 RateAPIV1Max int
47}
48
49func Load() *Config {
50 return &Config{
51 Port: getEnvInt("PORT", 8787),
52 Env: getEnv("NODE_ENV", "development"),
53 TrustProxy: getEnvBool("TRUST_PROXY", false),
54
55 DBPath: getEnv("FSD_DB_PATH", ""),
56
57 SessionSecret: getEnv("SESSION_SECRET", ""),
58 CookieSecure: getEnvBool("COOKIE_SECURE", false),
59
60 DeliveryMode: strings.ToLower(getEnv("FSD_DELIVERY", "")),
61 EdgeRootDomain: strings.ToLower(strings.TrimSpace(getEnv("FSD_EDGE_ROOT_DOMAIN", ""))),
62
63 B2KeyID: getEnv("B2_KEY_ID", ""),
64 B2AppKey: getEnv("B2_APP_KEY", ""),
65 B2BucketID: getEnv("B2_BUCKET_ID", ""),
66 B2BucketName: getEnv("B2_BUCKET_NAME", ""),
67
68 CFAPIToken: getEnv("CF_API_TOKEN", ""),
69 CFAccountID: getEnv("CF_ACCOUNT_ID", ""),
70 CFZoneID: getEnv("CF_ZONE_ID", ""),
71 CFKVNSRoutes: getEnv("CF_KV_NS_ROUTES", ""),
72 CFKVNSFBound: getEnv("CF_KV_NS_FBOUND", ""),
73
74 GitHubClientID: getEnv("GITHUB_CLIENT_ID", ""),
75 GitHubClientSecret: getEnv("GITHUB_CLIENT_SECRET", ""),
76 GoogleClientID: getEnv("GOOGLE_CLIENT_ID", ""),
77 GoogleClientSecret: getEnv("GOOGLE_CLIENT_SECRET", ""),
78 AtprotoPrivateKey: getEnv("ATPROTO_PRIVATE_KEY_1", ""),
79
80 AdminAPIKey: getEnv("ADMIN_API_KEY", ""),
81
82 RateAPIV1WindowMs: getEnvInt("RATE_API_V1_WINDOW_MS", 15*60*1000),
83 RateAPIV1Max: getEnvInt("RATE_API_V1_MAX", 100),
84 }
85}
86
87func (c *Config) IsProd() bool {
88 return c.Env == "production"
89}
90
91func (c *Config) EdgeEnabled() bool {
92 return c.DeliveryMode == "edge" && c.EdgeRootDomain != ""
93}
94
95func getEnv(key, fallback string) string {
96 if v := os.Getenv(key); v != "" {
97 return v
98 }
99 return fallback
100}
101
102func getEnvInt(key string, fallback int) int {
103 if v := os.Getenv(key); v != "" {
104 if i, err := strconv.Atoi(v); err == nil {
105 return i
106 }
107 }
108 return fallback
109}
110
111func getEnvBool(key string, fallback bool) bool {
112 if v := os.Getenv(key); v != "" {
113 return v == "1" || v == "true"
114 }
115 return fallback
116}