Make ephemeral udp ports configurable
This commit is contained in:
parent
fd18ba6527
commit
4b171b849f
2
main.go
2
main.go
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
@ -33,6 +34,7 @@ func main() {
|
||||
|
||||
srv := server.NewServer(cfg)
|
||||
srv.Addr = cfg.HTTP.ListenAddr
|
||||
slog.Info("Starting HTTP-server", "addr", srv.Addr, "cfg", cfg)
|
||||
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
return err
|
||||
}
|
||||
|
@ -7,4 +7,15 @@ SiteName = "stream.example.org"
|
||||
# HTTPListenAddr is which port the HTTP server will listen on.
|
||||
# Default: ":8080"
|
||||
# Env: MINISTREAM_HTTP_LISTENADDR
|
||||
HTTPListenAddr = ":8080"
|
||||
ListenAddr = ":8080"
|
||||
|
||||
[WebRTC]
|
||||
# UDPMin is the minimum used for ephemeral ports.
|
||||
# Default: 50000
|
||||
# Env: MINISTREAM_WEBRTC_UDPMIN
|
||||
UDPMin = 50000
|
||||
|
||||
# UDPMax is the maximum used for ephemeral ports.
|
||||
# Default: 50050
|
||||
# Env: MINISTREAM_WEBRTC_UDPMAX
|
||||
UDPMAX = 50050
|
||||
|
@ -3,6 +3,7 @@ package server
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/pelletier/go-toml/v2"
|
||||
)
|
||||
@ -10,18 +11,28 @@ import (
|
||||
type Config struct {
|
||||
SiteName string `toml:"siteName"`
|
||||
HTTP ConfigHTTP `toml:"http"`
|
||||
WebRTC ConfigWebRTC `toml:"WebRTC"`
|
||||
}
|
||||
|
||||
type ConfigHTTP struct {
|
||||
ListenAddr string `json:"ListenAddr" toml:"ListenAddr"`
|
||||
}
|
||||
|
||||
type ConfigWebRTC struct {
|
||||
UDPMin int `toml:"UDPMin"`
|
||||
UDPMax int `toml:"UDPMax"`
|
||||
}
|
||||
|
||||
func DefaultConfig() *Config {
|
||||
return &Config{
|
||||
SiteName: "ministream",
|
||||
HTTP: ConfigHTTP{
|
||||
ListenAddr: ":8080",
|
||||
},
|
||||
WebRTC: ConfigWebRTC{
|
||||
UDPMin: 50000,
|
||||
UDPMax: 50050,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,6 +44,21 @@ func (c *Config) OverrideFromEnv() {
|
||||
if httpAddr, ok := os.LookupEnv("MINISTREAM_HTTP_LISTENADDR"); ok {
|
||||
c.HTTP.ListenAddr = httpAddr
|
||||
}
|
||||
|
||||
if value, ok := os.LookupEnv("MINISTREAM_WEBRTC_UDPMIN"); ok {
|
||||
min, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
panic("MINISTREAM_WEBRTC_UDPMIN is invalid")
|
||||
}
|
||||
c.WebRTC.UDPMin = min
|
||||
}
|
||||
if value, ok := os.LookupEnv("MINISTREAM_WEBRTC_UDPMAX"); ok {
|
||||
max, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
panic("MINISTREAM_WEBRTC_UDPMAX is invalid")
|
||||
}
|
||||
c.WebRTC.UDPMin = max
|
||||
}
|
||||
}
|
||||
|
||||
func ConfigFromReader(r io.Reader) (*Config, error) {
|
||||
|
@ -26,7 +26,7 @@ type Server struct {
|
||||
|
||||
func NewServer(config *Config) *Server {
|
||||
srv := &Server{
|
||||
streams: NewStreamStore(),
|
||||
streams: NewStreamStore(config),
|
||||
config: config,
|
||||
}
|
||||
|
||||
|
@ -20,19 +20,23 @@ var ErrNoSuchStream error = fmt.Errorf("no such stream")
|
||||
|
||||
type StreamStore struct {
|
||||
Streams map[string]*Stream
|
||||
|
||||
config *Config
|
||||
webRTCConfig webrtc.Configuration
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
func NewStreamStore() *StreamStore {
|
||||
func NewStreamStore(config *Config) *StreamStore {
|
||||
s := &StreamStore{
|
||||
Streams: make(map[string]*Stream),
|
||||
config: config,
|
||||
}
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
type Stream struct {
|
||||
store *StreamStore
|
||||
peerConnection *webrtc.PeerConnection
|
||||
peerConnectionStats map[string]*stats.Stats
|
||||
peerConnectionStatsMu sync.Mutex
|
||||
@ -96,7 +100,10 @@ func (s *Stream) AddListener(sd *webrtc.SessionDescription) (*webrtc.SessionDesc
|
||||
//i.Add(statsInterceptorFactory)
|
||||
|
||||
se := webrtc.SettingEngine{}
|
||||
_ = se.SetEphemeralUDPPortRange(50000, 50050)
|
||||
_ = se.SetEphemeralUDPPortRange(
|
||||
uint16(s.store.config.WebRTC.UDPMin),
|
||||
uint16(s.store.config.WebRTC.UDPMax),
|
||||
)
|
||||
|
||||
webRTCConfig := webrtc.Configuration{
|
||||
ICEServers: []webrtc.ICEServer{
|
||||
@ -179,6 +186,7 @@ func (s *StreamStore) Add(streamKey string, sd *webrtc.SessionDescription) (*web
|
||||
|
||||
go func() {
|
||||
stream := &Stream{
|
||||
store: s,
|
||||
lastUpdate: time.Now(),
|
||||
peerConnectionStats: make(map[string]*stats.Stats),
|
||||
}
|
||||
@ -226,7 +234,7 @@ func (s *StreamStore) Add(streamKey string, sd *webrtc.SessionDescription) (*web
|
||||
},
|
||||
}
|
||||
se := webrtc.SettingEngine{}
|
||||
_ = se.SetEphemeralUDPPortRange(50000, 50050)
|
||||
_ = se.SetEphemeralUDPPortRange(uint16(s.config.WebRTC.UDPMin), uint16(s.config.WebRTC.UDPMax))
|
||||
|
||||
// se.BufferFactory = func(packetType packetio.BufferPacketType, ssrc uint32) io.ReadWriteCloser {
|
||||
// buf := packetio.NewBuffer()
|
||||
|
Loading…
Reference in New Issue
Block a user