added routes and auth for devices and users for MediaMTX server
This commit is contained in:
@@ -10,6 +10,13 @@ import (
|
||||
"smoop-api/internal/vault"
|
||||
)
|
||||
|
||||
type MediaMTXConfig struct {
|
||||
APIBase string // e.g. "http://mediamtx:9997"
|
||||
WebRTCBaseURL string // e.g. "http://mediamtx:8889"
|
||||
PublicBaseURL string // e.g. "https://your-host" (for HLS/WHEP URLs returned to SPA)
|
||||
TokenTTL time.Duration // default ~180s
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
DB struct {
|
||||
DSN string
|
||||
@@ -23,6 +30,7 @@ type Config struct {
|
||||
LivestreamBucket string
|
||||
PresignTTL time.Duration
|
||||
}
|
||||
MediaMTX MediaMTXConfig
|
||||
JWTSecret []byte
|
||||
}
|
||||
|
||||
@@ -60,6 +68,12 @@ func Load() (*Config, error) {
|
||||
}
|
||||
return v, nil
|
||||
}
|
||||
// getStrOpt := func(k, def string) string {
|
||||
// if v, ok := raw[k].(string); ok && v != "" {
|
||||
// return v
|
||||
// }
|
||||
// return def
|
||||
// }
|
||||
getBool := func(k string) (bool, error) {
|
||||
v, ok := raw[k]
|
||||
if !ok {
|
||||
@@ -77,6 +91,32 @@ func Load() (*Config, error) {
|
||||
return false, fmt.Errorf("invalid bool for key %s", k)
|
||||
}
|
||||
}
|
||||
getTTL := func(k string, def time.Duration) time.Duration {
|
||||
if v, ok := raw[k].(string); ok && strings.TrimSpace(v) != "" {
|
||||
if n, err := strconv.Atoi(strings.TrimSpace(v)); err == nil && n > 0 {
|
||||
return time.Duration(n) * time.Second
|
||||
}
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
// --- NEW: MediaMTX config FROM ENV (NOT from Vault)
|
||||
getRequiredEnv := func(k string) (string, error) {
|
||||
v := strings.TrimSpace(os.Getenv(k))
|
||||
if v == "" {
|
||||
return "", fmt.Errorf("missing required env %s", k)
|
||||
}
|
||||
return v, nil
|
||||
}
|
||||
|
||||
getIntEnv := func(k string, def int) int {
|
||||
if v := strings.TrimSpace(os.Getenv(k)); v != "" {
|
||||
if n, err := strconv.Atoi(v); err == nil {
|
||||
return n
|
||||
}
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
dbDSN, err := getStr("db_dsn")
|
||||
if err != nil {
|
||||
@@ -111,14 +151,29 @@ func Load() (*Config, error) {
|
||||
if v, ok := raw["minio_livestream_bucket"].(string); ok && v != "" {
|
||||
liveBucket = v
|
||||
}
|
||||
presignTTL := 15 * time.Minute
|
||||
if v, ok := raw["minio_presign_ttl_seconds"].(string); ok && v != "" {
|
||||
var sec int
|
||||
fmt.Sscanf(v, "%d", &sec)
|
||||
if sec > 0 {
|
||||
presignTTL = time.Duration(sec) * time.Second
|
||||
}
|
||||
// presignTTL := 15 * time.Minute
|
||||
// if v, ok := raw["minio_presign_ttl_seconds"].(string); ok && v != "" {
|
||||
// var sec int
|
||||
// fmt.Sscanf(v, "%d", &sec)
|
||||
// if sec > 0 {
|
||||
// presignTTL = time.Duration(sec) * time.Second
|
||||
// }
|
||||
// }
|
||||
presignTTL := getTTL("minio_presign_ttl_seconds", 15*time.Minute)
|
||||
|
||||
apiBase, err := getRequiredEnv("MEDIAMTX_API_BASE")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
webrtcBase, err := getRequiredEnv("MEDIAMTX_WEBRTC_BASE_URL")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
publicBase, err := getRequiredEnv("PUBLIC_BASE_URL")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tokenTTL := getIntEnv("MEDIAMTX_TOKEN_TTL_SECONDS", 180)
|
||||
|
||||
cfg := &Config{}
|
||||
cfg.DB.DSN = dbDSN
|
||||
@@ -130,6 +185,14 @@ func Load() (*Config, error) {
|
||||
cfg.MinIO.LivestreamBucket = liveBucket
|
||||
cfg.MinIO.PresignTTL = presignTTL
|
||||
cfg.JWTSecret = []byte(jwt)
|
||||
|
||||
cfg.MediaMTX = MediaMTXConfig{
|
||||
APIBase: apiBase,
|
||||
WebRTCBaseURL: webrtcBase,
|
||||
PublicBaseURL: publicBase,
|
||||
TokenTTL: time.Duration(tokenTTL),
|
||||
}
|
||||
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
@@ -191,6 +254,21 @@ func LoadDev() (*Config, error) {
|
||||
}
|
||||
presignTTL := time.Duration(getIntEnv("MINIO_PRESIGN_TTL_SECONDS", 900)) * time.Second
|
||||
|
||||
// NEW: MediaMTX envs
|
||||
apiBase, err := getRequired("MEDIAMTX_API_BASE")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
webrtcBase, err := getRequired("MEDIAMTX_WEBRTC_BASE_URL")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
publicBase, err := getRequired("PUBLIC_BASE_URL")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tokenTTL := getIntEnv("MEDIAMTX_TOKEN_TTL_SECONDS", 180)
|
||||
|
||||
cfg := &Config{}
|
||||
cfg.DB.DSN = dbDSN
|
||||
cfg.MinIO.Endpoint = endpoint
|
||||
@@ -201,5 +279,12 @@ func LoadDev() (*Config, error) {
|
||||
cfg.MinIO.LivestreamBucket = liveBucket
|
||||
cfg.MinIO.PresignTTL = presignTTL
|
||||
cfg.JWTSecret = []byte(jwt)
|
||||
|
||||
cfg.MediaMTX = MediaMTXConfig{
|
||||
APIBase: apiBase,
|
||||
WebRTCBaseURL: webrtcBase,
|
||||
PublicBaseURL: publicBase,
|
||||
TokenTTL: time.Duration(tokenTTL),
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user