1
0

config.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package server
  2. import (
  3. "io/fs"
  4. "net/netip"
  5. "time"
  6. )
  7. // Defines default config settings (excluding limits, see below)
  8. const (
  9. DefaultListenHTTP = ":80"
  10. DefaultCacheDuration = 12 * time.Hour
  11. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  12. DefaultManagerInterval = time.Minute
  13. DefaultDelayedSenderInterval = 10 * time.Second
  14. DefaultMinDelay = 10 * time.Second
  15. DefaultMaxDelay = 3 * 24 * time.Hour
  16. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  17. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  18. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  19. )
  20. // Defines all global and per-visitor limits
  21. // - message size limit: the max number of bytes for a message
  22. // - total topic limit: max number of topics overall
  23. // - various attachment limits
  24. const (
  25. DefaultMessageLengthLimit = 4096 // Bytes
  26. DefaultTotalTopicLimit = 15000
  27. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  28. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  29. DefaultAttachmentExpiryDuration = 3 * time.Hour
  30. )
  31. // Defines all per-visitor limits
  32. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  33. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  34. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  35. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  36. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  37. const (
  38. DefaultVisitorSubscriptionLimit = 30
  39. DefaultVisitorRequestLimitBurst = 60
  40. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  41. DefaultVisitorEmailLimitBurst = 16
  42. DefaultVisitorEmailLimitReplenish = time.Hour
  43. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  44. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  45. )
  46. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  47. type Config struct {
  48. BaseURL string
  49. ListenHTTP string
  50. ListenHTTPS string
  51. ListenUnix string
  52. ListenUnixMode fs.FileMode
  53. KeyFile string
  54. CertFile string
  55. FirebaseKeyFile string
  56. CacheFile string
  57. CacheDuration time.Duration
  58. CacheStartupQueries string
  59. CacheBatchSize int
  60. CacheBatchTimeout time.Duration
  61. AuthFile string
  62. AuthDefaultRead bool
  63. AuthDefaultWrite bool
  64. AttachmentCacheDir string
  65. AttachmentTotalSizeLimit int64
  66. AttachmentFileSizeLimit int64
  67. AttachmentExpiryDuration time.Duration
  68. KeepaliveInterval time.Duration
  69. ManagerInterval time.Duration
  70. WebRootIsApp bool
  71. DelayedSenderInterval time.Duration
  72. FirebaseKeepaliveInterval time.Duration
  73. FirebasePollInterval time.Duration
  74. FirebaseQuotaExceededPenaltyDuration time.Duration
  75. UpstreamBaseURL string
  76. SMTPSenderAddr string
  77. SMTPSenderUser string
  78. SMTPSenderPass string
  79. SMTPSenderFrom string
  80. SMTPServerListen string
  81. SMTPServerDomain string
  82. SMTPServerAddrPrefix string
  83. MessageLimit int
  84. MinDelay time.Duration
  85. MaxDelay time.Duration
  86. TotalTopicLimit int
  87. TotalAttachmentSizeLimit int64
  88. VisitorSubscriptionLimit int
  89. VisitorAttachmentTotalSizeLimit int64
  90. VisitorAttachmentDailyBandwidthLimit int
  91. VisitorRequestLimitBurst int
  92. VisitorRequestLimitReplenish time.Duration
  93. VisitorRequestExemptIPAddrs []netip.Prefix
  94. VisitorEmailLimitBurst int
  95. VisitorEmailLimitReplenish time.Duration
  96. BehindProxy bool
  97. EnableWeb bool
  98. Version string // injected by App
  99. }
  100. // NewConfig instantiates a default new server config
  101. func NewConfig() *Config {
  102. return &Config{
  103. BaseURL: "",
  104. ListenHTTP: DefaultListenHTTP,
  105. ListenHTTPS: "",
  106. ListenUnix: "",
  107. ListenUnixMode: 0,
  108. KeyFile: "",
  109. CertFile: "",
  110. FirebaseKeyFile: "",
  111. CacheFile: "",
  112. CacheDuration: DefaultCacheDuration,
  113. CacheBatchSize: 0,
  114. CacheBatchTimeout: 0,
  115. AuthFile: "",
  116. AuthDefaultRead: true,
  117. AuthDefaultWrite: true,
  118. AttachmentCacheDir: "",
  119. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  120. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  121. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  122. KeepaliveInterval: DefaultKeepaliveInterval,
  123. ManagerInterval: DefaultManagerInterval,
  124. MessageLimit: DefaultMessageLengthLimit,
  125. MinDelay: DefaultMinDelay,
  126. MaxDelay: DefaultMaxDelay,
  127. DelayedSenderInterval: DefaultDelayedSenderInterval,
  128. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  129. FirebasePollInterval: DefaultFirebasePollInterval,
  130. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  131. TotalTopicLimit: DefaultTotalTopicLimit,
  132. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  133. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  134. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  135. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  136. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  137. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  138. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  139. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  140. BehindProxy: false,
  141. EnableWeb: true,
  142. Version: "",
  143. }
  144. }